From 4e11fedf8d06a6ce2edacecb2df4e9f288de97c9 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 14 Jun 2023 19:14:31 +1000 Subject: [PATCH 001/219] submodule setup --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index 5c22af2..7355856 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "Shared_Includes"] + branch = main path = Shared_Includes url = https://github.com/Tolik-Trek/Shared_Includes.git From 5f778d0f36895ebd83afe076cf1f5a86af1b1ad7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 28 Jun 2023 04:07:07 +1000 Subject: [PATCH 002/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 6e27011..520455d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6e27011b6259b0256ce65d91a53ef1185223eafa +Subproject commit 520455dbdc4c10f1850fd697aa5be4703d6cfd27 From b02517ea5fadc836162dd6d6031e1b05c6ef02fa Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 1 Jul 2023 06:40:48 +1000 Subject: [PATCH 003/219] bug fixes, ide secondary added --- BOOT/DSSBOOT.ASM | 3 +-- Console/CONSOLE.ASM | 8 +++----- DSS/DOS-MAIN.ASM | 15 +++++++++++--- DSS/DOS5.ASM | 43 +++++++++++++++++++--------------------- DSS/DOS_X.ASM | 1 - DSS/DRV-MAIN.ASM | 2 +- DSS/ENVIRON.ASM | 48 +++++++++++++++++++++++++-------------------- DSS/EXECUTE.ASM | 1 - DSS/FAT_X.ASM | 1 - DSS/IDE_DRV0.ASM | 14 ++++++++----- DSS/defines.inc | 15 +++++++------- Shared_Includes | 2 +- 12 files changed, 82 insertions(+), 71 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index eeef089..074882d 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -228,8 +228,7 @@ CONTINU LD C,Dss.BootDSK RST #10 - LD B,"A" - ADD A,B + ADD A,"A" LD HL,ROOT LD (HL),A diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 374fc9e..efbad1a 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -362,8 +362,7 @@ INPUT XOR A CALL RES_CUR RET -COMP - CALL EVALCMD ;R05 +COMP: CALL EVALCMD ;R05 LD HL,CMDLINE DEC HL LD C,(HL) @@ -394,9 +393,9 @@ COMP005 EX AF,AF' COMP004 PUSH BC PUSH DE COMP000 LD A,(DE) - CP #61 + CP 'a' JP C,COMP001 - CP #7B + CP '{' JP NC,COMP001 SUB #20 COMP001 CP (HL) @@ -865,7 +864,6 @@ MOVLBAK LD A,(HL) RET ; HL - STRING WITH %VAR% - EVALSTR ;R04 LD DE,DTA VARLOOP diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM index 55badef..f3c1b1f 100644 --- a/DSS/DOS-MAIN.ASM +++ b/DSS/DOS-MAIN.ASM @@ -5,6 +5,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;[ ] увеличить длину PATH и строки BAT ;[ ] путь текущего каталога в DIR выводится с глюком если он длинее 256 байтов ;[ ] путь в приглашении консоли выводится с глюком если путь длинее 256 байтов ;[ ] ;!FIXIT какой-то баг при котором если нет диска и на него полезть, то всё ломается @@ -263,6 +264,8 @@ PORTAL.outMAIN: ; ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION F_START: DI + LD (.saveDRV),A + CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения RET C ;R10 CALL KINIT @@ -274,10 +277,16 @@ F_START: RST #30 ;CALL INITDVC ;R05 ;R05 - LD C,#00 - RST #18 - LD (LDRIVE),A + LD C,#00 + RST #18 + LD (LDRIVE),A ;R05 + +.saveDRV+1: LD A,0 + LD B,1 + LD C,Dss.BootDSK + RST #10 + EI ;Set new address fn. VERSION LD HL,ADRST10 diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index aabd6cd..6f7b39a 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -7,7 +7,7 @@ ;Rev Date Name Description ;------------------------------------------------------------- ;R11 17-04-2023 BAO Временный костыль для недопускания переполнения буфера пути каталога -;R10 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH ;!FIXIT пока в виде заплатки полунеработающей +;R10 15-04-2023 BAO ;????? FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH ;!FIXIT пока в виде заплатки полунеработающей ;R09 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R08 15-04-2003 DNS SAVE AND RESTORE CURёPATH MACROS ;R07 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN @@ -90,7 +90,6 @@ CREATE ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM - CREAT_N _mSavePath AND #E7 ;R04 %76A00SHR @@ -624,18 +623,18 @@ TMPNAME: DB ' ',#00 ; 12 ; CHNDISK: - ;R10 - ; CALL OPENDSK - ; RET C - ; LD HL,DIRSPEC+1 - ; LD (HL),0 - ; PUSH AF - ; CALL OPENDIR - ; POP BC - ; RET C - ; LD A,B - ; RET - ;R10 + ;????? R10 + CALL OPENDSK + RET C + LD HL,DIRSPEC+1 + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B + RET + ;????? R10 OPENDSK: PUSH AF LD C,1 @@ -1195,7 +1194,7 @@ HGUPPER CP ' DEC A RET -SYSTIME LD C,#F5 +SYSTIME LD C,BIOS.CMOS_TEST RST ToBIOS JP C,NOCMOS LD D,7 ;DAY @@ -1218,7 +1217,7 @@ SYSTIME LD C,#F5 CALL RCMOS PUSH AF LD D,6 ;WEEK DAY - LD C,#F6 + LD C,BIOS.CMOS_RD RST ToBIOS POP DE LD E,A @@ -1227,7 +1226,7 @@ SYSTIME LD C,#F5 CALL RCMOS ;READ AND CONVERT TO DECIMAL PUSH AF LD D,#32 ;CENTURY - LD C,#F6 + LD C,BIOS.CMOS_RD RST ToBIOS LD XH,A @@ -1245,7 +1244,7 @@ XXIAGE LD A,#20 JR Z,GOODAGE BADAGE PUSH AF LD D,#32 ;CENTURY - LD C,#F7 + LD C,BIOS.CMOS_WR RST ToBIOS POP AF LD XH,A @@ -1276,7 +1275,7 @@ GOODAGE POP AF AND A RET -RCMOS LD C,#F6 +RCMOS LD C,BIOS.CMOS_RD RST ToBIOS ; INPUT : A - BCD ; OUTPUT: A - HEX @@ -1344,7 +1343,7 @@ SETTIME PUSH IX POP BC LD A,C LD D,6 ;WEEK DAY - LD C,#F7 + LD C,BIOS.CMOS_WR RST ToBIOS POP HL @@ -1367,7 +1366,7 @@ YR INC A WCMOS CALL HEX2BCD - LD C,#F7 + LD C,BIOS.CMOS_WR RST ToBIOS RET @@ -1430,7 +1429,6 @@ PUT_D_T PUSH AF ;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 ; BC - yyyyyyymmmmddddd y - year, m - month, d - day ; (1980-2108) - MK_TIME LD A,L RLCA RLCA @@ -1468,7 +1466,6 @@ MK_TIME LD A,L ; H - HOUR; L - MINUTE ; B - SECOND (0...59) ; IX- YEAR (0...65535) - RMKTIME EX DE,HL LD A,C AND #1F diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 6d2fe5d..431037c 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -61,7 +61,6 @@ BOOTDSK: RET ;GET BOOT DISK - GETBOOT LD A,(BOOTDRV) AND A RET diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index a74a1ed..93ad3c2 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -213,7 +213,7 @@ PORTAL.outDRV: ; ; ; -DISPATCH +DISPATCH: CALL INITDVC LD HL,INTDISK LD (ADCALL),HL diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index c9e8a52..089f283 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -27,9 +27,15 @@ ENVIRON: SCF RET -INITENV LD A,ENVPAGE +INITENV: + LD A,ENVPAGE CALL BANK PUSH AF + ;!TEST + LD A,(BOOTDRV) + ADD A,'A' + LD (DEFAULT_ENV.boot_disk),A + ; LD DE,ENVIRONMENT XOR A LD (DE),A @@ -79,8 +85,7 @@ READENV: XOR A RET -GETENV - PUSH DE +GETENV: PUSH DE CALL ENV_EX LD A,ENVPAGE @@ -92,14 +97,14 @@ GETENV LD A,0 LD (DE),A JR NC,GE_1 -GE_0 LD A,(HL) +GE_0: LD A,(HL) LDI OR A JR NZ,GE_0 DEC DE ;R01 LD A,#FF -GE_1 EX AF,AF' +GE_1: EX AF,AF' OUT (SLOT3),A EX AF,AF' AND A @@ -119,7 +124,6 @@ SETENV: CALL ENV_EX OR C JR Z,PENV LDIR -; DEC DE PENV LD A,(ENVVALUE) OR A JR Z,CLR_ENV @@ -174,7 +178,7 @@ END_OF_ENV POP DE RET -ENV_EX LD B,32 +ENV_EX LD B,ENVIRONMENT_STRING_LENGTH LD DE,ENVNAME ENV_E0 XOR A LD (DE),A @@ -189,6 +193,11 @@ ENV_E1 LD A,(HL) LD (DE),A INC DE DJNZ ENV_E1 + ;!TEST from Vasil + ld a,b + ld (de),a ; обрезать слишком длинную строку + inc de + ; SCF RET @@ -219,23 +228,20 @@ ENV_E2 LD A,(HL) ENVNAME EQU EXEBUFF ;DS 32 ENVVALUE EQU BUFFER //#3800 ; BUFFER ;DS 128 -ENVSIZE DW 1 ;E_END-ENVIRONMENT ;160 +ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 ENVIRONMENT EQU ENVADDR -DEFAULT_ENV -; DB "SYSTEM=C:\\system.exe",0 -; DB "PATH=\\SYSTEM\\;\\COMMAND\\;",0 - DB 0 ; "",0 +DEFAULT_ENV: DB 'BOOTDSK=' +.boot_disk: DB 'X:',0 DEF_ENV_SIZE EQU $-DEFAULT_ENV +; DB 'SYSTEM=C:\system.exe',0 +; DB 'PATH=\SYSTEM\;\COMMAND\;',0 ; DB 0 -; DB "SYSTEM=C:\system.exe",0 -; DB "PATH=C:\;\FN\;",0 -; DB "OS=ESTEX",0 -; DB "VAR1=000",0 -; DB "OSNAME=ESTEX 2002",0 -; DB 0 -;E_END - -;[END] +; DB 'SYSTEM=C:\system.exe',0 +; DB 'PATH=C:\;\FN\;',0 +; DB 'OS=ESTEX',0 +; DB 'VAR1=000',0 +; DB 'OSNAME=ESTEX 2002',0 +; DB 0 \ No newline at end of file diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 996aa35..84e33c4 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -745,7 +745,6 @@ EXEC0_SHORT: ;FILE NO FOUND, SEARCHING IN PATH ; GET PATH AND ETC. - LD HL,ENVPATH LD DE,ENVTEMP LD B,1 diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 2aa6516..d9aff19 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -315,7 +315,6 @@ W_T_F01 SLA E ;R01 ; A - NEW FAT BLOCK - RE_FAT PUSH HL PUSH AF LD A,(FATCASH+1) diff --git a/DSS/IDE_DRV0.ASM b/DSS/IDE_DRV0.ASM index e9c791f..b3986db 100644 --- a/DSS/IDE_DRV0.ASM +++ b/DSS/IDE_DRV0.ASM @@ -160,8 +160,8 @@ LD_DSK EQU 16 -IDE0 EQU #0C1C0 -IDE1 EQU #0C1C8 +; IDE0 EQU #0C1C0 +; IDE1 EQU #0C1C8 PART EQU #C000 HDDRIVE INC C @@ -316,7 +316,6 @@ LOGDRV DS 12*LD_DSK ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 - SELHDD PUSH DE PUSH BC PUSH HL @@ -430,10 +429,15 @@ HGETPRM EX DE,HL LD A,(IY+0) LD C,A - LD IY,IDE0 ;!FIXIT IDE CHANELS тут всего 2 канала работают + LD IY,SYS_PAGE.IDE_0 AND #0F JR Z,GELH1 - LD IY,IDE1 + LD IY,SYS_PAGE.IDE_1 + CP 2 + JR C,GELH1 + LD IY,SYS_PAGE.IDE_2 + JR Z,GELH1 + LD IY,SYS_PAGE.IDE_3 GELH1 IN A,(SLOT3) PUSH AF LD A,SYS_PAGE diff --git a/DSS/defines.inc b/DSS/defines.inc index 7978867..455c37f 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -23,14 +23,15 @@ ENVPAGE EQU 2 DRVPAGE EQU 3 ; -DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 +DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 +ENVIRONMENT_STRING_LENGTH EQU 255 -TXTADDR EQU #C000 -ENVADDR EQU #E400 -DIR EQU #C000 -FAT EQU #C000 +TXTADDR EQU #C000 +ENVADDR EQU #E400 +DIR EQU #C000 +FAT EQU #C000 -FMCOUNT EQU 10 ; Количество файловых манипуляторов -HANDBUF.SIZE EQU 32 +FMCOUNT EQU 10 ; Количество файловых манипуляторов +HANDBUF.SIZE EQU 32 ;----------------------------------------------------; ; diff --git a/Shared_Includes b/Shared_Includes index 520455d..6e9cb7f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 520455dbdc4c10f1850fd697aa5be4703d6cfd27 +Subproject commit 6e9cb7fd969b98df5cc98ec109bab2be59d46208 From f59cca8dfab21d990654ea28537e43825249e82a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 3 Jul 2023 02:11:18 +1000 Subject: [PATCH 004/219] =?UTF-8?q?=D0=BB=D0=B5=D1=87=D0=B8=D0=BC=20=D0=BF?= =?UTF-8?q?=D1=83=D1=82=D0=B8...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Console/CONSOLE.ASM | 13 +++------ DSS/DOS5.ASM | 63 ++++++++++++++++++++++++++++++-------------- DSS/DOS_FM.ASM | 8 ++++-- DSS/DSS_MACROSES.Z80 | 23 ++++++++-------- DSS/defines.inc | 25 +++++++++--------- 5 files changed, 78 insertions(+), 54 deletions(-) diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index efbad1a..ea58827 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -130,8 +130,7 @@ B_FIND_SPACE RET -BATCH - PUSH HL +BATCH: PUSH HL LD DE,PRMLINE BCHL1 LD A,(HL) LDI @@ -164,8 +163,6 @@ B_ALL_P POP HL XOR A RET - - Restore_Screen: PUSH AF LD C,Dss.GetVMod @@ -178,8 +175,6 @@ Restore_Screen: .exit: POP AF RET - - NEWLINE LD DE,CMDLINE ADDBAT PUSH DE CALL READBAT @@ -530,13 +525,13 @@ EXEERR CP 5 JP NC,ERROR LD DE,0 ;BAD COMMAND OR FILENAME JP ERR_MSG - + RUN_BAT CALL BATCH JP C,EXEERR RET -BATLIST DB 'PAUSE' : DW CPAUSE - DB 'REM' : DW CREM +BATLIST DZ 'PAUSE' : DW CPAUSE + DZ 'REM' : DW CREM CMDLIST DZ 'CD' : DW CCHDIR DZ 'CHDIR' : DW CCHDIR DZ 'CLS' : DW CLS diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 6f7b39a..647498e 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -9,7 +9,7 @@ ;R11 17-04-2023 BAO Временный костыль для недопускания переполнения буфера пути каталога ;R10 15-04-2023 BAO ;????? FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH ;!FIXIT пока в виде заплатки полунеработающей ;R09 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER -;R08 15-04-2003 DNS SAVE AND RESTORE CURёPATH MACROS +;R08 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS ;R07 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN ; FROM "." ".NAM" ;R06 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME @@ -30,7 +30,7 @@ ; B = 0 GET ATTRIB ; B = 1 SET ATTRIB ; OUTPUT: A - ATTRIB -ATTRIB +ATTRIB: _mSavePath INC B DEC B @@ -72,7 +72,7 @@ WATTRIB PUSH AF ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -CREATE +CREATE: _mSavePath AND #E7 ;R04 LD (ACCESS),A @@ -90,7 +90,7 @@ CREATE ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -CREAT_N +CREAT_N: _mSavePath AND #E7 ;R04 %76A00SHR LD (ACCESS),A @@ -229,7 +229,8 @@ RENAME PUSH DE RET ;R02 -OPENATR LD (ACCESS),A +OPENATR: + LD (ACCESS),A CALL GETWORD RET C LD HL,TMPNAME @@ -244,7 +245,7 @@ OPENATR LD (ACCESS),A OPEN_FN: _mSavePath -OPEN ;R08 +OPEN: ;R08 LD (ACCESS),A CALL GETWORD RET C @@ -252,9 +253,10 @@ OPEN ;R08 LD DE,MASKARE CALL MASK RET C -OPENEXE CALL SEARCH +OPENEXE: + CALL SEARCH RET C -OPENAT ;R02 +OPENAT: ;R02 CALL GET_FM RET C LD A,C @@ -289,7 +291,7 @@ OPENAT ;R02 AND A RET -CLOSE_FN +CLOSE_FN: _mSavePath CLOSE: ;R08 LD (ACCESS),A @@ -614,19 +616,25 @@ GETWORD: SUB #20 .next: SUB 'A' PUSH HL - CALL OPENDSK + ;!TEST CHNDISK OPENDSK + CALL OPENDSK + ; POP HL JP NC,GETWORD RET TMPNAME: DB ' ',#00 ; 12 пробелов и 0 +;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка +; RestoreDIR: + ; CHNDISK: + CALL OPENDSK ;????? R10 - CALL OPENDSK RET C - LD HL,DIRSPEC+1 + ;LD HL,DIRSPEC+1 + LD HL,DIRSPEC LD (HL),0 PUSH AF CALL OPENDIR @@ -634,6 +642,17 @@ CHNDISK: RET C LD A,B RET + + /* + RET C + + PUSH AF + CALL LOADDIR + POP AF + */ + + RET + ; ;????? R10 OPENDSK: PUSH AF @@ -851,18 +870,21 @@ CURDIR1 LD A,(HL) LOADDIR: XOR A - LD HL,0 + LD H,A + LD L,A LD IX,0 - LD B,0 + LD B,A CALL MOVE_FP LD A,DIRPAGE CALL BANK PUSH AF - LD HL,#C000 - LD DE,#C001 - LD BC,#3FFF - LD (HL),L - LDIR + ;!FIXIT слишком долго + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR + ; LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A LD D,(IY+_sFM.ST_CLUSTER) @@ -1652,7 +1674,8 @@ MKD11 POP AF RET ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -RMDIR: _mSavePath +RMDIR: + _mSavePath CALL GETWORD RET C LD HL,TMPNAME diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 601f442..e49a52a 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -447,7 +447,9 @@ READ LD (R_POINT),HL JP Z,NOREAD PUSH DE LD A,(IY+_sFM.DRIVE) - CALL OPENDSK + ;!TEST CHNDISK OPENDSK + CALL OPENDSK + ; JP C,RPERR1 LD C,(IY+_sFM.F_POSITION) LD E,(IY+_sFM.F_POSITION+1) @@ -608,7 +610,9 @@ WRITE LD (R_POINT),HL SET 7,(IY+_sFM.ACCESS_MODE) SET 5,(IY+_sFM.ATTRIBUT) LD A,(IY+_sFM.DRIVE) - CALL OPENDSK + ;!TEST CHNDISK OPENDSK + CALL OPENDSK + ; JP C,PWERR1 LD C,(IY+32) LD A,(IY+33) diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 8a85c11..7c984bd 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -1,20 +1,21 @@ ; MACRO _mSavePath -; PUSH HL -; LD HL,BACK_CUR_PATH -; EX (SP),HL -; CALL SAVE_CUR_PATH + IF SAVE_PATH_MACRO + PUSH HL + LD HL,BACK_CUR_PATH + EX (SP),HL + CALL SAVE_CUR_PATH + ENDIF ENDM -; -; MACRO _mRestorePath -; CALL BACK_CUR_PATH + IF SAVE_PATH_MACRO + CALL BACK_CUR_PATH + ENDIF ENDM -; - -; MACRO _mRestorStackAfterRestorePath -; POP HL ;CLEAR STACK "BACK_CUR_PATH" + IF SAVE_PATH_MACRO + POP HL ;CLEAR STACK "BACK_CUR_PATH" + ENDIF ENDM ; diff --git a/DSS/defines.inc b/DSS/defines.inc index 455c37f..8a921e7 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -1,26 +1,27 @@ ; - DEFINE TEST_FEATURE 1 + DEFINE TEST_FEATURE 1 ; ; - DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. + DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. ; ; - DEFINE MAX_RAMDRIVES 16 - DEFINE NeedSafePort_Y 1 - DEFINE TABisSPACES 1 - DEFINE CLASSIC_CURSOR 0 + DEFINE MAX_RAMDRIVES 16 + DEFINE NeedSafePort_Y 1 + DEFINE TABisSPACES 1 + DEFINE CLASSIC_CURSOR 0 + DEFINE SAVE_PATH_MACRO 0 ; ;-------------------[MEMORY]-------------------------; - DEFINE USING_MEMPAGES 4 + DEFINE USING_MEMPAGES 4 ;!FIXIT сделать типа DIRPAGE EQU 0 + BANKTBL и упростить BANK -DIRPAGE EQU 0 -FATPAGE EQU 1 -TXTPAGE EQU 2 -ENVPAGE EQU 2 -DRVPAGE EQU 3 +DIRPAGE EQU 0 +FATPAGE EQU 1 +TXTPAGE EQU 2 +ENVPAGE EQU 2 +DRVPAGE EQU 3 ; DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 From 35e9b7b9fe97757e4b5e3986376caed02c4add55 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 3 Jul 2023 23:04:36 +1000 Subject: [PATCH 005/219] optimization. bug with BootSector size fixed --- BOOT/DSSBOOT.ASM | 72 +++++++++++++++++++++++----------------------- DSS/DOS-MAIN.ASM | 12 ++++++-- DSS/DOS5.ASM | 43 ++++++++++++++------------- DSS/DOS_FM.ASM | 21 +++++++------- DSS/DOS_X.ASM | 62 +++++++++++++++++++-------------------- DSS/FAT_X.ASM | 24 +++++++--------- DSS/Structures.inc | 2 +- Shared_Includes | 2 +- 8 files changed, 122 insertions(+), 116 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 074882d..f025e93 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -30,7 +30,7 @@ DRIVE: DI LD (DRIVE),A LD C,BIOS.EXT_VERSION - RST #18 + RST ToBIOS_18 LD A,INCORR JR C,FAIL LD A,(DRIVE) @@ -45,9 +45,9 @@ GOOD_DRIVE: LD DE,#8200 LD HL,0 LD IX,2 - LD BC,2*256+BIOS.DRV_READ + LD BC,2*256 + BIOS.DRV_READ LD A,(DRIVE) - RST #18 + RST ToBIOS_18 JR C,NULL JP CONTINU @@ -88,37 +88,37 @@ PRINTX CP #0D JR Z,CR_ CP #0A JR Z,LF_ - LD BC,#0182 - RST #18 + LD BC,1*256 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 RET -CR_ LD C,#8E - RST #18 +CR_ LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 LD E,0 LD C,#84 - RST #18 + RST ToBIOS_18 RET -LF_ LD C,#8E - RST #18 +LF_ LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 LD A,#1F CP D JR NZ,LF2 PUSH DE PUSH HL LD DE,#0020 - LD BC,#018A - RST #18 + LD BC,1*256 + BIOS.LP_SCROLL_UD + RST ToBIOS_18 LD DE,#1F00 - LD C,#84 - RST #18 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS_18 LD A," " - LD BC,#5082 - RST #18 + LD BC,#50 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 POP HL POP DE DEC D LF2 INC D - LD C,#84 - RST #18 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS_18 RET ;R01 ;R01 End @@ -155,8 +155,8 @@ CONTINU LD (DISKL),HL LD (DISKH),HL - LD BC,1*256+BIOS.GetMem - RST #18 ;GET PAGE FOR DOS + LD BC,1*256 + BIOS.GetMem + RST ToBIOS_18 ;GET PAGE FOR DOS LD (BANKDOS),A CALL GET_BPB ;READ BPB LD A,ERRIBPB @@ -290,9 +290,9 @@ YEPDOS LD E,(IX+08) LD (DISKL),IX LD (DISKH),HL LD DE,BOOT - LD BC,1*256+BIOS.DRV_READ + LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) - RST #18 + RST ToBIOS_18 POP BC LD A,C RET @@ -300,13 +300,13 @@ YEPDOS LD E,(IX+08) SET_PRM PUSH BC LD A,B LD C,BIOS.DRV_GET_PAR - RST #18 + RST ToBIOS_18 LD A,(BOOT.S_P_T) LD L,A POP AF PUSH AF LD C,BIOS.DRV_SET_PAR - RST #18 + RST ToBIOS_18 POP BC LD A,C RET @@ -314,9 +314,9 @@ SET_PRM PUSH BC GET_BPB LD IX,#0000 LD HL,#0000 LD DE,BOOT - LD BC,1*256+BIOS.DRV_READ + LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) - RST #18 + RST ToBIOS_18 RET C LD A,(DRIVE) LD B,A @@ -416,9 +416,9 @@ BPB_FAT ADC HL,BC ;HL:IX LD DE,FAT - LD BC,3*256+BIOS.DRV_READ + LD BC,3*256 + BIOS.DRV_READ LD A,(DRIVE) - RST #18 + RST ToBIOS_18 RET C LD HL,0 LD (FATCASH),HL @@ -447,10 +447,10 @@ NEXTSEC PUSH AF ;HL:IX PUSH IX PUSH HL - LD BC,1*256+BIOS.DRV_READ + LD BC,1*256 + BIOS.DRV_READ LD DE,DIR LD A,(DRIVE) - RST #18 + RST ToBIOS_18 CALL SEARCH POP HL POP IX @@ -510,21 +510,21 @@ LD_FILE PUSH HL LD A,(BOOT.S_P_C) CP #20 JR C,SMCLUS - LD BC,#2052 + LD BC,#20*256 + BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' LD A,(DRIVE) - RST #18 + RST ToBIOS_18 POP HL AND A RET SMCLUS LD B,A - LD C,#52 + LD C,BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' LD A,(DRIVE) - RST #18 + RST ToBIOS_18 LD HL,(READMEM) LD DE,(CLU_LEN) ADD HL,DE @@ -670,9 +670,9 @@ NOINX2 ADD IX,BC POP IX POP HL LD DE,FAT - LD BC,#0355 + LD BC,3*256 + BIOS.DRV_READ LD A,(DRIVE) - RST #18 + RST ToBIOS_18 POP HL RET diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM index f3c1b1f..942a6d5 100644 --- a/DSS/DOS-MAIN.ASM +++ b/DSS/DOS-MAIN.ASM @@ -277,8 +277,8 @@ F_START: RST #30 ;CALL INITDVC ;R05 ;R05 - LD C,#00 - RST #18 + LD C,Dss.DRV.Init + RST ToDSS.DRV LD (LDRIVE),A ;R05 @@ -437,6 +437,14 @@ BUFFER EQU BUFFERSplace.Buffer SECBUF EQU BUFFER CLEAR_ZONE.size EQU _sBuffers + DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "BUFFERSplace.BootSector ",/H,BUFFERSplace.BootSector + DISPLAY "BootSector ", /H, BootSector + DISPLAY "EXEBUFF ", /H, EXEBUFF + DISPLAY "Size ", /H, EXEBUFF-BootSector + DISPLAY "--- --- --- --- --- --- --- ---" + + /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;!TEST diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 647498e..7db6a7c 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -155,11 +155,11 @@ DELETE LD DE,MASKARE RET C DELFILE LD A,DIRPAGE CALL BANK - PUSH AF + ;PUSH AF LD (IX+_sFM.NAME),#E5 LD E,(IX+_sFM.ST_CLUSTER) LD D,(IX+_sFM.ST_CLUSTER+1) - POP AF + ;POP AF OUT (SLOT3),A LD A,E OR D @@ -656,8 +656,8 @@ CHNDISK: ;????? R10 OPENDSK: PUSH AF - LD C,1 - RST #18 + LD C,Dss.DRV.Open + RST ToDSS.DRV POP BC JP C,.error LD A,B @@ -802,7 +802,7 @@ FINDDIR LD A,DIRPAGE ADDSPEC LD E,XL LD D,XH LD HL,DIRSPEC+1 - LD BC,DIRSPEC.DEPTH + LD BC,DIRSPEC.DEPTH-1 XOR A CPIR ;!FIXIT нет проверки на завершение по BC=0 DEC HL @@ -879,11 +879,11 @@ LOADDIR: CALL BANK PUSH AF ;!FIXIT слишком долго - 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 @@ -911,9 +911,9 @@ LROTDIR LD HL,(FatBuffer.DIR_FRH) ADD A,B LD B,A RTD1 LD A,(FatBuffer.DRIVE) - LD C,5 LD DE,DIR - RST #18 + LD C,Dss.DRV.Read + RST ToDSS.DRV POP AF OUT (SLOT3),A AND A @@ -952,9 +952,9 @@ SROTDIR LD HL,(FatBuffer.DIR_FRH) ADD A,B LD B,A RTD1S LD A,(FatBuffer.DRIVE) - LD C,6 LD DE,DIR - RST #18 + LD C,Dss.DRV.Write + RST ToDSS.DRV POP AF OUT (SLOT3),A AND A @@ -1634,7 +1634,7 @@ MKD04 EX DE,HL INC DE LD (HL),0 LD BC,512-65 - LDIR + LDIR ;!FIXIT нужно ли так много грохать? POP HL CALL NSECTOR LD A,(BootSector.S_P_C) @@ -1646,11 +1646,10 @@ MKD12 PUSH AF IN A,(SLOT0) OUT (SLOT3),A ; - LD DE,SECBUF+#C000 - LD B,1 LD A,(FatBuffer.DRIVE) - LD C,6 - RST #18 + LD DE,SECBUF+#C000 + LD BC,1*256 + Dss.DRV.Write + RST ToDSS.DRV ; POP AF OUT (SLOT3),A @@ -1659,7 +1658,7 @@ MKD12 PUSH AF LD DE,SECBUF+1 LD BC,511 LD (HL),0 - LDIR + LDIR ;!FIXIT нужно ли так много грохать? POP IX POP HL INC IX @@ -1706,9 +1705,9 @@ RMD12 PUSH AF OUT (SLOT3),A LD DE,SECBUF+#C000 - LD BC,#0105 + LD BC,1*256 + Dss.DRV.Read LD A,(FatBuffer.DRIVE) - RST #18 + RST ToDSS.DRV POP AF OUT (SLOT3),A diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e49a52a..1fe37a6 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -177,7 +177,7 @@ BLOK_RD PUSH BC LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 - CALL DIV32 + CALL DIV32 ;!FIXIT заменить вызов HLDE/BC на HLDE/C LD B,XH LD C,XL PUSH HL ;RESIDUE @@ -218,8 +218,8 @@ BLOKRD3 LD A,B ; / BLOKRD4 LD DE,(READMEM) LD A,(FatBuffer.DRIVE) LD B,C - LD C,5 - RST #18 + LD C,Dss.DRV.Read + RST ToDSS.DRV JP C,BLOKRD0 POP BC LD HL,(READMEM) @@ -256,7 +256,7 @@ BLOKRD7 EX DE,HL LD A,(FatBuffer.DRIVE) LD B,C LD C,5 - RST #18 + RST ToDSS.DRV JP C,BLOKRD0 POP BC LD HL,(READMEM) @@ -345,8 +345,8 @@ BLOKWR3 LD A,B BLOKWR4 LD DE,(READMEM) LD A,(FatBuffer.DRIVE) LD B,C - LD C,6 - RST #18 + LD C,Dss.DRV.Write + RST ToDSS.DRV JP C,BLOKWR0 POP BC LD HL,(READMEM) @@ -387,8 +387,8 @@ BLOKWR9 POP BC LD DE,(READMEM) LD A,(FatBuffer.DRIVE) LD B,C - LD C,6 - RST #18 + LD C,Dss.DRV.Write + RST ToDSS.DRV JP C,BLOKWR0 POP BC LD HL,(READMEM) @@ -625,8 +625,9 @@ WRITE LD (R_POINT),HL OR A RR L RR D - RR E ;HL:DE FP (in sectors) - ; BC FP residue (in bytes) + RR E + ; HL:DE FP (in sectors) + ; BC FP residue (in bytes) LD A,B OR C JP NZ,WOV1 diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 431037c..cf08e0e 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -71,9 +71,9 @@ SETBOOT: LD C,0 .loop: PUSH BC LD A,C - LD BC,#0008 LD DE,#55AA - RST #18 + LD BC,256*0 + Dss.DRV.GenIOCTL + RST ToDSS.DRV POP BC JR C,.NoSupport EX AF,AF' ;PHISICAL DRIVE NUMBER @@ -100,8 +100,8 @@ SETBOOT: /* CHNDISK: PUSH AF - LD C,1 - RST #18 + LD C,Dss.DRV.Open + RST ToDSS.DRV POP BC JP C,NDISK11 LD A,B @@ -181,30 +181,24 @@ TCOUNT: DW #0000 ; !FIXIT чёт не используется TESTDSK LD A,(FatBuffer.DRIVE) - LD C,3 - RST #18 + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV OR A RET Z RD_BPB LD C,SLOT3 IN B,(C) PUSH BC -;!!!!! лучше оставить как в оригинале, потому что вызов этой функции -; может в дальнейшем понадобиться, и пускай она сама достаёт переменную DRIVE - ; ex af,af' ;1451 - ; in a,(SLOT0) ;1452 - ; out (SLOT3),a ;1454 - ; ld de,SECBUF+#C000 ;1456 - ; ex af,af' ;1459 IN A,(SLOT0) OUT (SLOT3),A -;R08 LD DE,BOOT+#C000 - LD DE,SECBUF+#C000 ;R08 - LD A,(FatBuffer.DRIVE) -;!!!!! ------------------------------ + ;R08 + ;LD DE,BOOT+#C000 + LD DE,SECBUF+#C000 + ;R08 + LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE - LD C,4 - RST #18 + LD C,Dss.DRV.GetBPB + RST ToDSS.DRV POP BC OUT (C),B JP C,RDERR1 @@ -226,10 +220,16 @@ RD_BPB LD C,SLOT3 LD A,(IY+_sBOOT_SEC.ID_FORM) CP #F0 JP C,ERR_BPB - LD HL,0 ; calc. first sector FAT - LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - LD D,(IY+_sBOOT_SEC.RESERVE+1) - ADD HL,DE + + ;!TEST + ;LD HL,0 ; calc. first sector FAT + ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + ;LD D,(IY+_sBOOT_SEC.RESERVE+1) + ;ADD HL,DE + LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + LD H,(IY+_sBOOT_SEC.RESERVE+1) + ; + ; LD E,(IY+#1C) ;Hidden sec ; LD D,(IY+#1D) ; ADD HL,DE @@ -311,15 +311,15 @@ R_BPBL1 DJNZ R_BPBL1 FID LD A,(HL) INC HL - CP #20 + CP ' ' JR Z,FID - CP "1" + CP '1' JP NZ,ERR_BPB LD A,(HL) - CP "6" ; FAT16 + CP '6' ; FAT16 LD HL,#FFFF JR Z,BPB_FAT - CP "2" ; FAT12 + CP '2' ; FAT12 JP NZ,ERR_BPB LD HL,#0FFF BPB_FAT @@ -356,7 +356,7 @@ BPB_L1: ; calc. sector per cylinder DEC BC JP HDDBIG HDDSMAL: -; AND A ;тут CF полюбас сброшен должен быть + ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 HDDBIG LD A,(BootSector.S_P_C) @@ -376,8 +376,8 @@ S4C02 INC HL ; LD IX,(FAT_FRM) ; LD B,3 ; LD A,(DRIVE) -; LD C,5 -; RST #18 +; LD C,Dss.DRV.Read +; RST ToDSS.DRV ; JP C,RDERR1 LD HL,0 LD (FATCASH),HL @@ -443,7 +443,7 @@ FatBuffer: ; DIRSPEC: DB '\' - BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 + BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 ; ;R11 diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index d9aff19..ebaa12b 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -53,7 +53,6 @@ INC_FA2 CALL R_F_FAT ; HL - CLUSTER ; DE - (CLUSTER) - R_F_FAT EX DE,HL LD HL,(MAX_CLU) AND A @@ -229,7 +228,8 @@ W_T_FAT PUSH DE LD A,(FatBuffer.FAT_TYP) CP "2" JP Z,W_T_F12 -W_T_F16 PUSH DE +W_T_F16: + PUSH DE LD A,H LD B,A AND #0F @@ -327,19 +327,17 @@ RE_FAT PUSH HL ADD HL,HL ADD HL,HL ADD HL,HL - ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT + ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL LD IX,0 ADD IX,DE - LD HL,0 ;HL:IX - SECTOR FAT FOR READING - LD DE,FAT ; DE - FAT ADDRESS + LD HL,0 ;HL:IX - SECTOR FAT FOR READING + LD DE,FAT ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) - ; LD B,16 - ; LD C,5 - LD BC,16*256 + 5 ;рег B: 16 * 512 = 8192 (CASH SIZE) - RST #18 + LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) + RST ToDSS.DRV POP HL RET @@ -388,10 +386,10 @@ WALLFAT LD H,B LD HL,0 ;HL:IX - SECTOR OF FAT FOR SAVE LD DE,FAT LD B,A - LD C,6 + LD C,Dss.DRV.Write LD A,(FatBuffer.DRIVE) PUSH BC - RST #18 + RST ToDSS.DRV POP BC POP HL LD DE,(FatBuffer.FAT2_XX) @@ -402,8 +400,8 @@ WALLFAT LD H,B LD DE,FAT LD HL,0 LD A,(FatBuffer.DRIVE) - LD C,6 - RST #18 + LD C,Dss.DRV.Write + RST ToDSS.DRV RET ;R01 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 06e9c0f..b518975 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -21,7 +21,7 @@ RESERVED2 BLOCK 490,0 ; ;File Manipulator (FM) - STRUCT _sFM ; 44 bytes + STRUCT _sFM ; 44 bytes .NAME: TEXT 8,{". "," "} ;+00 NAME .EXT: TEXT 3,{" "," "} ;+08 EXT .ATTRIBUT: BYTE #10 ;+11 ATTRIBUT diff --git a/Shared_Includes b/Shared_Includes index 6e9cb7f..ced877c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6e9cb7fd969b98df5cc98ec109bab2be59d46208 +Subproject commit ced877c153d64941d9ab3a1808d21bc559113e4b From 8965dee742bb71babab003d0539cb11d0eaec128 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 4 Jul 2023 22:57:49 +1000 Subject: [PATCH 006/219] =?UTF-8?q?=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B8=D0=B5=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/RAM_DRV0.ASM | 613 ----------------------------------------------- 1 file changed, 613 deletions(-) delete mode 100644 DSS/RAM_DRV0.ASM diff --git a/DSS/RAM_DRV0.ASM b/DSS/RAM_DRV0.ASM deleted file mode 100644 index bb2a79d..0000000 --- a/DSS/RAM_DRV0.ASM +++ /dev/null @@ -1,613 +0,0 @@ -; -; SYSPAGE EQU #FE -; SLOT1 EQU #A2 -; SLOT2 EQU #C2 -; SLOT3 EQU #E2 - -; ORG #3CDB -; Disk Driver Specification ver. 2.20 -;[]===========================================================[ 0] -;Procedure : Initialization -; -;Function : Initialization device(s) -; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver -;[]===========================================================[ 0] - - -;[]===========================================================[ 1] -;Procedure : Open -; -;Function : Open disk -; -;Input : C = 01h -; A - Drive -;Output : None -; -;[]===========================================================[ 1] - - -;[]===========================================================[ 2] -;Procedure : Close -; -;Function : Close disk -; -;Input : C = 02h -; A - Drive -;Output : None -; -;[]===========================================================[ 2] - - -;[]===========================================================[ 3] -;!TODO -;Procedure : Media check -; -;Function : Checking change line -; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed -; -;[]===========================================================[ 3] - - -;[]===========================================================[ 4] -;Procedure : Get BPB -; -;Function : Get Block Parameters BIOS -; -;Input : C = 04h -; DE - Address -;Output : None -; -;[]===========================================================[ 4] - - -;[]===========================================================[ 5] -;Procedure : Input -; -;Function : Input from disk -; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 5] - - -;[]===========================================================[ 6] -;Procedure : Output -; -;Function : Output to disk -; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 6] - - -;[]===========================================================[ 7] -;!TODO -;Procedure : Removable -; -;Function : Checking change line -; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable -; -;[]===========================================================[ 7] - - -;[]===========================================================[ 8] -;Procedure : Generic IOCTL -; -;Function : Generic Input Output Control -; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : -; -;[]===========================================================[ 8] - - -;[]===========================================================[ 9] -; RESERVED -;[]===========================================================[ 9] - - -;[]===========================================================[ 10] -;!TODO -;Procedure : Read Long -; -;Function : Reading sectors from disk -; -;Input : C = 0Ah -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 10] - - -;[]===========================================================[ 11] -;!TODO -;Procedure : Write Long -; -;Function : Writing sectors to disk -; -;Input : C = 0Bh -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 11] -; -; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED - -RMDRIVE: - INC C - DEC C - JP Z,INIT_RD ; 0 - DEC C - JR Z,RESE_RD ; 1 - DEC C - JR Z,STAT_RD ; 2 - DEC C - JR Z,CHEK_RD ; 3 - DEC C - JR Z,GBPB_RD ; 4 - DEC C - JR Z,READR ; 5 - DEC C - JR Z,WRITER ; 6 - DEC C - JR Z,REMOV_R ; 7 - DEC C - JP Z,IOCTL_R ; 8 - - ; DEC C - ; JP Z,RESR_H ; 9 - ; DEC C - ; JP Z,LREADH ; 10 - ; DEC C - ; JP Z,LWRITEH ; 11 -.error: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -REMOV_R: -RESE_RD: -STAT_RD: - XOR A - RET - -;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение -CHEK_RD LD A,#FF - AND A - RET - -;DE - ADDRESS -GBPB_RD LD IX,0 - LD HL,0 - LD B,#01 - ;JP READR -;READ SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -READR PUSH BC - PUSH IX - PUSH HL - PUSH BC - CALL RAMADDR - POP BC - LD IX,512 -RAMRLOP PUSH BC - PUSH IX - CALL LRDSEC - POP IX - POP BC - DJNZ RAMRLOP - POP HL - POP IX - POP BC - XOR A - CP B - LD C,B - LD B,A - JR Z,DYEP256 - ADD IX,BC - LD C,B - ADC HL,BC - XOR A - RET - -DYEP256 INC B - ADD IX,BC - LD B,C - ADC HL,BC - XOR A - RET - - -;WRITE SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -WRITER PUSH BC - PUSH IX - PUSH HL - PUSH BC - CALL RAMADDR - POP BC - LD IX,512 -RAMWLOP PUSH BC - PUSH IX - CALL WRDSEC - POP IX - POP BC - DJNZ RAMWLOP - POP HL - POP IX - POP BC - XOR A - CP B - LD C,B - LD B,A - JR Z,WYEP256 - ADD IX,BC - LD C,B - ADC HL,BC - XOR A - RET - -WYEP256 INC B - ADD IX,BC - LD B,C - ADC HL,BC - XOR A - RET - - -INIT_RD: -.SectorSize EQU 512 ;!HARDCODE - LD HL,.SectorSize - LD A,#80 -.loop: SRL A - RR H - JR NC,.loop - - LD (S_P_P),A - LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk - LD DE,RAMDTBL - -.initLoop: - PUSH BC - LD A,B - PUSH DE - RST ToBIOS - POP DE - OR A - JR Z,.noDRV - - LD (DE),A - INC DE - POP BC - LD A,B - LD (DE),A - INC DE - JP 1F - -.noDRV: POP BC -1: INC B - LD A,RAMDTBL.Size / 2 - CP B - JR NZ,.initLoop - - LD HL,RAMDTBL - EX DE,HL - AND A - SBC HL,DE - SRL L - LD A,L -; LD HL,ENDDRVR - AND A - RET - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL: DUP MAX_RAMDRIVES * 2 - DB #FF - EDUP -.Size EQU $-RAMDTBL - - -; SECTOR / S_P_P = START PAGE -; INPUT : HL:IX -SECTOR -; OUTPUT: A':HL - ADDRESS -RAMADDR LD BC,RAMDTBL - - SLA A - - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - LD A,(BC) - EX AF,AF' - LD B,XH - LD C,XL - LD A,(S_P_P) ; (S_P_P) ;SECTORS PER Page -;AGE -DIVR0 RRCA - JR C,DIVR1 - RR H - RR L - RR B - RR C - JR DIVR0 -DIVR1 LD B,C - LD C,#C4 ;GET FIRST PAGE - EX AF,AF' - RST ToBIOS - EX AF,AF' - LD A,(S_P_P) - LD C,A - DEC C - LD A,XL - AND C - INC A - LD HL,#C000 - LD BC,512 - SBC HL,BC -ADDLP ADD HL,BC - DEC A - JR NZ,ADDLP - RET - -S_P_P DB #00 - -; A':HL - ADDRESS SOURCE -; DE - ADDRESS DESTINATION -LRDSEC LD A,D - CP #A0 - LD C,SLOT3 - SET 6,H - JR C,RMDL02 - LD C,SLOT1 - RES 7,H -RMDL02 IN A,(C) - EX AF,AF' - DI - OUT (C),A - LD B,XH - LD XH,C - LD C,XL - LDIR - EX AF,AF' - LD C,XH - OUT (C),A - LD A,H - AND #7F - EI - RET NZ - LD C,SLOT3 ;GET NEXT PAGE - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - EX AF,AF' - LD XH,#C2 - LD XL,A - LD A,(IX) - EX AF,AF' - OUT (C),B - LD H,#C0 - RET - -; A':HL - ADDRESS SOURCE -; DE - ADDRESS DESTINATION - -WRDSEC LD A,D - CP #A0 - LD C,SLOT3 - SET 6,H - JR C,WMDL02 - LD C,SLOT1 - RES 7,H -WMDL02 IN A,(C) - EX AF,AF' - DI - OUT (C),A - LD B,XH - LD XH,C - LD C,XL - EX DE,HL - LDIR - EX DE,HL - EX AF,AF' - LD C,XH - OUT (C),A - LD A,H - AND #7F - EI - RET NZ - LD C,SLOT3 ;GET NEXT PAGE - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - EX AF,AF' - LD XH,#C2 - LD XL,A - LD A,(IX) - EX AF,AF' - OUT (C),B - LD H,#C0 - RET - - - -;; -;; - - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK - - -IOCTL_R: - BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.RGETPRM -; DEC B -; JP Z,FRDTRAC -; DEC B -; JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -.O_CTL_F: - RES 7,B - INC B - DEC B - JP Z,.RSETPRM -; DEC B -; JP Z,FWRTRAC -; DEC B -; JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -; HL:DE - SECTORS ON LOGICAL DISK -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.RGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - - - EX AF,AF' - LD BC,RAMDTBL - LD A,L - SLA A - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - INC BC - LD A,(BC) - ADD #60 ;!HARDCODE сделать номера разных устройств через метки - PUSH AF - PUSH AF - EX AF,AF' - - POP AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - - PUSH HL ;число головок, число секторов (на целиндр) - PUSH DE ;количество цилиндров - EXX - POP HL ;количество цилиндров - POP BC ;число секторов (на целиндр) - LD D,0 - LD E,B ;число головок - LD B,D - EXX - - LD A,L - - RRA - JR C,.end -.loopShift: - SLA E - RL D - RRA - JR NC,.loopShift - -.end: - EX AF,AF' - POP AF - EX AF,AF' - XOR A - LD L,A - LD H,L - LD A,%10100000 - RET - -;!HARDCODE -.RSETPRM: - AND A - RET - -ENDDRVR EQU $ -; From 4fc3220d2891e63116aa8aeb046e74b9b2a88efe Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 4 Jul 2023 22:58:09 +1000 Subject: [PATCH 007/219] =?UTF-8?q?=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B8=D0=B5=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/BOOT.ASM | 18 +++++++++--------- BOOT/BOOTNAME.ASM | 4 ++-- BOOT/DSSBOOT.ASM | 4 +--- Console/CONSOLE.ASM | 25 ++++++++++++++----------- DSS/DOS-MAIN.ASM | 32 +++++++++++++++----------------- DSS/DOS5.ASM | 12 ++++++------ DSS/DOS_FM.ASM | 2 +- DSS/DOS_X.ASM | 13 ++++++++----- DSS/DRV-MAIN.ASM | 9 ++++----- DSS/IDE_DRV0.ASM | 6 +++++- DSS/KEYINTER.ASM | 2 +- Shared_Includes | 2 +- 12 files changed, 67 insertions(+), 62 deletions(-) diff --git a/BOOT/BOOT.ASM b/BOOT/BOOT.ASM index 6f51bb4..3fe8460 100644 --- a/BOOT/BOOT.ASM +++ b/BOOT/BOOT.ASM @@ -25,15 +25,15 @@ DEFINE EXEinfoMACRO 1 MACRO _mEXEinfo - BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX - BYTE ' Bootloader ' - BYTE ' installer ' - BYTE ' for DSS. ' - BYTE ' Vasil Ivanov, ' - BYTE ' Anatoliy ' - BYTE ' Belyanskiy. ' - BYTE ' Sprinter Team, ' - BYTE ' 2023 ' + BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX + BYTE ' Bootloader ' + BYTE ' installer ' + BYTE ' for DSS. ' + BYTE ' Vasil Ivanov, ' + BYTE ' Anatoliy ' + BYTE ' Belyanskiy. ' + BYTE ' Sprinter Team, ' + BYTE ' 2023 ' ENDM diff --git a/BOOT/BOOTNAME.ASM b/BOOT/BOOTNAME.ASM index 33a4f70..33ba48a 100644 --- a/BOOT/BOOTNAME.ASM +++ b/BOOT/BOOTNAME.ASM @@ -39,10 +39,10 @@ BOOTDRIVE DB "C:",0 CRLF LD A,#0D LD C,DSS_PUTCHAR - RST #10 + RST ToDSS LD A,#0A LD C,DSS_PUTCHAR - RST #10 + RST ToDSS RET ERROR LD E,A diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index f025e93..3ef99b2 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -24,9 +24,7 @@ CDRIVE EQU #02 -DRIVE: - _mSYSID - +DRIVE: _mSYSID DI LD (DRIVE),A LD C,BIOS.EXT_VERSION diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index ea58827..d27dbdb 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -416,10 +416,13 @@ NOSPC INC HL JP (HL) COMP002 XOR A - LD C,#FF - -.loop: CPI ;!FIXIT CPIR - JP NZ,.loop + ;!TEST + ;LD C,#FF + LD C,A + CPIR +.loop: ;CPI + ;JP NZ,.loop + ; INC HL INC HL @@ -530,6 +533,7 @@ RUN_BAT CALL BATCH JP C,EXEERR RET +; !! Не делать одну команду > 256 символов)) !! BATLIST DZ 'PAUSE' : DW CPAUSE DZ 'REM' : DW CREM CMDLIST DZ 'CD' : DW CCHDIR @@ -1274,13 +1278,12 @@ PDIGIT LD DE,10000 LD A,L ADD A,#30 -; !FIXIT - LD (IX+0),A - INC IX - LD (IX+0),0 -; на это: - ; LD (IX+0),A - ; LD (IX+1),0 + ;!TEST + ;LD (IX+0),A + ;INC IX + ;LD (IX+0),0 + LD (IX+0),A + LD (IX+1),0 RET DIG XOR A diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM index 942a6d5..6fc4f92 100644 --- a/DSS/DOS-MAIN.ASM +++ b/DSS/DOS-MAIN.ASM @@ -251,7 +251,7 @@ PORTAL.outMAIN: ; .BPB_PHISICAL_DRIVE_NUMBER: WORD #80 ; +#24 PHISICAL DRIVE NUMBER .BPB_EXT_BOOT_RECORD_SIGNATURE: BYTE #29 ; +#26 EXTENDED BOOT RECORD SIGNATURE .BPB_SERIAL_NUMBER: DWORD 0 ; +#27 VOLUME SERIAL NUMBER -.BPB_LABEL: TEXT 8,{"NO NAME"," "} ; +#2B DISK LABEL +.BPB_LABEL: TEXT 11,{"NO NAME"," "} ; +#2B DISK LABEL .ID_FAT: TEXT 8,{"FAT16"," "} ; +#36 FILE SYSTEM ID ( BPB_FS_ID ) ENDS */ @@ -494,27 +494,25 @@ SECBUF EQU BUFFER ; !!!!! эта процедура затрётся после исполнения DEPLOY: ;Allocate memory - LD BC,USING_MEMPAGES*256+#C2 - RST ToBIOS ;GET DSS PAGES HANDLE + LD BC,USING_MEMPAGES*256 + BIOS.GetMem + RST ToBIOS RET C ;R10 - LD HL,BANKTBL LD C,A - LD B,#FF -.loop: INC B - PUSH BC - PUSH HL + + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + LD (DRV.MAIN_PG_NUMBER),A + OUT (SLOT3),A + LD A,C - LD C,#C4 ; !FIXIT на .GetMemBlkPages - пихать эту страницу в слот 1 (она будет и в 0 слоте и в 1) и вызывать биос + LD HL,BANKTBL + #C000 + LD C,BIOS.GetMemBlkPages RST ToBIOS - POP HL - POP BC - LD (HL),A - INC HL - JR NC,.loop -; - IN A,(SLOT0) - LD (DRV.MAIN_PG_NUMBER),A + POP AF + OUT (SLOT3),A + LD A,DRVPAGE CALL BANK PUSH AF diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 7db6a7c..9efa26f 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -878,12 +878,12 @@ LOADDIR: LD A,DIRPAGE CALL BANK PUSH AF - ;!FIXIT слишком долго - ; LD HL,#C000 - ; LD DE,#C001 - ; LD BC,#3FFF - ; LD (HL),L - ; LDIR + ;!TEST no ldir + ;LD HL,#C000 + ;LD DE,#C001 + ;LD BC,#3FFF + ;LD (HL),L + ;LDIR ; LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 1fe37a6..e5a7152 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -62,7 +62,7 @@ FM_BUF: _sFM SET_FM: _mFM_FIND - LD A,0 ;!FIXIT номер ошибки + LD A,0 ;!HARDCODE номер ошибки RET NZ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE SCF diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index cf08e0e..8e9c062 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -443,6 +443,7 @@ FatBuffer: ; DIRSPEC: DB '\' + ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 ; @@ -520,12 +521,14 @@ BACK_CUR_PATH: ;R12 SCANDRV: - DI ;!FIXIT в DRV-MAIN могут быть проблемы с прерываниями - LD A,#FF - LD C,#FF - RST #18 + ;!TEST в DRV-MAIN могут быть проблемы с прерываниями + ;DI + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV LD (LDRIVE),A - EI + ;EI + ; RET ;R12 diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 93ad3c2..45824a0 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -113,15 +113,15 @@ RST_30: ; <[MAIN INT]> ; BLOCK #38-$,#FF ; A0038: ; -// JP RST_38 ; -; RST_38: ; +; JP RST_38 ; +; RST_38: ; ; INT_: PUSH AF ; ; EX AF,AF' ; ; PUSH AF ; ; PUSH BC ; ; PUSH DE ; ; PUSH HL ; -; EXX ; +; EXX ; ; PUSH BC ; ; PUSH DE ; ; PUSH HL ; @@ -135,7 +135,7 @@ A0038: ; ; POP HL ; ; POP DE ; ; POP BC ; -; EXX ; +; EXX ; ; POP HL ; ; POP DE ; ; POP BC ; @@ -227,7 +227,6 @@ LDRIVE DB #00 INCLUDE 'disk_x.asm' INCLUDE 'ide_drv0.asm' INCLUDE 'fdd_drv0.asm' - ;INCLUDE 'ram_drv0.asm' INCLUDE 'ram_drv1.asm' DB 0 diff --git a/DSS/IDE_DRV0.ASM b/DSS/IDE_DRV0.ASM index b3986db..7acbb78 100644 --- a/DSS/IDE_DRV0.ASM +++ b/DSS/IDE_DRV0.ASM @@ -471,7 +471,11 @@ RESE_H XOR A STAT_H XOR A RET -CHEK_H LD A,#FF +CHEK_H: + ;!TEST + ;LD A,#FF + XOR A + ; AND A RET diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 48bf466..7a61a2b 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -312,7 +312,7 @@ TESTKEY LD HL,HOST ; RET ; K_C3 LD C,B -; RST #10 +; RST ToDSS ; RET ;small optimization diff --git a/Shared_Includes b/Shared_Includes index ced877c..3fa91af 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit ced877c153d64941d9ab3a1808d21bc559113e4b +Subproject commit 3fa91af2db4f96a96f3342d7291deb4d63a90591 From 305a557e345a04800565aaafb3847ade0b7b93ff Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 5 Jul 2023 02:43:28 +1000 Subject: [PATCH 008/219] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B3=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D0=B0=20IDE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS-MAIN.ASM | 5 ++-- DSS/IDE_DRV0.ASM | 20 ++++++++++------ DSS/RAM_DRV1.ASM | 59 +++++++++++++++++++++++------------------------- 3 files changed, 43 insertions(+), 41 deletions(-) diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM index 6fc4f92..7cdcd92 100644 --- a/DSS/DOS-MAIN.ASM +++ b/DSS/DOS-MAIN.ASM @@ -268,7 +268,7 @@ F_START: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения RET C ;R10 - CALL KINIT + CALL KINIT CALL PRINT_INIT LD C,0 RST #30 @@ -283,8 +283,7 @@ F_START: ;R05 .saveDRV+1: LD A,0 - LD B,1 - LD C,Dss.BootDSK + LD BC,1*256 + Dss.BootDSK RST #10 EI diff --git a/DSS/IDE_DRV0.ASM b/DSS/IDE_DRV0.ASM index 7acbb78..f098010 100644 --- a/DSS/IDE_DRV0.ASM +++ b/DSS/IDE_DRV0.ASM @@ -197,14 +197,17 @@ RESR_H LD A,DSS_Error.drv.INVALID_COMMAND INIT_H PUSH IY LD HL,LOGDRV LD (OFFSECT),HL - LD IX,DEVICE_CFG - LD C,#5F + LD IX,DEVICE_CFG ;!TODO сделать RAMDRIVE тут в DEVICE_CFG ? + LD C,BIOS.DRV_LIST RST ToBIOS XOR A - LD B,(IX+2) ;HDD - CP B + ;!TEST + ;LD B,(IX+2) ;HDD + ;CP B + CP (IX+2) JR Z,NO_HARDS - LD C,#80 + LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта + NX_DVCI PUSH BC LD A,C LD (DRV),A @@ -234,7 +237,7 @@ NX_DVCI PUSH BC ;R02 CALL YEP_DRV ;R02 OUT (C),B ;R02 CALL NZ,PARTIT -NO_HARDS +NO_HARDS: POP IY LD HL,(OFFSECT) LD DE,LOGDRV @@ -310,7 +313,7 @@ SPCLH_H EQU 6 ; DB #FF ;SECTOR PER CYLINDER HIGH ;06 ; DB #FF ;RESERVED ;07 -LOGDRV DS 12*LD_DSK +LOGDRV BLOCK 12*LD_DSK,0 ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS @@ -624,6 +627,9 @@ PARTIT1 LD IX,0 PARTIT2 LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC + ;!TEST + RET C ;FOR IDE2..3 + ; LD HL,(PART+510) LD DE,#AA55 AND A diff --git a/DSS/RAM_DRV1.ASM b/DSS/RAM_DRV1.ASM index 8325206..b266f7f 100644 --- a/DSS/RAM_DRV1.ASM +++ b/DSS/RAM_DRV1.ASM @@ -189,34 +189,19 @@ ; 13 (0Dh) - RESERVED -; MACRO _mGET_RAMDRV_NUM -; PUSH BC -; LD BC,RAMDTBL -; SLA A -; ADD A,C -; LD C,A -; LD A,0 -; ADC A,B -; LD B,A -; INC BC -; LD A,(BC) -; OR #60 -; POP BC +; MACRO CALL GET_RAMDRV_NUM +; LD BC,RAMDTBL +; SLA A +; ADD A,C +; LD C,A +; LD A,0 +; ADC A,B +; LD B,A +; INC BC +; LD A,(BC) +; OR #60 ;!HARDCODE сделать номера разных устройств через метки ; ENDM - MACRO _mGET_RAMDRV_NUM - LD BC,RAMDTBL - SLA A - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - INC BC - LD A,(BC) - OR #60 ;!HARDCODE сделать номера разных устройств через метки - ENDM - ; parser RMDRIVE: @@ -273,7 +258,7 @@ GBPB_RD LD IX,0 ; A - DRIVE READ_RD: PUSH BC - _mGET_RAMDRV_NUM + CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_READ JP ToBIOS @@ -282,7 +267,7 @@ READ_RD: ; RET LREAD_RD: PUSH BC - _mGET_RAMDRV_NUM + CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_READ_LONG JP ToBIOS @@ -297,7 +282,7 @@ LREAD_RD: ; A - DRIVE WRITE_RD: PUSH BC - _mGET_RAMDRV_NUM + CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_WRITE JP ToBIOS @@ -307,7 +292,7 @@ WRITE_RD: LWRITE_RD: PUSH BC - _mGET_RAMDRV_NUM + CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_WRITE_LONG JP ToBIOS @@ -428,7 +413,7 @@ IOCTL_RD: EX AF,AF' LD A,L - _mGET_RAMDRV_NUM + CALL GET_RAMDRV_NUM PUSH AF PUSH AF EX AF,AF' @@ -473,5 +458,17 @@ IOCTL_RD: ; AND A ; RET +GET_RAMDRV_NUM: + LD BC,RAMDTBL + SLA A + ADD A,C + LD C,A + LD A,0 + ADC A,B + LD B,A + INC BC + LD A,(BC) + OR #60 ;!HARDCODE сделать номера разных устройств через метки + RET ENDDRVR EQU $ ; \ No newline at end of file From aae08dd436e703fcfe378f441820307696897a9b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 7 Jul 2023 01:39:06 +1000 Subject: [PATCH 009/219] Changed procedure "BANK" --- DSS/DOS-MAIN.ASM | 10 ++- DSS/DOS5.ASM | 193 +++++++++++++++++++++++++++---------------- DSS/DOS_X.ASM | 22 +++-- DSS/DSS_MACROSES.Z80 | 11 +++ DSS/ENVIRON.ASM | 30 +++++-- DSS/EXECUTE.ASM | 11 ++- DSS/FAT_X.ASM | 23 ++++-- DSS/IDE_DRV0.ASM | 4 +- DSS/INTMOUSE.ASM | 47 +++++------ 9 files changed, 226 insertions(+), 125 deletions(-) diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM index 7cdcd92..114d3d0 100644 --- a/DSS/DOS-MAIN.ASM +++ b/DSS/DOS-MAIN.ASM @@ -347,7 +347,7 @@ ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK, low CURRDSK, low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DELETE, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 A0..13 + DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DELETE, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR ; 2 14..1D DB low CURRDIR, low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 @@ -512,8 +512,12 @@ DEPLOY: POP AF OUT (SLOT3),A - LD A,DRVPAGE - CALL BANK + ;!TEST + ;LD A,DRVPAGE + ;CALL BANK + SET_PAGE_X DRVPAGE + ; + PUSH AF LD HL,DRV_CONTENT LD DE,#C000 diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 9efa26f..413d927 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -22,8 +22,6 @@ - - ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; A - ATTRIB ; B - MODE @@ -59,7 +57,7 @@ WATTRIB PUSH AF POP BC RET C SET 7,(IY+_sFM.ACCESS_MODE) - RES 3,B ;CLEAR LABEL ATTR ;R03 + RES 3,B ;CLEAR LABEL ATTR ;R03 ;!HARDCODE attribute bit LD (IY+_sFM.ATTRIBUT),B PUSH BC CALL CLOSE @@ -153,8 +151,13 @@ DELETE LD DE,MASKARE CALL LOADDIR CALL SEARCH RET C -DELFILE LD A,DIRPAGE - CALL BANK +DELFILE: + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; + ;PUSH AF LD (IX+_sFM.NAME),#E5 LD E,(IX+_sFM.ST_CLUSTER) @@ -216,8 +219,13 @@ RENAME PUSH DE LD A,DSS_Error.sys.FILE_EXISTS CCF RET C - LD A,DIRPAGE - CALL BANK + + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; + LD HL,MASKARE LD D,XH LD E,XL @@ -320,23 +328,29 @@ CLOSE: ;R08 LD C,(IY+_sFM.HANDLE) LD B,(IY+_sFM.HANDLE+1) JR CLOSE2 -CLOSE1 ADD HL,DE +CLOSE1: ADD HL,DE DEC BC -CLOSE2 LD A,B +CLOSE2: LD A,B OR C JR NZ,CLOSE1 LD D,YH LD E,YL EX DE,HL PUSH HL - LD A,DIRPAGE - CALL BANK + + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; + POP HL LD BC,#0020 LDIR OUT (SLOT3),A CALL SAVEDIR -NOTMODF LD A,(ACCESS) +NOTMODF: + LD A,(ACCESS) CALL RES_FM RET @@ -347,15 +361,20 @@ ACCESS: DB #00 HANDBUF: BLOCK HANDBUF.SIZE,0 +WRT_HND: + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; -WRT_HND LD A,DIRPAGE - CALL BANK PUSH AF LD IX,DIR EXX LD DE,0 EXX -WRT_HN1 LD A,(IX+00) +WRT_HN1: + LD A,(IX+00) OR A JR Z,WRT_HN2 CP #E5 @@ -369,7 +388,8 @@ WRT_HN1 LD A,(IX+00) SCF RET -WRT_HN2 LD D,XH +WRT_HN2: + LD D,XH LD E,XL LD HL,HANDBUF LD BC,HANDBUF.SIZE @@ -390,7 +410,8 @@ WRT_HN2 LD D,XH AND A RET -DOSNAME INC B +DOSNAME: + INC B DEC B JP Z,GETNAME DEC B @@ -401,25 +422,26 @@ DOSNAME INC B ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 -GETNAME LD BC,#08FF -GETN1 LD A,(HL) +GETNAME: + LD BC,#08FF +GETN1: LD A,(HL) CP " " JR NZ,GETN3 -GETN2 INC HL +GETN2: INC HL DJNZ GETN2 JR GETN4 -GETN3 LDI +GETN3: LDI DJNZ GETN1 -GETN4 LD A,(HL) +GETN4: LD A,(HL) CP " " LD A,"." JR NZ,GETN5 LD A,#00 -GETN5 LD (DE),A +GETN5: LD (DE),A INC DE RET Z LD B,#03 -GETN6 LD A,(HL) +GETN6: LD A,(HL) CP " " RET Z LDI @@ -428,12 +450,13 @@ GETN6 LD A,(HL) DJNZ GETN6 RET -DTABUF DW #0000 -CURHND DW #0000 -NO_NEXT DB #00 -FNDMODE DB #00 +DTABUF: DW #0000 +CURHND: DW #0000 +NO_NEXT: DB #00 +FNDMODE: DB #00 -F_FIRST LD (ACCESS),A +F_FIRST: + LD (ACCESS),A LD (DTABUF),DE LD A,B LD (FNDMODE),A @@ -456,7 +479,7 @@ F_FIRST LD (ACCESS),A LD A,(ACCESS) LD (DE),A INC DE -FIND_S LD BC,#0020 +FIND_S: LD BC,#0020 ADD IX,BC LD (CURHND),IX LD HL,HANDBUF+12 @@ -475,13 +498,14 @@ FIND_S LD BC,#0020 LD (NO_NEXT),A XOR A RET -FIND_M2 CALL GETNAME +FIND_M2: + CALL GETNAME LD A,#FF LD (NO_NEXT),A XOR A RET -F_NEXT LD A,(NO_NEXT) +F_NEXT: LD A,(NO_NEXT) OR A LD A,DSS_Error.sys.INVALID_ACCESS SCF @@ -503,9 +527,13 @@ F_NEXT LD A,(NO_NEXT) INC DE JP FIND_S -NSEARCH EX AF,AF' - LD A,DIRPAGE - CALL BANK +NSEARCH: + EX AF,AF' + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; PUSH AF EX AF,AF' CPL @@ -516,16 +544,21 @@ NSEARCH EX AF,AF' EXX JP SEARCH1 -DSEARCH LD A,#10 +DSEARCH: + LD A,#10 CALL ASEARCH RET NC LD A,4 RET -SEARCH LD A,#23 ;%00100011 -ASEARCH EX AF,AF' ; 76ADLSHR - LD A,DIRPAGE - CALL BANK +SEARCH: LD A,#23 ;%00100011 ;!!!!! у Саймана #27 - %0010'0111 +ASEARCH: + EX AF,AF' ; 76ADLSHR + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; PUSH AF EX AF,AF' CPL @@ -534,7 +567,8 @@ ASEARCH EX AF,AF' ; 76ADLSHR EXX LD DE,0 EXX -SEARCH1 LD A,(IX+00) +SEARCH1: + LD A,(IX+00) OR A JR Z,SEARCH4 CP #E5 @@ -547,12 +581,14 @@ SEARCH1 LD A,(IX+00) LD E,XL LD B,11 EX DE,HL -SEARCH2 LD A,(DE) +SEARCH2: + LD A,(DE) CP '?' JR Z,SEARCH5 CP (HL) JR NZ,SEARCH3 -SEARCH5 INC HL +SEARCH5: + INC HL INC DE DJNZ SEARCH2 LD D,XH @@ -566,13 +602,15 @@ SEARCH5 INC HL AND A RET -SEARCH3 EXX +SEARCH3: + EXX INC DE EXX LD DE,#0020 ADD IX,DE JR NC,SEARCH1 -SEARCH4 POP AF +SEARCH4: + POP AF OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND SCF @@ -730,8 +768,12 @@ SUBDIR3 CALL FINDDIR ; FIND "MASKAREA" IN DIRECTORY -FINDDIR LD A,DIRPAGE - CALL BANK +FINDDIR: + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; PUSH AF LD IX,DIR .F_01: LD A,(IX+00) @@ -875,8 +917,11 @@ LOADDIR: LD IX,0 LD B,A CALL MOVE_FP - LD A,DIRPAGE - CALL BANK + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; PUSH AF ;!TEST no ldir ;LD HL,#C000 @@ -924,8 +969,11 @@ SAVEDIR XOR A LD IX,0 LD B,0 CALL MOVE_FP - LD A,DIRPAGE - CALL BANK + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; PUSH AF LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A @@ -960,21 +1008,23 @@ RTD1S LD A,(FatBuffer.DRIVE) AND A RET -DIRSIZE DW 0 +DIRSIZE: WORD 0 -;!FIXIT Переделать просто на структуру, чтоб получать номера страниц без этого гемора -BANK: LD C,A - LD B,0 - LD HL,BANKTBL - ADD HL,BC - IN A,(SLOT3) - LD C,SLOT3 - OUTI - RET +;!TEST + ;BANK: + ; LD C,A + ; LD B,0 + ; LD HL,BANKTBL + ; ADD HL,BC + ; IN A,(SLOT3) + ; LD C,SLOT3 + ; OUTI + ; RET +; -BANKTBL: - BLOCK USING_MEMPAGES+1,#FF +BANKTBL: BLOCK USING_MEMPAGES+1,#FF +;!TODO ;G_HAND1 POP IX ; POP HL ; POP DE @@ -1082,22 +1132,18 @@ BANKTBL: ;HANDTA DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -MASKARE - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - +MASKARE: BLOCK 32,0 ;!HARDCODE почему 32? ; HL - MASK "file*.t??" ; DE - 11 bytes filename ; RET: C=2 FILE WITHOUT EXTENTION ; C=1 FILE WITH EXTENTION - MASK PUSH HL PUSH DE LD H,D LD L,E INC DE - LD (HL),#20 - LD BC,10 + LD (HL),' ' + LD BC,10 ;!HARDCODE = size (FileName + Extension - 1) LDIR POP DE POP HL @@ -1610,8 +1656,11 @@ MKD03 INC HL DJNZ MKD03 INC HL PUSH HL - LD A,DIRPAGE - CALL BANK + ;!TEST + ;LD A,DIRPAGE + ;CALL BANK + SET_PAGE_X DIRPAGE + ; POP HL PUSH AF LD A,(DIR) diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 8e9c062..22d32ff 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -381,8 +381,11 @@ S4C02 INC HL ; JP C,RDERR1 LD HL,0 LD (FATCASH),HL - LD A,FATPAGE - CALL BANK + ;!TEST + ;LD A,FATPAGE + ;CALL BANK + SET_PAGE_X FATPAGE + ; PUSH AF XOR A CALL RE_FAT @@ -457,8 +460,11 @@ SAVE_CUR_PATH PUSH BC PUSH AF ; - LD A,ENVPAGE - CALL BANK + ;!TEST + ;LD A,ENVPAGE + ;CALL BANK + SET_PAGE_X ENVPAGE + ; PUSH AF CALL CURRDSK @@ -496,8 +502,12 @@ BACK_CUR_PATH: PUSH BC PUSH AF ; - LD A,ENVPAGE - CALL BANK + ;!TEST + ;LD A,ENVPAGE + ;CALL BANK + SET_PAGE_X ENVPAGE + ; + PUSH AF LD HL,TMP_CURDIR diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 7c984bd..c8eafb6 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -1,3 +1,14 @@ + +; + MACRO SET_PAGE_X new_page + LD A,(BANKTBL+new_page) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B + ENDM +; + ; MACRO _mSavePath IF SAVE_PATH_MACRO diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index 089f283..9781daa 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -28,8 +28,12 @@ ENVIRON: RET INITENV: - LD A,ENVPAGE - CALL BANK + ;!TEST + ;LD A,ENVPAGE + ;CALL BANK + SET_PAGE_X ENVPAGE + ; + PUSH AF ;!TEST LD A,(BOOTDRV) @@ -56,8 +60,11 @@ INITENV: READENV: PUSH HL - LD A,ENVPAGE - CALL BANK + ;!TEST + ;LD A,ENVPAGE + ;CALL BANK + SET_PAGE_X ENVPAGE + ; LD H,A LD C,SLOT3 IN L,(C) @@ -88,8 +95,11 @@ READENV: GETENV: PUSH DE CALL ENV_EX - LD A,ENVPAGE - CALL BANK + ;!TEST + ;LD A,ENVPAGE + ;CALL BANK + SET_PAGE_X ENVPAGE + ; EX AF,AF' CALL F_ENV @@ -111,9 +121,11 @@ GE_1: EX AF,AF' RET SETENV: CALL ENV_EX -; - LD A,ENVPAGE - CALL BANK + ;!TEST + ;LD A,ENVPAGE + ;CALL BANK + SET_PAGE_X ENVPAGE + ; PUSH AF ; CALL F_ENV diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 84e33c4..81b83b2 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -560,8 +560,11 @@ RELATIVE_DIR EQU 0 ABSOLUTE_DIR EQU 1 FINDPATH - LD A,ENVPAGE - CALL BANK + ;!TEST + ;LD A,ENVPAGE + ;CALL BANK + SET_PAGE_X ENVPAGE + ; PUSH AF CALL CURRDSK @@ -871,7 +874,7 @@ NOINK LD A,H SUB B LD (SECBUF),A LD SP,EXEBUFF+510 ;R02 - LD A,#FF + LD A,DSS_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A @@ -1023,7 +1026,7 @@ NOINK2 CALL GETMEM SUB B LD (SECBUF),A LD SP,EXEBUFF+510 - LD A,#FF + LD A,DSS_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index ebaa12b..c8cce78 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -61,8 +61,13 @@ R_F_FAT EX DE,HL LD A,10 RET C EXX - LD A,FATPAGE - CALL BANK + + ;!TEST + ;LD A,FATPAGE + ;CALL BANK + SET_PAGE_X FATPAGE + ; + EXX PUSH HL PUSH AF @@ -218,8 +223,11 @@ W_T_FAT PUSH DE LD A,10 RET C EXX - LD A,FATPAGE - CALL BANK + ;!TEST + ;LD A,FATPAGE + ;CALL BANK + SET_PAGE_X FATPAGE + ; EXX PUSH HL PUSH AF @@ -342,8 +350,11 @@ RE_FAT PUSH HL RET WR_FAT EXX - LD A,FATPAGE - CALL BANK + ;!TEST + ;LD A,FATPAGE + ;CALL BANK + SET_PAGE_X FATPAGE + ; EXX PUSH AF CALL WR_FAT_ diff --git a/DSS/IDE_DRV0.ASM b/DSS/IDE_DRV0.ASM index f098010..928e142 100644 --- a/DSS/IDE_DRV0.ASM +++ b/DSS/IDE_DRV0.ASM @@ -613,7 +613,7 @@ NXTPART LD DE,#10 PARTIT IN A,(SLOT3) PUSH AF - LD A,#FF + LD A,DSS_PAGE OUT (SLOT3),A CALL PARTIT1 POP AF @@ -701,7 +701,7 @@ LOADSEC PUSH IY LD IX,(CURSECL) LD HL,(CURSECH) LD DE,PART - LD BC,#0155 + LD BC,1*256 + BIOS.DRV_READ LD A,(DRV) RST ToBIOS POP IY diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index c2d0432..78c1c0d 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -846,21 +846,23 @@ CONTROL CALL READ_M RET NC CALL MCORECT LD A,#00 - LD (REDY+1),A + LD (REDY),A RET REFRESH LD A,#01 OR A RET NZ -REDY LD A,#00 -; OR A -; RET NZ +REDY+1: LD A,#00 + ;????? почему закомментированно в оригинале? + ;OR A + ;RET NZ + ; CALL RESTORE LD HL,(PIX_X) LD DE,(PIX_Y) CALL MOUSE LD A,#FF - LD (REDY+1),A + LD (REDY),A RET MODE_M DB #03 @@ -892,26 +894,25 @@ SKIPXF DW 0 REALXS DW 0 REALYS DW 0 -Xx EQU #00 -Ww EQU #FE -Nn EQU #FF - +; Xx EQU #00 +; Ww EQU #FE +; Nn EQU #FF ;MS_BMP M_IMAGE: - DB Xx,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn - DB Xx,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn - DB Xx,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn - DB Xx,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn - DB Xx,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn - DB Xx,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn - DB Xx,Ww,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn - DB Xx,Ww,Ww,Ww,Ww,Xx,Xx,Xx,Xx,Nn - DB Xx,Ww,Ww,Xx,Ww,Xx,Nn,Nn,Nn,Nn - DB Xx,Ww,Xx,Xx,Ww,Ww,Xx,Nn,Nn,Nn - DB Xx,Xx,Nn,Nn,Xx,Ww,Xx,Nn,Nn,Nn - DB Xx,Nn,Nn,Nn,Xx,Ww,Ww,Xx,Nn,Nn - DB Nn,Nn,Nn,Nn,Nn,Xx,Xx,Nn,Nn,Nn - DB Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn + DH "00 00 FF FF FF FF FF FF FF FF" + DH "00 FE 00 FF FF FF FF FF FF FF" + DH "00 FE FE 00 FF FF FF FF FF FF" + DH "00 FE FE FE 00 FF FF FF FF FF" + DH "00 FE FE FE FE 00 FF FF FF FF" + DH "00 FE FE FE FE FE 00 FF FF FF" + DH "00 FE FE FE FE FE FE 00 FF FF" + DH "00 FE FE FE FE 00 00 00 00 FF" + DH "00 FE FE 00 FE 00 FF FF FF FF" + DH "00 FE 00 00 FE FE 00 FF FF FF" + DH "00 00 FF FF 00 FE 00 FF FF FF" + DH "00 FF FF FF 00 FE FE 00 FF FF" + DH "FF FF FF FF FF 00 00 FF FF FF" + DH "FF FF FF FF FF FF FF FF FF FF" BLOCK 256-($-M_IMAGE),0 .Size EQU $-M_IMAGE From e542bc0bd3637ea2262c83899a3f0a9d3fad196c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 8 Jul 2023 00:05:39 +1000 Subject: [PATCH 010/219] Speeeeeeeed)))) --- DSS/DOS-MAIN.ASM | 6 +- DSS/DOS5.ASM | 156 +++++++++++++++++++++---------------------- DSS/DOS_X.ASM | 23 ++----- DSS/DSS_MACROSES.Z80 | 16 +++-- DSS/ENVIRON.ASM | 30 +++------ DSS/EXECUTE.ASM | 31 ++++----- DSS/FAT_X.ASM | 33 ++++----- DSS/VIDEO.ASM | 12 ++-- DSS/defines.inc | 3 +- Shared_Includes | 2 +- 10 files changed, 137 insertions(+), 175 deletions(-) diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM index 114d3d0..b672b3e 100644 --- a/DSS/DOS-MAIN.ASM +++ b/DSS/DOS-MAIN.ASM @@ -512,11 +512,7 @@ DEPLOY: POP AF OUT (SLOT3),A - ;!TEST - ;LD A,DRVPAGE - ;CALL BANK - SET_PAGE_X DRVPAGE - ; + SET_PAGE_X DRVPAGE PUSH AF LD HL,DRV_CONTENT diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 413d927..03f3377 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -69,10 +69,9 @@ WATTRIB PUSH AF ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM - CREATE: _mSavePath - AND #E7 ;R04 + AND #E7 ;R04 %76A00SHR = !FAT_ATTR LD (ACCESS),A LD (PATH0),HL CALL GETWORD @@ -90,7 +89,7 @@ CREATE: ; OUTPUT: A - FM CREAT_N: _mSavePath - AND #E7 ;R04 %76A00SHR + AND #E7 ;R04 %76A00SHR = !FAT_ATTR LD (ACCESS),A LD (PATH0),HL CALL GETWORD @@ -152,17 +151,12 @@ DELETE LD DE,MASKARE CALL SEARCH RET C DELFILE: - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + SET_PAGE_X DIRPAGE - ;PUSH AF LD (IX+_sFM.NAME),#E5 LD E,(IX+_sFM.ST_CLUSTER) LD D,(IX+_sFM.ST_CLUSTER+1) - ;POP AF + OUT (SLOT3),A LD A,E OR D @@ -183,7 +177,6 @@ SMALDEL CALL SAVEDIR ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? - RENAME PUSH DE LD DE,MASKARE CALL MASK @@ -198,7 +191,8 @@ RENAME PUSH DE RET Z PUSH DE CALL LOADDIR - LD A,#33 + ;LD A,#33 + LD A,FAT_ATTR.NoSYSnoVolID CALL ASEARCH POP HL RET C @@ -213,18 +207,14 @@ RENAME PUSH DE SCF RET Z PUSH IX - LD A,#33 + LD A,FAT_ATTR.NoSYSnoVolID CALL ASEARCH POP IX LD A,DSS_Error.sys.FILE_EXISTS CCF RET C - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + SET_PAGE_X DIRPAGE LD HL,MASKARE LD D,XH @@ -245,7 +235,7 @@ OPENATR: LD DE,MASKARE CALL MASK RET C - LD A,#37 ;%00AD0SHR + LD A,FAT_ATTR.NoVolID CALL ASEARCH JR NC,OPENAT RET @@ -338,11 +328,7 @@ CLOSE2: LD A,B EX DE,HL PUSH HL - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + SET_PAGE_X DIRPAGE POP HL LD BC,#0020 @@ -362,11 +348,7 @@ HANDBUF: BLOCK HANDBUF.SIZE,0 WRT_HND: - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + SET_PAGE_X DIRPAGE PUSH AF LD IX,DIR @@ -453,6 +435,8 @@ GETN6: LD A,(HL) DTABUF: DW #0000 CURHND: DW #0000 NO_NEXT: DB #00 +.YES EQU 0 +.NO EQU #FF FNDMODE: DB #00 F_FIRST: @@ -474,12 +458,12 @@ F_FIRST: RET C LD HL,MASKARE LD DE,(DTABUF) - LD BC,11 + LD BC,11 ;!HARDCODE LDIR LD A,(ACCESS) LD (DE),A - INC DE -FIND_S: LD BC,#0020 +FIND_S: INC DE + LD BC,#0020 ADD IX,BC LD (CURHND),IX LD HL,HANDBUF+12 @@ -492,15 +476,15 @@ FIND_S: LD BC,#0020 LD A,(FNDMODE) OR A JR NZ,FIND_M2 - LD BC,11 + LD BC,11 ;!HARDCODE LDIR - LD A,#FF + LD A,NO_NEXT.NO LD (NO_NEXT),A XOR A RET FIND_M2: CALL GETNAME - LD A,#FF + LD A,NO_NEXT.NO LD (NO_NEXT),A XOR A RET @@ -511,54 +495,53 @@ F_NEXT: LD A,(NO_NEXT) SCF RET Z LD (DTABUF),DE + EX DE,HL LD DE,MASKARE - LD HL,(DTABUF) - LD BC,11 + LD BC,11 ;!HARDCODE LDIR + + XOR A + LD (NO_NEXT),A + LD A,(HL) PUSH HL CALL NSEARCH POP DE - EX AF,AF' - XOR A - LD (NO_NEXT),A - EX AF,AF' RET C - INC DE JP FIND_S NSEARCH: EX AF,AF' - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + + SET_PAGE_X DIRPAGE PUSH AF + EX AF,AF' CPL LD C,A - LD IX,(CURHND) + EXX LD DE,0 EXX + LD IX,(CURHND) + LD A,XH + OR XL + JR Z,SEARCH3.error JP SEARCH1 DSEARCH: - LD A,#10 + LD A,FAT_ATTR.DIRECTORY CALL ASEARCH RET NC - LD A,4 + LD A,DSS_Error.sys.PATH_NOT_FOUND RET -SEARCH: LD A,#23 ;%00100011 ;!!!!! у Саймана #27 - %0010'0111 +SEARCH: LD A,FAT_ATTR.NoDIRnoVolID ASEARCH: EX AF,AF' ; 76ADLSHR - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + + SET_PAGE_X DIRPAGE + PUSH AF EX AF,AF' CPL @@ -571,7 +554,7 @@ SEARCH1: LD A,(IX+00) OR A JR Z,SEARCH4 - CP #E5 + CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены JR Z,SEARCH3 LD A,(IX+11) AND C @@ -606,9 +589,14 @@ SEARCH3: EXX INC DE EXX - LD DE,#0020 + LD DE,#0020 ;!HARDCODE ADD IX,DE JR NC,SEARCH1 +.error: POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET SEARCH4: POP AF OUT (SLOT3),A @@ -636,7 +624,7 @@ GETWORD: RET .DIR_NAME: - LD A,#00 + XOR A LD (DE),A PUSH HL LD HL,TMPNAME @@ -665,8 +653,6 @@ TMPNAME: DB ' ',#00 ; 12 ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: - -; CHNDISK: CALL OPENDSK ;????? R10 @@ -693,6 +679,13 @@ CHNDISK: ; ;????? R10 OPENDSK: + ;!TEST + LD C,A + LD A,(FatBuffer.DRIVE) + CP C + JR Z,.exit + LD A,C + ; PUSH AF LD C,Dss.DRV.Open RST ToDSS.DRV @@ -702,7 +695,7 @@ OPENDSK: LD (FatBuffer.DRIVE),A CALL RD_BPB RET C - LD A,(LDRIVE) +.exit: LD A,(LDRIVE) AND A RET .error: CP DSS_Error.sys.INVALID_DRIVE @@ -712,12 +705,14 @@ OPENDSK: RET ; -OPENDIR XOR A +OPENDIR: + XOR A CALL SET_FM LD A,(HL) OR A JP NZ,SUBDIR -REROOT1 LD DE,0 +REROOT1: + LD DE,0 LD (IY+_sFM.ST_CLUSTER),E LD (IY+_sFM.ST_CLUSTER+1),D CALL LOADDIR @@ -728,34 +723,37 @@ REROOT1 LD DE,0 AND A RET -SUBDIR CP "." +SUBDIR: CP "." JR NZ,SUBDIR2 - LD A,(IY+_sFM.ST_CLUSTER) ;R05 - OR (IY+_sFM.ST_CLUSTER+1) ;R05 + LD A,(IY+_sFM.ST_CLUSTER) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY + OR (IY+_sFM.ST_CLUSTER+1) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY JR NZ,SUDI1 ;R05 INC HL ;R05 LD A,(HL) ;R05 OR A ;R05 DEC HL ;R05 JR Z,REROOT1 ;R05 -SUDI1 EXX +SUDI1: EXX LD HL,MASKARE LD DE,MASKARE+1 - LD BC,10 - LD (HL),#20 + LD BC,10 ;!HARDCODE + LD (HL),' ' LDIR EXX LD DE,MASKARE -SUBDIR0 LDI +SUBDIR0: + LDI LD A,(HL) OR A JR NZ,SUBDIR0 JR SUBDIR3 -SUBDIR2 LD DE,MASKARE +SUBDIR2: + LD DE,MASKARE CALL MASK RET C -SUBDIR3 CALL FINDDIR +SUBDIR3: + CALL FINDDIR RET C LD (IY+_sFM.ST_CLUSTER),E LD (IY+_sFM.ST_CLUSTER+1),D @@ -822,7 +820,7 @@ FINDDIR: EX DE,HL ; JR NZ,ROTZ JR NZ,MM3 - JR MM2_5 + JP MM2_5 ; INC HL ; ROTZ LD (HL),0 ; JP IT_DIR @@ -1588,7 +1586,7 @@ MKDIR: RET C CALL LOADDIR CALL DSEARCH - LD A,15 + LD A,DSS_Error.sys.DIR_EXISTS CCF RET C CALL G_CLUST @@ -1656,11 +1654,9 @@ MKD03 INC HL DJNZ MKD03 INC HL PUSH HL - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + + SET_PAGE_X DIRPAGE + POP HL PUSH AF LD A,(DIR) diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 22d32ff..a81f05e 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -381,11 +381,9 @@ S4C02 INC HL ; JP C,RDERR1 LD HL,0 LD (FATCASH),HL - ;!TEST - ;LD A,FATPAGE - ;CALL BANK - SET_PAGE_X FATPAGE - ; + + SET_PAGE_X FATPAGE + PUSH AF XOR A CALL RE_FAT @@ -459,12 +457,8 @@ SAVE_CUR_PATH PUSH DE PUSH BC PUSH AF -; - ;!TEST - ;LD A,ENVPAGE - ;CALL BANK - SET_PAGE_X ENVPAGE - ; + + SET_PAGE_X ENVPAGE PUSH AF CALL CURRDSK @@ -501,13 +495,8 @@ BACK_CUR_PATH: PUSH DE PUSH BC PUSH AF -; - ;!TEST - ;LD A,ENVPAGE - ;CALL BANK - SET_PAGE_X ENVPAGE - ; + SET_PAGE_X ENVPAGE PUSH AF LD HL,TMP_CURDIR diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index c8eafb6..b4c759b 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -1,11 +1,17 @@ ; MACRO SET_PAGE_X new_page - LD A,(BANKTBL+new_page) - LD B,A - LD C,SLOT3 - IN A,(SLOT3) - OUT (C),B + IF OLD_SET_BANK + LD A,new_page + CALL BANK + + ELSE + LD A,(BANKTBL+new_page) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B + ENDIF ENDM ; diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index 9781daa..297be7e 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -28,12 +28,7 @@ ENVIRON: RET INITENV: - ;!TEST - ;LD A,ENVPAGE - ;CALL BANK - SET_PAGE_X ENVPAGE - ; - + SET_PAGE_X ENVPAGE PUSH AF ;!TEST LD A,(BOOTDRV) @@ -60,11 +55,9 @@ INITENV: READENV: PUSH HL - ;!TEST - ;LD A,ENVPAGE - ;CALL BANK - SET_PAGE_X ENVPAGE - ; + + SET_PAGE_X ENVPAGE + LD H,A LD C,SLOT3 IN L,(C) @@ -95,11 +88,7 @@ READENV: GETENV: PUSH DE CALL ENV_EX - ;!TEST - ;LD A,ENVPAGE - ;CALL BANK - SET_PAGE_X ENVPAGE - ; + SET_PAGE_X ENVPAGE EX AF,AF' CALL F_ENV @@ -121,13 +110,10 @@ GE_1: EX AF,AF' RET SETENV: CALL ENV_EX - ;!TEST - ;LD A,ENVPAGE - ;CALL BANK - SET_PAGE_X ENVPAGE - ; + + SET_PAGE_X ENVPAGE PUSH AF -; + CALL F_ENV JR NC,PENV XOR A diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 81b83b2..c48bba8 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -559,12 +559,8 @@ CHECKPATH: ; !TODO сде RELATIVE_DIR EQU 0 ABSOLUTE_DIR EQU 1 -FINDPATH - ;!TEST - ;LD A,ENVPAGE - ;CALL BANK - SET_PAGE_X ENVPAGE - ; +FINDPATH: + SET_PAGE_X ENVPAGE PUSH AF CALL CURRDSK @@ -579,7 +575,7 @@ FINDPATH CALL MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY -NEXTPATHI +NEXTPATHI: LD E,(HL) INC HL LD D,(HL) @@ -602,20 +598,20 @@ NEXTPATHI CALL TST_EXT JR C,BADPATH CALL SEARCH -BADPATH +BADPATH: POP BC POP HL JR NC,PATHFOUND DJNZ NEXTPATHI SCF -PATHFOUND +PATHFOUND: POP BC LD A,B OUT (SLOT3),A ; LD A,DSS_Error.sys.PATH_NOT_FOUND ;????? нужен ли тут код ошибки? RET -GOTO_CURDIR +GOTO_CURDIR: PUSH HL LD HL,TMP_CURDIR ; @@ -625,11 +621,11 @@ GOTO_CURDIR POP HL RET -MAKE_PATH_ARRAY +MAKE_PATH_ARRAY: LD HL,PATH_PNT_ARRAY-1 ;R04 -1 LD DE,ENVTEMP-1 LD B,#00 -NEXTAR LD (HL),C ;R04 +NEXTAR: LD (HL),C ;R04 INC HL ;R04 XOR A LD (DE),A @@ -642,12 +638,12 @@ NEXTAR LD (HL),C ;R04 ;R04 LD (HL),C ;R04 INC HL INC B -NEXTRT LD A,(DE) +NEXTRT: LD A,(DE) CP #5C ;\ JR NZ,NEXTCH -NEXTDR SET ABSOLUTE_DIR,C -NEXTRL ;SET RELATIVE_DIR,C -NEXTCH LD A,(DE) +NEXTDR: SET ABSOLUTE_DIR,C +NEXTRL: ;SET RELATIVE_DIR,C ;!TODO ???? +NEXTCH: LD A,(DE) CP ";" JR Z,NEXTAR INC DE @@ -724,9 +720,8 @@ EXEC1: EXEC0_SHORT: ;SHORT NAME ; TRY TO FIND IN CURRENT DIRECTORY -; ; LD (CMDLINE),HL - LD A,#01 + LD A,#01 ; %7600000R = !FAT_ATTR LD (ACCESS),A CALL GETWORD RET C diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index c8cce78..6c08d1c 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -62,12 +62,8 @@ R_F_FAT EX DE,HL RET C EXX - ;!TEST - ;LD A,FATPAGE - ;CALL BANK - SET_PAGE_X FATPAGE - ; - + SET_PAGE_X FATPAGE + EXX PUSH HL PUSH AF @@ -223,11 +219,9 @@ W_T_FAT PUSH DE LD A,10 RET C EXX - ;!TEST - ;LD A,FATPAGE - ;CALL BANK - SET_PAGE_X FATPAGE - ; + + SET_PAGE_X FATPAGE + EXX PUSH HL PUSH AF @@ -349,11 +343,8 @@ RE_FAT PUSH HL POP HL RET -WR_FAT EXX - ;!TEST - ;LD A,FATPAGE - ;CALL BANK - SET_PAGE_X FATPAGE +WR_FAT: EXX + SET_PAGE_X FATPAGE ; EXX PUSH AF @@ -362,7 +353,8 @@ WR_FAT EXX OUT (SLOT3),A RET -WR_FAT_ LD HL,(FATCASH) +WR_FAT_: + LD HL,(FATCASH) LD H,0 LD (FATCASH),HL ADD HL,HL @@ -387,7 +379,8 @@ WR_FAT_ LD HL,(FATCASH) SBC HL,DE JP C,FATERR LD A,L -WALLFAT LD H,B +WALLFAT: + LD H,B LD L,C LD DE,(FatBuffer.FAT_FRM) ADD HL,DE @@ -472,8 +465,8 @@ FATERR: POP HL ; SCF RET -FATCASH DW #0000 -MAX_CLU DW #0FF0 +FATCASH: WORD #0000 +MAX_CLU: WORD #0FF0 ;//MODULE: FAT_X ;[END] diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 5e5b1ac..899419d 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -191,7 +191,7 @@ WINCOPY: AND A PUSH AF ;R02 XOR A EX AF,AF' ;R03 - LD A,B ;R03 ;!TEST + LD A,B ;R03 EX AF,AF' ;R03 LD C,BIOS.WIN_COPY DI ;R02 @@ -213,7 +213,7 @@ WINREST: AND A PUSH AF ;R02 XOR A EX AF,AF' ;R03 - LD A,B ;R03 ;!TEST + LD A,B ;R03 EX AF,AF' ;R03 DI ;R02 LD C,BIOS.WIN_RESTORE @@ -269,7 +269,7 @@ SCROLL: DJNZ SCR_DW SCR_DW: DJNZ SCR_ERR LD B,A LD C,L - PUSH BC ;R03 ;!TEST + PUSH BC ;R03 PUSH DE PUSH HL LD XH,D @@ -281,7 +281,7 @@ SCR_DW: DJNZ SCR_ERR RST ToBIOS POP HL POP DE - POP BC ;R03 ;!TEST + POP BC ;R03 XOR A CP B JR Z,SCROLL.print @@ -561,7 +561,7 @@ SVTEXT1 LD (SVHL1),HL LD DE,#0000 EX AF,AF' ;R03 LD A,(BANKTBL+TXTPAGE) - LD B,A ;!TEST + LD B,A EX AF,AF' ;R03 LD C,BIOS.WIN_COPY XOR A @@ -591,7 +591,7 @@ SVHL1+1: LD DE,#0000 EX AF,AF' ;R03 LD A,(BANKTBL+TXTPAGE) - LD B,A ;!TEST + LD B,A EX AF,AF' ;R03 LD C,BIOS.WIN_RESTORE XOR A diff --git a/DSS/defines.inc b/DSS/defines.inc index 8a921e7..87f9b98 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +15,8 @@ ; ;-------------------[MEMORY]-------------------------; DEFINE USING_MEMPAGES 4 - + DEFINE OLD_SET_BANK 0 + ;!FIXIT сделать типа DIRPAGE EQU 0 + BANKTBL и упростить BANK DIRPAGE EQU 0 FATPAGE EQU 1 diff --git a/Shared_Includes b/Shared_Includes index 3fa91af..d3626ca 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3fa91af2db4f96a96f3342d7291deb4d63a90591 +Subproject commit d3626cafdbc4a718c1bb02da6d4c3dc806875896 From d8e13bc4b55d82efbf96ea33cf6e7db8693e67cb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 10 Jul 2023 03:49:01 +1000 Subject: [PATCH 011/219] Saving in FM offset in file and it's cluster on disk --- BOOT/DSSBOOT.ASM | 4 +- DSS/DOS5.ASM | 7 +- DSS/DOS_FM.ASM | 195 ++++++++++++++++++++++++++++++--------------- DSS/FAT_X.ASM | 48 +++++------ DSS/Structures.inc | 4 +- 5 files changed, 165 insertions(+), 93 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 3ef99b2..27c8095 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -561,10 +561,8 @@ ADD_DE2 DJNZ ADD_DE1 ;----------------- ; HL - CLUSTER - ; DE - (CLUSTER) - -R_F_FAT PUSH HL +R_F_FAT: PUSH HL LD A,(FAT_TYP) CP "2" JP Z,R_F_F12 diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 03f3377..ca479f1 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -654,7 +654,10 @@ TMPNAME: DB ' ',#00 ; 12 ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: CHNDISK: - CALL OPENDSK + ;!TEST + CALL OPENDSK + ;CALL OPENDSK.force + ; ;????? R10 RET C ;LD HL,DIRSPEC+1 @@ -686,7 +689,7 @@ OPENDSK: JR Z,.exit LD A,C ; - PUSH AF +.force: PUSH AF LD C,Dss.DRV.Open RST ToDSS.DRV POP BC diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e5a7152..e4e82be 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -41,6 +41,7 @@ FM_BUF: _sFM BLOCK (FMCOUNT-1)*FM_BUF.Size, 0 */ +; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND CP FMCOUNT+1 JR NC,ABS_FM @@ -138,6 +139,10 @@ MOVE_F1 ADD IX,BC LD (IY+34),L LD (IY+35),H XOR A + ;!TEST SAVE CLUSTER AFTER READ + ;LD (IY+_sFM.RESERVED_L),A + ;LD (IY+_sFM.RESERVED_L+1),A + ; RET ;FP COMPARE @@ -158,8 +163,11 @@ MOVE_CP LD L,(IY+28) RET ;-------------------- - -ECL2 POP BC +ECL2: + ;!TEST SAVE CLUSTER AFTER READ + POP BC + ; + POP BC POP DE AND A RET @@ -170,32 +178,91 @@ BLOKRD0 POP BC RET ;READ SECTORS OF FILE -;HL:DE - FP (in sectors) -; B - Amount sectors -BLOK_RD PUSH BC +;HL:DE - FP (in sectors) +; B - Amount sectors +BLOK_RD: PUSH BC LD (READMEM),IX LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 + ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV32 ;!FIXIT заменить вызов HLDE/BC на HLDE/C + ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb LD B,XH LD C,XL - PUSH HL ;RESIDUE - LD L,(IY+26) ;START CLUSTER - LD H,(IY+27) + PUSH HL ;RESIDUE + LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER + LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L - JR NZ,BLOKRD2 - JR ECL2 ;R01 JR BLOKRD0 -BLOKRD1 PUSH BC + ;!TEST SAVE CLUSTER AFTER READ + ;JR NZ,BLOKRD2 + PUSH BC + JR NZ,.testFunc + ; + JP ECL2 ;R01 JR BLOKRD0 + +.testFunc: + ;!TEST SAVE CLUSTER AFTER READ + LD E,(IY+_sFM.RESERVED_L) + LD D,(IY+_sFM.RESERVED_H) + LD A,D + OR E + JR Z,BLOKRD2 + + PUSH DE + PUSH HL + PUSH BC + LD E,(IY+_sFM.RESERVED_CL) + LD D,(IY+_sFM.RESERVED_CH) + LD A,D + OR E + JR Z,.noOptimization_1 + + POP HL + AND A + SBC HL,DE + JR C,.noOptimization_2 + + LD C,L + LD B,H + POP HL + POP DE + + + EX DE,HL + JP BLOKRD2 + ; +.noOptimization_1: + POP BC +.noOptimization_2: + POP HL + POP DE + JP BLOKRD2 + +BLOKRD1: + PUSH BC CALL R_F_FAT POP BC JR C,ECL2 ;R01 EX DE,HL DEC BC -BLOKRD2 LD A,B + + + +BLOKRD2: + LD A,B ; ВС - смещение внутри файла в кластерах OR C JR NZ,BLOKRD1 + + ;!TEST SAVE CLUSTER AFTER READ + LD (IY+_sFM.RESERVED_L),L + LD (IY+_sFM.RESERVED_H),H + POP BC + LD (IY+_sFM.RESERVED_CL),C + LD (IY+_sFM.RESERVED_CH),B + ; + POP DE POP BC LD A,(BootSector.S_P_C) @@ -255,7 +322,7 @@ BLOKRD7 EX DE,HL LD DE,(READMEM) LD A,(FatBuffer.DRIVE) LD B,C - LD C,5 + LD C,Dss.DRV.Read RST ToDSS.DRV JP C,BLOKRD0 POP BC @@ -407,23 +474,23 @@ BLOKWRA POP BC TSTSIZE XOR A LD (READCOD),A - LD L,(IY+32) ;FP LOW + LD L,(IY+32) ;FP LOW _sFM.F_POSITION LD H,(IY+33) ADD HL,DE EXX - LD DE,0 - LD L,(IY+34) ;FP HIGH - LD H,(IY+35) - ADC HL,DE + LD DE,0 + LD L,(IY+34) ;FP HIGH + LD H,(IY+35) + ADC HL,DE EXX ;HL':HL - NEW FP - LD C,(IY+28) + LD C,(IY+28) ; _sFM.F_SIZE LD B,(IY+29) ;SIZE LOW AND A SBC HL,BC EXX - LD C,(IY+30) ;SIZE HIGH - LD B,(IY+31) - SBC HL,BC + LD C,(IY+30) ;SIZE HIGH + LD B,(IY+31) + SBC HL,BC EXX RET C ;OK READ ALL EX DE,HL @@ -436,38 +503,40 @@ 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 CALL TSTSIZE LD A,D OR E - JP Z,NOREAD + JP Z,NOREAD ;!FIXIT можно перенести в начало процедуры PUSH DE LD A,(IY+_sFM.DRIVE) ;!TEST CHNDISK OPENDSK CALL OPENDSK ; JP C,RPERR1 - LD C,(IY+_sFM.F_POSITION) - LD E,(IY+_sFM.F_POSITION+1) - LD A,E - AND #01 - LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A - RR L - RR D - RR E ;HL:DE FP (in sectors) - ; BC FP residue (in bytes) + ;Расчёт смещения в секторах + LD C,(IY+_sFM.F_POSITION) + LD E,(IY+_sFM.F_POSITION+1) + LD A,E + AND #01 + LD B,A + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD H,0 + OR A + RR L + RR D + RR E + ;HL:DE FP (in sectors) + ;BC FP residue (in bytes) + ; LD A,B OR C JP NZ,ROV1 -ROV4 POP BC +ROV4: POP BC PUSH BC SRL B JR Z,ROV2 @@ -491,7 +560,7 @@ SECTORL+1: LD HL,0 // LD HL,(SECTORL) SECTORH+1: LD HL,0 // LD HL,(SECTORH) LD C,B ADC HL,BC -ROV2 POP BC +ROV2: POP BC LD A,B AND #01 LD B,A @@ -514,7 +583,6 @@ ROV2 POP BC POP BC LDIR LD (R_POINT),DE - ROV6: S_POINT+1: LD HL,0 // LD HL,(S_POINT) LD DE,(R_POINT) @@ -533,7 +601,7 @@ READCOD+1: LD A,0 // LD A,(READCOD) OR A RET -ROV1 PUSH BC +ROV1: PUSH BC PUSH HL PUSH DE LD IX,BUFFER+#C000 @@ -569,7 +637,7 @@ ROV1 PUSH BC LD B,H LD C,L LD HL,0 -ROV3 PUSH HL +ROV3: PUSH HL LD HL,BUFFER ADD HL,DE LD DE,(R_POINT) @@ -578,19 +646,19 @@ ROV3 PUSH HL EXX JP ROV4 -RPERR3 POP HL -RPERR2 POP HL -RPERR1 POP BC +RPERR3: POP HL +RPERR2: POP HL +RPERR1: POP BC SCF RET -PWERR3 POP HL -PWERR2 POP HL -PWERR1 POP BC +PWERR3: POP HL +PWERR2: POP HL +PWERR1: POP BC SCF RET -RD_ONLY POP DE +RD_ONLY: POP DE LD A,DSS_Error.sys.READONLY SCF RET @@ -599,7 +667,7 @@ RD_ONLY POP DE ; DE - SIZE ; A - FM -WRITE LD (R_POINT),HL +WRITE: LD (R_POINT),HL LD (S_POINT),HL PUSH DE CALL SET_FM @@ -631,7 +699,7 @@ WRITE LD (R_POINT),HL LD A,B OR C JP NZ,WOV1 -WOV4 POP BC +WOV4: POP BC PUSH BC SRL B JR Z,WOV2 @@ -646,7 +714,7 @@ R_POINT+2: LD IX,0 // LD IX,(R_POINT) LD C,B LD HL,(R_POINT) LD DE,#0200 -WOV5 ADD HL,DE +WOV5: ADD HL,DE DJNZ WOV5 LD (R_POINT),HL LD B,0 @@ -656,7 +724,7 @@ WOV5 ADD HL,DE POP HL LD C,B ADC HL,BC -WOV2 POP BC +WOV2: POP BC LD A,B AND #01 LD B,A @@ -694,7 +762,7 @@ WOV2 POP BC LD C,SLOT3 OUT (C),B RET C -WOV6 LD DE,(S_POINT) +WOV6: LD DE,(S_POINT) LD HL,(R_POINT) AND A SBC HL,DE @@ -717,8 +785,7 @@ WOV6 LD DE,(S_POINT) LD (IY+31),B AND A RET - -WOV1 PUSH BC +WOV1: PUSH BC PUSH HL PUSH DE LD IX,BUFFER+#C000 @@ -749,7 +816,7 @@ WOV1 PUSH BC LD B,H LD C,L LD HL,0 -WOV3 PUSH HL +WOV3: PUSH HL LD HL,BUFFER ADD HL,DE LD DE,(R_POINT) @@ -782,17 +849,17 @@ WOV3 PUSH HL ; HL - CLUSTER ; HL:IX - SECTOR -NSECTOR DEC HL +NSECTOR: DEC HL DEC HL EX DE,HL LD A,(BootSector.S_P_C) LD B,A LD HL,0 LD IX,0 -ADD_DE1 ADD IX,DE +ADD_DE1: ADD IX,DE JR NC,ADD_DE2 INC HL -ADD_DE2 DJNZ ADD_DE1 +ADD_DE2: DJNZ ADD_DE1 LD DE,(FatBuffer.DAT_FRM) ADD IX,DE LD DE,#0000 @@ -800,12 +867,12 @@ ADD_DE2 DJNZ ADD_DE1 RET ; HL:DE / BC => DE:IX HL-OSTATOK -DIV32 LD XH,D +DIV32: LD XH,D LD XL,E EX DE,HL LD HL,0 LD A,#20 -DIV001 ADD IX,IX +DIV001: ADD IX,IX EX DE,HL ADC HL,HL EX DE,HL @@ -816,7 +883,7 @@ DIV001 ADD IX,IX DEC A JR NZ,DIV001 RET -DIV002 INC IX +DIV002: INC IX DEC A JR NZ,DIV001 RET diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 6c08d1c..ca89b79 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -28,7 +28,6 @@ G_CLUS1: INC HL RET ; HL - CLUSTER - INC_FAT PUSH HL CALL G_CLUST POP DE @@ -53,7 +52,8 @@ INC_FA2 CALL R_F_FAT ; HL - CLUSTER ; DE - (CLUSTER) -R_F_FAT EX DE,HL +;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb +R_F_FAT: EX DE,HL LD HL,(MAX_CLU) AND A SBC HL,DE @@ -75,15 +75,17 @@ R_F_F16 LD A,H AND #0F 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/16 + 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 CP C - CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE LD E,(HL) @@ -91,11 +93,11 @@ R_F_F16 LD A,H LD D,(HL) POP AF OUT (SLOT3),A - LD HL,#FFEF + LD HL,#FFEF ;!HARDCODE XOR A ;DssErr.sys.NO_ERROR SBC HL,DE POP HL - ;LD A,DssErr.sys.NO_ERROR + ;LD A,DssErr.sys.NO_ERROR RET ;R01; HL - CLUSTER @@ -172,7 +174,7 @@ R_F_F12 LD D,H RLCA RLCA AND #07 - LD BC,(FATCASH) + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT LD DE,FAT @@ -208,7 +210,6 @@ R_F_F02 POP AF ; HL - CLUSTER ; DE - (CLUSTER) - W_T_FAT PUSH DE EX DE,HL LD HL,(MAX_CLU) @@ -226,7 +227,7 @@ W_T_FAT PUSH DE PUSH HL PUSH AF LD A,1 - LD (FATCASH+1),A + LD (FATCASH.Update),A LD A,(FatBuffer.FAT_TYP) CP "2" JP Z,W_T_F12 @@ -241,11 +242,10 @@ W_T_F16: 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 - CP C - CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + 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 + CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE POP DE @@ -275,7 +275,7 @@ W_T_F12 PUSH DE RLCA RLCA AND #07 - LD BC,(FATCASH) + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT LD DE,FAT @@ -317,9 +317,9 @@ W_T_F01 SLA E ;R01 ; A - NEW FAT BLOCK -RE_FAT PUSH HL +RE_FAT: PUSH HL PUSH AF - LD A,(FATCASH+1) + LD A,(FATCASH.Update) OR A CALL NZ,WR_FAT_ POP AF @@ -466,6 +466,8 @@ FATERR: POP HL RET FATCASH: WORD #0000 +.Block EQU FATCASH +.Update EQU FATCASH+1 MAX_CLU: WORD #0FF0 ;//MODULE: FAT_X diff --git a/DSS/Structures.inc b/DSS/Structures.inc index b518975..80ea250 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -27,7 +27,9 @@ RESERVED2 BLOCK 490,0 .ATTRIBUT: BYTE #10 ;+11 ATTRIBUT .RESERVED_L: BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения .RESERVED_H: BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи -.RESERVED_X: BLOCK 8,0 ;+14 RESERVED +.RESERVED_CL: BYTE 0 ;+14 RESERVED; !TODO следующий кластер для записи +.RESERVED_CH: BYTE 0 ;+15 RESERVED; !TODO следующий кластер для записи +.RESERVED_X: BLOCK 6,0 ;+16 RESERVED .TIME: WORD #0000 ;+22 TIME .DATE: WORD #0000 ;+24 DATE .ST_CLUSTER: WORD #0000 ;+26 START CLUSTER From 1b8bd3058236b3976e3fd5748b41a50ee049efb5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 12 Jul 2023 04:04:37 +1000 Subject: [PATCH 012/219] FIXED BUGS --- DSS/CHANGES.LOG | 17 +- DSS/DOS5.ASM | 108 +++-------- DSS/DOS_FM.ASM | 171 +++++++++++------- DSS/DOS_X.ASM | 16 +- DSS/DRV-MAIN.ASM | 10 +- DSS/{DOS-MAIN.ASM => DSS-MAIN.ASM} | 0 DSS/FAT_X.ASM | 20 +- DSS/KNOWN.BUG | 13 +- DSS/{FDD_DRV0.ASM => Media_drivers/FDD.ASM} | 31 ++-- DSS/{IDE_DRV0.ASM => Media_drivers/IDE.ASM} | 0 .../RAM_DISK.ASM} | 0 DSS/{DISK_X.ASM => Media_drivers/Shared.ASM} | 0 DSS/Structures.inc | 42 ++--- DSS/VERSION.INC | 2 +- DSS/VIDEO.ASM | 1 + 15 files changed, 213 insertions(+), 218 deletions(-) rename DSS/{DOS-MAIN.ASM => DSS-MAIN.ASM} (100%) rename DSS/{FDD_DRV0.ASM => Media_drivers/FDD.ASM} (83%) rename DSS/{IDE_DRV0.ASM => Media_drivers/IDE.ASM} (100%) rename DSS/{RAM_DRV1.ASM => Media_drivers/RAM_DISK.ASM} (100%) rename DSS/{DISK_X.ASM => Media_drivers/Shared.ASM} (100%) diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index d577f99..f411461 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -1,12 +1,23 @@ -;Изменения после версии 1.70 +!TODO Важное: Среднее: +[ ] перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле +[ ] начать работать с функциями REMOVABLE и MEDIA CHECK rst #18. Возвращать значение #FF, если порядок букв изменился Вообще не важное: -исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255 +[ ] исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255 +------------------------------- -; TEST +DSS 1.70.2 + Изменения после версии 1.70 + [+] при чтении/записи файла не происходит избыточное перечитывание кластеров от начала файла + [+] перечитывание BPB теперь делается не на каждый чих, а когда надо (и бага при загрузке с диска "B:" нет :-P ) + [+] изменена работа с RAM DISK, теперь он может быть загрузочным + [+] переход на другой диск происходит без бага с директорией от старого диска + [+] исправлены баги с обработкой буферов командной строки + [+] исправлены баги в функциях: WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE + [+] мелкие и не очень оптимизации ;Изменения после версии 1.60 10.02.2003 - Добавлена визуализация курсора в функции ECHOKEY. diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index ca479f1..30a9ca0 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -137,7 +137,7 @@ FIHND1 LD (HL),C JP OPEN ;R08 ; INPUT: HL - "filename.ext",#00 without simbols * ? -DELETE LD DE,MASKARE +DELETE: LD DE,MASKARE CALL MASK RET C LD HL,MASKARE @@ -642,8 +642,7 @@ GETWORD: SUB #20 .next: SUB 'A' PUSH HL - ;!TEST CHNDISK OPENDSK - CALL OPENDSK + CALL OPENDSK ; POP HL JP NC,GETWORD @@ -655,8 +654,8 @@ TMPNAME: DB ' ',#00 ; 12 ; RestoreDIR: CHNDISK: ;!TEST - CALL OPENDSK - ;CALL OPENDSK.force + ;CALL OPENDSK + CALL OPENDSK.force ; ;????? R10 RET C @@ -682,7 +681,7 @@ CHNDISK: ; ;????? R10 OPENDSK: - ;!TEST + ;!TEST DRV.Open обход LD C,A LD A,(FatBuffer.DRIVE) CP C @@ -770,11 +769,8 @@ SUBDIR3: ; FIND "MASKAREA" IN DIRECTORY FINDDIR: - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + SET_PAGE_X DIRPAGE + PUSH AF LD IX,DIR .F_01: LD A,(IX+00) @@ -918,11 +914,9 @@ LOADDIR: LD IX,0 LD B,A CALL MOVE_FP - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + + SET_PAGE_X DIRPAGE + PUSH AF ;!TEST no ldir ;LD HL,#C000 @@ -970,11 +964,9 @@ SAVEDIR XOR A LD IX,0 LD B,0 CALL MOVE_FP - ;!TEST - ;LD A,DIRPAGE - ;CALL BANK - SET_PAGE_X DIRPAGE - ; + + SET_PAGE_X DIRPAGE + PUSH AF LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A @@ -1054,73 +1046,19 @@ BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; CALL BANK ; EX DE,HL ; LD DE,HANDTA +; +; DUP 32 ; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI +; EDUP +; ; EXX ; OUT (SLOT3),A ; LD HL,HANDTA +; +; DUP 32 ; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI -; LDI +; EDUP + ; EXX ; POP BC ; DEC BC @@ -1130,8 +1068,8 @@ BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; PUSH BC ; JP G_HAND4 -;HANDTA DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +;HANDTA BLOCK 32,0 + MASKARE: BLOCK 32,0 ;!HARDCODE почему 32? ; HL - MASK "file*.t??" diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e4e82be..4b5f93f 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -108,57 +108,50 @@ MOVE_FP CALL SET_FM LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET - ;from Start File .F_start: ; B=0 LD C,B LD D,B LD E,B - JR MOVE_F1 - + JP .DO ;from End File -.B_end: LD C,(IY+28) - LD B,(IY+29) - LD E,(IY+30) - LD D,(IY+31) - JR MOVE_F1 - +.B_end: LD C,(IY+_sFM.F_SIZE) + LD B,(IY+_sFM.F_SIZE+1) + LD E,(IY+_sFM.F_SIZE+2) + LD D,(IY+_sFM.F_SIZE+3) + JP .DO ;from Current Position .F_current: - LD C,(IY+32) - LD B,(IY+33) - LD E,(IY+34) - LD D,(IY+35) -MOVE_F1 ADD IX,BC + LD C,(IY+_sFM.F_POSITION) + LD B,(IY+_sFM.F_POSITION+1) + LD E,(IY+_sFM.F_POSITION+2) + LD D,(IY+_sFM.F_POSITION+3) +.DO: ADD IX,BC ADC HL,DE LD D,XH LD E,XL - LD (IY+32),E - LD (IY+33),D - LD (IY+34),L - LD (IY+35),H + LD (IY+_sFM.F_POSITION),E + LD (IY+_sFM.F_POSITION+1),D + LD (IY+_sFM.F_POSITION+2),L + LD (IY+_sFM.F_POSITION+3),H XOR A - ;!TEST SAVE CLUSTER AFTER READ - ;LD (IY+_sFM.RESERVED_L),A - ;LD (IY+_sFM.RESERVED_L+1),A - ; RET ;FP COMPARE ; CY - FILE POINTER > SIZE ; NC - FILE POINTER < SIZE - -MOVE_CP LD L,(IY+28) - LD H,(IY+29) - LD E,(IY+32) - LD D,(IY+33) +MOVE_CP: + LD L,(IY+_sFM.F_SIZE) + LD H,(IY+_sFM.F_SIZE+1) + LD E,(IY+_sFM.F_POSITION) + LD D,(IY+_sFM.F_POSITION+1) AND A SBC HL,DE - LD L,(IY+30) - LD H,(IY+31) - LD E,(IY+34) - LD D,(IY+35) + LD L,(IY+_sFM.F_SIZE+2) + LD H,(IY+_sFM.F_SIZE+3) + LD E,(IY+_sFM.F_POSITION+2) + LD D,(IY+_sFM.F_POSITION+3) SBC HL,DE RET @@ -204,8 +197,8 @@ BLOK_RD: PUSH BC .testFunc: ;!TEST SAVE CLUSTER AFTER READ - LD E,(IY+_sFM.RESERVED_L) - LD D,(IY+_sFM.RESERVED_H) + LD E,(IY+_sFM.KnownCluster_L) + LD D,(IY+_sFM.KnownCluster_H) LD A,D OR E JR Z,BLOKRD2 @@ -213,8 +206,8 @@ BLOK_RD: PUSH BC PUSH DE PUSH HL PUSH BC - LD E,(IY+_sFM.RESERVED_CL) - LD D,(IY+_sFM.RESERVED_CH) + LD E,(IY+_sFM.KnownOffset_L) + LD D,(IY+_sFM.KnownOffset_H) LD A,D OR E JR Z,.noOptimization_1 @@ -247,20 +240,17 @@ BLOKRD1: JR C,ECL2 ;R01 EX DE,HL DEC BC - - - BLOKRD2: LD A,B ; ВС - смещение внутри файла в кластерах OR C JR NZ,BLOKRD1 ;!TEST SAVE CLUSTER AFTER READ - LD (IY+_sFM.RESERVED_L),L - LD (IY+_sFM.RESERVED_H),H + LD (IY+_sFM.KnownCluster_L),L + LD (IY+_sFM.KnownCluster_H),H POP BC - LD (IY+_sFM.RESERVED_CL),C - LD (IY+_sFM.RESERVED_CH),B + LD (IY+_sFM.KnownOffset_L),C + LD (IY+_sFM.KnownOffset_H),B ; POP DE @@ -340,7 +330,11 @@ ECL1 AND A ;-------------------- -BLOKWRC POP BC +BLOKWRC: + POP BC + ;!TEST SAVE CLUSTER AFTER WRITE + POP BC + ; BLOKWR0 POP BC POP DE SCF @@ -349,33 +343,77 @@ BLOKWR0 POP BC ;WRITE SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors - BLOK_WR PUSH BC LD (READMEM),IX LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 + ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV32 LD B,XH LD C,XL PUSH HL ;RESIDUE - LD L,(IY+26) ;START CLUSTER - LD H,(IY+27) + LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER + LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L - JR NZ,BLOKWR2 + ;!TEST SAVE CLUSTER AFTER WRITE + ;JR NZ,BLOKWR2 + PUSH BC + JR NZ,.testFunc + ; PUSH BC CALL G_CLUST JR C,BLOKWRC - LD (IY+26),L - LD (IY+27),H + 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 POP HL POP BC - JR BLOKWR2 + JP BLOKWR2 + +.testFunc: + ;!TEST SAVE CLUSTER AFTER WRITE + LD E,(IY+_sFM.KnownCluster_L) + LD D,(IY+_sFM.KnownCluster_H) + LD A,D + OR E + JR Z,BLOKWR2 + + PUSH DE + PUSH HL + PUSH BC + LD E,(IY+_sFM.KnownOffset_L) + LD D,(IY+_sFM.KnownOffset_H) + LD A,D + OR E + JR Z,.noOptimization_1 + + POP HL + AND A + SBC HL,DE + JR C,.noOptimization_2 + + LD C,L + LD B,H + POP HL + POP DE + + + EX DE,HL + JP BLOKWR2 + ; +.noOptimization_1: + POP BC +.noOptimization_2: + POP HL + POP DE + JP BLOKWR2 + + BLOKWR1 PUSH BC CALL R_F_FAT JR NC,BLOKWRB @@ -390,6 +428,15 @@ BLOKWRB POP BC BLOKWR2 LD A,B OR C JR NZ,BLOKWR1 + + ;!TEST SAVE CLUSTER AFTER WRITE + LD (IY+_sFM.KnownCluster_L),L + LD (IY+_sFM.KnownCluster_H),H + POP BC + LD (IY+_sFM.KnownOffset_L),C + LD (IY+_sFM.KnownOffset_H),B + ; + POP DE POP BC LD A,(BootSector.S_P_C) @@ -513,8 +560,7 @@ READ: LD (R_POINT),HL JP Z,NOREAD ;!FIXIT можно перенести в начало процедуры PUSH DE LD A,(IY+_sFM.DRIVE) - ;!TEST CHNDISK OPENDSK - CALL OPENDSK + CALL OPENDSK ; JP C,RPERR1 ;Расчёт смещения в секторах @@ -584,7 +630,7 @@ ROV2: POP BC LDIR LD (R_POINT),DE ROV6: -S_POINT+1: LD HL,0 // LD HL,(S_POINT) +S_POINT+1: LD HL,0 LD DE,(R_POINT) EX DE,HL AND A @@ -597,7 +643,7 @@ S_POINT+1: LD HL,0 // LD HL,(S_POINT) CALL MOVE_FP.F_current POP DE NOREAD: -READCOD+1: LD A,0 // LD A,(READCOD) +READCOD+1: LD A,0 OR A RET @@ -666,7 +712,6 @@ RD_ONLY: POP DE ; HL - ADDRESS ; DE - SIZE ; A - FM - WRITE: LD (R_POINT),HL LD (S_POINT),HL PUSH DE @@ -678,24 +723,22 @@ WRITE: LD (R_POINT),HL SET 7,(IY+_sFM.ACCESS_MODE) SET 5,(IY+_sFM.ATTRIBUT) LD A,(IY+_sFM.DRIVE) - ;!TEST CHNDISK OPENDSK - CALL OPENDSK - ; + CALL OPENDSK JP C,PWERR1 - LD C,(IY+32) - LD A,(IY+33) + LD C,(IY+_sFM.F_POSITION) + LD A,(IY+_sFM.F_POSITION+1) LD E,A AND #01 LD B,A - LD D,(IY+34) - LD L,(IY+35) + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) LD H,0 OR A RR L RR D RR E - ; HL:DE FP (in sectors) - ; BC FP residue (in bytes) + ; HL:DE - FP (in sectors) + ; BC - FP residue (in bytes) LD A,B OR C JP NZ,WOV1 diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index a81f05e..48ff8c8 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -134,7 +134,7 @@ CURRDS: LD HL,2 FRESP: PUSH BC CALL R_F_FAT POP BC - CP 10 + CP DSS_Error.sys.DISK_FULL JR Z,FRESP2 LD A,E @@ -185,7 +185,7 @@ TESTDSK LD A,(FatBuffer.DRIVE) RST ToDSS.DRV OR A RET Z -RD_BPB LD C,SLOT3 +RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC @@ -309,7 +309,7 @@ R_BPBL1 INC HL INC DE DJNZ R_BPBL1 -FID LD A,(HL) +FID: LD A,(HL) INC HL CP ' ' JR Z,FID @@ -322,7 +322,7 @@ FID LD A,(HL) CP '2' ; FAT12 JP NZ,ERR_BPB LD HL,#0FFF -BPB_FAT +BPB_FAT: LD (FatBuffer.FAT_TYP),A LD (FatBuffer.ENDCLUS),HL LD HL,0 @@ -415,7 +415,7 @@ ERR_BPB: SCF RET RDERR1: LD A,DSS_Error.sys.NOT_READY - SCF + ;SCF RET ; @@ -424,7 +424,7 @@ FatBuffer: .READ_PG: DB #00 .BLOCK: DB #00 .DIR_CLU: DW #0000 -.DRIVE: DB #01 +.DRIVE: DB #FF .FAT_FRM: .FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT .FAT2_XX: DW #0000 @@ -522,8 +522,8 @@ BACK_CUR_PATH: SCANDRV: ;!TEST в DRV-MAIN могут быть проблемы с прерываниями ;DI - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV RST ToDSS.DRV LD (LDRIVE),A ;EI diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 45824a0..d5ccf47 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -224,12 +224,12 @@ DISPATCH: LDRIVE DB #00 - INCLUDE 'disk_x.asm' - INCLUDE 'ide_drv0.asm' - INCLUDE 'fdd_drv0.asm' - INCLUDE 'ram_drv1.asm' + INCLUDE 'dss/media_drivers/Shared.asm' + INCLUDE 'dss/media_drivers/ide.asm' + INCLUDE 'dss/media_drivers/fdd.asm' + INCLUDE 'dss/media_drivers/ram_disk.asm' - DB 0 +; DB 0 ENDMODULE ; OUTEND diff --git a/DSS/DOS-MAIN.ASM b/DSS/DSS-MAIN.ASM similarity index 100% rename from DSS/DOS-MAIN.ASM rename to DSS/DSS-MAIN.ASM diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index ca89b79..07e7939 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -17,7 +17,7 @@ G_CLUST: .num+1: LD HL,#0001 G_CLUS1: INC HL CALL R_F_FAT - CP 10 + CP DSS_Error.sys.DISK_FULL SCF RET Z LD A,D @@ -53,12 +53,13 @@ INC_FA2 CALL R_F_FAT ; HL - CLUSTER ; DE - (CLUSTER) ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb -R_F_FAT: EX DE,HL +R_F_FAT: + EX DE,HL LD HL,(MAX_CLU) AND A SBC HL,DE EX DE,HL - LD A,10 + LD A,DSS_Error.sys.DISK_FULL RET C EXX @@ -69,8 +70,9 @@ R_F_FAT: EX DE,HL PUSH AF LD A,(FatBuffer.FAT_TYP) CP "2" - JP Z,R_F_F12 -R_F_F16 LD A,H + JR Z,R_F_F12 +R_F_F16: + LD A,H LD B,A AND #0F LD H,A @@ -187,7 +189,7 @@ R_F_F12 LD D,H LD A,D AND #0F LD D,A - JR R_F_F02 + JP R_F_F02 R_F_F01 LD A,E AND #F0 @@ -217,7 +219,7 @@ W_T_FAT PUSH DE SBC HL,DE EX DE,HL POP DE - LD A,10 + LD A,10 ;!HARDCODE error number RET C EXX @@ -230,7 +232,7 @@ W_T_FAT PUSH DE LD (FATCASH.Update),A LD A,(FatBuffer.FAT_TYP) CP "2" - JP Z,W_T_F12 + JR Z,W_T_F12 W_T_F16: PUSH DE LD A,H @@ -345,7 +347,7 @@ RE_FAT: PUSH HL WR_FAT: EXX SET_PAGE_X FATPAGE - ; + EXX PUSH AF CALL WR_FAT_ diff --git a/DSS/KNOWN.BUG b/DSS/KNOWN.BUG index 062d8b3..1356b17 100644 --- a/DSS/KNOWN.BUG +++ b/DSS/KNOWN.BUG @@ -1,12 +1,13 @@ -+ function WINCOPY & WINREST эх чряЁх∙р■Є яЁхЁ√трэш  яхЁхф т√чютюь BIOS (шёяюы№чєхЄё  т√тюф ёЄхъюь!). +FIXED: + + function WINCOPY & WINREST не запрещают прерывания перед вызовом BIOS (используется вывод стеком!). -- яЁш т√тюфх эр ъюэёюы№ фышээюую ЄхъёЄр, ¤ъЁрэ эх ёъЁюышЁєхЄё . ╧ЁютхЁ Є№ эр фюёЄшцхэшх 80 яючшЎшш! +- при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции! -+ ю°шсър т ЇєэъЎшш SCROLL A=0. ++ ошибка в функции SCROLL A=0. -+ ю°шсър яЁш яЁюёьюЄЁх ърЄрыюур т ЇєэъЎш ї єёЄрэютъш рЄЁшсєЄют яЁюяєёър■Єё  ёшёЄхьэ√х Їрщы√. я/я SEARCH MASK=#23 ++ ошибка при просмотре каталога в функциях установки атрибутов пропускаются системные файлы. п/п SEARCH MASK=#23 -- шуэюЁшЁютрэшх ю°шсюъ яЁш чряшёш ёшёЄхьэ√ї юсырёЄхщ FAT/DIR, эхтючьюцэюёЄ№ юЄЁрсюЄрЄ№ ю°шсъє write-protect, Єръ ъръ юэр ЄхЁ хЄё  яЁш яюя√Єъх чряшёрЄ№ шчьхэхээ√щ ърЄрыюу эр фшёъ. ═ю тючэшърхЄ ю°шсър file not found Єръ ъръ ёЁрчю яюёых ёючфрэш  ёшёЄхьр юЄъЁ√трхЄ Їрщы. +- игнорирование ошибок при записи системных областей FAT/DIR, невозможность отработать ошибку write-protect, так как она теряется при попытке записать измененный каталог на диск. Но возникает ошибка file not found так как сразу после создания система открывает файл. -- ю°шсър ЁрчсюЁр фюяєёЄшьюую шьхэш Їрщыр, хёыш юэю ёюёЄюшЄ шч "." Єръ ъръ яюфЁєчюьхтрхЄё  яЁюсхы√ Єюўър яЁюсхы√. +- ошибка разбора допустимого имени файла, если оно состоит из "." так как подрузомевается пробелы точка пробелы. diff --git a/DSS/FDD_DRV0.ASM b/DSS/Media_drivers/FDD.ASM similarity index 83% rename from DSS/FDD_DRV0.ASM rename to DSS/Media_drivers/FDD.ASM index 7bebc15..6f0ca7a 100644 --- a/DSS/FDD_DRV0.ASM +++ b/DSS/Media_drivers/FDD.ASM @@ -1,6 +1,6 @@ ; Disk Driver Specification ver. 2.00 -;[]===========================================================[] +;[]===========================================================[0] ;Procedure : Initialization ; ;Function : Initialization device(s) @@ -10,7 +10,7 @@ ;Output : A = Amount drive support ; HL = Size driver ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[1] ;Procedure : Open ; ;Function : Open disk @@ -20,7 +20,7 @@ ;Output : None ; ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[2] ;Procedure : Close ; ;Function : Close disk @@ -30,7 +30,7 @@ ;Output : None ; ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[3] ;Procedure : Media check ; ;Function : Checking change line @@ -41,7 +41,7 @@ ; A = 0FFh disk changed ; ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[4] ;Procedure : Get BPB ; ;Function : Get Block Parameters BIOS @@ -51,7 +51,7 @@ ;Output : None ; ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[5] ;Procedure : Input ; ;Function : Input from disk @@ -63,7 +63,7 @@ ;Output : None ; ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[6] ;Procedure : Output ; ;Function : Output to disk @@ -75,7 +75,7 @@ ;Output : None ; ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[7] ;Procedure : Removable ; ;Function : Checking change line @@ -86,7 +86,7 @@ ; A = FFh Nonremovable ; ;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[8] ;Procedure : Generic IOCTL ; ;Function : Generic Input Output Control @@ -162,7 +162,7 @@ FDDRIVE: AND A RET -.RESE: LD C,#51 +.RESE: LD C,BIOS.DRV_RESET RST ToBIOS RET @@ -174,12 +174,11 @@ FDDRIVE: RET ;DE - ADDRESS - .GBPB: LD IX,0 LD HL,0 PUSH DE PUSH AF - LD BC,#0155 + LD BC,1*256 + BIOS.DRV_READ RST ToBIOS POP DE POP HL @@ -189,14 +188,14 @@ FDDRIVE: LD E,(HL) PUSH DE LD A,D - LD C,#58 + LD C,BIOS.DRV_GET_PAR RST ToBIOS LD A,H POP HL PUSH HL LD H,A POP AF - LD C,#59 + LD C,BIOS.DRV_SET_PAR RST ToBIOS XOR A RET @@ -204,12 +203,12 @@ FDDRIVE: XOR A RET -.READD: LD C,#55 +.READD: LD C,BIOS.DRV_READ RST ToBIOS RET .WRITED: - LD C,#56 + LD C,BIOS.DRV_WRITE RST ToBIOS RET diff --git a/DSS/IDE_DRV0.ASM b/DSS/Media_drivers/IDE.ASM similarity index 100% rename from DSS/IDE_DRV0.ASM rename to DSS/Media_drivers/IDE.ASM diff --git a/DSS/RAM_DRV1.ASM b/DSS/Media_drivers/RAM_DISK.ASM similarity index 100% rename from DSS/RAM_DRV1.ASM rename to DSS/Media_drivers/RAM_DISK.ASM diff --git a/DSS/DISK_X.ASM b/DSS/Media_drivers/Shared.ASM similarity index 100% rename from DSS/DISK_X.ASM rename to DSS/Media_drivers/Shared.ASM diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 80ea250..b40ef1e 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -21,27 +21,27 @@ RESERVED2 BLOCK 490,0 ; ;File Manipulator (FM) - STRUCT _sFM ; 44 bytes -.NAME: TEXT 8,{". "," "} ;+00 NAME -.EXT: TEXT 3,{" "," "} ;+08 EXT -.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT -.RESERVED_L: BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения -.RESERVED_H: BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи -.RESERVED_CL: BYTE 0 ;+14 RESERVED; !TODO следующий кластер для записи -.RESERVED_CH: BYTE 0 ;+15 RESERVED; !TODO следующий кластер для записи -.RESERVED_X: BLOCK 6,0 ;+16 RESERVED -.TIME: WORD #0000 ;+22 TIME -.DATE: WORD #0000 ;+24 DATE -.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER -.F_SIZE: DWORD #0000 ;+28 SIZE FILE -.F_POSITION: DWORD #0000 ;+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 - ENDS + STRUCT _sFM ; 44 bytes +.NAME: TEXT 8,{". "," "} ;+00 NAME +.EXT: TEXT 3,{" "," "} ;+08 EXT +.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT +.KnownCluster_L: BYTE 0 ;+12 Младший байт номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: BYTE 0 ;+13 Старший байт номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: BYTE 0 ;+14 Младший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: BYTE 0 ;+15 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.RESERVED_X: BLOCK 6,0 ;+16 RESERVED +.TIME: WORD #0000 ;+22 TIME +.DATE: WORD #0000 ;+24 DATE +.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER +.F_SIZE: DWORD #0000 ;+28 SIZE FILE +.F_POSITION: DWORD #0000 ;+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 + ENDS ; ; NAM EQU 0 ; LEN4 EQU 31 ; EXT EQU 8 ; POS1 EQU 32 diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC index c1bda05..e6a3d19 100644 --- a/DSS/VERSION.INC +++ b/DSS/VERSION.INC @@ -2,7 +2,7 @@ ; DSS Version VERS EQU 01 ;Version Number (XX.) MODF EQU 70 ;Modification (.xx) -BUILD EQU 1 +BUILD EQU 2 ; ; Release Types diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 899419d..de58e29 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -6,6 +6,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;R03 04-04-2023 BAO FIXED BUGS IN FN WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE ;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" ;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) ;--------------------------------------------------------------- From 13663bac2ad8db6c4553df830b9478341075ad80 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 12 Jul 2023 04:04:58 +1000 Subject: [PATCH 013/219] ... --- DSS/DOS5.ASM | 1 - Shared_Includes | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 30a9ca0..ec89219 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -643,7 +643,6 @@ GETWORD: .next: SUB 'A' PUSH HL CALL OPENDSK - ; POP HL JP NC,GETWORD RET diff --git a/Shared_Includes b/Shared_Includes index d3626ca..53ae29d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d3626cafdbc4a718c1bb02da6d4c3dc806875896 +Subproject commit 53ae29d127a926a372ada8fc8692afc7ecafdd9a From 258ea31f216c4fe94d3a2c7c4d71927c6de6217d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 15 Jul 2023 05:04:48 +1000 Subject: [PATCH 014/219] =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20DIV?= =?UTF-8?q?32=20=D0=B4=D0=BB=D1=8F=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F/?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=B8=D1=81=D0=BA,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D0=B4=D0=B8?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D1=8F=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D0=BC=D0=B8.=20=D0=9D=D0=B0=D1=87=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D0=BB=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB?= =?UTF-8?q?=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Console/DOS_EQU.ASM | 71 -- Console/DSS.INC | 104 --- Console/SYS.old | 2074 ------------------------------------------- 3 files changed, 2249 deletions(-) delete mode 100644 Console/DOS_EQU.ASM delete mode 100644 Console/DSS.INC delete mode 100644 Console/SYS.old diff --git a/Console/DOS_EQU.ASM b/Console/DOS_EQU.ASM deleted file mode 100644 index 040325b..0000000 --- a/Console/DOS_EQU.ASM +++ /dev/null @@ -1,71 +0,0 @@ -/* -VERSION EQU #00 -CHDISK EQU #01 -CURDISK EQU #02 -DSKINFO EQU #03 -G_ENTRY EQU #04 - -BOOTDSK EQU #09 -CREATE EQU #0A -CREAT_N EQU #0B -ERASE EQU #0D -DELETE EQU #0E -MOVE EQU #0F -RENAME EQU #10 -OPEN EQU #11 -CLOSE EQU #12 -READ EQU #13 -WRITE EQU #14 -MOVE_FP EQU #15 -ATTRIB EQU #16 -GET_D_T EQU #17 -PUT_D_T EQU #18 -F_FIRST EQU #19 -F_NEXT EQU #1A -MKDIR EQU #1B -RMDIR EQU #1C -CHDIR EQU #1D -CURDIR EQU #1E -SYSTIME EQU #21 -SETTIME EQU #22 - -WAITKEY EQU #30 -SCANKEY EQU #31 -ECHOKEY EQU #32 -CTRLKEY EQU #33 -EDIT EQU #34 -K_CLEAR EQU #35 - -SETWIN EQU #38 -SETWIN1 EQU #39 -SETWIN2 EQU #3A -SETWIN3 EQU #3B -FREEMEM EQU #3C -GETMEM EQU #3D -RETMEM EQU #3E -SETMEM EQU #3F - -EXEC EQU #40 -EXIT EQU #41 -WAIT EQU #42 - -GSWITCH EQU #43 -DOSNAME EQU #44 - -SETVMOD EQU #50 -GETVMOD EQU #51 -LOCATE EQU #52 -CURSOR EQU #53 -SELPAGE EQU #54 -SCROLL EQU #55 -CLEAR EQU #56 -RDCHAR EQU #57 -WRCHAR EQU #58 -WINCOPY EQU #59 -WINREST EQU #5A -PUTCHAR EQU #5B -PCHARS EQU #5C -RES_PRN EQU #5D -CTRLPRN EQU #5E -PRINT EQU #5F -*/ diff --git a/Console/DSS.INC b/Console/DSS.INC deleted file mode 100644 index 5197cee..0000000 --- a/Console/DSS.INC +++ /dev/null @@ -1,104 +0,0 @@ - -DSS_VERSION EQU #00 -DSS_CHDISK EQU #01 -DSS_CURDISK EQU #02 -DSS_DSKINFO EQU #03 -;DSS_G_ENTRY EQU #04 -; EQU #05 -; EQU #06 -; EQU #07 -; EQU #08 -DSS_BOOTDSK EQU #09 -;File io -DSS_CREATE EQU #0A -DSS_CREAT_N EQU #0B -; EQU #0C -;DSS_ERASE EQU #0D -DSS_DELETE EQU #0E -;DSS_MOVE EQU #0F -DSS_RENAME EQU #10 -DSS_OPEN EQU #11 -DSS_CLOSE EQU #12 -DSS_READ EQU #13 -DSS_WRITE EQU #14 -DSS_MOVE_FP EQU #15 -DSS_ATTRIB EQU #16 -DSS_GET_D_T EQU #17 -DSS_PUT_D_T EQU #18 -DSS_F_FIRST EQU #19 -DSS_F_NEXT EQU #1A -DSS_MKDIR EQU #1B -DSS_RMDIR EQU #1C -DSS_CHDIR EQU #1D -DSS_CURDIR EQU #1E -; EQU #1F -; EQU #20 -DSS_SYSTIME EQU #21 -DSS_SETTIME EQU #22 -; EQU #23 -; EQU #24 -; EQU #25 -; EQU #26 -; EQU #27 -; EQU #28 -; EQU #29 -; EQU #2A -; EQU #2B -; EQU #2C -; EQU #2D -; EQU #2E -; EQU #2F -;Keyboard -DSS_WAITKEY EQU #30 -DSS_SCANKEY EQU #31 -DSS_ECHOKEY EQU #32 -DSS_CTRLKEY EQU #33 -;DSS_EDIT EQU #34 -DSS_K_CLEAR EQU #35 -DSS_K_SETUP EQU #36 -DSS_TESTKEY EQU #37 -;Memory -DSS_SETWIN EQU #38 -DSS_SETWIN1 EQU #39 -DSS_SETWIN2 EQU #3A -DSS_SETWIN3 EQU #3B -DSS_INFOMEM EQU #3C -DSS_GETMEM EQU #3D -DSS_FREEMEM EQU #3E -DSS_SETMEM EQU #3F -;Execution -DSS_EXEC EQU #40 -DSS_EXIT EQU #41 -DSS_WAIT EQU #42 - -DSS_GSWITCH EQU #43 -DSS_DOSNAME EQU #44 -DSS_EX_PATH EQU #45 -DSS_ENVIRON EQU #46 -DSS_APPINFO EQU #47 -; EQU #48 -; EQU #49 -; EQU #4A -; EQU #4B -; EQU #4C -; EQU #4D -; EQU #4E -; EQU #4F - -DSS_SETVMOD EQU #50 -DSS_GETVMOD EQU #51 -DSS_LOCATE EQU #52 -DSS_CURSOR EQU #53 -DSS_SELPAGE EQU #54 -DSS_SCROLL EQU #55 -DSS_CLEAR EQU #56 -DSS_RDCHAR EQU #57 -DSS_WRCHAR EQU #58 -DSS_WINCOPY EQU #59 -DSS_WINREST EQU #5A -DSS_PUTCHAR EQU #5B -DSS_PCHARS EQU #5C -;DSS_RES_PRN EQU #5D -;DSS_CTRLPRN EQU #5E -DSS_PRINT EQU #5F -; diff --git a/Console/SYS.old b/Console/SYS.old deleted file mode 100644 index 92cbf0e..0000000 --- a/Console/SYS.old +++ /dev/null @@ -1,2074 +0,0 @@ - -;[BEGIN] -; -; SYSTEM.EXE /S /P -; -; /P Primary command processor -; /S Secondary command processor -; /C Execute batch file - -;-------------------------------------------------------------- -;Rev. Date Name Description -;-------------------------------------------------------------- -;R05 11-12-2002 DNS IMPLEMENTED %VAR% -;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE -;R03 11-12-2002 DNS NEW VERSION -;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES -;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO -; - - ORG #8100-512 - INCLUDE "dss.inc" - INCLUDE "dos_equ.asm" -CR EQU 13 -LF EQU 10 - DB "EXE" ;EXE ID - DB #00 ;EXE VERSION - DW #0200 ;CODE OFFSET LOW - DW #0000 ;CODE OFFSET HIGH - DW #0000 ;END-BEG ;PRIMARY LOADER - DW #0000 ; - DW #0000 ;RESERVED - DW #0000 ; - DW #8100 ;LOAD ADDRESS - DW #8100 ;START ADDRESS - DW #BFFF ;STACK ADDRESS - - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0 - -; DEFS 490,0 - -; LD SP,#BFFF -START CALL INIT - CALL GET_CMD - EI - LD A,(RUNMODE) - AND #80 ;TEST PRIMARY - JP NZ,FPRIMAR - LD A,(RUNMODE) - AND #20 ;TEST SECONDARY - JP NZ,FSECOND - LD A,(RUNMODE) - AND #10 ;TEST BATCH FILE - JP NZ,FBATCHS - LD A,(RUNMODE) - AND #40 ;TEST PROCESS - JP NZ,FBATCH - JP QUIT - -FSECOND CALL VERS - JP CONSOLE - -FBATCHS - LD HL,CMDLINE - CALL BATCH - JP QUIT - -FBATCH - CALL CMDMODE - JP QUIT - -FPRIMAR LD C,CTRLKEY - RST #10 - LD A,B - AND #C0 - JP NZ,CONSOLE - LD HL,BATNAME - CALL BATCH - JP CONSOLE - -BATCH XOR A - LD C,OPEN - RST #10 - RET C - LD (BAT_FM),A - CALL NEWLINE - XOR A - RET - -NEWLINE LD DE,CMDLINE -ADDBAT PUSH DE - CALL READBAT - POP DE - OR A - JR NZ,BATLINE - EX DE,HL - LD DE,CMDLINE - AND A - SBC HL,DE - RET Z - LD A,L - LD (CMDLINE-1),A - CALL CMDMODE - LD C,CLOSE - LD A,(BAT_FM) - RST #10 - RET - -BATLINE LD HL,BATBUFF -NBLINE CALL MOVWORD - JP C,ADDBAT - LD A,B - LD (BAT_LEN),A - PUSH HL - EX DE,HL - LD DE,CMDLINE - AND A - SBC HL,DE - LD A,L - LD (CMDLINE-1),A - CALL CMDMODE - LD DE,CMDLINE - POP HL - JP NBLINE - -MOVWORD LD A,(BAT_LEN) - LD B,A -M00WORD LD A,(HL) - LD (DE),A - CP #20 - JR C,M01WORD - INC HL - INC DE - DJNZ M00WORD - SCF - RET - -M01WORD LD A,(HL) - CP #20 - RET NC - INC HL - DJNZ M01WORD - RET - -READBAT LD HL,BATBUFF - LD DE,128 - LD C,READ - LD A,(BAT_FM) - RST #10 - LD A,E - LD (BAT_LEN),A - RET - -CMDMODE XOR A - LD (POSIT),A - CALL EVALCMD ;R05 - LD IX,CMDLINE-2 - LD HL,CMDLINE - LD A,(HL) - CP "@" - JR NZ,NOALPHA - DEC HL - DEC (HL) - JR Z,NOEC - LD C,(HL) - INC HL - LD B,0 - LD D,H - LD E,L - INC HL - LDIR - JR NOEC -NOALPHA LD A,(ECHOFLG) - OR A - JR NZ,NOEC - LD DE,CMDLINE - CALL PRINT_S - CALL CRLF - LD A,(CMDLINE-1) - OR A - RET Z - CALL CRLF - CALL COMPBAT - RET - -NOEC LD A,(CMDLINE-1) - OR A - RET Z - CALL COMPBAT - RET - -COMPBAT LD HL,CMDLINE - DEC HL - LD C,(HL) - LD B,0 - INC HL -COMP00B LD A,(HL) - CP " " - JR NZ,COMP01B - INC HL - DEC C - JR NZ,COMP00B - RET -COMP01B LD D,H - LD E,L - ADD HL,BC - LD (HL),0 - SBC HL,BC - LD A,C - EX AF,AF' - LD A,#20 - CPIR - JR NZ,COMPB05 - INC C -COMPB05 EX AF,AF' - SUB C - LD C,A - LD HL,BATLIST - JP COMP004 - -INIT LD A,(IX-1) - LD (TASKX),A - PUSH IX - CALL CRLF - CALL GETPATH - POP IX - RET - -CONSOLE CALL CRLF -RE_ CALL GETXY - CALL GETPATH -; CALL VERS - LD HL,CMDLINE - LD DE,CMDLINE+1 - LD (HL),0 - LD BC,#7F - LDIR - CALL INPUT - CALL CRLF - LD A,(CMDLINE-1) - OR A - JP Z,RE_ - CALL CRLF - CALL COMP - JP RE_ - -GETXY LD C,CURSOR - RST #10 - JP LOCAT - -INPUT XOR A - LD (POSIT),A - LD (SHIFT),A - LD (LEN_NEW),A - LD IX,CMDLINE-2 - CALL CEDIT - CALL RES_CUR - RET - -COMP - CALL EVALCMD ;R05 - LD HL,CMDLINE - DEC HL - LD C,(HL) - LD B,0 - INC HL -COMP00 LD A,(HL) - CP " " - JR NZ,COMP01 - INC HL - DEC C - JR NZ,COMP00 - RET -COMP01 LD D,H - LD E,L - ADD HL,BC - LD (HL),0 - SBC HL,BC - LD A,C - EX AF,AF' - LD A,#20 - CPIR - JR NZ,COMP005 - INC C -COMP005 EX AF,AF' - SUB C - LD C,A - LD HL,CMDLIST -COMP004 PUSH BC - PUSH DE -COMP000 LD A,(DE) - CP #61 - JP C,COMP001 - CP #7B - JP NC,COMP001 - SUB #20 -COMP001 CP (HL) - JP NZ,COMP002 - INC HL - INC DE - DEC C - JP NZ,COMP000 - XOR A - CP (HL) - JP NZ,COMP002 - POP BC - POP BC - LD A,(DE) - CP " " - JR NZ,NOSPC - INC DE -NOSPC INC HL - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - JP (HL) - -COMP002 XOR A - LD C,#FF - CPI - JP NZ,$-2 - INC HL - INC HL - POP DE - POP BC - LD A,(HL) - OR A - JP NZ,COMP004 - LD H,D ;CMDLINE - LD L,E - LD B,(HL) - INC HL - LD C,(HL) - INC HL - LD A,(HL) - OR A - JR NZ,RUN_EXT - LD A,":" - CP C - JR NZ,RUN_EXT - LD A,B - CP "a" - JR C,NOUP - CP "{" - JR NC,NOUP - AND #5F -NOUP SUB "A" - LD C,CHDISK - RST #10 - JP C,ERROR - JP GETPATH - -SAVEHL DW 0 - -RUN_EXT EX DE,HL - LD (SAVEHL),HL - LD BC,#0445 - LD DE,EXTBF - RST #10 - LD HL,(SAVEHL) - JR C,RUN_EXE - BIT 1,A - JR Z,NON_EXT - LD DE,EXTBF - LD HL,BATBF - LD B,3 - CALL COMPARE - LD HL,(SAVEHL) - JR Z,RUN_BAT - JP RUN_EXE - -NON_EXT LD BC,0+EXEC - RST #10 - RET NC - LD HL,(SAVEHL) - CP 3 - JP NZ,EXEERR - PUSH HL - LD A,(CMDLINE-1) - LD B,A -EXF000 LD A,(HL) - CP "!" - JR C,EXF001 - INC HL - DJNZ EXF000 - -EXF001 - LD E,B - LD D,0 - ADD HL,DE - PUSH HL - LD E,4 - ADD HL,DE - POP DE - EX DE,HL - LD C,B - LD B,0 - INC C - LDDR - INC HL - LD (HL),"." - INC HL - LD (HL),"B" - INC HL - LD (HL),"A" - INC HL - LD (HL),"T" -; LD HL,(SAVEHL) - POP HL - JP RUN_BAT - -RUN_EXE LD B,0 - LD C,EXEC - RST #10 - RET NC -EXEERR CP 5 - JP NC,ERROR - LD DE,0 ;BAD COMMAND OR FILENAME - JP ERR_MSG - -RUN_BAT CALL BATCH - JP C,EXEERR - RET - -BATLIST DB "PAUSE",0 - DW CPAUSE - DB "REM",0 - DW CREM -CMDLIST DB "CD",0 - DW CCHDIR - DB "CHDIR",0 - DW CCHDIR - DB "CLS",0 - DW CLS - DB "DATE",0 - DW CDATE - DB "DEL",0 - DW CDELET - DB "DIR",0 - DW DIR - DB "ECHO",0 - DW CECHO - DB "ERASE",0 - DW CDELET - DB "EXIT",0 - DW CEXIT - DB "HELP",0 - DW HELP - DB "MD",0 - DW CMKDIR - DB "MKDIR",0 - DW CMKDIR - DB "REN",0 - DW CRENAM - DB "RENAME",0 - DW CRENAM - DB "RD",0 - DW CRMDIR - DB "RMDIR",0 - DW CRMDIR - DB "SET",0 - DW CSET - DB "TIME",0 - DW CTIME - DB "VERSION",0 - DW VERS - DB "VER",0 - DW VERS - DB #00 - -CLS LD DE,#0000 - LD HL,#2050 - LD BC,#0700+CLEAR - LD A," " - RST #10 - LD DE,#0000 - JP LOCAT - -CRLF LD A,#0D - CALL PRINTX - LD A,#0A - JP PRINTX - -CDATE EX DE,HL - LD DE,DTA - LD C,GSWITCH - RST #10 - LD DE,DTA - LD A,(DE) - OR A - JR Z,NOSETD - CALL STR2DEC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,31 - CP L - JR C,ILLEG - LD B,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,12 - CP L - JR C,ILLEG - LD C,L - PUSH BC - CALL STR2DEC - PUSH HL - LD C,SYSTIME - RST #10 - POP IX - POP DE - LD C,SETTIME - RST #10 -NOSETD LD C,SYSTIME - RST #10 - PUSH IX - PUSH DE - LD A,D - LD HL,PRM1 - CALL PUTB - LD A,"-" - LD (HL),A - INC HL - POP DE - LD A,E - CALL PUTB - LD A,"-" - LD (HL),A - INC HL - PUSH HL - POP IX - POP HL - CALL PDIGIT - LD DE,DATEMSG - JP MESSAGE - -ILLEG LD DE,ILLGMSG - CALL MESSAGE - RET - -CTIME EX DE,HL - LD DE,DTA - LD C,GSWITCH - RST #10 - LD DE,DTA - LD A,(DE) - OR A - JR Z,NOSETT - CALL STR2DEC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,23 - CP L - JR C,ILLEG - LD B,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,59 - CP L - JR C,ILLEG - LD C,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,59 - CP L - JR C,ILLEG - PUSH BC - LD A,L - PUSH AF - LD C,SYSTIME - RST #10 - POP BC - POP HL - LD C,SETTIME - RST #10 -NOSETT LD C,SYSTIME - RST #10 - PUSH BC - PUSH HL - LD A,H - LD HL,PRM1 - CALL PUTB - LD A,":" - LD (HL),A - INC HL - POP DE - LD A,E - CALL PUTB - LD A,":" - LD (HL),A - INC HL - POP AF - CALL PUTB - XOR A - LD (HL),A - LD DE,TIMEMSG - JP MESSAGE - -CPAUSE LD DE,PAUSMSG - CALL MESSAGE - LD C,WAITKEY - RST #10 - RET - - -CSET LD A,(DE) - OR A - JP Z,PRNENVIR - EX DE,HL - LD BC,#0200+DSS_ENVIRON - RST #10 - CALL C,ERROR - RET - -PRNENVIR - LD HL,DTA - LD BC,#0000+DSS_ENVIRON - RST #10 - LD HL,DTA -PRNENVX LD C,DSS_PCHARS - RST #10 - LD A,CR - LD C,DSS_PUTCHAR - RST #10 - LD A,LF - LD C,DSS_PUTCHAR - RST #10 - LD A,(HL) - OR A - JR NZ,PRNENVX - RET - - -CECHO EX DE,HL - LD A,(HL) - OR A - JR Z,ECHO_F - EX DE,HL - PUSH DE - LD B,3 - LD HL,ECHOON - CALL COMPARE - POP DE - JR Z,ECHO_FS - PUSH DE - LD B,4 - LD HL,ECHOOFF - CALL COMPARE - POP HL - JR Z,ECHO_FR - -;R03 REMOVE R01 - - LD C,PCHARS - RST #10 - JP CRLF - -ECHO_F LD A,(ECHOFLG) - OR A - LD DE,ON__MSG - JR Z,ECHON - LD DE,OFF_MSG -ECHON CALL FMESAGE - LD DE,PRM1 - CALL PUTPRM - LD DE,ECHOMSG - CALL MESSAGE - RET - -ECHO_FS XOR A - LD (ECHOFLG),A - RET - -ECHO_FR LD A,#FF - LD (ECHOFLG),A - RET - -;R04 - -EVALCMD - XOR A - LD HL,CMDLINE-1 - LD C,(HL) - LD B,A - INC HL - ADD HL,BC - LD (HL),A - SBC HL,BC - LD DE,TMPLINE - CALL EVALSTR - LD HL,TMPLINE - LD DE,CMDLINE - LD BC,#00FF -MOVLBAK LD A,(HL) - LDI - INC B - OR A - JR NZ,MOVLBAK - DEC B - LD A,B - LD (CMDLINE-1),A - AND A - RET - -; HL - STRING WITH %VAR% - -EVALSTR -;R04 LD DE,DTA -VARLOOP - LD A,(HL) - CP "%" - JR Z,TVARIABLE -VARL1 LDI - OR A - JR NZ,VARLOOP - LD BC,0 - LD (TVAR_PNT),BC -;R04 LD HL,DTA -;R04 - RET - - -;R01 -TVAR_PNT - DW 0 - -TVARIABLE - LD BC,(TVAR_PNT) - LD A,B - OR C - LD A,"%" - LD (TVAR_PNT),DE - JR Z,VARL1 - PUSH HL - LD H,D - LD L,E - DEC HL - AND A - SBC HL,BC - JR Z,TNOVAR - LD A,"=" - LD (DE),A - INC DE - XOR A - LD (DE),A - LD D,B - LD E,C - LD H,B - LD L,C - INC HL - LD BC,#0100+DSS_ENVIRON - RST #10 -TNOVAR POP HL - INC HL - LD BC,0 - LD (TVAR_PNT),BC - JP VARLOOP -;R01 - -COMPARE LD A,(DE) - CP #61 - JP C,COM001 - CP #7B - JP NC,COM001 - SUB #20 -COM001 CP (HL) - RET NZ - INC HL - INC DE - DJNZ COMPARE - RET - -CREM RET - -CCHDIR EX DE,HL - LD DE,DTA - LD C,GSWITCH - RST #10 - XOR A - LD HL,DTA - CP (HL) - JR NZ,YP - LD (HL),"." - INC HL - LD (HL),"." - INC HL - LD (HL),0 - DEC HL - DEC HL -YP LD C,CHDIR - RST #10 - CALL C,ERROR - CALL GETPATH - RET - -CMKDIR EX DE,HL - LD DE,DTA - LD C,GSWITCH - RST #10 - LD HL,DTA - LD C,MKDIR - RST #10 - CALL C,ERROR - RET - -CRMDIR EX DE,HL - LD DE,DTA - LD C,GSWITCH - RST #10 - LD HL,DTA - LD C,RMDIR - RST #10 - CALL C,ERROR - RET - -CDELET EX DE,HL - LD DE,DTA - LD C,GSWITCH - RST #10 - LD HL,DTA - LD C,DELETE - RST #10 - CALL C,ERROR - RET - -CRENAM EX DE,HL - LD DE,DTA - LD C,GSWITCH - RST #10 - LD DE,DTA+128 - LD C,GSWITCH - RST #10 - LD HL,DTA - LD DE,DTA+128 - LD C,RENAME - RST #10 - CALL C,ERROR - RET - -ERROR LD E,A - LD D,0 - JP ERR_MSG - -DIR LD HL,0 - LD (FILES),HL - LD (S_LOW),HL - LD (S_HIGH),HL - EX DE,HL - LD A,(HL) - OR A - JR NZ,YPS - LD HL,ALLFS -YPS LD DE,DTA - LD C,GSWITCH - RST #10 - LD HL,DTA - LD DE,DTA - LD A,#37 - LD BC,#0000+F_FIRST - RST #10 - JP C,ERROR - LD A,(PATHF) - LD (PRM1+0),A - LD A,":" - LD (PRM1+1),A - LD A,0 - LD (PRM1+2),A - LD HL,SER_NUM - LD DE,PRM2 - CALL PUTPRM - CALL GETPATH - LD HL,PATHF - LD DE,PRM3 - CALL PUTPRM - LD DE,DIR1MSG - CALL MESSAGE -; CALL CRLF -; CALL CRLF -DIRNEX LD HL,DTA - LD DE,33 - ADD HL,DE - CALL PNAME - LD IX,DTA - LD A,(IX+32) - AND #10 - JP NZ,NODADD - LD HL,(FILES) - INC HL - LD (FILES),HL - LD E,(IX+30) - LD D,(IX+31) - LD HL,(S_HIGH) - EXX - LD E,(IX+28) - LD D,(IX+29) - LD HL,(S_LOW) - CALL ADDXXX - LD (S_LOW),HL - EXX - LD (S_HIGH),HL -NODADD LD DE,DTA - LD C,F_NEXT - RST #10 - JR NC,DIRNEX - CALL ORDERS - RET - -ORDERS LD HL,(FILES) - LD IX,PRM1 - CALL PDIGIT - LD HL,(S_LOW) - EXX - LD HL,(S_HIGH) - EXX - CALL MAKE_LN - LD HL,L32BIT_+9 - LD A,(HL) - CP #20 - JR NZ,ALR2 - LD A,#30 - LD (HL),A -ALR2 LD DE,SIZEBFF - LD HL,L32BIT_;; +1 - LD A,(HL) - LDI - CP " " - JR Z,NOPO1 - LD A,"." -NOPO1 LD (DE),A - INC DE - LDI - LDI - LD A,(HL) - LDI - CP " " - JR Z,NOPO2 - LD A,"." -NOPO2 LD (DE),A - INC DE - LDI - LDI - LD A,(HL) - LDI - CP " " - JR Z,NOPO3 - LD A,"." -NOPO3 LD (DE),A - INC DE - LDI - LDI - LDI - LD HL,SIZEBFF - LD DE,PRM2 - CALL PUTPRM - LD DE,DIR2MSG - JP MESSAGE - -;HL':HL + DE':DE - -ADDXXX ADD HL,DE - EXX - ADC HL,DE - EXX - RET - -FILES DW 0 - -S_LOW DW 0 -S_HIGH DW 0 - -;12345678 123 1 234 567 890 " -; SIZE - -PNAME LD BC,8 - LD DE,PRM1 - LDIR - XOR A - LD (DE),A - LD DE,PRM2 - LDI - LDI - LDI - LD (DE),A - LD IX,DTA - CALL PRNSIZE - CALL PRNDATE - CALL PRNTIME - LD DE,DIR3MSG - JP MESSAGE - -PRINTB LD A,(HL) - PUSH BC - CALL PRINTX - POP BC - INC HL - DJNZ PRINTB - RET -;------------------ - -PUTB LD C,#2F -PUTB1 INC C - SUB 10 - JP NC,PUTB1 - ADD A,10 - ADD A,#30 - PUSH AF - LD A,C - LD (HL),A - INC HL - POP AF - LD (HL),A - INC HL - RET - - -PRNB LD C,#2F -PRNB1 INC C - SUB 10 - JP NC,PRNB1 - ADD A,10 - ADD A,#30 - PUSH AF - LD A,C - CALL PRINTX - POP AF - JP PRINTX - -STR2DEC LD HL,0 -STRLOOP LD A,(DE) - INC DE - OR A - RET Z - CP "-" - RET Z - CP ":" - RET Z - LD B,H - LD C,L - ADD HL,HL - ADD HL,HL - ADD HL,BC - ADD HL,HL - CALL ATODEC - RET C - ADD A,L - LD L,A - JR NC,STRLOOP - INC H - JR STRLOOP - -ATODEC CP "0" - RET C - CP ":" - CCF - RET C - SUB "0" - RET - -PDIGIT LD DE,10000 - LD A,#C8 - LD (RET_Z),A - CALL DIG - LD DE,1000 - CALL DIG - LD DE,100 - CALL DIG - LD DE,10 - CALL DIG - LD A,L - ADD A,#30 - LD (IX+0),A - INC IX - LD (IX+0),0 - RET - -DIG XOR A -DIG1 INC A - SBC HL,DE - JR NC,DIG1 - ADD HL,DE - DEC A -RET_Z RET Z - ADD A,#30 - LD (IX+0),A - INC IX - LD A,0 - LD (RET_Z),A - RET - -PRNSIZE LD A,(IX+32) - LD HL,DIRIDD - AND #10 - JP NZ,PRZ - LD L,(IX+28) - LD H,(IX+29) - EXX - LD L,(IX+30) - LD H,(IX+31) - EXX - PUSH IX - CALL MAKE_LN - LD HL,L32BIT_+9 - LD A,(HL) - CP #20 - JR NZ,ALR - LD A,#30 - LD (HL),A -ALR LD DE,SIZEBFF - LD HL,L32BIT_;; +1 - LDI - LD A," " - LD (DE),A - INC DE - LDI - LDI - LDI - LD (DE),A - INC DE - LDI - LDI - LDI - LD (DE),A - INC DE - LDI - LDI - LDI - LD HL,SIZEBFF - POP IX -PRZ LD DE,PRM3 - JP PUTPRM - -PRNDATE LD B,(IX+25) - LD C,(IX+24) - LD HL,SIZEBFF - CALL DATE - LD (HL),0 - LD HL,SIZEBFF - LD DE,PRM4 - LD A,(HL) - CP "0" - JP NZ,PUTPRM - LD (HL),#20 - JP PUTPRM - -PRNTIME LD B,(IX+22) - LD C,(IX+23) - LD HL,SIZEBFF - CALL TIME - LD (HL),0 - LD HL,SIZEBFF - LD DE,PRM5 - LD A,(HL) - CP "0" - JP NZ,PUTPRM - LD (HL),#20 - JP PUTPRM - -TIME - SRL C - RR B - SRL C - RR B - SRL C - RR B - SRL B - SRL B - LD A,C - CALL NUMB - LD (HL),":" - INC HL - LD A,B - JP NUMB - -DATE - LD A,C - AND #1F - PUSH BC - CALL NUMB - LD (HL),"." - INC HL - POP BC - LD A,C - SRL B - RLA - RLA - RLA - RLA - AND #0F - CALL NUMB - LD (HL),"." - INC HL - LD A,B - ADD A,#50 - CP 100 - JP C,NUMB -SUB100 SUB 100 - CP 100 - JP C,NUMB - JR SUB100 - -NUMB LD C,#2F -NUMB1 INC C - SUB 10 - JP NC,NUMB1 - ADD A,10 - ADD A,#30 - LD (HL),C - INC HL - LD (HL),A - INC HL - RET - -MAKE_LN LD IX,L32BIT_ - EXX - LD DE,#3B9A ; 1000000000 - EXX - LD DE,#CA00 - CALL GET_DIG - EXX - LD DE,#05F5 ; 100000000 - EXX - LD DE,#E100 - CALL GET_DIG - EXX - LD DE,#0098 ; 10000000 - EXX - LD DE,#9680 - CALL GET_DIG - EXX - LD DE,#000F ; 1000000 - EXX - LD DE,#4240 - CALL GET_DIG - EXX - LD DE,#0001 ; 100000 - EXX - LD DE,#86A0 - CALL GET_DIG - EXX - LD DE,#0000 ; 10000 - EXX - LD DE,#2710 - CALL GET_DIG - EXX - LD DE,#0000 ; 1000 - EXX - LD DE,#03E8 - CALL GET_DIG - EXX - LD DE,#0000 ; 100 - EXX - LD DE,#0064 - CALL GET_DIG - EXX - LD DE,#0000 ; 10 - EXX - LD DE,#000A - CALL GET_DIG - LD A,L ; 1 - ADD A,#30 - LD (IX+0),A - INC IX - LD HL,L32BIT_ - LD DE,#2030 -KILLZ LD A,(HL) - CP E - JR NZ,KILLZ2 - LD (HL),D - INC HL - JP KILLZ -KILLZ2 LD HL,L32BIT_+9 - LD A,(HL) - CP D - RET NZ - LD (HL),E - RET - -; HL:HL - DE:DE - -GET_DIG XOR A -INC_DG INC A - SBC HL,DE - EXX - SBC HL,DE - EXX - JP NC,INC_DG - ADD HL,DE - EXX - ADC HL,DE - EXX - DEC A - ADD A,#30 - LD (IX+0),A - INC IX - RET - -L32BIT_ DB "0000000000" - -DIRIDD DB " ",0 - -SIZEBFF DB "0 000 000 000",0,0 - -;------------------- - -VERS LD C,VERSION - RST #10 - LD A,D - LD HL,PRM1 - CALL GETDC - LD A,"." - LD (HL),A - INC HL - LD A,E - CALL GETDD - XOR A - LD (HL),A - LD DE,VERSMSG - JP MESSAGE - -GETDC LD B,#2F -GETDA INC B - SUB 10 - JR NC,GETDA - ADD A,10+"0" - LD C,A - LD A,"0" - CP B - LD A,C - JR Z,MDEC - LD (HL),B - INC HL -MDEC LD (HL),A - INC HL - RET - -GETDD LD B,#2F -GETDB INC B - SUB 10 - JR NC,GETDB - ADD A,10 - LD (HL),B - INC HL - RET Z - ADD A,"0" - LD (HL),A - INC HL - RET - -HELP LD DE,HELPMSG - CALL MESSAGE - RET - -CEXIT LD A,(TASKX) - DEC A - DEC A - RET Z - POP HL -QUIT LD B,0 - LD C,EXIT - RST #10 - RET - -ERR_MSG INC DE - LD HL,ERR0 - LD BC,ERR1-ERR0 - CALL LCPIR - CALL PRINTZ - CALL CRLF - JP CRLF - -MESSAGE CALL FMESAGE - CALL PRINTZ - CALL GETXY - RET - -FMESAGE INC DE - LD HL,MSG0 - LD BC,MSG1-MSG0 -LCPIR XOR A - CPIR - RET PO - RET NZ - DEC DE - LD A,D - OR E - JP NZ,LCPIR - RET - -PUTPRM LD BC,15 -PUTPRMA LD A,(HL) - LDI - RET PO - OR A - JR NZ,PUTPRMA - RET - -PRINTZ LD A,(HL) - INC HL - OR A - RET Z - CP "%" - JR NZ,PRINTZ2 - LD A,(HL) - INC HL - SUB "1" - PUSH HL - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,PRM1 - ADD HL,BC - LD C,PCHARS - RST #10 - POP HL - JR PRINTZ -PRINTZ2 LD C,PUTCHAR - RST #10 - JP PRINTZ - -ROOT DB "C:",#5C,0 - -ALLFS DB "*.*",0 - -SER_NUM DB "C37F-73AB",0 - -EXTBF DS 4 - -BATBF DB "BAT" - -ECHOON DB "ON",0 -ECHOOFF DB "OFF",0 - - -DIR1MSG EQU 0 -VERSMSG EQU 1 -DATEMSG EQU 2 -TIMEMSG EQU 3 -PAUSMSG EQU 4 -ILLGMSG EQU 5 -ECHOMSG EQU 6 -ON__MSG EQU 7 -OFF_MSG EQU 8 -DIR2MSG EQU 9 -DIR3MSG EQU 10 -HELPMSG EQU 11 - -MSG0 DB 0 - DB "Volume in drive %1 has no label",CR,LF - DB "Volume Serial number is %2",CR,LF - DB "Directory of %3",CR,LF,CR,LF,0 - DB "Estex DSS: Version %1",CR,LF,0 ;R02 - DB "Current date: %1",CR,LF,0 - DB "Current time: %1",CR,LF,0 - DB "Press any key to continue . . .",CR,LF,0 - DB "Invalid parametr",CR,LF,0 - DB "Echo is %1",CR,LF,0 - DB "on",0 - DB "off",0 - DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 -; FILENAME EXT SIZE DATE TIME - DB "%1 %2 %3 %4 %5",CR,LF,0 - DB "COMMANDS:",CR,LF,CR,LF - DB "CD DEL HELP REN TIME " - DB " ",CR,LF - DB "CHDIR DIR MD RENAME VER " - DB " ",CR,LF - DB "CLS ERASE MKDIR RMDIR VERSION " - DB " ",CR,LF - DB "DATE EXIT RD SET " - DB " ",CR,LF - DB 0 -MSG1 - -ERR0 DB #00 - DB "Bad command or file name",0 - DB "Invalid function",0 - DB "Invalid drive number",0 - DB "File not found",0 - DB "Path not found",0 - DB "Invalid handle",0 - DB "Extended error 6",0 - DB "File exist",0 - DB "File read only",0 - DB "Root overflow",0 - DB "No free space",0 - DB "Directory not empty",0 - DB "Can't delete current directory",0 - DB "Invalid media",0 - DB "Unknown operation",0 ;R02 - DB "Directory exist",0 - DB "Invalid filename",0 - DB "Invalid EXE-file",0 - DB "Not supported EXE-file",0 - DB "Access denied",0 - DB "Not ready",0 - DB "Seek error",0 - DB "Sector not found",0 - DB "CRC error",0 - DB "Write protect",0 - DB "Read error",0 - DB "Write error",0 - DB "Drive failure",0 - DB "Extended error 28",0 - DB "Extended error 29",0 - DB "No free memory",0 - DB "Invalid memory block",0 - DB "Extended error 32",0 - DB "Extended error 33",0 - DB "Extended error 34",0 - DB "35",0 - DB "36",0 - DB "37",0 - DB "38",0 - DB "39",0 - DB "40",0 - DB "41",0 - DB "42",0 - DB "43",0 - DB "44",0 - DB "45",0 - DB "46",0 - DB "47",0 - DB "48",0 - DB "49",0 - DB "50" - DB 0 -ERR1 - -PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -DTA ;DEFS 256,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -PATHF ;DEFS 256,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -BAT_FM DB 0 -BAT_LEN DB 0 - -ECHOFLG DB 0 - -PATHLEN DB 0 -PATH ;DEFS 40,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0 - -GETPATH LD C,2 - RST #10 - LD HL,PATHF - ADD A,"A" - LD (HL),A - INC HL - LD (HL),":" - INC HL - LD C,30 - RST #10 - LD HL,PATHF - LD DE,PATH - LDI - LDI - LDI - PUSH HL - XOR A - LD BC,34 - CPIR - JP NZ,LONGP - LD A,34 - SUB C - LD C,A - POP HL - LDIR - JR PHLEN - -LONGP CPIR - LD A,"." - LD (DE),A - INC DE - LD (DE),A - INC DE - LD (DE),A - INC DE - LD BC,31 - AND A - SBC HL,BC - LDIR - POP HL -PHLEN LD HL,PATH - LD BC,40 - XOR A - CPIR - LD A,39 - SUB C - LD (PATHLEN),A - LD C,A - INC C - INC C - LD A,80 - SUB C - LD (WINDOW),A - RET -PRINT_B LD C,A -PRINTBB PUSH BC - CALL PRINTX - POP BC - LD A,C - DJNZ PRINTBB - RET - -TEMPXY DW 0 - -CR_ LD C,CURSOR - RST #10 - LD E,0 - JP LOCAT - -LF_ LD C,CURSOR - RST #10 - LD A,D - CP #1F - JP Z,LFF - INC D - JP LOCAT - -LFF PUSH HL - PUSH DE - LD BC,#018A - LD DE,#0020 - EI - HALT - DI - RST ToBIOS - LD DE,#1F00 - CALL LOCAT - LD A,#20 - LD BC,#5082 - RST ToBIOS - EI - POP DE - CALL LOCAT - POP HL - RET - -PRINTX CP #20 - JP NC,CHAR - CP #0D - JP Z,CR_ - CP #0A - JP Z,LF_ -CHAR PUSH BC - LD BC,#0182 - RST ToBIOS - POP BC - RET - -LOCAT LD (TEMPXY),DE - LD C,LOCATE - RST #10 - RET - -;PRINTX LD C,PUTCHAR -; RST #10 -; RET - -CEDIT PUSH IX - POP HL - INC HL - INC HL - LD (ETXS),HL - XOR A - LD (POSIT),A - LD (SHIFT),A -EDIT1 LD DE,(ETXS) - CALL PRINT_S - CALL KEY - CP 13 - RET Z - LD HL,EDIT1 - PUSH HL - AND A - LD HL,#5400 - SBC HL,DE - JP Z,BACK - AND A - LD HL,#5600 - SBC HL,DE - JP Z,FORW - CP #08 - JP Z,DELET - CP #20 - RET C - EX AF,AF' - LD A,(IX+1) - CP (IX+0) - CCF - RET C - LD A,(IX+1) - LD E,A - LD D,0 - LD HL,(ETXS) - ADD HL,DE - LD A,(POSIT) - LD E,A - LD A,(IX+1) - SUB E - JR Z,ADD_SM - LD B,D - LD C,A - LD D,H - LD E,L - DEC HL - LDDR - EX DE,HL -ADD_SM EX AF,AF' - LD (HL),A - LD A,(POSIT) - INC A - LD (POSIT),A - LD (MAIN_X),A - INC (IX+1) - LD HL,(ETXE) - INC HL - LD (ETXE),HL - LD HL,SHIFT - SUB (HL) - CP (IX-1) - RET C - LD A,(STEP) - ADD A,(HL) - LD (HL),A -; CALL PAGE - RET - -BACK LD A,(POSIT) - OR A - RET Z ;JP Z,BCK - DEC A - LD (POSIT),A - LD (MAIN_X),A - INC A - LD HL,SHIFT - SUB (HL) - RET NZ - LD A,(STEP) - LD E,A - LD A,(HL) - SUB E - LD (HL),A -; CALL PAGE - RET - -FORW LD A,(POSIT) - CP (IX+1) - RET Z ; JP Z,FRD - INC A - LD (POSIT),A - LD (MAIN_X),A - LD HL,SHIFT - SUB (HL) - CP (IX-1) - RET C - LD A,(STEP) - ADD A,(HL) - LD (HL),A -; CALL PAGE - RET - -DELET LD A,(POSIT) - OR A - RET Z ; JP Z,LINKSTR - LD HL,(ETXS) - LD E,A - LD D,0 - ADD HL,DE - LD A,(IX+1) - SUB E - JR Z,SUB_SM - LD B,D - LD C,A - LD D,H - LD E,L - DEC DE - LDIR -SUB_SM XOR A - DEC HL - LD (HL),A - LD A,(POSIT) - DEC A - LD (POSIT),A - LD (MAIN_X),A - DEC (IX+1) - LD HL,(ETXE) - DEC HL - LD (ETXE),HL - LD HL,SHIFT - INC A - SUB (HL) - RET NZ - LD A,(STEP) - LD E,A - LD A,(HL) - SUB E - LD (HL),A -; CALL PAGE - RET - -KEY ;RES 5,(IY+1) - LD A,(SHIFT) - LD E,A - LD A,(POSIT) - SUB E - INC A - LD HL,PATHLEN - ADD A,(HL) - LD (_X+1),A - LD A,(POSIT) - CP (IX+1) - JP C,KEY0 - LD A,#20 - LD (_A+1),A - JP KEY1 -KEY0 LD E,A - LD D,0 - LD HL,(ETXS) - ADD HL,DE - LD A,(HL) - LD (_A+1),A -KEY1 CALL CURSORF - EI - HALT - LD C,SCANKEY - RST #10 - JP Z,KEY1 - RET - -CURSORX DB #00 - -CURSORF LD A,05 - DEC A - LD (CURSORF+1),A - RET NZ - LD A,05 - LD (CURSORF+1),A - LD DE,(TEMPXY) -_X LD E,#00 - CALL LOCAT - LD A,(CURSORX) - XOR #FF - LD (CURSORX),A - LD A,"_" - JR NZ,YEPCUR -_A LD A,#20 -YEPCUR CALL PRINTX - EI - RET - -RES_CUR LD A,(CURSORX) - OR A - RET Z - XOR #FF - LD (CURSORX),A - LD DE,(TEMPXY) - LD A,(_X+1) - LD E,A - CALL LOCAT - LD A,(_A+1) - JP PRINTX - -PRINT_S PUSH DE - CALL GETXY ;;; - LD DE,(TEMPXY) - LD E,0 - CALL LOCAT - LD HL,PATH - CALL PRINTZ - LD A,">" - CALL PRINTX - POP DE - EX DE,HL -SH LD BC,#0000 - ADD HL,BC - LD A,(SHIFT) - LD C,A - LD A,(IX+1) - SUB C - JP Z,EMT_STR - LD B,A - LD A,(IX-1) - SUB B - JR NC,PR_S - LD B,(IX-1) -PR_S PUSH BC - LD C,#86 - RST ToBIOS - POP BC -EMT_STR LD A,(IX-1) - SUB B - EI - RET Z - LD B,A - LD C,#82 - LD A,#20 - RST ToBIOS - EI - RET - -SHIFT EQU SH+1 - -GET_CMD LD D,XH - LD E,XL - EX DE,HL - LD E,(HL) - INC HL - LD D,0 - EX DE,HL - ADD HL,DE - LD (HL),0 -NEXTPRM EX DE,HL -SKIPSP LD A,(HL) - INC HL - CP " " - RET C - JR Z,SKIPSP - DEC HL - CP "/" - JR NZ,PROCESS - LD DE,BUFFER - LD C,GSWITCH - RST #10 - PUSH AF - EX DE,HL ;SAVE HL IN DE - LD HL,BUFFER - INC HL - CALL ISWITCH - POP AF - JP NC,NEXTPRM - XOR A - RET - -PROCESS LD DE,CMDLINE - LD BC,#00FF -NLDI LD A,(HL) - LDI - INC B - CP " " - JR NC,NLDI - DEC B - LD A,B - LD (CMDLINE-1),A - LD A,(RUNMODE) - OR #40 ;PROCESS - LD (RUNMODE),A - XOR A - RET - -ISWITCH LD A,(HL) - CP "a" - JR C,NUP - CP "{" - JR NC,NUP - SUB #20 -NUP -PR000 CP "P" - JR NZ,PR001 - LD A,(RUNMODE) - OR #80 ;PRIMARY CONSOLE - LD (RUNMODE),A - RET -PR001 CP "S" - JR NZ,PR002 - LD A,(RUNMODE) - OR #20 ;SECONDARY CONSOLE - LD (RUNMODE),A -PR002 CP "C" - JR NZ,PR003 - LD A,(RUNMODE) - OR #10 ;RUN BATCH FILE - LD (RUNMODE),A -PR003 RET - -TASKX DB 0 -RUNMODE DB 0 -STEP DB 8 -MAIN_X DB 0 - -LEN_OLD DB #00 -POSIT DB #00 -ETXS DW 0 -ETXE DW 0 -; +0 - Size buffer -; +1 - Amount simbols -; -1 - Scroll Window -WINDOW DB #50 -BUFFERC DB #FF -LEN_NEW DB #00 -CMDLINE ;DEFS #100,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -TMPLINE DS 256 - -BATNAME DB "system.bat",0 - -BUFFER -BATBUFF ;DEFS 129,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0 From 33f7fbc6b090a10c673b79d339d44c65bdc5f3a5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 15 Jul 2023 05:04:58 +1000 Subject: [PATCH 015/219] ... --- BOOT/BOOT.ASM | 5 +- Console/CONSOLE.ASM | 768 +++++++++++++++++++++++++++++--------------- DSS/CHANGES.LOG | 2 + DSS/DOS5.ASM | 5 +- DSS/DOS_FM.ASM | 106 +++++- DSS/VERSION.INC | 39 ++- DSS/build.txt | 1 + Shared_Includes | 2 +- 8 files changed, 643 insertions(+), 285 deletions(-) create mode 100644 DSS/build.txt diff --git a/BOOT/BOOT.ASM b/BOOT/BOOT.ASM index 3fe8460..1649222 100644 --- a/BOOT/BOOT.ASM +++ b/BOOT/BOOT.ASM @@ -1,11 +1,10 @@ -; Последняя редакция: 25.04.2006 +;!TODO определение попытки сделать загрузочным не первый раздел +; Последняя редакция: 25.04.2006 ; Программа записи на FDD/HDD boot-загрузчика и файлов системы. ; ; Загружает сист. файлы из корня диска, с которого была ; загружена система. -; - ; Фитчи программы: ; В отличие от оригинального boot-инсталлятора, эта может diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index d27dbdb..0f4cab8 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -7,9 +7,9 @@ ; /S Secondary command processor ; /C Execute batch file -;-------------------------------------------------------------- +;=====================================================================[] ;Rev. Date Name Description -;-------------------------------------------------------------- +;---------------------------------------------------------------------[] ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R09 ??-??-???? DNS ;????? ???? ;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS @@ -21,48 +21,50 @@ ;R03 11-12-2002 DNS NEW VERSION ;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES ;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO -; - OUTPUT './Build/system.exe' +;=====================================================================[] - ORG #8100-512 include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' +; +; Standart EQU section +;---------------------------------------------------------------------[] +org_addr EQU #8000 + CLP_Buffer +code_addr EQU START +stack_point EQU #BFFF +stack_buffer EQU 64 +program_start EQU START +Loader_length EQU 0 +;---------------------------------------------------------------------[] +; + +; +; Program EQU section +;---------------------------------------------------------------------[] CR EQU 13 LF EQU 10 - DB "EXE" ;EXE ID - DB #00 ;EXE VERSION - DW #0200 ;CODE OFFSET LOW - DW #0000 ;CODE OFFSET HIGH - DW #0000 ;END-BEG ;PRIMARY LOADER - DW #0000 ; - DW #0000 ;RESERVED - DW #0000 ; - DW #8100 ;LOAD ADDRESS - DW #8100 ;START ADDRESS - DW #BFFF ;STACK ADDRESS - - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0 +;---------------------------------------------------------------------[] +; + OUTPUT './Build/system.exe' + include 'Shared_includes/constants/EXE_Header.z80' + ORG org_addr -; DEFS 490,0 +START: + ;INIT + LD A,(IX-1) + LD (TASKX),A + PUSH IX + CALL CRLF + CALL GETPATH + POP IX + + LD HL,WORK_BUFFERS + LD DE,WORK_BUFFERS+1 + LD BC,BUFFERS_STRUCT-1 + LD (HL),0 + LDIR + ; -; LD SP,#BFFF -START CALL INIT CALL GET_CMD EI LD A,(RUNMODE) @@ -92,7 +94,7 @@ FBATCH JP QUIT FPRIMAR LD C,Dss.CTRLKey - RST #10 + RST ToDSS LD A,B AND #C0 JP NZ,CONSOLE @@ -153,7 +155,7 @@ B_ALL_P POP HL ;R07 XOR A LD C,Dss.Open - RST #10 + RST ToDSS ;R10 CALL Restore_Screen ;R10 @@ -191,7 +193,7 @@ ADDBAT PUSH DE CALL CMDMODE LD C,Dss.Close LD A,(BAT_FM) - RST #10 + RST ToDSS RET BATLINE LD HL,BATBUFF @@ -245,7 +247,7 @@ READBAT LD HL,BATBUFF LD DE,128 LD C,Dss.Read LD A,(BAT_FM) - RST #10 + RST ToDSS LD A,E LD (BAT_LEN),A RET @@ -317,14 +319,6 @@ COMPB05 EX AF,AF' LD HL,BATLIST JP COMP004 -INIT LD A,(IX-1) - LD (TASKX),A - PUSH IX - CALL CRLF - CALL GETPATH - POP IX - RET - CONSOLE: CALL CRLF RE_: CALL GETXY @@ -345,7 +339,7 @@ RE_: CALL GETXY JP RE_ GETXY LD C,Dss.Cursor - RST #10 + RST ToDSS JP LOCAT INPUT XOR A @@ -451,7 +445,7 @@ COMP002 XOR A AND #5F NOUP SUB "A" LD C,Dss.ChDisk - RST #10 + RST ToDSS JP C,ERROR JP GETPATH @@ -461,7 +455,7 @@ RUN_EXT EX DE,HL LD (SAVEHL),HL LD BC,Dss.EX_Path.GET_TYPE*256 + Dss.EX_Path LD DE,EXTBF - RST #10 + RST ToDSS LD HL,(SAVEHL) JR C,RUN_EXE BIT 1,A @@ -475,7 +469,7 @@ RUN_EXT EX DE,HL JP RUN_EXE NON_EXT LD BC,0*256+Dss.Exec - RST #10 + RST ToDSS ;R10 CALL Restore_Screen ;R10 @@ -563,7 +557,7 @@ CLS LD DE,#0000 LD HL,#2050 LD BC,7*256+Dss.Clear LD A," " - RST #10 + RST ToDSS LD DE,#0000 JP LOCAT @@ -575,7 +569,7 @@ CRLF LD A,#0D CDATE EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD DE,DTA LD A,(DE) OR A @@ -604,13 +598,13 @@ CDATE EX DE,HL CALL STR2DEC PUSH HL LD C,Dss.SysTime - RST #10 + RST ToDSS POP IX POP DE LD C,Dss.SetTime - RST #10 + RST ToDSS NOSETD LD C,Dss.SysTime - RST #10 + RST ToDSS PUSH IX PUSH DE LD A,D @@ -639,7 +633,7 @@ ILLEG LD DE,ILLGMSG CTIME EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD DE,DTA LD A,(DE) OR A @@ -678,13 +672,13 @@ CTIME EX DE,HL LD A,L PUSH AF LD C,Dss.SysTime - RST #10 + RST ToDSS POP BC POP HL LD C,Dss.SetTime - RST #10 + RST ToDSS NOSETT LD C,Dss.SysTime - RST #10 + RST ToDSS PUSH BC PUSH HL LD A,H @@ -709,7 +703,7 @@ NOSETT LD C,Dss.SysTime CPAUSE LD DE,PAUSMSG CALL MESSAGE LD C,Dss.WaitKey - RST #10 + RST ToDSS RET @@ -737,21 +731,21 @@ CPATH LD A,(DE) DEC HL LD (HL),"P" LD BC,2*256+Dss.Environ - RST #10 + RST ToDSS CALL C,ERROR RET PRNEPATH LD DE,DTA LD HL,PATHSTR LD BC,1*256+Dss.Environ - RST #10 + RST ToDSS JP C,ERROR LD HL,PATHSTR LD C,Dss.PChars - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.PChars - RST #10 + RST ToDSS CALL CRLF RET ;R09 @@ -768,23 +762,23 @@ CSET LD A,(DE) DEC DE ;R08 EX DE,HL LD BC,2*256+Dss.Environ - RST #10 + RST ToDSS CALL C,ERROR RET PRNENVIR LD HL,DTA LD BC,0*256+Dss.Environ - RST #10 + RST ToDSS LD HL,DTA PRNENVX LD C,Dss.PChars - RST #10 + RST ToDSS LD A,CR LD C,Dss.PutChar - RST #10 + RST ToDSS LD A,LF LD C,Dss.PutChar - RST #10 + RST ToDSS LD A,(HL) OR A JR NZ,PRNENVX @@ -812,7 +806,7 @@ CECHO EX DE,HL ;R03 REMOVE R01 LD C,Dss.PChars - RST #10 + RST ToDSS JP CRLF ECHO_F LD A,(ECHOFLG) @@ -891,8 +885,8 @@ ININE DB "NINE",0 ;R06 BAT_PRM_ARRAY - DW IZERO,IONE,ITWO,ITHREE,IFOUR,IFIVE,ISIX,ISEVEN,IEIGHT,ININE - DW 0,0,0,0,0,0,0,0,0,0 + DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE + DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;R06 NULL DB 0 ;R07 @@ -958,7 +952,7 @@ TVAR1 PUSH HL LD L,C INC HL LD BC,1*256+Dss.Environ - RST #10 + RST ToDSS TNOVAR POP HL INC HL LD BC,0 @@ -981,10 +975,10 @@ COM001 CP (HL) CREM RET -CCHDIR EX DE,HL +CCHDIR: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS XOR A LD HL,DTA CP (HL) @@ -996,8 +990,8 @@ CCHDIR EX DE,HL LD (HL),0 DEC HL DEC HL -YP LD C,Dss.ChDir - RST #10 +YP: LD C,Dss.ChDir + RST ToDSS CALL C,ERROR CALL GETPATH RET @@ -1005,53 +999,55 @@ YP LD C,Dss.ChDir CMKDIR EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.MkDir - RST #10 + RST ToDSS CALL C,ERROR RET -CRMDIR EX DE,HL +CRMDIR: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.RmDir - RST #10 + RST ToDSS CALL C,ERROR RET -CDELET EX DE,HL +CDELET: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.Delete - RST #10 + RST ToDSS CALL C,ERROR RET -CRENAM EX DE,HL +CRENAM: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 - LD DE,DTA+128 + RST ToDSS + ;LD DE,DTA+128 + LD DE,DTA_2 LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA - LD DE,DTA+128 + ;LD DE,DTA+128 + LD DE,DTA_2 LD C,Dss.Rename - RST #10 + RST ToDSS CALL C,ERROR RET -ERROR LD E,A +ERROR: LD E,A LD D,0 JP ERR_MSG -DIR LD HL,0 - LD (FILES),HL +DIR: LD HL,0 + LD (DIRNEX.files),HL LD (S_LOW),HL LD (S_HIGH),HL EX DE,HL @@ -1059,33 +1055,39 @@ DIR LD HL,0 OR A JR NZ,YPS LD HL,ALLFS -YPS LD DE,DTA +YPS: LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS + LD HL,DTA LD DE,DTA LD A,#37 LD BC,0*256+Dss.F_First - RST #10 + RST ToDSS JP C,ERROR + LD A,(PATHF) - LD (PRM1+0),A - LD A,":" - LD (PRM1+1),A - LD A,0 - LD (PRM1+2),A + LD HL,PRM1 + LD (HL),A + INC HL + LD (HL),":" + INC HL + LD (HL),0 + LD HL,SER_NUM LD DE,PRM2 CALL PUTPRM - CALL GETPATH + ;CALL GETPATH LD HL,PATHF LD DE,PRM3 - CALL PUTPRM + ;CALL PUTPRM + call copy_string ; скопир. строку (с нулем) + LD DE,DIR1MSG CALL MESSAGE ; CALL CRLF ; CALL CRLF -DIRNEX LD HL,DTA +DIRNEX: LD HL,DTA LD DE,33 ADD HL,DE CALL PNAME @@ -1093,9 +1095,10 @@ DIRNEX LD HL,DTA LD A,(IX+32) AND #10 JP NZ,NODADD - LD HL,(FILES) + ;LD HL,(FILES) +.files+1: LD HL,0 ;!TODO протестить какая процедура использующая эту переменную чаще вызывается и воткнуть переменную туда INC HL - LD (FILES),HL + LD (DIRNEX.files),HL LD E,(IX+30) LD D,(IX+31) LD HL,(S_HIGH) @@ -1103,18 +1106,19 @@ DIRNEX LD HL,DTA LD E,(IX+28) LD D,(IX+29) LD HL,(S_LOW) + + CALL ADDXXX LD (S_LOW),HL EXX LD (S_HIGH),HL -NODADD LD DE,DTA +NODADD: LD DE,DTA LD C,Dss.F_Next - RST #10 + RST ToDSS JR NC,DIRNEX - CALL ORDERS - RET - -ORDERS LD HL,(FILES) + ;CALL ORDERS + ;RET +ORDERS: LD HL,(DIRNEX.files) LD IX,PRM1 CALL PDIGIT LD HL,(S_LOW) @@ -1128,14 +1132,14 @@ ORDERS LD HL,(FILES) JR NZ,ALR2 LD A,#30 LD (HL),A -ALR2 LD DE,SIZEBFF +ALR2: LD DE,SIZEBFF LD HL,L32BIT_;; +1 LD A,(HL) LDI CP " " JR Z,NOPO1 LD A,"." -NOPO1 LD (DE),A +NOPO1: LD (DE),A INC DE LDI LDI @@ -1144,7 +1148,7 @@ NOPO1 LD (DE),A CP " " JR Z,NOPO2 LD A,"." -NOPO2 LD (DE),A +NOPO2: LD (DE),A INC DE LDI LDI @@ -1153,7 +1157,7 @@ NOPO2 LD (DE),A CP " " JR Z,NOPO3 LD A,"." -NOPO3 LD (DE),A +NOPO3: LD (DE),A INC DE LDI LDI @@ -1165,22 +1169,22 @@ NOPO3 LD (DE),A JP MESSAGE ;HL':HL + DE':DE - -ADDXXX ADD HL,DE +ADDXXX: ADD HL,DE EXX ADC HL,DE EXX RET -FILES DW 0 +;FILES: DW 0 + +S_LOW: DW 0 ;!FIXIT в команду +S_HIGH: DW 0 ;!FIXIT в команду -S_LOW DW 0 -S_HIGH DW 0 ;12345678 123 1 234 567 890 " ; SIZE -PNAME LD BC,8 +PNAME: LD BC,8 LD DE,PRM1 LDIR XOR A @@ -1197,19 +1201,21 @@ PNAME LD BC,8 LD DE,DIR3MSG JP MESSAGE -PRINTB LD A,(HL) - PUSH BC - CALL PRINTX - POP BC - INC HL - DJNZ PRINTB - RET +;!TODO +PRINTB: + ; LD A,(HL) + ; PUSH BC + ; CALL PRINTX + ; POP BC + ; INC HL + ; DJNZ PRINTB + ; RET ;------------------ PUTB LD C,#2F -PUTB1 INC C +.PUTB1 INC C SUB 10 - JP NC,PUTB1 + JP NC,.PUTB1 ADD A,10 ADD A,#30 PUSH AF @@ -1221,21 +1227,22 @@ PUTB1 INC C INC HL RET +;!TODO +PRNB: +; LD C,#2F +; .PRNB1 INC C +; SUB 10 +; JP NC,.PRNB1 +; ADD A,10 +; ADD A,#30 +; PUSH AF +; LD A,C +; CALL PRINTX +; POP AF +; JP PRINTX -PRNB LD C,#2F -PRNB1 INC C - SUB 10 - JP NC,PRNB1 - ADD A,10 - ADD A,#30 - PUSH AF - LD A,C - CALL PRINTX - POP AF - JP PRINTX - -STR2DEC LD HL,0 -STRLOOP LD A,(DE) +STR2DEC: LD HL,0 +.LOOP: LD A,(DE) INC DE OR A RET Z @@ -1253,9 +1260,9 @@ STRLOOP LD A,(DE) RET C ADD A,L LD L,A - JR NC,STRLOOP + JR NC,.LOOP INC H - JR STRLOOP + JR .LOOP ATODEC CP "0" RET C @@ -1284,27 +1291,27 @@ PDIGIT LD DE,10000 ;LD (IX+0),0 LD (IX+0),A LD (IX+1),0 + ; RET -DIG XOR A -DIG1 INC A +DIG: XOR A +.DIG1: INC A SBC HL,DE - JR NC,DIG1 + JR NC,.DIG1 ADD HL,DE DEC A -RET_Z RET Z +RET_Z: RET Z ADD A,#30 LD (IX+0),A INC IX -; LD A,0 XOR A LD (RET_Z),A RET -PRNSIZE LD A,(IX+32) +PRNSIZE: LD A,(IX+32) LD HL,DIRIDD AND #10 - JP NZ,PRZ + JP NZ,.PRZ LD L,(IX+28) LD H,(IX+29) EXX @@ -1315,11 +1322,11 @@ PRNSIZE LD A,(IX+32) CALL MAKE_LN LD HL,L32BIT_+9 LD A,(HL) - CP #20 - JR NZ,ALR - LD A,#30 + CP ' ' + JR NZ,.ALR + LD A,'0' LD (HL),A -ALR LD DE,SIZEBFF +.ALR: LD DE,SIZEBFF LD HL,L32BIT_;; +1 LDI LD A," " @@ -1340,10 +1347,11 @@ ALR LD DE,SIZEBFF LDI LD HL,SIZEBFF POP IX -PRZ LD DE,PRM3 +.PRZ: LD DE,PRM3 JP PUTPRM -PRNDATE LD B,(IX+25) +; Скопировать в буфер дату файла/папки +PRNDATE: LD B,(IX+25) LD C,(IX+24) LD HL,SIZEBFF CALL DATE @@ -1355,8 +1363,8 @@ PRNDATE LD B,(IX+25) JP NZ,PUTPRM LD (HL),#20 JP PUTPRM - -PRNTIME LD B,(IX+22) +; Скопировать в буфер время файла/папки +PRNTIME: LD B,(IX+22) LD C,(IX+23) LD HL,SIZEBFF CALL TIME @@ -1366,11 +1374,10 @@ PRNTIME LD B,(IX+22) LD A,(HL) CP "0" JP NZ,PUTPRM - LD (HL),#20 + LD (HL),' ' JP PUTPRM - -TIME - SRL C +; в буфер время файла/папки +TIME: SRL C RR B SRL C RR B @@ -1384,9 +1391,8 @@ TIME INC HL LD A,B JP NUMB - -DATE - LD A,C +; в буфер дату файла/папки +DATE: LD A,C AND #1F PUSH BC CALL NUMB @@ -1417,13 +1423,13 @@ NUMB1 INC C SUB 10 JP NC,NUMB1 ADD A,10 - ADD A,#30 + ADD A,'0' LD (HL),C INC HL LD (HL),A INC HL RET - +; Десятичный 32-х разрядный вывод MAKE_LN LD IX,L32BIT_ EXX LD DE,#3B9A ; 1000000000 @@ -1490,7 +1496,6 @@ KILLZ2 LD HL,L32BIT_+9 RET ; HL:HL - DE:DE - GET_DIG XOR A INC_DG INC A SBC HL,DE @@ -1516,8 +1521,192 @@ SIZEBFF DB "0 000 000 000",0,0 ;------------------- -VERS LD C,Dss.Version - RST #10 +;!FIXIT лучше такую функцию в DSS пихнуть +; прочитать BPB диска +read_disk_info: +.disk+1: ld a,0 ; сохр. номер диска + ld c,Dss.DRV.Open ; open device + rst ToDSS.DRV + jr c,get_inf_data_err + ld a,(read_disk_info.disk) + ld de,BPB ; буфер + ld c,Dss.DRV.GetBPB ; get BPB + rst ToDSS.DRV + ;push af + ld a,(read_disk_info.disk) ; номер диска + ld c,Dss.DRV.Close ; close device + rst ToDSS.DRV + ;pop af + ;jr c,get_inf_data_err +get_inf_data_err: + ; Серийный номер лог. диска + ld hl,(BPB+41) ; ст.часть + ld de,SER_NUM ; xxxx-xxxx + call hex16 + ld a,"-" + ld (de),a + inc de + ld hl,(BPB+39) ; мл.часть + call hex16 + ; + ; Метка диска + ld a,(read_disk_info.disk) ; номер диска + cp 2 ; меньше "C:" ? + jr nc,get_inf_data1 ; метка в BPB + ; floppy, метка - как запись файла + ld c,Dss.ChDisk ; уст. диск + rst ToDSS + ; уст. корень диска + ld hl,ROOT ; "\",0 + ld c,Dss.ChDir + rst ToDSS + ; поиск метки + ld hl,ALLFS ; "*.*" имя метки + ld de,DTA ; куда + ld a,8 ; атрибут метки тома + ld bc,0*256 + Dss.F_First ; f_first, формат 11 + rst ToDSS + push af + call restore_path ; восст. тек. путь + pop af + jr c,no_volume_label ; метки нет + ld hl,DTA+33 ; начало метки в буфере f_first + jr volume_label + ; +get_inf_data1: + ld hl,BPB+53 ; конец метки в BPB + ld a,(hl) + cp " " ; есть метка ? + ld hl,BPB+43 ; начало метки в BPB + jr nz,volume_label ; да +; нет метки +no_volume_label: + ld hl,volume_string1 ; "has no label " + ld de,volume_string ; куда + ld bc,14 + ldir + ret +; есть метка +volume_label: + ex de,hl + ld hl,volume_string ; куда + ld (hl),"i" + inc hl + ld (hl),"s" + inc hl + ld (hl)," " + inc hl + ex de,hl + ; скопир. имя метки + ld bc,11 ; макс. длина метки + ld a,(hl) + cp " "+1 + jr nc,$+6 + inc hl + dec c + jr $-7 + ld a,11 + sub c + ldir + ld b,a + or a ; длина метки 11 симв. ? + ret z ; да + ; дополнить хвост. пробелами + ld (de),a + inc de + djnz $-2 + ret + +; Вывод HL в hex-формате +; de=буфер +; hl=число +hex16: ld a,h + call hex8 + ld a,l +; вывод "a" +hex8: push af + rrca + rrca + rrca + rrca + call $+4 + pop af + and 0Fh + add a,90h + daa + adc a,40h + daa + ld (de),a + inc de + ret +;------------------- + +VERS: LD C,Dss.Version + RST ToDSS + PUSH BC + PUSH DE + + LD L,D + LD H,0 + LD DE,PRM1 + CALL .num_ver ;decim2 номер версии (0..9) + LD A,'.' + LD (DE),A + + INC DE + POP HL + LD H,0 + CALL .num_mod ;decim2 номер модификации (0..99) + POP HL + LD A,'.' + LD (DE),A + INC DE + CALL .num_build ;decim3 номер билда (0..999) + XOR A + LD (DE),A + + LD DE,VERSMSG + JP MESSAGE + + ; вход: hl=число, de=буфер +.num_ver: +.num_mod: + ld ix,.tmp1__ + res 7,(ix+0) + jr .decim + + ; вход: hl=число, de=буфер +.num_build: + ld ix,.tmp1__ + res 7,(ix+0) + ld bc,100 ; 100 + call .num16 +.decim: ld bc,10 ; 10 + call .num16 + ld a,l + add a,"0" + jr .num16_exit + +.tmp1__: BYTE 0 +.num16: ld a,2Fh + and a + inc a + sbc hl,bc + jr nc,$-3 + add hl,bc + cp "0" + jr z,$+6 + set 7,(ix+0) + bit 7,(ix+0) + ret z +.num16_exit: + ld (de),a ; сохр. в буфере + inc de + ret +/* +VERS: + LD C,Dss.Version + RST ToDSS PUSH BC LD A,D @@ -1573,6 +1762,7 @@ GETyesZERO: LD (HL),A INC HL RET +*/ HELP LD DE,HELPMSG CALL MESSAGE @@ -1585,7 +1775,7 @@ CEXIT LD A,(TASKX) POP HL QUIT LD B,0 LD C,Dss.Exit - RST #10 + RST ToDSS RET ERR_MSG INC DE @@ -1622,6 +1812,17 @@ PUTPRMA LD A,(HL) JR NZ,PUTPRMA RET +;!FIXIT заменить на PUTPRMA с выставлением перед вызовом BC = 255 например +; Скопир. строку (с нулем) +; (hl) -> (de) +copy_string: + ld a,(hl) + ldi + or a + jr nz,copy_string + ret + + PRINTZ LD A,(HL) INC HL OR A @@ -1641,20 +1842,20 @@ PRINTZ LD A,(HL) LD BC,PRM1 ADD HL,BC LD C,Dss.PChars - RST #10 + RST ToDSS POP HL JR PRINTZ PRINTZ2 LD C,Dss.PutChar - RST #10 + RST ToDSS JP PRINTZ -ROOT DB "C:",#5C,0 +ROOT DB '\',0 ALLFS DB "*.*",0 -SER_NUM DB "C37F-73AB",0 +SER_NUM DB "XXXX-XXXX",0 -EXTBF DS 4 +EXTBF BLOCK 4,0 BATBF DB "BAT" @@ -1757,56 +1958,17 @@ ERR0 DB #00 DB 0 ERR1 -PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -DTA ;DEFS 256,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -PATHF ;DEFS 256,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -BAT_FM DB 0 -BAT_LEN DB 0 - -ECHOFLG DB 0 - -PATHLEN DB 0 -PATH ;DEFS 40,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0 - -GETPATH: LD C,2 - RST #10 +GETPATH: + LD C,Dss.CurDisk + RST ToDSS LD HL,PATHF ADD A,"A" LD (HL),A INC HL LD (HL),":" INC HL - LD C,30 - RST #10 + LD C,Dss.CurDir + RST ToDSS LD HL,PATHF LD DE,PATH @@ -1815,10 +1977,10 @@ GETPATH: LD C,2 LDI PUSH HL XOR A - LD BC,34 + LD BC,34 ;!HARDCODE CPIR JP NZ,LONGP - LD A,34 + LD A,34 ;!HARDCODE SUB C LD C,A POP HL @@ -1839,10 +2001,10 @@ LONGP CPIR LDIR POP HL PHLEN LD HL,PATH - LD BC,40 + LD BC,40 ;!HARDCODE path XOR A CPIR - LD A,39 + LD A,39 ;!HARDCODE SUB C LD (PATHLEN),A LD C,A @@ -1863,12 +2025,12 @@ PRINTBB PUSH BC TEMPXY DW 0 CR_ LD C,Dss.Cursor - RST #10 + RST ToDSS LD E,0 JP LOCAT LF_ LD C,Dss.Cursor - RST #10 + RST ToDSS LD A,D CP #1F JP Z,LFF @@ -1901,14 +2063,14 @@ PRINTX CP #20 CP #0A JP Z,LF_ CHAR PUSH BC - LD BC,#0182 + LD BC,#0182 RST ToBIOS POP BC RET LOCAT LD (TEMPXY),DE LD C,Dss.Locate - RST #10 + RST ToDSS RET ;PRINTX LD C,Dss.PutChar @@ -2082,7 +2244,7 @@ KEY1 CALL CURSORF EI HALT LD C,Dss.ScanKey - RST #10 + RST ToDSS JP Z,KEY1 RET @@ -2179,7 +2341,7 @@ SKIPSP LD A,(HL) JR NZ,PROCESS LD DE,BUFFER LD C,Dss.GSwitch - RST #10 + RST ToDSS PUSH AF EX DE,HL ;SAVE HL IN DE LD HL,BUFFER @@ -2231,42 +2393,126 @@ PR002 CP "C" LD (RUNMODE),A PR003 RET -TASKX DB 0 -RUNMODE DB 0 -STEP DB 8 -MAIN_X DB 0 +TASKX DB 0 +RUNMODE DB 0 +STEP DB 8 +MAIN_X DB 0 -LEN_OLD DB #00 -POSIT DB #00 -ETXS DW 0 -ETXE DW 0 +LEN_OLD DB 0 +POSIT DB 0 + +ETXS DW 0 +ETXE DW 0 ; +0 - Size buffer ; +1 - Amount simbols ; -1 - Scroll Window -WINDOW DB #50 -BUFFERC DB #FF -LEN_NEW DB #00 -CMDLINE ;DEFS #100,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -TMPLINE DS 256 +WINDOW DB #50 +BUFFERC DB #FF +LEN_NEW DB #00 BATNAME DB "system.bat",0 +BAT_BUFFER.size EQU 128 ;!FIXIT BAT_BUFFER LENGTH -PRMLINE DS 256 + + + + + STRUCT BUFFERS_STRUCT +CMDLINE BLOCK 256,0 +TMPLINE BLOCK 256,0 +PRMLINE BLOCK 256,0 +;BUFFER +;BATBUFF +SHARED_BUFFER BLOCK BAT_BUFFER.size+1,0 +; +PRM1 BLOCK 16,0 +PRM2 BLOCK 16,0 +PRM3 BLOCK 16,0 +PRM4 BLOCK 16,0 +PRM5 BLOCK 16,0 +PRM6 BLOCK 16,0 +PRM7 BLOCK 16,0 +PRM8 BLOCK 16,0 +PRM9 BLOCK 16,0 +DTA BLOCK 256,0 +DTA_2 BLOCK 256,0 +BPB BLOCK 512,0 +PATHF BLOCK 256,0 +BAT_FM DB 0 +BAT_LEN DB 0 +ECHOFLG DB 0 +PATHLEN DB 0 +PATH BLOCK 40,0 ;!FIXIT PATH LENGTH + ENDS + + +WORK_BUFFERS BUFFERS_STRUCT = $ + +CMDLINE EQU WORK_BUFFERS.CMDLINE +TMPLINE EQU WORK_BUFFERS.TMPLINE +PRMLINE EQU WORK_BUFFERS.PRMLINE +BUFFER EQU WORK_BUFFERS.SHARED_BUFFER +BATBUFF EQU WORK_BUFFERS.SHARED_BUFFER +PRM1 EQU WORK_BUFFERS.PRM1 +PRM2 EQU WORK_BUFFERS.PRM2 +PRM3 EQU WORK_BUFFERS.PRM3 +PRM4 EQU WORK_BUFFERS.PRM4 +PRM5 EQU WORK_BUFFERS.PRM5 +PRM6 EQU WORK_BUFFERS.PRM6 +PRM7 EQU WORK_BUFFERS.PRM7 +PRM8 EQU WORK_BUFFERS.PRM8 +PRM9 EQU WORK_BUFFERS.PRM9 +DTA EQU WORK_BUFFERS.DTA +DTA_2 EQU WORK_BUFFERS.DTA_2 +BPB EQU WORK_BUFFERS.BPB ;!TEST +PATHF EQU WORK_BUFFERS.PATHF +BAT_FM EQU WORK_BUFFERS.BAT_FM +BAT_LEN EQU WORK_BUFFERS.BAT_LEN +ECHOFLG EQU WORK_BUFFERS.ECHOFLG +PATHLEN EQU WORK_BUFFERS.PATHLEN +PATH EQU WORK_BUFFERS.PATH + + + DISPLAY "BUFFERS_STRUCT = ",/D,BUFFERS_STRUCT + DISPLAY "WORK_BUFFERS start = ",/H,WORK_BUFFERS + DISPLAY "WORK_BUFFERS end = ",/H,WORK_BUFFERS+BUFFERS_STRUCT + +/* + +CMDLINE BLOCK 256,0 + +TMPLINE BLOCK 256,0 + + +PRMLINE BLOCK 256,0 BUFFER: -BAT_BUFFER.size EQU 128 BATBUFF: BLOCK BAT_BUFFER.size+1,0 ; + +PRM1 BLOCK 16,0 +PRM2 BLOCK 16,0 +PRM3 BLOCK 16,0 +PRM4 BLOCK 16,0 +PRM5 BLOCK 16,0 +PRM6 BLOCK 16,0 +PRM7 BLOCK 16,0 +PRM8 BLOCK 16,0 +PRM9 BLOCK 16,0 + +DTA: BLOCK 256,0 +PATHF: BLOCK 256,0 + +BAT_FM: DB 0 +BAT_LEN: DB 0 + +ECHOFLG: DB 0 + +PATHLEN: DB 0 +PATH: BLOCK 40,0 ;!FIXIT PATH LENGTH +*/ + OUTEND ; ;[End] \ No newline at end of file diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index f411461..9d9c223 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -11,6 +11,8 @@ DSS 1.70.2 Изменения после версии 1.70 + [+] исправлен баг с "C:\>CD E:\" + [+] исправлен баг с переключением на другой диск из некорневой директории, когда на новом диске оказывался в несуществующей директории [+] при чтении/записи файла не происходит избыточное перечитывание кластеров от начала файла [+] перечитывание BPB теперь делается не на каждый чих, а когда надо (и бага при загрузке с диска "B:" нет :-P ) [+] изменена работа с RAM DISK, теперь он может быть загрузочным diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index ec89219..e2f6980 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -642,7 +642,10 @@ GETWORD: SUB #20 .next: SUB 'A' PUSH HL - CALL OPENDSK + ;!TEST CHNDISK OPENDSK + ;CALL OPENDSK + CALL CHNDISK + ; POP HL JP NC,GETWORD RET diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 4b5f93f..53a9c50 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -352,6 +352,7 @@ BLOK_WR PUSH BC CALL DIV32 LD B,XH LD C,XL + PUSH HL ;RESIDUE LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER LD H,(IY+_sFM.ST_CLUSTER+1) @@ -909,9 +910,29 @@ ADD_DE2: DJNZ ADD_DE1 ADC HL,DE RET -; HL:DE / BC => DE:IX HL-OSTATOK +; HL:DE / BC => DE:IX HL-OSTATOK (DE:BC.HL) +DIV32: LD A,#FF + LD B,E +.loop: SRL C + JR C,.exitLoop + SRL H : RR L : RR D : RR E : SLA A + JP .loop +.exitLoop: + CPL + AND B + LD XH,D + LD XL,E + EX DE,HL + LD H,0 + LD L,A + RET +/* + DEFINE NEW_DIV 1 + DIV32: LD XH,D LD XL,E + + IFN NEW_DIV EX DE,HL LD HL,0 LD A,#20 @@ -929,18 +950,83 @@ DIV001: ADD IX,IX DIV002: INC IX DEC A JR NZ,DIV001 - RET + RET + ELSE -//READCOD DB #00 -//READMEM DW #0000 +div32_16: +;HLIX/BC -> HLIX remainder DE +;174+4*div32_16_sub8 +;min: 2186cc +;max: 2794cc +;avg: 2466cc +;61 bytes + ex de,hl ; 4 -//SECTORH DW 0 -//SECTORL DW 0 +; Negate BC to allow add instead of sbc + xor a ; 4 +; Need to set HL to 0 anyways, so save 2cc and a byte + ld h,a ; 4 + ld l,a ; 4 + sub c ; 4 + ld c,a ; 4 + sbc a,a ; 4 + sub b ; 4 + ld b,a ; 4 -//R_POINT DW 0 -//S_POINT DW 0 -;//MODULE: DOS_FM -;[END] + ld a,d ; 4 + call div32_16_sub8 ; 17 + rla ; 4 + ld d,a ; 4 + ld a,e ; 4 + call div32_16_sub8 ; 17 + rla ; 4 + ld e,a ; 4 + + ld a,ixh ; 8 + call div32_16_sub8 ; 17 + rla ; 4 + ld ixh,a ; 8 + + ld a,ixl ; 8 + call div32_16_sub8 ; 17 + rla ; 4 + ld ixl,a ; 8 + + ;ex de,hl ; 4 + ret ; 10 + +div32_16_sub8: +;119+8*div32_16_sub +;min: 503cc +;max: 655cc +;avg: 573cc + call 1F +1: +;17+2(17+2(div32_16_sub))) + call 1F +1: +;17+2(div32_16_sub) + call div32_16_sub +div32_16_sub: +;48+{8,0+{0,19}} +;min: 48cc +;max: 67cc +;avg: 56.75cc + rla ; 4 + adc hl,hl ; 15 + jr c,1F ;12/7 + add hl,bc ; 11 + ret c ;11/5 + sbc hl,bc ; 15 + ret ; 10 +1: + add hl,bc ; 11 + scf ; 4 + ret ; 10 + + ENDIF +*/ +; \ No newline at end of file diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC index e6a3d19..583cb64 100644 --- a/DSS/VERSION.INC +++ b/DSS/VERSION.INC @@ -1,10 +1,31 @@ +;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] + LUA PASS1 + dss_date, dss_month, dss_year = Get_date_RU(sj.get_define("__DATE__")) + dss_build = increase_build("./DSS/build.txt") + if dss_build > 999 then + dss_build = 999 + print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a") + end + ENDLUA + LUA ALLPASS + sj.insert_label("lua_DAY", dss_date) + sj.insert_label("lua_MONTH", dss_month) + sj.insert_label("lua_YEAR", dss_year) + sj.insert_label("lua_BUILD", dss_build) + ENDLUA +;---------------------------------------------------------------------[] + ; -; DSS Version -VERS EQU 01 ;Version Number (XX.) -MODF EQU 70 ;Modification (.xx) -BUILD EQU 2 +; DSS full version +; номер версии (0..9) +VERS EQU 1 +; номер модификации (0..99) +MODF EQU 70 +; номер билда (0..999) +BUILD EQU lua_BUILD ; + ; Release Types RELEASE EQU 0 RC EQU 1 @@ -12,13 +33,13 @@ BETA EQU 2 DP EQU 3 ; -; Bulid Type +; Build Type OSTYPE EQU BETA REVISION EQU 1 ; -; Default date -DAY EQU 30 -MONTH EQU 03 -YEAR EQU 2023 +; Current date +DAY EQU lua_DAY +MONTH EQU lua_MONTH +YEAR EQU lua_YEAR ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt new file mode 100644 index 0000000..9d60796 --- /dev/null +++ b/DSS/build.txt @@ -0,0 +1 @@ +11 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 53ae29d..eb8e552 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 53ae29d127a926a372ada8fc8692afc7ecafdd9a +Subproject commit eb8e55262317fea366bfb6b7d834dde90ff7307b From 3d7d65821d89afc1d5d563bcdd4588fee73bab6c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 17 Jul 2023 03:30:27 +1000 Subject: [PATCH 016/219] ... --- Console/CONSOLE.ASM | 42 +++++++++++++++++++------------------ DSS/INTMOUSE.ASM | 50 +++++++++++++++++++++++++++++---------------- DSS/build.txt | 2 +- Shared_Includes | 2 +- 4 files changed, 56 insertions(+), 40 deletions(-) diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 0f4cab8..69d4167 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -50,6 +50,12 @@ LF EQU 10 ORG org_addr START: + LD HL,WORK_BUFFERS + LD DE,WORK_BUFFERS+1 + LD BC,BUFFERS_STRUCT-1 + LD (HL),0 + LDIR + ;INIT LD A,(IX-1) LD (TASKX),A @@ -57,12 +63,6 @@ START: CALL CRLF CALL GETPATH POP IX - - LD HL,WORK_BUFFERS - LD DE,WORK_BUFFERS+1 - LD BC,BUFFERS_STRUCT-1 - LD (HL),0 - LDIR ; CALL GET_CMD @@ -157,7 +157,7 @@ B_ALL_P POP HL LD C,Dss.Open RST ToDSS ;R10 - CALL Restore_Screen + CALL Restore_Screen ;R10 RET C LD (BAT_FM),A @@ -191,8 +191,8 @@ ADDBAT PUSH DE LD A,L LD (CMDLINE-1),A CALL CMDMODE - LD C,Dss.Close LD A,(BAT_FM) + LD C,Dss.Close RST ToDSS RET @@ -252,7 +252,7 @@ READBAT LD HL,BATBUFF LD (BAT_LEN),A RET -CMDMODE XOR A +CMDMODE: XOR A LD (POSIT),A CALL EVALCMD ;R05 LD IX,CMDLINE-2 @@ -1077,11 +1077,11 @@ YPS: LD DE,DTA LD HL,SER_NUM LD DE,PRM2 CALL PUTPRM - ;CALL GETPATH + CALL GETPATH LD HL,PATHF LD DE,PRM3 - ;CALL PUTPRM - call copy_string ; скопир. строку (с нулем) + CALL PUTPRM + //call copy_string ; скопир. строку (с нулем) LD DE,DIR1MSG CALL MESSAGE @@ -1523,6 +1523,7 @@ SIZEBFF DB "0 000 000 000",0,0 ;!FIXIT лучше такую функцию в DSS пихнуть ; прочитать BPB диска +/* read_disk_info: .disk+1: ld a,0 ; сохр. номер диска ld c,Dss.DRV.Open ; open device @@ -1616,7 +1617,7 @@ volume_label: inc de djnz $-2 ret - +*/ ; Вывод HL в hex-формате ; de=буфер ; hl=число @@ -1815,12 +1816,12 @@ PUTPRMA LD A,(HL) ;!FIXIT заменить на PUTPRMA с выставлением перед вызовом BC = 255 например ; Скопир. строку (с нулем) ; (hl) -> (de) -copy_string: - ld a,(hl) - ldi - or a - jr nz,copy_string - ret +//copy_string: +// ld a,(hl) +// ldi +// or a +// jr nz,copy_string +// ret PRINTZ LD A,(HL) @@ -1853,7 +1854,8 @@ ROOT DB '\',0 ALLFS DB "*.*",0 -SER_NUM DB "XXXX-XXXX",0 +SER_NUM DB "C37F-73AB",0 +//SER_NUM DB "XXXX-XXXX",0 EXTBF BLOCK 4,0 diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 78c1c0d..fe55643 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -155,11 +155,14 @@ M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET +;!TODO на биос. MS_INIT DI - LD A,85 - OUT (#10),A - LD A,45 - OUT (#10),A + ;!TEST mouse + ;LD A,85 + ;OUT (#10),A + ;LD A,45 + ;OUT (#10),A + ; XOR A ;LD A,0 OUT (CMOUSE),A INC A ;LD A,1 @@ -172,12 +175,23 @@ MS_INIT DI OUT (CMOUSE),A LD A,4 OUT (CMOUSE),A - LD A,#47 + ;!TEST mouse + LD A,#47 + ;LD A,#44 + ; OUT (CMOUSE),A LD A,5 OUT (CMOUSE),A LD A,#E0 OUT (CMOUSE),A + + ;!TEST mouse + LD A,85 + OUT (Z84.CTC.Ch_0),A + LD A,45 + OUT (Z84.CTC.Ch_0),A + ; + EI XOR A RET @@ -381,7 +395,7 @@ MOUSET LD (REST_XT+1),HL ; DI ; - LD A,#54 + LD A,#54 ;!HARDCODE video page OUT (SLOT1),A ; LD A,D @@ -415,9 +429,9 @@ MOUSET LD (REST_XT+1),HL OUT (PORT_Y),A RET -RESTORT -REST_XT LD HL,#0000 -REST_YT LD DE,#0000 +RESTORT: +REST_XT: LD HL,#0000 +REST_YT: LD DE,#0000 ;Y SRL D RR E @@ -479,7 +493,7 @@ RESTORG IN A,(SLOT3) IN A,(PORT_Y) LD C,A PUSH BC - LD A,#50 + LD A,#50 ;!HARDCODE videopage OUT (SLOT3),A REST_X LD HL,0 REST_Y LD DE,0 @@ -519,15 +533,15 @@ RS003 POP BC ;HL/DE - X/Y -MOUSE LD A,(MODE_M) +MOUSE: LD A,(MODE_M) LD (RESTORE.sw),A BIT 7,A JP Z,MOUSET -MOUSEG CP #82 ;640x256x16 +MOUSEG: CP #82 ;640x256x16 JR NZ,NOFX SRL H RR L -NOFX LD IX,M_IMAGE +NOFX: LD IX,M_IMAGE LD A,(M_XSIZE) LD C,A LD B,0 @@ -552,12 +566,12 @@ NOFX LD IX,M_IMAGE LD B,0 LD A,(M_YSIZE) SUB E -SKIPMY ADD IX,BC +SKIPMY: ADD IX,BC DEC E JR NZ,SKIPMY LD C,A LD (REALYS),BC -GOODY LD BC,(XHOT_SP) +GOODY: LD BC,(XHOT_SP) AND A SBC HL,BC JR NC,GOODX @@ -572,7 +586,7 @@ GOODY LD BC,(XHOT_SP) LD L,A LD (REALXS),HL LD HL,0 -GOODX LD (REST_X+1),HL +GOODX: LD (REST_X+1),HL LD (REST_Y+1),DE PUSH HL @@ -581,7 +595,7 @@ GOODX LD (REST_X+1),HL IN A,(PORT_Y) LD L,A EX (SP),HL - LD A,#5C + LD A,#5C ;!HARDCODE videopage OUT (SLOT3),A LD A,E EX AF,AF' @@ -603,7 +617,7 @@ MS002 LD BC,(SKIPXF) LD BC,(REALXS) OUT (PORT_Y),A EX AF,AF' - ;USH DE + ;PUSH DE LD (PUSH_DE+1),DE LDIR PUSH_DE LD DE,#0000 diff --git a/DSS/build.txt b/DSS/build.txt index 9d60796..ca7bf83 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -11 \ No newline at end of file +13 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index eb8e552..512ed76 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit eb8e55262317fea366bfb6b7d834dde90ff7307b +Subproject commit 512ed76395d10278e52e97d941971fc2079f1968 From 7ba4cf4412b524f26c94759ba6de5dc5493a1a17 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 17 Jul 2023 18:56:03 +1000 Subject: [PATCH 017/219] ... --- DSS/build.txt | 2 +- Shared_Includes | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DSS/build.txt b/DSS/build.txt index ca7bf83..da2d398 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -13 \ No newline at end of file +14 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 512ed76..6d439eb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 512ed76395d10278e52e97d941971fc2079f1968 +Subproject commit 6d439eb5a2fdbf826942b020871dc40726c50ab8 From b87eac0895a63f74b4a48ad1b8dcbfb3e22da63d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 18 Jul 2023 03:20:37 +1000 Subject: [PATCH 018/219] =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B5=D1=89=D1=91=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D0=B4=D1=83=D1=80=D1=83=20DIV32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS_FM.ASM | 40 +++++++++++++++++++++++++++++++--------- DSS/INTMOUSE.ASM | 8 +++++--- DSS/build.txt | 2 +- Shared_Includes | 2 +- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 53a9c50..d6ec3db 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -911,21 +911,43 @@ ADD_DE2: DJNZ ADD_DE1 RET ; HL:DE / BC => DE:IX HL-OSTATOK (DE:BC.HL) -DIV32: LD A,#FF - LD B,E -.loop: SRL C - JR C,.exitLoop - SRL H : RR L : RR D : RR E : SLA A - JP .loop -.exitLoop: - CPL - AND B +DIV32: LD A,C + DEC A + JR Z,.exit +; + AND E + LD B,A ; остаток + LD A,C + RRCA +; +.loop: SRL H : RR L + RR D : RR E + RRCA + JR NC,.loop + LD A,B +; +.exit: LD XH,D LD XL,E EX DE,HL LD H,0 LD L,A RET +; DIV32: LD A,#FF +; LD B,E +; .loop: SRL C +; JR C,.exitLoop +; SRL H : RR L : RR D : RR E : SLA A +; JP .loop +; .exitLoop: +; CPL +; AND B +; LD XH,D +; LD XL,E +; EX DE,HL +; LD H,0 +; LD L,A +; RET /* DEFINE NEW_DIV 1 diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index fe55643..648d1f5 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -176,8 +176,9 @@ MS_INIT DI LD A,4 OUT (CMOUSE),A ;!TEST mouse - LD A,#47 + LD A,#47 ; первый множитель = 16 875000/Мн1*Мн2=1215 ;LD A,#44 + ;LD A,#04 ; первый множитель = 1 875000/Мн1*Мн2=4807 ; OUT (CMOUSE),A LD A,5 @@ -186,9 +187,10 @@ MS_INIT DI OUT (CMOUSE),A ;!TEST mouse - LD A,85 + LD A,#55 OUT (Z84.CTC.Ch_0),A - LD A,45 + LD A,#2D ; второй множитель = 45 875000/Мн1*Мн2=1215 + ;LD A,#B6 ; второй множитель = 182 875000/Мн1*Мн2=4807 OUT (Z84.CTC.Ch_0),A ; diff --git a/DSS/build.txt b/DSS/build.txt index da2d398..25bf17f 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -14 \ No newline at end of file +18 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 6d439eb..afe66b1 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6d439eb5a2fdbf826942b020871dc40726c50ab8 +Subproject commit afe66b1f354cab8d2780826697cf371d1d9e389d From b6c902f4f714d663a8149304fde596c0faa2fa29 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 19 Jul 2023 01:18:08 +1000 Subject: [PATCH 019/219] refactoring --- DSS/DOS5.ASM | 413 ++++++++++++++++++++++++++++++++++-------------- DSS/DOS_FM.ASM | 5 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- 4 files changed, 297 insertions(+), 125 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index e2f6980..d62542b 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -150,33 +150,41 @@ DELETE: LD DE,MASKARE CALL LOADDIR CALL SEARCH RET C +; пометить запись как "удаленная" DELFILE: SET_PAGE_X DIRPAGE - LD (IX+_sFM.NAME),#E5 - LD E,(IX+_sFM.ST_CLUSTER) + LD (IX+_sFM.NAME),#E5 ; признак удаления файла + LD E,(IX+_sFM.ST_CLUSTER) ; № первого кластера LD D,(IX+_sFM.ST_CLUSTER+1) OUT (SLOT3),A LD A,E OR D - JR Z,SMALDEL -DEL01 EX DE,HL - CALL R_F_FAT - PUSH DE + JP Z,SAVEDIR ; сбросить кеш каталога на диск +DEL01 EX DE,HL ; hl=номер кластера + CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + PUSH DE ; номер след. кластера PUSH AF - LD DE,#0000 - CALL W_T_FAT + LD DE,#0000 ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера POP AF POP DE JP NC,DEL01 CALL WR_FAT -SMALDEL CALL SAVEDIR - AND A - RET + JP SAVEDIR ; сбросить кеш каталога на диск +;///////////////////////////////////////////////////////////////////// +; Функция #10. Переименование файла. +; Глобальные символы * и ? в именах файлов не допускаются. +; +; вход: HL - указатель на старое имя файла +; DE - указатель на новое имя файла +; выход: A - код ошибки, если CF=1 +; ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? +;///////////////////////////////////////////////////////////////////// RENAME PUSH DE LD DE,MASKARE CALL MASK @@ -190,10 +198,10 @@ RENAME PUSH DE SCF RET Z PUSH DE - CALL LOADDIR + CALL LOADDIR ; прочитать список каталога ;LD A,#33 LD A,FAT_ATTR.NoSYSnoVolID - CALL ASEARCH + CALL ASEARCH ; поиск записи в списке диска POP HL RET C LD DE,MASKARE @@ -208,7 +216,7 @@ RENAME PUSH DE RET Z PUSH IX LD A,FAT_ATTR.NoSYSnoVolID - CALL ASEARCH + CALL ASEARCH ; поиск записи в списке диска POP IX LD A,DSS_Error.sys.FILE_EXISTS CCF @@ -222,14 +230,12 @@ RENAME PUSH DE LD BC,11 LDIR OUT (SLOT3),A - CALL SAVEDIR - AND A - RET + JP SAVEDIR ;R02 OPENATR: - LD (ACCESS),A - CALL GETWORD + LD (ACCESS),A ; раб. ячейка (здесь атрибут записи) + CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME LD DE,MASKARE @@ -237,10 +243,23 @@ OPENATR: RET C LD A,FAT_ATTR.NoVolID CALL ASEARCH - JR NC,OPENAT + JR NC,OPENAT ; на поиск своб. дескриптора + ; запись не найдена RET ;R02 + +;///////////////////////////////////////////////////////////////////// +; Функция #11. Открытие файла. +; +; вход: HL - указатель на имя файла +; A - режим доступа: +; A=0 чтение/запись +; A=1 чтение +; A=2 запись +; выход: A - дескриптор файла, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// OPEN_FN: _mSavePath OPEN: ;R08 @@ -529,6 +548,13 @@ NSEARCH: JR Z,SEARCH3.error JP SEARCH1 +;------------------------------------------------- +; Поиск записи каталога в списке каталога +; +; вход: a=атрибут записи +; выход: de'=индекс записи в списке каталога +; CF - каталог не найден +;------------------------------------------------- DSEARCH: LD A,FAT_ATTR.DIRECTORY CALL ASEARCH @@ -604,6 +630,10 @@ SEARCH4: SCF RET +;------------------------------------------------- +; Тест на допустимое имя и настроиться на диск. +; вход: hl=строка имени +;------------------------------------------------- GETWORD: LD DE,TMPNAME LD BC,#0DFF @@ -649,8 +679,8 @@ GETWORD: POP HL JP NC,GETWORD RET - -TMPNAME: DB ' ',#00 ; 12 пробелов и 0 +; Буфер имени 8.3 формата +TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: @@ -901,6 +931,12 @@ IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) RET +;///////////////////////////////////////////////////////////////////// +; Функция #1E. Информация о текущем каталоге. +; +; вход: HL - буфер в памяти 256 байт +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// CURRDIR: EX DE,HL LD HL,DIRSPEC CURDIR1 LD A,(HL) @@ -909,58 +945,67 @@ CURDIR1 LD A,(HL) JR NZ,CURDIR1 RET + +;------------------------------------------------- +; Прочитать список каталога +;------------------------------------------------- LOADDIR: XOR A LD H,A LD L,A LD IX,0 - LD B,A + LD B,A ; от начала файла CALL MOVE_FP SET_PAGE_X DIRPAGE PUSH AF ;!TEST no ldir + ; очистить кеш каталога ;LD HL,#C000 ;LD DE,#C001 ;LD BC,#3FFF ;LD (HL),L ;LDIR ; - LD A,(FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - LD D,(IY+_sFM.ST_CLUSTER) + LD A,(FatBuffer.DRIVE) ; номер диска + LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор + LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера LD E,(IY+_sFM.ST_CLUSTER+1) LD A,D OR E - JP Z,LROTDIR - LD HL,DIR - LD DE,#4000 - XOR A - CALL READ - LD (DIRSIZE),DE + JP Z,LROTDIR ; root ?? + LD HL,DIR ; куда + LD DE,#4000 ; сколько + XOR A ; дескриптор + CALL READ ; чтение из файла + LD (DIRSIZE),DE ; число прочит. байтов POP AF OUT (SLOT3),A AND A RET -LROTDIR LD HL,(FatBuffer.DIR_FRH) - LD IX,(FatBuffer.DIR_FRL) +LROTDIR LD HL,(FatBuffer.DIR_FRH) ; ст. разряд + LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора LD A,(FatBuffer.DIR_S_S) - LD B,32 + LD B,32 ; !HARDCODE размер 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 + LD B,A ; число секторов +RTD1 LD A,(FatBuffer.DRIVE) ; номер диска + LD DE,DIR ; буфер + LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV POP AF OUT (SLOT3),A AND A RET +;------------------------------------------------- +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +;------------------------------------------------- SAVEDIR XOR A LD HL,0 LD IX,0 @@ -1003,7 +1048,7 @@ RTD1S LD A,(FatBuffer.DRIVE) AND A RET -DIRSIZE: WORD 0 +DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory ;!TEST ;BANK: @@ -1017,6 +1062,8 @@ DIRSIZE: WORD 0 ; RET ; + +; Массив лог. номеров банок расширения ДОС BANKTBL: BLOCK USING_MEMPAGES+1,#FF ;!TODO @@ -1073,11 +1120,20 @@ BANKTBL: BLOCK USING_MEMPAGES+1,#FF ;HANDTA BLOCK 32,0 -MASKARE: BLOCK 32,0 ;!HARDCODE почему 32? +MASKARE: BLOCK 8,0 ; имя файла + BLOCK 3,0 ; расш. + BLOCK 21,0 ; 11+21=32 +;------------------------------------------------- +; Преобразовать имя 8.3 -> 11 формат +; вход: hl = 8.3 имя +; de = буфер имени 11 симв. формата +; при ошибке CF - недоп. имя +; ; HL - MASK "file*.t??" ; DE - 11 bytes filename ; RET: C=2 FILE WITHOUT EXTENTION ; C=1 FILE WITH EXTENTION +;------------------------------------------------- MASK PUSH HL PUSH DE LD H,D @@ -1095,52 +1151,53 @@ MASK PUSH HL CP '!' MASKB LD A,DSS_Error.sys.INVALID_NAME RET C - LD BC,#0902 + LD BC,#0902 ; B - счетчик MASK1 LD A,(HL) CP '!' CCF RET NC CP '"' - JR Z,MASK7 + JR Z,MASK_ERR CP '*' JR Z,MASK3 CP '+' - JR Z,MASK7 + JR Z,MASK_ERR CP ',' - JR Z,MASK7 + JR Z,MASK_ERR CP '.' JR Z,MASK5 CP '/' - JR Z,MASK7 + JR Z,MASK_ERR CP ':' - JR Z,MASK7 + JR Z,MASK_ERR CP ';' - JR Z,MASK7 + JR Z,MASK_ERR CP '<' - JR Z,MASK7 + JR Z,MASK_ERR CP '=' - JR Z,MASK7 + JR Z,MASK_ERR CP '>' - JR Z,MASK7 + JR Z,MASK_ERR CP '[' - JR Z,MASK7 + JR Z,MASK_ERR CP '\' - JR Z,MASK7 + JR Z,MASK_ERR CP ']' - JR Z,MASK7 + JR Z,MASK_ERR CP '|' - JR Z,MASK7 + JR Z,MASK_ERR ; CP 'a' ;????? ; JR C,MASK2 ; CP '{' ; JR NC,MASK2 ; SUB #20 - CALL UPPER + CALL UPPER ; a..z -> A..Z MASK2 LD (DE),A INC HL INC DE DJNZ MASK1 -MASK7 LD A,DSS_Error.sys.INVALID_NAME +MASK_ERR: + LD A,DSS_Error.sys.INVALID_NAME SCF RET @@ -1177,6 +1234,7 @@ MASK4 LD (DE),A SCF RET +; a..z -> A..Z UPPER CP 'a' RET C CP '{' @@ -1203,6 +1261,19 @@ HGUPPER CP ' DEC A RET + +;///////////////////////////////////////////////////////////////////// +; Функция #21. Текущая дата и время. +; +; вход: нет +; выход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; C - день недели +;///////////////////////////////////////////////////////////////////// SYSTIME LD C,BIOS.CMOS_TEST RST ToBIOS JP C,NOCMOS @@ -1284,6 +1355,9 @@ GOODAGE POP AF AND A RET +; Чтение регистров CMOS +; вход: d=номер регистра + RCMOS LD C,BIOS.CMOS_RD RST ToBIOS ; INPUT : A - BCD @@ -1322,6 +1396,17 @@ NOCMOS2 LD C,0 AND A RET +;///////////////////////////////////////////////////////////////////// +; Функция #22. Установить текущую дату и время. +; +; вход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// SETTIME PUSH IX PUSH BC PUSH HL @@ -1373,7 +1458,9 @@ YR INC A AND A RET - +;!FIXIT переделать по доке на Даллас и заись в ячейки часов +; Запись регистров CMOS +; вход: d=номер регистра WCMOS CALL HEX2BCD LD C,BIOS.CMOS_WR RST ToBIOS @@ -1397,26 +1484,53 @@ H2B INC C OR B RET +; Дата по-умолчанию NC_DAY DW DAY*256+MONTH ;DAY/MONTH NC_HOUR DW #0000 ;HOUR/MINUTE NC_SEC DW #0001 ;SECOND/WEEKDAY NC_YEAR DW YEAR ;YEAR + +;///////////////////////////////////////////////////////////////////// +; Функция #17. Информация о дате и времени файла. +; +; вход: A - дескриптор файла +; выход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// GET_D_T CALL SET_FM RET C - LD E,(IY+_sFM.TIME) - LD D,(IY+_sFM.TIME+1) - LD C,(IY+_sFM.DATE) - LD B,(IY+_sFM.DATE+1) - CALL RMKTIME + ; время/дату из структуры дескр. + LD E,(IY+_sFM.TIME) ; время + LD D,(IY+_sFM.TIME+1) ; + LD C,(IY+_sFM.DATE) ; дата + LD B,(IY+_sFM.DATE+1) ; + CALL RMKTIME ; раскодировать время/дату AND A RET +;///////////////////////////////////////////////////////////////////// +; Функция #18. Изменение даты и времени файла. +; +; вход: A - дескриптор файла +; D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// PUT_D_T PUSH AF - CALL MK_TIME - POP AF + CALL MK_TIME ; закодировать время/дату + POP AF ; дескриптор PUSH DE PUSH BC CALL SET_FM @@ -1427,10 +1541,20 @@ PUT_D_T PUSH AF LD (IY+_sFM.TIME+1),D LD (IY+_sFM.DATE),C LD (IY+_sFM.DATE+1),B - SET 7,(IY+_sFM.ACCESS_MODE) ;R06 + SET 7,(IY+_sFM.ACCESS_MODE) ;R06 ; уст. признак изменения файла AND A RET +;------------------------------------------------- +; Закодировать время/дату +; вход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; выход: de - время +; bc - месяц/день +; ix - год +; ;INPUT: D - DAY; E - MONTH ; H - HOUR; L - MINUTE ; B - SECOND (0...59) @@ -1438,6 +1562,7 @@ PUT_D_T PUSH AF ;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 ; BC - yyyyyyymmmmddddd y - year, m - month, d - day ; (1980-2108) +;------------------------------------------------- MK_TIME LD A,L RLCA RLCA @@ -1468,6 +1593,16 @@ MK_TIME LD A,L AND A RET +;------------------------------------------------- +; Раскодировать время/дату +; вход: de - время +; bc - месяц/день +; ix - год +; выход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; ;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 ; BC - yyyyyyymmmmddddd y - year, m - month, d - day ; (1980-2108) @@ -1475,6 +1610,7 @@ MK_TIME LD A,L ; H - HOUR; L - MINUTE ; B - SECOND (0...59) ; IX- YEAR (0...65535) +;------------------------------------------------- RMKTIME EX DE,HL LD A,C AND #1F @@ -1507,8 +1643,19 @@ RMKTIME EX DE,HL AND A RET + +;///////////////////////////////////////////////////////////////////// +; Функция #1D. Смена текущего каталога. +; Меняет текущий каталог и текущий диск, если он указан в файловой +; спецификации. Если путь начинается с "\" - это означает путь от +; корневого каталога, иначе от текущего. +; +; вход: HL - указатель на имя каталога +; выход: нет +; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 -CHDIR: CALL GETWORD +;///////////////////////////////////////////////////////////////////// +CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME LD A,(HL) @@ -1516,51 +1663,59 @@ CHDIR: CALL GETWORD CALL NZ,OPENDIR RET - +;///////////////////////////////////////////////////////////////////// +; Функция #1B. Создание каталога. +; +; вход: HL - указатель на имя каталога +; выход: A - код ошибки, если CF=1 +; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 - +;///////////////////////////////////////////////////////////////////// MKDIR: _mSavePath - CALL GETWORD + CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK + LD HL,TMPNAME ; 8.3 имя + LD DE,MASKARE ; буфер имени 11 симв. формата + CALL MASK ; преобр. имя 8.3 -> 11 формат RET C - CALL LOADDIR - CALL DSEARCH + CALL LOADDIR ; прочитать список каталога + CALL DSEARCH ; поиск записи каталога в списке диска LD A,DSS_Error.sys.DIR_EXISTS CCF - RET C + RET C ; каталог найден + CALL G_CLUST RET C PUSH HL - LD DE,(FatBuffer.ENDCLUS) - CALL W_T_FAT - CALL WR_FAT + LD DE,(FatBuffer.ENDCLUS) ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера + CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR EX DE,HL - LD A,#10 + LD A,#10 ; атрибут записи каталога LD (HL),A INC HL - LD BC,#0A00 -FIHND0 LD (HL),C + LD BC,#0A00 ; b=счетчик + +.loop1: LD (HL),C INC HL - DJNZ FIHND0 + DJNZ .loop1 + PUSH HL - CALL SYSTIME - CALL MK_TIME + CALL SYSTIME ; узнать тек. дату и время + CALL MK_TIME ; закодировать время/дату POP HL - LD (HL),E + LD (HL),E ; de=время INC HL LD (HL),D INC HL - LD (HL),C + LD (HL),C ; день INC HL - LD (HL),B + LD (HL),B ; месяц INC HL POP DE PUSH DE @@ -1568,49 +1723,58 @@ FIHND0 LD (HL),C INC HL LD (HL),D INC HL - LD BC,#0400 -FIHND2 LD (HL),C + LD BC,#0400 ; b=счетчик + +.loop2: LD (HL),C INC HL - DJNZ FIHND2 - CALL WRT_HND - CALL SAVEDIR - LD HL,SECBUF - LD (HL),"." - LD B,10 -MKD02 INC HL - LD A,' ' - LD (HL),A - DJNZ MKD02 + DJNZ .loop2 + + CALL WRT_HND ; скопир. новую запись в список диска (каталога) + CALL SAVEDIR ; сбросить кеш каталога на диск + LD HL,SECBUF ; буфер + LD (HL),"." ; запись тек. каталога + LD BC,10*256 + ' ' ; b=счетчик, c=пробел + +.loop3: INC HL + LD (HL),C + DJNZ .loop3 + INC HL - LD DE,HANDBUF+11 + LD DE,HANDBUF+11 ; ячейка атрибутов файла EX DE,HL LD BC,21 LDIR EX DE,HL - LD (HL),"." + LD (HL),"." ; запись родит. каталога INC HL LD (HL),"." - LD B,9 + LD BC,9*256 + ' ' ; b=счетчик, c=пробел MKD03 INC HL - LD A,#20 - LD (HL),A + LD (HL),C DJNZ MKD03 + INC HL - PUSH HL + + IF OLD_SET_BANK + PUSH HL + ENDIF SET_PAGE_X DIRPAGE + + IF OLD_SET_BANK + POP HL + ENDIF - POP HL PUSH AF LD A,(DIR) CP "." - LD DE,DIR+11 + LD DE,DIR+11 ; атрибуты записи JP Z,MKD04 LD IX,HANDBUF XOR A LD (IX+_sFM.ST_CLUSTER),A LD (IX+_sFM.ST_CLUSTER+1),A - LD DE,HANDBUF+11 + LD DE,HANDBUF+11 ; ячейка атрибутов файла MKD04 EX DE,HL LD BC,HANDBUF.SIZE-11 LDIR @@ -1625,10 +1789,10 @@ MKD04 EX DE,HL LDIR ;!FIXIT нужно ли так много грохать? POP HL CALL NSECTOR - LD A,(BootSector.S_P_C) + LD A,(BootSector.S_P_C) ; секторов на кластер MKD12 PUSH AF - PUSH HL - PUSH IX + PUSH HL ; ст. разряд + PUSH IX ; номер лог. сектора IN A,(SLOT3) PUSH AF IN A,(SLOT0) @@ -1660,7 +1824,15 @@ MKD11 POP AF AND A RET +;///////////////////////////////////////////////////////////////////// +; Функция #1C. Удаление каталога. +; Можно удалить только пустой каталог. +; +; вход: HL - указатель на имя каталога +; выход: A - код ошибки, если CF=1 +; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 +;///////////////////////////////////////////////////////////////////// RMDIR: _mSavePath CALL GETWORD @@ -1707,13 +1879,14 @@ RMD10 LD A,(HL) JP Z,RMD15 ;DIR EMPTY CP "." JR Z,RMD14 - CP #E5 + CP #E5 ;!HARDCODE байт удаления файла JR Z,RMD14 - LD DE,11 + LD DE,11 ;!HARDCODE смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE - BIT 3,A + ;BIT 3,A + AND %0000'1000 JP Z,RMD16 ;DIR NOT EMPTY RMD14 LD DE,#0020 ADD HL,DE @@ -1728,12 +1901,12 @@ RMD14 LD DE,#0020 RMD11 POP AF DEC A JR NZ,RMD12 - POP HL - CALL R_F_FAT - EX DE,HL - JR NC,RMD17 + POP HL ; номер кластера + CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + EX DE,HL ; hl=номер след. кластера + JR NC,RMD17 ; не конец цепочки RMD18 POP IX - JP DELFILE + JP DELFILE ; пометить запись как "удаленная" RMD15 POP IX POP HL diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index d6ec3db..bca1372 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -910,7 +910,7 @@ ADD_DE2: DJNZ ADD_DE1 ADC HL,DE RET -; HL:DE / BC => DE:IX HL-OSTATOK (DE:BC.HL) +; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A DIV32: LD A,C DEC A JR Z,.exit @@ -926,8 +926,7 @@ DIV32: LD A,C JR NC,.loop LD A,B ; -.exit: - LD XH,D +.exit: LD XH,D LD XL,E EX DE,HL LD H,0 diff --git a/DSS/build.txt b/DSS/build.txt index 25bf17f..dec2bf5 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -18 \ No newline at end of file +19 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 87f9b98..e0fcecc 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -17,7 +17,7 @@ DEFINE USING_MEMPAGES 4 DEFINE OLD_SET_BANK 0 -;!FIXIT сделать типа DIRPAGE EQU 0 + BANKTBL и упростить BANK +; кэш списка каталога DIRPAGE EQU 0 FATPAGE EQU 1 TXTPAGE EQU 2 From f9e9f13f933095e7956c83344dd7ea057b1680d2 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 20 Jul 2023 04:45:26 +1000 Subject: [PATCH 020/219] =?UTF-8?q?console.asm=20R11.=20Execute.asm=20R12.?= =?UTF-8?q?=20=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=B8=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Console/CONSOLE.ASM | 126 ++--- DSS/DOS5.ASM | 40 +- DSS/DSS-MAIN.ASM | 9 +- DSS/EXECUTE.ASM | 1108 +++++++++++++++++++++++++------------------ DSS/build.txt | 2 +- Shared_Includes | 2 +- 6 files changed, 731 insertions(+), 556 deletions(-) diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 69d4167..7598af9 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -10,6 +10,7 @@ ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] +;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R09 ??-??-???? DNS ;????? ???? ;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS @@ -1795,15 +1796,23 @@ MESSAGE CALL FMESAGE FMESAGE INC DE LD HL,MSG0 LD BC,MSG1-MSG0 -LCPIR XOR A +LCPIR: XOR A CPIR RET PO RET NZ + ;R11 + XOR A + CP (HL) + JR Z,.no_mess + ; DEC DE LD A,D OR E JP NZ,LCPIR RET +.no_mess: INC HL + RET + PUTPRM LD BC,15 PUTPRMA LD A,(HL) @@ -1903,62 +1912,67 @@ MSG0 DB 0 DB "DATE EXIT PATH RMDIR VERSION " DB " ",CR,LF DB 0 -MSG1 - +MSG1: +;----------------------------------------------------------------------- +;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются ERR0 DB #00 - DB "Bad command or file name",0 - DB "Invalid function",0 - DB "Invalid drive number",0 - DB "File not found",0 - DB "Path not found",0 - DB "Invalid handle",0 - DB "Extended error 6",0 - DB "File exist",0 - DB "File read only",0 - DB "Root overflow",0 - DB "No free space",0 - DB "Directory not empty",0 - DB "Can't delete current directory",0 - DB "Invalid media",0 - DB "Unknown operation",0 ;R02 - DB "Directory exist",0 - DB "Invalid filename",0 - DB "Invalid EXE-file",0 - DB "Not supported EXE-file",0 - DB "Access denied",0 - DB "Not ready",0 - DB "Seek error",0 - DB "Sector not found",0 - DB "CRC error",0 - DB "Write protect",0 - DB "Read error",0 - DB "Write error",0 - DB "Drive failure",0 - DB "Extended error 28",0 - DB "Extended error 29",0 - DB "No free memory",0 - DB "Invalid memory block",0 - DB "Extended error 32",0 - DB "Extended error 33",0 - DB "Extended error 34",0 - DB "35",0 - DB "36",0 - DB "37",0 - DB "38",0 - DB "39",0 - DB "40",0 - DB "41",0 - DB "42",0 - DB "43",0 - DB "44",0 - DB "45",0 - DB "46",0 - DB "47",0 - DB "48",0 - DB "49",0 - DB "50" - DB 0 -ERR1 + DZ "Bad command or file name" + DZ "Invalid function" ; 01 - неверный номер функции + DZ "Invalid drive number" ; 02 - неправильный номер устройства + DZ "File not found" ; 03 - файл не обнаружен + DZ "Path not found" ; 04 - неверный путь + DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор + DZ "No free filehandle" ; 06 - нет свободного файлового манипулятора + DZ "File exist" ; 07 - файл существует + DZ "File read only" ; 08 - файл только для чтения + DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) + DZ "No free space" ; 10 - нет свободного места на диске + DZ "Directory not empty" ; 11 - каталог не пуст + DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог + DZ "Invalid media" ; 13 - неизвестный формат + DZ "Unknown operation" ;R02 ; 14 - невозможная операция + DZ "Directory exist" ; 15 - каталог уже есть + DZ "Invalid filename" ; 16 - неверное имя + DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл + DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла + DZ "Access denied" ; 19 - ресурс не доступен + DZ "Not ready" ; 20 - нет готовности + DZ "Seek error" ; 21 - ошибка позиционирования + DZ "Sector not found" ; 22 - сектор не найден + DZ "CRC error" ; 23 - ошибка CRC + DZ "Write protect" ; 24 - защита записи + DZ "Read error" ; 25 - ошибка чтения + DZ "Write error" ; 26 - ошибка записи + DZ "Drive failure" ; 27 - сбой диска + DZ "Extended error 28" + DZ "Extended error 29" + DZ "No free memory" ; 30 - недостаточно памяти + DZ "Invalid memory block" ; 31 - несуществующий блок памяти + DZ "Extended error 32" + DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной + DZ "Extended error 34" + DZ "Too many files in directory" ; 35 - слишком много файлов в директории + DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + DZ "Operation interrupted by user" ; 37 - операция прервана пользователем + DZ "Common error" ; 38 - общая ошибка + DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения + DZ "40" + DZ "41" + DZ "42" + DZ "43" + DZ "44" + DZ "45" + DZ "46" + DZ "Wrong video mode" ; 48 - неправильный видеорежим + DZ "48" + DZ "49" + DZ "50" + ;R11 + BYTE 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: + DZ "Unknown error" + ; +ERR1: +;----------------------------------------------------------------------- GETPATH: LD C,Dss.CurDisk diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index d62542b..a279d3e 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -174,7 +174,7 @@ DEL01 EX DE,HL ; hl= CALL WR_FAT JP SAVEDIR ; сбросить кеш каталога на диск -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #10. Переименование файла. ; Глобальные символы * и ? в именах файлов не допускаются. ; @@ -184,7 +184,7 @@ DEL01 EX DE,HL ; hl= ; ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// RENAME PUSH DE LD DE,MASKARE CALL MASK @@ -249,7 +249,7 @@ OPENATR: ;R02 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; ; вход: HL - указатель на имя файла @@ -259,7 +259,7 @@ OPENATR: ; A=2 запись ; выход: A - дескриптор файла, если CF=0 ; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// OPEN_FN: _mSavePath OPEN: ;R08 @@ -931,12 +931,12 @@ IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1E. Информация о текущем каталоге. ; ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// CURRDIR: EX DE,HL LD HL,DIRSPEC CURDIR1 LD A,(HL) @@ -1262,7 +1262,7 @@ HGUPPER CP ' RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #21. Текущая дата и время. ; ; вход: нет @@ -1273,7 +1273,7 @@ HGUPPER CP ' ; L - минуты ; B - секунды ; C - день недели -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// SYSTIME LD C,BIOS.CMOS_TEST RST ToBIOS JP C,NOCMOS @@ -1396,7 +1396,7 @@ NOCMOS2 LD C,0 AND A RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #22. Установить текущую дату и время. ; ; вход: D - день @@ -1406,7 +1406,7 @@ NOCMOS2 LD C,0 ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// SETTIME PUSH IX PUSH BC PUSH HL @@ -1492,7 +1492,7 @@ NC_YEAR DW YEAR ;YEAR -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #17. Информация о дате и времени файла. ; ; вход: A - дескриптор файла @@ -1503,7 +1503,7 @@ NC_YEAR DW YEAR ;YEAR ; L - минуты ; B - секунды ; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// GET_D_T CALL SET_FM RET C @@ -1516,7 +1516,7 @@ GET_D_T AND A RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #18. Изменение даты и времени файла. ; ; вход: A - дескриптор файла @@ -1527,7 +1527,7 @@ GET_D_T ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// PUT_D_T PUSH AF CALL MK_TIME ; закодировать время/дату POP AF ; дескриптор @@ -1644,7 +1644,7 @@ RMKTIME EX DE,HL RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1D. Смена текущего каталога. ; Меняет текущий каталог и текущий диск, если он указан в файловой ; спецификации. Если путь начинается с "\" - это означает путь от @@ -1654,7 +1654,7 @@ RMKTIME EX DE,HL ; выход: нет ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME @@ -1663,14 +1663,14 @@ CHDIR: CALL GETWORD ; CALL NZ,OPENDIR RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// MKDIR: _mSavePath CALL GETWORD ; тест на допуст. имя и настр. на диск @@ -1824,7 +1824,7 @@ MKD11 POP AF AND A RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. ; @@ -1832,7 +1832,7 @@ MKD11 POP AF ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// RMDIR: _mSavePath CALL GETWORD diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index b672b3e..3809b5c 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -61,7 +61,7 @@ ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[CLOSE TASK]> ; -RST_0x00: JP LEAVE ; +RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12 ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -433,9 +433,11 @@ BootSector _sBOOT_SEC = BUFFERSplace.BootSector EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer -SECBUF EQU BUFFER +SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER CLEAR_ZONE.size EQU _sBuffers + + ASSERT (BUFFERSplace+_sBuffers)<#3FFF, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "BUFFERSplace.BootSector ",/H,BUFFERSplace.BootSector DISPLAY "BootSector ", /H, BootSector @@ -446,7 +448,6 @@ CLEAR_ZONE.size EQU _sBuffers /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -;!TEST FM_BUF _sFM=$ .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size @@ -492,7 +493,7 @@ SECBUF EQU BUFFER ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; ; !!!!! эта процедура затрётся после исполнения DEPLOY: -;Allocate memory + ;Allocate memory LD BC,USING_MEMPAGES*256 + BIOS.GetMem RST ToBIOS RET C ;R10 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index c48bba8..105f882 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -6,6 +6,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE ;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR @@ -20,17 +21,26 @@ ;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE ;--------------------------------------------------------------- + +////////////////////////////////////////////////////////////////////// +; Функция #47. Получение информации приложения. +; +; вход: HL - буфер данных +; B - номер подфункции: +; B=0 - получение параметров командной строки +; B=1 - получение полного пути к каталогу программы +; B=2 - получение полного пути и имени файла программы +; выход: нет ; ; APPLICATION INFO ;==================== -; ; B = 0 - GET APP_PARAM ; B = 1 - GET APP_PATH ; B = 2 - GET APP_FULLNAME -LAST_PSP_PTR DW 0 - -APPINFO INC B -APPINF0 DJNZ APPINF1 +////////////////////////////////////////////////////////////////////// +;LAST_PSP_PTR: DW 0 +APPINFO: INC B +APPINF0: DJNZ APPINF1 EX DE,HL XOR A LD (DE),A @@ -43,22 +53,25 @@ APPINF0 DJNZ APPINF1 AND A RET +; Получение параметров командной строки APPINF1: DJNZ APPINF2 EX DE,HL - LD HL,(LAST_PSP_PTR) +LAST_PSP_PTR+1: + LD HL,0 + LD C,(HL) INC HL ADD HL,BC INC HL INC HL PUSH HL - LD BC,#100 + LD BC,#100 ;!HARDCODE длина коммандной строки XOR A CPIR DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога DEC HL ;R10,5 - не тестил ;!!!!! - LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё + LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки LD A,'\' CPDR INC HL @@ -77,6 +90,7 @@ APPINF1: LD (DE),A RET +; Получение полного пути к каталогу программы APPINF2: DJNZ APPINF3 EX DE,HL @@ -96,19 +110,32 @@ APPINF3 LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET - -;=================== function 45H =================== - -; HL - Input command line - +////////////////////////////////////////////////////////////////////// +; Функция #45. Разбор командной строки. +; +; вход: HL - указатель командной строки +; DE - указатель на буфер пользователя +; B - номер подфункции: +; 0 - Разобрать строку +; 1 - Выделить имя диска +; 2 - Выделить директорию +; 3 - Выделить имя файла +; 4 - Выделить расширение файла +; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла +; 6 - Зарезервировано +; 7 - Выделить параметр командной строки +; 8 - Преобразовать из 11 символьного формата в формат ДОС +; 9 - Преобразовать из формата ДОС в 11 символьный формат +; выход: нет +////////////////////////////////////////////////////////////////////// GLOB_PR EQU 7 ;%10000000 DRIV_PR EQU 3 ;%00001000 PATH_PR EQU 2 ;%00000100 EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 -EX_PATH EXX - LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH +EX_PATH: EXX + LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!FIXIT не чё, что используется общий буфер? LD (NM_PATH),HL LD HL,NM_NAME_A LD (NM_NAME),HL @@ -119,30 +146,32 @@ EX_PATH EXX EXX INC B DEC B - JR Z,EX_GET_ALL ;0 + ;JR Z,EX_GET_ALL + JR Z,EX_FULL ;0 ; разобрать строку DEC B - JR Z,EX_GET_DRIVE ;1 + JR Z,EX_GET_DRIVE ;1 ; выделить имя диска DEC B - JR Z,EX_GET_PATH ;2 + JR Z,EX_GET_PATH ;2 ; выделить директорию DEC B - JR Z,EX_GET_NAME ;3 + JR Z,EX_GET_NAME ;3 ; выделить имя файла DEC B - JR Z,EX_GET_TYPE ;4 + JR Z,EX_GET_TYPE ;4 ; выделить расширение файла DEC B - JR Z,EX_GET_ALL_EX ;5 + JR Z,EX_GET_ALL_EX ;5 ; выделить диск, путь, файл и расш. DEC B - JR Z,EX_RESR ;6 + JR Z,EX_RESR ;6 ; зарезервировано DEC B - JP Z,GSWITCH ;7 + JP Z,GSWITCH ;7 ; выделить параметр ком-строки DEC B - JP Z,GETNAME ;8 + JP Z,GETNAME ;8 ; преобр. имя 11 -> 8.3 формат DEC B - JP Z,MASK ;9 -EX_RESR LD A,DSS_Error.sys.INVALID_FUNCTION + JP Z,MASK ;9 ; преобр. имя 8.3 -> 11 формат +EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET -EX_GET_DRIVE +; Выделить имя диска +EX_GET_DRIVE: LD (NM_DRIVE),DE CALL EX_FULL RET C @@ -161,22 +190,27 @@ ERGD001 LD A,DSS_Error.sys.INVALID_DRIVE SCF RET +; Выделить директорию EX_GET_PATH LD (NM_PATH),DE JR EX_FULL +; Выделить имя файла EX_GET_NAME LD (NM_NAME),DE JR EX_FULL +; Выделить расширение файла EX_GET_TYPE LD (NM_EXTN),DE JR EX_FULL -EX_GET_ALL - JR EX_FULL +; Разобрать строку +; EX_GET_ALL +; JR EX_FULL -EX_GET_ALL_EX +; Выделить диск, путь, файл и расш. +EX_GET_ALL_EX: EX DE,HL LD C,(HL) INC HL @@ -198,14 +232,14 @@ EX_GET_ALL_EX LD B,(HL) LD (NM_EXTN),BC EX DE,HL - JR EX_FULL - -EX_FULL EX AF,AF' + ;JR EX_FULL + ; Разобрать строку +EX_FULL: EX AF,AF' EXX XOR A LD HL,(NM_PATH) LD (HL),A - LD HL,(NM_NAME) + LD HL,(NM_NAME) ; адрес буфера под имя файла LD (HL),A LD HL,(NM_EXTN) LD (HL),A @@ -213,15 +247,15 @@ EX_FULL EX AF,AF' LD (HL),A EXX EX AF,AF' -EX_PAT0 LD DE,TMPBUF - LD BC,#0D01 -EX_PAT1 LD A,(HL) - CALL UPPER +EX_PAT0: LD DE,TMPBUF + LD BC,#0D01 ;!HARDCODE счетчики +EX_PAT1: LD A,(HL) + CALL UPPER ; a..z -> A..Z LD (DE),A INC HL INC DE - INC C - CP #5C ; \ + INC C ; ++счетчик + CP '\' JR Z,PATH_YEP CP ":" JR Z,DRIVE_YEP @@ -231,23 +265,22 @@ EX_PAT1 LD A,(HL) JR Z,GLOBP1 CP "*" JR Z,GLOBP1 -EX_PAT2 DJNZ EX_PAT1 +EX_PAT2: DJNZ EX_PAT1 LD A,DSS_Error.sys.INVALID_NAME SCF RET -GLOBP1 EX AF,AF' +GLOBP1: EX AF,AF' SET GLOB_PR,A EX AF,AF' JR EX_PAT2 -NAME_YEP - LD A,2 +NAME_YEP: LD A,2 CP C JR Z,NOFNAME PUSH HL LD HL,TMPBUF - LD DE,(NM_NAME) + LD DE,(NM_NAME) ; адрес буфера под имя файла LD B,0 DEC C DEC C @@ -262,12 +295,12 @@ NAME_YEP JR NZ,NOEXTN LD C,3 LD DE,(NM_EXTN) -EXTSK0 LD A,(HL) +EXTSK0: LD A,(HL) OR A JR NZ,EXTSK1 - LD A,#20 + LD A,' ' DEC HL -EXTSK1 LD (DE),A +EXTSK1: LD (DE),A INC HL INC DE DEC C @@ -275,19 +308,18 @@ EXTSK1 LD (DE),A XOR A LD (DE),A EX AF,AF' - SET EXTN_PR,A + SET EXTN_PR,A ; указано расш. файла EX AF,AF' -NOEXTN EX AF,AF' - SET NAM_PR,A +NOEXTN: EX AF,AF' + SET NAM_PR,A ; указано имя файла EX AF,AF' POP HL -NOFNAME - EX AF,AF' +NOFNAME: EX AF,AF' AND A RET -DRIVE_YEP - XOR A + +DRIVE_YEP: XOR A LD (DE),A PUSH HL LD HL,TMPBUF @@ -296,12 +328,11 @@ DRIVE_YEP LDIR POP HL EX AF,AF' - SET DRIV_PR,A + SET DRIV_PR,A ; указано имя диска EX AF,AF' JP EX_PAT0 -PATH_YEP - XOR A +PATH_YEP: XOR A LD (DE),A PUSH HL PUSH BC @@ -310,7 +341,7 @@ PATH_YEP CPIR DEC HL EX DE,HL - LD HL,TMPBUF + LD HL,TMPBUF ; 12 пробелов POP BC LD B,0 LDIR @@ -320,95 +351,121 @@ PATH_YEP EX AF,AF' JP EX_PAT0 -TMPBUF DB " ",#00 +TMPBUF: DB " ",#00 ; 12 пробелов -NM_DRIVE DW NM_DRIVE_A -NM_NAME DW NM_NAME_A -NM_EXTN DW NM_EXTN_A -NM_PATH DW NM_PATH_A +NM_DRIVE: DW NM_DRIVE_A +NM_NAME: DW NM_NAME_A +NM_EXTN: DW NM_EXTN_A +NM_PATH: DW NM_PATH_A +NM_DRIVE_A: BLOCK 9,0 -NM_DRIVE_A DB 0,0,0,0,0,0,0,0,0 +NM_NAME_A: DB " ",#00 -NM_NAME_A DB " ",#00 - -NM_EXTN_A DB " ",0 +NM_EXTN_A: DB " ",0 NM_PATH_A EQU BUFFER ;DS 256 -;===================== function 45h end ================ - +////////////////////////////////////////////////////////////////////// +; Функция #43. Выделить параметр командной строки. +; +; вход: HL - указатель командной строки +; DE - буфер для выдел. параметра +; выход: HL - указатель на след. параметр ком-строки +; CF=0 - конец строки не достигнут (есть другие параметры) +; CF=1 - конец строки (в буфер перенесён последний параметр или ноль) +; ;ENTRY: HL - COMMAND LINE ; DE - SWITCH BUFFER ;EXIT: BUFFER -GSWITCH XOR A +////////////////////////////////////////////////////////////////////// +GSWITCH: XOR A LD (DE),A -GSWIT1 LD A,(HL) +GSWIT1: LD A,(HL) INC HL CP " " RET C JR Z,GSWIT1 -GSWIT2 LD (DE),A +GSWIT2: LD (DE),A LD A,(HL) INC HL INC DE - CP "!" + CP " "+1 JR NC,GSWIT2 CP " " LD A,0 LD (DE),A RET -;RET: HL - ALL MEMORY -; BC - FREE MEMORY -FREEMEM LD C,#C0 +////////////////////////////////////////////////////////////////////// +; Функция #3C. Информация о памяти. +; +; вход: нет +; выход: HL - общее кол-во страниц +; BC - кол-во своб. страниц +////////////////////////////////////////////////////////////////////// +FREEMEM: LD C,BIOS.GetMemSize RST ToBIOS RET -; B - SIZE BLOCK -; RET: A - ID MEMORY BLOCK - -GETMEM LD C,#C2 +////////////////////////////////////////////////////////////////////// +; Функция #3D. Выделение блока памяти. +; +; вход: B - размер блока в страницах по 16kB +; выход: A - идентификатор блока памяти, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +GETMEM: LD C,BIOS.GetMem RST ToBIOS LD E,A - LD A,30 + LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY RET C LD D,#00 - LD HL,MEMTAB + LD HL,MEMTAB ; массив списка выдел. страниц ADD HL,DE - LD A,(TASK) + LD A,(TASK) ; уровень текущей программы LD (HL),A LD A,E AND A RET -; A - ID BLOCK -RETMEM LD E,A +////////////////////////////////////////////////////////////////////// +; Функция #3E. Освобождение блока памяти. +; +; вход: A - идентификатор блока памяти +; выход: A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +RETMEM: LD E,A LD D,#00 - LD HL,MEMTAB + LD HL,MEMTAB ; массив списка выдел. страниц ADD HL,DE - LD A,(TASK) + LD A,(TASK) ; уровень текущей программы CP (HL) LD A,DSS_Error.sys.INVALID_MEMORY_HND SCF RET NZ PUSH DE LD A,E - LD C,#C3 + LD C,BIOS.FreeMem RST ToBIOS POP DE LD A,DSS_Error.sys.INVALID_MEMORY_HND RET C LD HL,MEMTAB ADD HL,DE - LD (HL),#00 XOR A + LD (HL),A RET -; A - ID BLOCK -; B - NEW SIZE -SETMEM LD E,A +////////////////////////////////////////////////////////////////////// +; Функция #3F. Изменение блока памяти. +; +; вход: A - идентификатор блока памяти +; B - новый размер блока +; выход: A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETMEM: LD E,A LD D,#00 LD HL,MEMTAB ADD HL,DE @@ -428,51 +485,52 @@ SETMEM LD E,A CP D RET Z JR C,INCMEM -DECMEM LD B,D +DECMEM: LD B,D LD A,E - LD C,#9D + LD C,BIOS.DivMemBlocks RST ToBIOS LD A,B - LD C,#C3 + LD C,BIOS.FreeMem RST ToBIOS XOR A RET -INCMEM LD A,D +; Добавить страниц памяти к блоку +INCMEM: LD A,D SUB B LD B,A LD C,E PUSH BC - LD C,#C2 + LD C,BIOS.GetMem RST ToBIOS POP BC LD B,A - LD A,30 + LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY RET C LD A,C - LD C,#9E + LD C,BIOS.MergeMemBlocks RST ToBIOS XOR A RET -SIZEBLK LD B,#FF +SIZEBLK: LD B,#FF LD C,A -BLK001 INC B +.loop: INC B PUSH BC LD A,C - LD C,#C4 + LD C,BIOS.GetMemPage RST ToBIOS POP BC - JR NC,BLK001 + JR NC,.loop OR A SCF RET Z XOR A RET -LEAVMEM LD HL,MEMTAB - LD BC,256 -LEVMEM LD A,(TASK) +LEAVMEM: LD HL,MEMTAB + LD BC,256 ;!HARDCODE размер блока страниц ОЗУ +.loop: LD A,(TASK) CPIR RET NZ PUSH HL @@ -482,48 +540,35 @@ LEVMEM LD A,(TASK) LD DE,MEMTAB SBC HL,DE LD A,L - CALL RETMEM + CALL RETMEM ; освоб. блок памяти POP BC POP HL - JR LEVMEM + JP .loop -; B - LOGICAL PAGE -; A - ID BLOCK -; HL - BIT 15&14 WINDOW -; RET: A - PAGE (WIN) +////////////////////////////////////////////////////////////////////// +; Функция #38. Подключение страницы памяти. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 ; if B = 0FFh, then logical page number got from DE -SETWIN BIT 7,H ;if 08000h or high? - JR Z,SETWIN1 ;no, go to open in SLOT1 - BIT 6,H ;if 0C000h or high? - JR Z,SETWIN2 ;no, go to open in SLOT2 - JR SETWIN3 ;yes, go to open in SLOT3 - -; B - LOGICAL PAGE -; A - ID BLOCK -; RET: A - PAGE (WIN) -SETWIN1 LD C,#C4 - EX DE,HL - RST ToBIOS - EX DE,HL - RET C - LD C,SLOT1 - IN B,(C) - OUT (C),A - LD A,B - RET - -SETWIN2 LD C,#C4 - EX DE,HL - RST ToBIOS - EX DE,HL - RET C - LD C,SLOT2 - IN B,(C) - OUT (C),A - LD A,B - RET - -SETWIN3 LD C,#C4 +////////////////////////////////////////////////////////////////////// +SETWIN: BIT 7,H ; if #8000 or high? + JR Z,SETWIN1 ; no, go to open in SLOT1 + BIT 6,H ; if #C000 or high? + JR Z,SETWIN2 ; no, go to open in SLOT2 + //JR SETWIN3 ; yes, go to open in SLOT3 +////////////////////////////////////////////////////////////////////// +; Функция #3B. Подключение страницы памяти в третье окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN3: LD C,BIOS.GetMemPage EX DE,HL RST ToBIOS EX DE,HL @@ -534,6 +579,83 @@ SETWIN3 LD C,#C4 LD A,B RET +////////////////////////////////////////////////////////////////////// +; Функция #39. Подключение страницы памяти в первое окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN1: LD C,BIOS.GetMemPage + EX DE,HL + RST ToBIOS + EX DE,HL + RET C + LD C,SLOT1 + IN B,(C) + OUT (C),A + LD A,B + RET + +////////////////////////////////////////////////////////////////////// +; Функция #3A. Подключение страницы памяти во второе окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN2 LD C,BIOS.GetMemPage + EX DE,HL + RST ToBIOS + EX DE,HL + RET C + LD C,SLOT2 + IN B,(C) + OUT (C),A + LD A,B + RET + +;!TODO если надо будет сэкономить память, но привязаться к номерам слотов +; SETWIN1: LD H,SLOT1 : JR SETWIN.ALL +; SETWIN2: LD H,SLOT2 : JR SETWIN.ALL +; SETWIN3: LD H,SLOT3 : JR SETWIN.ALL +; SETWIN: LD C,A +; LD A,H +; AND %1100'0000 +; JR NZ,.no_error +; OR %0100'0000 +; .no_error: RRСA +; OR %100'0010 +; LD H,A ;SLOT number +; LD A,C +; .ALL: LD C,BIOS.GetMemPage +; EX DE,HL +; RST ToBIOS +; EX DE,HL +; RET C +; LD C,H ;SLOT number +; IN B,(C) +; OUT (C),A +; LD A,B +; RET +; +; // SLOT0 - #82 %1000'0010 +; // SLOT0 - #A2 %1010'0010 +; // SLOT0 - #C2 %1100'0010 +; // SLOT0 - #E2 %1110'0010 + + +;///////////////////////////////////////////////////////////////////// +; Функция #40. Выполнить файл. +; +; вход: HL - указатель на имя файла +; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) +; B=1 - загрузить и выполнить программу с полным путём до программы +; выход: A - код завершения, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// EXEC: _mSavePath INC B ;R03 @@ -586,9 +708,6 @@ NEXTPATHI: PUSH BC EX DE,HL CALL Z,GOTO_CURDIR -; -;DBUG CALL DPRINT -; CALL CHDIR JR C,BADPATH LD HL,EXEBUFF @@ -608,15 +727,12 @@ PATHFOUND: POP BC LD A,B OUT (SLOT3),A -; LD A,DSS_Error.sys.PATH_NOT_FOUND ;????? нужен ли тут код ошибки? + LD A,DSS_Error.sys.PATH_NOT_FOUND RET GOTO_CURDIR: PUSH HL LD HL,TMP_CURDIR -; -;DBUG CALL DPRINT -; CALL CHDIR POP HL RET @@ -639,7 +755,7 @@ NEXTAR: LD (HL),C ;R04 ;R04 INC HL INC B NEXTRT: LD A,(DE) - CP #5C ;\ + CP '\' JR NZ,NEXTCH NEXTDR: SET ABSOLUTE_DIR,C NEXTRL: ;SET RELATIVE_DIR,C ;!TODO ???? @@ -662,41 +778,58 @@ NEXTCH: LD A,(DE) ENVPATH DB "PATH=",0 -;;; DEBUG ;;; - -;DPRINT -; PUSH HL -; CALL PCHARS -; LD HL,C1310 -; CALL PCHARS -; POP HL -; RET -; -;C1310 DB 13,10,0 - ;;; ; !TODO СДЕЛАТЬ СТРУКТУРОЙ PATH_PNT_ARRAY EQU #FC80 TMP_CURDIR EQU #FD00 ENVTEMP EQU #FE00 -INCTASK LD HL,TASK ;R08 +INCTASK: LD HL,TASK ;R08 INC (HL) ;R08 RET ;R08 -DECTASK LD HL,TASK ;R08 +DECTASK: LD HL,TASK ;R08 DEC (HL) ;R08 RET ;R08 -EXEC0: - LD (CMDLINE),HL +;------------------------------------------------------------------------ +; Загрузить и выполнить программу. +; функ. 40h, B=0. +; +; 1) Открывает exe-файл на чтение; +; 2) Считывает в рабочую область префикс exe-файла; +; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного +; загрузчика, если его размер не равен нулю; +; 4) Сохраняет стек; +; 5) Подключает страницы из выделенного блока; +; 6) Строит префикс запуска программы и устанавливает на него регистр IX; +; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения +; кода в памяти); +; 8) Закрывает exe-файл, если это не первичный загрузчик; +; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека); +; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); +; +; Префикс запуска файла: +; +; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком +; -02 1 db ? ; Идентификатор блока памяти +; -01 1 db ? ; Уровень текущей программы +; +00 1 db ? ; Длина ком-строки +; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем +;------------------------------------------------------------------------ +EXEC0: LD (CMDLINE),HL CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME LD HL,(CMDLINE) JR C,EXEC0_SHORT -EXEC1: - LD (CMDLINE),HL - LD A,#01 +EXEC1: CALL EXEC_1 + SCF + RET ; File not found - exit + + +; при выходе с ошибкой, в регистре А - код ошибки +EXEC_1: LD (CMDLINE),HL + LD A,#01 ; %7600000R = !FAT_ATTR LD (ACCESS),A CALL GETWORD RET C @@ -708,49 +841,32 @@ EXEC1: LD A,3 RET C CALL INCTASK ;R08 -;R08 LD HL,TASK -;R08 INC (HL) CALL OPENEXE - JP NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM + JR NC,.noError CALL DECTASK ;R08 - RET ;RET C! + AND A + RET +.noError: + POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру + JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM -;R07 -; !FIXIT EXEC0_SHORT - копия EXEC1 до CALL DECTASK + + ;SHORT NAME + ;TRY TO FIND IN CURRENT DIRECTORY EXEC0_SHORT: -;SHORT NAME -; TRY TO FIND IN CURRENT DIRECTORY -; LD (CMDLINE),HL - LD A,#01 ; %7600000R = !FAT_ATTR - LD (ACCESS),A - CALL GETWORD + CALL EXEC_1 RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK - RET C - CALL TST_EXT - LD A,3 - RET C - CALL INCTASK -;R08 LD HL,TASK -;R08 INC (HL) - CALL OPENEXE - JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM - CALL DECTASK ;R08 -;R07 -;FILE NO FOUND, SEARCHING IN PATH - -; GET PATH AND ETC. + ;FILE NO FOUND, SEARCHING IN PATH + ; GET PATH AND ETC. LD HL,ENVPATH LD DE,ENVTEMP - LD B,1 + LD B,Dss.Environ.Get CALL ENVIRON LD HL,(CMDLINE) LD DE,EXEBUFF -COPYEXN LD A,(HL) +COPYEXN: LD A,(HL) LDI OR A JR NZ,COPYEXN @@ -759,9 +875,7 @@ COPYEXN LD A,(HL) LD HL,(CMDLINE) JR EXEC1 -;EXEC00 - -EXEC02 LD (EXE_FM),A +EXEC02: LD (EXE_FM),A LD HL,EXEBUFF LD DE,#0080 ;!#0200(512) ;R02 LD A,(EXE_FM) @@ -770,12 +884,12 @@ EXEC02 LD (EXE_FM),A LD IX,EXEBUFF LD HL,(EXEBUFF) LD DE,'E'+'X'*256 - AND A + ;AND A ; не нужно, если бы был CF=1, то чуть выше мы бы ушли на JP C,ERREXE SBC HL,DE LD A,DSS_Error.sys.INVALID_EXE SCF JP NZ,ERREXE - LD A,(IX+3) + LD A,(IX+3) ;!HARDCODE OR A LD A,DSS_Error.sys.UNKNOWN_EXE SCF @@ -793,8 +907,12 @@ EXEC02 LD (EXE_FM),A LD A,E OR D JP NZ,PRELOAD - LD HL,#0000 - LD IX,#0000 + ; A=0 + LD H,A + LD L,A + LD XL,A + LD XH,A + ; LD B,#02 LD A,(EXE_FM) CALL MOVE_FP @@ -815,150 +933,164 @@ EXEC02 LD (EXE_FM),A OR XL JR Z,NOINK INC HL -NOINK LD A,H +NOINK: LD A,H OR A JP NZ,ERREXE0 LD B,L - CALL GETMEM - JP C,ERREXE0 - LD (EXE_MEM),A - EXX - POP DE - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL - EXX -;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; - LD DE,RAMMAP - LD BC,#00C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#01C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#02C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#03C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A -;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; - LD HL,(CMDLINE) - LD DE,SECBUF+1 - CALL SCOPYS - LD A,#80 - SUB B - LD (SECBUF),A - LD SP,EXEBUFF+510 ;R02 - LD A,DSS_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(EXEBUFF.LD_ADDR) - LD DE,RAMMAP - LD A,H - AND #C0 - CP #40 - JR Z,FR4000 - CP #80 - JR Z,FR8000 - CP #C0 - JR Z,FRC000 -FR4000 LD A,(DE) - OUT (SLOT1),A - INC DE -FR8000 LD A,(DE) - OUT (SLOT2),A - INC DE -FRC000 LD A,(DE) - OUT (SLOT3),A - CALL M_PSP - LD HL,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) - LD B,#00 - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;R02 - ;R02 + ;!FIXIT double 1 + CALL GETMEM + JP C,ERREXE0 + LD (EXE_MEM),A + EXX + POP DE ;снимаем со стека адрес возврата + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX +;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; + LD A,(EXE_MEM) + LD DE,RAMMAP + LD BC,0*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,1*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,2*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,3*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A +;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; + LD HL,(CMDLINE) + LD DE,SECBUF+1 + CALL SCOPYS + LD A,#80 + SUB B + LD (SECBUF),A + ;R02 + LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + ; + LD A,DSS_PAGE ;!FIXIT втыкать страницы приложения + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(EXEBUFF.LD_ADDR) + LD DE,RAMMAP + LD A,H + AND #C0 + CP #40 + JR Z,FR4000 + CP #80 + JR Z,FR8000 + CP #C0 + JR Z,FRC000 +FR4000: LD A,(DE) + OUT (SLOT1),A + INC DE +FR8000: LD A,(DE) + OUT (SLOT2),A + INC DE +FRC000: LD A,(DE) + OUT (SLOT3),A + CALL M_PSP + LD HL,(EXEBUFF.OFFCOD2) + LD IX,(EXEBUFF.OFFCOD1) + LD B,Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + ; + ; LD DE,(EXEBUFF.LD_ADDR) - LD HL,#0000 - AND A + XOR A + LD H,A + LD L,A SBC HL,DE - EX DE,HL - LD HL,(EXEBUFF.LD_ADDR) - LD A,(EXE_FM) - CALL READ - LD A,(EXE_FM) - CALL CLOSE -;R09 - _mRestorePath -;R09 - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(EXEBUFF.PC_REG) - LD DE,RETFAR - PUSH DE - PUSH HL - RET -RETFAR JP LEAVE + EX DE,HL ; de=число чит. байт + LD HL,(EXEBUFF.LD_ADDR) ; буфер + LD A,(EXE_FM) ; дескр. файла + CALL READ ; чтение из файла + LD A,(EXE_FM) ; дескр. файла + CALL CLOSE ; закрыть файл -TST_EXT LD HL,EXE_EXT + ;!FIXIT double 2 + ;R09 + _mRestorePath + ; + LD SP,(EXEBUFF.SP_REG) + LD HL,(EXEBUFF.LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(EXEBUFF.PC_REG) + LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" + PUSH DE + PUSH HL + RET + ; +;[ ] +RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN + JP LEAVE ; завершить программу (процесс) + +;------------------------------------------------- +; Если расш. файла не задано, задать "exe". +; Если расш. файла задано, сравнить его с "exe". +;------------------------------------------------- +TST_EXT: LD HL,EXE_EXT ; "EXE" LD DE,MASKARE+8 LD B,3 LD A,(DE) - CP #20 - JR NZ,TSTE1 + CP ' ' + JR NZ,.loop ; задано расш. LDI LDI LDI XOR A RET -TSTE1 LD A,(DE) +; сравнить расш. с "EXE" +.loop: LD A,(DE) CP (HL) SCF - RET NZ + RET NZ ; не совпадает INC HL INC DE - DJNZ TSTE1 - XOR A + DJNZ .loop + XOR A ; Ok RET -ERREXE0 LD A,30 -ERREXE PUSH AF +ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY +ERREXE: PUSH AF LD A,(EXE_FM) CALL CLOSE - LD HL,TASK - DEC (HL) + CALL DECTASK POP AF RET -PRELOAD EX DE,HL +PRELOAD: EX DE,HL LD DE,(EXEBUFF.LD_ADDR) LD A,D AND #3F @@ -974,110 +1106,134 @@ PRELOAD EX DE,HL OR L JR Z,NOINK2 INC B -NOINK2 CALL GETMEM - JP C,ERREXE0 - LD (EXE_MEM),A - EXX - POP DE - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL - EXX - LD DE,RAMMAP - LD BC,#00C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#01C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#02C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#03C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - LD HL,(CMDLINE) - LD DE,SECBUF+1 - CALL SCOPYS - LD A,#80 - SUB B - LD (SECBUF),A - LD SP,EXEBUFF+510 - LD A,DSS_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(EXEBUFF.LD_ADDR) - LD DE,RAMMAP - LD A,H - AND #C0 - CP #40 - JR Z,FR4000H - CP #80 - JR Z,FR8000H - CP #C0 - JR Z,FRC000H -FR4000H LD A,(DE) - OUT (SLOT1),A - INC DE -FR8000H LD A,(DE) - OUT (SLOT2),A - INC DE -FRC000H LD A,(DE) - OUT (SLOT3),A - CALL M_PSP - LD HL,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) - LD B,#00 - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;R02 - ;R02 - LD HL,(EXEBUFF.LD_ADDR) - LD DE,(EXEBUFF.LOADER) - LD A,(EXE_FM) - CALL READ -;R09 - _mRestorePath -;R09 - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(EXEBUFF.PC_REG) - LD DE,RETFAR - PUSH DE - PUSH HL - RET +NOINK2: + ;!FIXIT double 1 + CALL GETMEM + JP C,ERREXE0 + LD (EXE_MEM),A + EXX + POP DE + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX +;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; + LD A,(EXE_MEM) + LD DE,RAMMAP + LD BC,#00*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,1*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,2*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,3*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A +;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; + LD HL,(CMDLINE) + LD DE,SECBUF+1 + CALL SCOPYS + LD A,#80 + SUB B + LD (SECBUF),A + ;R02 + LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + ; + LD A,DSS_PAGE + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(EXEBUFF.LD_ADDR) + LD DE,RAMMAP + LD A,H + AND #C0 + CP #40 + JR Z,FR4000H + CP #80 + JR Z,FR8000H + CP #C0 + JR Z,FRC000H +FR4000H: LD A,(DE) + OUT (SLOT1),A + INC DE +FR8000H: LD A,(DE) + OUT (SLOT2),A + INC DE +FRC000H: LD A,(DE) + OUT (SLOT3),A + CALL M_PSP + LD HL,(EXEBUFF.OFFCOD2) + LD IX,(EXEBUFF.OFFCOD1) + LD B,Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + ; + ; + LD HL,(EXEBUFF.LD_ADDR) ; буфер + LD DE,(EXEBUFF.LOADER) ; число чит. байт + LD A,(EXE_FM) ; дескр. файла + CALL READ ; чтение из файла + + ;!FIXIT double 2 + ;R09 + _mRestorePath + ; + LD SP,(EXEBUFF.SP_REG) + LD HL,(EXEBUFF.LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(EXEBUFF.PC_REG) + LD DE,RETFAR + PUSH DE + PUSH HL + RET + ; + +;///////////////////////////////////////////////////////////////////// +; Функция #41. Завершить программу (процесс). +; +; вход: B - код завершения +; выход: A - код ошибки, если CF=1 +; +; Выход из EXE-файла: +; +; 1) Освобождаются все блоки памяти которые выделялась данному приложению. +; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. +; 3) Вспоминается стек. +; 4) В регистр A помещается код возврата и выполняется RET. +; +;///////////////////////////////////////////////////////////////////// LEAVE: LD A,B LD (ERLEVEL),A CALL LEAVMEM - LD HL,TASK - DEC (HL) + CALL DECTASK LD SP,(EXSTACK) POP AF POP HL @@ -1093,13 +1249,17 @@ LEAVE: LD A,B EX DE,HL LD A,(ERLEVEL) AND A - JP (HL) + ;R12 + JR Z,.exit + SCF + ; +.exit: JP (HL) -WAIT LD A,(ERLEVEL) +WAIT: LD A,(ERLEVEL) AND A RET -M_PSP LD HL,(EXEBUFF.LD_ADDR) +M_PSP: LD HL,(EXEBUFF.LD_ADDR) DEC H LD D,H LD E,L @@ -1126,62 +1286,62 @@ M_PSP LD HL,(EXEBUFF.LD_ADDR) LD (IX-2),A LD A,(EXE_FM) LD (IX-3),A -;R05 - INC HL - LD (HL),B - INC HL - CALL CURRDSK - ADD A,'A' - LD (HL),A - INC HL - LD A,':' - LD (HL),A - INC HL - PUSH HL - CALL CURRDIR - POP HL - XOR A - LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH - CPIR ;!FIXIT нет проверки на выход по BC=0 - DEC HL - DEC HL - LD A,'\' - CP (HL) - INC HL - JR Z,YP_ESLA - LD (HL),A - INC HL -YP_ESLA EX DE,HL - LD HL,TMPNAME -ENMLP1 LD A,(HL) - LDI - CP '!' - JR NC,ENMLP1 - DEC DE - XOR A - LD (DE),A - LD (LAST_PSP_PTR),IX -;R05 + ;R05 + INC HL + LD (HL),B + INC HL + CALL CURRDSK + ADD A,'A' + LD (HL),A + INC HL + LD A,':' + LD (HL),A + INC HL + PUSH HL + CALL CURRDIR + POP HL + XOR A + LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH + CPIR ;!FIXIT нет проверки на выход по BC=0 + DEC HL + DEC HL + LD A,'\' + CP (HL) + INC HL + JR Z,.YP_ESLA + LD (HL),A + INC HL +.YP_ESLA: EX DE,HL + LD HL,TMPNAME +.loop: LD A,(HL) + LDI + CP ' '+1 + JR NC,.loop + DEC DE + XOR A + LD (DE),A + LD (LAST_PSP_PTR),IX + ; RET -SCOPYS: LD BC,#80*256 + '!' -SCOP0 LD A,(HL) +SCOPYS: LD BC,#80*256 + ' '+1 +.loop: LD A,(HL) CP C - JR C,SCOP1 + JR C,.copy INC HL - DJNZ SCOP0 + DJNZ .loop XOR A LD (DE),A LD B,#80 RET -SCOP1 LD BC,#8020 -SCOP2 LD A,(HL) +.copy: LD BC,#80*256 + ' ' +.loop2: LD A,(HL) LD (DE),A INC HL INC DE CP C RET C - DJNZ SCOP2 + DJNZ .loop2 RET diff --git a/DSS/build.txt b/DSS/build.txt index dec2bf5..86ee83a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -19 \ No newline at end of file +40 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index afe66b1..94cb0e3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit afe66b1f354cab8d2780826697cf371d1d9e389d +Subproject commit 94cb0e39f321bd11519008801187d93eacb280f2 From 8baff9d9281cc1e259a3f5c0fb4a3f93d82f46b5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 22 Jul 2023 02:14:59 +1000 Subject: [PATCH 021/219] ... --- BOOT/BOOTNAME.ASM | 155 ----------------------------------- {BOOT => SYS}/DSSBOOT.ASM | 0 {BOOT => SYS}/README.TXT | 0 BOOT/BOOT.ASM => SYS/SYS.ASM | 0 4 files changed, 155 deletions(-) delete mode 100644 BOOT/BOOTNAME.ASM rename {BOOT => SYS}/DSSBOOT.ASM (100%) rename {BOOT => SYS}/README.TXT (100%) rename BOOT/BOOT.ASM => SYS/SYS.ASM (100%) diff --git a/BOOT/BOOTNAME.ASM b/BOOT/BOOTNAME.ASM deleted file mode 100644 index 33ba48a..0000000 --- a/BOOT/BOOTNAME.ASM +++ /dev/null @@ -1,155 +0,0 @@ -;[BEGIN] -; -; BOOTNAME.EXE -; - MODULE BOOTname - - ORG #8100-512 - INCLUDE "dss.inc" - DB "EXE" ;EXE ID - DB #00 ;EXE VERSION - DW #0200 ;CODE OFFSET LOW - DW #0000 ;CODE OFFSET HIGH - DW #0000 ;END-BEG ;PRIMARY LOADER - DW #0000 ; - DW #0000 ;RESERVED - DW #0000 ; - DW #8100 ;LOAD ADDRESS - DW #8100 ;START ADDRESS - DW #BFFF ;STACK ADDRESS - DS 490 - -START - LD BC,0*256+DSS_BOOTDSK - LD C,2 ;curdisk - RST #10 - JR C,NERR - ADD A,"A" ;correct to the human format - LD (BOOTDRIVE),A - LD HL,BOOTSTRING - LD BC,2*256+DSS_ENVIRON - RST #10 -NERR CALL C,ERROR - LD C,DSS_EXIT - RST #10 - RET - -BOOTSTRING DB "BOOTDISK=" -BOOTDRIVE DB "C:",0 - -CRLF LD A,#0D - LD C,DSS_PUTCHAR - RST ToDSS - LD A,#0A - LD C,DSS_PUTCHAR - RST ToDSS - RET - -ERROR LD E,A - LD D,0 - JP ERR_MSG - -ERR_MSG CALL FMESAGE - CALL PRINTZ - CALL CRLF - CALL CRLF - RET - -FMESAGE INC DE - LD HL,ERR0 - LD BC,ERR1-ERR0 -LCPIR XOR A - CPIR - RET PO - RET NZ - DEC DE - LD A,D - OR E - JP NZ,LCPIR - RET - -PUTPRM LD BC,15 -PUTPRMA LD A,(HL) - LDI - RET PO - OR A - JR NZ,PUTPRMA - RET - -PRINTZ LD A,(HL) - INC HL - OR A - RET Z - CP "%" - JR NZ,PRINTZ2 - LD A,(HL) - INC HL - SUB "1" - PUSH HL - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,PRM1 - ADD HL,BC - LD C,DSS_PCHARS - RST #10 - POP HL - JR PRINTZ -PRINTZ2 LD C,DSS_PUTCHAR - RST #10 - JP PRINTZ - -PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -ERR0 DB #00 - DB "Bad command or file name",0 - DB "Invalid function",0 - DB "Invalid drive number",0 - DB "File not found",0 - DB "Path not found",0 - DB "Invalid handle",0 - DB "Extended error 6",0 - DB "File exist",0 - DB "File read only",0 - DB "Root overflow",0 - DB "No free space",0 - DB "Directory not empty",0 - DB "Can't delete current directory",0 - DB "Invalid media",0 - DB "Unknown operation",0 - DB "Directory exist",0 - DB "Invalid filename",0 - DB "Invalid EXE-file",0 - DB "Not supported EXE-file",0 - DB "Access denied",0 - DB "Not ready",0 - DB "Seek error",0 - DB "Sector not found",0 - DB "CRC error",0 - DB "Write protect",0 - DB "Read error",0 - DB "Write error",0 - DB "Drive failure",0 - DB "Extended error 28",0 - DB "Extended error 29",0 - DB "No free memory",0 - DB "Invalid memory block",0 - DB "Extended error 32",0 - DB "Extended error 33",0 - DB "Extended error 34",0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -ERR1 -; - ENDMODULE -; \ No newline at end of file diff --git a/BOOT/DSSBOOT.ASM b/SYS/DSSBOOT.ASM similarity index 100% rename from BOOT/DSSBOOT.ASM rename to SYS/DSSBOOT.ASM diff --git a/BOOT/README.TXT b/SYS/README.TXT similarity index 100% rename from BOOT/README.TXT rename to SYS/README.TXT diff --git a/BOOT/BOOT.ASM b/SYS/SYS.ASM similarity index 100% rename from BOOT/BOOT.ASM rename to SYS/SYS.ASM From 5d914d4e5c5e7748eef195741fe83fecc084d209 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 22 Jul 2023 02:15:05 +1000 Subject: [PATCH 022/219] ... --- Console/CONSOLE.ASM | 40 ++++++------ DSS/DOS_X.ASM | 24 +++++-- DSS/DRV-MAIN.ASM | 2 +- DSS/ENVIRON.ASM | 121 ++++++++++++++++++++++++----------- DSS/EXECUTE.ASM | 45 +++++++------ DSS/Media_drivers/FDD.ASM | 4 ++ DSS/Media_drivers/Shared.ASM | 80 +++++++++++++++-------- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- SYS/DSSBOOT.ASM | 27 +++----- SYS/SYS.ASM | 1 - 11 files changed, 215 insertions(+), 133 deletions(-) diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 7598af9..8e339bc 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -1766,21 +1766,21 @@ GETyesZERO: RET */ -HELP LD DE,HELPMSG +HELP: LD DE,HELPMSG CALL MESSAGE RET -CEXIT LD A,(TASKX) +CEXIT: LD A,(TASKX) DEC A DEC A RET Z POP HL -QUIT LD B,0 +QUIT: LD B,0 LD C,Dss.Exit RST ToDSS RET -ERR_MSG INC DE +ERR_MSG: INC DE LD HL,ERR0 LD BC,ERR1-ERR0 CALL LCPIR @@ -1788,12 +1788,12 @@ ERR_MSG INC DE CALL CRLF JP CRLF -MESSAGE CALL FMESAGE +MESSAGE: CALL FMESAGE CALL PRINTZ CALL GETXY RET -FMESAGE INC DE +FMESAGE: INC DE LD HL,MSG0 LD BC,MSG1-MSG0 LCPIR: XOR A @@ -1814,8 +1814,8 @@ LCPIR: XOR A RET -PUTPRM LD BC,15 -PUTPRMA LD A,(HL) +PUTPRM: LD BC,15 +PUTPRMA: LD A,(HL) LDI RET PO OR A @@ -1833,12 +1833,12 @@ PUTPRMA LD A,(HL) // ret -PRINTZ LD A,(HL) +PRINTZ: LD A,(HL) INC HL OR A RET Z CP "%" - JR NZ,PRINTZ2 + JR NZ,.char LD A,(HL) INC HL SUB "1" @@ -1854,24 +1854,24 @@ PRINTZ LD A,(HL) LD C,Dss.PChars RST ToDSS POP HL - JR PRINTZ -PRINTZ2 LD C,Dss.PutChar + JP PRINTZ +.char: LD C,Dss.PutChar RST ToDSS JP PRINTZ -ROOT DB '\',0 +ROOT: DB '\',0 -ALLFS DB "*.*",0 +ALLFS: DB "*.*",0 -SER_NUM DB "C37F-73AB",0 +SER_NUM: DB "C37F-73AB",0 //SER_NUM DB "XXXX-XXXX",0 -EXTBF BLOCK 4,0 +EXTBF: BLOCK 4,0 -BATBF DB "BAT" +BATBF: DB "BAT" -ECHOON DB "ON",0 -ECHOOFF DB "OFF",0 +ECHOON: DB "ON",0 +ECHOOFF: DB "OFF",0 DIR1MSG EQU 0 @@ -1887,7 +1887,7 @@ DIR2MSG EQU 9 DIR3MSG EQU 10 HELPMSG EQU 11 -MSG0 DB 0 +MSG0: DB 0 DB "Volume in drive %1 has no label",CR,LF ; !FIXIT DB "Volume Serial number is %2",CR,LF DB "Directory of %3",CR,LF,CR,LF,0 diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 48ff8c8..814c550 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -46,10 +46,15 @@ VERSION: //OSINFO: //OSINFO_SIG: DB "OSINFOSTRUCTURE",0 +//BOOTDRV: DB 0 -;R09 -BOOTDRV: DB #FF - +;///////////////////////////////////////////////////////////////////// +; Функция #09. Номер системного диска. +; Возвращает номер диска, c которого загружена система. +; +; вход: B = 0 (01h - исп. boot-загрузчик системы) +; выход: A - номер системного диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// BOOTDSK: INC B DEC B @@ -61,11 +66,14 @@ BOOTDSK: RET ;GET BOOT DISK -GETBOOT LD A,(BOOTDRV) +GETBOOT: +BOOTDRV+1: LD A,0 ;R09 AND A RET ;SET BOOT DISK +; Сообщить DSS с какого диска загружается система. +; Исп. загрузчик системы для иниц. ячейки "boot_disk". SETBOOT: LD B,A LD C,0 @@ -153,7 +161,7 @@ FRESP2: LD D,B AND A RET -LDRIVE: DB #02 +LDRIVE: DB #FF TDRIVE: DB #00 TCLUST: DW #0000 TCOUNT: DW #0000 @@ -519,6 +527,12 @@ BACK_CUR_PATH: ;R11 ;R12 +;///////////////////////////////////////////////////////////////////// +; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. +; +; вход: нет +; выход: A - номер последнего лог. диска в системе +;///////////////////////////////////////////////////////////////////// SCANDRV: ;!TEST в DRV-MAIN могут быть проблемы с прерываниями ;DI diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index d5ccf47..34ed599 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -58,7 +58,7 @@ A0010: ;JP RST_10 ; A0018: PUSH AF ; PUSH BC ; MAIN_PG_NUMBER+2: ; - LD BC,0*256+SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? + LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? JP PORTAL.outDRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index 297be7e..15d2eb9 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -4,38 +4,55 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте ;!TODO проверить как у Саймана сделано +;R03 09-03-2007 VAS Функция ENV_EX теперь обрезает слишком длинную строку перед выходом ;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV ;--------------------------------------------------------------- -; LD HL,MYVAR -; CALL SETENV -; LD HL,MYVAR2 -; LD DE,MYBUF -; CALL GETENV - +;///////////////////////////////////////////////////////////////////// +; Функция #46. Системное окружение. +; +; вход: B - номер подфункции: +; B=0, получение системного окружения. +; HL - буфер +; B=1, получить переменную окружения. +; HL - имя переменной +; DE - буфер для значения переменной +; B=2, установить/удалить переменную окружения +; HL - ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ +; В конце строки ноль. +; выход: A - состояние, если CF=0 +; DE - указывает на конец буфера (только для B=1) +; A=#FF - переменная обнаружена +; A=0 - переменная не обнаружена +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// ENVIRON: INC B - JR Z,INITENV ;B=FF + JR Z,INITENV ; B=#FF DEC B - JR Z,READENV ;B=0 + JR Z,READENV ; B=0. получить сист. окружение DEC B - JP Z,GETENV ;B=1 + JP Z,GETENV ; B=1. получить перем. окружения DEC B - JP Z,SETENV ;B=2 + JP Z,SETENV ; B=2. установить/удалить перем. окружения LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET +;------------------------------------------------- +; Инициализация буфера переменных окружения +;------------------------------------------------- INITENV: SET_PAGE_X ENVPAGE PUSH AF - ;!TEST + ;R02 LD A,(BOOTDRV) ADD A,'A' LD (DEFAULT_ENV.boot_disk),A ; - LD DE,ENVIRONMENT + LD DE,ENVIRONMENT ; начало буфера переменных окружения XOR A LD (DE),A INC DE @@ -53,6 +70,9 @@ INITENV: AND A RET +;------------------------------------------------- +; Получить сист. окружение +;------------------------------------------------- READENV: PUSH HL @@ -82,39 +102,48 @@ READENV: OR C EXX JR NZ,.loop - XOR A + //XOR A + ;A=0 RET +;------------------------------------------------- +; Получить переменную окружения +;------------------------------------------------- GETENV: PUSH DE - CALL ENV_EX + CALL ENV_EX ; скопир. строку перем. окруж. в буферы SET_PAGE_X ENVPAGE EX AF,AF' - CALL F_ENV + CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE POP DE LD A,0 LD (DE),A - JR NC,GE_1 -GE_0: LD A,(HL) + JR NC,.exit +.loop: LD A,(HL) LDI OR A - JR NZ,GE_0 + JR NZ,.loop DEC DE ;R01 LD A,#FF -GE_1: EX AF,AF' +.exit: EX AF,AF' OUT (SLOT3),A EX AF,AF' AND A RET -SETENV: CALL ENV_EX +;------------------------------------------------- +; Установить/Удалить переменную окружения +; +; вход: hl=имя перем. и значение, раздел. символом "=" +;------------------------------------------------- +SETENV: CALL ENV_EX ; скопир. строку перем. окруж. в буферы SET_PAGE_X ENVPAGE PUSH AF - CALL F_ENV + CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE JR NC,PENV XOR A CPIR @@ -176,12 +205,18 @@ END_OF_ENV POP DE RET -ENV_EX LD B,ENVIRONMENT_STRING_LENGTH - LD DE,ENVNAME -ENV_E0 XOR A +;----------------------------------------------------------- +; Скопировать строку переменной окружения в буферы +; (имя и значение в разные буферы) +; вход: hl=имя перем. и значение, раздел. символом "=" +;----------------------------------------------------------- +ENV_EX: LD B,ENVIRONMENT_STRING_LENGTH ; 255 макс. длина строки (имя+знач.) + LD DE,ENVNAME ; куда +ENV_E0: XOR A LD (DE),A LD (ENVVALUE),A -ENV_E1 LD A,(HL) + ; скопир. в "ENVNAME" имя переменной +ENV_E1: LD A,(HL) INC HL CP "=" JR Z,EQUAL_SG @@ -191,35 +226,42 @@ ENV_E1 LD A,(HL) LD (DE),A INC DE DJNZ ENV_E1 - ;!TEST from Vasil + ;R03 + ; слишком длинная строка ld a,b ld (de),a ; обрезать слишком длинную строку inc de ; SCF RET - -ENV_E3 LD A,"=" + ; значение не задано +ENV_E3: LD A,"=" LD (DE),A INC DE XOR A LD (DE),A INC DE RET - -EQUAL_SG: - LD (DE),A + ; значение задано +EQUAL_SG: LD (DE),A ; сохр. "=" INC DE XOR A + LD (DE),A ; в конец имени перем. + ; скопир. в "ENVVALUE" значение переменной (строку путей) + LD DE,ENVVALUE ; 512 байт, буфер LD (DE),A - LD DE,ENVVALUE - LD (DE),A - LD C,#FF + LD C,#FF ; чтобы "ldi" не портила "b" ENV_E2 LD A,(HL) LDI OR A - RET Z + RET Z ; конец строки знач. переменной DJNZ ENV_E2 + ;R03 + ; слишком длинная строка + ld a,b + ld (de),a ; обрезать слишком длинную строку + inc de + ; SCF RET @@ -230,9 +272,12 @@ ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 ENVIRONMENT EQU ENVADDR -DEFAULT_ENV: DB 'BOOTDSK=' -.boot_disk: DB 'X:',0 -DEF_ENV_SIZE EQU $-DEFAULT_ENV +DEFAULT_ENV: DB 'BOOTDSK=' ;R02 +.boot_disk: DB 'X:',0 ;R02 +; DB 'SYSTEM=C:\system.exe',0 +; DB 'PATH=\SYSTEM\;\COMMAND\;',0 +DEF_ENV_SIZE EQU $-DEFAULT_ENV ;R02 + ; DB 'SYSTEM=C:\system.exe',0 ; DB 'PATH=\SYSTEM\;\COMMAND\;',0 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 105f882..28ea073 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -1255,6 +1255,12 @@ LEAVE: LD A,B ; .exit: JP (HL) +;///////////////////////////////////////////////////////////////////// +; Функция #42. Получить код завершения программы. +; +; вход: нет +; выход: A - код завершения +;///////////////////////////////////////////////////////////////////// WAIT: LD A,(ERLEVEL) AND A RET @@ -1301,8 +1307,8 @@ M_PSP: LD HL,(EXEBUFF.LD_ADDR) CALL CURRDIR POP HL XOR A - LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH - CPIR ;!FIXIT нет проверки на выход по BC=0 + LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH + CPIR ;!FIXIT нет проверки на выход по BC=0 DEC HL DEC HL LD A,'\' @@ -1345,41 +1351,40 @@ SCOPYS: LD BC,#80*256 + ' '+1 RET -EXE_EXT DB "E","X","E" +EXE_EXT: DB "EXE" -TASK DB #01 +TASK: DB #01 ; уровень текущей программы -RAMMAP DB #00,#00,#00,#00 +RAMMAP: DB #00,#00,#00,#00 -ERLEVEL DB #00 +ERLEVEL: DB #00 ; код завершения программы (процесса) -EXE_FM DB #00 -EXE_MEM DB #00 +EXE_FM: DB #00 ; дескр. файла +EXE_MEM: DB #00 ; идентификатор блока памяти -CMDLINE DW #0000 +CMDLINE: DW #0000 -EXSTACK DW XSTACK +EXSTACK: DW XSTACK ; адрес стека ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;; ; EXEBUFF: -; DB "EXE" -; DB #00 +; DB "EXE" +; DB #00 ; OFFCOD1 DW #0000 ; OFFCOD2 DW #0000 ; LOADER DW #0000 -; DW #0000 -; DW #0000 -; DW #0000 +; DW #0000 +; DW #0000 +; DW #0000 ; LD_ADDR DW #0000 ; PC_REG DW #0000 ; SP_REG DW #0000 -; BLOCK 512-($-EXEBUFF),0 -; ;(!!!HERE STACK FOR EXEC!!!) -; BLOCK 255,0 +; BLOCK 512-($-EXEBUFF),0 +; ;(!!!HERE STACK FOR EXEC!!!) +; BLOCK 255,0 ; XSTACK DB #00 ;R11 //////////////////////////// ;//MODULE: EXECUTE -;[END] - +;[END] \ No newline at end of file diff --git a/DSS/Media_drivers/FDD.ASM b/DSS/Media_drivers/FDD.ASM index 6f0ca7a..594a837 100644 --- a/DSS/Media_drivers/FDD.ASM +++ b/DSS/Media_drivers/FDD.ASM @@ -130,6 +130,10 @@ R_DSK EQU #FF ;Drive Control COM_B EQU #1B + +;------------------------------------------------- +; Обработчик FDD (rst 18h) +;------------------------------------------------- FDDRIVE: INC C DEC C diff --git a/DSS/Media_drivers/Shared.ASM b/DSS/Media_drivers/Shared.ASM index 4593d9e..de0c995 100644 --- a/DSS/Media_drivers/Shared.ASM +++ b/DSS/Media_drivers/Shared.ASM @@ -1,3 +1,12 @@ +;[BEGIN] +;//MODULE: Shared AUTHOR: Denis Parinov +;//CREATE: A LONG TIME AGO :) +;--------------------------------------------------------------- +;Rev Date Name Description +;R01 17-04-2023 BAO Добавлена процедура INITDVC_RET_DRIVE и изменена INTDISK для поддержки рескана драйвов +;--------------------------------------------------------------- + + ; DISK DRIVER SPECIFICATION ;--------------------------------------------- @@ -107,15 +116,19 @@ ; EX (SP),HL ; RET +;------------------------------------------------- +; RST 18h. Вектор дисковых устройств +; вход: a=номер устройства (0-25) +;------------------------------------------------- DSS_MAX_DRIVES_AMOUNT EQU 26 - INTDISK: - CP #FF - JR NZ,.noNeedRescan - CP C - JR Z,INITDVC_RET_DRIVE - + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + JR Z,INITDVC_RET_DRIVE .noNeedRescan: + ; PUSH HL PUSH BC LD C,A @@ -138,7 +151,7 @@ INTDISK: EX (SP),HL RET -NODEV POP BC +NODEV: POP BC POP HL LD A,DSS_Error.drv.INVALID_DRIVE SCF @@ -175,26 +188,34 @@ NETWORK EQU #0008 ; DB #80 ;PHISICAL DRIVE NUMBER ; ; DB #00 ;END OF TABLE -INITDVC_RET_DRIVE: - CALL INITDVC - LD A,(LDRIVE) - AND A - RET +;----------------------------------------------------------------------- -INITDVC XOR A - LD (LDRIVE),A + ;R01 +INITDVC_RET_DRIVE: + CALL INITDVC + LD A,(LDRIVE) + AND A + RET + ; + +;----------------------------------------------------------- +; Просканировать систему на FDD/HDD девайсы и RAM-диски +;----------------------------------------------------------- +INITDVC: XOR A + LD (LDRIVE),A ; сбр. ячейку LD HL,DEVICE - LD (PDEVICE),HL + LD (PDEVICE),HL ; восст. ячейку + ; FDD девайсы LD C,A - CALL FDDRIVE - LD DE,FDDRIVE - CALL MAKEDVC -// XOR A + CALL FDDRIVE ; узнать число FDD-девайсов + LD DE,FDDRIVE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы LD C,0 CALL HDDRIVE LD DE,HDDRIVE CALL MAKEDVC -// XOR A + ; RAM-диски LD C,0 CALL RMDRIVE LD DE,RMDRIVE @@ -202,22 +223,25 @@ INITDVC XOR A XOR A RET -MAKEDVC LD C,A - LD HL,LDRIVE +; Инициировать таблицу переходов девайса. +; вход: de=адрес обработчика девайса +; a=число девайсов (0=нет) +MAKEDVC: LD C,A + LD HL,LDRIVE ; ячейка номера посл. диска ADD A,(HL) LD (HL),A LD A,C - LD C,0 + LD C,0 ; сбр. OR A - RET Z - LD HL,(PDEVICE) -.loop: LD (HL),C + RET Z ; нет девайсов + LD HL,(PDEVICE) ; тек. полож. в таблице +.loop: LD (HL),C ; номер драйва этого устройства (младшие 4 бита). Например, для HDD #81: #80 - тип драйва, 1 - номер драйва INC HL - LD (HL),E + LD (HL),E ; de=адрес обработчика INC HL LD (HL),D INC HL - INC C + INC C ; ++номер драйва DEC A JR NZ,.loop LD (PDEVICE),HL diff --git a/DSS/Structures.inc b/DSS/Structures.inc index b40ef1e..9e6ab74 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -1,6 +1,6 @@ ; STRUCT _sStack ; 256 bytes -buffer BLOCK 255,0 +buffer BLOCK 256,0 SPoint BYTE 0 ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index 86ee83a..ac4213d 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -40 \ No newline at end of file +43 \ No newline at end of file diff --git a/SYS/DSSBOOT.ASM b/SYS/DSSBOOT.ASM index 27c8095..ff46adf 100644 --- a/SYS/DSSBOOT.ASM +++ b/SYS/DSSBOOT.ASM @@ -129,24 +129,15 @@ NOSHELL EQU 5 STARTDO EQU 6 ;a BIOS version that is incompatible with this version of DOS ; 0 10 20 30 40 50 60 70 80 -MSG0 DB 0 - DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10 - DB 0 - DB 13,10 - DB "You started your computer with a BIOS version that is incompatible with this",13,10 - DB "version of DSS. Please update BIOS to run this version of DSS.",13,10 - DB 0 - DB "Invalid partition table.",13,10 - DB 0 - DB "Invalid BOOT sector.",13,10 - DB 0 - DB "Can't open file SYSTEM.DOS ...",13,10 - DB 0 - DB "Can't open file SYSTEM.EXE ...",13,10 - DB 0 - DB 13,10,"Starting DSS... ",13,10,13,10 - DB 0 -MSGE DB 0 +MSG0: DB 0 + DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0 + DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10,0 + DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0 + DB "Invalid partition table.",13,10,0 + DB "Invalid BOOT sector.",13,10,0 + DB "Can't open file SYSTEM.DOS ...",13,10,0 + DB 13,10,"Starting DSS... ",13,10,13,10,0 +MSGE DB 0 CONTINU LD HL,0 diff --git a/SYS/SYS.ASM b/SYS/SYS.ASM index 1649222..4e26e7f 100644 --- a/SYS/SYS.ASM +++ b/SYS/SYS.ASM @@ -1,6 +1,5 @@ ;!TODO определение попытки сделать загрузочным не первый раздел -; Последняя редакция: 25.04.2006 ; Программа записи на FDD/HDD boot-загрузчика и файлов системы. ; ; Загружает сист. файлы из корня диска, с которого была From 41dfe62c0b5d3058f47e6278f77fa6226ab74b45 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 25 Jul 2023 00:57:55 +1000 Subject: [PATCH 023/219] Start using BIOS.DRV_DETECT function. Check minimum Bios version to boot from IDE (or to scan it if booting from FDD) --- {SYS => BOOT}/DSSBOOT.ASM | 0 {SYS => BOOT}/README.TXT | 0 SYS/SYS.ASM => BOOT/boot.asm | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {SYS => BOOT}/DSSBOOT.ASM (100%) rename {SYS => BOOT}/README.TXT (100%) rename SYS/SYS.ASM => BOOT/boot.asm (100%) diff --git a/SYS/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM similarity index 100% rename from SYS/DSSBOOT.ASM rename to BOOT/DSSBOOT.ASM diff --git a/SYS/README.TXT b/BOOT/README.TXT similarity index 100% rename from SYS/README.TXT rename to BOOT/README.TXT diff --git a/SYS/SYS.ASM b/BOOT/boot.asm similarity index 100% rename from SYS/SYS.ASM rename to BOOT/boot.asm From f4140a5733abf134edd45fa98f325ccca91cb675 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 29 Jul 2023 03:27:42 +1000 Subject: [PATCH 024/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/Media_drivers/{FDD.ASM => fdd-drv.asm} | 0 DSS/Media_drivers/{IDE.ASM => ide-drv.asm} | 0 DSS/Media_drivers/{RAM_DISK.ASM => ram_disk-drv.asm} | 0 DSS/Media_drivers/{Shared.ASM => shared-drv.asm} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename DSS/Media_drivers/{FDD.ASM => fdd-drv.asm} (100%) rename DSS/Media_drivers/{IDE.ASM => ide-drv.asm} (100%) rename DSS/Media_drivers/{RAM_DISK.ASM => ram_disk-drv.asm} (100%) rename DSS/Media_drivers/{Shared.ASM => shared-drv.asm} (100%) diff --git a/DSS/Media_drivers/FDD.ASM b/DSS/Media_drivers/fdd-drv.asm similarity index 100% rename from DSS/Media_drivers/FDD.ASM rename to DSS/Media_drivers/fdd-drv.asm diff --git a/DSS/Media_drivers/IDE.ASM b/DSS/Media_drivers/ide-drv.asm similarity index 100% rename from DSS/Media_drivers/IDE.ASM rename to DSS/Media_drivers/ide-drv.asm diff --git a/DSS/Media_drivers/RAM_DISK.ASM b/DSS/Media_drivers/ram_disk-drv.asm similarity index 100% rename from DSS/Media_drivers/RAM_DISK.ASM rename to DSS/Media_drivers/ram_disk-drv.asm diff --git a/DSS/Media_drivers/Shared.ASM b/DSS/Media_drivers/shared-drv.asm similarity index 100% rename from DSS/Media_drivers/Shared.ASM rename to DSS/Media_drivers/shared-drv.asm From c50040b71506cf220e9e1ee5c36e919e0b0ed682 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 29 Jul 2023 03:28:09 +1000 Subject: [PATCH 025/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 69 +++-- BOOT/boot.asm | 4 +- Console/CONSOLE.ASM | 171 ++++++------ DSS/DOS5.ASM | 2 +- DSS/DRV-MAIN.ASM | 278 ++++++++++++++----- DSS/DSS-MAIN.ASM | 50 +++- DSS/Media_drivers/fdd-drv.asm | 10 +- DSS/Media_drivers/ide-drv.asm | 427 ++++++++++++++++------------- DSS/Media_drivers/ram_disk-drv.asm | 4 +- DSS/Media_drivers/shared-drv.asm | 33 ++- DSS/VIDEO.ASM | 4 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 + Shared_Includes | 2 +- 14 files changed, 637 insertions(+), 421 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index ff46adf..b08db66 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -27,7 +27,7 @@ CDRIVE EQU #02 DRIVE: _mSYSID DI LD (DRIVE),A - LD C,BIOS.EXT_VERSION + LD C,BIOS.DRV_VERSION RST ToBIOS_18 LD A,INCORR JR C,FAIL @@ -35,7 +35,7 @@ DRIVE: _mSYSID BIT 7,A JR Z,GOOD_DRIVE EX DE,HL - LD DE,#0215 ; если версия ниже 2.21, то ошибка + LD DE,2*256 + 21 ; если версия ниже 2.21, то ошибка SBC HL,DE LD A,INCORR JR C,FAIL @@ -47,7 +47,7 @@ GOOD_DRIVE: LD A,(DRIVE) RST ToBIOS_18 JR C,NULL - JP CONTINU + JP CONTINUE FAIL CALL MESSAGE NULL LD A,FAILURE @@ -131,7 +131,7 @@ STARTDO EQU 6 ; 0 10 20 30 40 50 60 70 80 MSG0: DB 0 DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0 - DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10,0 + DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10 DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0 DB "Invalid partition table.",13,10,0 DB "Invalid BOOT sector.",13,10,0 @@ -139,7 +139,7 @@ MSG0: DB 0 DB 13,10,"Starting DSS... ",13,10,13,10,0 MSGE DB 0 -CONTINU +CONTINUE: LD HL,0 LD (DISKL),HL LD (DISKH),HL @@ -178,7 +178,7 @@ CONTINU LD A,(DRIVE) LD C,#00 RST #10 - jp c,XFAIL + jp c,XFAIL.fail LD A,STARTDO CALL DOSMESS @@ -198,7 +198,7 @@ CONTINU LD A,(DRIVE) LD C,#00 RST #10 - jp c,XFAIL + jp c,XFAIL.fail ENDIF LD A,STARTDO @@ -238,14 +238,14 @@ DOSMESS CALL FMESAGE RST #10 RET -XFAIL CALL DOSMESS - LD A,FAILURE +XFAIL: CALL DOSMESS +.fail: LD A,FAILURE CALL DOSMESS DI HALT -.halt JR .halt +.halt: JR .halt -PART_TB PUSH BC +PART_TB: PUSH BC LD HL,(BOOT+510) LD DE,#AA55 AND A @@ -253,7 +253,7 @@ PART_TB PUSH BC JR NZ,ERRP LD IX,BOOT+#01BE LD B,4 -DOSAGA LD A,(IX+4) +DOSAGA: LD A,(IX+4) CP #0E JR Z,YEPDOS CP 6 @@ -263,14 +263,12 @@ DOSAGA LD A,(IX+4) CP 1 JR Z,YEPDOS LD DE,#10 -; ошибка в оригинале -; ADD IY,DE ADD IX,DE DJNZ DOSAGA -ERRP LD A,ERRPART +ERRP: LD A,ERRPART JP FAIL -YEPDOS LD E,(IX+08) +YEPDOS: LD E,(IX+08) LD D,(IX+09) LD L,(IX+10) LD H,(IX+11) @@ -278,15 +276,15 @@ YEPDOS LD E,(IX+08) LD XL,E LD (DISKL),IX LD (DISKH),HL + LD A,(DRIVE) LD DE,BOOT LD BC,1*256 + BIOS.DRV_READ - LD A,(DRIVE) RST ToBIOS_18 POP BC LD A,C RET -SET_PRM PUSH BC +SET_PRM: PUSH BC LD A,B LD C,BIOS.DRV_GET_PAR RST ToBIOS_18 @@ -300,7 +298,7 @@ SET_PRM PUSH BC LD A,C RET -GET_BPB LD IX,#0000 +GET_BPB: LD IX,#0000 LD HL,#0000 LD DE,BOOT LD BC,1*256 + BIOS.DRV_READ @@ -315,7 +313,7 @@ GET_BPB LD IX,#0000 JR NZ,NX1 CALL PART_TB ;HDD RET C -NX1 CP #00 +NX1: CP #00 JR NZ,NX2 CALL SET_PRM ;FDD NX2: LD HL,(BOOT+510) @@ -338,7 +336,7 @@ NX2: LD HL,(BOOT+510) LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT LD D,(IY+_sBOOT_SEC.S_P_F+1) LD A,(BOOT.FAT_NUM) ;amount FATs -C_DATA1 ADD HL,DE +C_DATA1: ADD HL,DE DEC A JR NZ,C_DATA1 LD (DIR_FRM),HL ;first sector DIR @@ -362,7 +360,7 @@ C_DATA1 ADD HL,DE LD B,(IY+_sBOOT_SEC.B_P_S+1) LD HL,0 LD A,(BOOT.S_P_C) -NEXTAD3 +NEXTAD3: ADD HL,BC ;calc. cluster size DEC A JR NZ,NEXTAD3 @@ -371,16 +369,16 @@ NEXTAD3 LD HL,BOOT.ID_FAT LD DE,FATMSG LD B,3 -R_BPBL1 +R_BPBL1: LD A,(DE) CP (HL) JP NZ,IBMDOS_ INC HL INC DE DJNZ R_BPBL1 -FID LD A,(HL) +FID: LD A,(HL) INC HL - CP #20 + CP " " JR Z,FID CP "1" SCF @@ -425,12 +423,12 @@ IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) LD HL,#0FFF JR BPB_FAT -GETROOT LD HL,(DIR_FRH) +GETROOT: LD HL,(DIR_FRH) LD IX,(DIR_FRL) LD BC,(DISKL) LD DE,(DISKH) LD A,(DIR_S_S) -NEXTSEC PUSH AF +NEXTSEC: PUSH AF ADD IX,BC ADC HL,DE ;HL:IX @@ -454,9 +452,9 @@ NEXTSEC PUSH AF SCF RET -SEARCH LD C,17 ;HANDELS PER SECTOR 512/32 + 1 +SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD IX,DIR-#0020 -SKIPNAM LD DE,#0020 +SKIPNAM: LD DE,#0020 ADD IX,DE DEC C RET Z @@ -473,7 +471,7 @@ SKIPNAM LD DE,#0020 LD D,XH LD E,XL LD B,11 -SEARCH2 LD A,(DE) +SEARCH2: LD A,(DE) CP (HL) JR NZ,SKIPNAM INC HL @@ -491,14 +489,13 @@ SEARCH2 LD A,(DE) ; HL - CLUSTER ; DE - ADDRESS - -FLOAD LD (READMEM),DE -LD_FILE PUSH HL +FLOAD: LD (READMEM),DE +LD_FILE: PUSH HL CALL NSECTOR LD DE,(READMEM) LD A,(BOOT.S_P_C) CP #20 - JR C,SMCLUS + JR C,SMALL_CLUSTER LD BC,#20*256 + BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' @@ -507,8 +504,8 @@ LD_FILE PUSH HL POP HL AND A RET - -SMCLUS LD B,A +SMALL_CLUSTER: + LD B,A LD C,BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 4e26e7f..c4a7479 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -25,13 +25,13 @@ MACRO _mEXEinfo BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX BYTE ' Bootloader ' - BYTE ' installer ' + BYTE ' installer ' BYTE ' for DSS. ' BYTE ' Vasil Ivanov, ' BYTE ' Anatoliy ' BYTE ' Belyanskiy. ' BYTE ' Sprinter Team, ' - BYTE ' 2023 ' + BYTE ' 2023 ' ENDM diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 8e339bc..4b20315 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -10,6 +10,7 @@ ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] +;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти ;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R09 ??-??-???? DNS ;????? ???? @@ -532,26 +533,27 @@ RUN_BAT CALL BATCH BATLIST DZ 'PAUSE' : DW CPAUSE DZ 'REM' : DW CREM CMDLIST DZ 'CD' : DW CCHDIR - DZ 'CHDIR' : DW CCHDIR - DZ 'CLS' : DW CLS - DZ 'DATE' : DW CDATE - DZ 'DEL' : DW CDELET DZ 'DIR' : DW DIR DZ 'ECHO' : DW CECHO - DZ 'ERASE' : DW CDELET - DZ 'EXIT' : DW CEXIT - DZ 'HELP' : DW HELP - DZ 'MD' : DW CMKDIR - DZ 'MKDIR' : DW CMKDIR DZ 'PATH' : DW CPATH + DZ 'MD' : DW CMKDIR DZ 'REN' : DW CRENAM - DZ 'RENAME' : DW CRENAM + DZ 'DEL' : DW CDELET DZ 'RD' : DW CRMDIR - DZ 'RMDIR' : DW CRMDIR DZ 'SET' : DW CSET DZ 'TIME' : DW CTIME - DZ 'VERSION' : DW VERS + DZ 'DATE' : DW CDATE DZ 'VER' : DW VERS + DZ 'CLS' : DW CLS + DZ 'CHDIR' : DW CCHDIR + DZ 'MKDIR' : DW CMKDIR + DZ 'RENAME' : DW CRENAM + DZ 'ERASE' : DW CDELET + DZ 'RMDIR' : DW CRMDIR + DZ 'EXIT' : DW CEXIT + DZ 'HELP' : DW HELP + DZ 'VERSION' : DW VERS + DZ 'REBOOT' : DW REBOOT DB #00 CLS LD DE,#0000 @@ -1780,9 +1782,21 @@ QUIT: LD B,0 RST ToDSS RET +;----------------------------------------------------------------------- +;R12 +REBOOT: DI + LD C,BIOS.FullInit + RST ToBIOS + LD BC,2*256 + BIOS.REINIT + RST ToBIOS + DI + HALT +;R12 +;----------------------------------------------------------------------- + ERR_MSG: INC DE LD HL,ERR0 - LD BC,ERR1-ERR0 + LD BC,ERR0.Size CALL LCPIR CALL PRINTZ CALL CRLF @@ -1795,7 +1809,7 @@ MESSAGE: CALL FMESAGE FMESAGE: INC DE LD HL,MSG0 - LD BC,MSG1-MSG0 + LD BC,MSG0.Size LCPIR: XOR A CPIR RET PO @@ -1903,75 +1917,74 @@ MSG0: DB 0 ; FILENAME EXT SIZE DATE TIME DB "%1 %2 %3 %4 %5",CR,LF,0 DB "COMMANDS:",CR,LF,CR,LF - DB "CD DEL HELP RD SET " - DB " ",CR,LF - DB "CHDIR DIR MD REN TIME " - DB " ",CR,LF - DB "CLS ERASE MKDIR RENAME VER " - DB " ",CR,LF - DB "DATE EXIT PATH RMDIR VERSION " - DB " ",CR,LF - DB 0 -MSG1: + DB "DIR REN | RENAME PATH HELP ",CR,LF + DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF + DB "MD | MKDIR TIME ECHO EXIT ",CR,LF + DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 + ;R11 + BYTE 0 + DZ "Unknown command" + ; +.Size EQU $-MSG0 ;----------------------------------------------------------------------- ;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются -ERR0 DB #00 - DZ "Bad command or file name" - DZ "Invalid function" ; 01 - неверный номер функции - DZ "Invalid drive number" ; 02 - неправильный номер устройства - DZ "File not found" ; 03 - файл не обнаружен - DZ "Path not found" ; 04 - неверный путь - DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "No free filehandle" ; 06 - нет свободного файлового манипулятора - DZ "File exist" ; 07 - файл существует - DZ "File read only" ; 08 - файл только для чтения - DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) - DZ "No free space" ; 10 - нет свободного места на диске - DZ "Directory not empty" ; 11 - каталог не пуст - DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог - DZ "Invalid media" ; 13 - неизвестный формат - DZ "Unknown operation" ;R02 ; 14 - невозможная операция - DZ "Directory exist" ; 15 - каталог уже есть - DZ "Invalid filename" ; 16 - неверное имя - DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл - DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен - DZ "Not ready" ; 20 - нет готовности - DZ "Seek error" ; 21 - ошибка позиционирования - DZ "Sector not found" ; 22 - сектор не найден - DZ "CRC error" ; 23 - ошибка CRC - DZ "Write protect" ; 24 - защита записи - DZ "Read error" ; 25 - ошибка чтения - DZ "Write error" ; 26 - ошибка записи - DZ "Drive failure" ; 27 - сбой диска - DZ "Extended error 28" - DZ "Extended error 29" - DZ "No free memory" ; 30 - недостаточно памяти - DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "Extended error 32" - DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной - DZ "Extended error 34" - DZ "Too many files in directory" ; 35 - слишком много файлов в директории - DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation interrupted by user" ; 37 - операция прервана пользователем - DZ "Common error" ; 38 - общая ошибка - DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения - DZ "40" - DZ "41" - DZ "42" - DZ "43" - DZ "44" - DZ "45" - DZ "46" - DZ "Wrong video mode" ; 48 - неправильный видеорежим - DZ "48" - DZ "49" - DZ "50" +ERR0: DB #00 + DZ "Bad command or file name" + DZ "Invalid function" ; 01 - неверный номер функции + DZ "Invalid drive number" ; 02 - неправильный номер устройства + DZ "File not found" ; 03 - файл не обнаружен + DZ "Path not found" ; 04 - неверный путь + DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор + DZ "No free filehandle" ; 06 - нет свободного файлового манипулятора + DZ "File exist" ; 07 - файл существует + DZ "File read only" ; 08 - файл только для чтения + DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) + DZ "No free space" ; 10 - нет свободного места на диске + DZ "Directory not empty" ; 11 - каталог не пуст + DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог + DZ "Invalid media" ; 13 - неизвестный формат + DZ "Unknown operation" ;R02 ; 14 - невозможная операция + DZ "Directory exist" ; 15 - каталог уже есть + DZ "Invalid filename" ; 16 - неверное имя + DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл + DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла + DZ "Access denied" ; 19 - ресурс не доступен + DZ "Not ready" ; 20 - нет готовности + DZ "Seek error" ; 21 - ошибка позиционирования + DZ "Sector not found" ; 22 - сектор не найден + DZ "CRC error" ; 23 - ошибка CRC + DZ "Write protect" ; 24 - защита записи + DZ "Read error" ; 25 - ошибка чтения + DZ "Write error" ; 26 - ошибка записи + DZ "Drive failure" ; 27 - сбой диска + DZ "Extended error 28" + DZ "Extended error 29" + DZ "No free memory" ; 30 - недостаточно памяти + DZ "Invalid memory block" ; 31 - несуществующий блок памяти + DZ "Extended error 32" + DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной + DZ "Extended error 34" + DZ "Too many files in directory" ; 35 - слишком много файлов в директории + DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + DZ "Operation interrupted by user" ; 37 - операция прервана пользователем + DZ "Common error" ; 38 - общая ошибка + DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения + DZ "40" + DZ "41" + DZ "42" + DZ "43" + DZ "44" + DZ "45" + DZ "46" + DZ "Wrong video mode" ; 48 - неправильный видеорежим + DZ "48" + DZ "49" + DZ "50" ;R11 - BYTE 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: - DZ "Unknown error" + DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: + DZ "Unknown error" ; -ERR1: +.Size EQU $-ERR0 ;----------------------------------------------------------------------- GETPATH: diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index a279d3e..f023b0d 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -1411,7 +1411,7 @@ SETTIME PUSH IX PUSH BC PUSH HL PUSH DE - LD C,#F5 + LD C,BIOS.CMOS_TEST RST ToBIOS JP C,NOCMOS2 POP AF diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 34ed599..84ed777 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -6,15 +6,25 @@ ;--------------------------------------------------------------- ;R00 2003-03-19 DNS Initial version ;--------------------------------------------------------------- -// INCLUDE "hardware.inc" -// INCLUDE "bios.inc" - ; ORG #0000 - MODULE DRV ; !FIXIT обойтись без модуля ;PAGEDRV EQU 0 + +;===============; + ;!FIXIT в процедуре которая будет отвечать за переход из этой страницы обратно в MAIN для вызова функций + ; ДСС и, возможно, повторному заходу в эту страницу через RST #18 из других страниц (которых пока нет) + ; сделать нечто подобное с программным стеком страниц. Эта процедура их сохраняет, примерно такая же + ; должна восстанавливать. +; PUSH HL +;.SP+1: LD HL,DRV_PAGE.RSTx18_RET_PAGES +; LD (HL),A +; DEC L ; Не HL, а L - чтоб закольцевать область +; LD (.SP),HL +; POP HL +;===============; + ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; @@ -32,7 +42,7 @@ RST_00: ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[BIOS API]> ; - BLOCK 8-$,#FF ; + BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode A0008: PUSH AF ; LD A,SYS_PORT.PAGE8; OUT (SYS_PORT.ON),A ; @@ -44,35 +54,35 @@ A0008: PUSH AF ; ;!FIXIT ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DSS API]> ; - BLOCK #10-$,#FF ; -A0010: ;JP RST_10 ; + BLOCK #10-$,#C7 ; #C7 - "RST 0" opcode +A0010: ;JP DRV_PAGE.RST_10 ; DI : HALT ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[DRIVE API]> ; - BLOCK #18-$,#FF ; -;A0018 JP INTDISK ; -A0018: PUSH AF ; - PUSH BC ; -MAIN_PG_NUMBER+2: ; - LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? - JP PORTAL.outDRV ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; ; <[DRIVE API]> ; +; BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode +; ;A0018 JP INTDISK ; +; A0018: PUSH AF ; +; PUSH BC ; +; DRV_PAGE.MAIN_PAGE_NUMBER+2: ; +; LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? +; JP PORTAL.outDRV ; +; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; - BLOCK #20-$,#FF ; -A0020: JP RST_20 ; + BLOCK #20-$,#C7 ; #C7 - "RST 0" opcode +A0020: JP DRV_PAGE.RST_20 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; -RST_20: +DRV_PAGE.RST_20: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET @@ -81,13 +91,13 @@ RST_20: ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; - BLOCK #28-$,#FF ; -A0028: JP RST_28 ; + BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode +A0028: JP DRV_PAGE.RST_28 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; -RST_28: +DRV_PAGE.RST_28: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET @@ -96,7 +106,7 @@ RST_28: ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; - BLOCK #30-$,#FF ; + BLOCK #30-$,#C7 ; A0030: JP RST_30 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -111,7 +121,7 @@ RST_30: ;!FIXIT ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[MAIN INT]> ; - BLOCK #38-$,#FF ; + BLOCK #38-$,#C7 ; A0038: ; ; JP RST_38 ; ; RST_38: ; @@ -148,56 +158,51 @@ A0038: ; ; ; -KEYSCAN: RET ;!FIXIT +DRV_PAGE.KEYSCAN: RET ;!FIXIT ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[ NMI ]> ; -NMI: RETN ; - BLOCK #66-$,#FF ; -A0066: JP NMI ; +DRV_PAGE.NMI: RETN ; + BLOCK #66-$,#C7; +A0066: JP DRV_PAGE.NMI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;-------------------------------; -;ADRST10 EQU #00 ;!!!!! +;ADRST10 EQU #00 ; ;!!!!! ;-------------------------------; ;!FIXIT -RST_10 PUSH HL - LD L,C - LD H,ADRST10/256 - LD C,(HL) - INC H - LD H,(HL) - LD L,C - EX (SP),HL - RET +; DRV_PAGE.RST_10: +; PUSH HL +; LD L,C +; LD H,ADRST10/256 +; LD C,(HL) +; INC H +; LD H,(HL) +; LD L,C +; EX (SP),HL +; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE PAGE SWITCH]> ; - BLOCK #7E-$,0 ; -PORTAL.toMAIN: ; - PUSH BC ; -RETBANK+2: ; - LD BC,0*256+SLOT0 ; - OUT (C),B ; - ASSERT $!=84,'-> Portal error!'; -;Entry point from DSS main page ; !FIXIT если 2 раза прилететь на эту точку входа, то засрётся RETBANK - LD (RETBANK),A ; - POP BC ; - POP AF ; -ADCALL+1: ; - CALL DISPATCH ; патчится на INTDISK - JR PORTAL.toMAIN ; + _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 +PORTAL.out_DRV: PUSH BC ; +.RETBANK+2: LD BC,0*256+SLOT0 ; +.switch: OUT (C),B ; + ASSERT $!=84,'-> Portal error!'; + ;Entry point from DSS main page + LD (.RETBANK),A ; + POP BC ; + POP AF ; +ADCALL+1: CALL DISPATCH ; патчится на INTDISK + JP PORTAL.out_DRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -/* - push hl - -*/ + display "=============================",/H,(#82-#73-(PORTAL.toMAIN.switch-PORTAL.toMAIN)) ;!FIXIT чёт не то тут @@ -214,23 +219,162 @@ PORTAL.outDRV: ; ; DISPATCH: - CALL INITDVC LD HL,INTDISK LD (ADCALL),HL - LD A,(LDRIVE) +INITDVC_RET_DRIVE: + CALL INITDVC + LD A,(DRV_PAGE.LDRIVE) AND A RET ; -LDRIVE DB #00 +DRV_PAGE.LDRIVE: DB #00 - INCLUDE 'dss/media_drivers/Shared.asm' - INCLUDE 'dss/media_drivers/ide.asm' - INCLUDE 'dss/media_drivers/fdd.asm' - INCLUDE 'dss/media_drivers/ram_disk.asm' + INCLUDE 'dss/media_drivers/shared-drv.asm' + INCLUDE 'dss/media_drivers/ide-drv.asm' + INCLUDE 'dss/media_drivers/fdd-drv.asm' + INCLUDE 'dss/media_drivers/ram_disk-drv.asm' -; DB 0 - - ENDMODULE +DEVICE_CFG: +DRV_TEMP_BUFFER: +; + + +; +;---------[256 bytes stack for return pages of RST #18 callers]--------; +; #3F00 - #3FFF +DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF +;----------------------------------------------------------------------; + ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" +; ENDMODULE ; OUTEND ;[END] + +/* +; +; NEW RESCAN +;=====================================================================[] +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF +.Size: EQU $-DEVICE + +; Логический номер раздела. +;Номер группы = логический номер раздела HDD из DEVICE +LOGDRV: BLOCK 16*LD_DSK,0 +.Size: EQU $-LOGDRV +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) +;+09 FREE +;+15 + +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER +RAMDTBL: DUP MAX_RAMDRIVES * 2 + DB #FF + EDUP +.Size EQU $-RAMDTBL + + + + +INTDISK: + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + JR Z,INITDVC_RET_DRIVE +.noNeedRescan: + ; + PUSH HL + PUSH BC + ADD A,A + ADD A,A + LD C,A + LD B,0 + LD HL,DEVICE + ADD HL,BC + LD A,(HL) + CP #FF + JR Z,NODEV + INC HL + INC HL + LD C,(HL) + INC HL + LD H,(HL) + LD L,C + POP BC + EX (SP),HL + RET +NODEV: POP BC + POP HL + LD A,DSS_Error.drv.INVALID_DRIVE + SCF + RET + + + +INITDVC: XOR A + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку + LD HL,DEVICE + LD (PDEVICE),HL ; восст. ячейку + ; FDD девайсы + CALL FDDRIVE.INIT ; узнать число FDD-девайсов + LD DE,FDDRIVE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы + ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET +.if_old: CALL INIT_H + ;CALL .CHECK_HDD + LD DE,HDDRIVE + CALL MAKEDVC + ; RAM-диски + CALL INIT_RD + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET +.CHECK_HDD: + + RET + + + ;R01 +INITDVC_RET_DRIVE: + LD DE,DRV_TEMP_BUFFER + LD HL,DEVICE + LD BC,DEVICE.Size + LDIR + LD HL,LOGDRV + LD BC,LOGDRV.Size + LDIR + LD HL,RAMDTBL + LD BC,RAMDTBL.Size + LDIR + + CALL INITDVC + + ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его + LD HL,DEVICE + LD DE,DRV_TEMP_BUFFER + LD B,DEVICE.Size +.loop_DEVICE: + LD A,(DE) + CP (HL) + CALL NZ,.FIND_DEV + INC HL + INC DE + DJNZ .loop_DEVICE + + LD A,(DRV_PAGE.LDRIVE) + AND A + RET + ; + + +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF +;=====================================================================[] +; +; +*/ \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 3809b5c..76ccc1c 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -9,6 +9,7 @@ ;[ ] путь текущего каталога в DIR выводится с глюком если он длинее 256 байтов ;[ ] путь в приглашении консоли выводится с глюком если путь длинее 256 байтов ;[ ] ;!FIXIT какой-то баг при котором если нет диска и на него полезть, то всё ломается +;R12 24-07-2023 BAO Check minimum BIOS version on boot ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE ;R10 14-04-2023 BAO Аварийный зависон с выводом сообщения при старте системы, если нет свободной памяти ;R09 08-04-2023 BAO Сокращение размера таблицы API до 96 функций (0 - #5F). (Опционально при компиляции) @@ -94,7 +95,7 @@ RST_0x18: PUSH AF ; PUSH BC ; DRV_PG_NUMBER+2: ; LD BC,0*256+SLOT0 ; - JP PORTAL.outMAIN ; + JP PORTAL.out_MAIN ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -219,7 +220,7 @@ RST_10: PUSH HL ; <[DRIVE PAGE SWITCH]> ; _mInfoBLOCK #80-$,0 ; ;ENTER: ; -PORTAL.outMAIN: ; +PORTAL.out_MAIN: ; IN A,(C) ; OUT (C),B ; ASSERT $!=84,'-> Portal error!'; @@ -262,19 +263,33 @@ PORTAL.outMAIN: ; ;R01 ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION -F_START: - DI +F_START: DI LD (.saveDRV),A - CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения + ;R12 + LD C,BIOS.DRV_VERSION + RST ToBIOS + JR C,.err_oldBIOS + EX DE,HL + LD DE,MINIMUM_BIOS_VERSION + SBC HL,DE + JR NC,.good + LD A,(.saveDRV) + CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 + JR NC,.err_oldBIOS + LD HL,#C9AF ; XOR A : RET opcodes + LD (DRV_CONTENT + INITDVC.if_old),HL ;!!!!!! + ; + +.good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения RET C ;R10 CALL KINIT CALL PRINT_INIT - LD C,0 - RST #30 + LD C,0 ;!HARDCODE + RST #30 ;!HARDCODE LD A,(VMODE) - LD C,#81 - RST #30 + LD C,#81 ;!HARDCODE + RST #30 ;!HARDCODE ;CALL INITDVC ;R05 ;R05 LD C,Dss.DRV.Init @@ -284,7 +299,7 @@ F_START: .saveDRV+1: LD A,0 LD BC,1*256 + Dss.BootDSK - RST #10 + RST ToDSS EI ;Set new address fn. VERSION @@ -315,6 +330,18 @@ F_START: ENDIF ;R02 JP VERSION + + ;R12 +.err_oldBIOS: + LD HL,.err_oldBIOS_message + LD C,Dss.PChars + RST ToDSS + SCF + RET +.err_oldBIOS_message: + DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." + ; + ;R03 ;R07Allocate memory ; LD BC,#03C2 @@ -502,7 +529,7 @@ DEPLOY: IN A,(SLOT3) PUSH AF IN A,(SLOT0) - LD (DRV.MAIN_PG_NUMBER),A + LD (DRV_CONTENT + DRV_PAGE.MAIN_PAGE_NUMBER),A ;!TEST OUT (SLOT3),A LD A,C @@ -546,7 +573,6 @@ DEPLOY: ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." DRV_CONTENT: -; ENDMODULE DISP 0 INCLUDE 'DRV-MAIN.ASM' ENT diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index 594a837..f7b8813 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -222,8 +222,6 @@ FDDRIVE: ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK - - .IOCTL_F: BIT 7,B JR NZ,.O_CTL_F @@ -263,7 +261,6 @@ FDDRIVE: ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED - .FGETPRM: EX DE,HL LD BC,#55AA @@ -276,7 +273,7 @@ FDDRIVE: LD A,L AND #0F PUSH AF - LD C,#58 + LD C,BIOS.DRV_GET_PAR RST ToBIOS JR C,.NONEF PUSH HL @@ -334,7 +331,6 @@ FDDRIVE: ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED - .FSETPRM: PUSH AF EXX @@ -346,13 +342,13 @@ FDDRIVE: PUSH AF PUSH HL PUSH DE - LD C,#58 + LD C,BIOS.DRV_GET_PAR RST ToBIOS POP DE POP HL JR C,.NONEF POP AF - LD C,#59 + LD C,BIOS.DRV_SET_PAR RST ToBIOS RET C AND A diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 928e142..16b9130 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -6,7 +6,7 @@ ;--------------------------------------------------------------- ; ; Disk Driver Specification ver. 2.20 -;[]===========================================================[] +;[]===========================================================[0] ;Procedure : Initialization ; ;Function : Initialization device(s) @@ -15,8 +15,9 @@ ; IX - Environment ;Output : A = Amount drive support ; HL = Size driver -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[0] + +;[]===========================================================[1] ;Procedure : Open ; ;Function : Open disk @@ -25,8 +26,9 @@ ; A - Drive ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[1] + +;[]===========================================================[2] ;Procedure : Close ; ;Function : Close disk @@ -35,8 +37,9 @@ ; A - Drive ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[2] + +;[]===========================================================[3] ;Procedure : Media check ; ;Function : Checking change line @@ -46,8 +49,9 @@ ;Output : A = 00h disk no changed ; A = 0FFh disk changed ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[3] + +;[]===========================================================[4] ;Procedure : Get BPB ; ;Function : Get Block Parameters BIOS @@ -56,8 +60,9 @@ ; DE - Address ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[4] + +;[]===========================================================[5] ;Procedure : Input ; ;Function : Input from disk @@ -68,8 +73,9 @@ ; B - Sector count ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[5] + +;[]===========================================================[6] ;Procedure : Output ; ;Function : Output to disk @@ -80,8 +86,9 @@ ; B - Sector count ;Output : None ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[6] + +;[]===========================================================[7] ;Procedure : Removable ; ;Function : Checking change line @@ -91,8 +98,9 @@ ;Output : A = 00h Removable ; A = FFh Nonremovable ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[7] + +;[]===========================================================[8] ;Procedure : Generic IOCTL ; ;Function : Generic Input Output Control @@ -110,8 +118,9 @@ ; 82h - Format track ;Output : ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[8] + +;[]===========================================================[9] ;Procedure : Read Long ; ;Function : Reading sectors from disk @@ -125,8 +134,9 @@ ; HL:IX - Next Logical Block (sector) ; DE - Next Address ; -;[]===========================================================[] -;[]===========================================================[] +;[]===========================================================[9] + +;[]===========================================================[10] ;Procedure : Write Long ; ;Function : Writing sectors to disk @@ -140,7 +150,8 @@ ; HL:IX - Next Logical Block (sector) ; DE - Next Address ; -;[]===========================================================[] +;[]===========================================================[10] + ; ; Errors: ; 0 (00h) - NO ERRORS @@ -158,7 +169,7 @@ ; 12 (0Ch) - BUSY (DEVICE OPENED) ; 13 (0Dh) - RESERVED -LD_DSK EQU 16 +LD_DSK EQU 16 ; максимальное количество логических дисков в системе ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 @@ -166,77 +177,110 @@ PART EQU #C000 HDDRIVE INC C DEC C - JP Z,INIT_H ;#00 + JP Z,INIT_H ; c=0 Initialization DEC C - JP Z,RESE_H ;#01 + JP Z,RESE_H ; c=1 open DEC C - JP Z,STAT_H ;#02 + JP Z,STAT_H ; c=2 close DEC C - JP Z,CHEK_H ;#03 + JP Z,CHEK_H ; c=3 media check (смена носителя) DEC C - JP Z,GBPB_H ;#04 + JP Z,GBPB_H ; c=4 get BPB DEC C - JP Z,READH ;#05 + JP Z,READH ; c=5 input (чтение секторов) DEC C - JP Z,WRITEH ;#06 + JP Z,WRITEH ; c=6 output (запись секторов) DEC C - JP Z,REMOV_H ;#07 + JP Z,REMOV_H ; c=7 Removable DEC C - JP Z,IOCTL_H ;#08 + JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL DEC C - JP Z,RESR_H ;#09 + JP Z,RESR_H ; c=9 Reserved DEC C - JP Z,LREADH ;#0A + JP Z,LREADH ; c=10 Read Long DEC C - JP Z,LWRITEH ;#0B + JP Z,LWRITEH ; c=11 Write Long RESR_H LD A,DSS_Error.drv.INVALID_COMMAND SCF RET -;Commands for restart #18 -INIT_H PUSH IY + +//////////////////////////////////////////////////////////////////////// +// Commands for restart #18 // +//////////////////////////////////////////////////////////////////////// + +;!FIXIT ---------------------------------------------------------------------------[v] +; c=0 Initialization +INIT_H: PUSH IY LD HL,LOGDRV LD (OFFSECT),HL - LD IX,DEVICE_CFG ;!TODO сделать RAMDRIVE тут в DEVICE_CFG ? + + ; IN A,(SLOT2) + ; PUSH AF + ; IN A,(SLOT0) + ; OUT (SLOT2),A + + ;LD IX,DEVICE_CFG+#8000 ; могло засрать память + LD IX,SYS_PAGE.TMP_BUFFER LD C,BIOS.DRV_LIST RST ToBIOS - XOR A - ;!TEST - ;LD B,(IX+2) ;HDD - ;CP B - CP (IX+2) - JR Z,NO_HARDS - LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта -NX_DVCI PUSH BC + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + XOR A + LD B,(IX+2) ;количество HDD для процедуры NX_DVCI + CP B + LD A,C + OUT (SLOT3),A + JR Z,NO_HARDS + ;LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT + LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT + +NX_DVCI: PUSH BC LD A,C - LD (DRV),A - CALL PARTIT + LD (DRV_NUM),A + LD C,BIOS.DRV_DETECT + RST ToBIOS + ;JR C,.NO_DRIVE + CALL NC,PARTIT POP BC INC C + JR C,NX_DVCI DJNZ NX_DVCI -;R02 -;R02 LD A,#80 -;R02 LD (DRV),A -;R02 LD C,SLOT3 -;R02 IN B,(C) -;R02 LD A,SYSPAGE -;R02 OUT (C),A -;R02 LD HL,IDE0 -;R02 CALL YEP_DRV -;R02 OUT (C),B -;R02 CALL NZ,PARTIT -;R02 -;R02 LD A,#81 -;R02 LD (DRV),A -;R02 LD C,SLOT3 -;R02 IN B,(C) -;R02 LD A,SYSPAGE -;R02 OUT (C),A -;R02 LD HL,IDE1 -;R02 CALL YEP_DRV -;R02 OUT (C),B -;R02 CALL NZ,PARTIT + + +; c=0 Initialization +; INIT_H: PUSH IY +; LD HL,LOGDRV +; LD (OFFSECT),HL +; LD IX,DEVICE_CFG ;!FIXIT не засрет ли память? +; LD C,BIOS.DRV_LIST +; RST ToBIOS +; XOR A +; ;!TEST +; ;LD B,(IX+2) +; ;CP B +; CP (IX+2) ;HDD +; JR Z,NO_HARDS +; LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT +; ;LD C,#80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT + +; NX_DVCI: PUSH BC +; LD A,C +; LD (DRV_NUM),A +; LD C,BIOS.DRV_DETECT +; RST ToBIOS +; ;JR C,.NO_DRIVE +; CALL NC,PARTIT +; POP BC +; INC C +; ;JR C,NX_DVCI +; DJNZ NX_DVCI +;!FIXIT ---------------------------------------------------------------------------[^] +; + NO_HARDS: POP IY LD HL,(OFFSECT) @@ -245,37 +289,21 @@ NO_HARDS: SBC HL,DE RET Z LD DE,LD_DSK -DRVCLC INC A +DRVCLC: INC A SBC HL,DE JR NZ,DRVCLC AND A RET -DEVICE_CFG EQU #4000 +;DEVICE_CFG EQU #4000 ;!TEST +;DEVICE_CFG EQU DRV_TEMP_BUFFER ;!TEST ; DB 0 ;LEN ; DB 0 ;FDD COUNT ; DB 0 ;HDD COUNT ; DB 0 ;CDROM COUNT ; DS 28 ;RESERVED -YEP_DRV LD A,#FF -; CP (HL) -; RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET NZ - INC HL - CP (HL) - RET + ;+00 ;SECTORS PER TRACK ;+01 ;TRACKS PER CYLLINDER @@ -286,40 +314,17 @@ YEP_DRV LD A,#FF ;+06 ;RESERVED ;+07 ;RESERVED -DRVHD_H EQU 0 -SC_PT_H EQU 1 -HEADS_H EQU 2 -CYL_L_H EQU 3 -CYL_H_H EQU 4 -SPCLL_H EQU 5 -SPCLH_H EQU 6 - -;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00 -; DB #FF ;SECTORS PER TRACK ;01 -; DB #FF ;HEADS ;02 -; DB #FF ;CYLINDERS LOW ;03 -; DB #FF ;CYLINDERS HIGH ;04 -; DB #FF ;SECTOR PER CYLINDER LOW ;05 -; DB #FF ;SECTOR PER CYLINDER HIGH ;06 -; DB #FF ;RESERVED ;07 - -;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00 -; DB #FF ;SECTORS PER TRACK ;01 -; DB #FF ;HEADS ;02 -; DB #FF ;CYLINDERS LOW ;03 -; DB #FF ;CYLINDERS HIGH ;04 -; DB #FF ;SECTOR PER CYLINDER LOW ;05 -; DB #FF ;SECTOR PER CYLINDER HIGH ;06 -; DB #FF ;RESERVED ;07 - -LOGDRV BLOCK 12*LD_DSK,0 +LOGDRV: BLOCK 16*LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 -SELHDD PUSH DE +.Size EQU $-LOGDRV + + +SELHDD: PUSH DE PUSH BC PUSH HL LD L,A @@ -349,8 +354,6 @@ SELHDD PUSH DE ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK - - IOCTL_H BIT 7,B JR NZ,O_CTL_H INC B @@ -400,14 +403,17 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE ; DE' - HEADS ON PHISICAL DISK ; BC' - SECTORS PER TRACK ON PHISICAL DISK ; A' - PHISICAL DRIVE NUMBER -; A - DRIVE/HEAD REGISTER PHISICAL DISK -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED - -HGETPRM EX DE,HL +; A - DRIVE/HEAD REGISTER PHISICAL DISK: +; bit7 - reserved "1" +; bit6 - ADDRESSING MODE LBA/CHS +; bit5 - reserved "1" +; bit4 - DEVICE MASTER/SLAVE +; bit3 - reserved "0" (MAY BE OTHER) +; bit2 - reserved "0" (MAY BE OTHER) +; bit1 - reserved "0" (MAY BE OTHER) +; bit0 - Primary/Secondary Chanel +HGETPRM: + EX DE,HL LD BC,#55AA AND A SBC HL,BC @@ -415,6 +421,8 @@ HGETPRM EX DE,HL LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET NZ + + PUSH IX PUSH IY LD H,0 ADD HL,HL @@ -423,55 +431,81 @@ HGETPRM EX DE,HL ADD HL,HL LD B,H LD C,L - LD IY,LOGDRV ;!FIXIT нахрена тут индексный? + LD IY,LOGDRV ADD IY,BC - LD E,(IY+5) - LD D,(IY+6) - LD L,(IY+7) - LD H,(IY+8) - LD A,(IY+0) - LD C,A - LD IY,SYS_PAGE.IDE_0 - AND #0F - JR Z,GELH1 - LD IY,SYS_PAGE.IDE_1 - CP 2 - JR C,GELH1 - LD IY,SYS_PAGE.IDE_2 - JR Z,GELH1 - LD IY,SYS_PAGE.IDE_3 -GELH1 IN A,(SLOT3) - PUSH AF - LD A,SYS_PAGE - OUT (SLOT3),A - - LD A,(IY+DRVHD_H) ;HDD/DRV - EXX - LD L,(IY+CYL_L_H) ;CYLINDER LOW - LD H,(IY+CYL_H_H) ;CYLINDER HIGH - LD E,(IY+HEADS_H) ;HEADS - LD D,0 - LD C,(IY+SC_PT_H) ;SECTORS - LD B,0 - EXX - EX AF,AF' - POP AF - OUT (SLOT3),A - LD A,C - EX AF,AF' + ; + LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;!TEST --------------------------------------------------------------------------------+ + PUSH IY + LD C,BIOS.DRV_GET_PAR + RST ToBIOS POP IY + LD A,DSS_Error.drv.INVALID_DRIVE + JR C,.error + + EX DE,HL + LD C,E + LD E,D + LD D,0 + LD A,B + LD B,D + EXX + + ;SECTORS ON LOGICAL DISK + LD E,(IY+5) + LD D,(IY+6) + LD L,(IY+7) + LD H,(IY+8) + ; + EX AF,AF' + LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + EX AF,AF' + +; LD C,A +; LD IY,SYS_PAGE.IDE_0 +; AND #0F +; JR Z,GELH1 +; LD IY,SYS_PAGE.IDE_1 +; CP 2 +; JR C,GELH1 +; LD IY,SYS_PAGE.IDE_2 +; JR Z,GELH1 +; LD IY,SYS_PAGE.IDE_3 +; GELH1: IN A,(SLOT3) +; PUSH AF +; LD A,SYS_PAGE +; OUT (SLOT3),A + +; LD A,(IY+HDD_INIT_TABLE.DRV_Flags) ;HDD/DRV +; EXX +; LD L,(IY+HDD_INIT_TABLE.CylinderNumberLow) ;CYLINDER LOW + +; LD H,(IY+HDD_INIT_TABLE.CylinderNumberHigh) ;CYLINDER HIGH + +; LD E,(IY+HDD_INIT_TABLE.HeadsNumber) ;HEADS + +; LD D,0 +; LD C,(IY+HDD_INIT_TABLE.SectorsPerTrack) ;SECTORS + +; LD B,0 +; EXX +; EX AF,AF' +; POP AF +; OUT (SLOT3),A +; LD A,C +; EX AF,AF' +;!TEST --------------------------------------------------------------------------------+ + AND A +.error: POP IY + POP IX + RET + +REMOV_H: + LD A,1 AND A RET -REMOV_H LD A,1 - AND A +RESE_H: XOR A RET -RESE_H XOR A - RET - -STAT_H XOR A +STAT_H: XOR A RET CHEK_H: @@ -484,8 +518,7 @@ CHEK_H: ;HL:IX - SECTOR ; DE - ADDRESS - -GBPB_H PUSH IY +GBPB_H: PUSH IY PUSH DE LD L,A LD H,0 @@ -506,7 +539,7 @@ GBPB_H PUSH IY LD A,(IY+0) POP DE POP IY - LD BC,#0155 + LD BC,1*256 + BIOS.DRV_READ RST ToBIOS RET @@ -514,10 +547,11 @@ GBPB_H PUSH IY ; DE - ADDRESS ; B - COUNTER ; A'- PAGE +; A - HDD NUMBER +#80 ;READ SECTOR -LREADH PUSH IY +LREADH: PUSH IY CALL SELHDD - LD C,#52 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_READ_LONG RST ToBIOS POP IY RET @@ -526,10 +560,12 @@ LREADH PUSH IY ; DE - ADDRESS ; B - COUNTER ; A'- PAGE +; A - HDD NUMBER +#80 ;WRITE SECTOR -LWRITEH PUSH IY +LWRITEH: + PUSH IY CALL SELHDD - LD C,#53 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_WRITE_LONG RST ToBIOS POP IY RET @@ -537,10 +573,11 @@ LWRITEH PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER +; A - HDD NUMBER +#80 ;WRITE SECTOR -WRITEH PUSH IY +WRITEH: PUSH IY CALL SELHDD - LD C,#56 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_WRITE RST ToBIOS POP IY RET @@ -548,10 +585,11 @@ WRITEH PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER +; A - HDD NUMBER +#80 ;READ SECTOR -READH PUSH IY +READH: PUSH IY CALL SELHDD - LD C,#55 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_READ RST ToBIOS POP IY RET @@ -559,18 +597,20 @@ READH PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER +; A - HDD NUMBER +#80 ;CHECK SECTOR -CHECKH PUSH IY +CHECKH: PUSH IY CALL SELHDD - LD C,#54 ; A - HDD NUMBER +128 + LD C,BIOS.DRV_VERIFY RST ToBIOS POP IY RET ;----------------- -EASYDOS -MEDIDOS -HIGHDOS LD E,(IY+08) +EASYDOS: +MEDIDOS: +HIGHDOS: + LD E,(IY+08) LD D,(IY+09) LD L,(IY+10) LD H,(IY+11) @@ -599,7 +639,7 @@ HIGHDOS LD E,(IY+08) LD (IX+6),D LD (IX+7),L LD (IX+8),H - LD A,(DRV) + LD A,(DRV_NUM) LD (IX+0),A LD DE,LD_DSK ; DSKITEM ADD IX,DE @@ -611,7 +651,7 @@ NXTPART LD DE,#10 AND A RET -PARTIT IN A,(SLOT3) +PARTIT: IN A,(SLOT3) PUSH AF LD A,DSS_PAGE OUT (SLOT3),A @@ -628,14 +668,14 @@ PARTIT2 LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC ;!TEST - RET C ;FOR IDE2..3 + ;RET C ; for absent drive ; - LD HL,(PART+510) + LD HL,(PART+510) ;!HARDCODE LD DE,#AA55 AND A SBC HL,DE JR NZ,NODEFIN - LD IY,PART+#01BE + LD IY,PART+#01BE ;!HARDCODE LD B,4 DOSAGA PUSH BC LD A,(IY+4) @@ -670,8 +710,7 @@ NOEXTDS CP #0F NODEFIN SCF RET -EXTDOS - LD HL,(EXTDOSL) +EXTDOS: LD HL,(EXTDOSL) LD DE,(EXTDOSH) LD A,L OR H @@ -701,13 +740,13 @@ LOADSEC PUSH IY LD IX,(CURSECL) LD HL,(CURSECH) LD DE,PART + LD A,(DRV_NUM) LD BC,1*256 + BIOS.DRV_READ - LD A,(DRV) RST ToBIOS POP IY RET -DRV DB #00 ;PHISICAL DRIVE NUMBER +DRV_NUM DB #00 ;PHISICAL DRIVE NUMBER. номер девайса (#80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв) CURSECL DW #0000 ;CURRENT SECTOR LOADED CURSECH DW #0000 diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index b266f7f..34417d1 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -247,7 +247,8 @@ CHEK_RD LD A,#FF RET ;DE - ADDRESS -GBPB_RD LD IX,0 +GBPB_RD: + LD IX,0 LD HL,0 LD B,#01 ;JP READ_RD @@ -329,7 +330,6 @@ INIT_RD: LD (DE),A INC DE JP 1F - .noDRV: POP BC 1: INC B LD A,RAMDTBL.Size / 2 diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index de0c995..03acf6a 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -116,6 +116,9 @@ ; EX (SP),HL ; RET +;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые + + ;------------------------------------------------- ; RST 18h. Вектор дисковых устройств ; вход: a=номер устройства (0-25) @@ -159,7 +162,7 @@ NODEV: POP BC PDEVICE DW DEVICE DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF -.End: DB #FF +.Size: DB #FF FLOPPY EQU #0001 FIXED EQU #0002 @@ -191,33 +194,30 @@ NETWORK EQU #0008 ;----------------------------------------------------------------------- ;R01 -INITDVC_RET_DRIVE: - CALL INITDVC - LD A,(LDRIVE) - AND A - RET +; INITDVC_RET_DRIVE: +; CALL INITDVC +; LD A,(DRV_PAGE.LDRIVE) +; AND A +; RET ; ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски ;----------------------------------------------------------- INITDVC: XOR A - LD (LDRIVE),A ; сбр. ячейку + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку ; FDD девайсы - LD C,A - CALL FDDRIVE ; узнать число FDD-девайсов + CALL FDDRIVE.INIT ; узнать число FDD-девайсов LD DE,FDDRIVE ; адрес обработчика тек. девайса CALL MAKEDVC ; иниц. таблицу переходов ; HDD девайсы - LD C,0 - CALL HDDRIVE +.if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET LD DE,HDDRIVE CALL MAKEDVC ; RAM-диски - LD C,0 - CALL RMDRIVE + CALL INIT_RD LD DE,RMDRIVE CALL MAKEDVC XOR A @@ -227,7 +227,7 @@ INITDVC: XOR A ; вход: de=адрес обработчика девайса ; a=число девайсов (0=нет) MAKEDVC: LD C,A - LD HL,LDRIVE ; ячейка номера посл. диска + LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска ADD A,(HL) LD (HL),A LD A,C @@ -235,7 +235,7 @@ MAKEDVC: LD C,A OR A RET Z ; нет девайсов LD HL,(PDEVICE) ; тек. полож. в таблице -.loop: LD (HL),C ; номер драйва этого устройства (младшие 4 бита). Например, для HDD #81: #80 - тип драйва, 1 - номер драйва +.loop: LD (HL),C ; номер лог.драйва этого устройства INC HL LD (HL),E ; de=адрес обработчика INC HL @@ -269,5 +269,4 @@ MAKEDVC: LD C,A ; DW HDDRIVE ; HDD I ; DB #07 ; DW HDDRIVE ; HDD J -; DB #FF - +; DB #FF \ No newline at end of file diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index de58e29..f7128db 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -12,7 +12,7 @@ ;--------------------------------------------------------------- ; CLEAR TEXT WINDOW -CLEAR LD C,BIOS.LP_CLS_WIN2 +CLEAR: LD C,BIOS.LP_CLS_WIN2 RST ToBIOS AND A RET @@ -20,7 +20,7 @@ CLEAR LD C,BIOS.LP_CLS_WIN2 ; PRINT NULL-TERMINATED CHARS STRING ; HL - STRING POINTER -PCHARS LD A,(HL) +PCHARS: LD A,(HL) INC HL OR A RET Z diff --git a/DSS/build.txt b/DSS/build.txt index ac4213d..c9c4108 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -43 \ No newline at end of file +114 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index e0fcecc..2ef0604 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -12,11 +12,13 @@ DEFINE TABisSPACES 1 DEFINE CLASSIC_CURSOR 0 DEFINE SAVE_PATH_MACRO 0 + DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; DEFINE USING_MEMPAGES 4 DEFINE OLD_SET_BANK 0 + PORTAL.RSTx18_SWITCH_ADDRESS #82 ; кэш списка каталога DIRPAGE EQU 0 FATPAGE EQU 1 diff --git a/Shared_Includes b/Shared_Includes index 94cb0e3..b25c377 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 94cb0e39f321bd11519008801187d93eacb280f2 +Subproject commit b25c3779d6af8abc2970d3a9a55006f43292c86e From f6e41854a8b023c53b22105d1b80a90a065af7d8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 6 Aug 2023 06:16:13 +1000 Subject: [PATCH 026/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Console/CONSOLE.ASM | 225 ++++++++++++++----------- Console/build.txt | 1 + Console/version.inc | 22 +++ DSS/DOS5.ASM | 24 +-- DSS/DRV-MAIN.ASM | 26 +-- DSS/DSS-MAIN.ASM | 11 +- DSS/EXECUTE.ASM | 4 +- DSS/KEYINTER.ASM | 6 +- DSS/Media_drivers/ide-drv.asm | 2 +- DSS/VIDEO.ASM | 309 +++++++++++++++++++--------------- DSS/build.txt | 2 +- DSS/defines.inc | 5 +- Shared_Includes | 2 +- 13 files changed, 374 insertions(+), 265 deletions(-) create mode 100644 Console/build.txt create mode 100644 Console/version.inc diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 4b20315..900999e 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -10,12 +10,11 @@ ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] +;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION ;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти ;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP -;R09 ??-??-???? DNS ;????? ???? -;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS -; WHEN LINE BEGAN AT #xx00 OFFSET +;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET ;R07 14-12-2002 DNS PARSING BATCH LINE ;R06 12-12-2002 DNS ADD %0, %1, %2 ... ;R05 11-12-2002 DNS IMPLEMENTED %VAR% @@ -25,8 +24,10 @@ ;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO ;=====================================================================[] - include 'shared_includes/constants/bios_equ.inc' - include 'shared_includes/constants/dss_equ.inc' + includelua 'Shared_includes/lua/Functions.lua' + include 'shared_includes/constants/bios_equ.inc' + include 'shared_includes/constants/dss_equ.inc' + include 'console/version.inc' ; ; Standart EQU section @@ -105,7 +106,7 @@ FPRIMAR LD C,Dss.CTRLKey JP CONSOLE ;R07 -MAKE_BATCH_PRM_ARRAY +MAKE_BATCH_PRM_ARRAY: DEC HL B_SKIP_SPACE INC HL @@ -122,10 +123,10 @@ B_SKIP_SPACE LD (HL),D INC HL EX DE,HL -B_FIND_SPACE +B_FIND_SPACE: INC HL LD A,(HL) - CP "!" + CP " "+1 JR NC,B_FIND_SPACE LD (HL),0 OR A @@ -187,13 +188,13 @@ ADDBAT PUSH DE JR NZ,BATLINE EX DE,HL LD DE,CMDLINE - AND A + ;AND A SBC HL,DE - RET Z + JR Z,.exit LD A,L LD (CMDLINE-1),A CALL CMDMODE - LD A,(BAT_FM) +.exit: LD A,(BAT_FM) LD C,Dss.Close RST ToDSS RET @@ -214,24 +215,22 @@ NBLINE CALL MOVWORD LD DE,CMDLINE POP HL JP NBLINE - -MOVWORD LD A,(BAT_LEN) +MOVWORD: LD A,(BAT_LEN) LD B,A -M00WORD LD A,(HL) +.loop: LD A,(HL) LD (DE),A - CP #20 - JR C,M01WORD + CP ' ' INC HL + JR C,.loop2 INC DE - DJNZ M00WORD + DJNZ .loop SCF RET - -M01WORD LD A,(HL) - CP #20 +.loop2: LD A,(HL) + CP ' ' RET NC INC HL - DJNZ M01WORD + DJNZ .loop2 ;R08 PUSH DE CALL READBAT @@ -240,7 +239,7 @@ M01WORD LD A,(HL) LD A,(BAT_LEN) LD B,A OR A - JR NZ,M01WORD + JR NZ,.loop2 SCF ;R08 RET @@ -326,10 +325,12 @@ CONSOLE: RE_: CALL GETXY CALL GETPATH ; CALL VERS - LD HL,CMDLINE - LD DE,CMDLINE+1 + ;!TEST + LD HL,CMDLINE-1 + LD DE,CMDLINE + LD (HL),0 - LD BC,#7F + LD BC,#7F ;!HARDCODE длина CMDLINE LDIR CALL INPUT CALL CRLF @@ -344,13 +345,13 @@ GETXY LD C,Dss.Cursor RST ToDSS JP LOCAT -INPUT XOR A +INPUT: XOR A LD (POSIT),A - LD (SHIFT),A + LD (PRINT_S.SHIFT),A LD (LEN_NEW),A LD IX,CMDLINE-2 CALL CEDIT - CALL RES_CUR + CALL RES_CUR ;!FIXIT scroll починить, тут тоже влияет вроде RET COMP: CALL EVALCMD ;R05 @@ -530,9 +531,9 @@ RUN_BAT CALL BATCH RET ; !! Не делать одну команду > 256 символов)) !! -BATLIST DZ 'PAUSE' : DW CPAUSE +BATLIST: DZ 'PAUSE' : DW CPAUSE DZ 'REM' : DW CREM -CMDLIST DZ 'CD' : DW CCHDIR +CMDLIST: DZ 'CD' : DW CCHDIR DZ 'DIR' : DW DIR DZ 'ECHO' : DW CECHO DZ 'PATH' : DW CPATH @@ -710,14 +711,14 @@ CPAUSE LD DE,PAUSMSG RET - ;R09 + PATHSTR DB "PATH=",0 CPATH LD A,(DE) OR A JP Z,PRNEPATH INC DE - CP 9 + CP 9 ; Tab JR Z,CPATH CP "!" JR C,CPATH @@ -751,7 +752,6 @@ PRNEPATH RST ToDSS CALL CRLF RET - ;R09 CSET LD A,(DE) @@ -834,7 +834,7 @@ ECHO_FR LD A,#FF ;R04 -EVALCMD +EVALCMD: XOR A LD HL,CMDLINE-1 LD C,(HL) @@ -862,13 +862,13 @@ MOVLBAK LD A,(HL) ; HL - STRING WITH %VAR% EVALSTR ;R04 LD DE,DTA -VARLOOP +;VARLOOP LD A,(HL) CP "%" JR Z,TVARIABLE VARL1 LDI OR A - JR NZ,VARLOOP + JR NZ,EVALSTR LD BC,0 LD (TVAR_PNT),BC ;R04 LD HL,DTA @@ -887,7 +887,7 @@ IEIGHT DB "EIGHT",0 ININE DB "NINE",0 ;R06 -BAT_PRM_ARRAY +BAT_PRM_ARRAY: DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;R06 @@ -934,7 +934,7 @@ MVBTP LD A,(HL) JR NZ,MVBTP DEC DE NOBTP POP HL - JP VARLOOP ;R06 + JP EVALSTR ;R06 ;R06 TVAR1 PUSH HL @@ -960,7 +960,7 @@ TNOVAR POP HL INC HL LD BC,0 LD (TVAR_PNT),BC - JP VARLOOP + JP EVALSTR ;R01 COMPARE LD A,(DE) @@ -1647,28 +1647,16 @@ hex8: push af VERS: LD C,Dss.Version RST ToDSS - PUSH BC - PUSH DE - LD L,D - LD H,0 + LD H,E LD DE,PRM1 - CALL .num_ver ;decim2 номер версии (0..9) - LD A,'.' - LD (DE),A - - INC DE - POP HL - LD H,0 - CALL .num_mod ;decim2 номер модификации (0..99) - POP HL - LD A,'.' - LD (DE),A - INC DE - CALL .num_build ;decim3 номер билда (0..999) - XOR A - LD (DE),A - + CALL .Set_Ver_to_PRM ; set DSS version + ;R13 + LD HL,256*CONSOLE_MODF + CONSOLE_VERS + LD BC,CONSOLE_BUILD + LD DE,PRM2 + CALL .Set_Ver_to_PRM ; set Shell version + ;R13 LD DE,VERSMSG JP MESSAGE @@ -1707,6 +1695,32 @@ VERS: LD C,Dss.Version ld (de),a ; сохр. в буфере inc de ret + ; +; Вход: +; L - номер версии (0..9) +; H - номер модификации (0..99) +; BC - номер билда (0..999) +; DE - номер параметра +.Set_Ver_to_PRM: + PUSH BC + PUSH HL + LD H,0 + CALL .num_ver ;decim2 номер версии (0..9) + LD A,'.' + LD (DE),A + INC DE + POP HL + LD L,H + LD H,0 + CALL .num_mod ;decim2 номер модификации (0..99) + POP HL + LD A,'.' + LD (DE),A + INC DE + CALL .num_build ;decim3 номер билда (0..999) + XOR A + LD (DE),A + RET /* VERS: LD C,Dss.Version @@ -1777,8 +1791,7 @@ CEXIT: LD A,(TASKX) DEC A RET Z POP HL -QUIT: LD B,0 - LD C,Dss.Exit +QUIT: LD BC,Dss.Exit RST ToDSS RET @@ -1804,7 +1817,7 @@ ERR_MSG: INC DE MESSAGE: CALL FMESAGE CALL PRINTZ - CALL GETXY + ;CALL GETXY RET FMESAGE: INC DE @@ -1847,12 +1860,14 @@ PUTPRMA: LD A,(HL) // ret + PRINTZ: LD A,(HL) INC HL OR A RET Z CP "%" JR NZ,.char + LD A,(HL) INC HL SUB "1" @@ -1902,20 +1917,32 @@ DIR3MSG EQU 10 HELPMSG EQU 11 MSG0: DB 0 +; 0 DB "Volume in drive %1 has no label",CR,LF ; !FIXIT DB "Volume Serial number is %2",CR,LF DB "Directory of %3",CR,LF,CR,LF,0 - DB "Estex DSS: Version %1",CR,LF,0 ;R02 +; 1 + DB "Estex DSS: Version %1",CR,LF + DB "Console: Version %2",CR,LF,0 ;R13 +; 2 DB "Current date: %1",CR,LF,0 +; 3 DB "Current time: %1",CR,LF,0 +; 4 DB "Press any key to continue . . .",CR,LF,0 +; 5 DB "Invalid parametr",CR,LF,0 +; 6 DB "Echo is %1",CR,LF,0 +; 7 DB "on",0 +; 8 DB "off",0 +; 9 DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 -; FILENAME EXT SIZE DATE TIME +; 10 FILENAME EXT SIZE DATE TIME DB "%1 %2 %3 %4 %5",CR,LF,0 +; 11 DB "COMMANDS:",CR,LF,CR,LF DB "DIR REN | RENAME PATH HELP ",CR,LF DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF @@ -1935,8 +1962,8 @@ ERR0: DB #00 DZ "File not found" ; 03 - файл не обнаружен DZ "Path not found" ; 04 - неверный путь DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "No free filehandle" ; 06 - нет свободного файлового манипулятора - DZ "File exist" ; 07 - файл существует + DZ "Too many open files" ; 06 - нет свободного файлового манипулятора + DZ "File already exist" ; 07 - файл существует DZ "File read only" ; 08 - файл только для чтения DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) DZ "No free space" ; 10 - нет свободного места на диске @@ -1959,14 +1986,14 @@ ERR0: DB #00 DZ "Drive failure" ; 27 - сбой диска DZ "Extended error 28" DZ "Extended error 29" - DZ "No free memory" ; 30 - недостаточно памяти + DZ "Not enough memory" ; 30 - недостаточно памяти DZ "Invalid memory block" ; 31 - несуществующий блок памяти DZ "Extended error 32" DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной DZ "Extended error 34" DZ "Too many files in directory" ; 35 - слишком много файлов в директории DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation interrupted by user" ; 37 - операция прервана пользователем + DZ "Operation aborted by user" ; 37 - операция прервана пользователем DZ "Common error" ; 38 - общая ошибка DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения DZ "40" @@ -2085,14 +2112,14 @@ LFF PUSH HL POP HL RET -PRINTX CP #20 +PRINTX: CP ' ' JP NC,CHAR CP #0D JP Z,CR_ CP #0A JP Z,LF_ -CHAR PUSH BC - LD BC,#0182 +CHAR: PUSH BC + LD BC,1*256 + BIOS.LP_PRINT_SYM RST ToBIOS POP BC RET @@ -2113,11 +2140,11 @@ CEDIT PUSH IX LD (ETXS),HL XOR A LD (POSIT),A - LD (SHIFT),A + LD (PRINT_S.SHIFT),A EDIT1 LD DE,(ETXS) CALL PRINT_S CALL KEY - CP 13 + CP 13 ; enter code RET Z LD HL,EDIT1 PUSH HL @@ -2165,7 +2192,7 @@ ADD_SM EX AF,AF' LD HL,(ETXE) INC HL LD (ETXE),HL - LD HL,SHIFT + LD HL,PRINT_S.SHIFT SUB (HL) CP (IX-1) RET C @@ -2175,14 +2202,14 @@ ADD_SM EX AF,AF' ; CALL PAGE RET -BACK LD A,(POSIT) +BACK: LD A,(POSIT) OR A RET Z ;JP Z,BCK DEC A LD (POSIT),A LD (MAIN_X),A INC A - LD HL,SHIFT + LD HL,PRINT_S.SHIFT SUB (HL) RET NZ LD A,(STEP) @@ -2199,7 +2226,7 @@ FORW LD A,(POSIT) INC A LD (POSIT),A LD (MAIN_X),A - LD HL,SHIFT + LD HL,PRINT_S.SHIFT SUB (HL) CP (IX-1) RET C @@ -2236,7 +2263,7 @@ SUB_SM XOR A LD HL,(ETXE) DEC HL LD (ETXE),HL - LD HL,SHIFT + LD HL,PRINT_S.SHIFT INC A SUB (HL) RET NZ @@ -2249,7 +2276,7 @@ SUB_SM XOR A RET KEY ;RES 5,(IY+1) - LD A,(SHIFT) + LD A,(PRINT_S.SHIFT) LD E,A LD A,(POSIT) SUB E @@ -2310,7 +2337,8 @@ RES_CUR LD A,(CURSORX) LD A,(_A+1) JP PRINTX -PRINT_S PUSH DE +PRINT_S: + PUSH DE CALL GETXY ;;; LD DE,(TEMPXY) LD E,0 @@ -2321,36 +2349,34 @@ PRINT_S PUSH DE CALL PRINTX POP DE EX DE,HL -SH LD BC,#0000 +.SHIFT+1: LD BC,#0000 ADD HL,BC - LD A,(SHIFT) + LD A,(.SHIFT) LD C,A LD A,(IX+1) SUB C - JP Z,EMT_STR + JP Z,.EMT_STR LD B,A LD A,(IX-1) SUB B - JR NC,PR_S + JR NC,.PR_S LD B,(IX-1) -PR_S PUSH BC - LD C,#86 +.PR_S: PUSH BC + LD C,BIOS.LP_PRINT_LINE2 RST ToBIOS POP BC -EMT_STR LD A,(IX-1) +.EMT_STR: LD A,(IX-1) SUB B EI RET Z LD B,A - LD C,#82 - LD A,#20 + LD A,' ' + LD C,BIOS.LP_PRINT_SYM RST ToBIOS EI RET -SHIFT EQU SH+1 - -GET_CMD LD D,XH +GET_CMD: LD D,XH LD E,XL EX DE,HL LD E,(HL) @@ -2444,10 +2470,19 @@ BAT_BUFFER.size EQU 128 ;!FIXIT BAT_BUFFER LENGTH - +/* +; Структура строки ввода ~input line~ +struct_input_line: + db max_len_comline ;+0 254 макс. число ввод. символов + db 0 ;+1 флаг ReadyString + db 0 ;+2 X тек. полож. курсора в пределах строки + db 0 ;+3 X смещ. строки за левый край (в символах) + db 0 ;+4 число введенных символов + ds max_len_comline+1 ;+5 строка ввода +*/ STRUCT BUFFERS_STRUCT -CMDLINE BLOCK 256,0 +CMDLINE BLOCK 256,0 ;!HARDCODE cmdline size TMPLINE BLOCK 256,0 PRMLINE BLOCK 256,0 ;BUFFER @@ -2471,7 +2506,7 @@ BAT_FM DB 0 BAT_LEN DB 0 ECHOFLG DB 0 PATHLEN DB 0 -PATH BLOCK 40,0 ;!FIXIT PATH LENGTH +PATH BLOCK 40,0 ;!HARDCODE PATH LENGTH ENDS diff --git a/Console/build.txt b/Console/build.txt new file mode 100644 index 0000000..b74e882 --- /dev/null +++ b/Console/build.txt @@ -0,0 +1 @@ +31 \ No newline at end of file diff --git a/Console/version.inc b/Console/version.inc new file mode 100644 index 0000000..1d20a76 --- /dev/null +++ b/Console/version.inc @@ -0,0 +1,22 @@ +;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] + LUA PASS1 + Console_build = increase_build("./Console/build.txt") + if Console_build > 999 then + Console_build = 999 + print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a") + end + ENDLUA + LUA ALLPASS + sj.insert_label("lua_BUILD", Console_build) + ENDLUA +;---------------------------------------------------------------------[] + +; +; Shell full version +; номер версии (0..9) +CONSOLE_VERS EQU 1 +; номер модификации (0..99) +CONSOLE_MODF EQU 2 +; номер билда (0..999) +CONSOLE_BUILD EQU lua_BUILD +; \ No newline at end of file diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index f023b0d..3fca848 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -185,7 +185,7 @@ DEL01 EX DE,HL ; hl= ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? ////////////////////////////////////////////////////////////////////// -RENAME PUSH DE +RENAME: PUSH DE LD DE,MASKARE CALL MASK POP DE @@ -1134,7 +1134,7 @@ MASKARE: BLOCK 8,0 ; ; RET: C=2 FILE WITHOUT EXTENTION ; C=1 FILE WITH EXTENTION ;------------------------------------------------- -MASK PUSH HL +MASK: PUSH HL PUSH DE LD H,D LD L,E @@ -1147,13 +1147,13 @@ MASK PUSH HL LD A,(HL) CP '.' ;R07 SCF ;R07 - JR Z,MASKB ;R07 - CP '!' -MASKB LD A,DSS_Error.sys.INVALID_NAME + JR Z,.MASKB ;R07 + CP ' '+1 +.MASKB: LD A,DSS_Error.sys.INVALID_NAME RET C LD BC,#0902 ; B - счетчик -MASK1 LD A,(HL) - CP '!' +MASK1: LD A,(HL) + CP ' '+1 CCF RET NC CP '"' @@ -1201,20 +1201,20 @@ MASK_ERR: SCF RET -MASK3 LD A,'?' +MASK3: LD A,'?' INC HL DJNZ MASK6 LD A,DSS_Error.sys.INVALID_NAME SCF RET -MASK6 LD (DE),A +MASK6: LD (DE),A INC DE DJNZ MASK6 LD B,1 JR MASK1 -MASK5 LD A,' ' +MASK5: LD A,' ' INC HL DJNZ MASK4 LD B,4 @@ -1224,7 +1224,7 @@ MASK5 LD A,' ' SCF RET -MASK4 LD (DE),A +MASK4: LD (DE),A INC DE DJNZ MASK4 LD B,4 @@ -1235,7 +1235,7 @@ MASK4 LD (DE),A RET ; a..z -> A..Z -UPPER CP 'a' +UPPER: CP 'a' RET C CP '{' JR NC,MDUPPER diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 84ed777..b4a201f 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -60,18 +60,18 @@ A0010: ;JP DRV_PAGE.RST_10 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -; -; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; ; <[DRIVE API]> ; -; BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode -; ;A0018 JP INTDISK ; -; A0018: PUSH AF ; -; PUSH BC ; -; DRV_PAGE.MAIN_PAGE_NUMBER+2: ; -; LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? -; JP PORTAL.outDRV ; -; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; + +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[DRIVE API]> ; + BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode +;A0018 JP INTDISK ; +A0018: PUSH AF ; + PUSH BC ; +DRV_PAGE.MAIN_PAGE_NUMBER+2: ; + LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? + JP PORTAL.outDRV ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; + ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; @@ -202,7 +202,7 @@ ADCALL+1: CALL DISPATCH ; JP PORTAL.out_DRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; - display "=============================",/H,(#82-#73-(PORTAL.toMAIN.switch-PORTAL.toMAIN)) + ;!FIXIT чёт не то тут diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 76ccc1c..5e219e9 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -298,8 +298,10 @@ F_START: DI ;R05 .saveDRV+1: LD A,0 - LD BC,1*256 + Dss.BootDSK - RST ToDSS + ;LD BC,1*256 + Dss.BootDSK + ;RST ToDSS + LD B,1 + CALL BOOTDSK EI ;Set new address fn. VERSION @@ -334,8 +336,9 @@ F_START: DI ;R12 .err_oldBIOS: LD HL,.err_oldBIOS_message - LD C,Dss.PChars - RST ToDSS + ;LD C,Dss.PChars + ;RST ToDSS + CALL PCHARS SCF RET .err_oldBIOS_message: diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 28ea073..93fa16d 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -990,7 +990,7 @@ NOINK: LD A,H ;R02 LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE ; - LD A,DSS_PAGE ;!FIXIT втыкать страницы приложения + LD A,SHARED_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A @@ -1159,7 +1159,7 @@ NOINK2: ;R02 LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE ; - LD A,DSS_PAGE + LD A,SHARED_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 7a61a2b..8064e23 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -160,8 +160,10 @@ ECHOKEY: CALL Cursor_On ; CALL Cursor_Off ; выкл. курсор POP AF OR A ; добавил - CALL NZ,PUTCHAR ; вывод "a" на экран - POP BC + ;!FIXIT scroll заменить на вывод символа биосом или WRCHAR + CALL NZ,PUTCHAR ; вывод "a" на экран + ; + POP BC POP DE LD A,E AND A diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 16b9130..ced41ea 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -653,7 +653,7 @@ NXTPART LD DE,#10 PARTIT: IN A,(SLOT3) PUSH AF - LD A,DSS_PAGE + LD A,SHARED_PAGE OUT (SLOT3),A CALL PARTIT1 POP AF diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index f7128db..8a4d3ec 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -6,7 +6,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R03 04-04-2023 BAO FIXED BUGS IN FN WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE +;R03 04-04-2023 BAO FIXED BUGS IN FN SCROLL, SETVMOD, SELPAGE ;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" ;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) ;--------------------------------------------------------------- @@ -20,46 +20,25 @@ CLEAR: LD C,BIOS.LP_CLS_WIN2 ; PRINT NULL-TERMINATED CHARS STRING ; HL - STRING POINTER -PCHARS: LD A,(HL) +PCHARS: ;CALL CURSOR + ;LD A,E + ;LD (.start_x),A + +.loop: LD A,(HL) INC HL OR A RET Z ;PUSH HL + ;LD C,A CALL PUTCHAR - ;POP HL - JP PCHARS + + ;CALL CURSOR + ;LD A,(.start_x) + ;CP E -; PRINT CHAR -; A - CHAR -PUTCHAR: - CP #0D - JP Z,CR_ - CP #0A - JP Z,LF_ - CP #09 - JP Z,TB_ - CP #08 - JP Z,BK_ - ; CP #20 - ; JP NC,CHAR -CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - RST ToBIOS -; САЙМАН тут насильный скролл экрана если напечатал в позиции последнего символа последней строки -; push af -; ld a,e -; cp #4F -; jp nz,.exit -; ld a,d -; cp #1F -; jp nz,.exit -; ld e,0 -; ld c,#84 -; rst 8 -; call LFF -; .exit: -; pop af -; САЙМАН - RET + ;POP HL + JP .loop +NO_NEED_SCROLL: DB 1 BK_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR RST ToBIOS @@ -69,45 +48,52 @@ BK_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR DEC E JP LOCATE -TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS - - IF TABisSPACES - LD B,E - LD A,E - AND #F8 - ADD A,8 - SUB B - LD B,A - LD C,BIOS.LP_PRINT_SYM - LD A,#20 - RST ToBIOS - RET - ELSE - LD A,E - ADD A,8 - AND #78 - LD E,A - JP LOCATE - ENDIF - - +;-----[] LF_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR RST ToBIOS LD A,D CP #1F - JP NC,LFF + JR NC,LFF INC D - //JP LOCATE - CALL LOCATE ; !!!!! Сайман - + IFN EnoughtOnly_LF + JP LOCATE + ELSE + CALL LOCATE + ; !!!! НЕ разрывать LF_ и CR_ !!!! + ENDIF CR_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR RST ToBIOS LD E,0 JP LOCATE +;-----[] - -LFF: PUSH HL +; PRINT CHAR +; A - CHAR +PUTCHAR: + ;CP ' ' + ;JR NC,CHAR + CP #0D + JR Z,CR_ + CP #0A + JR Z,LF_ + CP #09 + JR Z,TB_ + CP #08 + JR Z,BK_ + ;SCF + ;RET +CHAR: + LD BC,1*256 + BIOS.LP_PRINT_SYM + ;!TEST CR+LF+SCROLL + ;JP ToBIOS + RST ToBIOS + ; проверка на переход курсора в самое начало (X:Y == 0:0) + CALL CURSOR + LD A,D + OR E + RET NZ + ; +LFF: PUSH HL ;!FIXIT сохранять текущие прерывания ;PUSH DE LD BC,1*256 + BIOS.LP_SCROLL_UD LD DE,#0020 @@ -118,7 +104,7 @@ LFF: PUSH HL LD DE,#1F00 ;PUSH DE CALL LOCATE - LD A,#20 + LD A,' ' LD BC,#50*256 + BIOS.LP_PRINT_SYM RST ToBIOS EI @@ -126,7 +112,30 @@ LFF: PUSH HL LD DE,#1F00 CALL LOCATE POP HL - RET + RET + + +TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR + RST ToBIOS + + IF TABisSPACES + LD B,E + LD A,E + AND #F8 + ADD A,8 + SUB B + LD B,A + LD C,BIOS.LP_PRINT_SYM + LD A,' ' + JP ToBIOS + ELSE + LD A,E + ADD A,8 + AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти + LD E,A + JP LOCATE + ENDIF +; ; ; SET CURRENT CURSOR POSITION @@ -134,16 +143,18 @@ LFF: PUSH HL ; D = Y ; E = X LOCATE: LD C,BIOS.LP_SET_PLACE - RST ToBIOS - RET + ; LD A,C + ; LD (NO_NEED_SCROLL),A + JP ToBIOS + ;RET ; GET CURRENT CURSOR POSITION ; out: ; D - Y ; E - X CURSOR: LD C,BIOS.LP_GET_PLACE - RST ToBIOS - RET + JP ToBIOS + ;RET ; READ CHAR & ATTR FROM THE SCREEN ; in: @@ -186,14 +197,14 @@ WRCHAR: LD C,A ; H - HEIGHT ; L - WIDTH ; IX - ADDRESS -; B - PAGE, IF IX > 0C000H ; FIXIT не косяк ли тут? банка должна в A' передаваться, а не B +; B - PAGE, IF IX > #C000 WINCOPY: AND A LD A,R ;R02 PUSH AF ;R02 XOR A - EX AF,AF' ;R03 - LD A,B ;R03 - EX AF,AF' ;R03 + ;EX AF,AF' ;R03 + ;LD A,B ;R03 + ;EX AF,AF' ;R03 LD C,BIOS.WIN_COPY DI ;R02 RST ToBIOS @@ -208,14 +219,14 @@ WINCOPY: AND A ; H - HEIGHT ; L - WIDTH ; IX - ADDRESS -; B - PAGE, IF IX > 0C000H ; FIXIT не косяк ли тут? банка должна в A' передаваться, а не B +; B - PAGE, IF IX > #C000 WINREST: AND A LD A,R ;R02 PUSH AF ;R02 XOR A - EX AF,AF' ;R03 - LD A,B ;R03 - EX AF,AF' ;R03 + ;EX AF,AF' ;R03 + ;LD A,B ;R03 + ;EX AF,AF' ;R03 DI ;R02 LD C,BIOS.WIN_RESTORE RST ToBIOS @@ -233,10 +244,13 @@ WINREST: AND A ; B = 1 - SCROLL UP ; B = 2 - SCROLL DOWN ; A = 0 - CLEAR LINE -SCROLL: DJNZ SCR_DW - LD B,A - LD C,H - PUSH BC +SCROLL: DJNZ SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее + ;!TEST + ;LD B,A + ;LD C,H + ;PUSH BC + PUSH AF + ; PUSH DE PUSH HL LD XH,D @@ -248,9 +262,13 @@ SCROLL: DJNZ SCR_DW RST ToBIOS POP HL POP DE - POP BC - XOR A - CP B + ;!TEST + ;POP BC + POP AF + ;XOR A + ;CP B + AND A + ; RET NZ LD A,D ADD A,H @@ -258,7 +276,7 @@ SCROLL: DJNZ SCR_DW LD D,A .print: PUSH DE ;R01 CALL LOCATE - LD A,#20 + LD A,' ' LD B,L LD C,BIOS.LP_PRINT_SYM RST ToBIOS @@ -268,24 +286,32 @@ SCROLL: DJNZ SCR_DW RET SCR_DW: DJNZ SCR_ERR - LD B,A - LD C,L - PUSH BC ;R03 + ;!TEST + ;LD B,A + ;LD C,H + ;PUSH BC + PUSH AF ;R03 + ; PUSH DE PUSH HL LD XH,D LD XL,E INC XH DEC H - LD C,BIOS.WIN_MOVE + LD C,BIOS.WIN_MOVE XOR A RST ToBIOS POP HL POP DE - POP BC ;R03 - XOR A - CP B - JR Z,SCROLL.print + ;!TEST + ;POP BC + POP AF ;R03 + ;XOR A + ;CP B + AND A + ; + RET NZ + JP SCROLL.print ; PUSH DE ;R01 ; CALL LOCATE ; LD A,#20 @@ -303,15 +329,15 @@ SCR_ERR: ; SELECT SCREEN PAGE ; B - SCREEN PAGE -SELPAGE ;PUSH BC +SELPAGE:;PUSH BC LD A,(VMODE) BIT 7,A - JR NZ,SEL2 + JR NZ,.SEL2 PUSH BC LD C,A CALL SETVMOD.TEXT_M POP BC -SEL2 ;POP BC +.SEL2: ;POP BC LD A,B AND #01 OUT (SCREEN_SWITCH),A @@ -426,7 +452,7 @@ G320_56 PUSH BC CALL SETMODE LD HL,TAB_320x256_1 LD E,#00 - JR GRAPH_NEXT + JP GRAPH_NEXT ; CALL SETMODE ; POP BC ; LD A,C @@ -447,7 +473,7 @@ G640_16 PUSH BC CALL SETMODE LD HL,TAB_640x256_1 LD E,#00 - JR GRAPH_NEXT + JP GRAPH_NEXT ; CALL SETMODE ; POP BC @@ -471,42 +497,24 @@ VMODE: DB #03 ;81h - GRAF 320 x 256 (256 colors) ;82h - GRAF 640 x 256 (16 colors) ;83h - GRAF 640 x 256 (256 colors) UNUSED - SETMODE: PUSH DE - LD DE,#FEE0 ;!HARDCODE грязный хак. кидает данные в буфер служебной страницы биоса. - LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает - ;CALL MOVBIOS ; на адрес ниже #C000 и вставляет в третью банку страницу #FE - ;LD A,R - IN A,(SLOT3) + LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса. + LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает + IN A,(SLOT3) ; на адрес ниже #C000 и вставляет в третью банку страницу #FE EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LDIR EX AF,AF' OUT (SLOT3),A - ;JP PO,.skip_EI - ;EI .skip_EI: POP DE - LD IX,#FEE0 ;!HARDCODE грязный хак. - ;LD HL,#0000 + LD IX,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. LD C,BIOS.WIN_OPEN RST ToBIOS SAFE_PORTY ;????? - возможно, что теперь не нужно, везде с банкой 3 работают, проверить XOR A RET -; MOVBIOS: LD A,R -; IN A,(SLOT3) -; EX AF,AF' -; LD A,SYS_PAGE -; OUT (SLOT3),A -; LDIR -; EX AF,AF' -; OUT (SLOT3),A -; RET PO -; EI -; RET - ;IX+0 ;HORIZONTAL ;IX+1 ;VERTICAL ;IX+2 ;X - COORD @@ -536,7 +544,7 @@ ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 ; SAVETXT PUSH AF -;;!!!!! перенесена логика супер дичайшего ускорения + ;!!!!! перенесена логика супер дичайшего ускорения LD A,(VMODE) BIT 7,A JR NZ,NOSAVET @@ -560,10 +568,10 @@ SAVETXT PUSH AF LD L,#28 SVTEXT1 LD (SVHL1),HL LD DE,#0000 - EX AF,AF' ;R03 - LD A,(BANKTBL+TXTPAGE) - LD B,A - EX AF,AF' ;R03 + ;EX AF,AF' ;R03 + LD A,(BANKTBL+TXTPAGE) + LD B,A + ;EX AF,AF' ;R03 LD C,BIOS.WIN_COPY XOR A DI @@ -590,10 +598,10 @@ VVMODE+1: SVHL1+1: LD HL,#2050 LD DE,#0000 - EX AF,AF' ;R03 - LD A,(BANKTBL+TXTPAGE) - LD B,A - EX AF,AF' ;R03 + ;EX AF,AF' ;R03 + LD A,(BANKTBL+TXTPAGE) + LD B,A + ;EX AF,AF' ;R03 LD C,BIOS.WIN_RESTORE XOR A DI @@ -601,8 +609,9 @@ SVHL1+1: EI TCURS+1: LD DE,#0000 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS + ;LD C,BIOS.LP_SET_PLACE + ;RST ToBIOS + CALL LOCATE POP IX POP HL POP DE @@ -681,3 +690,39 @@ PRINT_INIT: ;//MODULE: VIDEO ;[END] + + +; ; САЙМАН +; PUSH AF +; LD A,E +; CP #4F +; JP NZ,.exit +; LD A,D +; CP #1F +; JP NZ,.exit +; LD E,0 +; LD C,BIOS.LP_SET_PLACE +; RST ToBIOS +; CALL LFF +; .exit: +; pop af +; RET +; ; САЙМАН + + +; LD A,D ; в DE координаты текущего знакоместа +; XOR E ; Проверяем на координаты #1F:#4F +; XOR #50 +; RET NZ ; если другие - то выход +; LD E,A +; LD C,BIOS.LP_SET_PLACE +; RST ToBIOS +;LFF: +; ... + +;;;;;;;; + ; LD A,D ; в DE координаты текущего знакоместа + ; XOR E ; Проверяем на координаты #1F:#4F + ; XOR #50 + ; RET NZ ; если другие - то выход +;;;;;;;; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index c9c4108..5d1277e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -114 \ No newline at end of file +147 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 2ef0604..045fb07 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -9,7 +9,8 @@ ; DEFINE MAX_RAMDRIVES 16 DEFINE NeedSafePort_Y 1 - DEFINE TABisSPACES 1 + DEFINE TABisSPACES 0 + DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 DEFINE SAVE_PATH_MACRO 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 @@ -18,7 +19,7 @@ DEFINE USING_MEMPAGES 4 DEFINE OLD_SET_BANK 0 - PORTAL.RSTx18_SWITCH_ADDRESS #82 + DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 ; кэш списка каталога DIRPAGE EQU 0 FATPAGE EQU 1 diff --git a/Shared_Includes b/Shared_Includes index b25c377..0277d42 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b25c3779d6af8abc2970d3a9a55006f43292c86e +Subproject commit 0277d424098318dc45617d6fb2c1cdf405c6d345 From 1199181d535627ed9269aa20a97d96f731cd5601 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 8 Aug 2023 23:58:38 +1000 Subject: [PATCH 027/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Console/build.txt | 2 +- DSS/KEYINTER.ASM | 100 +++++++++++++++++++++++------------- DSS/VIDEO.ASM | 127 +++++++++++++++++++++++++--------------------- DSS/build.txt | 2 +- Shared_Includes | 2 +- 5 files changed, 138 insertions(+), 95 deletions(-) diff --git a/Console/build.txt b/Console/build.txt index b74e882..f70d7bb 100644 --- a/Console/build.txt +++ b/Console/build.txt @@ -1 +1 @@ -31 \ No newline at end of file +42 \ No newline at end of file diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 8064e23..6360c36 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -110,37 +110,56 @@ SCANKEY LD HL,HOST ; IF CLASSIC_CURSOR ;------------------------------; -ECHOKEY: -CURCOUNT+1: LD A,#FF ;R01 - INC A ;R01 - LD (CURCOUNT),A ;R01 - AND #FF ;R01 - JR NZ,NOTUR ;R01 -CURSYM+1: LD A,#00 ;R01 - XOR #01 ;R01 - LD (CURSYM),A ;R01 - LD A," " ;R01 - JR Z,CURSKI ;R01 - LD A,"_" ;R01 -CURSKI: CALL PUTCHAR ;R01 - LD A,8 ;R01 BACKSPACE - CALL PUTCHAR ;R01 -NOTUR: CALL SCANKEY - JR Z,ECHOKEY - PUSH DE - PUSH BC - PUSH AF ;R01 - LD A," " ;R01 - CALL PUTCHAR ;R01 - LD A,8 ;R01 BACKSPACE - CALL PUTCHAR ;R01 - POP AF ;R01 - CALL PUTCHAR - POP BC - POP DE - LD A,E - AND A - RET +ECHOKEY: ;R01 +.CURCOUNT+1: LD A,#FF + INC A + LD (.CURCOUNT),A + AND #FF + JR NZ,.NOTUR +.CURSYM+1: LD A,#00 + XOR #01 + LD (.CURSYM),A + + CALL CURSOR + PUSH DE + + LD A," " + JR Z,.CURSKI + LD A,"_" +.CURSKI: CALL PUTCHAR.NO_SCROLL ;R03 + + POP DE + CALL LOCATE + ;LD A,8 ; BACKSPACE + ;CALL PUTCHAR +.NOTUR: CALL SCANKEY + JR Z,ECHOKEY + PUSH DE + PUSH BC + PUSH AF + + CALL CURSOR + PUSH DE + + LD A," " + CALL PUTCHAR.NO_SCROLL ;R03 + + ;LD A,8 ; BACKSPACE + ;CALL PUTCHAR + POP DE + POP AF + PUSH DE + ;R01 [v] + CALL PUTCHAR.NO_SCROLL + + POP DE + CALL LOCATE + + POP BC + POP DE + LD A,E + AND A + RET ELSE ;------------------------------; @@ -159,9 +178,11 @@ ECHOKEY: CALL Cursor_On ; PUSH AF CALL Cursor_Off ; выкл. курсор POP AF - OR A ; добавил + OR A ;!FIXIT scroll заменить на вывод символа биосом или WRCHAR - CALL NZ,PUTCHAR ; вывод "a" на экран + ; LD BC,1*256 + BIOS.LP_PRINT_SYM + ; RST ToBIOS + CALL NZ,PUTCHAR.NO_SCROLL ; добавил вывод "a" на экран ; POP BC POP DE @@ -186,11 +207,16 @@ Cursor_On: LD C,BIOS.LP_GET_PLACE ; узн JR Z,.put LD B,CURSOR_ZG ; черта LD A,(KEYFLAG) ; флаги клавы - BIT 1,A ; бит Ins - JR NZ,.put + ;BIT 1,A ; бит Ins + AND %0000'0010 ; бит Ins + JR NZ,.put LD B,INS_CUR_ZG ; блок .put: XOR A ; номер окна RST ToBIOS + + LD DE,(Cursor_Off.pos) + CALL LOCATE + LD A,1 LD (Cursor_Off.Flag),A LD A,delay_curs @@ -216,6 +242,10 @@ Cursor_Off: XOR A LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; символ на экран RST ToBIOS + + LD DE,(Cursor_Off.pos) + CALL LOCATE + RET ; Вектор обслуживания курсора diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 8a4d3ec..c5d0136 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -20,70 +20,38 @@ CLEAR: LD C,BIOS.LP_CLS_WIN2 ; PRINT NULL-TERMINATED CHARS STRING ; HL - STRING POINTER -PCHARS: ;CALL CURSOR - ;LD A,E - ;LD (.start_x),A - +PCHARS: .loop: LD A,(HL) INC HL OR A RET Z - ;PUSH HL - ;LD C,A CALL PUTCHAR - - ;CALL CURSOR - ;LD A,(.start_x) - ;CP E - - ;POP HL + ;!TEST CR+LF+SCROLL + ;CALL CURSOR + ;LD A,D ; проверка на переход курсора + ;OR E ; в самое начало (X:Y == 0:0) + ;CALL Z,PUTCHAR.LFF + ; JP .loop -NO_NEED_SCROLL: DB 1 - -BK_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS - XOR A - CP E - JP Z,LOCATE - DEC E - JP LOCATE - -;-----[] -LF_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS - LD A,D - CP #1F - JR NC,LFF - INC D - IFN EnoughtOnly_LF - JP LOCATE - ELSE - CALL LOCATE - ; !!!! НЕ разрывать LF_ и CR_ !!!! - ENDIF -CR_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS - LD E,0 - JP LOCATE -;-----[] ; PRINT CHAR ; A - CHAR PUTCHAR: ;CP ' ' - ;JR NC,CHAR + ;JR NC,.CHAR CP #0D - JR Z,CR_ + JR Z,.CR_ CP #0A - JR Z,LF_ + JR Z,.LF_ CP #09 - JR Z,TB_ + JR Z,.TB_ CP #08 - JR Z,BK_ + JR Z,.BK_ + CP #07 + JR Z,.BELL ;SCF ;RET -CHAR: - LD BC,1*256 + BIOS.LP_PRINT_SYM +.CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM ;!TEST CR+LF+SCROLL ;JP ToBIOS RST ToBIOS @@ -93,13 +61,13 @@ CHAR: OR E RET NZ ; -LFF: PUSH HL ;!FIXIT сохранять текущие прерывания +.LFF: PUSH HL ;!FIXIT сохранять текущие прерывания ;PUSH DE LD BC,1*256 + BIOS.LP_SCROLL_UD LD DE,#0020 - EI - HALT - DI + ;EI + ;HALT + ;DI RST ToBIOS LD DE,#1F00 ;PUSH DE @@ -107,17 +75,14 @@ LFF: PUSH HL ;!FIXIT LD A,' ' LD BC,#50*256 + BIOS.LP_PRINT_SYM RST ToBIOS - EI + ;EI ;POP DE LD DE,#1F00 CALL LOCATE POP HL RET - - -TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR +.TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR RST ToBIOS - IF TABisSPACES LD B,E LD A,E @@ -125,8 +90,8 @@ TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR ADD A,8 SUB B LD B,A - LD C,BIOS.LP_PRINT_SYM LD A,' ' + LD C,BIOS.LP_PRINT_SYM JP ToBIOS ELSE LD A,E @@ -135,6 +100,54 @@ TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR LD E,A JP LOCATE ENDIF +.BK_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR + RST ToBIOS + XOR A + CP E + ;!TEST + ;JP Z,LOCATE + RET Z + DEC E + JP LOCATE +.LF_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR + RST ToBIOS + LD A,D + CP #1F + JR NC,.LFF ;!FIXIT срабатывает как CRLF надо скроллить с сохранением Y + INC D + IFN EnoughtOnly_LF + JP LOCATE + ELSE + CALL LOCATE + ; !!!! НЕ разрывать LF_ и CR_ !!!! + ENDIF +.CR_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR + RST ToBIOS + LD E,0 + JP LOCATE +.BELL: LD DE,1200 + LD HL,4 + JP BEEP +.NO_SCROLL: + ;CP ' ' + ;JR NC,.CHAR + CP #0D + JR Z,.CR_ + CP #0A + JR Z,.LF_ + CP #09 + JR Z,.TB_ + CP #08 + JR Z,.BK_ + CP #07 + JR Z,.BELL + ;SCF + ;RET +._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM + ;!TEST CR+LF+SCROLL + JP ToBIOS + ;RST ToBIOS +;-----[] ; ; diff --git a/DSS/build.txt b/DSS/build.txt index 5d1277e..6547e41 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -147 \ No newline at end of file +171 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 0277d42..7e4985b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 0277d424098318dc45617d6fb2c1cdf405c6d345 +Subproject commit 7e4985b40214f573ba17b707ad5191319841acdd From 209582b50d29d09f247234c11c81bb3d1ed31a76 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 11 Aug 2023 01:18:48 +1000 Subject: [PATCH 028/219] ... --- Console/build.txt | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- Shared_Includes | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Console/build.txt b/Console/build.txt index f70d7bb..ac4213d 100644 --- a/Console/build.txt +++ b/Console/build.txt @@ -1 +1 @@ -42 \ No newline at end of file +43 \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 6547e41..7b27b25 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -171 \ No newline at end of file +173 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 045fb07..ad9ea69 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -11,7 +11,7 @@ DEFINE NeedSafePort_Y 1 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 - DEFINE CLASSIC_CURSOR 0 + DEFINE CLASSIC_CURSOR 1 DEFINE SAVE_PATH_MACRO 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; diff --git a/Shared_Includes b/Shared_Includes index 7e4985b..361bce6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7e4985b40214f573ba17b707ad5191319841acdd +Subproject commit 361bce691cf4130a703e57b8fc7b3b87d3b929de From 361333af09dcdd1223422b6e14d383185cb8c3ce Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 11 Aug 2023 04:54:30 +1000 Subject: [PATCH 029/219] merging with Vasil's sources --- Console/CONSOLE.ASM | 10 +- Console/build.txt | 2 +- DOS/CURSOR.ASM | 63 + DOS/DOS.ASM | 7531 +++++++++++++++++++++++++++++++++++++ DOS/DOS.INC | 91 + DOS/KEYB.ASM | 1003 +++++ DOS/MOUSE.ASM | 874 +++++ DOS/README.RUS | 22 + DOS/SYSTEM.DOS | Bin 0 -> 16265 bytes DOS/pr.bat | 12 + DOS/readme.! | 1 + DSS/VIDEO.ASM | 38 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/BATCH.ASM | 463 +++ SHELL/Commands/CHDIR.ASM | 39 + SHELL/Commands/CLS.ASM | 66 + SHELL/Commands/DATE.ASM | 152 + SHELL/Commands/DEL.ASM | 16 + SHELL/Commands/DIR.ASM | 555 +++ SHELL/Commands/ECHO.ASM | 58 + SHELL/Commands/EXIT.ASM | 12 + SHELL/Commands/HELP.ASM | 8 + SHELL/Commands/MKDIR.ASM | 17 + SHELL/Commands/PATH.ASM | 49 + SHELL/Commands/PAUSE.ASM | 11 + SHELL/Commands/REM.ASM | 6 + SHELL/Commands/REN.ASM | 23 + SHELL/Commands/RMDIR.ASM | 17 + SHELL/Commands/Reboot.asm | 10 + SHELL/Commands/SET.ASM | 35 + SHELL/Commands/VER.ASM | 84 + SHELL/EDLINE.ASM | 1006 +++++ SHELL/ERROR.ASM | 309 ++ SHELL/README.txt | 34 + SHELL/SHELL.ASM | 510 +++ SHELL/SHELL_EXEC.ASM | 193 + SHELL/build.txt | 1 + SHELL/version.inc | 22 + 39 files changed, 13336 insertions(+), 11 deletions(-) create mode 100755 DOS/CURSOR.ASM create mode 100755 DOS/DOS.ASM create mode 100755 DOS/DOS.INC create mode 100755 DOS/KEYB.ASM create mode 100755 DOS/MOUSE.ASM create mode 100755 DOS/README.RUS create mode 100755 DOS/SYSTEM.DOS create mode 100755 DOS/pr.bat create mode 100755 DOS/readme.! create mode 100644 SHELL/BATCH.ASM create mode 100644 SHELL/Commands/CHDIR.ASM create mode 100644 SHELL/Commands/CLS.ASM create mode 100644 SHELL/Commands/DATE.ASM create mode 100644 SHELL/Commands/DEL.ASM create mode 100644 SHELL/Commands/DIR.ASM create mode 100644 SHELL/Commands/ECHO.ASM create mode 100644 SHELL/Commands/EXIT.ASM create mode 100644 SHELL/Commands/HELP.ASM create mode 100644 SHELL/Commands/MKDIR.ASM create mode 100644 SHELL/Commands/PATH.ASM create mode 100644 SHELL/Commands/PAUSE.ASM create mode 100644 SHELL/Commands/REM.ASM create mode 100644 SHELL/Commands/REN.ASM create mode 100644 SHELL/Commands/RMDIR.ASM create mode 100644 SHELL/Commands/Reboot.asm create mode 100644 SHELL/Commands/SET.ASM create mode 100644 SHELL/Commands/VER.ASM create mode 100644 SHELL/EDLINE.ASM create mode 100644 SHELL/ERROR.ASM create mode 100644 SHELL/README.txt create mode 100644 SHELL/SHELL.ASM create mode 100644 SHELL/SHELL_EXEC.ASM create mode 100644 SHELL/build.txt create mode 100644 SHELL/version.inc diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 900999e..6fd72fc 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -63,7 +63,7 @@ START: LD A,(IX-1) LD (TASKX),A PUSH IX - CALL CRLF + ;CALL CRLF CALL GETPATH POP IX ; @@ -417,7 +417,7 @@ COMP002 XOR A ;LD C,#FF LD C,A CPIR -.loop: ;CPI +;.loop: CPI ;JP NZ,.loop ; @@ -1286,7 +1286,7 @@ PDIGIT LD DE,10000 LD DE,10 CALL DIG LD A,L - ADD A,#30 + ADD A,"0" ;#30 ;!TEST ;LD (IX+0),A @@ -1673,6 +1673,7 @@ VERS: LD C,Dss.Version res 7,(ix+0) ld bc,100 ; 100 call .num16 + .decim: ld bc,10 ; 10 call .num16 ld a,l @@ -1680,7 +1681,8 @@ VERS: LD C,Dss.Version jr .num16_exit .tmp1__: BYTE 0 -.num16: ld a,2Fh + +.num16: ld a,'0'-1 and a inc a sbc hl,bc diff --git a/Console/build.txt b/Console/build.txt index ac4213d..abc4eff 100644 --- a/Console/build.txt +++ b/Console/build.txt @@ -1 +1 @@ -43 \ No newline at end of file +46 \ No newline at end of file diff --git a/DOS/CURSOR.ASM b/DOS/CURSOR.ASM new file mode 100755 index 0000000..d7261a7 --- /dev/null +++ b/DOS/CURSOR.ASM @@ -0,0 +1,63 @@ +delay_curs equ 11 ; частота мигания курсора + + + +cursor: db 3Eh ; ld a,.. +crFlag: db 0 ; флаг курсора 00-нет/01-есть + cpl + ld (crFlag),a +; Включить курсор +cursor_on: + ld c,8Eh ; узнать полож. курсора + rst 08h + ld (curs_posit+1),de + xor a + ld c,0B4h ; получить символ + rst 08h + ld bc,1BB5h ; b=знакоген., с=символ на экран + ld a,(crFlag) + or a + jr z,curs__ + ld b,1Ah ; черта + ld a,(D0642) ; флаги клавы + bit 1,a ; бит Ins + jr nz,$+4 + ld b,19h ; блок +curs__: xor a ; номер окна + rst 08h + ld a,1 + ld (curs_inv_flag),a + ld a,delay_curs + ret + +; Выключить курсор +cursor_off: + db 3Eh ; ld a,.. +curs_inv_flag: + db 0 ; флаг курсора: 00-выкл/01-вкл + or a + ret z + ld a,-1 + ld (crFlag),a + inc a + ld (curs_inv_flag),a + ld a,delay_curs + ld (curs_timer),a +curs_posit: + ld de,0 ; Y/X полож. + bit 7,e + ret nz + ld c,0B4h ; получить символ + xor a + rst 08h + xor a + ld bc,1BB5h ; символ на экран + rst 08h + ret + + +; Установить фокус на "Input Line" +focus_to_inpline: + call cursor_on ; вкл. курсор + ei + ret diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM new file mode 100755 index 0000000..80d8a4a --- /dev/null +++ b/DOS/DOS.ASM @@ -0,0 +1,7531 @@ +; Последняя редакция: 9.03.2007 +; + + +; метки ## - не ясные места (закомментарино) +; метки @@ - замена ориг. кода +; + + +; буфер D2E7C или T0400 также исп. для ввода/вывода файловых операций ? + + + + +; Примечания по ДОС-у +; +; Выравнивание кода на границу происходит в двух местах: 0100h и 0900h +; (есть немного лишнего места). +; +; +; Добавления: +; ~~~~~~~~~~~ +; Появилась новая функция #08 DSS_RESCAN (Пересканировать девайсы системы). +; +; Функция #00 (версия ДОС) дополн. возвращает в BC номер билда (0..999). +; +; Добавлен код обслуживания курсора (на прерываниях) и регистрация в системе +; знакогенераторов курсора с номерами 1Ah/19h (черта/блок). Функция #32 дора- +; ботана под новый курсор, а также не выводит ascii-код #00 (от курс. клавиш +; и т.д.). Переключение формы курсора клавишей "Ins". +; +; В функции #5F (символ на принтер) добавлено отслеживание байта состояния +; принтера (7..3 биты). При ошибке, функция возвращает байт состояния, а не +; печатаемый символ, как в фирменной версии. +; +; ;Добавлена функция #0C (tmp_filename) +; +; +; + + + +; Исправления: +; ~~~~~~~~~~~~ +; 1) В отличии от оригинала, функции 0Ah/0Bh (Create file/New create file) +; перед созданием файла проверяют на переполнение таблицу свободных +; дескрипторов. + +; 2) Убрано фирменное ограничение макс. длины строки переменной окружения +; в 32 символа и некорректная отработка функции #46 (в командах "path", +; "set"). Теперь макс. длина строки 255 символов. +; +; 3) Исправлена фирменная ошибка, при которой происходило зависание +; системы (непредсказуемое поведение) при превышении макс. числа +; открытых дескрипторов (функции search_handle, release_handle). +; +; 4) Исправлена фирменная ошибка, из-за которой в операциях с файлами не +; отслеживался атрибут "системный". +; +; 5) Исправлено не отслеживание атрибута файла "r/o" в функции #0E (удаление +; файла). +; +; 6) Пофиксен глюк вывода списка файлов, если число файлов в списке +; превышало 509. Сейчас список выводится корректно и может содержать +; макс. 510 файлов. Если число файлов в каталоге превышает 510, то выдается +; код ошибки 35 "слишком много файлов" (для списка каталогов выдается +; код ошибки 7 "каталог не найден"). +; +; 7) Пофиксен глюк "PrintScreen", выдававший скен-код #C7 клавиши и +; устанавливавший бит LShift-a. Версия ДОС стала 1.61.9. +; +; +; + + + + +; ДОС выделяется блок из 3 банок (функ. Init_DOS), используемых в качестве +; банок расширения. +; Исп. лог. номеров банок: +; 0 - кэш списка каталога +; 1 - кэш FAT +; 2 - path-переменная (запуск файла) и др. переменные окружения, а также +; сохранение текст. экрана при переключении в граф. режим +; ;3 - страница структуры tsr-обработчиков (моя) +; +; +; +; +; + + + + + + include "dos.inc" + + + + org 0000h + + + +;RST 00h +L0000: jp Func_41 ; заглушка (завершить программу) +D0003: db -1 ; D0=сигнал переполн. буфера клавы, D1=сигнал перекл. на альт.раскладку + db -1 + db -1 + db -1 + db -1 + +;RST 08h, Вызов функций Биоса + push af + ld a,0 ; вкл. ПЗУ Биоса в 0-е окно + out (7Ch),a + pop af + ret + db -1 + +;RST 10h + jp A006C ; вектор ДОС-а + db -1 + db -1 + db -1 + db -1 + db -1 + +;RST 18h + jp drv_devices ; вектор дисковых устройств + db -1 + db -1 + db -1 + db -1 + db -1 + +;RST 20h, свободный + jp empty__ ; заглушка + db -1 + db -1 + db -1 + db -1 + db -1 + +;RST 28h, свободный + jp empty__ ; заглушка + db -1 + db -1 + db -1 + db -1 + db -1 + +;RST 30h + jp MOUSE_vector ; вектор мышки + db -1 + db -1 + db -1 + db -1 + db -1 + +;RST 38h + jp $+3 + push af + ex af,af' + push af + push bc + push de + push hl + exx + push bc + push de + push hl + push ix + push iy + call keyb_scan ; обработчик клавиатуры + ld c,80h ; обработчик аппаратн. прерыв. мышки + rst 30h + call cursor_interrupt ; вектор обслуж. курсора + pop iy + pop ix + pop hl + pop de + pop bc + exx + pop hl + pop de + pop bc + pop af + ex af,af' + pop af + ei + reti + + db -1 ;,-1,-1,-1 ; на границу 0064h + +;0064h + retn + db 0 ; 0066h (от немаск. прерывания в IM0) + db 0 + db 0 + jp $-5 + + +;------------------------------------------------- +; ДОС-овый вектор +;------------------------------------------------- +A006C: push hl + ld l,c ; номер команды + ld h,T0200 / 256 ; 0200h..02FFh массив мл.байтов адресов + ld c,(hl) ; загр. мл.байт адреса + inc h ; 0300h..03FFh массив ст.байтов адресов + ld h,(hl) ; загр. ст.байт адреса + ld l,c ; готовый адрес + ex (sp),hl ; в стек и + ret ; перейти на него + + + +; Вектор обслуживания курсора +cursor_interrupt: + ld a,(curs_inv_flag) + or a + ret z + ;di ;поставил + db 3Eh ; ld a,.. +curs_timer: + db 1 ; пауза мигания + dec a + call z,cursor + ld (curs_timer),a + ret + + + +; Начало boot-сектора +T0076: ds 3 ; 3 байта, код перехода на загрузчик +; 8 байт, OEM ID + db "DSS_" + db major_version + "0" + db "." + db (minor_version / 10) + "0" + db (minor_version % 10) + "0" +; BPB, 17 байт +D0081: dw 512 ;+11 ; байтов на сектор +D0083: db 2 ;+13 ; секторов на кластер + dw 1 ;+14 ; зарезерв. секторов +D0086: db 2 ;+16 ; число копий FAT-ов + dw 112 ;+17 ; записей в корне + dw 1440 ;+19 ; # всех секторов на диске + db 0F0h ;+21 ; байт формата +D008C: dw 2 ;+22 ; # секторов на FAT + dw 9 ;+24 ; секторов на сторону +D0090: dw 2 ;+26 ; кол-во сторон диска +; extended boot-record + dw 0,0 ;+28,+30 ; скрытых секторов + dw 0,0 ;+32,+34 ; всех секторов на диске + dw 80h ;+36 ; 0x00 физ. номер диска + db 29h ;+38 ; сигнатура расш. boot-записи + dw 0,0 ;+39,+41 ; серийный номер диска + db "NO NAME " +T00AC: db "FAT16 " + + + +;----------------------------------------------------------- +; Настройка знакогенератора курсора черточкой +;----------------------------------------------------------- +setup_znak: + in a,(0C2h) + push af ; сохр. порт + ld a,(list_dos_pages+2) ; 2-й лог. номер страницы расш. ДОС + out (0C2h),a + ; получить сист. знакоген. + ld de,8000h ; буфер для 2048 байт данных + push de + ld c,0B8h ; получить знакоген. + rst 08h + ; заполнить кодом 0FFh 2 нижние линии + ld hl,8000h+(2048-(2*256)) ; последние 512 байт + ld bc,511 + ld a,1Ah; ; номер знакоген. "черточка" + call fill_data_font + pop hl + ; заполнить остальные 6 линий (полный блок) + ld bc,2048-513 + ld a,19h; ; номер знакоген. "блок" + call fill_data_font + pop af + out (0C2h),a ; восст. порт + ret + +; Настройка знакоген. и его регистрация +; вход: a=номер знакоген. +; hl=данные +; bc=размер данных +fill_data_font: + ld e,l + ld d,h + ld (hl),-1 + inc de + ldir + ld de,8000h ; знакоген. + ld c,0B6h ; уст. знакоген. + rst 08h + ret + + + + ;ds 100h - $ ; выровнить на границу #0100 +L0100 equ $+100h AND 0FF00h + ds L0100 - $ + + + +;0100h. Массив списка выдел. страниц +list_pages: + ds 256 + + + +; Младшие разряды адресов функций +T0200: db Init_DOS%256, Func_01%256, Func_02%256, Func_03%256 ; 00..03 + db empty__%256, empty__%256, empty__%256, empty__%256 ; 04..07 + db Func_08%256, Func_09%256, Func_0A%256, Func_0B%256 ; 08..0B + db Func_0C%256, empty__%256, Func_0E%256, empty__%256 ; 0C..0F + db Func_10%256, Func_11%256, Func_12%256, Func_13%256 ; 10..13 + db Func_14%256, Func_15%256, Func_16%256, Func_17%256 ; 14..17 + db Func_18%256, Func_19%256, Func_1A%256, Func_1B%256 ; 18..1B + db Func_1C%256, Func_1D%256, Func_1E%256, empty__%256 ; 1C..1F + db empty__%256, Func_21%256, Func_22%256, empty__%256 ; 20..23 + db empty__%256, empty__%256, empty__%256, empty__%256 ; 24..27 + db empty__%256, empty__%256, empty__%256, empty__%256 ; 28..2B + db empty__%256, empty__%256, empty__%256, empty__%256 ; 2C..2F + db Func_30%256, Func_31%256, Func_32%256, Func_33%256 ; 30..33 + db empty__%256, Func_35%256, Func_36%256, Func_37%256 ; 34..37 + db Func_38%256, Func_39%256, Func_3A%256, Func_3B%256 ; 38..3B + db Func_3C%256, Func_3D%256, Func_3E%256, Func_3F%256 ; 3C..3F + db Func_40%256, Func_41%256, Func_42%256, Func_43%256 ; 40..43 + db Func_44%256, Func_45%256, Func_46%256, Func_47%256 ; 44..47 + db empty__%256, empty__%256, empty__%256, empty__%256 ; 48..4B + db empty__%256, empty__%256, empty__%256, empty__%256 ; 4C..4F + db Func_50%256, Func_51%256, Func_52%256, Func_53%256 ; 50..53 + db Func_54%256, Func_55%256, Func_56%256, Func_57%256 ; 54..57 + db Func_58%256, Func_59%256, Func_5A%256, Func_5B%256 ; 58..5B + db Func_5C%256, empty__%256, empty__%256, Func_5F%256 ; 5C..5F + db empty__%256, empty__%256, empty__%256, empty__%256 ; 60..63 + db empty__%256, empty__%256, empty__%256, empty__%256 ; 64..67 + db A0000%256, A0000%256, A0000%256, A0000%256 ; 68..6B + db A0000%256, A0000%256, A0000%256, A0000%256 ; 6C..6F + db A0000%256, A0000%256, A0000%256, A0000%256 ; 70..73 + db A0000%256, A0000%256, A0000%256, A0000%256 ; 74..77 + db A0000%256, A0000%256, A0000%256, A0000%256 ; 78..7B + db A0000%256, A0000%256, A0000%256, A0000%256 ; 7C..7F + db A0000%256, A0000%256, A0000%256, A0000%256 ; 80..83 + db A0000%256, A0000%256, A0000%256, A0000%256 ; 84..87 + db A0000%256, A0000%256, A0000%256, A0000%256 ; 88..8B + db A0000%256, A0000%256, A0000%256, A0000%256 ; 8C..8F + db A0000%256, A0000%256, A0000%256, A0000%256 ; 90..93 + db A0000%256, A0000%256, A0000%256, A0000%256 ; 94..97 + db A0000%256, A0000%256, A0000%256, A0000%256 ; 98..9B + db A0000%256, A0000%256, A0000%256, A0000%256 ; 9C..9F + db A0000%256, A0000%256, A0000%256, A0000%256 ; A0..A3 + db A0000%256, A0000%256, A0000%256, A0000%256 ; A4..A7 + db A0000%256, A0000%256, A0000%256, A0000%256 ; A8..AB + db A0000%256, A0000%256, A0000%256, A0000%256 ; AC..AF + db A0000%256, A0000%256, A0000%256, A0000%256 ; B0..B3 + db A0000%256, A0000%256, A0000%256, A0000%256 ; B4..B7 + db A0000%256, A0000%256, A0000%256, A0000%256 ; B8..BB + db A0000%256, A0000%256, A0000%256, A0000%256 ; BC..BF + db A0000%256, A0000%256, A0000%256, A0000%256 ; C0..C3 + db A0000%256, A0000%256, A0000%256, A0000%256 ; C4..C7 + db A0000%256, A0000%256, A0000%256, A0000%256 ; C8..CB + db A0000%256, A0000%256, A0000%256, A0000%256 ; CC..CF + db A0000%256, A0000%256, A0000%256, A0000%256 ; D0..D3 + db A0000%256, A0000%256, A0000%256, A0000%256 ; D4..D7 + db A0000%256, A0000%256, A0000%256, A0000%256 ; D8..DB + db A0000%256, A0000%256, A0000%256, A0000%256 ; DC..DF + db A0000%256, A0000%256, A0000%256, A0000%256 ; E0..E3 + db A0000%256, A0000%256, A0000%256, A0000%256 ; E4..E7 + db A0000%256, A0000%256, A0000%256, A0000%256 ; E8..EB + db A0000%256, A0000%256, A0000%256, A0000%256 ; EC..EF + db empty__%256, empty__%256, empty__%256, empty__%256 ; F0..F3 + db empty__%256, empty__%256, empty__%256, empty__%256 ; F4..F7 + db empty__%256, empty__%256, empty__%256, empty__%256 ; F8..FB + db empty__%256, empty__%256, empty__%256, empty__%256 ; FC..FF + +;0300h. Старшие разряды адресов функций + db Init_DOS/256, Func_01/256, Func_02/256, Func_03/256 ; 00..03 + db empty__/256, empty__/256, empty__/256, empty__/256 ; 04..07 + db Func_08/256, Func_09/256, Func_0A/256, Func_0B/256 ; 08..0B + db Func_0C/256, empty__/256, Func_0E/256, empty__/256 ; 0C..0F + db Func_10/256, Func_11/256, Func_12/256, Func_13/256 ; 10..13 + db Func_14/256, Func_15/256, Func_16/256, Func_17/256 ; 14..17 + db Func_18/256, Func_19/256, Func_1A/256, Func_1B/256 ; 18..1B + db Func_1C/256, Func_1D/256, Func_1E/256, empty__/256 ; 1C..1F + db empty__/256, Func_21/256, Func_22/256, empty__/256 ; 20..23 + db empty__/256, empty__/256, empty__/256, empty__/256 ; 24..27 + db empty__/256, empty__/256, empty__/256, empty__/256 ; 28..2B + db empty__/256, empty__/256, empty__/256, empty__/256 ; 2C..2F + db Func_30/256, Func_31/256, Func_32/256, Func_33/256 ; 30..33 + db empty__/256, Func_35/256, Func_36/256, Func_37/256 ; 34..37 + db Func_38/256, Func_39/256, Func_3A/256, Func_3B/256 ; 38..3B + db Func_3C/256, Func_3D/256, Func_3E/256, Func_3F/256 ; 3C..3F + db Func_40/256, Func_41/256, Func_42/256, Func_43/256 ; 40..43 + db Func_44/256, Func_45/256, Func_46/256, Func_47/256 ; 44..47 + db empty__/256, empty__/256, empty__/256, empty__/256 ; 48..4B + db empty__/256, empty__/256, empty__/256, empty__/256 ; 4C..4F + db Func_50/256, Func_51/256, Func_52/256, Func_53/256 ; 50..53 + db Func_54/256, Func_55/256, Func_56/256, Func_57/256 ; 54..57 + db Func_58/256, Func_59/256, Func_5A/256, Func_5B/256 ; 58..5B + db Func_5C/256, empty__/256, empty__/256, Func_5F/256 ; 5C..5F + db empty__/256, empty__/256, empty__/256, empty__/256 ; 60..63 + db empty__/256, empty__/256, empty__/256, empty__/256 ; 64..67 + db A0000/256, A0000/256, A0000/256, A0000/256 ; 68..6B + db A0000/256, A0000/256, A0000/256, A0000/256 ; 6C..6F + db A0000/256, A0000/256, A0000/256, A0000/256 ; 70..73 + db A0000/256, A0000/256, A0000/256, A0000/256 ; 74..77 + db A0000/256, A0000/256, A0000/256, A0000/256 ; 78..7B + db A0000/256, A0000/256, A0000/256, A0000/256 ; 7C..7F + db A0000/256, A0000/256, A0000/256, A0000/256 ; 80..83 + db A0000/256, A0000/256, A0000/256, A0000/256 ; 84..87 + db A0000/256, A0000/256, A0000/256, A0000/256 ; 88..8B + db A0000/256, A0000/256, A0000/256, A0000/256 ; 8C..8F + db A0000/256, A0000/256, A0000/256, A0000/256 ; 90..93 + db A0000/256, A0000/256, A0000/256, A0000/256 ; 94..97 + db A0000/256, A0000/256, A0000/256, A0000/256 ; 98..9B + db A0000/256, A0000/256, A0000/256, A0000/256 ; 9C..9F + db A0000/256, A0000/256, A0000/256, A0000/256 ; A0..A3 + db A0000/256, A0000/256, A0000/256, A0000/256 ; A4..A7 + db A0000/256, A0000/256, A0000/256, A0000/256 ; A8..AB + db A0000/256, A0000/256, A0000/256, A0000/256 ; AC..AF + db A0000/256, A0000/256, A0000/256, A0000/256 ; B0..B3 + db A0000/256, A0000/256, A0000/256, A0000/256 ; B4..B7 + db A0000/256, A0000/256, A0000/256, A0000/256 ; B8..BB + db A0000/256, A0000/256, A0000/256, A0000/256 ; BC..BF + db A0000/256, A0000/256, A0000/256, A0000/256 ; C0..C3 + db A0000/256, A0000/256, A0000/256, A0000/256 ; C4..C7 + db A0000/256, A0000/256, A0000/256, A0000/256 ; C8..CB + db A0000/256, A0000/256, A0000/256, A0000/256 ; CC..CF + db A0000/256, A0000/256, A0000/256, A0000/256 ; D0..D3 + db A0000/256, A0000/256, A0000/256, A0000/256 ; D4..D7 + db A0000/256, A0000/256, A0000/256, A0000/256 ; D8..DB + db A0000/256, A0000/256, A0000/256, A0000/256 ; DC..DF + db A0000/256, A0000/256, A0000/256, A0000/256 ; E0..E3 + db A0000/256, A0000/256, A0000/256, A0000/256 ; E4..E7 + db A0000/256, A0000/256, A0000/256, A0000/256 ; E8..EB + db A0000/256, A0000/256, A0000/256, A0000/256 ; EC..EF + db empty__/256, empty__/256, empty__/256, empty__/256 ; F0..F3 + db empty__/256, empty__/256, empty__/256, empty__/256 ; F4..F7 + db empty__/256, empty__/256, empty__/256, empty__/256 ; F8..FB + db empty__/256, empty__/256, empty__/256, empty__/256 ; FC..FF + + + + + +; буфер 512 байт +T0400: db ". ",10h,0,0,0,0 ; тек. каталог + ds 16 + db ".. ",10h,0,0,0,0 ; родит. каталог + ds 16 + ds 448 + + +;T0600. Выровнить на границу xx00h + + include "keyb.asm" ; включает "init_DOS" + + + +;///////////////////////////////////////////////////////////////////// +; Функция #56. Очистить окно. +; +; вход: D - строка левого верхнего угла окна +; E - столбец левого верхнего угла окна +; H - высота окна +; L - ширина окна +; A - символ заполнитель +; B - атрибут заполнитель +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_56:ld c,8Dh ; очистка экрана указ. символом + rst 08h + and a + ret + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #5C. Вывод строки на экран. +; +; вход: HL - указатель на строку символов +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_5C:ld a,(hl) + inc hl + or a + ret z + call Func_5B ; вывод "a" на экран + jr Func_5C + + + +;///////////////////////////////////////////////////////////////////// +; Функция #5B. Вывод символа на экран в тек. позиции. +; +; вход: A - символ +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_5B: + cp " " + jr nc,A0DFC + cp 0Dh ; в начало строки + jr z,A0E20 + cp 0Ah ; на след. строку + jr z,A0E28 + cp 9 ; Tab + jr z,A0E0F + cp 8 ; Backspace + jr z,A0E03 +A0DFC: push hl + ld bc,0182h ; вывести один символ без атрибута + rst 08h + pop hl + ret + +; Backspace +A0E03: ld c,8Eh ; узнать полож. курсора + rst 08h + xor a + cp e + jp z,Func_52 ; уст. полож. курсора + dec e + jp Func_52 ; уст. полож. курсора + +; Tab +A0E0F: ld c,8Eh ; узнать полож. курсора + rst 08h + ld a,e + and 0F8h + add a,8 + ld e,a ; X полож. курсора + jp Func_52 ; уст. полож. курсора + +; 0Dh - в начало строки +A0E20: ld c,8Eh ; узнать полож. курсора + rst 08h + ld e,0 + jp Func_52 ; уст. полож. курсора + +; 0Ah - на след. строку +A0E28: ld c,8Eh ; узнать полож. курсора + rst 08h + ld a,d + cp 31 + jr nc,A0E35 + inc d + jp Func_52 ; уст. полож. курсора + ; +A0E35: push hl + push de + ld bc,018Ah ; скроллинг вверх + ld de,0020h ; нач./число строк + ei + halt + di + rst 08h + ld de,1F00h ; Y/X полож. нижней строки + call Func_52 ; уст. полож. курсора + ld a," " ; символ + ld bc,5082h ; вывести 80 симв. + rst 08h + ei + pop de + call Func_52 ; уст. полож. курсора + pop hl + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #52. Установить положение курсора. +; +; вход: D - строка курсора +; E - колонка курсора +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_52:ld c,84h ; уст. полож. курсора + rst 08h + ret + + +;///////////////////////////////////////////////////////////////////// +; Функция #53. Узнать положение курсора. +; +; вход: нет +; выход: D - строка курсора +; E - колонка курсора +;///////////////////////////////////////////////////////////////////// +Func_53:ld c,8Eh ; узнать полож. курсора + rst 08h + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #57. Прочитать символ с экрана. +; +; вход: D - строка +; E - колонка +; выход: A - символ +; B - атрибут +;///////////////////////////////////////////////////////////////////// +Func_57:xor a + ld c,0B4h + rst 08h + ld a,l + ld b,h + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #58. Вывести символ на экран. +; Управляющие символы выводятся как обычные символы. +; +; вход: D - строка +; E - колонка +; A - символ +; B - атрибут +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_58:ld c,a + push bc + push de + ld c,0B4h ; символ с экрана + xor a + rst 08h + pop de + pop hl + ld c,0B5h ; символ на экран + xor a + rst 08h + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #59. Сохранить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера +; IX - адрес буфера +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_59:ld a,r ; во флаг P/V сост. триггера разреш. прерываний + push af + xor a + di + ld c,0B2h + rst 08h + pop af ; восст. флаг + scf + ccf + ret po ; прерывания разрешены + ei + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #5A. Восстановить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера +; IX - адрес буфера +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_5A:ld a,r ; во флаг P/V сост. триггера разреш. прерываний + push af + xor a + di + ld c,0B3h + rst 08h + pop af + scf + ccf + ret po ; прерывания разрешены + ei + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #55. Скроллинг экрана. +; +; вход: D - строка левого верхнего угла окна +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B = 1 - прокрутка вверх +; B = 2 - прокрутка вниз +; A = 0 - очищать строку +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_55:djnz A0EBA + ld b,a + ld c,h + push bc + push de + push hl + db 0DDh + ld h,d + db 0DDh + ld l,e + inc d + dec h + xor a + ld c,0B7h ; перемещ. окна + di + rst 08h + ei + pop hl + pop de + pop bc + xor a + cp b + ret nz ; не очищать строку + ld a,d + add a,h + dec a + ld d,a +A0EAA: push de + call Func_52 ; уст. полож. курсора + ld a," " + ld b,l + ld c,82h + rst 08h + pop de + call Func_52 ; уст. полож. курсора + and a + ret + ; +A0EBA: djnz A0EE0 + ld b,a + ld c,l + push de + push bc + db 0DDh + ld h,d + db 0DDh + ld l,e + db 0DDh + inc h + dec h + xor a + ld c,0B7h + di + rst 08h + ei + pop hl + pop de + xor a + cp b + jr z,A0EAA ; очистить строку + ret + ; +A0EE0: ld a,EINVFNC ; код "неверный номер функции" + scf + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #54. Выбрать активную страницу экрана. +; +; вход: B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_54:push bc + ld a,(mode_screen) ; тек. режим экрана + bit 7,a + jr nz,A0EF0 + ld c,a + call A0F04 +A0EF0: pop bc + ld a,b + and 1 + out (0C9h),a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #51. Получить текущий режим экрана. +; +; вход: нет +; выход: A - текущий режим экрана +; B - страница экрана 0/1 +;///////////////////////////////////////////////////////////////////// +Func_51:in a,(0C9h) ; страница экрана 0/1 + ld b,a + ld a,(mode_screen) ; тек. режим экрана + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #50. Выбор режима экрана. +; +; вход: A - режим экрана +; 02h - текстовый 40x32x16 цветов +; 03h - текстовый 80x32x16 цветов +; 81h - графический 320x256x256 цветов +; 82h - графический 640x256x16 цветов +; B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_50:bit 7,a + ld c,a + jr nz,A0F27 ; уст. граф. режимы +A0F04: ld ix,A1080 ; точка выхода (восст. экран граф. режима) + push ix + ex af,af' + ld a,(mode_screen) ; тек. режим экрана + ld (A1081+1),a + ex af,af' + inc a ; a=0 + dec a + jr z,A0F21 + dec a ; a=1 + jr z,A0F21 + dec a ; a=2 + jr z,A0F3F + dec a ; a=3 + jr z,A0F67 +A0F21: pop ix ; восст. баланс стека (заодно ix) + ld a,EERR48 ; код "ошибка 48" + scf + ret + +; Установка граф. режимов +A0F27: call A1042 ; сохр. экран текст. режима + and 7Fh + jp z,A0F8F ; a=80h + dec a ; a=81h + jp z,A0F93 + dec a ; a=82h + jp z,A0FBA + dec a ; a=83h + jp z,A0FE1 + ld a,EERR48 ; код "ошибка 48" + scf + ret + +; Уст. текст. режим 40x32. +A0F3F: push bc + ; текстовое, 8 точек/знакоместо, #0B - номер знакоген. + ld hl,T101A ; описатель окна (8 байт) + ld a,b + rlca + rlca + rlca + rlca + or b + and 11h + xor 10h + ld e,a ; флаги окна + call open_window + pop bc + ld a,c + ld (mode_screen),a ; тек. режим экрана + ld a,b + and 1 + out (0C9h),a + ld a,(mode_screen) ; тек. режим экрана + ld c,81h + rst 30h + ld a,0C0h + out (89h),a + xor a + ret + +; Уст. текст. режим 80x32. +A0F67: push bc + ; текстовое, 16 точек/знакоместо, #0B - номер знакоген. + ld hl,T1012 ; описатель окна (8 байт) + ld a,b + rlca + rlca + rlca + rlca + or b + and 11h + xor 10h + ld e,a ; флаги окна + call open_window + pop bc + ld a,c + ld (mode_screen),a ; тек. режим экрана + ld a,b + and 1 + out (0C9h),a + ld a,(mode_screen) ; тек. режим экрана + ld c,81h ; режим экрана для мышки + rst 30h + ld a,0C0h ; закр. спек-экран + out (89h),a + xor a + ret + ; +A0F8F: ld a,EERR48 ; код "ошибка 48" + scf + ret + ; +A0F93: push bc + ; графическое, 8 точек/знакоместо, 0-й экран + ld hl,T102A ; описатель окна (8 байт) + ld e,11h ; флаги окна + call open_window + ; графическое, 8 точек/знакоместо, 1-й экран + ld hl,T103A ; описатель окна (8 байт) + ld e,0 ; флаги окна + call open_window + pop bc + ld a,c + ld (mode_screen),a ; тек. режим экрана + ld a,b + and 1 + out (0C9h),a + ld a,(mode_screen) ; тек. режим экрана + ld c,81h + rst 30h + ld a,0C0h + out (89h),a + xor a + ret + +A0FBA: push bc + ; графическое, 16 точек/знакоместо, 0-й экран + ld hl,T1022 ; описатель окна (8 байт) + ld e,11h ; флаги окна + call open_window + ; графическое, 16 точек/знакоместо, 1-й экран + ld hl,T1032 ; описатель окна (8 байт) + ld e,0 ; флаги окна + call open_window + pop bc + ld a,c + ld (mode_screen),a ; тек. режим экрана + ld a,b + and 1 + out (0C9h),a + ld a,(mode_screen) ; тек. режим экрана + ld c,81h + rst 30h + ld a,0C0h + out (89h),a + xor a + ret + +A0FE1: ld a,EERR48 ; код "ошибка 48" + scf + ret + + +; тек. режим экрана +mode_screen: + db 3 ; 80x32x16 текстовый + + + +;------------------------------------------------- +; Открыть окно +; вход: hl=описатель окна +; e=флаги окна +;------------------------------------------------- +open_window: + push de + ld de,LFEE0 ; куда + ld bc,32 ; размер описателя (8..31 зарез.) + call A1001 ; скопир. описатель в сист. страницу + pop de + ld ix,LFEE0 ; описатель окна (8 байт) + ld c,0B0h ; откр. окно + rst 08h + ld a,0C0h ; закр. спек-экран + out (89h),a + xor a + ret + + +;----------------------------------------------------- +; Скопировать описатель окна в сист. страницу Биоса +; вход: hl=откуда +; de=куда +; bc=сколько +;----------------------------------------------------- +A1001: ld a,r ; во флаг P/V сост. триггера разреш. прерываний + in a,(0E2h) + ex af,af' ; сохр. флаг + ld a,0FEh ; страница переменных Биоса + out (0E2h),a + ldir + ex af,af' ; восст. флаг + out (0E2h),a + ret po ; прерывания разрешены + ei + ret + + + +;----------------------------------------------------------- +; Массив описателей окон +; +; флаги окна: +; bit4 = 1/0 - text/graf режим +; bit5 = 1/0 - 8/16 точек в знакоместе +; graf_mode bit3..0 - не исп. +; bit7..6 - номер палитры (номер экрана) +; text_mode bit7..6, 3..0 - номер знакогенератора +; исключение: bit7..6="11" -> бордер +;----------------------------------------------------------- + +; 80x32. текстовое, 16 точек/знакоместо, #0B - номер знакоген. +T1012: db 40 ;+0 X размер окна в знакоместах + db 32 ;+1 Y размер окна в знакоместах + db 0 ;+2 X полож. окна на экране + db 0 ;+3 Y полож. окна на экране + db 00011011b ;+4 режим знакоместа + db 0 ;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) + db 0 ;+6 X полож. в поле графики (в знакоместах) + db 0 ;+7 Y полож. в поле графики (в знакоместах) + +; 40x32. текстовое, 8 точек/знакоместо, #0B - номер знакоген. +T101A: db 40,32 ; X/Y габариты + db 0,0 + db 00111011b ;+4 5,4, bit3..0 номер знакоген. + db 0,0,0 + +; графическое, 16 точек/знакоместо, 0-й экран +T1022: db 40,32 ; X/Y габариты (в знакоместах) + db 0,0 + db 00000000b ;+4 + db 0,0,0 + +; графическое, 8 точек/знакоместо, 0-й экран +T102A: db 40,32 ; X/Y габариты (в знакоместах) + db 0,0 + db 00100000b ;+4 5-й бит + db 0,0,0 + +; графическое, 16 точек/знакоместо, 1-й экран +T1032: db 40,32 ; X/Y габариты (в знакоместах) + db 0,0 + db 01000000b ;+4 6-й бит + db 0 + db 40 ;+6 X полож. в поле графики (в знакоместах) + db 0 + +; графическое, 8 точек/знакоместо, 1-й экран +T103A: db 40,32 ; X/Y габариты (в знакоместах) + db 0,0 + db 01100000b ;+4 6,5 биты + db 0 + db 40 ;+6 X полож. в поле графики (в знакоместах) + db 0 + + +;-------------------------------------------------- +; Сохранить экран текст. режима. +; Для буфера экрана исп. 2-я банка расширения ДОС. +;-------------------------------------------------- +A1042: push af + ld a,(mode_screen) ; тек. режим экрана + bit 7,a + jr nz,A107E ; граф. режим + sub 2 + jr c,A107E ; меньше 02h + push bc + push de + push hl + push ix + push af + ld c,8Eh ; узнать полож. курсора + rst 08h + ld (A10A0+1),de + pop af ; режим экрана + ld ix,LC000 ; буфер + ld de,0000h ; Y/X полож. + ld hl,2050h ; Y/X размер (32x80) + or a + jr nz,$+4 ; 80x32 текст. режим + ld l,40 ; X размер + ld (A1090+1),hl + ld a,(list_dos_pages+2) ; номер банки расширения ДОС + ld b,a + xor a + ld c,0B2h ; с экрана в буфер + di + rst 08h + ei + pop ix + pop hl + pop de + pop bc +A107E: pop af + ret + + +;------------------------------------------------- +; Восстановить экран граф. режима. +; Буфер экрана во 2-й банке расширения ДОС. +;------------------------------------------------- +A1080: push af +A1081: ld a,0 ; тек. режим экрана + rlca ; 4 такта + jr nc,A10AB ; текстовый + push bc + push de + push hl + push ix + ld ix,LC000 ; буфер + ld de,0000h ; Y/X полож. +A1090: ld hl,2050h ; Y/X размер (32x80 или 32x40) + ld a,(list_dos_pages+2) ; номер банки расширения ДОС + ld b,a + xor a + ld c,0B3h ; из буфера на экран + di + rst 08h + ei +A10A0: ld de,0 ; Y/X полож. + ld c,84h ; уст. курсор + rst 08h + pop ix + pop hl + pop de + pop bc +A10AB: pop af + ret + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #5F. Вывод символа на принтер без ожидания. +; +; Интерпретация байта состояния принтера: +; 0..2 - не используются, обычно уст. в "1" +; 3 - ошибка принтера - есть/нет (1/0) +; 4 - принтер подключен/не подключен (1/0) +; 5 - бумаги нет/есть (1/0) +; 6 - принтер готов/выводит очередной символ (1/0) +; 7 - принтер свободен/занят (1/0) +; +; вход: A - символ +; выход: B - символ +; CF - ошибка, A=байт состояния (биты 7..3) +;///////////////////////////////////////////////////////////////////// +Func_5F:ld b,a + ld a,r ; во флаг P/V сост. триггера разреш. прерываний + ld a,b + di + push af ; сохр. флаг + xor a + out (1Bh),a + ld a,10h + out (1Bh),a + xor a + out (1Bh),a + in a,(1Bh) ; порт состояния принтера + ld c,a; + bit 5,a ; 0/1 есть/нет бумага + jr nz,A10CC ; нет бумаги + and 11011000b; + jr z,A10CC; ; ошиб. ситуация + ld a,b + out (1Ch),a ; символ в принтер + pop af ; восст. флаг + scf + ccf ; сбр. CF + ret po ; прерывания разрешены + ei + ret + ; +A10CC: pop af + ld a,c; ; байт состояния + scf ; уст. CF + ret po ; прерывания разрешены + ei + ret + + + +; Иниц. портов +A10D1: di + ld a,0CFh + ld bc,001Fh ; порт + out (c),a + ld a,63h + out (c),a + ld a,0C0h + out (1Eh),a + ld a,0Fh + out (1Dh),a + ld a,0 + out (19h),a + ld a,0 + out (19h),a + ld a,5 + out (19h),a + ld a,62h + out (19h),a + ret + + +; Установить начальный кластер для чтения +A10F6: ld hl,1 + ld (A10FD+1),hl + ret + + +A10FD: ld hl,1 +A1100: inc hl ; номер кластера + call A1132 ; прочитать из кеша FAT-а номер след. кластера + cp 0Ah + scf + ret z ; ошибка ? + ld a,d + or e + jr nz,A1100 + ld (A10FD+1),hl + xor a + ret + + +A1111: push hl + call A10FD + pop de + ret c + push hl + push hl + ex de,hl ; hl=номер кластера +A111A: call A1132 ; прочитать из кеша FAT-а номер след. кластера + ex de,hl + jr nc,A111A ; не конец цепочки + ex de,hl + pop de ; номер кластера + call A11C4 ; записать в кеш FAT-а номер кластера + pop hl + ld de,(D150E) ; номер кластера + call A11C4 ; записать в кеш FAT-а номер кластера + call A128B ; подкл. банку кеша FAT и записать его на диск + and a + ret + + +;----------------------------------------------------------- +; Прочитать из кеша FAT-а номер след. кластера +; вход: hl=номер кластера +; выход: hl=номер кластера +; de=номер след. кластера +; CF - конец цепочки +;----------------------------------------------------------- +A1132: ex de,hl + ld hl,(D12FF) + and a + sbc hl,de + ex de,hl + ld a,0Ah + ret c + exx + ld a,1 ; лог. номер дос-банки (кэш FAT-а) + call set_dos_page ; подключить банку расширения ДОС + exx + push hl + push af ; старая банка порта + ld a,(D150B) + cp "2" ; fat12 + jr z,A1177 + ; fat16, просто читать след. номер + ld a,h + ld b,a + and 0Fh + ld h,a + ld a,b + rrca + rrca + rrca + rrca + and 0Fh + add hl,hl + ld bc,(D12FD) + cp c + call nz,A125B ; прочитать в кеш 16 секторов FAT-а + ld de,LC000 ; начало кеша FAT-а + add hl,de ; на ячейку FAT + ld e,(hl) ; прочитать номер кластера + inc hl + ld d,(hl) + pop af + out (0E2h),a ; восст. порт + ld hl,0FFEFh + ;and a ;@@ + xor a; + sbc hl,de ; проверка на служ. кластеры + pop hl + ;ld a,0 + ret +; fat12 +A1177: ld d,h + ld e,l + add hl,hl + add hl,de + rr h ; сдвиг вправо через CF + rr l + push af ; сохр. флаг + ld a,h + ld b,a + and 1Fh + ld h,a + ld a,b + rlca + rlca + rlca + and 7 + ld bc,(D12FD) + cp c + call nz,A125B ; прочитать в кеш 16 секторов FAT-а + ld de,LC000 ; начало кеша FAT-а + add hl,de ; на ячейку FAT + pop af ; восст. флаг + ld e,(hl) + inc hl + ld d,(hl) + jr c,A11A3 ; номер не четный + ld a,d + and 0Fh + ld d,a + jr A11B7 + ; +A11A3: ld a,e + and 0F0h + ld e,a + rr d ; вправо на 4 битa + rr e + rr d + rr e + rr d + rr e + rr d + rr e +A11B7: pop af ; восст. порт + out (0E2h),a + ld hl,0FEFh + ;and a + xor a; + sbc hl,de ; проверка на служ. кластеры + pop hl + ;ld a,0 + ret + + +;----------------------------------------------------------- +; Записать в кеш FAT-а номер кластера +; вход: de=номер кластера +; hl=номер первого кластера ? +; выход: ;hl=номер след. кластера ? +; de=номер кластера +;----------------------------------------------------------- +A11C4: push de + ex de,hl + ld hl,(D12FF) + and a + sbc hl,de + ex de,hl + pop de + ld a,0Ah + ret c + exx + ld a,1 ; лог. номер дос-банки (кэш FAT-а) + call set_dos_page ; подключить банку расширения ДОС + exx + push hl + push af ; старая банка порта + ld a,1 + ld (D12FE),a + ld a,(D150B) + cp "2" ; fat12 + jr z,A120B + ; fat16, просто сохр. номер + push de + ld a,h + ld b,a + and 0Fh + ld h,a + ld a,b + rrca + rrca + rrca + rrca + and 0Fh + add hl,hl + ld bc,(D12FD) + cp c + call nz,A125B ; прочитать в кеш 16 секторов FAT-а + ld de,LC000 ; кеш FAT + add hl,de ; на ячейку FAT + pop de + ld (hl),e ; сохр. в кеше FAT-а + inc hl ; номер кластера + ld (hl),d ; + pop af ; восст. порт + pop hl + out (0E2h),a + xor a + ret +; fat12 +A120B: push de + ld d,h + ld e,l + add hl,hl + add hl,de + rr h + rr l + push af ; сохр. флаг + ld a,h + ld b,a + and 1Fh + ld h,a + ld a,b + rlca + rlca + rlca + and 7 + ld bc,(D12FD) + cp c + call nz,A125B ; прочитать в кеш 16 секторов FAT-а + ld de,LC000 ; кеш FAT + add hl,de + pop af + pop de + jr c,A123E ; номер не четный + ld (hl),e + inc hl + ld a,(hl) + and 0F0h + or d + ld (hl),a + pop af ; восст. порт + pop hl + out (0E2h),a + and a + ret + ; +A123E: sla e ; влево на 4 битa + rl d + rl e + rl d + rl e + rl d + rl e + rl d + ld a,(hl) + and 0Fh + or e + ld (hl),a ; сохр. в кеше FAT-а + inc hl ; номер кластера + ld (hl),d ; + pop af ; восст. порт + pop hl + out (0E2h),a + and a + ret + + +; Прочитать в кеш 16 секторов FAT-а +; вход: a=.. ? +A125B: push hl + push af + ld a,(D12FE) + or a + call nz,A129A ; запись кеша (всего ?) FAT-а на диск + pop af + ld l,a + ld h,0 + ld (D12FD),hl + add hl,hl ;1+1=2 + add hl,hl ;2+2=4 + add hl,hl ;4+4=8 + add hl,hl ;8+8=16 + ld de,(D14FC) + add hl,de + ex de,hl + ld ix,0 + add ix,de ; номер лог. сектора + ld hl,0 ; ст. разряд + ld de,LC000 ; куда (кеш FAT) + ld a,(disk) ; номер диска + ld b,16 ; число секторов + ld c,5 ; чтение секторов + rst 18h + pop hl + ret + + + +; Подключить банку кеша FAT и записать его на диск +A128B: exx + ld a,1 ; лог. номер дос-банки (кэш FAT-а) + call set_dos_page ; подключить банку расширения ДОС + exx + push af ; старая банка порта + call A129A ; запись кеша (всего ?) FAT-а на диск + pop af + out (0E2h),a ; восст. порт + ret + +; Запись кеша (всего ?) FAT-а на диск +A129A: ld hl,(D12FD) + ld h,0 + ld (D12FD),hl + add hl,hl ;1+1=2 + add hl,hl ;2+2=4 + add hl,hl ;4+4=8 + add hl,hl ;8+8=16 + push hl + ld b,h + ld c,l + ld de,16 + add hl,de + ld de,(D008C) ; секторов на FAT + ld a,16 ; число секторов + and a + sbc hl,de + jr c,A12C3 + ex de,hl + ld hl,16 + sbc hl,de + jr c,A12FA + ld a,l +A12C3: ld h,b + ld l,c + ld de,(D14FC) + add hl,de + ex de,hl + ld ix,0 + add ix,de ; номер лог. сектора + ld hl,0 ; ст. разряд + ld de,LC000 ; откуда (кеш FAT) + ld b,a ; число секторов + ld c,6 ; запись секторов + ld a,(disk) ; номер диска + push bc + rst 18h + pop bc ; b=число секторов + pop hl + ld de,(D14FE) + add hl,de + ex de,hl + ld ix,0 + add ix,de ; номер лог. сектора + ld de,LC000 ; откуда (кеш FAT) + ld hl,0 ; ст. разряд + ld a,(disk) ; номер диска + ld c,6 ; запись секторов + rst 18h + ret + ; +A12FA: pop hl + scf + ret + + +D12FD: db 0 +D12FE: db 0 +D12FF: dw 0FF0h ; макс. число кластеров FAT12 (без служ.) + + + + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #00. Версия ДОС. +; Возвращает номер версии дисковой системы. +; вход: нет +; выход: DE=номер версии/модификации +; BC=номер билда (0..999) +;///////////////////////////////////////////////////////////////////// + +Func_00:xor a + ld de,(major_version SHL 8) + minor_version ; 1.61 версия ДОС + ld bc,build_version ; номер билда + ld h,a + ld l,a + ret + + + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #01. Смена текущего диска. +; +; вход: A - номер диска (0=A,1=B,..) +; выход: A - макс. номер диска, если CF=0 +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_01:push af ; номер девайса + ld c,1 ; открыть девайс + rst 18h + pop bc + jr c,A1323 ; ошибка + ld a,b + ld (disk),a ; номер тек. диска + call A1370 + ret c + ld a,(last_drive) ; номер послед. диска + and a + ret + ; +A1323: cp EINVDRV ; код "неверный номер устройства" + scf + ret z + ld a,ENORDY ; код "нет готовности" + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #02. Номер текущего диска. +; +; вход: нет +; выход: A - номер диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// +Func_02:ld a,(disk) + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #03. Информация о диске. +; Возвращает информацию об общем и свободном пространстве дискового +; устройства. +; +; вход: A - номер диска (0=A,1=B,..0FFh-текущий) +; выход: A - размер кластера в секторах, если CF=0 +; HL - общее кол-во кластеров +; DE - свободных кластеров +; BC - размер сектора в байтах +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_03:inc a + jr z,A1338 + dec a + call Func_01 ; смена текущего диска + ret c +A1338: ld hl,2 ; номер кластера + ld bc,0 +A133E: push bc + call A1132 ; прочитать из кеша FAT-а номер след. кластера + pop bc + cp 0Ah + jr z,A1353 ; ошибка ? + xor a + cp e + jr nz,A134F + cp d + jr nz,A134F + inc bc +A134F: inc hl + jr A133E + ; +A1353: ld d,b ; свободных кластеров + ld e,c + ld hl,(D12FF) ; общее кол-во кластеров + dec hl + ld bc,(D0081) ; байтов на сектор (512) + ld a,(D0083) ; секторов на кластер + and a + ret + + +; Номер последнего диска в системе +last_drive: + db 2 ; "B" диск + ; список дисковых устройств ? + ds 5 + + + +; нет обращения +L1368: ld a,(disk) ; номер диска + ld c,3 ; проверка смены носителя в девайсе + rst 18h ; всегда выдает "менялся" + or a + ret z ; не менялся + ; +A1370: ld c,0E2h + in b,(c) + push bc + in a,(82h) + out (0E2h),a + ld de,LC400 ; буфер + ld a,(disk) ; номер диска + ld c,4 ; прочитать BPB + rst 18h + pop bc + out (c),b ; восст. порт + jp c,A14F0 ; ошибка (нет готовности) + push iy + ld de,0AA55h ; сигнатура + ld hl,(T0400+510) + and a + sbc hl,de + jp nz,A14EA ; ошибка "не известный формат" + ld hl,T0400 ; откуда + ld de,T0076 ; куда + ld bc,62 + ldir + ld iy,T0076 ; структура boot-сектора + ld a,(iy+21) + cp 0F0h ; байт формата + jp c,A14EA + ld hl,0 + ld e,(iy+14) ; de=зарезерв. секторов + ld d,(iy+15) + add hl,de + ld (D14FC),hl + ld (D14FC),hl + ld (D14FE),hl + ld e,(iy+22) ; de=число секторов на FAT + ld d,(iy+23) + ld a,(D0086) ; число копий FAT-ов + cp 1 + jr z,A13D2 + dec a + add hl,de + ld (D14FE),hl +A13D2: add hl,de + dec a + jr nz,A13D2 + ld (D1502),hl + ld c,(iy+11) ; bc=байтов на сектор + ld b,(iy+12) + rl c + rl b + rl c + rl b + rl c + rl b + ld c,b + ld b,0 + ld a,c + ld (D1504),a + ld e,(iy+17) ; de=записей в корне + ld d,(iy+18) + ex de,hl + dec hl + xor a +A13FB: inc a + jp z,A14EA + sbc hl,bc + jr nc,A13FB + ex de,hl + ld c,a + ld b,0 + ld (D1505),a + add hl,bc + ld (D1506),hl + ld c,(iy+11) ; bc=байтов на сектор + ld b,(iy+12) + ld hl,0 + ld a,(D0083) ; число секторов на кластер +A141A: add hl,bc + dec a + jr nz,A141A + ld (D1508),hl ; размер блока "секторов на кластер" + ex de,hl + ld hl,4000h-1 ; константа + xor a +A1426: inc a + jp z,A14EA + sbc hl,de + jr nc,A1426 + ld (D150A),a + ld hl,T00AC ; "FAT16 " + ld de,T14F4 ; "FAT" + ld b,3 +A1439: ld a,(de) + cp (hl) + jp nz,A14D1 + inc hl + inc de + djnz A1439 +A1442: ld a,(hl) + inc hl + cp " " + jr z,A1442 + cp "1" + jp nz,A14EA + ld a,(hl) + cp "6" + ld hl,0FFFFh ; ячейка FAT16 + jr z,A145D + cp "2" + jp nz,A14EA + ld hl,0FFFh ; ячейка FAT12 +A145D: ld (D150B),a ; "2"/"6" fat12/fat13 + ld (D150E),hl + ld hl,0 + ld c,(iy+24) ; bc=секторов на сторону + ld b,(iy+25) + ld a,(D0090) ; кол-во сторон диска +A146F: add hl,bc + dec a + jr nz,A146F + ld (D150C),hl + ld de,(D1506) + ld l,(iy+19) ; hl=всех секторов на диске + ld h,(iy+20) + ld a,h + or l + jr nz,A149B + ; extended boot-record + ld l,(iy+32) ; hl=мл.разряд всех секторов на диске + ld h,(iy+33) ; + ld c,(iy+34) ; bc=ст.разряд + ld b,(iy+35) ; + sbc hl,de + jr nc,A14A1 + dec bc + jr A14A1 + ; +A149B: sbc hl,de + ld bc,0 +A14A1: ld a,(D0083) ; секторов на кластер + scf +A14A5: rra + jr c,A14B3 + rr b + rr c + rr h + rr l + jr A14A5 + ; +A14B3: inc hl + ld (D12FF),hl + pop iy ; iy=структура дескр. + ld hl,0 + ld (D12FD),hl + ld a,1 ; лог. номер дос-банки (кэш FAT-а) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + xor a + call A125B ; прочитать в кеш 16 секторов FAT-а + pop af + out (0E2h),a + call A10F6 ; уст. начальный кластер для чтения + xor a + ret + ; +A14D1: ld a,(iy+15h) + cp 0F0h ; формат 720kB дискеты + jr c,A14EA + cp 0F8h ; байт-дескриптор винта + ld a,"6" + ld hl,0FFFFh ; ячейка FAT16 + jr z,A145D + ld a,"2" + ld hl,0FFFh ; ячейка FAT12 + jp A145D + ; +A14EA: pop iy + ld a,EINVMED ; код "не известный формат" + scf + ret + ; +A14F0: ld a,ENORDY ; код "нет готовности" + scf + ret + + +T14F4: db "FAT" + ; + db 0 + db 0 + db 0 + db 0 + +disk: db 1 ; номер диска ДОС + +D14FC: dw 0 +D14FE: dw 0 +D1500: dw 0 +D1502: dw 0 +D1504: db 0 +D1505: db 0 +D1506: dw 0 +D1508: dw 0 ; размер блока "секторов на кластер" +D150A: db 0 +D150B: db 0 ; "6"/"2" fat16/fat12 +D150C: dw 0 +D150E: dw 0FFFFh ; 0FFFFh/0FFFh fat16/fat12 + + +; Буфер текущего пути (каталога) системы +T1510: db '\' + ds 256 + + + +; <<< Массив структур дескрипторов, 44*10=440 байт >>> +; +; Структура дескриптора тек. каталога +handle: db ". " ;+0 имя файла (+0=0 - дескр. свободен) + db " " ;+8 расш. файла + db 10h ;+11 атрибут + ds 10 ;+12 резерв + dw 0 ;+22 время + dw 0 ;+24 дата + dw 0 ;+26 номер первого кластера + dw 0,0 ;+28 размер файла + dw 0 ;+32 мл.разряд указателя файла + dw 0 ;+34 ст.разряд + dw 0 ;+36 номер первого кластера каталога (из +26) + dw 0 ;+38 индекс записи в списке каталога (исп. #11 функ.) + db 0 ;+40 номер диска (drive or current) + db 0 ;+41 режим доступа к файлу (r,w,r/w). 7-й бит - признак изменения файла + db 0 ;+42 уровень тек. программы (задача (владелец)) + db 0 ;+43 резерв + +size_struc_handle equ $-handle ; размер структуры (44 байта) + + ; 9 файловых структур + ds size_struc_handle * max_handles ; 44*9=396 + + + + + +;------------------------------------------------- +; Поиск дескриптора файла. +; вход: a=номер дескр. +; выход: iy=адрес структуры дескр. +; CF - нет дескриптора +;------------------------------------------------- +search_handle: + inc a + cp max_handles+1 ; запред. число дескрипторов + jr nc,A17E3 + push de + ld iy,handle - size_struc_handle ; массив дескр. - 44 + ld de,size_struc_handle ; 44 размер структуры дескриптора + add iy,de + dec a + jr nz,$-3 ; ищем нужный дескр. + pop de + ld a,(iy+0) ; номер тек. дескр. + or a + ld a,EZERO ; код "Ok" + ret nz ; дескр. занят +A17E3: ld a,EINVHND ; код "не существующий дескриптор" + scf + ret + + +;----------------------------------------------------------- +; Освобождение дескриптора файла. +; вход: a=номер дескриптора +; выход: CF - при ошибке "не существующий дескриптор" +;----------------------------------------------------------- +release_handle: + inc a + cp max_handles+1 ; запред. число дескрипторов + jr nc,A17E3 + push de + ld iy,handle - size_struc_handle ; массив дескр. - 44 + ld de,size_struc_handle ; 44 размер структуры дескриптора + add iy,de + dec a + jr nz,$-3 ; ищем нужный дескриптор + pop de + ld a,(iy+0) ; имя файла в дескрипторе + or a ; структура свободна ? + ld a,EINVHND ; код "не существующий дескриптор" + exx + scf + ret z ; да + xor a + ld (iy+0),a ; освоб. тек. дескриптор + ret + + +;------------------------------------------------- +; Поиск свободного дескриптора. +; вход: нет +; выход: c=номер дескриптора +; CF - нет своб. дескриптора +;------------------------------------------------- +search_free_handle: + ld b,max_handles+1 ; 10 макс.число дескрипторов+1 + ld c,-1 ; счетчик номера дескр. + ld iy,handle - size_struc_handle ; массив дескр. - 44 + ld de,size_struc_handle ; 44 размер структуры дескриптора +A1815: add iy,de + inc c ; 0..9 + ld a,(iy+0) + or a ; тек. структура дескриптора свободна ? + ret z ; да + djnz A1815 ; на след. структуру + ld a,EMFILE ; код "слишком много откр. файлов" + scf + ret + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #15. Перемещение указателя в файле. +; +; вход: A - дескриптор файла +; HL:IX - смещение указателя в файле +; B - способ перемещения +; B=0 от начала файла +; B=1 от текущего значения указателя +; B=2 от конца файла +; выход: HL:IX - новое значение указателя +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_15:call search_handle ; поиск дескр. файла + ret c ; не найден + inc b + dec b + jr z,A1835 ; от начала + dec b + jr z,A184B ; от тек. полож. + dec b + jr z,A183D ; от конца +empty__:ld a,EINVFNC ; код "не верный номер функции" + scf + ret + +; От начала файла +A1835: ld bc,0 ; для мл. разряда + ld e,c ; для ст. разряда + ld d,c + jr A1857 + +; От конца файла +A183D: ld c,(iy+1Ch) ; iy=дескр. файла + ld b,(iy+1Dh) + ld e,(iy+1Eh) + ld d,(iy+1Fh) + jr A1857 + +; От тек. положения +A184B: ld c,(iy+20h) + ld b,(iy+21h) + ld e,(iy+22h) + ld d,(iy+23h) +A1857: add ix,bc ; мл. разряд + adc hl,de ; ст. разряд + db 0DDh + ld d,h + db 0DDh + ld e,l + ld (iy+20h),e + ld (iy+21h),d + ld (iy+22h),l + ld (iy+23h),h + xor a + ret + + +A186D: ld l,(iy+1Ch) + ld h,(iy+1Dh) + ld e,(iy+20h) + ld d,(iy+21h) + and a + sbc hl,de + ld l,(iy+1Eh) + ld h,(iy+1Fh) + ld e,(iy+22h) + ld d,(iy+23h) + sbc hl,de + ret + + + +A188B: pop bc + pop de + and a + ret + ; +A188F: pop bc + pop de + scf ; ошибка + ret + ; +A1893: push bc + ld (D1CFB),ix + ld a,(D0083) ; секторов на кластер + ld c,a + ld b,0 + call A1CD9 + db 0DDh + ld b,h + db 0DDh + ld c,l + push hl + ld l,(iy+26) ; номер первого кластера (из дескр.) + ld h,(iy+27) ; + ld a,h + or l + jr nz,A18BB + jr A188B ; файл нулевой длины + ; +A18B2: push bc + call A1132 ; прочитать из кеша FAT-а номер след. кластера + pop bc + jr c,A188B ; конец цепочки + ex de,hl ; hl=номер след. кластера + dec bc +A18BB: ld a,b + or c + jr nz,A18B2 ; прочитать след. сектор (кластер) + pop de + pop bc + ld a,(D0083) ; секторов на кластер + sub e + ld c,a + cp b + jr c,A18CA + ld c,b +A18CA: ld a,b + sub c + ld b,a + push hl + push bc + push de + call A1CB8 + pop de + add ix,de + jr nc,$+3 + inc hl + ld de,(D1CFB) ; буфер + ld a,(disk) ; номер диска + ld b,c ; число секторов + ld c,5 ; чтение секторов + rst 18h + jr c,A188F ; ошибка + pop bc + ld hl,(D1CFB) + ld de,(D0081) ; байтов на сектор (512) +A18EF: add hl,de + dec c + jr nz,A18EF + ld (D1CFB),hl + pop de + ld a,b + or a + ret z +A18FA: ld hl,D0083 ; секторов на кластер + ld a,b + sub (hl) + ld b,a + ld c,(hl) + jr nc,A1909 + ld b,0 + add a,(hl) + ld c,a + or a + ret z +A1909: ex de,hl ; hl=номер кластера + push bc + call A1132 ; прочитать из кеша FAT-а номер след. кластера + pop bc + jr c,A1938 ; конец цепочки + ex de,hl ; hl=номер след. кластера + push hl + push bc + call A1CB8 + ld de,(D1CFB) ; куда + ld a,(disk) ; номер диска + ld b,c ; число секторов + ld c,5 ; чтение секторов + rst 18h + jp c,A188F ; ошибка + pop bc + ld hl,(D1CFB) + ld de,(D0081) ; байтов на сектор (512) +A192E: add hl,de + dec c + jr nz,A192E + ld (D1CFB),hl + pop de + jr A18FA + ; +A1938: and a + ret + + + +A193A: pop bc +A193B: pop bc + pop de + scf + ret + ; +A193F: push bc + ld (D1CFB),ix + ld a,(D0083) ; секторов на кластер + ld c,a + ld b,0 + call A1CD9 + db 0DDh + ld b,h + db 0DDh + ld c,l + push hl + ld l,(iy+1Ah) ; hl=номер первого кластера + ld h,(iy+1Bh) ; + ld a,h + or l + jr nz,A198A + push bc + call A10FD + jr c,A193A + ld (iy+1Ah),l ; hl=номер первого кластера + ld (iy+1Bh),h ; + ld de,(D150E) ; номер кластера + call A11C4 ; записать в кеш FAT-а номер кластера + push hl + call A128B ; подкл. банку кеша FAT и записать его на диск + pop hl + pop bc + jr A198A + ; +A1977: push bc + call A1132 ; прочитать из кеша FAT-а номер след. кластера + jr nc,A1987 ; не конец цепочки + push hl ; номер кластера (не следующего) + call A1111 + pop hl + jr c,A193A + call A1132 ; прочитать из кеша FAT-а номер след. кластера +A1987: pop bc + ex de,hl ; hl=номер след. кластера + dec bc +A198A: ld a,b + or c + jr nz,A1977 + pop de + pop bc + ld a,(D0083) ; секторов на кластер + sub e + ld c,a + cp b + jr c,$+3 + ld c,b + ld a,b + sub c + ld b,a + push hl + push bc + push de + call A1CB8 + pop de + add ix,de + jr nc,$+3 + inc hl + ld de,(D1CFB) ; буфер + ld a,(disk) ; номер диска + ld b,c ; число секторов + ld c,6 ; запись секторов + rst 18h + jp c,A193B ; ошибка + pop bc + ld hl,(D1CFB) + ld de,(D0081) ; байтов на сектор (512) + add hl,de + dec c + jr nz,$-2 + ld (D1CFB),hl + pop de + ld a,b + or a + ret z +A19C9: ld hl,D0083 ; секторов на кластер + ld a,b + sub (hl) + ld b,a + ld c,(hl) + jr nc,A19D8 + ld b,0 + add a,(hl) + ld c,a + or a + ret z +A19D8: ex de,hl + push bc + call A1132 ; прочитать из кеша FAT-а номер след. кластера + jr nc,A19E9 ; не конец цепочки + push hl ; номер кластера (не следующего) + call A1111 + pop hl + jr c,A1A10 ; нет места на диске + call A1132 ; прочитать из кеша FAT-а номер след. кластера +A19E9: pop bc + ex de,hl ; hl=номер след. кластера + push hl + push bc + call A1CB8 + ld de,(D1CFB) ; буфер + ld a,(disk) ; номер диска + ld b,c ; число секторов + ld c,6 ; запись секторов + rst 18h + jp c,A193B ; ошибка + pop bc + ld hl,(D1CFB) + ld de,(D0081) ; байтов на сектор (512) + add hl,de + dec c + jr nz,$-2 + ld (D1CFB),hl + pop de + jr A19C9 + ; +A1A10: pop bc + ld a,ENOSPACE ; код "нет места на диске" + scf + ret + + +A1A15: xor a + ld (D1CFA),a + ld l,(iy+20h) + ld h,(iy+21h) + add hl,de + exx + ld e,a + ld d,a + ld l,(iy+22h) + ld h,(iy+23h) + adc hl,de + exx + ld c,(iy+1Ch) + ld b,(iy+1Dh) + and a + sbc hl,bc + exx + ld c,(iy+1Eh) + ld b,(iy+1Fh) + sbc hl,bc + exx + ret c + ex de,hl + sbc hl,de + ex de,hl + ld a,-1 + ld (D1CFA),a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #13. Чтение из файла. +; +; вход: A - дескриптор файла (0-й = чтение списка диска) +; HL - буфер +; DE - кол-во читаемых байт +; выход: DE - реальное кол-во прочитанных байт +; если CF=0: +; A=0 прочитаны все байты +; A=0FFh прочитано меньшее число байт +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_13:ld (D1D01),hl + ld (D1D03),hl + call search_handle ; поиск дескр. файла + ret c ; не найден + call A1A15 + ld a,d + or e + jp z,A1B02 + push de + ld a,(iy+40) ; номер диска из дескр. + call A2147 + jp c,A1B57 + ld c,(iy+32) ; мл.разряд указателя файла + ld a,(iy+33) ; + ld e,a + and 1 + ld b,a + ld d,(iy+34) ; ст.разряд + ld l,(iy+35) ; + ld h,0 + or a + rr l + rr d + rr e + ld a,b + or c + jp nz,A1B07 +A1A85: pop bc + push bc + srl b + jr z,A1ABA + ld (D1CFD),hl + ld (D1CFF),de + ld ix,(D1D01) + call A1893 + jp c,A1B57 + ld de,(D1D01) + ld hl,(D1CFB) + and a + sbc hl,de + ld c,h + ld b,0 + add hl,de + ld (D1D01),hl + srl c + ld hl,(D1CFF) + add hl,bc + ex de,hl + ld hl,(D1CFD) + ld c,b + adc hl,bc +A1ABA: pop bc + ld a,b + and 1 + ld b,a + or c + jr z,A1AEA + push bc + ld ix,LC400 + ld b,1 + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + call A1893 + pop bc + ld c,0E2h ; порт + out (c),b ; восст. порт + jp c,A1B57 + ld hl,T0400 ; откуда + ld de,(D1D01) + pop bc + ldir + ld (D1D01),de +A1AEA: ld hl,(D1D03) + ld de,(D1D01) + ex de,hl + and a + sbc hl,de + push hl + ex de,hl + db 0DDh + ld h,d + db 0DDh + ld l,e + ld hl,0 + call A184B + pop de +A1B02: ld a,(D1CFA) + or a + ret + ; +A1B07: push bc + push hl + push de + ld ix,LC400 + ld b,1 + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + call A1893 + pop bc + ld c,0E2h + out (c),b ; восст. порт + pop hl + jr c,A1B55 + ld bc,1 ;T0001 + add hl,bc + ex de,hl + pop hl + ld c,b + adc hl,bc + exx + pop de + ld hl,512 ;T0200 ? + and a + sbc hl,de + ld b,h + ld c,l + pop hl + and a + sbc hl,bc + jr nc,A1B42 + add hl,bc + ld b,h + ld c,l + ld hl,0 +A1B42: push hl + ld hl,T0400 ; откуда + add hl,de + ld de,(D1D01) ; куда + ldir + ld (D1D01),de + exx + jp A1A85 + ; +A1B55: pop hl + pop hl +A1B57: pop bc + scf + ret + ; +A1B5A: pop hl +A1B5B: pop hl +A1B5C: pop bc + scf + ret + ; +A1B5F: pop de + ld a,EROFILE ; код "файл r/o" + scf + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #14. Запись в файл. +; +; вход: A - дескриптор файла (0-й = запись списка диска) +; HL - буфер данных +; DE - кол-во записываемых байт +; выход: DE - реальное кол-во записанных байт +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_14:ld (D1D01),hl + ld (D1D03),hl + push de + call search_handle ; поиск дескр. файла + jr c,A1B5C ; не найден + ld a,(iy+41) ; режим доступа к файлу (r,w,r/w) + and 1 ; на чтение + jr nz,A1B5F ; запись не возможна (файл r/o) + set 7,(iy+41) ; уст. признак изменения файла + set 5,(iy+11) ; бит "архивный" в ячейке атрибута + ld a,(iy+40) ; номер диска + call A2147 + jr c,A1B5C + ld c,(iy+32) + ld a,(iy+33) + ld e,a + and 1 + ld b,a + ld d,(iy+34) + ld l,(iy+35) + ld h,0 + or a + rr l + rr d + rr e + ld a,b + or c + jp nz,A1C4E +A1BA7: pop bc + push bc + srl b + jr z,A1BD1 + push hl + push de + push bc + ld ix,(D1D01) + call A193F + pop bc + jp c,A1B5A + ld c,b + ld hl,(D1D01) + ld de,512 ; размер сектора + add hl,de + djnz $-1 + ld (D1D01),hl + pop hl + add hl,bc + ex de,hl + pop hl + ld c,b + adc hl,bc +A1BD1: pop bc + ld a,b + and 1 + ld b,a + or c + jr z,A1C19 + push hl + push de + push bc + ld ix,LC400 + ld b,1 + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + call A1893 + pop bc + ld c,0E2h + out (c),b ; восст. порт + ld de,T0400 ; куда + ld hl,(D1D01) ; откуда + pop bc + jp c,A1B5B + ldir + ld (D1D01),hl + pop de + pop hl + ld ix,LC400 + ld b,1 + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + call A193F + pop bc + ld c,0E2h + out (c),b ; восст. порт + ret c +A1C19: ld de,(D1D03) + ld hl,(D1D01) + and a + sbc hl,de + push hl + ex de,hl + db 0DDh + ld h,d + db 0DDh + ld l,e + ld hl,0 + call A184B + call A186D + pop de + ret nc + ld l,(iy+20h) + ld h,(iy+21h) + ld c,(iy+22h) + ld b,(iy+23h) + ld (iy+1Ch),l + ld (iy+1Dh),h + ld (iy+1Eh),c + ld (iy+1Fh),b + and a + ret + ; +A1C4E: push bc + push hl + push de + ld ix,LC400 + ld b,1 + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + call A1893 + pop bc + ld c,0E2h + out (c),b ; восст. порт + pop de + pop hl + exx + pop de + jp c,A1B5C + ld hl,512 ;T0200 + and a + sbc hl,de + ld b,h + ld c,l + pop hl + and a + sbc hl,bc + jr nc,A1C81 + add hl,bc + ld b,h + ld c,l + ld hl,0 +A1C81: push hl + ld hl,T0400 ; куда + add hl,de + ld de,(D1D01) ; откуда + ex de,hl + ldir + ld (D1D01),hl + exx + push hl + push de + ld ix,LC400 + ld b,1 + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + call A193F + pop bc + ld c,0E2h + out (c),b ; восст. порт + pop hl + jp c,A1B5B + ld bc,1 ;T0001 + add hl,bc + ex de,hl + pop hl + ld c,b + adc hl,bc + jp A1BA7 + + +A1CB8: dec hl + dec hl + ex de,hl + ld a,(D0083) ; секторов на кластер + ld b,a + ld hl,0 + ld ix,0 +A1CC6: add ix,de + jr nc,$+3 + inc hl + djnz A1CC6 + ld de,(D1506) + add ix,de + ld e,b + ld d,b + adc hl,de + ret + + +A1CD9: db 0DDh + ld h,d + db 0DDh + ld l,e + ex de,hl + ld hl,0 + ld a,32 +A1CE3: add ix,ix + ex de,hl + adc hl,hl + ex de,hl + adc hl,hl + sbc hl,bc + jr nc,A1CF4 + add hl,bc + dec a + jr nz,A1CE3 + ret + ; +A1CF4: inc ix + dec a + jr nz,A1CE3 + ret + + + +D1CFA: db 0 +D1CFB: dw 0 +D1CFD: dw 0 +D1CFF: dw 0 +D1D01: dw 0 +D1D03: dw 0 + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #16. Получение/изменение атрибута файла. +; +; вход: HL - указатель на имя файла +; B - режим доступа: +; B=0 получить атрибут +; B=1 установить атрибут +; A - атрибут файла +; выход: A - атрибут файла, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_16:inc b + dec b + jr z,A1D12 ; b=0 + dec b + jr z,A1D24 ; b=1 + ld a,EINVFNC ; код "неверный номер функции" + scf + ret + +; Получить атрибут файла +A1D12: xor a ; атрибут записи + call A1E5F + ret c + ld b,(iy+11) ; атрибут записи из дескр. + push bc + call Func_12 ; закрыть файл + pop bc + ret c + ld a,b + and a + ret + +; Изменить атрибут файла +A1D24: push af + xor a ; атрибут записи + call A1E5F + pop bc + ret c + set 7,(iy+41) ; уст. признак изменения файла + res 3,b ; бит "метка тома" + ld (iy+11),b ; ячейка атрибутов записи + push bc + call Func_12 ; закрыть файл + pop bc + ret c + ld a,b + and a + ret + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #0A. Создание файла. +; +; вход: HL - указатель на имя файла +; A - атрибут файла +; выход: A - дескриптор файла, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_0A:and 11100111b ; маска, скрыть биты dir/label + ld (D1F3A),a ; раб. ячейка + ld (file_name+1),hl ; имя файла + push hl + call search_free_handle ; поиск своб. дескриптора + pop hl + ret c ; не найден + call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c ; недоп. имя + call search_rec_file ; поиск записи файла в списке диска + call nc,mark_delete ; найден, пометить запись как "удаленная" + jr A1D7B + + +;///////////////////////////////////////////////////////////////////// +; Функция #0B. Создание нового файла. +; Проверяет, существует ли файл с таким же именем. +; +; вход: HL - указатель на имя файла +; A - атрибут файла +; выход: A - дескриптор файла, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_0B:and 11100111b ; маска, скрыть биты dir/label + ld (D1F3A),a ; раб. ячейка + ld (file_name+1),hl ; имя файла + push hl + call search_free_handle ; поиск своб. дескриптора + pop hl + ret c ; не найден + call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c ; недоп. имя + call search_rec_file ; поиск записи файла в списке диска + ld a,EEXIST ; код "файл существует" + ccf + ret c ; найден + ; создать в буфере новую запись +A1D7B: ld hl,T2364 + ld de,T1F3B + ld bc,11 + ldir + ex de,hl + ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) + ld (hl),a ;+11 в записи + inc hl + ld bc,0A00h ; b=10 байт резерва + ld (hl),c + inc hl + djnz $-2 + push hl + call Func_21 ; узнать тек. дату и время + call A2599 ; закодировать время/дату + pop hl + ld (hl),e ;+22 время + inc hl + ld (hl),d + inc hl + ld (hl),c ;+24 дата + inc hl + ld (hl),b + inc hl + ld bc,0600h ; 6 ячеек, № кластера и размер файла + ld (hl),c + inc hl + djnz $-2 + call A1F5B ; скопир. новую запись в список диска (каталога) + call flush_cash_dir ; сбросить кеш каталога на диск + ; открыть созданный файл +file_name: + ld hl,0 ; адрес имени файла + xor a ; на чтение/запись + jp Func_11 ; открыть файл + + + +;///////////////////////////////////////////////////////////////////// +; Функция #0C. Создание файла с уникальным именем. +; В конце строки пути должно быть как минимум 12 байт, +; на размещение созданного имени файла. Сама строка должна +; заканчиваться нулем. +; Если созданный файл уже существует, он обнуляется и откры- +; вается на чтение/запись. +; +; вход: HL - указатель на строку пути (и/или с диском). +; A - атрибут файла +; выход: A - дескриптор файла, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_0C:jp empty__ ; код "не верный номер функции" + ;push af + ;push hl + ; создать уник. имя + ;call Func_21 ; узнать тек. дату и время + ;call A2599 ; закодировать время/дату + ;; bc=дата, de=время + ;ld hl,T2364 ; буфер имени 11 симв. формата + ;ld a,b + ;call byte2dec + ;ld a,c + ;call byte2dec + ;ld a,d + ;call byte2dec + ;ld a,e + ;call byte2dec + ;pop hl + ;push hl + ;; перейти на конец строки + ;xor a + ;ld bc,256 + ;cpir + ;dec hl + ;ex de,hl + ;; добавить имя файла в конец строки + ;ld hl,T2364 ; буфер имени 11 симв. формата + ;ld bc,8 ; имя + ;ldir + ;ex de,hl + ;ld (hl),"." + ;inc hl + ;ld a,"$" ; расш. файла + ;ld (hl),a + ;inc hl + ;ld (hl),a + ;inc hl + ;ld (hl),a + ;inc hl + ;ld (hl),0 + ;pop hl ; имя файла + ;pop af ; атрибут + ;; создать файл + ;jp Func_0A + + +; Цифру в hex-формате в буфер. +; вход: hl=буфер +; a=цифра +;byte2dec: + ;push af + ;rra + ;rra + ;rra + ;rra + ;call $+4 + ;pop af + ;and 0Fh + ;add a,90h + ;daa + ;adc a,40h + ;daa + ;ld (hl),a + ;inc hl + ;ret + + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #0E. Удаление файла. +; Файлы "r/o" нельзя стереть данной функцией. +; +; вход: HL - указатель на имя файла +; A - атрибут файла +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_0E:bit 0,a + scf + ld a,EROFILE ; код "файл r/o" + ret nz + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + ld hl,T2364 + ld bc,11 + ld a,"?" + cpir + ld a,EINVFNAM ; код "неверное имя" + scf + ret z + call A228F ; прочитать список каталога + call search_rec_file ; поиск записи файла в списке диска + ret c ; не найден +; пометить запись как "удаленная" +mark_delete: + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + ld (ix+0),0E5h ; признак удаления файла + ld e,(ix+26) ; № первого кластера + ld d,(ix+27) + out (0E2h),a ; восст. порт + ld a,e + or d + jp z,flush_cash_dir ; сбросить кеш каталога на диск +A1DEA: ex de,hl ; hl=номер кластера + call A1132 ; прочитать из кеша FAT-а номер след. кластера + push de ; номер след. кластера + push af + ld de,0 ; номер кластера + call A11C4 ; записать в кеш FAT-а номер кластера + pop af + pop de + jr nc,A1DEA ; не конец цепочки + call A128B ; подкл. банку кеша FAT и записать его на диск + jp flush_cash_dir ; сбросить кеш каталога на диск + + + +;///////////////////////////////////////////////////////////////////// +; Функция #10. Переименование файла. +; Глобальные символы * и ? в именах файлов не допускаются. +; +; вход: HL - указатель на старое имя файла +; DE - указатель на новое имя файла +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_10:push de + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + pop de + ret c + ld hl,T2364 + ld bc,11 + ld a,"?" + cpir + ld a,EINVFNAM ; код "неверное имя" + scf + ret z + push de + call A228F ; прочитать список каталога + ld a,33h ; атрибут "arch + dir + r/o + hidden" + call search_record ; поиск записи в списке диска + pop hl ; 8.3 имя + ret c + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + ld hl,T2364 + ld bc,11 + ld a,"?" + cpir + ld a,EINVFNAM ; код "неверное имя" + scf + ret z + push ix ; адр. записи переимен. файла + ld a,33h ; атрибут "arch + dir + r/o + hidden" + call search_record ; поиск записи в списке диска + pop ix + ld a,EEXIST ; код "файл существует" + ccf + ret c + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + ld hl,T2364 + db 0DDh + ld d,h + db 0DDh + ld e,l + ld bc,11 + ldir + out (0E2h),a ; восст. порт + jp flush_cash_dir ; сбросить кеш каталога на диск + + +A1E5F: ld (D1F3A),a ; раб. ячейка (здесь атрибут записи) + call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + ld a,37h ; атрибут "все, кроме метки тома" + call search_record ; поиск записи в кэше списка каталога + jr nc,A1E8D ; на поиск своб. дескриптора + ; запись не найдена + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #11. Открытие файла. +; +; вход: HL - указатель на имя файла +; A - режим доступа: +; A=0 чтение/запись +; A=1 чтение +; A=2 запись +; выход: A - дескриптор файла, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_11:ld (D1F3A),a ; раб. ячейка + call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c +A1E89: call search_rec_file ; поиск записи файла в списке диска + ret c ; не найден +A1E8D: call search_free_handle ; поиск своб. дескриптора + ret c ; не найден + ; заполнить структуру дескриптора + ld a,c ; номер своб. дескриптора + ex af,af' + exx + ld (iy+38),e ; de=индекс записи в списке каталога (исп. #11 функ.) + ld (iy+39),d + exx + db 0FDh ; ld de,iy + ld d,h + db 0FDh + ld e,l + ld hl,T1F3B ; 32 байта + ld bc,32 + ldir ; заполнить дескриптор + ld a,(D1F3A) ; режим доступа к файлу (раб. ячейка) + ld (iy+41),a + ld a,(D2E70) ; уровень текущей программы (владелец) + ld (iy+42),a + xor a + ld (iy+32),a + ld (iy+33),a + ld (iy+34),a + ld (iy+35),a + ld a,(disk) ; номер диска + ld (iy+40),a + ld hl,handle+26 ; ячейка № первого кластера + ld e,(hl) + inc hl + ld d,(hl) + ld (iy+36),e ; № первого кластера + ld (iy+37),d + ex af,af' + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #12. Закрытие файла. +; +; вход: A - дескриптор файла +; выход: A - код ошибки, если CF=1 +; +;///////////////////////////////////////////////////////////////////// +Func_12:ld (D1F3A),a ; дескр. (раб. ячейка) + call search_handle ; поиск дескр. файла + ret c ; не найден + ld a,(D2E70) ; уровень текущей программы + cp (iy+42) ; уровень из дескриптора + ld a,EACCES ; код "ресурс не доступен" + scf + ret nz + bit 7,(iy+41) ; флаг изменения файла + jr z,A1F31 ; освоб. дескр. файла + ; файл изменялся + ld d,(iy+36) + ld e,(iy+37) + push de + xor a ; номер дескр. + call search_handle ; поиск дескр. файла + pop de + ld (iy+36),d + ld (iy+37),e + call A228F ; прочитать список каталога + ld a,(D1F3A) ; дескриптор (раб. ячейка) + call search_handle ; поиск дескр. файла + ld hl,LC000 + ld de,32 + ld c,(iy+38) ; bc=индекс записи в списке каталога + ld b,(iy+39) + jr A1F17 + ; +A1F15: add hl,de + dec bc +A1F17: ld a,b + or c + jr nz,A1F15 + db 0FDh + ld d,h + db 0FDh + ld e,l + ex de,hl + push hl + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + pop hl + ld bc,32 + ldir + out (0E2h),a ; восст. порт + call flush_cash_dir ; сбросить кеш каталога на диск +A1F31: ld a,(D1F3A) ; дескр. (раб. ячейка) + jp release_handle ; освоб. дескр. файла + + + +D1F3A: db 0 ; раб. ячейка (режим поиска/доступа/..) + + +; 32 байта. Буфер записи файла/каталога +T1F3B: ds 11 +D1F46: db 0 ;+11 ячейка атрибутов файла + ds 14 +D1F55: dw 0 + ds 4 + + + +;----------------------------------------------------------- +; Скопировать новую запись в кэш списка каталога +;----------------------------------------------------------- +A1F5B: xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + ld ix,LC000 ; начало списка диска + exx + ld de,0 ; сбр. индекс записи (исп. #11 функ.) + exx +A1F6A: ld a,(ix+0) + or a ; конец списка + jr z,A1F82 + cp 0E5h ; признак удал. записи + jr z,A1F82 + ld bc,32 + add ix,bc ; на след. запись + jr nc,A1F6A + ; за границей 0FFFFh + pop af + out (0E2h),a ; восст. порт + ld a,EROOT ; код "переполнение root-каталога" + scf + ret +; скопир. новую запись в список диска +A1F82: db 0DDh + ld d,h ; de=куда + db 0DDh + ld e,l + ld hl,T1F3B ; откуда 32 байта (новая запись) + ld bc,32 + ldir ; скопир. новую запись в список диска + pop af + out (0E2h),a ; восст. порт + ld hl,LC000 ; начало списка диска + ld bc,(size_cash_directory) + dec bc + add hl,bc + and a + sbc hl,de + ret nc + ld hl,(size_cash_directory) + ld bc,(D1508) ; размер блока "секторов на кластер" + add hl,bc + ld (size_cash_directory),hl + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #44. Преобразовать имя файла (11 -> 8.3 и обратно). +; +; вход: B=0, преобразовать из 11 символьного формата в формат ДОС +; HL - 11 символов имени файла +; DE - буфер для имени в формате ДОС (13 байт) +; B=1, преобразовать из формата ДОС в 11 символьный формат +; HL - имя файла в формате ДОС +; DE - 11 символов имени файла +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_44:inc b + dec b ; b=0 + jr z,A1FB8 ; преобр. имя 11 -> 8.3 формат + dec b ; b=1 + jp z,A2384 ; преобр. имя 8.3 -> 11 формат + ld a,EINVFNC ; код "неверный номер функции" + scf + ret + +;------------------------------------------------- +; Преобразовать имя 11 -> 8.3 формат +; +; вход: hl=откуда +; de=куда +;------------------------------------------------- +A1FB8: ld bc,08FFh ; b=счетчик +A1FBB: ld a,(hl) + cp " " + jr nz,A1FC5 + inc hl + djnz $-1 + jr A1FC9 + ; +A1FC5: ldi + djnz A1FBB +A1FC9: ld a,(hl) + cp " " + ld a,"." + jr nz,A1FD2 + ld a,0 +A1FD2: ld (de),a + inc de + ret z + ld b,3 +A1FD7: ld a,(hl) + cp " " + ret z + ldi + xor a + ld (de),a + djnz A1FD7 + ret + + + +D1FE2: dw 0 ; адрес раб. буфера (f_first, f_next) +D1FE4: dw 0 ; адрес след. записи (f_first, f_next) +D1FE6: db false ; флаг отработки "f_first" +D1FE7: db false ; флаг 8.3 или 11 формата имени (f_first, f_next) + + +;///////////////////////////////////////////////////////////////////// +; Функция #19. Поиск первого совпадающего файла. +; +; вход: HL - указатель на имя файла +; DE - рабочий буфер 44 байта, если B=0, иначе 46 байт ;256 байт +; A - атрибуты, используемые при поиске +; B=0 - имя найденного файла в формате 11 байт "FilenameExt" +; B=1 - имя найденного файла в формате DOS "filename.ext",0 +; выход: de'= индекс записи в списке каталога (исп. #11 функ.) +; A - код ошибки, если CF=1 +; +; формат раб. буфера: +; +00 8 db "FILE????" ; шаблон имени +; +08 3 db "???" ; шаблон расширения +; +11 1 db 20h ; атрибуты для поиска +; +12 10 ds 10 ; зарезервировано +; +22 2 dw 0000h ; время создания файла +; +24 2 dw 0000h ; дата создания файла +; +26 2 dw 0000h ; номер первого кластера +; +28 4 dw 0000h ; мл.разряд размер файла в байтах +; dw 0000h ; ст.разряд +; +32 1 db 20h ; атрибут найденного файла +; +33 11 db "FILENAMEEXT" ; имя найденного файла (копия из каталога) +;///////////////////////////////////////////////////////////////////// +Func_19:ld (D1F3A),a ; атрибут поиска + ld (D1FE2),de ; адрес раб. буфера + ld a,b + ld (D1FE7),a ; флаг 8.3 или 11 формата имени + push hl ; имя файла + call A228F ; прочитать список каталога (также указ. в строке) + pop hl + call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) + call search_record ; поиск записи в списке диска + ret c ; запись не найдена/слишком много файлов + ld hl,T2364 ; буфер имени 11 симв. формата + ld de,(D1FE2) ; адрес раб. буфера + ld bc,11 + ldir ; перекачать "???????.." + ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) + ld (de),a ;+11 раб. буфер функции +A201D: inc de + ld bc,32 + add ix,bc + ld (D1FE4),ix ;; след. запись + ld hl,T1F3B+12 ; смещ. в записи + ld bc,20 + ldir + ld a,(T1F3B+11) ; ячейка атрибутов файла + ld (de),a ;+32 в раб. буфере функции + inc de + ld hl,T1F3B ; найденная запись файла/каталога + ld a,(D1FE7) ; флаг 8.3 или 11 формата имени + or a + jr nz,A2049 ; 11 -> 8.3 + ; скопир. имя найд. файла (формат 11) + ld bc,11 + ldir +A2042: ld a,true + ld (D1FE6),a ; флаг отработки "F_FIRST" + xor a + ret + ; преобр. 11 -> 8.3 формат +A2049: call A1FB8 + jr A2042 + + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #1A. Поиск следующего совпадающего файла. +; +; вход: de = указатель на рабочий буфер +; выход: de'= индекс записи в списке каталога (исп. #11 функ.) +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_1A:ld a,(D1FE6) ; флаг отработки "F_FIRST" + or a + ld a,EUNOPER ; код "невозможная операция" + scf + ret z + ld (D1FE2),de ; адрес раб. буфера + ld hl,T2364 ; буфер имени 11 симв. формата + ex de,hl + ld bc,11 + ldir + xor a + ld (D1FE6),a ; сбр. флаг отработки "f_first" + ld a,(hl) ; ячейка атрибутов записи + push hl + call A207B ; найти след. запись + pop de + ret c ; не найдена или слишком много файлов + jr A201D ; скопир. остальные 20 байт записи + + + +; поиск след. записи +A207B: ex af,af' ; сохр. атрибуты записи + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + ex af,af' ; восст. атрибуты записи + cpl + ld c,a + exx + ld de,0 ; сбр. индекс записи (исп. #11 функ.) + exx + ld ix,(D1FE4) ;; адрес след. записи + db 0DDh + ld a,h + db 0DDh + or l + jr z,search_record_too_many ; вышли за границу 0FFFFh + jr search_record_loop ; на цикл поиска записи + + + + +;------------------------------------------------- +; Поиск записи каталога в списке каталога +; +; вход: a=атрибут записи +; выход: de'=индекс записи в списке каталога +; CF - каталог не найден +;------------------------------------------------- +search_rec_dir: + ld a,10h ; атрибут "dir" + call search_record + ret nc + ld a,ENOPATH ; код "неверный путь" + ret + + +;------------------------------------------------- +; Поиск записи файла в списке каталога. +; +; вход: a=атрибут записи +; выход: ix=адрес найденной записи +; de'=индекс записи в списке каталога (для #11 функ.) +; CF - при ошибке, A=код ошибки +;------------------------------------------------- +search_rec_file: + ld a,27h ; атрибут "все, кроме папки и метки тома" +search_record: + ex af,af' ; сохр. атрибут записи + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + ex af,af' ; восст. атрибут записи + cpl + ld c,a + ld ix,LC000 ; кэш списка каталога диска + exx + ld de,0 ; сбр. индекс записи (исп. #11 функ.) + exx + ; цикл поиска записи +search_record_loop: + ld a,(ix+0) + or a + jr z,search_record_not_found + cp 0E5h ; код удал. записи + jp z,search_record_next + ld a,(ix+11) ; атрибут записи + and c ; искомый атрибут ? + jp nz,search_record_next ; нет + ld hl,T2364 ; готовое имя файла (11 симв. формат) + db 0DDh + ld d,h + db 0DDh + ld e,l + ld b,11 + ex de,hl +A20C9: ld a,(de) + cp "?" + jr z,A20D1 + cp (hl) + jp nz,search_record_next +A20D1: inc hl + inc de + djnz A20C9 + db 0DDh + ld d,h + db 0DDh + ld e,l + ld hl,T1F3B ; 32 буфер записи + ex de,hl + ld bc,32 + ldir ; скопир. найденную запись в буфер + pop af + out (0E2h),a ; восст. порт + and a + ret + ; +search_record_next: + exx + inc de ; ++индекс записи (исп. #11 функ.) + exx + ld de,32 + add ix,de ; на след. запись + jp nc,search_record_loop + ; выход за границу 0FFFFh +search_record_too_many: + ld e,ETMFILE ; код "слишком много файлов" + jr $+4 +search_record_not_found: + ld e,ENOFILE ; код "файл не обнаружен" + pop af + out (0E2h),a ; восст. порт + ld a,e ; код ошибки + scf + ret + + +;------------------------------------------------- +; Тест на допустимое имя и настроиться на диск. +; вход: hl=строка имени +;------------------------------------------------- +A20F8: ld de,D213A ; куда + ld bc,0DFFh ; b=счетчик +A20FE: ld a,(hl) + inc hl + cp '\' + jr z,A2114 + cp ":" + jr z,A2122 + ld (de),a + inc de + cp " "+1 + ccf + ret nc + djnz A20FE + ld a,EINVFNAM ; код "неверное имя" + scf + ret + ; +A2114: ld a,0 + ld (de),a + push hl + ld hl,D213A + call A2164 + pop hl + jr nc,A20F8 + ret + ; +A2122: ld a,(D213A) ; буква диска + cp "a" + jr c,A212F + cp "z"+1 + jr nc,A212F + sub 20h +A212F: sub "A" + push hl + call A2147 + pop hl + jr nc,A20F8 + ret + + +; Буфер имени 8.3 формата +D213A: db " ",0 ; 12 пробелов + + + +A2147: push af ; номер девайса + ld c,1 ; открыть девайс + rst 18h + pop bc + jr c,A215C ; ошибка + ld a,b + ld (disk),a ; номер диска + call A1370 + ret c + ld a,(last_drive) ; номер посл. диска + and a + ret + ; +A215C: cp EINVDRV ; код "bad drive number" + scf + ret z + ld a,ENORDY ; код "нет готовности" + scf + ret + + +A2164: xor a ; номер дескр. + call search_handle ; поиск дескр. файла + ld a,(hl) ; 8.3 имя + or a + jr nz,A2183 +A216D: ld de,0 + ld (iy+26),e + ld (iy+27),d + call A228F ; прочитать список каталога + ld hl,T1510 ; буфер тек. пути (каталога) системы + ld (hl),'\' + inc hl + ld (hl),0 + and a + ret + ; +A2183: cp "." + jr nz,A21AF + ld a,(iy+26) + or (iy+27) + jr nz,A2195 + inc hl + ld a,(hl) + or a + dec hl + jr z,A216D +A2195: exx + ld hl,T2364 + ld de,T2364+1 + ld bc,10 + ld (hl)," " + ldir + exx + ld de,T2364 +A21A7: ldi + ld a,(hl) + or a + jr nz,A21A7 + jr A21B6 + ; +A21AF: ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c +A21B6: call A21DC + ret c + ld (iy+26),e + ld (iy+27),d + ld de,L4000 + ld (iy+28),e + ld (iy+29),d + call A228F ; прочитать список каталога + and a + ret + + + +A21CE: ld bc,32 + add ix,bc ; на след. запись + jr nc,A21E6 + ; превышение границы #FFFF +A21D5: pop af + out (0E2h),a ; восст. порт + ld a,ENOPATH ; код "неверный путь" + scf + ret + ; +A21DC: xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + ld ix,LC000 ; кеш списка каталога +A21E6: ld a,(ix+0) + or a + jr z,A21D5 ; список пустой + cp 0E5h + jr z,A21CE ; файл удален + ld a,(ix+11) ; ячейка атрибутов + and 10h ; каталог ? + jr z,A21CE ; нет, на след. запись + ; каталог + ld hl,T2364 + db 0DDh + ld d,h + db 0DDh + ld e,l + ex de,hl + ld b,11 +A2201: ld a,(de) + cp "?" + jr z,A2209 + cp (hl) + jr nz,A21CE ; на след. запись +A2209: inc hl + inc de + djnz A2201 + ld a,(ix+0) + cp "." + jr nz,A2245 + ld a,(ix+1) + cp "." + jr nz,A223A + ; родит. каталог + ld hl,T1510 ; буфер тек. пути (каталога) системы + ld d,h + ld e,l + ld bc,256 + xor a + cpir + ld bc,256 + ld a,'\' + cpdr + inc hl + and a + ex de,hl + sbc hl,de + ex de,hl + jr nz,A2238 + inc hl +A2238: ld (hl),0 +A223A: ld e,(ix+26) + ld d,(ix+27) + pop af + out (0E2h),a ; восст. порт + and a + ret + ; +A2245: db 0DDh + ld e,l + db 0DDh + ld d,h + ld hl,T1510 ; буфер тек. пути (каталога) системы + ld bc,255 + xor a + cpir + dec hl + dec hl + ld a,'\' + cp (hl) + inc hl + jr z,$+4 + ld (hl),a + inc hl + ld bc,0820h ; b=счетчик, c=пробел +A225F: ld a,(de) + inc de + cp c + jr z,A2266 + ld (hl),a + inc hl +A2266: djnz A225F + ld a,(de) + inc de + cp c + jr z,A227F + ld (hl),"." + inc hl + ld (hl),a + inc hl + ld a,(de) + inc de + cp c + jr z,A227F + ld (hl),a + inc hl + ld a,(de) + cp c + jr z,A227F + ld (hl),a + inc hl +A227F: ;ld (hl),'\' ; ; концовка пути + ;inc hl; + ld (hl),0 + jr A223A + + + +;///////////////////////////////////////////////////////////////////// +; Функция #1E. Информация о текущем каталоге. +; +; вход: HL - буфер в памяти 256 байт +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_1E:ex de,hl ; de=куда + ld hl,T1510 ; откуда ; DIRSPEC + ld a,(hl) + or a + ldi + jr nz,$-4 + ret + + + +;------------------------------------------------- +; Прочитать список каталога +;------------------------------------------------- +A228F: xor a + ld l,a + ld h,a + push hl + pop ix + ld b,a ; от начала файла + call Func_15 ; перемещение указателя в файле + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + ; очистить кеш каталога +/* ld hl,LC000 ;@@ + ld de,LC000+1 + ld bc,4000h-1 + ld (hl),l + ldir ; 21 * #3FFF = 344.043 +*/ ld (.stack),sp ; сохр. стек + ld de,0 ; байты заполнения + ld bc,400h / 2 + ld sp,0000h ; откуда (вниз) +.loop: push de + push de + push de + push de + push de + push de + push de + push de + push de + push de + push de + push de + push de + push de + push de + push de + dec bc + ld a,c + or b + jp nz,.loop + db 31h ; ld sp,.. +.stack: dw 0 + ; + ld a,(disk) ; номер диска + ld (iy+40),a ; сохр. в дескриптор + ld d,(iy+26) ; de=номер первого кластера + ld e,(iy+27) + ld a,d + or e + jr z,A22D2 ; root ?? + ld hl,LC000 ; куда + ld de,4000h ; сколько + xor a ; дескриптор + call Func_13 ; чтение из файла + ld (size_cash_directory),de ; число прочит. байтов + pop af + out (0E2h),a ; восст. порт + and a + ret + ; +A22D2: ld hl,(D1500) ; ст. разряд + ld ix,(D1502) ; номер лог. сектора + ld a,(D1505) + ld b,32 ; размер root-каталога + sub b + jr nc,A22E3 + add a,b + ld b,a ; число секторов +A22E3: ld a,(disk) ; номер диска + ld c,5 ; чтение секторов + ld de,LC000 ; буфер + rst 18h + pop af + out (0E2h),a ; восст. порт + and a + ret + + + +;------------------------------------------------- +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +;------------------------------------------------- +flush_cash_dir: + xor a + ld l,a + ld h,a + push hl ; ст. разряд + pop ix ; мл. разряд + ld b,a ; от начала файла + call Func_15 ; перемещение указателя в файле + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + ld a,(disk) ; номер диска + ld (iy+40),a ; сохр. в дескрипторе + ld d,(iy+26) ; de=номер первого кластера + ld e,(iy+27) + ld a,d + or e + jr z,A2325 ; root ?? + ld hl,LC000 ; откуда + ld de,(size_cash_directory) ; сколько + xor a ; дескр. + call Func_14 ; запись в файл + pop af + out (0E2h),a ; восст. порт + and a + ret + ; +A2325: ld hl,(D1500) ; ст. разряд + ld ix,(D1502) ; лог. номер сектора + ld a,(D1505) + ld b,32 ; макс. число секторов ? + sub b + jr nc,$+4 + add a,b + ld b,a ; число секторов + ld a,(disk) ; номер диска + ld c,6 ; запись секторов + ld de,LC000 ; буфер + rst 18h + pop af + out (0E2h),a ; восст. порт + and a + ret + + +size_cash_directory: + dw 0 ; размер списка каталога + + + + +;----------------------------------------------------------- +; Подключить банку расширения ДОС в 3-е окно +; +; вход: a=лог. номер банки (0..2, в данной версии ДОС) +; выход: a=старая банка порта +;----------------------------------------------------------- +set_dos_page: + ld c,a + ld b,0 + ld hl,list_dos_pages ; 16 байт, номера банок расширения ДОС + add hl,bc + in a,(0E2h) ; сохр. порт + ld c,0E2h ; порт + outi ; один байт (hl) -> порт (bc) + ret + + +; Массив лог. номеров банок расширения ДОС. 16 байт. +list_dos_pages: + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + db -1 + + + +; Буфер 11 симв. имени (первые 11 байт) +T2364: ds 8 ; имя файла +T236C: ds 3 ; расш. + ; + ds 21 ; 11+21=32 + + +;------------------------------------------------- +; Преобразовать имя 8.3 -> 11 формат +; вход: hl = 8.3 имя +; de = буфер имени 11 симв. формата +; при ошибке CF - недоп. имя +;------------------------------------------------- +A2384: push hl + push de + ld h,d + ld l,e + inc de + ld (hl)," " + ld bc,10 + ldir + pop de + pop hl + ld a,(hl) + cp "." + scf + jr z,A239A + cp " "+1 +A239A: ld a,EINVFNAM ; код "неверное имя" + ret c + ld bc,0902h ; b=счетчик +A23A0: ld a,(hl) + cp " "+1 + ccf + ret nc + cp '"' + jr z,A23E9 ; ошибка + cp "*" + jr z,A23ED + cp "+" + jr z,A23E9 ; ошибка + cp "," + jr z,A23E9 ; ошибка + cp "." + jr z,A23FE + cp "/" + jr z,A23E9 ; ошибка + cp ":" + jr z,A23E9 ; ошибка + cp ";" + jr z,A23E9 ; ошибка + cp "<" + jr z,A23E9 + cp "=" + jr z,A23E9 + cp ">" + jr z,A23E9 + cp "[" + jr z,A23E9 + cp '\' + jr z,A23E9 + cp "]" + jr z,A23E9 + cp "|" + jr z,A23E9 + call upper ; a..z -> A..Z + ld (de),a + inc hl + inc de + djnz A23A0 +A23E9: ld a,EINVFNAM ; код "неверное имя" + scf + ret + ; +A23ED: ld a,"?" + inc hl + djnz A23F6 + jr A23E9 + ; +A23F6: ld (de),a + inc de + djnz A23F6 + ld b,1 + jr A23A0 + +A23FE: ld a," " + inc hl + djnz A240D +A2403: ld b,4 + dec c + jr nz,A23A0 + jr A23E9 ; код "неверное имя" + ; +A240D: ld (de),a + inc de + djnz A240D + jr A2403 + + + +; a..z -> A..Z +upper: cp "a" + ret c + cp "z"+1 + jr nc,A2425 + sub 20h + ret + ; +A2425: cp "а" ; русская + ret c + cp "п"+1 + jr nc,A2430 + sub 20h + ret + ; +A2430: cp "р" ; русская + ret c + cp "Ё" + jr nc,A243B + sub 50h + ret + ; +A243B: cp "ё" + ret nz + dec a ; ё -> Ё + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #21. Текущая дата и время. +; +; вход: нет +; выход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; C - день недели +;///////////////////////////////////////////////////////////////////// +Func_21:ld c,0F5h + rst 08h + jp c,A24D0 + ld d,7 ; номер регистра + call A24BB ; чтение регистров CMOS + push af + ld d,8 + call A24BB + pop de + ld e,a + push de + ld d,4 + call A24BB + push af + ld d,2 + call A24BB + pop de + ld e,a + push de + ld d,0 + call A24BB + push af + ld d,6 + ld c,0F6h + rst 08h + pop de + ld e,a + push de + ld d,9 + call A24BB + push af + ld d,32h + ld c,0F6h + rst 08h + db 0DDh + ld h,a + pop af + cp 80 ;50h + push af + jr c,A248B + ld a,19h + db 0DDh + cp h + jr z,A249A + jr A2491 + ; +A248B: ld a,20h + db 0DDh + cp h + jr z,A249A +A2491: push af + ld d,32h + ld c,0F7h + rst 08h + pop af + db 0DDh + ld h,a +A249A: pop af + db 0DDh + ld l,a + db 0DDh + ld a,h + call A24BE + ld l,a + ld h,0 + ld c,l + ld b,h + db 0DDh + ld h,b + add hl,hl + add hl,hl + add hl,bc + add hl,hl + ld b,h + ld c,l + add hl,hl + add hl,hl + add hl,bc + add hl,hl + ex de,hl + add ix,de + pop bc + pop hl + pop de + and a + ret + + +; Чтение регистров CMOS +; вход: d=номер регистра +A24BB: ld c,0F6h + rst 08h +A24BE: ld e,a + rrca + rrca + rrca + rrca + and 0Fh + ld d,a + add a,a + add a,a + add a,d + add a,a + ld d,a + ld a,e + and 0Fh + add a,d + ret + + +A24D0: ld de,(D255D) + ld hl,(D255F) + ld bc,(D2561) + ld ix,(D2563) + and a + ret + + +A24E1: ld c,0 + ld (D255D),de + ld (D255F),hl + ld (D2561),bc + ld (D2563),ix + and a + ret + + +;///////////////////////////////////////////////////////////////////// +; Функция #22. Установить текущую дату и время. +; +; вход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_22:push ix + push bc + push hl + push de + ld c,0F5h + rst 08h + jr c,A24E1 + pop af + push af + ld d,7 ; номер регистра + call A2544 ; запись регистров CMOS + pop bc + ld a,c + ld d,8 + call A2544 + pop af + push af + ld d,4 + call A2544 + pop bc + ld a,c + ld d,2 + call A2544 + pop af + push af + ld d,0 + call A2544 + pop bc + ld a,c + ld d,6 + ld c,0F7h + rst 08h + pop hl + xor a + ld de,100 +A252E: inc a + sbc hl,de + jr nc,A252E + add hl,de + dec a + push hl + ld d,32h + call A2544 + pop bc + ld a,c + ld d,9 + call A2544 + and a + ret + + +; Запись регистров CMOS +; вход: d=номер регистра +A2544: call A254B + ld c,0F7h + rst 08h + ret + ; +A254B: ld bc,0AFFh ; константа +A254E: inc c + sub b + jr nc,A254E + add a,b + ld b,a + ld a,c + rlca + rlca + rlca + rlca + and 0F0h + or b + ret + + +; Дата по-умолчанию +D255D: dw 0101h ; день:месяц +D255F: dw 0000h ; часы:минуты +D2561: dw 0001h ; 00h=секунды +D2563: dw 2005 ; год + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #17. Информация о дате и времени файла. +; +; вход: A - дескриптор файла +; выход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_17:call search_handle ; поиск дескр. файла + ret c ; не найден + ; время/дату из структуры дескр. + ld e,(iy+22) ; время + ld d,(iy+23) ; + ld c,(iy+24) ; дата + ld b,(iy+25) ; + call A25C3 ; раскодировать время/дату + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #18. Изменение даты и времени файла. +; +; вход: A - дескриптор файла +; D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_18:push af + call A2599 ; закодировать время/дату + pop af ; дескриптор + push de + push bc + call search_handle ; поиск дескр. файла + pop bc + pop de + ret c ; не найден + ; время/дату в структуру дескр. + ld (iy+22),e ; время + ld (iy+23),d ; + ld (iy+24),c ; дата + ld (iy+25),b ; + set 7,(iy+41) ; уст. признак изменения файла + and a + ret + +;------------------------------------------------- +; Закодировать время/дату +; вход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; выход: de - время +; bc - месяц/день +; ix - год +;------------------------------------------------- +A2599: ld a,l + rlca + rlca + sla a + rl h + sla a + rl h + sla a + rl h + srl b + or b + ld l,a + ld bc,-1980 + add ix,bc + ld a,e + rlca + rlca + rlca + rlca + and 0F0h + db 0DDh + ld b,l + sla a + rl b + or d + ld c,a + ex de,hl + and a + ret + + +;------------------------------------------------- +; Раскодировать время/дату +; вход: de - время +; bc - месяц/день +; ix - год +; выход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +;------------------------------------------------- +A25C3: ex de,hl + ld a,c + and 1Fh + ld d,a + srl b + rr c + ld a,c + rrca + rrca + rrca + rrca + and 0Fh + ld e,a + ld c,b + ld b,0 + ld ix,1980 + add ix,bc + ld a,l + and 1Fh + add a,a + ld b,a + srl h + rr l + srl h + rr l + srl h + rr l + srl l + srl l + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #1D. Смена текущего каталога. +; Меняет текущий каталог и текущий диск, если он указан в файловой +; спецификации. Если путь начинается с "\" - это означает путь от +; корневого каталога, иначе от текущего. +; +; вход: HL - указатель на имя каталога +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_1D:call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A + ld a,(hl) + or a + call nz,A2164 + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #1B. Создание каталога. +; +; вход: HL - указатель на имя каталога +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_1B:call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + call A228F ; прочитать список каталога + call search_rec_dir ; поиск записи каталога в списке диска + ld a,EEXISDIR ; код "каталог существует" + ccf + ret c ; каталог найден + call A10FD + ret c + push hl + ld de,(D150E) ; номер кластера + call A11C4 ; записать в кеш FAT-а номер кластера + call A128B ; подкл. банку кеша FAT и записать его на диск + ld hl,T2364 + ld de,T1F3B + ld bc,11 + ldir + ex de,hl + ld a,10h ; атрибут записи каталога + ld (hl),a + inc hl + ld bc,0A00h ; b=счетчик + ld (hl),c + inc hl + djnz $-2 + push hl + call Func_21 ; узнать тек. дату и время + call A2599 ; закодировать время/дату + pop hl + ld (hl),e ; de=время + inc hl + ld (hl),d + inc hl + ld (hl),c ; день + inc hl + ld (hl),b ; месяц + inc hl + pop de + push de + ld (hl),e + inc hl + ld (hl),d + inc hl + ld bc,0400h ; b=счетчик + ld (hl),c + inc hl + djnz $-2 + call A1F5B ; скопир. новую запись в список диска (каталога) + call flush_cash_dir ; сбросить кеш каталога на диск + ld hl,T0400 ; буфер + ld (hl),"." ; запись тек. каталога + ld bc,0A20h ; b=счетчик, c=пробел + inc hl + ld (hl),c + djnz $-2 + inc hl + ld de,T1F3B+11 ; ячейка атрибутов файла + ex de,hl + ld bc,21 + ldir + ex de,hl + ld (hl),"." ; запись родит. каталога + inc hl + ld (hl),"." + ld bc,0920h ; b=счетчик, c=пробел + inc hl + ld (hl),c + djnz $-2 + inc hl + push hl + xor a ; лог. номер стр. (кэш списка каталога) + call set_dos_page ; подключить банку расширения ДОС + pop hl + push af ; старая банка порта + ld a,(LC000) + cp "." + ld de,LC000+11 ; атрибуты записи + jr z,A26A9 + ld ix,T1F3B + xor a + ld (ix+26),a + ld (ix+27),a + ld de,T1F3B+11 ; ячейка атрибутов файла +A26A9: ex de,hl + ld bc,21 + ldir + pop af + out (0E2h),a ; восст. порт + ex de,hl + ld d,h + ld e,l + inc de + ld (hl),0 + ld bc,447 + ldir + pop hl + call A1CB8 + ld a,(D0083) ; секторов на кластер +A26C4: push af + push hl ; ст. разряд + push ix ; номер лог. сектора + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + ld de,LC400 ; буфер + ld b,1 ; число секторов + ld a,(disk) ; номер диска + ld c,6 ; запись секторов + rst 18h + pop af + out (0E2h),a + ld hl,T0400 ; откуда + ld de,T0400+1 ; куда + ld bc,512-1 + ld (hl),0 + ldir + pop ix + pop hl + inc ix + db 0DDh + ld a,h + db 0DDh + or l + jr nz,$+3 + inc hl + pop af + dec a + jr nz,A26C4 + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #1C. Удаление каталога. +; Можно удалить только пустой каталог. +; +; вход: HL - указатель на имя каталога +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_1C:call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + ld hl,T2364 + ld bc,11 + ld a,"?" + cpir + ld a,EINVFNAM ; код "неверное имя" + scf + ret z + call A228F ; прочитать список каталога + call search_rec_dir ; поиск записи каталога в списке диска + ret c ; не найден + ld hl,(D1F55) + push ix +A2724: push hl + call A1CB8 + ld a,(D0083) ; секторов на кластер +A272B: push af + push hl ; ст. разряд + push ix ; номер лог. сектора + in a,(0E2h) + push af + in a,(82h) + out (0E2h),a + ld de,LC400 ; буфер + ld bc,0105h ; чтение одного сектора + ld a,(disk) ; номер диска + rst 18h + pop af + out (0E2h),a + ld b,16 + ld hl,T0400 +A2748: ld a,(hl) + or a + jr z,A2783 + cp "." + jr z,A2761 + cp 0E5h ; байт удаления файла + jr z,A2761 + ld de,11 ; смещ. до байта атрибутов + add hl,de + ld a,(hl) + sbc hl,de + ;bit 3,a ;@@ бит "метка тома" + and 00001000b ; 7 тактов + jr z,A278A +A2761: ld de,32 + add hl,de + djnz A2748 + pop ix + pop hl + inc ix + db 0DDh + ld a,h + db 0DDh + or l + jr nz,$+3 + inc hl + pop af + dec a + jr nz,A272B + pop hl ; номер кластера + call A1132 ; прочитать из кеша FAT-а номер след. кластера + ex de,hl ; hl=номер след. кластера + jr nc,A2724 ; не конец цепочки +A277E: pop ix + jp mark_delete ; пометить запись как "удаленная" + ; +A2783: pop ix + pop hl + pop af + pop hl + jr A277E + ; +A278A: pop ix + pop hl + pop af + pop hl + pop ix + ld a,ENOEMPTY ; код "каталог не пуст" + scf + ret + + + + +D2795: dw 0 + + +;///////////////////////////////////////////////////////////////////// +; Функция #47. Получение информации приложения. +; +; вход: HL - буфер данных +; B - номер подфункции: +; B=0 - получение параметров командной строки +; B=1 - получение полного пути к каталогу программы +; B=2 - получение полного пути и имени файла программы +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_47: inc b + djnz A27A8 + ex de,hl + xor a + ld (de),a + ld hl,(D2795) + ld c,(hl) + inc c + ret z + inc hl + ldir + and a + ret + +; Получение параметров командной строки +A27A8: djnz A27CF + ex de,hl + ld hl,(D2795) + ld c,(hl) + inc hl + add hl,bc + inc hl + inc hl + push hl + ld bc,256 + xor a + cpir + ld a,'\' + cpdr + inc hl + inc hl + pop bc + and a + sbc hl,bc + ld a,b + ld b,h + ld h,a + ld a,c + ld c,l + ld l,a + ldir + xor a + ld (de),a + ret + +; Получение полного пути к каталогу программы +A27CF: djnz A27E1 + ex de,hl + ld hl,(D2795) + ld c,(hl) + inc hl + add hl,bc + inc hl + inc hl +A27DA: ld a,(hl) + ldi + or a + jr nz,A27DA + ret + ; +A27E1: ld a,EINVFNC ; код "неверный номер функции" + scf + ret + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #45. Разбор командной строки. +; +; вход: HL - указатель командной строки +; DE - указатель на буфер пользователя +; B - номер подфункции: +; 0 - Разобрать строку +; 1 - Выделить имя диска +; 2 - Выделить директорию +; 3 - Выделить имя файла +; 4 - Выделить расширение файла +; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла +; 6 - Зарезервировано +; 7 - Выделить параметр командной строки +; 8 - Преобразовать из 11 символьного формата в формат ДОС +; 9 - Преобразовать из формата ДОС в 11 символьный формат +; выход: нет +;///////////////////////////////////////////////////////////////////// +Func_45:exx + ld hl,T0400 + ld (D2947),hl + ld hl,T2952 + ld (D2943),hl + ld hl,T295F + ld (D2945),hl + ld hl,T2949 + ld (D2941),hl + exx + inc b + dec b + jr z,A2857 ; разобрать строку + dec b + jr z,A2825 ; выделить имя диска + dec b + jr z,A2845 ; выделить директорию + dec b + jr z,A284B ; выделить имя файла + dec b + jr z,A2851 ; выделить расширение файла + dec b + jr z,A2859 ; выделить диск, путь, файл и расш. + dec b ; зарезервировано + jr z,A2821 + dec b + jp z,Func_43 ; выделить параметр ком-строки + dec b + jp z,A1FB8 ; преобр. имя 11 -> 8.3 формат + dec b + jp z,A2384 ; преобр. имя 8.3 -> 11 формат +A2821: ld a,EINVFNC ; код "неверный номер функции" + scf + ret + +; Выделить имя диска +A2825: ld (D2941),de + call A287C + ret c + ld de,(D2941) + ld a,(de) + dec a + cp -1 + ret z + cp "@" + jr c,A2841 + cp "Z" + jr nc,A2841 + sub "A"-1 + ret + ; +A2841: ld a,EINVDRV ; код "не верный номер устройства" + scf + ret + +; Выделить директорию +A2845: ld (D2947),de + jr A287C + +; Выделить имя файла +A284B: ld (D2943),de ; куда + jr A287C + +; Выделить расширение файла +A2851: ld (D2945),de + jr A287C + +; Разобрать строку +A2857: jr A287C + +; Выделить диск, путь, файл и расш. +A2859: ex de,hl + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld (D2941),bc + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld (D2947),bc + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld (D2943),bc + ld c,(hl) + inc hl + ld b,(hl) + ld (D2945),bc + ex de,hl + jr A287C + + +A287C: ex af,af' + exx + xor a + ld hl,(D2947) + ld (hl),a + ld hl,(D2943) ; адрес буфера под имя файла + ld (hl),a + ld hl,(D2945) + ld (hl),a + ld hl,(D2941) + ld (hl),a + exx + ex af,af' +A2891: ld de,T2934 + ld bc,0D01h ; счетчики +A2897: ld a,(hl) + call upper ; a..z -> A..Z + ld (de),a + inc hl + inc de + inc c ; ++счетчик + cp '\' + jr z,A2916 + cp ":" + jr z,A2900 + cp " "+1 + jr c,A28BF + cp "?" + jr z,A28B9 + cp "*" + jr z,A28B9 +A28B3: djnz A2897 + ld a,EINVFNAM ; код "неверное имя" + scf + ret + ; +A28B9: ex af,af' + set 7,a + ex af,af' + jr A28B3 + ; +A28BF: ld a,2 + cp c + jr z,A28FD + push hl + ld hl,T2934 + ld de,(D2943) ; адрес буфера под имя файла + ld b,0 + dec c + dec c + ld a,c + ldir + ld c,a + xor a + ld (de),a + ld hl,(D2943) ; адрес буфера под имя файла + ld a,"." + cpir + jr nz,A28F8 + ld c,3 + ld de,(D2945) +A28E5: ld a,(hl) + or a + jr nz,A28EC + ld a," " + dec hl +A28EC: ld (de),a + inc hl + inc de + dec c + jr nz,A28E5 + xor a + ld (de),a + ex af,af' + set 1,a ; указано расш. файла + ex af,af' +A28F8: ex af,af' + set 0,a ; указано имя файла + ex af,af' + pop hl +A28FD: ex af,af' + and a + ret + + +A2900: xor a + ld (de),a + push hl + ld hl,T2934 + ld de,(D2941) + ld b,0 + ldir + pop hl + ex af,af' + set 3,a ; указано имя диска + ex af,af' + jp A2891 + + +A2916: xor a + ld (de),a + push hl + push bc + ld hl,(D2947) + ld bc,255 + cpir + dec hl + ex de,hl + ld hl,T2934 ; 12 пробелов + pop bc + ld b,0 + ldir + pop hl + ex af,af' + set 2,a ; указан путь файла + ex af,af' + jp A2891 + + + +T2934: db " ",0 ; 12 пробелов + + +D2941: dw T2949 +D2943: dw T2952 +D2945: dw T295F +D2947: dw T0400 ; 512 байт, ".", ".." записи + + +T2949: ds 9 + +T2952: db " ",0 ; 9 пробелов + +T295F: db " ",0 + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #43. Выделить параметр командной строки. +; +; вход: HL - указатель командной строки +; DE - буфер для выдел. параметра +; выход: HL - указатель на след. параметр ком-строки +; CF=0 - конец строки не достигнут (есть другие параметры) +; CF=1 - конец строки (в буфер перенесён последний параметр или ноль) +;///////////////////////////////////////////////////////////////////// +Func_43:xor a + ld (de),a +A2965: ld a,(hl) + inc hl + cp " " + ret c + jr z,A2965 +A296C: ld (de),a + ld a,(hl) + inc hl + inc de + cp " "+1 + jr nc,A296C + cp " " + ld a,0 + ld (de),a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #3C. Информация о памяти. +; +; вход: нет +; выход: HL - общее кол-во страниц +; BC - кол-во своб. страниц +;///////////////////////////////////////////////////////////////////// +Func_3C:ld c,0C0h + rst 08h + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #3D. Выделение блока памяти. +; +; вход: B - размер блока в страницах по 16kB +; выход: A - идентификатор блока памяти, если CF=0 +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_3D:ld c,0C2h + rst 08h + ld e,a + ld a,ENOMEM ; код "не хватает памяти" + ret c + ld d,0 + ld hl,list_pages ; массив списка выдел. страниц + add hl,de + ld a,(D2E70) ; уровень текущей программы + ld (hl),a + ld a,e + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #3E. Освобождение блока памяти. +; +; вход: A - идентификатор блока памяти +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_3E:ld e,a + ld d,0 + ld hl,list_pages ; массив списка выдел. страниц + add hl,de + ld a,(D2E70) ; уровень текущей программы + cp (hl) + ld a,EINVMEM ; код "не существующий блок памяти" + scf + ret nz + push de + ld a,e + ld c,0C3h + rst 08h + pop de + ld a,EINVMEM ; код "не существующий блок памяти" + ret c + ld hl,list_pages ; массив списка выдел. страниц + add hl,de + xor a + ld (hl),a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #3F. Изменение блока памяти. +; +; вход: A - идентификатор блока памяти +; B - новый размер блока +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_3F:ld e,a + ld d,0 + ld hl,list_pages ; массив списка выдел. страниц + add hl,de + ld a,(D2E70) ; уровень текущей программы + cp (hl) + ld a,EINVMEM ; код "не существующий блок памяти" + scf + ret nz + ld d,b + push de + ld a,e + call A29EE + pop de + ld a,EINVMEM ; код "не существующий блок памяти" + ret c + ld a,b + cp d + ret z + jr c,A29DB + ld b,d + ld a,e + ld c,9Dh + rst 08h + ld a,b + ld c,0C3h + rst 08h + xor a + ret + ; +A29DB: ld a,d + sub b + ld b,a + ld c,e + push bc + ld c,0C2h + rst 08h + pop bc + ld b,a + ld a,ENOMEM ; код "недостаточно памяти" + ret c + ld a,c + ld c,9Eh + rst 08h + xor a + ret + +A29EE: ld b,-1 + ld c,a +A29F1: inc b + push bc + ld a,c + ld c,0C4h + rst 08h + pop bc + jr nc,A29F1 + or a + scf + ret z + xor a + ret + +A29FF: ld hl,list_pages ; массив списка выдел. страниц + ld bc,256 +A2A05: ld a,(D2E70) ; уровень текущей программы + cpir + ret nz + push hl + push bc + dec hl + and a + ld de,256 + sbc hl,de + ld a,l + call Func_3E ; освоб. блок памяти + pop bc + pop hl + jr A2A05 + + + +;///////////////////////////////////////////////////////////////////// +; Функция #38. Подключение страницы памяти. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_38:bit 7,h + jr z,Func_39 ; в 1-е + bit 6,h + jr z,Func_3A ; во 2-е + jr Func_3B ; в 3-е + + +;///////////////////////////////////////////////////////////////////// +; Функция #39. Подключение страницы памяти в первое окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_39:ld c,0C4h + ex de,hl + rst 08h + ex de,hl + ret c + ld c,0A2h + in b,(c) + out (c),a + ld a,b + ret + + +;///////////////////////////////////////////////////////////////////// +; Функция #3A. Подключение страницы памяти во второе окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_3A:ld c,0C4h + ex de,hl + rst 08h + ex de,hl + ret c + ld c,0C2h ; порт + in b,(c) + out (c),a + ld a,b + ret + + +;///////////////////////////////////////////////////////////////////// +; Функция #3B. Подключение страницы памяти в третье окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_3B:ld c,0C4h + ex de,hl + rst 08h + ex de,hl + ret c + ld c,0E2h + in b,(c) + out (c),a + ld a,b + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #40. Выполнить файл. +; +; вход: HL - указатель на имя файла +; B=0 - загрузить и выполнить программу +; выход: A - код завершения, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_40: inc b + dec b + jp z,A2AFE + dec b + jp z,A2B09 + ld a,EINVFNC ; код "не верный номер функции" + scf + ret + + + +A2A5D: ld a,(hl) + inc hl + cp '\' + ret z + cp "/" + ret z + cp " "+1 + jr nc,A2A5D + ret + + +A2A6A: ld a,2 ; лог. номер стр. (path, перем. окруж.) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + call Func_02 ; получить номер тек. диска + add a,"A" + ld hl,LFD00 + ld (hl),a + inc hl + ld a,":" + ld (hl),a + inc hl + call Func_1E ; инфа о тек. каталоге + call A2AC1 + ld hl,LFC80 +A2A87: ld e,(hl) + inc hl + ld d,(hl) + inc hl + bit 1,(hl) + inc hl + push hl + push bc + ex de,hl + call z,A2AB8 + call Func_1D ; смена текущего каталога + jr c,A2AAC + ld hl,D2E7C ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + jr c,A2AAC + call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) + jr c,A2AAC ; не совпадает + call search_rec_file ; поиск записи файла в списке диска +A2AAC: pop bc + pop hl + jr nc,A2AB3 ; запись найдена + djnz A2A87 + scf +A2AB3: pop bc + ld a,b + out (0E2h),a ; восст. порт + ret + +A2AB8: push hl + ld hl,LFD00 + call Func_1D ; смена текущего каталога + pop hl + ret + +A2AC1: ld hl,LFC7F + ld de,LFDFF + ld b,0 +A2AC9: ld (hl),c + inc hl + xor a + ld (de),a + ld c,a + inc de + ld (hl),e + inc hl + ld (hl),d + inc hl + inc b +A2AD4: ld a,(de) + cp '\' + jr nz,A2ADB + set 1,c +A2ADB: ld a,(de) + cp ";" + jr z,A2AC9 + inc de + cp ":" + jr z,A2AD4 + or a + jr nz,A2ADB + ld (hl),c + inc hl + ld (hl),a + inc hl + ld (hl),a + ret + + +T2AEE: db "PATH=",0 ; имя перем. окружения + + +; ++уровня текущей программы +A2AF4: ld hl,D2E70 + inc (hl) + ret + +; --уровня текущей программы +A2AF9: ld hl,D2E70 + dec (hl) + ret + + + +;------------------------------------------------------------------------ +; Загрузить и выполнить программу. +; функ. 40h, B=0. +; +; 1) Открывает exe-файл на чтение; +; 2) Считывает в рабочую область префикс exe-файла; +; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного +; загрузчика, если его размер не равен нулю; +; 4) Сохраняет стек; +; 5) Подключает страницы из выделенного блока; +; 6) Строит префикс запуска программы и устанавливает на него регистр IX; +; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения +; кода в памяти); +; 8) Закрывает exe-файл, если это не первичный загрузчик; +; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека); +; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); +; +; Префикс запуска файла: +; +; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком +; -02 1 db ? ; Идентификатор блока памяти +; -01 1 db ? ; Уровень текущей программы +; +00 1 db ? ; Длина ком-строки +; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем +;------------------------------------------------------------------------ +A2AFE: ld (D2E78),hl + call A2A5D + ld hl,(D2E78) + jr c,A2B32 +; B=1. +A2B09: ld (D2E78),hl + ld a,1 + ld (D1F3A),a ; раб. ячейка + call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) + ld a,ENOFILE ; код "файл не найден" + ret c + call A2AF4 + call A1E89 + jr nc,A2B75 + jr A2AF9 + ; +A2B32: ld a,1 + ld (D1F3A),a ; раб. ячейка + call A20F8 ; тест на допуст. имя и настр. на диск + ret c + ld hl,D213A ; 8.3 имя + ld de,T2364 ; буфер имени 11 симв. формата + call A2384 ; преобр. имя 8.3 -> 11 формат + ret c + call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) + ld a,ENOFILE ; код "файл не найден" + ret c + call A2AF4 + call A1E89 + jr nc,A2B75 + call A2AF9 + ld hl,T2AEE ; имя перем. окружения "PATH=" + ld de,LFE00 ; куда + ld b,1 ; получить перем. окружения + call Func_46 ; функция сист. окружения + ld hl,(D2E78) + ld de,D2E7C +A2B67: ld a,(hl) + ldi + or a + jr nz,A2B67 + call A2A6A + ld hl,(D2E78) + jr A2B09 + ; +A2B75: ld (D2E76),a ; сохр. дескр. файла + ld hl,D2E7C ; буфер + ld de,128 ; число чит. байт + ld a,(D2E76) ; дескр. файла + call Func_13 ; чтение из файла + jp c,A2CD7 + ld ix,D2E7C + ld hl,(D2E7C) + ld de,"XE" ; сигнатура + sbc hl,de + ld a,EINVEXE ; код "неправильный EXE-файл" + scf + jp nz,A2CD7 + ld a,(ix+3) + or a + ld a,ENSUPEXE ; код "не поддерж. версия EXE-файла" + scf + jp nz,A2CD7 + + + ld de,(D2E84) + ld a,e + or d + jp nz,A2CE4 + ld l,a + ld h,a + push hl + pop ix + ld b,2 ; от конца файла + ld a,(D2E76) ; дескр. файла + call Func_15 ; перемещение указателя в файле + ld de,(D2E8C) + ld a,d + and 3Fh + ld d,a + add ix,de + ld de,0 + adc hl,de + ld a,xh + sla a + rl l + rl h + sla a + rl l + rl h + or xl + jr z,1F + inc hl +1: ld a,h + or a + jp nz,A2CD5 + ld b,l + call Func_3D ; выделить блок памяти + jp c,A2CD5 + ld (D2E77),a ; идентиф. блока памяти + exx + pop de + ld hl,0 + add hl,sp + ld sp,(D2E7A) + push hl + push de + in a,(0E2h) + ld d,a + in a,(0C2h) + ld e,a + in a,(0A2h) + push de + push af + ld (D2E7A),sp + ld sp,hl + exx + ld a,(D2E77) ; идентиф. блока памяти + ld de,T2E71 + ld bc,00C4h + rst 08h + ld (de),a + inc de + ld a,(D2E77) ; идентиф. блока памяти + ld bc,01C4h + rst 08h + ld (de),a + inc de + ld a,(D2E77) ; идентиф. блока памяти + ld bc,02C4h + rst 08h + ld (de),a + inc de + ld a,(D2E77) ; идентиф. блока памяти + ld bc,03C4h + rst 08h + ld (de),a + ld hl,(D2E78) + ld de,T0400+1 + call A2E52 + ld a,128 ;80h + sub b + ld (T0400),a + ld sp,T307A + ld a,0FFh ; номер стр. + out (0A2h),a + out (0C2h),a + out (0E2h),a + ld hl,(D2E8C) + ld de,T2E71 + ld a,h + and 0C0h + cp 40h ; 40(00)h + jr z,A2C5E + cp 80h ; 80(00)h + jr z,A2C62 + cp 0C0h ; 0C0(00)h + jr z,A2C66 +A2C5E: ld a,(de) + out (0A2h),a + inc de +A2C62: ld a,(de) + out (0C2h),a + inc de +A2C66: ld a,(de) + out (0E2h),a + call A2DE9 + ld hl,(D2E82) + ld ix,(D2E80) + ld b,0 ; от начала файла + ld a,(D2E76) ; дескр. файла + call Func_15 ; перемещение указателя в файле + ld sp,L403F + ld de,(D2E8C) + xor a + ld l,a + ld h,a + sbc hl,de + ex de,hl ; de=число чит. байт + ld hl,(D2E8C) ; буфер + ld a,(D2E76) ; дескр. файла + call Func_13 ; чтение из файла + ld a,(D2E76) ; дескр. файла + call Func_12 ; закрыть файл + ld sp,(D2E90) + ld hl,(D2E8C) + ld de,128 ;T0080 + and a + sbc hl,de + ex de,hl + db 0DDh + ld h,d + db 0DDh + ld l,e + ld hl,(D2E8E) + ld de,A2CB3 ; адрес п/п "завершить процесс" + push de + push hl + ret + ; +A2CB3: jp Func_41 ; завершить программу (процесс) + + + +;------------------------------------------------- +; Если расш. файла не задано, задать "exe". +; Если расш. файла задано, сравнить его с "exe". +;------------------------------------------------- +A2CB6: ld hl,T2E6D ; "EXE" + ld de,T236C + ld b,3 + ld a,(de) + cp " " + jr nz,A2CCB ; задано расш. + ldi + ldi + ldi + xor a + ret + ; +; сравнить расш. с "EXE" +A2CCB: ld a,(de) + cp (hl) + scf + ret nz ; не совпадает + inc hl + inc de + djnz A2CCB + xor a ; Ok + ret + + +A2CD5: ld a,1Eh +A2CD7: push af + ld a,(D2E76) ; дескр. файла + call Func_12 ; закрыть файл + ld hl,D2E70 + dec (hl) ; --уровня текущей программы + pop af + ret + +A2CE4: ex de,hl + ld de,(D2E8C) + ld a,d + and 3Fh + ld d,a + adc hl,de + xor a + sla h + rla + sla h + rla + ld b,a + ld a,h + or l + jr z,A2CFC + inc b +A2CFC: call Func_3D ; выделить блок памяти + jr c,A2CD5 + ld (D2E77),a ; идентификатор блока памяти + exx + pop de + ld hl,0 + add hl,sp + ld sp,(D2E7A) + push hl + push de + in a,(0E2h) + ld d,a + in a,(0C2h) + ld e,a + in a,(0A2h) + push de + push af + ld (D2E7A),sp + ld sp,hl + exx + ld de,T2E71 + ld bc,00C4h + ld a,(D2E77) ; идентификатор блока памяти + rst 08h + ld (de),a + inc de + ld bc,01C4h + ld a,(D2E77) ; идентификатор блока памяти + rst 08h + ld (de),a + inc de + ld bc,02C4h + ld a,(D2E77) ; идентификатор блока памяти + rst 08h + ld (de),a + inc de + ld bc,03C4h + ld a,(D2E77) ; идентификатор блока памяти + rst 08h + ld (de),a + ld hl,(D2E78) + ld de,T0400+1 + call A2E52 + ld a,80h + sub b + ld (T0400),a + ld sp,T307A + ld a,0FFh ; номер стр. + out (0A2h),a + out (0C2h),a + out (0E2h),a + ld hl,(D2E8C) + ld de,T2E71 + ld a,h + and 0C0h + cp 40h ; 40(00)h + jr z,A2D76 + cp 80h + jr z,A2D7A + cp 0C0h + jr z,A2D7E +A2D76: ld a,(de) + out (0A2h),a + inc de +A2D7A: ld a,(de) + out (0C2h),a + inc de +A2D7E: ld a,(de) + out (0E2h),a + call A2DE9 + ld hl,(D2E82) + ld ix,(D2E80) + ld b,0 ; от начала файла + ld a,(D2E76) ; дескр. файла + call Func_15 ; перемещение указателя в файле + ld sp,L403F + ld hl,(D2E8C) ; буфер + ld de,(D2E84) ; число чит. байт + ld a,(D2E76) ; дескр. файла + call Func_13 ; чтение из файла + ld sp,(D2E90) + ld hl,(D2E8C) + ld de,128 + and a + sbc hl,de + ex de,hl + ld xh,d + ld xl,e + ld hl,(D2E8E) + ld de,A2CB3 ; дос-заглушка + push de + push hl + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #41. Завершить программу (процесс). +; +; вход: B - код завершения +; выход: A - код ошибки, если CF=1 +; +; Выход из EXE-файла: +; +; 1) Освобождаются все блоки памяти которые выделялась данному приложению. +; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. +; 3) Вспоминается стек. +; 4) В регистр A помещается код возврата и выполняется RET. +; +;///////////////////////////////////////////////////////////////////// +Func_41: ld a,b + ld (return_code),a ; код завершения программы + call A29FF + ld hl,D2E70 + dec (hl) ; --уровня текущей программы + ld sp,(D2E7A) + pop af + pop hl + out (0A2h),a + ld a,l + out (0C2h),a + ld a,h + out (0E2h),a + pop de + pop hl + ld (D2E7A),sp + ld sp,hl + ex de,hl + ld a,(return_code) ; код завершения программы + and a + jp (hl) + + + +;///////////////////////////////////////////////////////////////////// +; Функция #42. Получить код завершения программы. +; +; вход: нет +; выход: A - код завершения +;///////////////////////////////////////////////////////////////////// +Func_42:ld a,(return_code) + and a + ret + +A2DE9: ld hl,(D2E8C) + dec h + ld d,h + ld e,l + inc de + ld bc,00FFh + ld (hl),b + ldir + ex de,hl + dec h + ld de,128 ;T0080 + add hl,de + ex de,hl + db 0DDh + ld h,d + db 0DDh + ld l,e + ld hl,T0400 ; откуда + ld c,(hl) + inc c + ldir + ex de,hl + ld (hl),b + ld a,(D2E70) ; уровень текущей программы + ld (ix-1),a ; в префикс exe-файла + ld a,(D2E77) ; идентификатор блока памяти + ld (ix-2),a ; в префикс exe-файла + ld a,(D2E76) ; дескр. файла + ld (ix-3),a ; в префикс exe-файла + inc hl + ld (hl),b + inc hl + call Func_02 ; получить номер тек. диска + add a,"A" + ld (hl),a + inc hl + ld a,":" + ld (hl),a + inc hl + push hl + call Func_1E ; инфа о тек. каталоге + pop hl + xor a + ld bc,256 + cpir + dec hl + dec hl + ld a,'\' + cp (hl) + inc hl + jr z,A2E3F + ld (hl),a + inc hl +A2E3F: ex de,hl + ld hl,D213A +A2E43: ld a,(hl) + ldi + cp " "+1 + jr nc,A2E43 + dec de + xor a + ld (de),a + ld (D2795),ix + ret + + +A2E52: ld bc,8021h +A2E55: ld a,(hl) + cp c + jr c,A2E61 + inc hl + djnz A2E55 + xor a + ld (de),a + ld b,80h + ret +A2E61: ld bc,8020h +A2E64: ld a,(hl) + ld (de),a + inc hl + inc de + cp c + ret c + djnz A2E64 + ret + + +T2E6D: db "EXE" + +D2E70: db 1 ; уровень текущей программы +T2E71: db 0 + db 0 + db 0 + db 0 + +return_code: + db 0 ; код завершения программы (процесса) + +D2E76: db 0 ; дескр. файла +D2E77: db 0 ; идентификатор блока памяти + +D2E78: dw 0 + + + +D2E7A: dw L317B ; адрес стека + + +; 512 байт. exe-заголовок, после раб. буфер +D2E7C: db "EXE" + db 0 ; exe версия +D2E80: dw 0 ; 512, мл. смещ. кода +D2E82: dw 0 ; ст. смещ. кода +D2E84: dw 0 ; end-beg, первичный загрузчик + dw 0,0,0 ; резерв +D2E8C: dw 0 ; адрес загрузки кода +D2E8E: dw L0000 ; адрес передачи управления +D2E90: ds 490 + + + +T307A: ds 257 +L317B: db 0 ; начало стека + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #46. Системное окружение. +; +; вход: B - номер подфункции: +; B=0, получение системного окружения +; HL - буфер +; B=1, получить переменную окружения +; HL - имя переменной +; DE - буфер для значения переменной +; B=2, установить/удалить переменную окружения +; HL - имя переменной и значение, разделенные символом "=" +; т.е. ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ +; В конце строки должен стоять нуль. +; выход: A - состояние, если CF=0 +; DE - указывает на конец буфера (только для B=1) +; A=0FFh - переменная обнаружена +; A=0 - переменная не обнаружена +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +Func_46: inc b + jr z,A318E ; B=#FF + dec b + jr z,A31B2 ; B=0. получить сист. окружение + dec b + jr z,A31DB ; B=1. получить перем. окружения + dec b + jr z,A31FD ; B=2. установить/удалить перем. окружения + ld a,EINVFNC ; код "неверный номер функции" + scf + ret + +;------------------------------------------------- +; Инициализация буфера переменных окружения +;------------------------------------------------- +A318E: ld a,2 ; лог. номер стр. (path, перем. окруж.) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + ld de,LE400 ; начало буфера переменных окружения + xor a + ld (de),a + inc de + ld hl,DEFAULT_ENV + ld bc,1 + ldir + ld (de),a + ex de,hl + ld de,LE400 ; начало буфера переменных окружения + and a + sbc hl,de + ld (D3296),hl + pop af + out (0E2h),a ; восст. порт + and a + ret + +;------------------------------------------------- +; Получить сист. окружение +;------------------------------------------------- +A31B2: push hl + ld a,2 ; лог. номер стр. (path, перем. окруж.) + call set_dos_page ; подключить банку расширения ДОС + ld h,a ; старая банка порта + ld c,0E2h + in l,(c) + exx + ld hl,LE400 ; начало буфера переменных окружения + inc hl + pop de + ld bc,(D3296) + exx +A31C8: out (c),l + exx + ld a,(hl) + exx + out (c),h ; восст. порт + exx + ld (de),a + inc hl + inc de + dec bc + ld a,b + or c + exx + jr nz,A31C8 + xor a + ret + +;------------------------------------------------- +; Получить переменную окружения +;------------------------------------------------- +A31DB: push de + call A325F ; скопир. строку перем. окруж. в буферы + ld a,2 ; лог. номер стр. (path, перем. окруж.) + call set_dos_page ; подключить банку расширения ДОС + ex af,af' ; старая банка порта + call A323D ; найти конец всех переменных ? + pop de + ld a,0 + ld (de),a + jr nc,A31F7 +A31EE: ld a,(hl) + ldi + or a + jr nz,A31EE + dec de + ld a,-1 +A31F7: ex af,af' + out (0E2h),a ; восст. порт + ex af,af' + and a + ret + + +;------------------------------------------------- +; Установить/Удалить переменную окружения +; +; вход: hl=имя перем. и значение, раздел. символом "=" +;------------------------------------------------- +A31FD: ; в D2E7C "EXE" + ; в T0400 содержимое system.bat + call A325F ; скопир. строку перем. окруж. в буферы + ld a,2 ; лог. номер стр. (path, перем. окруж.) + call set_dos_page ; подключить банку расширения ДОС + push af ; старая банка порта + call A323D ; найти конец всех переменных ? + jr nc,A3214 + xor a + cpir + ld a,b + or c + jr z,A3214 + ldir +A3214: ld a,(T0400) + or a + jr z,A322D + ld hl,D2E7C ; 512 байт, буфер +A321D: ld a,(hl) + ldi + cp "=" ; символ разделения + jr nz,A321D + ld hl,T0400 ; откуда +A3227: ld a,(hl) + ldi + or a + jr nz,A3227 +A322D: xor a + ld (de),a + ld hl,LE400 ; начало буфера переменных окружения + ex de,hl + sbc hl,de + ld (D3296),hl + pop af + out (0E2h),a ; восст. порт + and a + ret + +; найти конец всех переменных ? +A323D: ld hl,LE400 ; начало буфера переменных окружения + ld bc,(D3296) + push hl +A3245: pop de + ld de,D2E7C ; 512 байт буфер + xor a + cpir + push hl +A324D: ld a,(hl) + or a + jr z,A325D + ld a,(de) + cp (hl) + inc hl + inc de + dec bc + jr nz,A3245 + cp "=" ; символ разделения + jr nz,A324D + scf +A325D: pop de + ret + +;----------------------------------------------------------- +; Скопировать строку переменной окружения в буферы +; (имя и значение в разные буферы) +; вход: hl=имя перем. и значение, раздел. символом "=" +;----------------------------------------------------------- +A325F: ld b,maxlen_env_string ; 255 макс. длина строки (имя+знач.) + ld de,D2E7C ; куда + xor a + ld (de),a + ld (T0400),a + ; скопир. в "D2E7C" имя переменной +A3269: ld a,(hl) + inc hl + cp "=" ; символ разделения + jr z,A3283 ; конец имени + or a + jr z,A327B ; конец строки + call upper ; a..z -> A..Z + ld (de),a + inc de + djnz A3269 + jr A3294 ; слишком длинная строка + +; значение не задано +A327B: ld a,"=" ; символ разделения + ld (de),a + inc de + xor a + ld (de),a + inc de + ret + + +A3283: ld (de),a ; сохр. "=" + inc de + xor a + ld (de),a ; в конец имени перем. + ; скопир. в "T0400" значение переменной (строку путей) + ld de,T0400 ; 512 байт, буфер + ld (de),a + ld c,255 ; чтобы "ldi" не портила "b" +A328D: ld a,(hl) + ldi + or a + ret z ; конец строки знач. переменной + djnz A328D +A3294: ld a,b + ld (de),a ; обрезать слишком длинную строку + inc de + scf + ret + + +D3296: dw 1 +DEFAULT_ENV: db 0 + + + + include "mouse.asm" ; код мышки + + + + db " " ; 12 + ds 20 + + db "FILENAME.EXT",0 + + + + +;------------------------------------------------- +; RST 18h. Вектор дисковых устройств +; вход: a=номер устройства (0-25) +;------------------------------------------------- +drv_devices: + push hl + push bc ; сохр. bc + ld c,a + add a,a ;1+1=2 + add a,c ;2+1=3 + ld c,a + ld b,0 + ld hl,A38FC ; таблица переходов + add hl,bc + ld a,(hl) + inc a + jr z,A38F4 ; было a=0FFh + dec a + inc hl + ld c,(hl) ; загр. адрес обработчика + inc hl ; + ld h,(hl) ; + ld l,c + pop bc ; восст. bc + ex (sp),hl ; адрес в стек + ret ; перейти на него + ; +A38F4: pop bc + pop hl + ld a,EINVDRV ; код "неверный номер устройства" + scf + ret + + + +A38FA: dw A38FC + + +; Таблица адресов обработчиков девайсов. 26 элементов (диски A..Z ?). +A38FC: db -1 ;00 + dw -1 + db -1 ;01 + dw -1 + db -1 ;02 + dw -1 + db -1 ;03 + dw -1 + db -1 ;04 + dw -1 + db -1 ;05 + dw -1 + db -1 ;06 + dw -1 + db -1 ;07 + dw -1 + db -1 ;08 + dw -1 + db -1 ;09 + dw -1 + db -1 ;10 + dw -1 + db -1 ;11 + dw -1 + db -1 ;12 + dw -1 + db -1 ;13 + dw -1 + db -1 ;14 + dw -1 + db -1 ;15 + dw -1 + db -1 ;16 + dw -1 + db -1 ;17 + dw -1 + db -1 ;18 + dw -1 + db -1 ;19 + dw -1 + db -1 ;20 + dw -1 + db -1 ;21 + dw -1 + db -1 ;22 + dw -1 + db -1 ;23 + dw -1 + db -1 ;24 + dw -1 + db -1 ;25 + dw -1 + db -1 ; конец + + + + +;----------------------------------------------------------- +; Просканировать систему на FDD/HDD девайсы и RAM-диски +;----------------------------------------------------------- +scan_all_devices: + xor a + ld (last_drive),a ; сбр. ячейку + ld hl,A38FC + ld (A38FA),hl ; восст. ячейку + ; FDD девайсы + ld c,a ; c="open device" + call A3D7A ; узнать число FDD-девайсов + ld de,A3D7A ; адрес обработчика тек. девайса + call A397B ; иниц. таблицу переходов + ; HDD девайсы + xor a + ld c,a ; c="open device" + call A39CC ; узнать число HDD-девайсов + ld de,A39CC ; адрес обработчика тек. девайса + call A397B ; иниц. таблицу переходов + ; RAM-диски + xor a + ld c,a ; c="open device" + call A3E5E ; узнать число RAM-дисков + ld de,A3E5E ; адрес обработчика тек. девайса + call A397B ; иниц. таблицу переходов + xor a + ret + + + +; Инициировать таблицу переходов девайса. +; вход: de=адрес обработчика девайса +; a=число девайсов (0=нет) +A397B: ld c,a + ld hl,last_drive ; ячейка номера посл. диска + add a,(hl) + ld (hl),a + ld a,c + ld c,0 ; сбр. + or a + ret z ; нет девайсов + ld hl,(A38FA) ; тек. полож. в таблице +A3989: ld (hl),c ; индекс ? + inc hl + ld (hl),e ; de=адрес обработчика + inc hl + ld (hl),d + inc hl + inc c ; ++индекс ? + dec a + jr nz,A3989 + ld (A38FA),hl ; сохр. новое полож. в таблице + dec a + ld (hl),a ; a=0FFh + ret + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. +; +; вход: нет +; выход: A - номер последнего лог. диска в системе +;///////////////////////////////////////////////////////////////////// +Func_08:di + call scan_all_devices ; перескан. все девайсы + ld a,(last_drive) + ei + ret + + + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #09. Номер системного диска. +; Возвращает номер диска, c которого загружена система. +; +; вход: B = 0 (01h - исп. boot-загрузчик системы) +; выход: A - номер системного диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// +Func_09: inc b + dec b + jr z,A39A5 + dec b + jr z,A39AA ; с какого диска загр. система (для загрузчика) + ld a,EINVFNC ; код "неверный номер функции" + scf + ret + ; +A39A5: db 3Eh ; ld a,.. +boot_disk: + db -1 ; номер диска, с которого загружалась система + and a + ret + +; Сообщить DSS с какого диска загружается система. +; Исп. загрузчик системы для иниц. ячейки "boot_disk". +A39AA: ld b,a + ld c,0 +A39AD: push bc + ld a,c + ld bc,0008h ; получить геометрию диска + ld de,55AAh ; сигнатура + rst 18h + pop bc + jr c,A39C3 ; ошибка + ex af,af' + cp b + jr nz,A39C3 + ld a,c + ld (boot_disk),a ; иниц. ячейку + and a + ret + ; +A39C3: inc c ; ++номер boot-диска + ld a,(last_drive) ; номер посл. диска системы + cp c + jr nz,A39AD + scf + ret + + +;------------------------------------------------- +; Обработчик HDD (rst 18h) +;------------------------------------------------- +A39CC: inc c + dec c ; c=0 + jr z,A3A01 + dec c ; c=1 open + jp z,A3BD1 + dec c ; c=2 close + jp z,A3BD3 + dec c ; c=3 media check (смена носителя) + jp z,A3BD5 + dec c ; c=4 get BPB + jp z,A3BD9 + dec c ; c=5 input (чтение секторов) + jp z,A3C27 + dec c ; c=6 output (запись секторов) + jp z,A3C1C + dec c ; c=7 + jp z,A3BCD + dec c ; c=8 узнать геометрию диска + jp z,A3B34 + dec c ; c=9 + jr z,A39FD + dec c ; c=10 + jp z,A3C06 + dec c ; c=11 + jp z,A3C11 +A39FD: ld a,1 ; код "bad command" + scf + ret + +; c=0 +A3A01: push iy + ld hl,T3A4C ; таблица лог.дисков (16*12) + ld (D3D78),hl ; адрес структуры тек. лог. диска + ld ix,L4000 ; буфер под список (5 байт) + ld c,5Fh ; список дисковых устройств + rst 08h + xor a + ld b,(ix+2) ; кол-во HDD устройств + cp b + jr z,A3A25 ; нет винтов + ; + ld c,80h ; мастер на первом канале +A3A19: push bc + ld a,c + ld (D3D6F),a ; номер девайса (80h/81h мастер/слейв) + call A3C9A ; узнать лог. диски винта и создать их таблицы + pop bc + inc c ; слейв на первом канале + djnz A3A19 + ; +A3A25: pop iy + ld hl,(D3D78) ; адрес структуры тек. лог. диска + ld de,T3A4C ; таблица лог.дисков (16*12) + xor a ; счетчик лог. дисков + sbc hl,de + ret z ; структура первого лог. диска + ld de,16 ; размер структуры лог. диска + inc a + sbc hl,de + jr nz,$-3 ; перейти на структуру первого лог. диска + and a ; a=кол-во лог.дисков + ret + + +; нет обращения +;L3A3B: ld a,0FFh + ;inc hl + ;cp (hl) + ;ret nz + ;inc hl + ;cp (hl) + ;ret nz + ;inc hl + ;cp (hl) + ;ret nz + ;inc hl + ;cp (hl) + ;ret nz + ;inc hl + ;cp (hl) + ;ret + + +; Таблица лог. дисков ДОС-а +; +; +0 - номер девайса (80h,...) +; +1,+2,+3,+4 - абс. номер нач. сектора лог. диска +; +5,+6,+7,+8 - размер лог. диска (число секторов) +; +; +T3A4C: ds 16*12 ; 192 C..N + + +; вход: a=0..11 (индекс) +; выход: ix,hl - абс. номер нач. сектора +; a - номер девайса (80h,...) +A3B0C: push de + push bc + push hl + ld l,a + ld h,0 + add hl,hl ;1+1=2 + add hl,hl ;2+2=4 + add hl,hl ;4+4=8 + add hl,hl ;8+8=16 + ex de,hl + ld iy,T3A4C ; таблица лог.дисков (16*12) + add iy,de + ld c,(iy+1) ; абсолютный номер + ld b,(iy+2) ; начального сектора + ld e,(iy+3) ; раздела + ld d,(iy+4) ; + pop hl + add ix,bc + adc hl,de + ld a,(iy+0) ; тип девайса (80h,...) + pop bc + pop de + ret + +;c=8. Узнать геометрию диска (CHS) +A3B34: bit 7,b + jr nz,A3B49 + inc b + dec b ; b=0 + jr z,A3B6F + dec b ; b=1 + jr z,A3B5C + dec b ; b=2 + jr z,A3B60 + ld a,EINVFNC ; код "неверный номер функции" + scf + ret + ; +A3B49: res 7,b + inc b + dec b + jr z,A3B65 + dec b + jr z,A3B67 + dec b + jr z,A3B6B + ld a,1 ; код "bad command" + scf + ret + ; +A3B5C: ld a,0Bh ; код "failure" + scf + ret + ; +A3B60: ld b,l + jp A3C32 + ; +A3B65: and a + ret + ; +A3B67: ld a,0Bh ; код "failure" + scf + ret + ; +A3B6B: ld a,0Bh ; код "failure" + scf + ret + +;c=8. Узнать геометрию диска (CHS) +;b=0. +; вход: a - индекс (0..11) +A3B6F: ex de,hl + ld bc,55AAh ; сигнатура раздела + and a + sbc hl,bc + ld l,a ; индекс раздела + ld a,0Bh ; код "failure" + scf + ret nz + push iy + ld h,0 + add hl,hl ; *16 + add hl,hl + add hl,hl + add hl,hl + ld b,h + ld c,l + ld iy,T3A4C ; таблица лог.дисков (16*12) + add iy,bc + ld e,(iy+5) ; размер раздела (число секторов) + ld d,(iy+6) ; + ld l,(iy+7) ; ст. разряд + ld h,(iy+8) ; + ld a,(iy+0) ; тип девайса (80h,...) + ld c,a + ld iy,LC1C0 ; LC000+01BEh+2 ?? + and 0Fh + jr z,A3BA7 ; + ld iy,LC1C8 ; LC000+01BEh+0Ah ?? +A3BA7: in a,(0E2h) + push af + ld a,0FEh ; номер стр. + out (0E2h),a + ld a,(iy+0) + exx + ld l,(iy+3) ; + ld h,(iy+4) ; + ld e,(iy+2) ; + ld d,0 + ld b,d + ld c,(iy+1) ; + exx + ex af,af' + pop af + out (0E2h),a + ld a,c + ex af,af' + pop iy + and a + ret + + +A3BCD: ld a,1 ; код "bad command" + and a + ret + +A3BD1: xor a + ret + +A3BD3: xor a + ret + +A3BD5: ld a,-1 + and a + ret + + + +A3BD9: push iy + push de + ld l,a + ld h,0 + add hl,hl ; *16 + add hl,hl + add hl,hl + add hl,hl + ld b,h + ld c,l + ld iy,T3A4C ; таблица лог.дисков (16*12) + add iy,bc + ld e,(iy+1) ; мл. разряд номера сектора + ld d,(iy+2) + ld l,(iy+3) ; ст. разряд + ld h,(iy+4) + db 0DDh + ld l,e + db 0DDh + ld h,d + ld a,(iy+0) ; тип девайса (80h,...) + pop de ; буфер + pop iy + ld bc,0155h ; прочитать один сектор + rst 08h + ret + +A3C06: push iy + call A3B0C ; получить абс. номер нач. сектора + ld c,52h ; чтение секторов в зад. блок памяти + rst 08h + pop iy + ret + +A3C11: push iy + call A3B0C ; получить абс. номер нач. сектора + ld c,53h ; ? + rst 08h + pop iy + ret + +A3C1C: push iy + call A3B0C ; получить абс. номер нач. сектора + ld c,56h ; записать "b" секторов + rst 08h + pop iy + ret + +A3C27: push iy + call A3B0C ; получить абс. номер нач. сектора + ld c,55h ; прочитать "b" секторов + rst 08h + pop iy + ret + +A3C32: push iy + call A3B0C ; получить абс. номер нач. сектора + ld c,54h ; проверка секторов (не работает?) + rst 08h + pop iy + ret + + +; на лог. диск раздела +A3C3D: ld e,(iy+8) ; абсолютный (лог.) номер + ld d,(iy+9) ; начального сектора + ld l,(iy+10) ; раздела + ld h,(iy+11) ; + ld ix,(D3D70) ; мл.разряд + add ix,de + ld de,(D3D72) ; ст.разряд + adc hl,de + db 0DDh + ld d,h + db 0DDh + ld e,l + ld ix,(D3D78) ; адрес структуры тек. лог. диска + ld (ix+1),e + ld (ix+2),d + ld (ix+3),l + ld (ix+4),h + ; + ld e,(iy+12) ; размер раздела (число секторов) + ld d,(iy+13) ; + ld l,(iy+14) ; ст. разряд + ld h,(iy+15) ; + ld (ix+5),e + ld (ix+6),d + ld (ix+7),l + ld (ix+8),h + ld a,(D3D6F) ; номер девайса (80h/81h мастер/слейв) + ld (ix+0),a + ld de,16 ; размер таблицы лог.диска ? + add ix,de + ld (D3D78),ix ; адрес структуры след. лог. диска +A3C90: ld de,16 ; размер раздела + add iy,de + pop bc + djnz A3CD3 ; проверить след. раздел + and a ; конец разделов в MBR + ret + + +;---------------------------------------------------- +; Узнать лог. диски винта и создать их таблицы +;---------------------------------------------------- +A3C9A: in a,(0E2h) ; сохр. стр. + push af + ld a,0FFh ; номер стр. + out (0E2h),a + call A3CA8 + pop af + out (0E2h),a ; восст. стр. + ret + +A3CA8: ld ix,0 + ld de,0 + ld (D3D74),de + ld (D3D76),ix + ; цикл +A3CB7: ld (D3D70),de ; мл.разряд номера сектора + ld (D3D72),ix ; ст.разряд + call read_one_sector ; прочитать один сектор (MBR, 0-й сектор) + ld hl,(LC000+510) ; конец сектора + ld de,0AA55h ; сигнатура таблицы разделов + and a + sbc hl,de + jr nz,A3D1A ; не знакомый раздел, выйти + ld iy,LC000+01BEh ; на описатель 1-го раздела + ld b,4 ; макс. число разделов винта +A3CD3: push bc + ; тест на расш. раздел + ld a,(iy+4) ; байт-идентиф. раздела + cp 5 ; "Расширенный" 0-2Гб (MS-DOS 3.3) + jr nz,A3CFE + ; на след. раздел +A3CDB: push iy + ld de,(D3D70) ; мл.разряд номера сектора + ld ix,(D3D72) ; ст.разряд + push de + push ix + call next_partition ; на след. раздел + pop ix + pop de + ld (D3D70),de ; мл.разряд номера сектора + ld (D3D72),ix ; ст.разряд + call read_one_sector ; прочитать один сектор + pop iy + jr A3C90 + ; + ; тест на расш. раздел +A3CFE: cp 0Fh ; "Расширенный" 0-2Гб (Win95) + jr z,A3CDB ; на след. раздел + ; тест на осн. раздел + cp 0Eh ; "Основной" 32Мб-2Гб FAT16 (Win95) + jp z,A3C3D ; на лог. диск раздела + cp 6 ; "Основной" 32Мб-2Гб FAT16 (MS-DOS 4.0) + jp z,A3C3D + cp 4 ; "Основной" 16Мб-32Мб FAT16 (MS-DOS 3.0) + jp z,A3C3D + cp 1 ; "Основной" 0Мб-15Мб FAT12 (MS-DOS 2.0) + jp z,A3C3D + call test_others; ; поставил + jr z,A3CDB; ; на след. раздел + pop bc + or a + ret z ; конец разделов +A3D1A: scf ; не знакомый раздел + ret + +; перейти на след. раздел +next_partition: + ld hl,(D3D74) + ld de,(D3D76) + ld a,l + or h + or e + or d + ld e,(iy+8) ; абсолютный (лог.) номер + ld d,(iy+9) ; начального сектора + ld l,(iy+10) ; раздела + ld h,(iy+11) ; + jr nz,A3D44 + ld (D3D74),de + ld (D3D76),hl + ld ix,(D3D76) + jp A3CB7 + ; +A3D44: ld ix,(D3D74) ; мл. разряд + add ix,de + push ix + ld de,(D3D76) ; ст. разряд + adc hl,de + push hl + pop ix + pop de + jp A3CB7 + +; тест на другие типы разделов +; вход: a - тип раздела +; выход: Z - на след. раздел +test_others: + cp 0Bh ; "Основной" 512Мб-2Тб FAT32 (OSR2) + ret z + cp 7 ; NTFS + ret z + cp 82h ; Linux swap + ret z + cp 83h ; Linux + ret z + cp 0EBh ; BeOS + ret + + +;------------------------------------------------- +; Чтение одного сектора в буфер 0C000h +;------------------------------------------------- +read_one_sector: + push iy + ld ix,(D3D70) ; мл.разряд номера сектора + ld hl,(D3D72) ; ст.разряд + ld de,LC000 ; буфер + ld bc,0155h ; прочитать один сектор + ld a,(D3D6F) ; номер девайса (80h/81h мастер/слейв) + rst 08h + pop iy + ret + + +D3D6F: db 0 ; номер девайса (80h/81h мастер/слейв) + ; +D3D70: dw 0 ; мл.разряд номера сектора +D3D72: dw 0 ; ст.разряд +D3D74: dw 0 +D3D76: dw 0 + ; +D3D78: dw T3A4C ; адрес структуры тек. лог. диска + + + + +;------------------------------------------------- +; Обработчик FDD (rst 18h) +;------------------------------------------------- +A3D7A: inc c + dec c ; c=0 + jr z,A3DA7 + dec c ; c=1 + jr z,A3DAB + dec c ; c=2 + jr z,A3DAF + dec c ; c=3 + jr z,A3DB1 + dec c ; c=4 + jr z,A3DB5 + dec c ; c=5 + jr z,A3DDB + dec c ; c=6 + jr z,A3DDF + dec c ; c=7 + jp z,A3E5A + dec c ; c=8 + jr z,A3DE3 + ld a,EINVFNC ; код "неверный номер функции" + scf + ret +; c=0 +A3DA7: ld a,2 + and a + ret +; c=1 +A3DAB: ld c,51h ; сбр. контроллер и настр. на диск + rst 08h + ret +; c=2 +A3DAF: xor a + ret +; c=3 +A3DB1: ld a,-1 + and a + ret +; c=4 +A3DB5: ld ix,0 ; мл. разряд номера сектора + ld hl,0 ; ст. разряд + push de + push af + ld bc,0155h ; прочитать один сектор + rst 08h + pop de + pop hl + ret c + ld bc,24 + add hl,bc + ld e,(hl) + push de + ld a,d + ld c,58h ; получить парам. носителя + rst 08h + ld a,h + pop hl + push hl + ld h,a + pop af + ld c,59h ; уст. парам. носителя + rst 08h + xor a + ret + +; c=5 +A3DDB: ld c,55h ; чтение с девайса + rst 08h + ret +; c=6 +A3DDF: ld c,56h ; запись на девайс + rst 08h + ret +; c=8 +A3DE3: bit 7,b + jr nz,A3DF0 + inc b + dec b + jr z,A3DFB + ld a,1 ; код "bad command" + scf + ret + ; +A3DF0: res 7,b + inc b + dec b + jr z,A3E41 + ld a,1 ; код "bad command" + scf + ret + ; +A3DFB: ex de,hl + ld bc,55AAh ; сигнатура + and a + sbc hl,bc + ld l,a + ld a,0Bh ; код "failur" + scf + ret nz + ld a,l + and 0Fh + push af + ld c,58h ; получить парам. носителя + rst 08h + jr c,A3E3C + push hl + push de + ld a,h + ld h,0 + add hl,hl + dec a + jr nz,$-2 + ld b,h + ld c,l + ex af,af' + xor a + ld l,a + ld h,a +A3E20: ex af,af' + add hl,bc + adc a,0 + dec de + ex af,af' + ld a,d + or e + jr nz,A3E20 + ex af,af' + ld e,a + ex de,hl + exx + pop de + pop hl + pop af + ex af,af' + ld a,b + ld c,l + ld b,0 + ld l,h + ld h,b + ex de,hl + exx + and a + ret + ; +A3E3C: pop af + ld a,2 ; код "bad drive number" + scf + ret + ; +A3E41: push af + exx + ex de,hl + ld h,l + ld l,c + pop af + and 0Fh + push af + push hl + push de + ld c,58h ; получить парам. носителя + rst 08h + pop de + pop hl + jr c,A3E3C + pop af + ld c,59h ; уст. парам. носителя + rst 08h + ret c + and a + ret +; c=7 +A3E5A: ld a,1 + and a + ret + + +;------------------------------------------------- +; Обработчик RAM-дисков +;------------------------------------------------- +A3E5E: inc c + dec c ; c=0 + jp z,A3EF5 + dec c ; c=1 + jr z,A3E7F + dec c ; c=2 + jr z,A3E81 + dec c ; c=3 + jr z,A3E83 + dec c ; c=4 + jr z,A3E87 + dec c ; c=5 + jr z,A3E93 + dec c ; c=6 + jr z,A3EC4 + ld a,1 ; код "bad command" + scf + ret +; c=1 +A3E7F: xor a + ret +; c=2 +A3E81: xor a + ret +; c=3 +A3E83: ld a,-1 + and a + ret +; c=4 +A3E87: ld ix,0 + ld hl,0 + ld b,1 +; c=5 +A3E93: push bc + push ix + push hl + push bc + call A3F35 + pop bc + ld ix,512 ; размер сектора ? +A3EA0: push bc + push ix + call A3F71 + pop ix + pop bc + djnz A3EA0 + pop hl + pop ix + pop bc + xor a + cp b + ld c,b + ld b,a + jr z,A3EBC + add ix,bc + ld c,b + adc hl,bc + xor a + ret + ; +A3EBC: inc b + add ix,bc + ld b,c + adc hl,bc + xor a + ret +; c=6 +A3EC4: push bc + push ix + push hl + push bc + call A3F35 + pop bc + ld ix,512 ; размер сектора ? +A3ED1: push bc + push ix + call A3FAD + pop ix + pop bc + djnz A3ED1 + pop hl + pop ix + pop bc + xor a + cp b + ld c,b + ld b,a + jr z,A3EED + add ix,bc + ld c,b + adc hl,bc + xor a + ret + ; +A3EED: inc b + add ix,bc + ld b,c + adc hl,bc + xor a + ret + +; c=0. Просканировать число RAM-дисков. +A3EF5: ;ld hl,0200h ; ## +; ld a,80h +;A3EFA: srl a ; / 2 (мл.бит в CF) +; rr h ; цикл. сдвиг вправо через CF +; jr nc,A3EFA + ; выход: h=0, a=20h + ld a,20h ; поставил + ld (D3F70),a + ld de,T3F25 ; таблица номеров (0..15) RAM-дисков + ld bc,00CEh ; получить id блока, назнач. на RAM-диск +A3F09: push bc + ld a,b ; номер RAM-диска 0..15 + rst 08h + or a + jr z,A3F11 ; блок не назначен + ld (de),a ; id блока в таблицу + inc de +A3F11: pop bc + inc b ; ++номер ram-диска + ld a,15+1 ; макс. номер + 1 + cp b + jr nz,A3F09 + ; выход за пределы 0..15 диапазона (нет своб. ram-дисков) + ld hl,T3F25 ; таблица номеров (0..15) RAM-дисков + ex de,hl + and a + sbc hl,de + ld a,l ; число RAM-дисков (0=нет) + ;ld hl,T3FEB; ; нужен ? + and a + ret + + +; Таблица номеров (0..15) RAM-дисков +T3F25: db -1,-1,-1,-1,-1,-1,-1,-1 + db -1,-1,-1,-1,-1,-1,-1,-1 + + + +A3F35: ld bc,T3F25 + add a,c + ld c,a + ld a,0 + adc a,b + ld b,a + ld a,(bc) + ex af,af' + db 0DDh + ld b,h + db 0DDh + ld c,l + ld a,(D3F70) +A3F47: rrca ; цикл. сдвиг вправо (мл.разряд в CF) + jr c,A3F54 + rr h + rr l + rr b + rr c + jr A3F47 + ; +A3F54: ld b,c ; лог. номер страницы + ld c,0C4h ; получить физ. номер страницы блока + ex af,af' + rst 08h + ex af,af' + ld a,(D3F70) + ld c,a + dec c + db 0DDh + ld a,l + and c + inc a + ld hl,LC000 + ld bc,512 + sbc hl,bc + add hl,bc + dec a + jr nz,$-2 + ret + +D3F70: db 0 + + +A3F71: ld a,d + cp 0A0h + ld c,0E2h + set 6,h + jr c,A3F7E + ld c,0A2h + res 7,h +A3F7E: in a,(c) + ex af,af' + di + out (c),a + db 0DDh + ld b,h + db 0DDh + ld h,c + db 0DDh + ld c,l + ldir + ex af,af' + db 0DDh + ld c,h + out (c),a + ld a,h + and 7Fh + ei + ret nz + ld c,0E2h + in b,(c) + ld a,0FEh + out (c),a + ex af,af' + db 0DDh + ld h,0C2h + db 0DDh + ld l,a + ld a,(ix+0) + ex af,af' + out (c),b + ld h,0C0h + ret + + +A3FAD: ld a,d + cp 0A0h + ld c,0E2h + set 6,h ; 00->40h + jr c,A3FBA + ld c,0A2h + res 7,h +A3FBA: in a,(c) + ex af,af' + di + out (c),a + db 0DDh + ld b,h + db 0DDh + ld h,c + db 0DDh + ld c,l + ex de,hl + ldir + ex de,hl + ex af,af' + db 0DDh + ld c,h + out (c),a + ld a,h + and 7Fh + ei + ret nz + ld c,0E2h + in b,(c) ; сохр. порт + ld a,0FEh ; номер стр. + out (c),a + ex af,af' + db 0DDh + ld h,0C2h + db 0DDh + ld l,a + ld a,(ix+0) + ex af,af' + out (c),b ; восст. порт + ld h,0C0h + ret + + + include "cursor.asm" + + + + + + +; вход: de=скен-код/ascii-код (d - сбр. 7-й бит) +; +;TSR: ld a,b +; and 00110000b ; биты Ctrl+Alt +; cp 00110000b ; 30h +; jp nz,A06DD ; сохр. de,bc в кольц. буфере клавы +; ; de=скен-код/ascii-код +; ; очистить буфер клавиатуры +; ld a,(D0641) +; ld (D0640),a +; ret; +; ; +; res 7,d +; ld a,d +; ld e,a +; ld d,0 ; de=индекс скен-кода (hot-клавиши) +; ; вкл. стр. с таблицей +; ld a,3 ; лог. номер дос-банки +; call set_dos_page ; подкл. дос-банку в 0C000h +; ld (tsr2+1),a ; старая банка 0E2h порта +; ; +; ld hl,0C000h +; add hl,de ; адрес элемента обраб. hot-клавиши +; ld a,(hl) +; or a +; jr z,tsr1 ; обраб. не определен +; ld (tsr2+1),a ; стр. обработчика +; inc hl +; ld a,(hl) ; адрес обработчика hot-клавиши +; inc hl +; ld h,(hl) +; ld l,a +; ld (tsr4+1),hl ; адрес обработчика +; jr tsr3 +; ; +;tsr1: +;tsr2: ld a,-1 +; out (0E2h),a ; восст. порт +; ret +; ; +;tsr3: call tsr1 ; вкл. страницу обработчика +;tsr4: jp 0 ; перейти на обработчик + + + + +; раб. буфер, исп. 16 байт (п/п рам-дисков) +;T3FEB: db 0 diff --git a/DOS/DOS.INC b/DOS/DOS.INC new file mode 100755 index 0000000..16445ae --- /dev/null +++ b/DOS/DOS.INC @@ -0,0 +1,91 @@ +true equ 1 +false equ 0 + +; номер версии ДОС +major_version equ 1 ; версия (0..9) +minor_version equ 61 ; модификация (0..99) +build_version equ 10 ; билд (0..999) + +; макс. число дескрипторов файлов в системе +max_handles equ 9 + +; макс. длина строки переменной окружения (имя + значение) +maxlen_env_string equ 255 + + + + +A0000 equ 0 +;A0101 equ 0101h ; 257 ? +L4000 equ 4000h +L403F equ 403Fh ; стек +LC000 equ 0C000h +LC1C0 equ 0C1C0h +LC1C8 equ 0C1C8h +LC400 equ 0C400h +LE400 equ 0E400h ; начало буфера переменных окружения +LFC7F equ 0FC7Fh +LFC80 equ 0FC80h +LFD00 equ 0FD00h +LFDFF equ 0FDFFh +LFE00 equ 0FE00h + ; +LFEE0 equ 0FEE0h ; 32 байта описателя окна (8..31 зарез.) + + + + + +; Коды ошибок ДОС +; +EZERO equ 0 ; No error +EINVFNC equ 1 ; Invalid function +EINVDRV equ 2 ; Invalid drive number +ENOFILE equ 3 ; File not found +ENOPATH equ 4 ; Path not found +EINVHND equ 5 ; Invalid handle +EMFILE equ 6 ; Too many open files +EEXIST equ 7 ; File already exists +EROFILE equ 8 ; File read only +EROOT equ 9 ; Root overflow +ENOSPACE equ 10 ; No free space +ENOEMPTY equ 11 ; Directory not empty +ECURDIR equ 12 ; Can't delete current directory +EINVMED equ 13 ; Invalid media +EUNOPER equ 14 ; Unknown operation (невозм. операция) +EEXISDIR equ 15 ; Directory exist +EINVFNAM equ 16 ; Invalid filename +EINVEXE equ 17 ; Invalid EXE-file +ENSUPEXE equ 18 ; Not supported EXE-file +EACCES equ 19 ; Access denied +ENORDY equ 20 ; Not ready +ESEEK equ 21 ; Seek error +ENOSECT equ 22 ; Sector not found +ECRC equ 23 ; CRC error +EWRTPRT equ 24 ; Write protect +EREAD equ 25 ; Read error +EWRITE equ 26 ; Write error +EDRVFAIL equ 27 ; Drive failure +EEXTND28 equ 28 ; Extended error: 28 +EEXTND29 equ 29 ; Extended error: 29 +ENOMEM equ 30 ; Not enough memory +EINVMEM equ 31 ; Invalid memory block +EEXTND32 equ 32 ; Extended error: 32 +EEXTND33 equ 33 ; Extended error: 33 +EEXTND34 equ 34 ; Extended error: 34 +ETMFILE equ 35 ; Too many files in directory (список файлов) +EDEPTH equ 36 ; (слишком большая влож. папок или >= 1024 папок) +EUABORT equ 37 ; User abort (операция прервана пользователем) +EERR38 equ 38 ; 38 +EERR39 equ 39 ; 39 +EERR40 equ 40 ; 40 +EERR41 equ 41 ; 41 +EERR42 equ 42 ; 42 +EERR43 equ 43 ; 43 +EERR44 equ 44 ; 44 +EERR45 equ 45 ; 45 +EERR46 equ 46 ; 46 +EERR47 equ 47 ; 47 +EERR48 equ 48 ; 48 +EERR49 equ 49 ; 49 +EERR50 equ 50 ; 50 diff --git a/DOS/KEYB.ASM b/DOS/KEYB.ASM new file mode 100755 index 0000000..6525e79 --- /dev/null +++ b/DOS/KEYB.ASM @@ -0,0 +1,1003 @@ +; Начинается с 0600h. Внутри идет выравнивание на границу 0900h. +; +; Также включает код "Init_DOS". +; + + + + +; раб. ячейки клавы + +T0600: ds 64 ; 40h (не менять размер, идет AND 3Fh) + ; +D0640: db 0 ; тек. адрес конца кольц. буфера? +D0641: db 0 ; адрес начала кольц. буфера? +; флаги клавы +D0642: db 2 + db 0 + db 0 + db 3 + ; +D0646: dw 0 + + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #30. Ожидание нажатия клавиатуры (без эха). +; +; вход: нет +; выход: A=код символа +; D=скен-код +; Е=код символа +; B=биты Ctrl,Alt,Shift +; C=др.служ.клавиши +;///////////////////////////////////////////////////////////////////// +Func_30:ld hl,D0641 + ld a,(D0640) + cp (hl) + jr z,Func_30 ; нет клавиши + call A06FC + ld a,e + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #31. Опрос клавиатуры без ожидания. +; +; вход: нет +; выход: A=код символа +; D=скен-код +; Е=код символа +; B=биты Ctrl,Alt,Shift +; C=др.служ.клавиши +; "Z" - нет клавиш +;///////////////////////////////////////////////////////////////////// +Func_31:ld hl,D0641 + ld a,(D0640) + cp (hl) + ret z ; нет клавиши + call A06FC + ld a,e + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #32. Ожидание нажатия клавиатуры (с эхом). +; +; вход: нет +; выход: A=код символа +; D=скен-код +; Е=код символа +; B=биты Ctrl,Alt,Shift +; C=др.служ.клавиши +;///////////////////////////////////////////////////////////////////// +Func_32: + call focus_to_inpline ; вкл. курсор + call Func_31 ; опрос клавы без ожидания + jr z,$-3 + push de + push bc + push af + call cursor_off ; выкл. курсор + pop af + or a ; добавил + call nz,Func_5B ; вывод "a" на экран + pop bc + pop de + ld a,e + and a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #33. Получить состояние клавиатуры. +; Возвращает состояние клавиатуры на данный момент. +; Данные берутся не из буфера клавиатуры (как в остальных функциях), +; а непосредственно из результатов последнего сканирования клавиатуры. +; +; вход: нет +; выход: A=0 - нет символов в буфере +; B=биты Ctrl,Alt,Shift +; C=др.служ.клавиши +;///////////////////////////////////////////////////////////////////// +Func_33:ld hl,D0641 + ld a,(D0640) + cp (hl) + ld bc,(D0642) ; флаги клавы + ld a,0 + ret z ; нет клавиши + dec a + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #37. Опрос буфера клавиатуры. +; Возвращаемые регистры, как и в функции 30h (WAITKEY). +; Информация о нажатии остается в буфере. +; +; вход: нет +; выход: A=код символа +; D=скен-код +; Е=код символа +; B=биты Ctrl,Alt,Shift +; C=др.служ.клавиши +; "Z" - нет символов в буфере +;///////////////////////////////////////////////////////////////////// +Func_37:ld hl,D0641 + ld a,(D0640) + cp (hl) + ret z ; нет клавиши + ld l,(hl) + ld h,T0600 / 256 ; 06h ст. байт адреса + ld e,(hl) + inc l + ld d,(hl) + inc l + ld b,(hl) + inc l + ld c,(hl) + ld a,e + ret + + + +;///////////////////////////////////////////////////////////////////// +; Функция #35. Очистить буфер клавиатуры и выполнить функцию. +; +; вход: B=номер функции 30h, 31h, 32h, 33h +; выход: В зависимости от указанной функции в регистре B. +;///////////////////////////////////////////////////////////////////// +Func_35:ld a,(D0641) ; адрес начала кольц.буфера + ld (D0640),a ; тек. адрес в кольц. буфере + ; + ld a,30h-1 + cp b + jr c,A06D1 + ld a,EINVFNC ; код "неверный номер функции" + scf + ret + ; +A06D1: ld a,35h ; номер функции + cp b + jr nc,A06DA + ld a,EINVFNC ; код "неверный номер функции" + scf + ret + ; +A06DA: ld c,b + rst 10h + ret + + + + +A06DD: ld hl,D0640 + ld a,(D0641) + sub 4 + and 3Fh ; ограничить адрес конца кольц. буфера + cp (hl) + jr z,A0716 ; бип, конец кольц. буфера + ld a,(hl) + inc (hl) ; ячейка D0640 + inc (hl) + inc (hl) + inc (hl) + res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) + ld l,a + ld h,T0600 / 256 ; 06h ст. байт адреса + ld (hl),e + inc l + ld (hl),d + inc l + ld (hl),b + inc l + ld (hl),c + ret + +A06FC: ld hl,D0641 + ld a,(D0640) + cp (hl) + ret z ; нет клавиши + ld a,(hl) + inc (hl) + inc (hl) + inc (hl) + inc (hl) + res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) + ld l,a + ld h,T0600 / 256 ; 06h ст. байт адреса + ld e,(hl) + inc l + ld d,(hl) + inc l + ld b,(hl) + inc l + ld c,(hl) + ret + +; бип +A0716: ex af,af' + bit 0,(ix+3) + jr z,A0728 + exx + ld de,230 ; задержка внутр. цикла + ld hl,50 ; задержка внеш. цикла + call beep ; звук + exx +A0728: ex af,af' + ret + + + + +A072A: set 7,(ix+2) + jr A0740 + +A0730: set 6,(ix+2) ; уст. бит "отжата" + jr A0740 + +A0736: set 5,(ix+2) + jr A0740 + +; сканирование клавы +keyb_scan: + ld ix,D0642 ; флаги клавы +A0740: in a,(19h) ; порт статуса + rra ; 0-bit, очередной байт пришел ? + ret nc ; нет + in a,(18h) + cp 0F0h ; клавиша отжата ? + jr z,A0730 ; да, уст. 6 bit + cp 0E0h ; признак "Upgrade Code" у Антона + jr z,A072A ; уст. 7 bit (расш. скен-код) + cp 0E1h ; Pause + jr z,A0736 ; уст. 5 bit + ; + ld l,a + bit 6,(ix+2) ; отжата клавиша ? + jr nz,A07B3 ; да, на сброс битов регистра "B" (ix+1) + call A0990 + call A0892 ; уст. биты регистра "B" (ix+1) + res 7,(ix+2) ; сбр. бит "расш. скен-код" ? + res 5,(ix+2) ; сбр. бит паузы + ret z ; не сохранять код, биты устанавливались + call A09B4 + ; + ld hl,1C00h ; Caps Lock + and a + sbc hl,de + call z,A07C8 + ld hl,0B800h ; Space + Ctrl, Alt + and a + sbc hl,de + call z,A07D1 ; перекл. бита Rus/Lat + ld hl,5000h ; Ins + and a + sbc hl,de + call z,A07EF + ld hl,4900h ; Num Lock + and a + sbc hl,de + call z,A07F8 ; инв. 3-й бит (бит Num Lock) + ld hl,0C900h ; Pause или Num Lock+80h (Num Lock+Ctrl/Atl/Shift) + and a + sbc hl,de + call z,A0801 + ld hl,4800h ; Scroll Lock + and a + sbc hl,de + call z,A081E ; инв. 2-й бит (бит Scroll Lock) + ld hl,0CF00h ; Del+80h (с Shift) + and a + sbc hl,de + call z,reboot_system ; тест на Ctrl+Alt + ld bc,(D0642) ; флаги клавы + jp A06DD ;## сохр. de,bc в кольц. буфере клавы + ;jp TSR; + ;ret ; не оптимизить + + +A07B3: res 6,(ix+2) ; сбр. бит "клавиша отжата" + call A0990 + call A0837 ; сбр. биты регистра "B" (ix+1) + res 7,(ix+2) ; сбр. бит "расш. скен-код" ? + ld h,0 + ld (D0646),hl + ret + +A07C8: ld a,(ix+0) + xor 1 + ld (ix+0),a + ret + +A07D1: bit 5,(ix+1) ; бит Ctrl ? + ret z ; нет + ld a,(ix+0) + xor 80h ; 7-й бит (1=Rus,0=Lat) + ld (ix+0),a + bit 1,(ix+3) + ret z + exx + ld de,190 ; задержка внутр. цикла + ld hl,20 ; задержка внеш. цикла + call beep ; звук + exx + ret + +A07EF: ld a,(ix+0) + xor 2 ; 1-й бит + ld (ix+0),a + ret + +A07F8: ld a,(ix+0) + xor 8 ; 3-й бит + ld (ix+0),a + ret + +; Pause или Num Lock + Ctrl, Atl, Shift +A0801: bit 5,(ix+1) ; бит Ctrl ? + ret z ; нет +; pop hl ; ?? + ld a,(ix+0) + xor 40h ; 6-й бит + ld (ix+0),a + bit 6,(ix+0) + ret z + ei +A0815: halt + bit 6,(ix+0) + jr nz,A0815 + di + ret + +A081E: ld a,(ix+0) + xor 4 + ld (ix+0),a + ret + + +; клавиша Del +reboot_system: + ;bit 5,(ix+1) ; бит Ctrl + ;ret z + ;bit 4,(ix+1) ; бит Alt + ;ret z + ld c,00110000b ; биты Ctrl+Alt + ld a,(ix+1) + and c + cp c + ret nz + ; софтовый ребут + xor a + ld bc,01FDh + rst 08h + ret + + + +;------------------------------------------------- +; Сбросить биты регистра "B" (ix+1) +;------------------------------------------------- +A0837: ld a,l + cp 37h + jr nz,A084A + res 2,(ix+1) + bit 0,(ix+1) + ret nz + res 4,(ix+1) + ret + ; +A084A: cp 39h + jr nz,A085C + res 0,(ix+1) + bit 2,(ix+1) + ret nz + res 4,(ix+1) + ret + ; +A085C: cp 36h + jr nz,A086E + res 3,(ix+1) + bit 1,(ix+1) + ret nz + res 5,(ix+1) + ret + ; +A086E: cp 3Ah + jr nz,A0880 + res 1,(ix+1) + bit 3,(ix+1) + ret nz + res 5,(ix+1) + ret + ; +A0880: cp 29h + jr nz,A0889 + res 7,(ix+1) ; сбр. бит LShift + ret + ; +A0889: cp 34h + ret nz + res 6,(ix+1) ; сбр. бит RShift + ret + + +;------------------------------------------------- +; Установить биты регистра "B" (ix+1) +;------------------------------------------------- +A0892: ld a,l + cp 37h + jr nz,A08A0 + set 2,(ix+1) + set 4,(ix+1) + ret + ; +A08A0: cp 39h + jr nz,A08AD + set 0,(ix+1) + set 4,(ix+1) + ret + ; +A08AD: cp 36h + jr nz,A08BA + set 3,(ix+1) + set 5,(ix+1) + ret + ; +A08BA: cp 3Ah + jr nz,A08C7 + set 1,(ix+1) + set 5,(ix+1) + ret + ; +A08C7: cp 29h + jr nz,A08D0 + ;-- поставил (фикс глюка PrintScreen) + ; при нажатии PrnScrn, клава выдает двойной код: LShift и PrnScrn + bit 7,(ix+2) ; был расш. скен-код (#E0) ? + jr z,$+4 ; нет (Ctrl,Alt,Shift не нажаты) + xor a ; флаг "Z" (не сохр. код #29 LShift) + ret + ;-- + set 7,(ix+1) ; уст. бит LShift + ret + ; +A08D0: cp 34h + ret nz + set 6,(ix+1) ; уст. бит RShift + ret + + + + +;///////////////////////////////////////////////////////////////////// +; +; Начальная инициализация ДОС +; +;///////////////////////////////////////////////////////////////////// +Init_DOS: + di + call init_keyb_ports ; иниц. LPT-портов для клавы + call A10D1 ; иниц. ?? портов + lpt-портов клавы + ld c,0 ; иниц. мышки + rst 30h + ld a,(mode_screen) ; тек. режим экрана + ld c,81h ; инфа о смене режима (для мышки) + rst 30h + call scan_all_devices ; определить все девайсы в системе + ei + ; уст. вектор на функцию #00 + ld de,Func_00 ; адрес функции "номер версии ДОС" + ld hl,T0200 ; таблица мл. разрядов адресов + ld (hl),e ; сохр. мл.разряд + inc h ; 0300h + ld (hl),d ; сохр. ст.разряд + ; + ld bc,03C2h ; выделить 3 банки памяти + ;ld bc,04C2h ; выделить 4 банки памяти + rst 08h + ld hl,list_dos_pages ; 16 байт, номера банок расширения ДОС + ld c,a ; дескр. блока + ld b,-1 +A00DF: inc b + push bc ; b=номер страницы в блоке + push hl + ld a,c ; дескр. блока + ld c,0C4h ; получить физ. номер стр. блока + rst 08h + pop hl + pop bc + ld (hl),a ; сохр. номер банки + inc hl + jr nc,A00DF + ; + call setup_znak ; настр. знакоген. курсора + ld b,-1 ; иниц. буфера окружения ? + call Func_46 ; системная окружения + jp Func_00 ; функция "номер версии ДОС" + + + + + + ;ds 0900h - $ ; выровнить на границу xx00h +L0900 equ $+100h AND 0FF00h + ds L0900 - $ + + + +; Должно начинаться точно с xx00h! (не стал фиксить (для скорости)). +; Скен-коды клавиш, 144 байта. +A0900: db 0,43h,0,3Fh,3Dh,3Bh,3Ch,46h + db 0,44h,42h,40h,3Eh,0Fh,0,0 + db 0 + db 37h,29h,0 + db 36h,10h,2,0 + db 0,0,2Ah,1Eh,1Dh,11h,3,0 + db 0,2Ch,2Bh,1Fh,12h,5,4,0 + db 0,38h,2Dh,20h,14h,13h,6,0 + db 0,2Fh,2Eh,22h,21h,15h,7,0 + db 0 +;A0939: + db 0 +;A093A: + db 30h,23h,16h,8,9,0,0,31h + db 24h,17h,18h,0Bh,0Ah +;A0947: + db 0,0,32h +;A094A: + db 33h,25h,26h,19h +;A094E: + db 0Ch,0,0,0,27h,0,1Ah,0Dh + db 0,0,1Ch,34h + db 28h,1Bh,0,35h + db 0,0,0,0,0,0,0,0 + db 0Eh,0,0,51h,0,54h,57h,0 + db 0,0,50h,4Fh,52h,55h,56h,58h + db 1,49h,45h,4Dh,53h,4Ch + db 4Bh,59h + db 48h,0,0,0,0,41h,0,0 + db 0,0,0,0,0,0,0,0 + db 0,0 + + + +A0990: bit 7,(ix+2) ; бит "расш. скен-код" ? + jr z,A09B0 + cp 11h ; Alt (левый/правый) + ld l,39h ; RAlt + ret z + cp 14h ; Ctrl (левый/правый) + ld l,3Ah ; RCtrl + ret z + cp 5Ah ; Enter + ld l,4Eh ; enter + ret z + cp 4Ah ; / + ld l,a;4Ah ; / + ret z + cp 7Ch ; "*" в доп.поле, PrintScreen + ld l,47h ; PrintScreen + ret z + ld l,a +A09B0: ld h,A0900 / 256 ; 09h ст. байт адреса + ld l,(hl) ; загрузить скен-код + ret + + +A09B4: ld d,l + ld e,0 + bit 7,(ix+0) + jp nz,A09F6 + ld a,(ix+1) + and 0C0h + jr nz,A09E3 + set 7,d + bit 4,(ix+1) + ret nz + bit 5,(ix+1) + ret nz + ld d,l + ld bc,T0B75 ; Lat-раскладка с вкл. CapsLock + bit 0,(ix+0) + jr nz,A09DE + ld bc,T0AC1 ; нормальная Lat-раскладка +A09DE: ld h,0 + add hl,bc + ld e,(hl) + ret + ; +A09E3: ld bc,T0B1B ; Lat-раскладка с Shift + bit 0,(ix+0) + jr z,A09EF + ld bc,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift +A09EF: ld h,0 + add hl,bc + ld e,(hl) + set 7,d + ret + ; + ; +A09F6: ld a,(ix+1) + and 0C0h + jr nz,A0A1B + set 7,d + bit 4,(ix+1) + ret nz + bit 5,(ix+1) + ret nz + ld d,l + bit 0,(ix+0) + ld bc,T0CDD ; Rus-раскладка с вкл. CapsLock + jr nz,A0A16 + ld bc,T0C29 ; нормальная Rus-раскладка +A0A16: ld h,0 + add hl,bc + ld e,(hl) + ret + ; +A0A1B: ld bc,T0C83 ; Rus-раскладка с Shift + bit 0,(ix+0) + jr z,A0A27 + ld bc,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift +A0A27: ld h,0 + add hl,bc + ld e,(hl) + set 7,d + ret + + + + + + + + + +;///////////////////////////////////////////////////////////////////// +; Функция #36. Управление настройками клавиатуры. +; +; вход: B=номер подфункции (0,1,2) +; выход: В зависимости от указанной функции в регистре B. +;///////////////////////////////////////////////////////////////////// +Func_36:inc b + dec b + jr z,A0A49 ; уст. раскладку клавиатуры + dec b + jr z,A0A3F ; получить состояние звуковых переменных + dec b + jr z,A0A44 ; уст. состояние звуковых переменных + ld a,EUNOPER ; код "невозможная операция" + scf + ret + +;B=1. Получить состояние звуковых переменных +A0A3F: ld a,(D0003) + and a + ret + +;B=2. Установить состояние звуковых переменных +; A=значение переменной +; D0 - сигнал переполнения буфера клавиатуры +; D1 - сигнал переключения на альтернативную раскладку клавиатуры +A0A44: ld (D0003),a + and a + ret + +;B=0. Установить раскладку клавиатуры +; A=номер раскладки +; 0 - normal +; 1 - shift +; 2 - caps lock +; 3 - caps lock + shift +; 4 - normal (альтернативная клав.) +; 5 - shift (альтернативная клав.) +; 6 - caps lock (альтернативная клав.) +; 7 - caps lock + shift (альтернативная клав.) +A0A49: ld bc,T0B1B - T0AC1 ; 90 размер раскладки в Таблице кодов клавиш + bit 7,a + jr nz,A0A87 + ld de,T0AC1 ; нормальная Lat-раскладка + or a + jr z,A0A83 + ld de,T0B1B ; Lat-раскладка с Shift + dec a + jr z,A0A83 + ld de,T0B75 ; Lat-раскладка с вкл. CapsLock + dec a + jr z,A0A83 + ld de,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift + dec a + jr z,A0A83 + ld de,T0C29 ; нормальная Rus-раскладка + dec a + jr z,A0A83 + ld de,T0C83 ; Rus-раскладка с Shift + dec a + jr z,A0A83 + ld de,T0CDD ; Rus-раскладка с вкл. CapsLock + dec a + jr z,A0A83 + ld de,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift + dec a + jr z,A0A83 + xor a ; код + scf + ret + ; +A0A83: ldir + xor a + ret + ; +A0A87: res 7,a + ld de,T0AC1 ; нормальная Lat-раскладка + or a + jr z,A0ABC + ld de,T0B1B ; Lat-раскладка с Shift + dec a + jr z,A0ABC + ld de,T0B75 ; Lat-раскладка с вкл. CapsLock + dec a + jr z,A0ABC + ld de,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift + dec a + jr z,A0ABC + ld de,T0C29 ; нормальная Rus-раскладка + dec a + jr z,A0ABC + ld de,T0C83 ; Rus-раскладка с Shift + dec a + jr z,A0ABC + ld de,T0CDD ; Rus-раскладка с вкл. CapsLock + dec a + jr z,A0ABC + ld de,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift + dec a + jr z,A0ABC + xor a + scf + ret + ; +A0ABC: ex de,hl + ldir + xor a + ret + + +; Таблица кодов клавиш (8 раскладок по 90 байт) +; Нормальная раскладка +T0AC1: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 + db 9,"q","w","e","r","t","y","u","i","o","p","[","]" + db 0 ; CapsLock + db "a","s","d","f","g","h","j","k","l",";","'",0Dh + db 0 ; Left Shift + db "z","x","c","v","b","n","m",",",".","/" + db 0 ; Right Shift + db '\' + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 ; NumLock + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + ; +; Раскладка с Shift +T0B1B: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 + db 9,"Q","W","E","R","T","Y","U","I","O","P","{","}" + db 0 ; CapsLock + db "A","S","D","F","G","H","J","K","L",":",'"',0Dh + db 0 ; Left Shift + db "Z","X","C","V","B","N","M","<",">","?" + db 0 ; Right Shift + db "|" + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 ; NumLock + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + ; +; Раскладка с вкл. CapsLock +T0B75: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 + db 9,"Q","W","E","R","T","Y","U","I","O","P","[","]",0 + db "A","S","D","F","G","H","J","K","L",";","'",0Dh,0 + db "Z","X","C","V","B","N","M",",",".","/",0 + db '\' + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 ; NumLock + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + ; +; Раскладка с вкл. CapsLock + Shift +T0BCF: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 + db 9,"q","w","e","r","t","y","u","i","o","p","{","}",0 + db "a","s","d","f","g","h","j","k","l",":",'"',0Dh,0 + db "z","x","c","v","b","n","m","<",">","?",0 + db "|" + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 ; NumLock + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + ; +; Нормальная раскладка +T0C29: db "ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 + db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 + db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 + db "я","ч","с","м","и","т","ь","б","ю",".",0 + db '\' + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 ; NumLock + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + ; +; Раскладка с Shift +T0C83: db "Ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 + db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 + db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 + db "Я","Ч","С","М","И","Т","Ь","Б","Ю",",",0 + db "|" + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 ; NumLock + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + ; +; Раскладка с вкл. CapsLock +T0CDD: db "Ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 + db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 + db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 + db "Я","Ч","С","М","И","Т","Ь","Б","Ю",".",0 + db '\' + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 ; NumLock + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + ; +; Раскладка с вкл. CapsLock + Shift +T0D37: db "ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 + db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 + db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 + db "я","ч","с","м","и","т","ь","б","ю",",",0 + db "|" + db 0 ; Ctrl + db 0 ; Alt + db 20h ; Space + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ; доп. поле + db 0 + db "/","*","-","+",0Dh + db 0,0,0,0,0,0,0,0,0,0,0 + + + + +; Звук. +; вход: hl=задержка внеш. цикла +; de=задержка внутр. цикла +beep: ld a,10h + out (0FEh),a ; порт + ld b,d + ld c,e + dec bc + ld a,b + or c + jr nz,$-3 + ld a,0 + out (0FEh),a ; порт + ld b,d + ld c,e + dec bc + ld a,b + or c + jr nz,$-3 + dec hl + ld a,h + or l + jr nz,beep + ret + + + +;------------------------------------------------- +; Иниц. LPT-портов для клавы +;------------------------------------------------- +init_keyb_ports: + ld a,0 + out (19h),a + ld a,1 + out (19h),a + ld a,0 + out (19h),a + ld a,3 + out (19h),a + ld a,0C1h + out (19h),a + ld a,4 + out (19h),a + ld a,7 + out (19h),a + ld a,5 + out (19h),a + ld a,62h + out (19h),a + ret + + + +;PR: push ix +; push hl +; push de +; push af +; push hl; +; ld c,8Eh +; rst 08h +; ld (_pr+1),de +; ld de,1500h +; ld c,84h +; rst 08h +; pop hl; +; ;ld a,l +; call HEX1 +;_pr: ld de,0 +; ld c,84h +; rst 08h +; call newline +; pop af +; pop de +; pop hl +; pop ix +; ret + +;HEXHL: ld a,h +; push hl +; call HEX1 +; pop hl +; ld a,l +;HEX1: push af +; rra +; rra +; rra +; rra +; call HEX2 +; pop af +;HEX2: and 0Fh +; add a,90h +; daa +; adc a,40h +; daa +;symb: jp Func_5B ; вывод символа на экран + +;newline:ld a,0Ah +; call Func_5B +; ld a,0Dh +; jp Func_5B diff --git a/DOS/MOUSE.ASM b/DOS/MOUSE.ASM new file mode 100755 index 0000000..a3b180e --- /dev/null +++ b/DOS/MOUSE.ASM @@ -0,0 +1,874 @@ +;=========================================================== +; Вектор мышки +;=========================================================== +MOUSE_vector: + bit 7,c + jr nz,A32E3 ; c >=80h + inc c + dec c ; c=0 иниц. мышки + jr z,init_mouse + dec c ; c=1 показать мышку + jr z,show_mouse + dec c ; c=2 скрыть мышку + jp z,hide_mouse + dec c ; c=3 узнать сост. мышки + jp z,get_mouse_status + dec c ; c=4 уст. координаты мышки + jp z,set_mouse_coords + dec c ; c=5 заглушка + jp z,A32DF + dec c ; c=6 заглушка + jr z,A32DF + dec c ; c=7 уст. Y границы перем. мышки + jp z,set_y_limit + dec c ; c=8 уст. X границы перем. мышки + jp z,set_x_limit + dec c ; c=9 загрузить курсор мышки + jp z,A3385 + dec c ; c=0Ah уст. символ/атрибут мышки для текст. режима + jp z,A341F + dec c ; c=0Bh получить курсор мышки + jp z,A33CC + dec c ; c=0Ch заглушка + jr z,A32DF + dec c ; c=0Dh заглушка + jr z,A32DF + dec c ; c=0Eh получить чувствит. мышки + jp z,A342D + dec c ; c=0Fh уст. чувств. мышки + jp z,A3428 +A32DF: ld a,EINVFNC ; код "неверный номер функции" + scf + ret + +; c >= 80h +A32E3: res 7,c + inc c + dec c ; c=80h Обработчик аппаратн. прерывания от мыши + jp z,A374B + dec c ; c=81h инфа для мышки о смене режима экрана + jp z,A3700 + dec c ; c=82h заглушка + jr z,A32F5 + dec c ; c=83h принуд. перерисовка мышки + jp z,A3760 +A32F5: ld a,EINVFNC ; код "неверный номер функции" + scf + ret + + +;----------------------------------------------------------- +; Функция #00. Инициализация драйвера мышки +;----------------------------------------------------------- +init_mouse: + di + ld a,55h + out (10h),a + ld a,2Dh + out (10h),a + ld a,0 + out (1Bh),a + ld a,1 + out (1Bh),a + ld a,0 + out (1Bh),a + ld a,3 + out (1Bh),a + ld a,41h + out (1Bh),a + ld a,4 + out (1Bh),a + ld a,47h + out (1Bh),a + ld a,5 + out (1Bh),a + ld a,0E0h + out (1Bh),a + ei + xor a + ret + + +;----------------------------------------------------------- +; Функция #01. Показать указатель мышки +;----------------------------------------------------------- +show_mouse: + push ix + push hl + push de + ex af,af' + push af + ld hl,(D378C) ; X координата мышки + ld de,(D378E) ; Y координата мышки + di + call A3524 + ld a,true + ld (enable_mouse_cursor),a ; флаг вывода указателя мышки + ei + pop af + ex af,af' + pop de + pop hl + pop ix + xor a + ret + + + +;----------------------------------------------------------- +; Функция #02. Скрыть указатель мышки +;----------------------------------------------------------- +hide_mouse: + push ix + push hl + push de + ex af,af' + push af + di + xor a ; false + ld (enable_mouse_cursor),a ; флаг вывода указателя мышки + call A34D7 + ei + pop af + ex af,af' + pop de + pop hl + pop ix + xor a + ret + + +;----------------------------------------------------------- +; Функция #03. Узнать сотояние мышки +; Возвращает координаты мышки и состояние кнопок +;----------------------------------------------------------- +get_mouse_status: + ld hl,(D378C) ; X координата + ld de,(D378E) ; Y координата + ld a,(D3792) ; 0 bit - левая, 1 bit - правая + and a + ret + + +;----------------------------------------------------------- +; Функция #04. Установить координаты указателя мышки +; Функция перемещает курсор в заданные координаты +; +; вход: hl/de = X/Y координаты +; выход: a = код ошибки, если CF=1 +;----------------------------------------------------------- +set_mouse_coords: + push ix + push hl + push de + ld (D378C),hl ; X координата мышки + ld (D378E),de ; Y координата мышки + ex af,af' + push af + di + call A3772 + ei + pop af + ex af,af' + pop de + pop hl + pop ix + xor a ;? + ret + + + +A3385: push bc + push de + push hl + push ix + ;ld a,l + ;ld (D37A6),a + ;ld a,h + ;ld (D37A7),a + ld (D37A6),hl; ; ширина/высота стрелки мышки + ld c,e + ld b,0 + ld (D379E),bc + ld c,d + ld (D37A0),bc + exx + ld a,(D37A6) ; 10 ширина стрелки мышки + ld c,a + ld b,0 + ld a,(D37A7) ; 14 высота стрелки мышки + ld l,b + ld h,b + add hl,bc + dec a + jr nz,$-2 + push hl + ld bc,257 ;A0101 ; 257 ? + and a + sbc hl,bc + ccf + exx + pop bc + pop hl + ld a,EINVHND ; код "несуществ. дескр. файла" + jr c,A33C7 + ld de,mouse_pointer ; 10x14 массив стрелки мышки + di + ldir + xor a ; код "Ok" +A33C7: pop hl + pop de + pop bc + ei + ret + + +A33CC: push ix + exx + ld a,(D37A6) ; 10 ширина стрелки мышки + ld c,a + ld b,0 + ld a,(D37A7) ; 14 высота стрелки мышки + ld l,b + ld h,b + add hl,bc + dec a + jr nz,$-2 + push hl + ld bc,257 ;A0101 ; 257 ? + and a + sbc hl,bc + ccf + exx + pop bc + pop hl + ld a,EINVHND ; код "несуществ. дескр. файла" + jr c,A340B + ld de,mouse_pointer ; 10x14 массив стрелки мышки + ex de,hl + di + ldir + ;ld a,(D37A6) ;@@ + ;ld l,a + ;ld a,(D37A7) + ;ld h,a + ld hl,(D37A6); ; ширина/высота стрелки мышки + ;ld bc,(D379E) + ;ld e,c + ;ld bc,(D37A0) + ;ld d,c + ld a,(D379E); + ld e,a; + ld a,(D37A0); + ld d,a; + xor a + ;ld c,a + ;ld b,a +A340B: ei + ret + + + +;----------------------------------------------------------- +; Функция #08. Установка гориз. границ перемещения мышки +; +; вход: hl = минимальная +; de = максимальная +;----------------------------------------------------------- +set_x_limit: + ld (D3794),hl + ld (D3796),de + xor a + ret + + + +;----------------------------------------------------------- +; Функция #07. Установка верт. границ перемещения мышки +; +; вход: hl = минимальная +; de = максимальная +;----------------------------------------------------------- +set_y_limit: + ld (D3798),hl + ld (D379A),de + xor a + ret + + + +A341F: ld (D37A2),hl + ld (D37A4),de + xor a + ret + + +A3428: ld (D379C),hl + xor a + ret + + +A342D: ld hl,(D379C) + xor a + ret + + +A3432: ld (A348B+1),hl + ld (A348E+1),de + srl d + rr e + srl d + rr e + srl d + rr e + ld d,e + srl h + rr l + srl h + rr l + srl h + rr l + ld e,l + in a,(89h) + db 0DDh + ld h,a + in a,(0A2h) + db 0DDh + ld l,a + di + ld a,54h ; номер стр. + out (0A2h),a + ld a,d + add a,a + add a,a + ld l,a + ld h,43h ; ст. разряд ? + in a,(0C9h) + rrca + and 80h + or 1 + add a,e + out (89h),a + inc l + ld a,(hl) + ld bc,(D37A2) + and b + xor c + ld (hl),a + inc l + ld a,(hl) + ld bc,(D37A4) + and b + xor c + ld (hl),a + db 0DDh + ld a,l + out (0A2h),a + db 0DDh + ld a,h + out (89h),a + ret + + +A348B: ld hl,0 +A348E: ld de,0 + srl d + rr e + srl d + rr e + srl d + rr e + ld d,e + srl h + rr l + srl h + rr l + srl h + rr l + ld e,l + in a,(89h) + db 0DDh + ld h,a + in a,(0A2h) + db 0DDh + ld l,a + di + ld a,50h + out (0A2h),a + ld a,d + add a,a + add a,a + ld l,a + ld h,43h ; ст. разряд ? + in a,(0C9h) + rrca + and 80h + or 1 + add a,e + out (89h),a + inc l + ld a,(hl) + ld (hl),a + inc l + ld a,(hl) + ld (hl),a + db 0DDh + ld a,l + out (0A2h),a + db 0DDh + ld a,h + out (89h),a + ret + +A34D7: ld a,0 + bit 7,a + jr z,A348B + in a,(0E2h) + ld b,a + in a,(89h) + ld c,a + push bc + ld a,50h + out (0E2h),a +A34E9: ld hl,0 +A34EC: ld de,0 + ld a,e + ex af,af' +A34F1: ld a,0 + and 1 + ld de,LC000 + jr z,A34FD + ld de,LC000+320 +A34FD: add hl,de +A34FE: ld a,0 ; 14 сохр. высота стрелки мышки + db 0DDh + ld h,a + ex af,af' +A3503: ld bc,10 + out (89h),a + ex af,af' + ld (A3510+1),hl + ld d,h + ld e,l + ldir +A3510: ld hl,0 + ex af,af' + inc a + jr z,A351B + db 0DDh + dec h + jr nz,A3503 +A351B: pop bc + ld a,b + out (0E2h),a + ld a,c + out (89h),a + xor a + ret + + +A3524: ld a,(D378B) + ld (A34D7+1),a + bit 7,a + jp z,A3432 + cp 82h ; 130 + jr nz,A3537 + srl h + rr l +A3537: ld ix,mouse_pointer ; 10x14 массив стрелки мышки + ld a,(D37A6) ; 10 ширина стрелки мышки + ld c,a + ld b,0 + ld (D37AA),bc + ld (A3503+1),bc + ld c,b + ld (D37A8),bc + ld a,(D37A7) ; 14 высота стрелки мышки + ld (A34FE+1),a + ld c,a + ld b,0 + ld (D37AC),bc + ld bc,(D37A0) + ld a,e + sub c + ld e,a + jr nc,A357B + neg + ld e,a + ld a,(D37A6) ; 10 ширина стрелки мышки + ld c,a + ld b,0 + ld a,(D37A7) ; 14 высота стрелки мышки + sub e +A3571: add ix,bc + dec e + jr nz,A3571 + ld c,a + ld (D37AC),bc +A357B: ld bc,(D379E) + and a + sbc hl,bc + jr nc,A359A + ld b,h + ld c,l + ld hl,0 + and a + sbc hl,bc + ld (D37A8),hl + ld a,(D37A6) ; 10 ширина стрелки мышки + sub l + ld l,a + ld (D37AA),hl + ld hl,0 +A359A: ld (A34E9+1),hl + ld (A34EC+1),de + push hl + in a,(0E2h) + ld h,a + in a,(89h) + ld l,a + ex (sp),hl + ld a,5Ch ; видео-страница + out (0E2h),a + ld a,e + ex af,af' + in a,(0C9h) + ld (A34F1+1),a + and 1 + ld de,LC000 + jr z,A35BE + ld de,LC000+320 ; начало 2-го экрана ? +A35BE: add hl,de + db 0DDh + ld d,h + db 0DDh + ld e,l + ex de,hl + ld bc,(D37AC) + db 0DDh + ld h,c + ex af,af' +A35CB: ld bc,(D37A8) + add hl,bc + ld bc,(D37AA) + out (89h),a + ex af,af' + ld (A35DD+1),de + ldir +A35DD: ld de,0 + ex af,af' + inc a + jr z,A35E8 + db 0DDh + dec h + jr nz,A35CB +A35E8: pop bc + ld a,b + out (0E2h),a + ld a,c + out (89h),a + xor a + ret + + +A35F1: in a,(1Bh) + rrca + ret nc + in a,(1Ah) + ld l,a + bit 6,a + ccf + ret z + in a,(1Bh) + rrca + jr nc,$-3 + in a,(1Ah) + ld e,a + bit 6,a + ccf + ret nz + in a,(1Bh) + rrca + jr nc,$-3 + in a,(1Ah) + ld d,a + bit 6,a + ccf + ret nz + ld a,e + and 3Fh + ld e,a + ld a,l + and 3 + rrca + rrca + or e + ld e,a + ld a,d + and 3Fh + ld d,a + ld a,l + and 0Ch + rrca + rrca + rrca + rrca + or d + ld d,a + ld a,l + rlca + rlca + rlca + res 6,a + jr nc,$+4 + set 6,a + rlca + rlca + and 3 + ld (D3792),a ; сост. кнопок: 0/1 bits - левая/правая + call A36C3 + ;ld a,e ;@@ + ;ld (D3790),a + ;ld a,d + ;ld (D3791),a + ld (D3790),de + scf + ret + + +A364B: ld hl,(D378C) ; X координата мышки + ld de,(D3790) + ld d,0 + bit 7,e + jr nz,A366F + add hl,de + ld (D378C),hl ; X координата мышки + ex de,hl + ld hl,(D3796) + and a + sbc hl,de + jr nc,A3689 + ld hl,(D3796) + ld (D378C),hl ; X координата мышки + jr A3689 + ; +A366F: ld a,e + neg + ld e,a + and a + sbc hl,de + ld (D378C),hl ; X координата мышки + jr c,A3683 + ld de,(D3794) + sbc hl,de + jr nc,A3689 +A3683: ld hl,(D3794) + ld (D378C),hl ; X координата мышки +A3689: ld hl,(D378E) ; Y координата мышки + ld de,(D3791) + ld d,0 + bit 7,e + jr nz,A36A9 + add hl,de + ld (D378E),hl ; Y координата мышки + ex de,hl + ld hl,(D379A) ; макс. Y граница для указателя + and a + sbc hl,de + ret nc + ld hl,(D379A) ; макс. Y граница для указателя + ld (D378E),hl ; Y координата мышки + ret + ; +A36A9: ld a,e + neg + ld e,a + and a + sbc hl,de + ld (D378E),hl ; Y координата мышки + jr c,A36BC + ld de,(D3798) ; мин. Y граница для указателя + sbc hl,de + ret nc +A36BC: ld hl,(D3798) ; мин. Y граница для указателя + ld (D378E),hl ; Y координата мышки + ret + + +A36C3: ld hl,(D379C) + ld a,l + or l + ret z + dec a + ret z + ld a,e + bit 7,a + ld b,0FFh + jr z,A36D6 + ld b,7Fh + neg +A36D6: inc b + sub l + jr nc,A36D6 + bit 7,b + jr z,A36E4 + ld a,b + res 7,a + neg + ld b,a +A36E4: ld e,b + ld a,d + bit 7,a + ld b,0FFh + jr z,A36F0 + ld b,7Fh + neg +A36F0: inc b + sub h + jr nc,A36F0 + bit 7,b + jr z,A36FE + ld a,b + res 7,a + neg + ld b,a +A36FE: ld d,b + ret + + +A3700: ld (D378B),a + or a + jr z,A3720 + cp 1 + jr z,A3720 + cp 2 ; 40x32x16 текстовый + jr z,A3723 + cp 3 ; 80x32x16 текстовый + jr z,A3737 + bit 7,a + jr z,A3720 + ; граф. режимы экрана + ;res 7,a ;@@ + cp 81h ; 320x256x256 + jr z,A3723 + cp 82h ; 640x256x16 + jr z,A3737 +A3720: xor a + scf + ret + +; 320x256x256 режим +A3723: ld de,319 ; макс. X граница +A3726: ld hl,0 ; мин. X/Y границы + call set_x_limit ; уст. X границу перем. указателя + ld de,255 ; макс. Y граница + jp set_y_limit ; уст. Y границу перем. указателя + +; 640x256x16 режим +A3737: ld de,639 ; макс. X граница + jr A3726 + + + + +;----------------------------------------------------------- +; Функция #80. Обработчик аппаратн. прерывания от мыши +; +; По приходу прерывания от мыши вызывается данная функция +; драйвера. В случае, когда требуется работа подпрограммы +; при запрещенных прерываниях, используйте данную функцию, +; чтобы избежать потери пакетов данных от мыши. +;----------------------------------------------------------- +A374B: in a,(0E2h) + ld b,a + in a,(89h) + ld c,a + push bc + call A3772 + call A3765 + pop bc + ld a,b + out (0E2h),a + ld a,c + out (89h),a + ret + + +A3760: call A3765 + and a + ret + + +A3765: call A35F1 + ret nc + call A364B + ld a,0 + ld (A3776+1),a + ret + + +A3772: db 3Eh ; ld a,.. +enable_mouse_cursor: + db false ; флаг вывода указателя мышки + or a + ret z ; не выводить указатель +A3776: ld a,0 + call A34D7 + ld hl,(D378C) ; X координата мышки + ld de,(D378E) ; Y координата мышки + call A3524 + ld a,-1 + ld (A3776+1),a + ret + + + + + +D378B: db 3 +D378C: dw 160 ; X координата мышки +D378E: dw 128 ; Y координата мышки +D3790: db 0 +D3791: db 0 +D3792: db 0 ; сост. кнопок: 0/1 bits - левая/правая + db 0; ; нужен ? + ; +D3794: dw 0 +D3796: dw 319 +D3798: dw 0 ; мин. Y граница для указателя +D379A: dw 255 ; макс. Y граница для указателя + +D379C: dw 0 +D379E: dw 0 +D37A0: dw 0 + ; +D37A2: dw 0FF00h +D37A4: dw 0FF77h + ; +D37A6: db 10 ; ширина стрелки мышки +D37A7: db 14 ; высота стрелки мышки + ; +D37A8: dw 0 +D37AA: dw 0 +D37AC: dw 0 + + + +; Стрелка мышки. Массив 10x14 байтов + 116 = 256 +mouse_pointer: + db 0,0,-1,-1,-1,-1,-1,-1,-1,-1 ; 1 + db 0,-2,0,-1,-1,-1,-1,-1,-1,-1 ; 2 + db 0,-2,-2,0,-1,-1,-1,-1,-1,-1 ; 3 + db 0,-2,-2,-2,0,-1,-1,-1,-1,-1 ; 4 + db 0,-2,-2,-2,-2,0,-1,-1,-1,-1 ; 5 + db 0,-2,-2,-2,-2,-2,0,-1,-1,-1 ; 6 + db 0,-2,-2,-2,-2,-2,-2,0,-1,-1 ; 7 + db 0,-2,-2,-2,-2,0,0,0,0,-1 ; 8 + db 0,-2,-2,0,-2,0,-1,-1,-1,-1 ; 9 + db 0,-2,0,0,-2,-2,0,-1,-1,-1 ; 10 + db 0,0,-1,-1,0,-2,0,-1,-1,-1 ; 11 + db 0,-1,-1,-1,0,-2,-2,0,-1,-1 ; 12 + db -1,-1,-1,-1,-1,0,0,-1,-1,-1 ; 13 + db -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ; 14 + ; + ds 256-140 ; 116 diff --git a/DOS/README.RUS b/DOS/README.RUS new file mode 100755 index 0000000..b873111 --- /dev/null +++ b/DOS/README.RUS @@ -0,0 +1,22 @@ +Версию ДОС обозвал как 1.61. +Установка: заменить оригинальный файл "system.dos". + + +1. Исправлена фирменная ошибка, при которой происходило зависание +системы (непредсказуемое поведение) при превышении макс. числа +открытых дескрипторов. Однажды, во времена портирования M80.EXE, +из-за данного бага и конечно неудачного расположения звезд на небе, +был снесен весь логический диск "C". + +2. Появилась новая функция: + + Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. + вход: нет + выход: A - номер последнего лог. диска в системе + +Предназначена для создателей RAM-дисков. Для доступа к созданному +RAM-диску не нужно перезагружать компьютер. + +3. В отличии от оригинала, функции 0Ah/0Bh (Create file/New create file) +перед созданием файла проверяют на переполнение таблицу свободных +дескрипторов. diff --git a/DOS/SYSTEM.DOS b/DOS/SYSTEM.DOS new file mode 100755 index 0000000000000000000000000000000000000000..dd27b477446dedee894b42e74b2d9d84da00204c GIT binary patch literal 16265 zcmeHu3wRUPweE~9$&!s^Nj6yWb0lFH3lK&SOBj31!`LJQn_?bG2slYwIOzidB(aT+ zAvA4H+S4|D<@9k*OK5N1^!7wR+8COYS~hMqR;P~Z-pNT_w2RzUTf{O*M6vuS4ULODWs9hk6q-tTfI6bRm_iw-6ci<%LsSU? z>gt)g73)?rcxqN`TvUd5q0r3-lz-1WNBPqbYJo86maNrt}w05PAqe7L_ zM7!qbw$I-@zh-`2D__1s=UuMj7M}ELINHZ^x120hfi*Alj^#R(zN8tgI?c{+UxFw6 z-0nHLee?Iue_;NeX>Qj_l1zEM7*4HWGa{Bz%HgGiFB>CzUJR!wHZ$ID+tTsAVAF_> zmAVmo(TgKCrpkK`<*d>1Vmoz#7Mm!@ zNbd@f)FGtMhPqJ1a+-2vt4&bRQdBfx=--3CT*apz4oy5PhN*{{E0UEQv-dKz2On)@k^%Gmt-*$~96{{t`Bix&=w~F;UdVsEu0yudm;* zY4aWQt*h5H+`jhCHKcTfijsV(t+gu_&(e^R?I{l_cX{eU%5A$tN}H!Pw0n+W7r&{H zLNB&=j~mc)qg_m4_+98`2T}8`u1)lw43yR|sr0YX=TL_2Je{Lvu&H!7gJgu?Md$xD z9U-D4GeB27BSCj?2FU~6Vq=m{qh+(TY?_uea3&vLo=SD_Uh<;vqQVCmpXFESo$LZj zPDUj=*Rlt1hb4@6o~3w3B|Fn{5bsP&1aE_7v9Xd(4fuHJSbz`z`oBRKCzSW(E%Gj2 za!Z-dzqE8grQWco>63dOY3dFZw2r#;WH+%>y+`y4l0(l}3V_}G@!8#dm#>DK!7tp}(T4b?TZ zYi?V6d%4p{-F3&R%`5BHRd7{Q+ehJiqs-ShL*{ADMCK&t|F+E6v;mo?wLxS~YU3lz zJa&VgpB{bnr~m6ee)#$u9kD-Cuf>lZ37mW8fB)#ml977zPtl+K8@$+B)+_%5;*tfn*ee-*V4}JBCuYBpzFZ{ca`oX_`?O*=+ z>;Lx1_ve2!Jzu;*=8wSnBg#B>gUla68y`_-&OE5BT$|B+oSDFJYzmy$_6sJ)Bg4+o z2qaEL2qI_@(h#%=_YK;4)0g`@_;y!kNcf}Cc3ELc&5Dtor=+tB6$6{2=-IRweVFc# z@}{r!2cGX+X)5ShX#(6j`p$3kjS0ArO2qq>qEbyZ;MfrTMcTqp6AxeNw@^jGN)yM> zhu8N{3;+bHNBapoK4AKJ|AFcbzP@+J^z%UfK-Bb$0Hl!`#{-v4C;G>HRp%y>sb`ZZ z^Ss*I$?@?%@zdGG0aNFt{t28K11G!oKU%qENUdnK>2N=(r-L`!YS#_*5?pciG;-i1 z`!Y`qgI??dSc5e6!t17B^C&&Y^CNsMGCTP2!Ft9aI<}j|m>wD4d(8R@tU;Bm4l7h8 zTO&rfQXelk%%cbU_GDJ}J%sRY2tAo3zt?dkvpEgVu~EwfbE6Q-47PZGo2gcj*n7CH z!N&u@8~aFj37!UXp#`iQc5@;10W9exn&pGg2*=bR%Q=N+DB)b@fao}zPg_#lt%Hm~jlR4VX@#8&wy;7!R*PTIp<+>>73g>serd8lxwPTPrm- zUm6b#=3y4(AsWf65ASA-qr6~pDv=L7VhH+U4w;O=3s$3Ey&cE znhFk@az@QOB9}1JqNMvm`=4drLRNr}3FpiM!?9Q#1@Y2%;{(D`OH|rAl8so{Y3<IJDRz(ITO!lW{I@+W$URkKC6Z5vTt{79veLG zcylr!ZHV$4x0Tq#`Qd_b;1}&A<7YJOdh9Wv`*r(AGq>2XTSqT8hI7Mt*9VnVrpjt) zN}7S|#o=i0ur(pm?4kD+YG9vh?^ty3e1ISNP>BZo#(l2#(TgXV2nD8%D{KvCT?_4_ zna?&Q*mdwkAJ)z@4_n7}!$^JEN>0PlRzBMvM?X`d9WN-QJd~|7o3yV)`J@`h1yBs0 z=iM(`r^#Z~>nvuf#(^`FBv-3W&6weJ252YNo${=%D)bSC*hVN)uq1D88V%hmiLYv z9z1WM&X7FKD?w?+*7a`7z5rsVA= zd2^=S$!C-QaJIaCmb^Kq{9BYlLohpX?3K(_XMeU_mm$~82wTGDsjx;zwRi_WVUagm zivB`*PJ)Z zKfE{pgN8zdl3qG5(7r`I%ptv1#>BsAv_ zi1t$2C2a+hQ1%LJB>ty^?qB9hTc4opMyzDN%pYj(3^~3|H9uKfSE|!dU#Ra4#S?7j z#ACf+aUJp5J8d^o+j=1Ahe_(`g}vY(mLJNMAIwXd2{G6S(V#7h)K!`u6W%gM{m+qo zLv73(AE7b2SI(x|ZRz?&AaAQ~8O7*dA%zBJXm_J6zIT zkwj;ANGkyq$~8p*hU3KCnFK!X?8}MA`U&xmlPUnm6u6$ve4Mft`u6*BVpd~a;%rd*H?f05fuMrr1CIb5R1;fxCj_4tQANIRx{RXffY zjxa`yK10yLi&Iag=b3SQ3{$g@1IG7WT_UUUXG5 ze};uO{a{6dPiiJv&H_Sl;jmnj(JOqfFgV=Y!NZy;21L3l{B8MxYXzf!@?I@;K3otJ zhH|3A!YO9h@h)TWxP&^_u+YH#=TikX*N5P6X;s4xkINz#(iyPo;^kKhn_M)NzQ<+0 z8WSd5LPK#B2DodF>j7lzNVZT=By>5^u0Ri0*mE@}TxFi>Of9be6>-7=fN17dar^wAJ~=7;{U3ENDPGzx9B7CzB%&V zxe_H-6;)-x+R{bPdw!lXJ%HX1AXMWRpIs5CIs(soCu>z=tO<-nL+P6^QaOWej@(gXS;YZinp?O{Y=KA{r#kBY=L@fYkTZ3UbeBD~0Hcy8`A(tCARt;G6{GGcqiQ{6|I zF7L~i_ZEO9-014CGLvDYA=M@apE~aT zjB)o0R5xm7NjDQU#dR4(b*ZPB-#~M30S&S&gl`{F0R-H*ji%^;bR2K)Zt0Y(gY5AP z4XG1riK<<3o466U^dtq$dGoltPrKL@tYVBlH|rFE%$EsZE%UgVTm;f1QVYr`TW1`k z?VZvQ=3PFpduL3H)(RJLRKcZvZB8f*cR3bO)X)u2M$578PdZVMnD_GLTzPxm{%6@N z)uXgLAXsyy29rw_&@E((?*8oZKV<8eCrVQe)shpo7U%s})Z!bey@8>bOvbGyS3oGq zdw*`aX>JrTRq^S_FmfK7=nr}Is>^jR>O-E`(0!lIDr3;~(y@VPyW;V&DT;$L57Q}z zb}~K{C%as6Bg|v{%6xW-;$c@Q3)%S?!K|{3ovl=`j8e(wD;#T6wzApk=-$T8P}*3% zFzm9TqdV0RUga{U*v73{=Bql|_9KpQnbUL{BlBHbl;qhiDfbRzz^A^%@XC>4_L)w4PVSx+;0oc>mci&7PGeJUn}RmLBhc#-UjnHI)DRJkR zvVPpJ=j`GOti`6oF8u;)7@y@eUG5)4p}1RY6Iy1&H?*!=yr-nZP*S~)yyK!h7{%cL zEE*F&v@MT4cKER^t)rQTd1-4-vD;oOt<5VI-37(KqNIkLVkfdzAq^Lwn2Z5pi%O|J`I3XtNm9bggM1cWO2QO%gfxy#~=`)@v zy?Us&g*bXgFCODzs$lF6rI8IN;f|42cZYBQLX2Z$9~Dr$S}867nX@l=jXuF2_`2YEgl?a2vyARt@8{G90_+&LpeRl!d~X-`7AH z7$T+$O=+$-Q#55Bnn`!U7ICwNy?`&DO8y_*PyxBaB)-D~vMxlPth(J8&1nbb1I4`q~ ztP7HW^MDNhAXVC*yf7Yx!|o^HO?mDiDZ14#L}uO zY}`iaBLVjW+vL8Ca0OwUZHnkEud_65Y)>puGq7gu!+Lh7;_zoqYjxrisq+|6^++~*YNXHqwDOK8fg~g7U$}#h>;u)Ds0joaT zuh)lvtB=Ak3}AOB)Z?JWaMFig(f6!ok=qN=u#;gUivuB;EPa`jUbor9LS%I%StS&{ z>L;J~lp;X|ti%O6%w9nZ!=m&ZSZ9=#H+A7#S9gCSS2#S2a!|A##%U97vNTSoPIE=R zuAx>_PyYZ{G)zzeO*a;=A8HkzDk0^~zYO^^R<@e{y}ub00e=4zwQGA(L9iAzw3xn+ zEZtZ#on2 zj}M!UO3S5|WmgxDYgmGzqy4hm*E zSKj0jIH&NS+i~bBOm$bd&K2v8|L)Un;hAE8mSe6bF)RIg;lBC)R2&9^(b81&kT2K_ zr$5fvGVr3jgwor;J4BT`Jg`m9er~>qv>REg?~pcd7GF1V+EY6@D}kh~ z3q7qTx}TV@T12`OLUbWV+UoP{AFbLV+F=&KrPhXBV5YiD;0+6!cC~eOKQe!{;4L}( z$b7HULmU;b0uQQ_t0mka;K*sHvSoU3P_m(QdNL7 zh1Ll20`AZgUP`m5xRje5JUZAtc;4;vfJNJAm$Dq5{X+;{tUh<}XjblEH^O=0n+x0v zJfeG^N2j*=Le8S9<)j5Lw_rqqJfR8l{$8Qfy39j39-?sMQJpgGr5;P;{Gk}%bN>Q| z&0{HZ;o}01J9_B|`3vy5r+r8?O{b`Jh)+n^i`)Z+io zzeTN};iSV8`uG4%G?0Pd7(;$4=GS>s4!1$3_Ts%OoZinJ34$$x?|_nK<} zcRalj>HbK2M7lSEi3a~vgn1L+<^{c1#nlU=iw0n4lo}HIPaZdkOB=9wrVz$~P-?(Q zz4BON~-L8~M<_fWBRSPnJn~<;JxIZNdQl#?O0Jb(z$6)u)$UO}S7zuP^ zz5$pSq{xbG0v13eo88G8h&h*KzG$;^mDVh@lP7O@pRJ}zQcK8urP-RLenASiFw18c z*$qbapt0|Q*Vw0BZ0y4wzrN3VjjYqy_cXvG2=fq5Abe`EkidYk^-;N$b#rL{S}BTqLG zz)k@1z~E7_ZSZl}nz+V6P4Oi0`|(|WGrr(>jTeVIqUeuX1<85vd>Hy^k)r zt^ulNPFm~miTC1CcY)6!tu6AQHB!R^w~${SO*Q7#>BfxYWxhC)yF1)e6#`f~F_PN| zxGM>7A#m$xRpWut)XdCh8;K2hU~~p?7@XJwS3_F3vos}q8E%VIZ<eo_+A*Nx?hLeTL#Y!nlD6DdD1oe2w9l`XwqlrVDAl7z@~X4##o zpv@$-FCs#UpQ23l`O~DW7?&t9swEhW2YwN%47G+2>Lyu@?x0ky`Bv%Ga5JlG4*y!J zuDxUbbtT`tzGOY`rF@<6deQKDrLb8_DqDyFqgNhb)0D%k6_N%cIv z*m5w%_GWTCVV(+S%aSVP0b1qT z*~nKRlA2v`t{bP?1C+Z%*p}hjP zEM0Z39rp)c<*^{b>#!&BtHSGA^#2G3yk%La%emW+o1Yby*DHj-_yhGq^-@dq(ggT? zrRDib0`m2avaByOwU{s#+`IjIT;$|Aqmp?W#Fb6>NkNw%H^U~#XBvD?)T`V4WCves zqIz3sJ!SdnCR`#**Pmo`E#9J~9sCSnpJHD1@!0wn8v8uUjD4jDUW77)M-f^O+z8(( zS9iOQ1KhQYFqUJE<4c{R75G51+|<|~5NlFSvL@4^-WIP|AzWS-oMC=Tj=D!HEXSAP z7GMZBdavd$#q{!P-<;|KXxov{`D!~Ch z+{~EJ6Z5rfj+V8l7Q#uStyaq@=_}@r~(?8vWReLw!E;*K{rFxxO zjX~b7l{f3;U1{J!KZP5|TyqFy&hG zauk)&@I2vJ-^T7KH*M&bqe-yg8o2oy zxak_WQ3bc_<;@0pSGv3-Lv;UFg^2qJ=PDAHaYT#^aUU)2O%WeT6(5AWGvv)id6!Av zkty!eihFh9LuulJ`f{-XzwyD~5$z&I8vxlJG(%&g#gjPaYb($`o_vBQUWtbD6{7RC z3aJ6LInPxHzpZd9LEK@)+Rv<)9jAjjO|RUpQM8OxhKCtg?sFAGVoYeO5TgUvk;zfp zH?lMJ3UK;YE@e)o}u)$zw2z%7|3Tf+W6$gI)>mmuT}J9 zBZ63V5fwtTyYP`|0GUcgNJ$GRheOKeLP{KpB`Sh6FeIRKw411KdPW>yiaA#Q`goI09P@WJ6@xW=w_FwqG9hsH?{4n&7(8-6)6wBK|`e_J%RbIf!n zJaeW^a0YJfCnHslk!hM9qqh?1`muOmG;q!-*XgLw+!K#<@MC1T9FN35dH)!w@zLWB$l-s3R6U#+jIft)<&12Wk+m9G zi~6=1*&0&$)HqExLr3?*tnC#Ja6#mxAR(OM#Awhw4yzdV?bp<@_~wAiF#%p98di|_ zuL#CJgn(nbCppV!Ir{fhZ*zYqn_|rhYB=*rX3X(fj$GF{(D7HF)9BA~kJNM2Ki8(~ z$>p%}lUydQhUVj|2d;SQx?x#cT$;d&-TXAkt_0O V#H4QRB0rJ{fV7_%mR3#h{})N31T_Ev literal 0 HcmV?d00001 diff --git a/DOS/pr.bat b/DOS/pr.bat new file mode 100755 index 0000000..ab47e4d --- /dev/null +++ b/DOS/pr.bat @@ -0,0 +1,12 @@ +@echo off +..\asmplus.exe dos.asm SYSTEM.DOS +if errorlevel 1 goto ERR +echo Ok! +goto END + +:ERR +del system.dos +echo ошибки компиляции... + +:END +del dos.lst diff --git a/DOS/readme.! b/DOS/readme.! new file mode 100755 index 0000000..15647ee --- /dev/null +++ b/DOS/readme.! @@ -0,0 +1 @@ +При создании файла, папки и др. операций с путем (диском) - ДОС меняет текущий путь !!!. diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index c5d0136..b228405 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -25,6 +25,24 @@ PCHARS: INC HL OR A RET Z + + ;!TEST FOR LP_PR_LINE_DIR + ;PUSH HL + ;CALL CURSOR + ;LD (.CHAR),A + ;LD A,(SLOT1) + ;PUSH AF + ;LD A,(SLOT0) + ;LD (SLOT1),A + ;LD HL,.CHAR + #4000 + ;LD BC,0*256 + BIOS.LP_PR_LINE_DIR + ;RST ToBIOS + ;POP AF + ;LD (SLOT1),A + ;POP HL + ;JP .loop + ; + CALL PUTCHAR ;!TEST CR+LF+SCROLL ;CALL CURSOR @@ -33,12 +51,18 @@ PCHARS: ;CALL Z,PUTCHAR.LFF ; JP .loop +;.CHAR: DZ " ",0 + ; PRINT CHAR ; A - CHAR PUTCHAR: - ;CP ' ' - ;JR NC,.CHAR + ;LD B,A + ;CALL CURSOR + ;LD A,B + + ;CP ' ' + ;JR NC,.CHAR CP #0D JR Z,.CR_ CP #0A @@ -49,8 +73,8 @@ PUTCHAR: JR Z,.BK_ CP #07 JR Z,.BELL - ;SCF - ;RET + ;SCF + ;RET .CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM ;!TEST CR+LF+SCROLL ;JP ToBIOS @@ -60,6 +84,12 @@ PUTCHAR: LD A,D OR E RET NZ + ;LD A,D ; в DE координаты текущего знакоместа + ;XOR E ; Проверяем на координаты #1F:#4F + ;XOR #50 + ;RET NZ ; если другие - то выход + ;LD E,A + ;CALL LOCATE ; .LFF: PUSH HL ;!FIXIT сохранять текущие прерывания ;PUSH DE diff --git a/DSS/build.txt b/DSS/build.txt index 7b27b25..e3e1916 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -173 \ No newline at end of file +187 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index ad9ea69..045fb07 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -11,7 +11,7 @@ DEFINE NeedSafePort_Y 1 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 - DEFINE CLASSIC_CURSOR 1 + DEFINE CLASSIC_CURSOR 0 DEFINE SAVE_PATH_MACRO 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM new file mode 100644 index 0000000..2781906 --- /dev/null +++ b/SHELL/BATCH.ASM @@ -0,0 +1,463 @@ +; Обработка BAT-файлов +; + +;fhandle +BAT_FM: db 0 ; дескр. bat-файла +;count: db 0 ; число прочит. байт из файла + +; флаг echo-режима +echo_mode: + db true ; 1/0 on/off + +; буфер bat-файла +;T98B9: ds 256 + + + + +;------------------------------------------------- +; Запуск bat-файла +; вход: hl=имя файла +;------------------------------------------------- +A83E8: call BATCH + jp c,A83DD ; ошибка откр. файла (cpp.asm) + ret + + + +; вход: b=число слов "ZERO".."NINE" +MAKE_BATCH_PRM_ARRAY: + dec hl +.loop: inc hl + ld a,(hl) + or a + ret z + cp " " + jr z,.loop + cp 9 ; Tab + jr z,.loop + ex de,hl + ld (hl),e + inc hl + ld (hl),d + inc hl + ex de,hl +.B_FIND_SPACE: + inc hl + ld a,(hl) + cp " "+1 + jr nc,.B_FIND_SPACE + ld (hl),0 + or a + ret z + djnz .loop + ret + + +;------------------------------------------------- +; Загрузка и выполнение BAT-файла +; вход: hl=имя файла +; выход: "CF" - ошибка откр. файла +;------------------------------------------------- +BATCH: push hl ; сохр. имя bat-файла + ld de,work_buffer ; 512 местный буфер + call copy_string ; скопир. строку (с нулем) + ld hl,work_buffer ; 512 местный буфер + ld de,BAT_PRM_ARRAY ; таблица указат. на "ZERO".."NINE" + ld b,BAT_PRM_ARRAY.TOTAL ; число слов "ZERO".."NINE" + call MAKE_BATCH_PRM_ARRAY + jr nz,.B_ALL_P + ld hl,NULL ; ds 2*10 + ex de,hl +.B_CLR_P: + ld (hl),e + inc hl + ld (hl),d + inc hl + djnz .B_CLR_P + ex de,hl +.B_ALL_P: + pop hl ; восст. имя bat-файла + ld a,Dss.Open.R ; на чтение + ld c,Dss.Open ; открыть файл + RST ToDSS + push af ; сохр. код ошибки + call c,restore_disk_path ; восст. тек. диск и путь + ;R10 + CALL Restore_Screen + ;R10 + pop af + ret c + ld (BAT_FM),a ; дескр. bat-файла + ; выполн. команд bat-файла + call NEWLINE + xor a + ret + + +;--------------------------------------------------- +; Выполнение команд BAT-файла +;--------------------------------------------------- +NEWLINE: + ld de,struct_input_line+5 ;!HARDCODE +.ADDBAT: push de + call READBAT ; прочитать 128 байт из файла в "work_buffer1" + pop de + or a ; a=число прочит. байт + jr nz,.BATLINE + ex de,hl + ;ld de,T96AE ;;256 буфер (inline.asm) + ld de,struct_input_line+5 + sbc hl,de + jr z,.exit; ;[x] Vasil, убран баг с незакрытым BAT-файлом + ld a,l + ld (struct_input_line+4),a ; длина строки + call CMDMODE ; тест на bat-команды "rem","pause" +.exit: ld a,(BAT_FM) ; дескр. bat-файла + ld c,Dss.Close ; закрыть файл + RST ToDSS + ret + ; +.BATLINE: + ;ld hl,T99B9 ; откуда, 128 буфер (ccp.asm) "work_buffer1" + ld hl,work_buffer1 +.loop: call MOVWORD ; скопир. work_buffer1 -> struct_input_line+5 + jr c,.ADDBAT + ld a,b + ld (MOVWORD.count),a ; осталось пропарсить прочитанных байтов + push hl + ex de,hl + ;ld de,T96AE ;;256 буфер (inline.asm) + ld de,struct_input_line+5 + ;ld de,work_buffer+256;; + sbc hl,de + ld a,l + ;ld (D96AD),a ;; длина строки (inline.asm) + ld (struct_input_line+4),a ; длина строки + call CMDMODE ; тест на bat-команды "rem","pause" + ;ld de,T96AE ;;256 буфер (inline.asm) + ld de,struct_input_line+5 + ;ld de,work_buffer+256;; + pop hl + jr .loop + + +;------------------------------------------------- +; Чтение данных (hl) -> (de), при необходимости +; подкачка из файла. +; +; вход: hl=откуда +; de=куда +;------------------------------------------------- +MOVWORD: +.count+1: ld a,0 ; (число прочит. байт из файла)/128 + ld b,a +.loop: ld a,(hl) + ld (de),a + cp " " + jr c,.loop2 + inc hl + inc de + djnz .loop + scf + ret + ; прочитать доп. блок из файла +.loop2: ld a,(hl) + cp " " + ret nc + inc hl + djnz .loop2 + push de + call READBAT ; прочитать 128 байт из файла + pop de + ;ld hl,BATBUFF ; 128 буфер (ccp.asm) "work_buffer1" + ld hl,work_buffer1 + ld b,a ; число прочит. байт + or a + jr nz,.loop2 + scf + ret + +; прочитать 128 байт из файла +READBAT: + ;ld hl,T99B9 ; 128 буфер под данные (ccp.asm) "work_buffer1" + ld hl,work_buffer1 + ld de,128 ; сколько + ld a,(BAT_FM) ; дескр. bat-файла + ld c,Dss.Read ; чтение файла + RST ToDSS + ld a,e + ld (MOVWORD.count),a ; (число прочит. байт из файла)/128 + ret + + +; Тест на bat-команды "rem","pause" +CMDMODE: + ;xor a + ;ld (D96A6),a ; (inline.asm) + call EVALCMD ; (batch.asm) + ;ld ix,T96AC ; нужно?? закоментарил (inline.asm) + ;ld hl,T96AE ;;256 буфер (inline.asm) + ld hl,struct_input_line+5 + ;ld hl,work_buffer+256;; + ld a,(hl) + cp "@" ; 40h + jr nz,A8240 + dec hl + ;ld hl,struct_input_line+4;; + dec (hl) + jr z,A825B + ld c,(hl) ; длина строки + inc hl + ld b,0 + ;ld hl,work_buffer+256;; + ld d,h + ld e,l + inc hl + ldir + jr A825B + ; +A8240: ld a,(echo_mode) ; флаг echo-режима + or a + jr z,A825B ; off + ; вывести сист. путь и строку содержимого bat-файла + ;ld de,T96AE ;;256 буфер (inline.asm) + ;ld de,struct_input_line+5 + ;call A95DE ; вывод экран. пути с ">" (inline.asm) + ; вывести экран. путь и введ. команду + ld c,BIOS.LP_GET_PLACE ; узнать полож. курсора + RST ToBIOS + ld (YXpos),de ; Y/X начало ком-строки + ld (cursor_position),de ; Y/X позиция курсора + call print_compath ; вывести путь + новая ширина поля ввода + ld de,(YXpos) ; Y/X начало ком-строки + ld c,Dss.Locate ; уст. полож. курсора + RST ToDSS + ;ld hl,work_buffer+256;; + ld hl,struct_input_line+4 ; длина строки + ld a,(hl) + ld b,a + inc hl ;+5 + push bc + ld c,BIOS.LP_PRINT_LINE2 ; вывод строки без атрибутов + RST ToBIOS + pop bc ; b=длина строки + ld a,(width_inpline) ; ширина поля ввода (76..48) + sub b + ei + ret z ; правый край экрана + jr c,A8250; ; строка больше ширины экрана + ; заполнить строку до конца экрана + dec a ; чтобы не сработал скроллинг экрана ;!FIXIT scroll + ld b,a ; число вывод. символов + ld a," " ; символ + ld c,BIOS.LP_PRINT_SYM ; вывод символа без атрибута + RST ToBIOS + ei + ;!TEST +A8250: call newline + ; + ; + ;ld a,(D96AD) ;; длина строки (inline.asm) + ;ld a,(struct_input_line+4);- + ;or a + ;ret z + ;call newline + ;jr A8264 + ; +A825B: ;ld a,(D96AD) ;; длина строки (inline.asm) + ld a,(struct_input_line+4) + or a + ret z +;A8264: ld hl,T96AE ;;256 буфер (inline.asm) + ;ld hl,struct_input_line+5 + ;dec hl + ; убрать концевые пробелы строки + ld hl,struct_input_line+4 + ld c,(hl) ; hl=длина строки (inline.asm) + ld b,0 + inc hl + ;ld hl,work_buffer+256;; +A826C: ld a,(hl) + cp " " + jr nz,A8276 + inc hl + dec c + jr nz,A826C + ret + ; +A8276: ld d,h + ld e,l + add hl,bc + ld (hl),b ; 0 в конец строки (первого конц. пробела) + sbc hl,bc + ld a,c + ex af,af' + ld a," " + cpir + jr nz,A8286 + inc c +A8286: ex af,af' + sub c + ld c,a ; длина слова или строки ? + ld hl,BATLIST ; команды "pause","rem" + dos-команды + ; de=struct_input_line+5, c=длина строки (без конц. пробелов) + ; выполн. команду или запустить файл + jp A8312 + + + + + + +; должна убрать конц. пробелы и уст. длину строки, если урезалась +EVALCMD: xor a + ld hl,struct_input_line+4 ;!HARDCODE + ld c,(hl) + ld b,a + inc hl + add hl,bc + ld (hl),a ; 0 в конец строки + sbc hl,bc + ld de,work_buffer2 ; 256 буфер + call EVALSTR + ld hl,work_buffer2 ;work_buffer+256 + ld de,struct_input_line+5 ; куда + ld bc,255 +.loop: ld a,(hl) + ldi + inc b + or a + jr nz,.loop + dec b + ld a,b + ld (struct_input_line+4),a ; длина строки (edline.asm) + and a + ret + +; HL - STRING WITH %VAR% +EVALSTR: ld a,(hl) + cp "%" + jr z,.TVARIABLE +.VARL1: ldi + or a + jr nz,EVALSTR + ld bc,0 + ld (.TVAR_PNT),bc + ret + ; +.TVARIABLE: +.TVAR_PNT+1: ld bc,0 + ld a,b + or c + ld a,"%" + ld (.TVAR_PNT),de + jr nz,.TVAR1 + inc hl + ld a,(hl) + cp "9"+1 + jr c,.TVAR0 +.TVAR2: ld a,"%" ; > "9" + dec hl + jp .VARL1 +.TVAR0: cp "0" + jr c,.TVAR2 ; < "0" + ; BATCH PARAM %0, %1, %2 ... + inc hl + push hl + ld (.TVAR_PNT),bc + sub "0" + add a,a + ld c,a + ld hl,BAT_PRM_ARRAY ; таблица указат. на "ZERO".."NINE" + add hl,bc + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + or h + jr z,.NOBTP ; NO BATCH PARM + call copy_string ; скопир. строку (с нулем) + dec de +.NOBTP: pop hl + jp EVALSTR + ; +.TVAR1: push hl + ld h,d + ld l,e + dec hl + and a + sbc hl,bc + jr z,.TNOVAR + ld a,"=" + ld (de),a + inc de + xor a + ld (de),a + ld d,b ; de=буфер значения перем. + ld e,c + ld h,b ; hl=имя перем. + ld l,c + inc hl + ld bc,Dss.Environ.Get*256 + Dss.Environ ; получить перем. окружения + RST ToDSS +.TNOVAR: pop hl + inc hl + ld bc,0 + ld (.TVAR_PNT),bc + jp EVALSTR + + + +; !! Не делать одну команду > 256 символов)) !! +; + ; BAT-команды (не отделять от дос-команд) +BATLIST: DZ 'PAUSE' : DW cmd_pause ;CPAUSE + DZ 'REM' : DW cmd_rem ;CREM + ; + ; DSS-команды +CMDLIST: DZ 'CD' : DW cmd_chdir ;CCHDIR + DZ 'DIR' : DW cmd_dir ;DIR + DZ 'ECHO' : DW cmd_echo ;CECHO + DZ 'ECHO.' : DW cmd_echoLN + DZ 'PATH' : DW cmd_path ;CPATH + DZ 'MD' : DW cmd_mkdir ;CMKDIR + DZ 'REN' : DW cmd_rename ;CRENAM + DZ 'DEL' : DW cmd_del ;CDELET + DZ 'RD' : DW cmd_rmdir ;CRMDIR + DZ 'SET' : DW cmd_set ;CSET + DZ 'TIME' : DW cmd_time ;CTIME + DZ 'DATE' : DW cmd_date ;CDATE + DZ 'VER' : DW cmd_version ;VERS + DZ 'CLS' : DW cmd_cls ;CLS + DZ 'CHDIR' : DW cmd_chdir ;CCHDIR + DZ 'MKDIR' : DW cmd_mkdir ;CMKDIR + DZ 'RENAME' : DW cmd_rename ;CRENAM + DZ 'ERASE' : DW cmd_del ;CDELET + DZ 'RMDIR' : DW cmd_rmdir ;CRMDIR + DZ 'HELP' : DW cmd_help ;HELP + DZ 'VERSION' : DW cmd_version ;VERS + DZ 'EXIT' : DW cmd_exit ;CEXIT + DZ 'REBOOT' : DW cmd_reboot ;REBOOT + DB #00 + + +IZERO DB "ZERO",0 +IONE DB "ONE",0 +ITWO DB "TWO",0 +ITHREE DB "THREE",0 +IFOUR DB "FOUR",0 +IFIVE DB "FIVE",0 +ISIX DB "SIX",0 +ISEVEN DB "SEVEN",0 +IEIGHT DB "EIGHT",0 +ININE DB "NINE",0 + +BAT_PRM_ARRAY: + DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE + DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 10 число слов "ZERO".."NINE" +.TOTAL EQU ($-BAT_PRM_ARRAY)/4 + DISPLAY "First compilation test: 10 = ",/D, BAT_PRM_ARRAY.TOTAL + ASSERT BAT_PRM_ARRAY.TOTAL = 10, "BAT_PRM_ARRAY.TOTAL" +NULL: DB 0 +;TVAR_PNT: DW 0 diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM new file mode 100644 index 0000000..8fc7750 --- /dev/null +++ b/SHELL/Commands/CHDIR.ASM @@ -0,0 +1,39 @@ +;/////////////////////////////////////////////////// +; +; CD, CHDIR. Смена каталога +; +;/////////////////////////////////////////////////// +cmd_chdir: + ex de,hl + ;ld de,T9186 ; буфер + ld de,work_buffer1; + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + xor a + ;ld hl,T9186 + ld hl,work_buffer1; + cp (hl) + jr nz,A877B + ld (hl),"." ; ".." родит. папка + inc hl + ld (hl),"." + inc hl + ld (hl),0 + dec hl + dec hl +A877B: ld c,Dss.ChDir ; сменить тек. каталог + RST ToDSS + ;call c,print_err_message + jp c,print_err_message ; вывод сообщения +; call newline + jp save_disk_path ; сохр. тек. диск и путь +; ; вывод сист. пути на экран +; ld c,8Eh ; узнать полож. курсора +; RST ToBIOS +; ld (YXpos),de ; Y/X начало ком-строки +; ld (cursor_position),de ; Y/X позиция курсора +; ;call print_compath ; вывести путь + новая ширина поля ввода +; ;ld de,(YXpos) ; Y/X начало ком-строки +; ;ld c,84h ; уст. полож. курсора +; ;RST ToBIOS +; ret diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM new file mode 100644 index 0000000..9888897 --- /dev/null +++ b/SHELL/Commands/CLS.ASM @@ -0,0 +1,66 @@ +;/////////////////////////////////////////////////// +; +; CLS. Очистить экран +; +; Можно задать один аргумент - цвет экрана. +; Если аргумент не задан, исп. по-умолчанию #07. +;/////////////////////////////////////////////////// +cmd_cls:ex de,hl ; hl=ком-строка + ;ld de,T9186 ; буфер под параметр + ld de,work_buffer1; + push de + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + pop hl + jp nc,invalid_param ; "Invalid parametr" (>1 парам.) + ld b,7 ; атрибут очистки по-умолчанию + ld a,(hl) + or a + jr z,cls_clear + call ascii2byte + jp c,invalid_param ; "Invalid parametr" + and 7 + ld b,a + inc hl + ld a,(hl) + or a + jr z,cls_clear + ld a,b + rlca + rlca + rlca + rlca + ld b,a + ld a,(hl) + call ascii2byte + jp c,invalid_param ; "Invalid parametr" + or b + ld b,a +cls_clear: + ld a,b + ld (color_screen),a ; атрибут + ld de,0 ; Y/X полож. + ld hl,#2050 ; Y/X размер + ld c,BIOS.LP_CLS_WIN ; очистить окно (выводом пробелов) + RST ToBIOS + ; уст. курсор в Home + ld de,0 ; Y/X полож. + ld c,Dss.Locate + RST ToDSS + ret + + +; ascii -> int +ascii2byte: + cp "0" + ret c + cp "9"+1 + jr c,$+10 + and 5Fh + cp "F"+1 + ccf + ret c + sub 7 + sub "0" + or a + ret diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM new file mode 100644 index 0000000..ebfc58e --- /dev/null +++ b/SHELL/Commands/DATE.ASM @@ -0,0 +1,152 @@ +; Обработчики команд DATE и TIME +; + + +;/////////////////////////////////////////////////// +; +; DATE. Вывод или установка даты +; +;/////////////////////////////////////////////////// +cmd_date: + ex de,hl ; hl=ком-строка + ;ld de,T9186 ; буфер + ld de,work_buffer1; + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ;ld de,T9186 + ld de,work_buffer1; + ld a,(de) + or a + jr z,cmd_dt1 + call A893C + jp c,invalid_param ; "Invalid parametr" + xor a + cp h + jp nz,invalid_param ; "Invalid parametr" + ld a,31 + cp l + jp c,invalid_param ; "Invalid parametr" + ld b,l + push bc + call A893C + pop bc + jp c,invalid_param ; "Invalid parametr" + xor a + cp h + jp nz,invalid_param ; "Invalid parametr" + ld a,12 + cp l + jp c,invalid_param ; "Invalid parametr" + ld c,l + push bc + call A893C + push hl + ld c,Dss.SysTime + RST ToDSS + pop ix + pop de + ld c,Dss.SetTime + RST ToDSS +cmd_dt1:ld c,Dss.SysTime + RST ToDSS + push ix + push de + ld a,d ; число + ld hl,PRM1 ; куда + call A8913 ; десят. вывод в буфер + ld a,"." + ld (hl),a + inc hl + pop de + ld a,e ; число + call A8913 ; десят. вывод в буфер + ld a,"." + ld (hl),a + inc hl + push hl + pop ix + pop hl + call A8964 + ld de,2 ; индекс "Current date: %1" + jp MESSAGE ; вывести строку + + + + +;/////////////////////////////////////////////////// +; +; TIME. Вывод или установка времени +; +;/////////////////////////////////////////////////// +cmd_time: + ex de,hl + ;ld de,T9186 + ld de,work_buffer1; + ld c,Dss.GSwitch + RST ToDSS + ;ld de,T9186 + ld de,work_buffer1; + ld a,(de) + or a + jr z,cmd_tm1 + call A893C + jp c,invalid_param ; "Invalid parametr" + xor a + cp h + jp nz,invalid_param ; "Invalid parametr" + ld a,23 + cp l + jp c,invalid_param ; "Invalid parametr" + ld b,l + push bc + call A893C + pop bc + jp c,invalid_param ; "Invalid parametr" + xor a + cp h + jp nz,invalid_param ; "Invalid parametr" + ld a,59 + cp l + jp c,invalid_param ; "Invalid parametr" + ld c,l + push bc + call A893C + pop bc + jp c,invalid_param ; "Invalid parametr" + xor a + cp h + jp nz,invalid_param ; "Invalid parametr" + ld a,59 + cp l + jp c,invalid_param ; "Invalid parametr" + push bc + ld a,l + push af + ld c,Dss.SysTime + RST ToDSS + pop bc + pop hl + ld c,Dss.SetTime + RST ToDSS +cmd_tm1:ld c,Dss.SysTime + RST ToDSS + push bc + push hl + ld a,h ; число + ld hl,PRM1 ; куда + call A8913 ; десят. вывод в буфер + ld a,":" + ld (hl),a + inc hl + pop de + ld a,e ; число + call A8913 ; десят. вывод в буфер + ld a,":" + ld (hl),a + inc hl + pop af ; число + call A8913 ; десят. вывод в буфер + xor a + ld (hl),a ; в конец строки + ld de,3 ; индекс "Current time: %1" + jp MESSAGE ; вывести строку diff --git a/SHELL/Commands/DEL.ASM b/SHELL/Commands/DEL.ASM new file mode 100644 index 0000000..320b4cd --- /dev/null +++ b/SHELL/Commands/DEL.ASM @@ -0,0 +1,16 @@ +;/////////////////////////////////////////////////// +; +; DEL, ERASE. Удалить файл +; +;/////////////////////////////////////////////////// +cmd_del:ex de,hl + ;ld de,T9186 + ld de,work_buffer1; + ld c,Dss.GSwitch + RST ToDSS + ;ld hl,T9186 + ld hl,work_buffer1; + ld c,Dss.Delete + RST ToDSS + call c,print_err_message ; вывод сообщения + ret diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM new file mode 100644 index 0000000..fc0a75b --- /dev/null +++ b/SHELL/Commands/DIR.ASM @@ -0,0 +1,555 @@ +;/////////////////////////////////////////////////// +; +; DIR. Вывод списка файлов и папок +; +;/////////////////////////////////////////////////// +cmd_dir: push de + ld c,Dss.CurDisk ; узнать тек. диск + RST ToDSS + ld (disk+1),a ; номер диска + call read_disk_info ; прочитать метку и серийный номер диска + pop de + ld hl,0 + ld (D88DC),hl + ld (D88DE),hl + ld (D88E0),hl + ex de,hl + ld a,(hl) + or a + jr nz,$+5 ; задана маска имен + ld hl,mask_fname ; "*.*" + ;ld de,T9186 ; буфер + ld de,work_buffer1 ; 80 + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ;ld hl,T9186 ; имя файла + ;ld de,T9186 ; буфер + ld hl,work_buffer1 ; имя файла + ld de,work_buffer1 ; 80 буфер + ld a,37h ; атрибут (все, кроме метки тома) + ld bc,0*256 + Dss.F_First ; f_first (формат 11) + RST ToDSS + jp c,print_err_message ; вывод сообщения + ; %1 + ;ld a,(system_path) ; буфер полного сист. пути + ;ld (T90F6),a + ;ld a,":" + ;ld (T90F7),a + ;xor a + ;ld (T90F8),a + ld a,(screen_path) ; диск + ld hl,PRM1 + ld (hl),a + inc hl + ld (hl),":" + inc hl + ld (hl),0 + ; %2 + ld hl,serial_string ; строка серийного номера диска + ld de,PRM2 ; куда + call ncopy_string ; скопир. строку (с нулем) + ;call print_sys_path ; вывод сист. пути на экран + ; %3 + ld hl,screen_path ; экран. путь + ld de,PRM3 ; 16 буфер + ;ld a,(hl) + ;ldi ; скопир. строку + ;or a + ;jr nz,$-4 + call copy_string ; скопир. строку (с нулем) + ; + ld de,0 ; индекс "Volume in drive %1 has no label..." + call MESSAGE ; вывести строку + ; цикл вывода списка файлов/папок +A882C: ;ld hl,T9186 ; раб. буфер + ld hl,work_buffer1 ; 80 + ld de,33 + add hl,de + call A88E2 + ;ld ix,T9186 + ld ix,work_buffer1 ; 80 + ld a,(ix+32) ; атрибут тек. записи + and 10h ; папка ? + jr nz,A8866 ; да + ; прибавить размер тек. файла + ld hl,(D88DC) + inc hl + ld (D88DC),hl + ld e,(ix+30) + ld d,(ix+31) + ld hl,(D88E0) + exx + ld e,(ix+28) + ld d,(ix+29) + ld hl,(D88DE) + add hl,de + exx + adc hl,de + exx + ld (D88DE),hl + exx + ld (D88E0),hl +A8866: ;ld de,T9186 ; раб. буфер + ld de,work_buffer1 ; 80 буфер + ld c,Dss.F_Next ; поиск след. + RST ToDSS + jr nc,A882C ; назад в цикл + jr A8872 ; конец списка, на десят. вывод + + +; Десятичный вывод +A8872: ld hl,(D88DC) + ld ix,PRM1 ; буфер + call A8964 + ld hl,(D88DE) ; мл. разряд + exx + ld hl,(D88E0) ; ст. разряд + exx + call A8A8F ; десятичный 32-х разрядный вывод + ld hl,T8B37 ; "0" + ld a,(hl) + cp " " + jr nz,A8892 + ld a,"0" + ld (hl),a +A8892: ld de,T8B46 ; "0 000 000 000" + ld hl,T8B2E ; "0000000000" + ld a,(hl) + ldi + cp " " + jr z,$+4 + ld a,"," ; разд. разрядов + ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,$+4 + ld a,"," ; разд. разрядов + ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,$+4 + ld a,"," ; разд. разрядов + ld (de),a + inc de + ldi + ldi + ldi + ld hl,T8B46 ; "0 000 000 000" + ld de,PRM2 ; куда + call ncopy_string ; скопир. строку (с нулем), макс.15 симв. + ld de,9 ; индекс " %1 file(s) %2 bytes" + jp MESSAGE ; вывести строку + + + + +; Подготовить строку списка файлов/папок +A88E2: ld bc,8 + ld de,PRM1 ; буфер + ldir + xor a + ld (de),a + ld de,PRM2 ; куда + ldi + ldi + ldi + ld (de),a + ;ld ix,T9186 + ld ix,work_buffer1 + call A89A4 ; вывести в буфер имя файла и его размер (у папки ) + call A89FA ; вывести в буфер дату файла/папки + call A8A19 ; вывести в буфер время файла/папки + ld de,10 ; индекс "%1 %2 %3 %4 %5" + jp MESSAGE ; вывод строки + + + +; Вывести в буфер имя файла и его размер (у папки ) +A89A4: ld a,(ix+32) + ld hl,T8B38 ; " " + and 10h ; папка ? + jr nz,A89F4 ; да + ld l,(ix+28) ; мл. разряд + ld h,(ix+29) + exx + ld l,(ix+30) ; ст. разряд + ld h,(ix+31) + exx + push ix + call A8A8F ; десятичный 32-х разрядный вывод + ld hl,T8B37 + ld a,(hl) + cp " " + jr nz,A89CD + ld a,"0" + ld (hl),a +A89CD: ld de,T8B46 ; "0 000 000 000" + ld hl,T8B2E ; "0000000000" + ldi + ld a," " + ld (de),a + inc de + ldi + ldi + ldi + ld (de),a + inc de + ldi + ldi + ldi + ld (de),a + inc de + ldi + ldi + ldi + ld hl,T8B46 ; "0 000 000 000" + pop ix +A89F4: ld de,PRM3 ; 16 буфер + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. + + + +; Скопировать в буфер дату файла/папки +A89FA: ld b,(ix+25) + ld c,(ix+24) + ld hl,T8B46 ; "0 000 000 000" + call A8A53 ; вывод в буфер даты + ld (hl),0 + ld hl,T8B46 ; "0 000 000 000" + ld de,PRM4 ; 16 куда + ld a,(hl) + cp "0" + jr nz,$+4 + ld (hl)," " + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. + + + +; Скопировать в буфер время файла/папки +A8A19: ld b,(ix+22) + ld c,(ix+23) + ld hl,T8B46 ; "0 000 000 000" + call A8A38 ; скопир. в буфер время файла/папки + ld (hl),0 + ld hl,T8B46 ; "0 000 000 000" + ld de,PRM5 ; 80 буфер строки + ld a,(hl) + cp "0" + jr nz,$+4 + ld (hl)," " + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. + + +; в буфер время файла/папки +A8A38: srl c + rr b + srl c + rr b + srl c + rr b + srl b + srl b + ld a,c + call A8A7E + ld (hl),":" ; раздел. времени + inc hl + ld a,b + jr A8A7E + + +; в буфер дату файла/папки +A8A53: ld a,c + and 1Fh + push bc + call A8A7E + ld (hl),"." ; раздел. даты + inc hl + pop bc + ld a,c + srl b + rla + rla + rla + rla + and 0Fh + call A8A7E + ld (hl),"." ; раздел. даты + inc hl + ld a,b + add a,80 + cp 100 + jr c,A8A7E +A8A75: sub 100 + cp 100 + jr nc,A8A75 +A8A7E: ld c,2Fh + inc c + sub 10 + jr nc,$-3 + add a,10 + add a,"0" + ld (hl),c + inc hl + ld (hl),a + inc hl + ret + + +; Десятичный 32-х разрядный вывод +A8A8F: ld ix,T8B2E ; "0000000000" + exx + ld de,3B9Ah + exx + ld de,0CA00h + call A8B15 ; 1,000,000,000 + exx + ld de,05F5h + exx + ld de,0E100h + call A8B15 ; 100,000,000...999,999,999 + exx + ld de,98h + exx + ld de,9680h + call A8B15 ; 10,000,000...99,999,999 + exx + ld de,0Fh + exx + ld de,4240h + call A8B15 ; 1,000,000...9,999,999 + exx + ld de,1 + exx + ld de,86A0h + call A8B15 ; 100,000...999,999 + exx + ld de,0 + exx + ld de,10000 + call A8B15 ; 10,000...99,999 + exx + ld de,0 + exx + ld de,1000 + call A8B15 ; 1,000...9,999 + exx + ld de,0 + exx + ld de,100 + call A8B15 ; 100..999 + exx + ld de,0 + exx + ld de,10 + call A8B15 ; 10..99 + ld a,l + add a,"0" + ld (ix+0),a + inc ix + ld hl,T8B2E ; "0000000000" + ld de,2030h ; " ","0" +A8B04: ld a,(hl) + cp e + jr nz,A8B0D + ld (hl),d + inc hl + jr A8B04 + ; +A8B0D: ld hl,T8B37 ; "0" + ld a,(hl) + cp d + ret nz + ld (hl),e + ret + + +A8B15: xor a +A8B16: inc a + sbc hl,de + exx + sbc hl,de + exx + jp nc,A8B16 + add hl,de + exx + adc hl,de + exx + dec a + add a,"0" + ld (ix+0),a + inc ix + ret + + + + +D88DC: dw 0 +D88DE: dw 0 +D88E0: dw 0 + + + +T8B2E: db "000000000" +T8B37: db "0" +T8B38: db " ",0 +T8B46: db "0 000 000 000",0 + db 0 + + + + + +;!FIXIT перенести в DSS - FN #04: GET_BPB +; прочитать BPB диска +read_disk_info: +disk: ld a,0 ; сохр. номер диска + ld c,1 ; open device + rst 18h + jr c,get_inf_data_err ;!FIXIT нет обработчика ошибк + ld a,(disk+1) + ld de,work_buffer ; буфер + ld c,4 ; get BPB + rst 18h + push af + ld a,(disk+1) ; номер диска + ld c,2 ; close device + rst 18h + pop af + jr c,get_inf_data_err ;!FIXIT нет обработчика ошибки +; +get_inf_data_err: +; + + ; Серийный номер лог. диска + ld hl,(work_buffer+41) ; ст.часть + ld de,serial_string ; xxxx-xxxx + call hex16 + ld a,"-" + ld (de),a + inc de + ld hl,(work_buffer+39) ; мл.часть + call hex16 + ; + ; Метка диска + ld a,(disk+1) ; номер диска + cp 2 ; меньше "C:" ? + jr nc,get_inf_data1 ; метка в BPB + ; floppy, метка - как запись файла + ld c,Dss.ChDisk ; уст. диск + RST ToDSS + ; уст. корень диска + ld hl,root_path ; "\",0 + ld c,Dss.ChDir + RST ToDSS + ; поиск метки + ld hl,mask_fname ; "*.*" имя метки + ld de,work_buffer1 ; куда + ld a,8 ; атрибут метки тома + ld bc,0*256 + Dss.F_First ; f_first, формат 11 + RST ToDSS + push af + call restore_path ; восст. тек. путь + pop af + jr c,no_volume_label ; метки нет + ld hl,work_buffer1+33 ; начало метки в буфере f_first + jr volume_label + ; +get_inf_data1: ;!FIXIT так там пробелы стоять могут, если метка короче 11 символов + ld hl,work_buffer+53 ; конец метки в BPB + ld a,(hl) + cp " " ; есть метка ? + ld hl,work_buffer+43 ; начало метки в BPB + jr nz,volume_label ; да +;!FIXIT сделать через аргументы %1-%9 +; нет метки +no_volume_label: ;!FIXIT сделать через PRM %4 + ld hl,volume_string1 ; "has no label " + ld de,MSG0.volume_string ; куда + ld bc,14 + ldir + ret +;!FIXIT сделать через аргументы %1-%9 +; есть метка +volume_label: + ex de,hl + ld hl,MSG0.volume_string ; куда + ld (hl),"i" + inc hl + ld (hl),"s" + inc hl + ld (hl)," " + inc hl + ex de,hl + ; скопир. имя метки + ld bc,11 ; макс. длина метки + ld a,(hl) + cp " "+1 + jr nc,$+6 + inc hl + dec c + jr $-7 + ld a,11 + sub c + ldir + ld b,a + or a ; длина метки 11 симв. ? + ret z ; да + ; дополнить хвост. пробелами + ld (de),a + inc de + djnz $-2 + ret + + + + +; Вывод HL в hex-формате +; de=буфер +; hl=число +hex16: ld a,h + call hex8 + ld a,l +; вывод "a" +hex8: push af + rrca + rrca + rrca + rrca + call $+4 + pop af + and 0Fh + add a,90h + daa + adc a,40h + daa + ld (de),a + inc de + ret + + + + +; маска файлов +mask_fname: + db "*.*",0 + +; корень диска +root_path: + db '\',0 + + + +; Серийный номер диска +serial_string: + db "xxxx-xxxx",0 + +volume_string1: ;!FIXIT сделать через PRM + db "has no label " ; 14 diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM new file mode 100644 index 0000000..d86c5b1 --- /dev/null +++ b/SHELL/Commands/ECHO.ASM @@ -0,0 +1,58 @@ +;/////////////////////////////////////////////////// +; +; ECHO. Вывод сообщений на экран +; +;/////////////////////////////////////////////////// +cmd_echo: + ex de,hl + ld a,(hl) ; ком-строка + or a + jr z,A862E ; без аргументов + ex de,hl + ; тест аргументов на "on","off" + push de + ld b,3 ; длина сравнения + ld hl,T8C21 ; "ON",0 + call A874E ; сравнить строки + pop de + ld a,true ; режим "on" + jr z,A864B + push de + ld b,4 ; длина сравнения + ld hl,T8C24 ; "OFF",0 + call A874E ; сравнить строки + pop hl + ld a,false ; режим "off" + jr z,A864B + ; аргументы не "on","off" +A8623: ld c,Dss.PChars + RST ToDSS + jp newline + +; Показать тек. режим эха +A862E: ld a,(echo_mode) ; флаг echo-режима + or a + ld de,7 ; индекс "on" + jr nz,$+5 ; false + ld de,8 ; индекс "off" + call A8BC6 ; найти строку по индексу + ld de,PRM1 ; куда (аргумент %1) + call ncopy_string ; скопир. строку (с нулем), макс.15 симв. + ld de,6 ; индекс "Echo is %1" + jp MESSAGE + ; +A864B: ld (echo_mode),a ; флаг echo-режима + ret + + +;/////////////////////////////////////////////////// +; +; Команда "ECHO." Вставка пустой строки на экран +; +;/////////////////////////////////////////////////// +cmd_echoLN: + ex de,hl + ld a,(hl) ; ком-строка + or a + jp z,newline ; без аргументов + jr A8623 ; вывести аргументы diff --git a/SHELL/Commands/EXIT.ASM b/SHELL/Commands/EXIT.ASM new file mode 100644 index 0000000..2e20b9d --- /dev/null +++ b/SHELL/Commands/EXIT.ASM @@ -0,0 +1,12 @@ +;/////////////////////////////////////////////////// +; +; EXIT. Выход в родительский процесс +; +;/////////////////////////////////////////////////// +cmd_exit: +.TASKX+1: ld a,2 ; уровень текущего шелла + dec a + dec a + ret z ; a=2 (primary шелл) + pop hl ; восст. баланс стека (убрать вызов A82E7 в гл. цикле оболочки) + jp back_to_parent_process ; вернуться в родит. процесс diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM new file mode 100644 index 0000000..782b68a --- /dev/null +++ b/SHELL/Commands/HELP.ASM @@ -0,0 +1,8 @@ +;/////////////////////////////////////////////////// +; +; HELP. Вывод экрана помощи +; +;/////////////////////////////////////////////////// +cmd_help: + ld de,11 ; индекс "COMMANDS: ..." + jp MESSAGE diff --git a/SHELL/Commands/MKDIR.ASM b/SHELL/Commands/MKDIR.ASM new file mode 100644 index 0000000..f55682a --- /dev/null +++ b/SHELL/Commands/MKDIR.ASM @@ -0,0 +1,17 @@ +;/////////////////////////////////////////////////// +; +; MD, MKDIR. Создать папку +; +;/////////////////////////////////////////////////// +cmd_mkdir: + ex de,hl + ;ld de,T9186 ; буфер + ld de,work_buffer1; + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ;ld hl,T9186 ; имя папки + ld hl,work_buffer1; + ld c,Dss.MkDir ; создать папку + RST ToDSS + call c,print_err_message ; вывод сообщения + ret diff --git a/SHELL/Commands/PATH.ASM b/SHELL/Commands/PATH.ASM new file mode 100644 index 0000000..949cfc5 --- /dev/null +++ b/SHELL/Commands/PATH.ASM @@ -0,0 +1,49 @@ +T858C: db "PATH=",0 ; строка + +;/////////////////////////////////////////////////// +; +; PATH. Установка пути +; +;/////////////////////////////////////////////////// +cmd_path: + ld a,(de) ; ком-строка + or a + jr z,A85B9 ; аргументов не было + ; уст. путь + inc de + cp 9 ; Tab + jr z,cmd_path + cp " "+1 + jr c,cmd_path + dec de + ex de,hl + dec hl + ld (hl),"=" + dec hl + ld (hl),"H" + dec hl + ld (hl),"T" + dec hl + ld (hl),"A" + dec hl + ld (hl),"P" ; начало строки имени + ld bc,Dss.Environ.Set*256 + Dss.Environ ; устан./удалить перем. окружения + RST ToDSS + call c,print_err_message ; вывод сообщения + ret + +; Показать системный путь +A85B9: ;ld de,T9186 ; куда + ld de,work_buffer1; + ld hl,T858C ; имя переменной "PATH=" + ld bc,Dss.Environ.Get*256 + Dss.Environ ; получить переменную окружения + RST ToDSS + jp c,print_err_message ; вывод сообщения + ld hl,T858C ; "PATH=",0 + ld c,Dss.PChars + RST ToDSS + ;ld hl,T9186 ; строка + ld hl,work_buffer1; + ld c,Dss.PChars + RST ToDSS + jp newline diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM new file mode 100644 index 0000000..01a0d68 --- /dev/null +++ b/SHELL/Commands/PAUSE.ASM @@ -0,0 +1,11 @@ +;/////////////////////////////////////////////////// +; +; PAUSE. Пауза (в bat-файле) +; +;/////////////////////////////////////////////////// +cmd_pause: + ld de,4 ; индекс "Press any key to continue ..." + call MESSAGE ; вывод строки + ld c,Dss.WaitKey ; ждем нажатия клавиши + RST ToDSS + ret diff --git a/SHELL/Commands/REM.ASM b/SHELL/Commands/REM.ASM new file mode 100644 index 0000000..77fa229 --- /dev/null +++ b/SHELL/Commands/REM.ASM @@ -0,0 +1,6 @@ +;/////////////////////////////////////////////////// +; +; REM. Комментарий (в bat-файле) +; +;/////////////////////////////////////////////////// +cmd_rem:ret diff --git a/SHELL/Commands/REN.ASM b/SHELL/Commands/REN.ASM new file mode 100644 index 0000000..454d88a --- /dev/null +++ b/SHELL/Commands/REN.ASM @@ -0,0 +1,23 @@ +;/////////////////////////////////////////////////// +; +; REN, RENAME. Переименовать файл +; +;/////////////////////////////////////////////////// +cmd_rename: + ex de,hl + ;ld de,T9186 + ld de,work_buffer1; + ld c,Dss.GSwitch + RST ToDSS + ;ld de,T9206 + ld de,work_buffer+256; + ld c,Dss.GSwitch + RST ToDSS + ;ld hl,T9186 + ;ld de,T9206 + ld hl,work_buffer1; + ld de,work_buffer+256; + ld c,Dss.Rename + RST ToDSS + call c,print_err_message ; вывод сообщения + ret diff --git a/SHELL/Commands/RMDIR.ASM b/SHELL/Commands/RMDIR.ASM new file mode 100644 index 0000000..800231a --- /dev/null +++ b/SHELL/Commands/RMDIR.ASM @@ -0,0 +1,17 @@ +;/////////////////////////////////////////////////// +; +; RD, RMDIR. Удалить папку +; +;/////////////////////////////////////////////////// +cmd_rmdir: + ex de,hl + ;ld de,T9186 ; буфер + ld de,work_buffer1; + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ;ld hl,T9186 ; имя папки + ld hl,work_buffer1; + ld c,Dss.RmDir ; удалить папку + RST ToDSS + call c,print_err_message ; вывод сообщения + ret diff --git a/SHELL/Commands/Reboot.asm b/SHELL/Commands/Reboot.asm new file mode 100644 index 0000000..d2a8d66 --- /dev/null +++ b/SHELL/Commands/Reboot.asm @@ -0,0 +1,10 @@ +;R12 +cmd_reboot: DI + LD C,BIOS.FullInit + RST ToBIOS + LD BC,2*256 + BIOS.REINIT + RST ToBIOS + + DI + HALT +;R12 \ No newline at end of file diff --git a/SHELL/Commands/SET.ASM b/SHELL/Commands/SET.ASM new file mode 100644 index 0000000..e388ec9 --- /dev/null +++ b/SHELL/Commands/SET.ASM @@ -0,0 +1,35 @@ +;/////////////////////////////////////////////////// +; +; SET. Установить переменную окружения +; +;/////////////////////////////////////////////////// +cmd_set:ld a,(de) ; ком-строка + or a + jr z,A85EE ; пустая + ; уст. переменную окружения + inc de + cp 9 + jr z,cmd_set + cp " "+1 + jr c,cmd_set + dec de + ex de,hl + ld bc,Dss.Environ.Set*256 + Dss.Environ + RST ToDSS + call c,print_err_message ; вывод сообщения + ret + +; Показать системное окружение +A85EE: ;ld hl,T9186 ; куда + ld hl,work_buffer1; + ld bc,Dss.Environ.Read*256 + Dss.Environ ; получить сист. окружение + RST ToDSS + ;ld hl,T9186 + ld hl,work_buffer1; +A85F8: ld c,Dss.PChars + RST ToDSS + call newline + ld a,(hl) + or a ; конец сист. окружения ? + jr nz,A85F8 ; нет + ret diff --git a/SHELL/Commands/VER.ASM b/SHELL/Commands/VER.ASM new file mode 100644 index 0000000..b779bfd --- /dev/null +++ b/SHELL/Commands/VER.ASM @@ -0,0 +1,84 @@ +;/////////////////////////////////////////////////// +; +; VER, VERSION. Вывод версии ДОС +; +;/////////////////////////////////////////////////// +cmd_version: + LD C,Dss.Version + RST ToDSS + LD L,D + LD H,E + LD DE,PRM1 + CALL .Set_Ver_to_PRM ; set DSS version + ;R13 + LD HL,256*CONSOLE_MODF + CONSOLE_VERS + LD BC,CONSOLE_BUILD + LD DE,PRM2 + CALL .Set_Ver_to_PRM ; set Shell version + ;R13 + LD DE,VERSMSG + JP MESSAGE + ; вход: hl=число, de=буфер +.num_ver: +.num_mod: + ld ix,.tmp1__ + res 7,(ix+0) + jr .decim + + ; вход: hl=число, de=буфер +.num_build: + ld ix,.tmp1__ + res 7,(ix+0) + ld bc,100 ; 100 + call .num16 + +.decim: ld bc,10 ; 10 + call .num16 + ld a,l + add a,"0" + jr .num16_exit + +.tmp1__: BYTE 0 + +.num16: ld a,'0'-1 + and a + inc a + sbc hl,bc + jr nc,$-3 + add hl,bc + cp "0" + jr z,$+6 + set 7,(ix+0) + bit 7,(ix+0) + ret z +.num16_exit: + ld (de),a ; сохр. в буфере + inc de + ret + ; +; Вход: +; L - номер версии (0..9) +; H - номер модификации (0..99) +; BC - номер билда (0..999) +; DE - номер параметра +.Set_Ver_to_PRM: + PUSH BC + PUSH HL + LD H,0 + CALL .num_ver ;decim2 номер версии (0..9) + LD A,'.' + LD (DE),A + INC DE + POP HL + LD L,H + LD H,0 + CALL .num_mod ;decim2 номер модификации (0..99) + POP HL + LD A,'.' + LD (DE),A + INC DE + CALL .num_build ;decim3 номер билда (0..999) + XOR A + LD (DE),A + RET +; diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM new file mode 100644 index 0000000..55b76f6 --- /dev/null +++ b/SHELL/EDLINE.ASM @@ -0,0 +1,1006 @@ +; Расчитана на функцию #32 ДОС с новым курсором. +; + +; Функция строки редактирования. Имеет историю вводимых строк. +; Функция использует для своей работы временный буфер: +; +; work_buffer - этот буфер использует история +; ;work_buffer+256 - возвращается набранная строка +; +; Клавиши: +; Esc - сбросить текущую строку +; Enter - выход из функции (в work_buffer+256 готовая строка) +; Ins - смена режима ввода (вставка/замена) +; , курсор - прокрутка истории +; PageUp - в начало истории +; PageDown - в конец истории +; Ctrl+Del - стереть историю +; +; +; Используется как заготовка для шелла ДОС. Выводит системный путь. +; Макс. длина экран. пути 34 символа (с диском), остальное обрезается. +; + + + + +;true equ 1 +;false equ 0 + +max_screen_path equ 32 ; макс. длина экран. пути (без диска) +max_len_comline equ 254 ; макс. длина ком-строки (больше не делать) +history_size equ 256 ; размер history-буфера + +; события (внутренние) +evNothing equ 0 ; нет событий +evKeyboard equ 1 ; нажата обычная клавиша +evCombKey equ 2 ; нажата комбин. клавиш или курсорные + + + + + + +;=========================================================== +; Строка редактирования +; +; Выход из строки по клавише , +; ;в work_buffer+256 = набранная строка (или пустая) +;=========================================================== +input_line: + ld a,1 + ld (insert_mode),a + ld c,BIOS.LP_GET_PLACE ; узнать полож. курсора + RST ToBIOS + ld e,4 ; X начало + ld (YXpos),de ; Y/X начало ком-строки + ld (cursor_position),de ; Y/X позиция курсора + call clear_inpline ; очистить структуру ~input line~ + call print_compath ; вывести путь + новая ширина поля ввода + jp event_input_line ; на обраб. строки ввода + + + + +;--------------------------------------------------------------- +; Вывод пути в ком-строке на экран + новая ширина поля ввода +;--------------------------------------------------------------- +print_compath: + ; узнать длину сист. пути + ld hl,system_path ; сист. путь + ld e,l + ld d,h + ld bc,max_len_comline ; 254 + xor a + ld (print_compath_flag),a ; сбр. флаг + cpir + dec hl + push hl ; сохр. конец пути + sbc hl,de + ld a,l ; длина строки + cp max_screen_path+1 ; 33 + jr c,print_compath__ + ; длина пути > 32 + ld a,max_screen_path ; 32 + ld (print_compath_flag),a ; уст. флаг +print_compath__: + ld c,a ; полная длина строки + ld b,0 + ex af,af' ; сохр. длину строки + pop hl ; восст. конец пути + ld de,screen_path+2 ; куда + ; скопировать строку + and a + sbc hl,bc ; hl=начало перекачки + ldir +print_compath_flag+1: + ld a,0 ; флаг переполн. строки + or a + jr z,print_compath1__ + ld hl,screen_path+2 + ld (hl),'\' + inc hl + ld a,"." + ld (hl),a + inc hl + ld (hl),a +print_compath1__: + xor a + ld (de),a ; зануление строки + ex af,af' ; восст. длину строки + add a,2 ; + длина "X:" + ld b,a + inc a + ld (YXpos),a ; X начало ком-строки + ld a,width_inpline.MAX-1 ; ширина экрана - 1 + sub b + ld (width_inpline),a ; новая ширина поля ввода (76..48) + push bc + ; очистить экран. строку + ld de,(cursor_position) ; Y/X полож. + ld e,0 + ld hl,#0150 ; Y/X размер + ld a,(color_screen) ; атрибут + ld b,a + ld a," " ; символ очистки + ld c,BIOS.LP_CLS_WIN2 ; очистить окно + RST ToBIOS + pop bc + ; вывести экран. путь + ld hl,screen_path ; экран. путь + ;call print_inpchar ; вывод строки по счетчику + ld c,BIOS.LP_PRINT_LINE2 + RST ToBIOS; + ld a,">" + ld bc,1*256 + BIOS.LP_PRINT_SYM ; символ без атрибута + RST ToBIOS + ;jr print_inpline ; вывод строки ввода + ;------------------------------------------------- + ; Вывод строки ~input line~ на экран + ;------------------------------------------------- +print_inpline: + ld de,(YXpos) ; Y/X начало ком-строки + ld c,Dss.Locate ; уст. курсор + RST ToDSS + ld hl,struct_input_line ; структура буфера ~input line~ + push hl + pop iy + ld a,(iy+3) ;+3 смещ. строки за левый край + add a,l + ld l,a + jr nc,$+3 + inc h + inc hl + inc hl + inc hl + inc hl + inc hl + ld a,(width_inpline) ; ширина поля + ld c,a + ld b,a + push bc + xor a + ld de,work_buffer ; врем. буфер + push de + ld (de),a + inc de + djnz $-2 + ld a,(iy+0) + sub (iy+3) + cp c + jr nc,$+3 + ld c,a + ld a,(iy+4) ; число введ. символов + sub c + jr nc,$+4 + add a,c + ld c,a + pop de + push de + ld a,b + or c + jr z,$+4 + ldir + pop hl + pop bc + ld a,b ; длина строки + or a + ;call nz,print_inpchar ; вывод строки по счетчику + ld c,BIOS.LP_PRINT_LINE2 + call nz,ToBIOS + ld a,(YXpos) ; X начало ком-строки + ld e,(iy+2) ;+2 тек. полож. курсора в строке + add a,e + cp width_inpline.MAX ; ширина экрана + jr c,prne1__ + ld b,width_inpline.MAX-1 + sub b + ld d,a ; "наезд" за правый край + ld a,e + sub d + ld (iy+2),a ;+2 новое полож. курсора + ld a,b +prne1__:ld (cursor_position),a ; X полож. курсора на экране + ret + + +; Вывод строки по счетчику +;print_inpchar: + ;ld a,(hl) + ;inc hl + ;push hl + ;push bc + ;ld bc,0182h + ;RST ToBIOS +; ld c,86h +; RST ToBIOS + ;pop bc + ;pop hl + ;djnz print_inpchar +; ret + + + + +;------------------------------------------------- +; Чтение событий +;------------------------------------------------- +handle_event: + ld de,(cursor_position) + ld c,Dss.Locate + RST ToDSS + ld c,Dss.EchoKey ; опрос клавы + RST ToDSS + ld hl,what ; поле событий + ld a,e + or a + jr z,handle_event_comb + ld (hl),evKeyboard ;+0 событие + inc hl + ld (hl),e ;+1 код клавиши + inc hl + ld (hl),d ;+2 скен-код клавиши + ret +handle_event_comb: + ld (hl),evCombKey ;+0 событие + inc hl + ld (hl),b ;+1 флаги клавы + inc hl + ld (hl),d ;+2 код курс. клавиш + ret + +; поле событий +what: ds 3 + + + + + + +step_scroll equ 1 ; шаг X скроллинга строки + + +;================================================= +; Обработчик событий ~Input Line~ +;================================================= +event_input_line: + call handle_event ; читаем событие + ld hl,event_input_line + push hl + ld iy,struct_input_line ; структура буфера ~input line~ + ld hl,what ; список событий + ld a,(hl) + inc hl + cp evKeyboard + jr z,EvComKeys + cp evCombKey + jp z,EvComComb + ret + +; +Enter: pop hl ; восст. баланс стека (выход из обработчика) + xor a + ;ld (work_buffer+256),a ; задать пустую строку + ld hl,struct_input_line+4 ; число введ. символов + ld e,(hl) + cp e + ret z ; пустая строка + ld c," " ; пробел + ld d,a + add hl,de + ld a,(hl) + cp c + jr nz,ent1__ ; нет конц. пробелов + ld b,e + ; убрать конц. пробелы ком-строки + ld a,(hl) + cp c + jr nz,$+8 + dec hl + dec (iy+4) ; --число введ. символов + djnz $-8 + inc hl + ld (hl),d ; в конец ком-строки + ld a,b + or a + ret z ; были одни пробелы + ld de,struct_input_line+4 ; число введ. символов + ld (de),a ; новое число (для history_adding) +ent1__: call history_adding ; добавить строку в history + ; скопир. строку во врем. буфер +; ld hl,struct_input_line+4 ; откуда +; ld de,work_buffer+254 ; куда +; ld a,(hl) ; скопир. строку (с нулем) +; ldi +; or a +; jr nz,$-4 + ;call clear_input_line ; очистить строку ввода +; ld a,(YXpos+1); ; Y начало ком-строки +; inc a +; cp 32 +; jr c,$+3 +; xor a +; ld (YXpos+1),a; + ; восст. буфер +; ld hl,work_buffer+254 ; откуда +; ld de,struct_input_line+4 ; куда +; ld a,(hl) ; скопир. строку (с нулем) +; ldi +; or a +; jr nz,$-4 + ; уст. историю на посл. пустую строку + ld a,(history_count) ; число строк в истории + ld (history_cur_string),a ; номер тек. строки истории + ret + + +; Событие - обычная клавиша +EvComKeys: + ld a,(hl) ;+1 what + cp #1B ; Esc + jp z,clear_input_line ; очистить строку ввода + cp #0D ; Enter + jr z,Enter + cp 8 ; Backspace + jr z,inpline_work + cp " " + ret c +inpline_work: + ld de,input_line_done + push de + ld hl,struct_input_line ; структура буфера ~input line~ + ex af,af' + res 7,(iy+1) ;+1 флаг ReadyString + ld a,(insert_mode) ; режим ввода: 1-inser, 0-overwrite + and 1 + rrca ; вправо (мл.бит -> перенос) + or (iy+1) + ld (iy+1),a ;+1 флаг ReadyString + ex af,af' + cp 8 ; Backspace + jp z,back_space + ex af,af' + ld a,(iy+4) ; InputSymb + cp (iy+0) ; Max len + jr nz,ILn___ + ld a,(iy+2) + add a,(iy+3) + cp (iy+0) + ;ret nc + JR NC,LastChar_BEEP + bit 7,(iy+1) + ;ret nz + JR NZ,NoMoreChars_BEEP +ILn___: ld a,(iy+4) + sub (iy+3) + sub (iy+2) + jr z,no_insert + dec (iy+4) + bit 7,(iy+1) + jr z,no_insert + inc (iy+4) + ; ввод в середину текста (вставка) + ld c,a + ld b,0 + ld hl,struct_input_line ; структура буфера ~input line~ + ld a,(iy+4) ;+4 число введ. символов + add a,l + ld l,a + jr nc,$+3 + inc h + inc hl + inc hl + inc hl + inc hl + inc hl + ld d,h + ld e,l + dec hl + lddr +no_insert: + ld hl,struct_input_line ; структура буфера ~input line~ + ld a,(iy+2) ; X тек. полож. курсора в строке + add a,(iy+3) + add a,l + ld l,a + jr nc,$+3 + inc h + inc hl + inc hl + inc hl + inc hl + inc hl + ex af,af' + ld (hl),a ; сохр. символ в строке + inc (iy+4) + inc (iy+2) + ld a,(width_inpline) ; ширина поля ввода + cp (iy+2) ; X тек. полож. курсора в пределах строки + jr nz,$+8 + ; курсор за полем + inc (iy+3) ; смещ. строки за левый край + dec (iy+2) ; X тек. полож. курсора в пределах строки + call print_inpline ; вывести строку на экран + pop de ; восст. баланс стека +input_line_done: + ret +LastChar_BEEP: + ;!TODO если символы привысили максимальное число, то на экране + ; в строке остаётся эхо нажатой клавиши, которая не влезла + ; и висит до нажатия очередной клавиши. Исправить. + LD A,7 ;ASCII BELL + LD C,Dss.PutChar + JP ToDSS + +NoMoreChars_BEEP: + ;!TODO если символы привысили максимальное число, то на экране + ; в строке остаётся эхо нажатой клавиши, которая не влезла + ; и висит до нажатия очередной клавиши. Исправить. + LD A,7 ;ASCII BELL + LD C,Dss.PutChar + JP ToDSS + +; Событие - курс. клавиши или комбинации +EvComComb: + ld b,(hl) ;+1 what + inc hl + ld a,(hl) ;+2 what + ld hl,struct_input_line ; структура буфера ~input line~ + ld de,input_line_done ; точка выхода + push de + cp #54 ; курсор влево + jr z,Left + cp #56 ; курсор вправо + jr z,Right + cp #58 ; курсор вверх, пред. строка истории + jp z,history_prev + cp #52 ; курсор вниз, след. строка истории + jp z,history_next + cp #59 ; PageUp, в начало истории + jp z,history_begin + cp #53 ; PageDown, в конец истории + jp z,history_last + cp #4F ; Del, удалить символ в тек. позиции + jp z,Delete + cp #57 ; Home, в начало строки + jp z,Home + cp #51 ; End, в конец строки + jp z,End1 + cp #50 ; Ins, смена режима ввода + jr z,change_insert_mode + bit 5,b ; Ctrl бит + jr z,$+7 + cp #4F+#80 ; Ctrl+Del, очистить историю команд + jp z,clear_history + pop de + ret + +; Смена режима ввода +change_insert_mode: + ld a,(insert_mode) + xor 1 + ld (insert_mode),a + ret + +; Курсор влево +Left: ld a,(iy+2) + dec a + jp p,ComPrint + ld a,(iy+3) ; смещ. строки за левый край + sub step_scroll ; шаг скроллинга + ret c ; курсор в крайнем левом полож. + ld (iy+3),a ; X смещ. строки за левый край (в символах) + ld a,(iy+2) ; X полож. курсора в пределах строки + add a,step_scroll-1 ; шаг скроллинга +ComPrint: + ld (iy+2),a + jp print_inpline ; вывести строку на экран + +; Курсор вправо +Right: ld a,(iy+2) ; X полож. курсора в пределах строки + add a,(iy+3) ; смещ. строки за левый край + cp (iy+4) ; число введ. символов + ret z + ld a,(width_inpline) ; ширина поля ввода + ld b,a + ld a,(iy+2) ; X полож. курсора в пределах строки + inc a + cp b + jr nz,ComPrint + inc (iy+3) ; смещ. строки за левый край + ld a,(iy+2) ; X полож. курсора в пределах строки + sub step_scroll-1 ; шаг скроллинга + jr ComPrint + +; Backspace - удалить символ левее курсора +back_space: + ld a,(iy+2) ; X тек. полож. курсора в строке + or a + jr nz,back_space1 + ld a,(iy+3) ; смещ. строки за левый край + sub step_scroll ; шаг скроллинга + ret c + ld (iy+3),a + inc (iy+2) ;+2 тек. полож. курсора в строке +back_space1: + ld hl,struct_input_line ; структура буфера ~input line~ + ld a,(iy+2) ;+2 X тек. полож. курсора в строке + add a,(iy+3) ;+3 смещ. строки за левый край + add a,l + ld l,a + jr nc,$+3 + inc h + inc hl + inc hl + inc hl + inc hl + inc hl + ld d,h + ld e,l + dec de + ld a,(iy+4) ;+4 число введ. символов + sub (iy+3) ; смещ. строки за левый край + sub (iy+2) ; X полож. курсора в пределах строки + jr z,$+7 ; курсор за концом строки + ld c,a + ld b,0 + ldir ; обновить остаток строки + xor a + ld (de),a ; в конец строки + dec (iy+2) ; X полож. курсора в пределах строки + dec (iy+4) ; число введ. символов + jp print_inpline ; вывести строку на экран + +; Delete - удалить символ в тек. позиции +Delete: ld hl,struct_input_line ; структура буфера ~input line~ + ld a,(iy+2) ; X тек. полож. курсора в строке + inc a + add a,(iy+3) ; смещ. строки за левый край + add a,l + ld l,a + jr nc,$+3 + inc h + inc hl + inc hl + inc hl + inc hl + inc hl + ld d,h + ld e,l + dec de + ld a,(iy+4) ;+4 число введ. символов + sub (iy+3) ; смещ. строки за левый край + sub (iy+2) ; X тек. полож. курсора в строке + ret z ; курсор за концом строки + ld c,a + ld b,0 + ldir ; обновить остаток строки + xor a + ld (de),a ; в конец строки + dec (iy+4) ; число введ. символов + jp print_inpline ; вывести строку на экран + +; Home - в начало строки +Home: ld a,(iy+2) ; X тек. полож. курсора в строке + add a,(iy+3) ; смещ. строки за левый край + ret z + xor a ; X полож. курсора + ld (iy+2),a ; X полож. курсора в пределах строки + ld (iy+3),a ; смещ. строки за левый край + jp ComPrint ; вывести строку на экран + +; End - в конец строки +End1: ld a,(iy+4) ;+4 число введ. символов + sub (iy+3) ;+3 смещ. строки за левый край + cp (iy+2) ;+2 X тек. полож. курсора в строке + ret z + add a,(iy+3) ; смещ. строки за левый край + ld c,a + ld (iy+3),0 ; смещ. строки за левый край + ld a,(width_inpline) ; ширина поля ввода + sub c + jr z,EndLp + jr nc,EndNIL + neg +EndLp: inc (iy+3) ; X смещ. строки за левый край + sub step_scroll ; шаг скроллинга + jr nc,EndLp +EndNIL: ld a,(iy+4) ; число введ. символов + sub (iy+3) ; смещ. строки за левый край + jp ComPrint ; вывести строку на экран + + + + +; Очистить буфер строки +clear_input_line: + call clear_inpline ; очистить структуру ~input line~ + jp print_inpline ; вывести строку на экран + + +; очистить структуру ~input line~ +clear_inpline: + xor a + ld hl,struct_input_line ; структура буфера ~input line~ + ld b,(hl) ;+0 макс. длина строки + inc hl + ld (hl),a ;+1 сбр. флаг ReadyString + inc hl + ld (hl),a ;+2 X тек. полож. курсора в строке + inc hl + ld (hl),a ;+3 смещ. строки за левый край + inc hl + ld (hl),a ;+4 число введ. символов + cp b + ret z + inc hl ;+5 буфер редакт. строки + ld (hl),a + djnz $-2 + ret + + + +; Вставить строку из history-буфера +; вход: de=структура строки: +0=длина строки, +1=строка +put_from_history: + call clear_inpline ; очистить строку ввода + ld a,(de) ;+0 длина строки + ld c,a +put_history_loop: + inc de + ld hl,struct_input_line ; структура буфера ~input line~ + ld a,(iy+2) ; X тек. полож. курсора в строке + add a,(iy+3) + add a,l + ld l,a + jr nc,$+3 + inc h + inc hl + inc hl + inc hl + inc hl + inc hl + ld a,(de) + ld (hl),a + inc (iy+4) ; число введ. символов + inc (iy+2) ; X тек. полож. курсора в строке + ld a,(width_inpline) ; ширина поля ввода + cp (iy+2) ; X тек. полож. курсора в пределах строки + jr nz,$+8 + ; курсор за правым краем поля ввода + inc (iy+3) ; смещ. строки за левый край + dec (iy+2) ; X тек. полож. курсора в пределах строки + dec c + jr nz,put_history_loop + ; вывести строку на экран + jp print_inpline + + + +; Очистить историю команд +clear_history: + call clear_input_line ; очистить строку ~input line~ + xor a + ld (history_count),a ; число строк в history + ld (history_cur_string),a ; номер тек. строки history + ld hl,history_buff ; конец посл. строки + ld (history_end),hl + ret + + + + + + +;======================================================================== +; History Код +;======================================================================== + +history_count: + db 0 ; число строк в истории + ; +history_cur_string: + db 0 ; номер тек. строки истории + ; +history_end: + dw history_buff ; конец послед. строки истории + + + +;------------------------------------------------- +; В начало истории +;------------------------------------------------- +history_begin: + ld a,(history_count) + or a + ret z ; нет строк + xor a + ld (history_cur_string),a + jr history_copy ; перейти на 1-ю строку + +;------------------------------------------------- +; В конец истории +;------------------------------------------------- +history_last: + ld a,(history_count) + or a + ret z ; нет строк + ld (history_cur_string),a ; уст. послед. пустую строку + jp clear_input_line ; вернуть пустую строку + +;------------------------------------------------- +; Следующая строка +;------------------------------------------------- +history_next: + ld a,(history_count) + or a + ret z ; нет строк + dec a + ld b,a + ld hl,history_cur_string + ld a,(hl) + cp b + jr c,$+7 + inc b + ld (hl),b + jp clear_input_line ; вернуть пустую строку + ; + inc a + ld (hl),a + jr history_copy + +;------------------------------------------------- +; Предыдущая строка +;------------------------------------------------- +history_prev: + ld a,(history_count) + or a + ret z ; нет строк + ld b,a + ld hl,history_cur_string + ld a,(hl) + or a + jr z,history_copy ; уперлись в начало истории + cp b + jr c,$+3 + ld a,b + dec a + ld (hl),a +; перейти на строку по ее индексу +history_copy: + call history_index + jp put_from_history ; строку из history в буфер ком-строки + +; вход: а=индекс строки +; выход: de=строка (ее структура из history-буфера) +history_index: + ld b,0 + ld hl,history_buff ; буфер истории + or a ; индекс строки + jr z,hist_index ; 1-я строка истории + ld c,(hl) ; размер строки + inc c + add hl,bc ; на след. строку + dec a + jr nz,$-4 +hist_index: + ex de,hl + ret + + +;----------------------------------------------------------- +; Добавить новую строку в конец буфера истории. +; Если строка не влезает, удаляются самые старые строки до +; тех пор, пока появится достаточно места для новой строки. +;----------------------------------------------------------- +history_adding: + ld de,struct_input_line+4 ; структура строки + call history_compare ; сравнить строки + ret z ; уже есть такая строка + ld bc,(history_end) ; адрес конца посл. строки + ld hl,history_buff+history_size ; адрес конца буфера + and a + sbc hl,bc ; hl=размер своб. места + ld a,(de) ; длина новой строки + inc a + ld c,a + xor a + ld b,a + sbc hl,bc ; умещ. в своб. месте буфера истории ? + jr nc,history_add_ok ; да + ; удалить первую (самую старую) строку из буфера + ;push de + ld de,history_buff ; буфер истории + ld a,(de) ; длина 1-й строки + inc a + ld c,a + xor a + ld b,a + ld hl,(history_end) + sbc hl,bc + ld (history_end),hl ; конец посл. строки + ld l,e ; hl=history_buff + ld h,d + add hl,bc ; начало 2-й строки + push hl + ld hl,history_size ; размер буфера + and a + sbc hl,bc + ld c,l ; размер остатка буфера + ld b,h + pop hl ; начало 2-й строки + ldir + ld hl,history_count + dec (hl) ; --число строк в history + ;pop de ; восст. адрес struct_input_line+4 + jr history_adding + ; +history_add_ok: + ld hl,(history_end) ; адрес конца посл. строки + ex de,hl + ldir + ld (history_end),de ; конец посл. строки + ld hl,history_count + ld a,(hl) + ld (history_cur_string),a ; тек. строка history + inc (hl) ; ++число строк в history + ret + + +; Сравнить строки. Если строки равны, то переместить +; тек. строку в конец истории. +; вход: de=структура строки: +0=длина строки, +1=строка +; выход: Z-есть строка +; NZ-нет строки +history_compare: + ld hl,history_count + ld b,(hl) ; число строк в history + dec b + inc b + jr z,hist_comp_quit ; history-буфер пустой + ex af,af' + xor a ; сбр. индекс сравн. строки + ex af,af' + ld hl,history_buff ; буфер истории +history_comp_loop: + push de + ld (move_cur_str+1),hl ; тек. строка истории + ld c,(hl) ; длина тек. строки history + ld a,(de) ; длина новой строки + inc hl + inc de + cp c + jr z,hist_comp_loop ; строки одинаковой длины + ld a,l + add a,c + ld l,a + ld a,h + adc a,0 + ld h,a + jr hist_comp_next + ; +; сравнить строки +hist_comp_loop: + ld a,(de) + cp (hl) + jr nz,hist_comp_notequal ; строки не равны + inc hl + inc de + dec c + jr nz,hist_comp_loop + ; строки равны + jr move_to_end_history ; найденную строку в конец истории + ; +hist_comp_notequal: + inc hl + dec c + jr nz,$-2 ; до конца строки +hist_comp_next: + pop de + ex af,af' + inc a ; ++индекс сравн. строки + ex af,af' + djnz history_comp_loop +hist_comp_quit: + xor a + dec a ; NZ-флаг + ret + +; переместить тек. строку в конец истории +move_to_end_history: + ld a,(history_count) ; число строк истории + ld c,a + dec c + ex af,af' ; индекс найденной строки + cp c + jr nc,not_move_to_end ; найденная строка уже в конце + ; сохр. строку во врем. буфере +move_cur_str: + ld hl,0 ; тек. строка истории + ld de,work_buffer ; врем. буфер + ld c,(hl) ;+0 длина строки + inc c ; учесть ячейку длины строки + xor a + ld b,a + push bc + push hl + ldir + pop de ; куда (на место старой строки) + pop bc + ; сдвинуть остаток буфера на место сохр. строки + push hl + ld hl,(history_end) ; конец посл. строки истории + and a + sbc hl,de + and a + sbc hl,bc + ld c,l ; величина сдвига + ld b,h + pop hl ; откуда + ldir + ; восст. строку из врем. буфера в конец истории + ld hl,work_buffer ; врем. буфер + ld c,(hl) + inc c + ld b,a + ldir +not_move_to_end: + ld a,(history_count) + dec a + ld (history_cur_string),a ; тек. строка history + pop de + xor a ; Z флаг + ret + + + + + + + +cursor_position: + dw 0 ; Y/X полож. курсора + +width_inpline: +.MAX EQU 80 + db width_inpline.MAX-4 ; тек. ширина поля ввода + +YXpos: dw 0 ; Y/X начало ком-строки + + +; режим ввода +insert_mode: + db 1 ; 01/00 inser/overwrite + + + +; экранный путь +screen_path: + db "A:" + ds max_screen_path+1 ; 32+1 + +; системный путь +system_path: + ;db "\BORLAND\LMDTOOLS\TESTING\PROGRAM\SOURCES\TURBO\PR",0 + ds 256 + + + +; Структура строки ввода ~input line~ +struct_input_line: + db max_len_comline ;+0 254 макс. число ввод. символов + db 0 ;+1 флаг ReadyString + db 0 ;+2 X тек. полож. курсора в пределах строки + db 0 ;+3 X смещ. строки за левый край (в символах) + db 0 ;+4 число введенных символов + ds max_len_comline+1 ;+5 строка ввода + + +; Буфер истории +history_buff: + ds history_size ; 256 + + +; Рабочий буфер +work_buffer: + ds 512 diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM new file mode 100644 index 0000000..902f4fd --- /dev/null +++ b/SHELL/ERROR.ASM @@ -0,0 +1,309 @@ +;------------------------------------------------- +; Вывод сообщения ошибки по индексу +; вход: a=номер ошибки +;------------------------------------------------- +print_err_message: + ld e,a + ld d,0 + inc de + ld hl,ERR0 ; массив строк + ld bc,ERR0.Size ; размер массива + call A8BCD ; найти строку + call PRINTZ ; формат. вывод строки + call newline + jp newline + + + +; Вывод строки ошибки +;A850D: +invalid_param: + ld de,5 ; индекс "Invalid parametr" + jr MESSAGE + + + +;------------------------------------------------- +; Вывод сообщения ошибки по индексу +; вход: de=индекс строки +;------------------------------------------------- +MESSAGE: + call A8BC6 ; найти строку по индексу + jp PRINTZ ; формат. вывод строки + ;jp A82CC ; узнать и уст. полож. курсора + + +; Найти строку по индексу +; вход: de=индекс строки +; выход: hl=строка +A8BC6: inc de + ld hl,MSG0 ; начало массива строк + ld bc,MSG0.Size ; размер массива +A8BCD: xor a + cpir + ret po + ret nz + ;R11 + XOR A + CP (HL) + JR Z,.no_mess + ; + dec de + ld a,d + or e + jr nz,A8BCD + ret +.no_mess: INC HL + RET + +;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована +;----------------------------------------------------------------------; +; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 +; вход: hl=буфер строки +;----------------------------------------------------------------------; +PRINTZ: ld a,(hl) + inc hl + or a + ret z + cp '%' + jr z,.check_PRM +.char: ld c,Dss.PutChar + RST ToDSS + jp PRINTZ +.bad_PRM: + ld a,'%' + jp .char +.check_PRM: + ld a,(hl) + cp '9'+1 + jr nc,.bad_PRM + inc hl + sub '1' + push hl + ;!TEST + ;ld l,a + ;ld h,0 + ;add hl,hl ;1+1=2 + ;add hl,hl ;2+2=4 + ;add hl,hl ;4+4=8 + ;add hl,hl ;8+8=16 размер отдельного подбуфера + ADD A + ADD A + ADD A + ADD A + LD L,A + LD H,0 + ; + ld bc,PRM1 ; буфер + add hl,bc + ld c,Dss.PChars ; вывод строки + RST ToDSS + pop hl + jp PRINTZ + + + +;!FIXIT перенести к общим буферам как у меня +; буферы аргументов командной строки +PRM1: BLOCK 16,0 ; аргумент %1 +PRM2: BLOCK 16,0 ; аргумент %2 +PRM3: BLOCK 16,0 ; аргумент %3 +PRM4: BLOCK 16,0 ; аргумент %4 +PRM5: BLOCK 16,0 ; аргумент %5 +PRM6: BLOCK 16,0 ; аргумент %6 +PRM7: BLOCK 16,0 ; аргумент %7 +PRM8: BLOCK 16,0 ; аргумент %8 +PRM9: BLOCK 16,0 ; аргумент %9 + + + +;!TODO не забыть заменить цифры на эти метки +DIR1MSG EQU 0 +VERSMSG EQU 1 +DATEMSG EQU 2 +TIMEMSG EQU 3 +PAUSMSG EQU 4 +ILLGMSG EQU 5 +ECHOMSG EQU 6 +ON__MSG EQU 7 +OFF_MSG EQU 8 +DIR2MSG EQU 9 +DIR3MSG EQU 10 +HELPMSG EQU 11 + +MSG0: db 0 +; 0 + db "Volume in drive %1 " +.volume_string: ;!FIXIT сделать через PRM + db "has no label ",0Dh,0Ah ;0 + db "Volume Serial Number is %2",0Dh,0Ah + db 0Dh,0Ah,"Directory of %3",0Dh,0Ah,0Ah,0 +; 1 + db "Estex DSS version %1. Console version %2.",CR,LF,0 ;R13 +; 2 + db "Current date: %1",0Dh,0Ah,0 ;2 + db "Current time: %1",0Dh,0Ah,0 ;3 + db "Press any key to continue . . .",0Dh,0Ah,0Ah,0 ;4 + db "Invalid parametr",0Dh,0Ah,0 ;5 + db "Echo is %1",0Dh,0Ah,0 ;6 + db "on",0 ;7 + db "off",0 ;8 + db " %1 file(s) %2 bytes",0Dh,0Ah,0Ah,0 ;9 +; 10 FILENAME EXT SIZE DATE TIME + db "%1 %2 %3 %4 %5",0Dh,0Ah,0 ;10 +; 11 + DB "COMMANDS:",CR,LF,CR,LF + DB "DIR REN | RENAME PATH HELP ",CR,LF + DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF + DB "MD | MKDIR TIME ECHO EXIT ",CR,LF + DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 + ;R11 + BYTE 0 + DZ "Unknown command" + ; +.Size EQU $-MSG0 + +/* +MSG0: DB 0 + DB "Volume in drive %1 has no label",CR,LF ; !FIXIT + DB "Volume Serial number is %2",CR,LF + DB "Directory of %3",CR,LF,CR,LF,0 + DB "Estex DSS: Version %1",CR,LF,0 ;R02 + DB "Current date: %1",CR,LF,0 + DB "Current time: %1",CR,LF,0 + DB "Press any key to continue . . .",CR,LF,0 + DB "Invalid parametr",CR,LF,0 + DB "Echo is %1",CR,LF,0 + DB "on",0 + DB "off",0 + DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 +; FILENAME EXT SIZE DATE TIME + DB "%1 %2 %3 %4 %5",CR,LF,0 + DB "COMMANDS:",CR,LF,CR,LF + DB "DIR REN | RENAME PATH HELP ",CR,LF + DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF + DB "MD | MKDIR TIME ECHO EXIT ",CR,LF + DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 + ;R11 + BYTE 0 + DZ "Unknown command" + ; +.Size EQU $-MSG0 + +*/ +;----------------------------------------------------------------------- +;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются +ERR0: DB #00 + DZ "Bad command or file name" + DZ "Invalid function" ; 01 - неверный номер функции + DZ "Invalid drive number" ; 02 - неправильный номер устройства + DZ "File not found" ; 03 - файл не обнаружен + DZ "Path not found" ; 04 - неверный путь + DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор + DZ "Too many open files" ; 06 - нет свободного файлового манипулятора + DZ "File already exist" ; 07 - файл существует + DZ "File read only" ; 08 - файл только для чтения + DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) + DZ "No free space" ; 10 - нет свободного места на диске + DZ "Directory not empty" ; 11 - каталог не пуст + DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог + DZ "Invalid media" ; 13 - неизвестный формат + DZ "Unknown operation" ;R02 ; 14 - невозможная операция + DZ "Directory exist" ; 15 - каталог уже есть + DZ "Invalid filename" ; 16 - неверное имя + DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл + DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла + DZ "Access denied" ; 19 - ресурс не доступен + DZ "Not ready" ; 20 - нет готовности + DZ "Seek error" ; 21 - ошибка позиционирования + DZ "Sector not found" ; 22 - сектор не найден + DZ "CRC error" ; 23 - ошибка CRC + DZ "Write protect" ; 24 - защита записи + DZ "Read error" ; 25 - ошибка чтения + DZ "Write error" ; 26 - ошибка записи + DZ "Drive failure" ; 27 - сбой диска + DZ "Extended error 28" + DZ "Extended error 29" + DZ "Not enough memory" ; 30 - недостаточно памяти + DZ "Invalid memory block" ; 31 - несуществующий блок памяти + DZ "Extended error 32" + DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной + DZ "Extended error 34" + DZ "Too many files in directory" ; 35 - слишком много файлов в директории + DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + DZ "Operation aborted by user" ; 37 - операция прервана пользователем + DZ "Common error" ; 38 - общая ошибка + DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения + DZ "40" + DZ "41" + DZ "42" + DZ "43" + DZ "44" + DZ "45" + DZ "46" + DZ "Wrong video mode" ; 48 - неправильный видеорежим + DZ "48" + DZ "49" + DZ "50" + ;R11 + DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: + DZ "Unknown error" + ; +.Size EQU $-ERR0 +;----------------------------------------------------------------------- +/* +; Сообщения ошибок ДОС +ERR0: db 0 + db "Bad command or file name",0 ;0 + db "Invalid function",0 ;1 + db "Invalid drive number",0 ;2 + db "File not found",0 ;3 + db "Path not found",0 ;4 + db "Invalid handle",0 ;5 + db "Too many open files",0 ;6 + db "File already exist",0 ;7 + db "File read only",0 ;8 + db "Root overflow",0 ;9 + db "No free space",0 ;10 + db "Directory not empty",0 ;11 + db "Can't delete current directory",0 ;12 + db "Invalid media",0 ;13 + db "Unknown operation",0 ;14 + db "Directory exist",0 ;15 + db "Invalid filename",0 ;16 + db "Invalid EXE-file",0 ;17 + db "Not supported EXE-file",0 ;18 + db "Access denied",0 ;19 + db "Not ready",0 ;20 + db "Seek error",0 ;21 + db "Sector not found",0 ;22 + db "CRC error",0 ;23 + db "Write protect",0 ;24 + db "Read error",0 ;25 + db "Write error",0 ;26 + db "Drive failure",0 ;27 + db "Extended error 28",0 ;28 + db "Extended error 29",0 ;29 + db "Not enough memory",0 ;30 + db "Invalid memory block",0 ;31 + db "Extended error 32",0 ;32 + db "Extended error 33",0 ;33 + db "Extended error 34",0 ;34 + db "Too many files in directory",0 ;35 список файлов + db "36",0 ;36 (слишком большая влож. папок или >= 1024 папок) + db "User abort",0 ;37 User abort (операция прервана пользователем) + db "38",0 ;38 + db "39",0 ;39 + db "40",0 ;40 + db "41",0 ;41 + db "42",0 ;42 + db "43",0 ;43 + db "44",0 ;44 + db "45",0 ;45 + db "46",0 ;46 + db "47",0 ;47 + db "48",0 ;48 + db "49",0 ;49 + db "50",0 ;50 +.Size EQU $-ERR0 +*/ diff --git a/SHELL/README.txt b/SHELL/README.txt new file mode 100644 index 0000000..c4e6a8c --- /dev/null +++ b/SHELL/README.txt @@ -0,0 +1,34 @@ +Сорцы рабочие!. Практически ничего не убирал из них, на случай вылезания +глюков. +Команда DIR выводит теперь метку и серийник дисков. + + +bat-команды: + PAUSE + REM + +дос-команды: + CD,CHDIR + CLS + DATE,TIME + DEL,ERASE + DIR + ECHO,ECHO. + EXIT + HELP + MD,MKDIR + PATH + REN,RENAME + RD,RMDIR + SET + VER,VERSION + + +Перемещение по истории команд: + + Esc - сбросить текущую строку + Ins - смена режима ввода (вставка/замена) + курс. клавиши вверх/вниз - прокрутка истории + PageUp - в начало истории + PageDown - в конец истории + Ctrl+Del - стереть историю diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM new file mode 100644 index 0000000..43a733f --- /dev/null +++ b/SHELL/SHELL.ASM @@ -0,0 +1,510 @@ +; Последняя редакция: 22.10.2006 +; + + +; - Исправлен фирм. баг, при котором строка в bat-файле, длиннее ширины +; экрана, обрезалась по ширине экрана и остаток строки не выводился. +; - Исправлен фирм. баг, при котором в команде "dir" строка выводимого +; пути имела макс. 15 символов. +; - Пофиксено неверное изменение диска/пути после ошибок выполнения команд. +; - Добавлена команда "ECHO." для вставки пустой строки. +; - Команда DIR выводит метку и серийный номер дисков. +; +; + + + includelua 'Shared_includes/lua/Functions.lua' + include 'shared_includes/constants/bios_equ.inc' + include 'shared_includes/constants/dss_equ.inc' + include 'SHELL/version.inc' + +; +; Program EQU section +;---------------------------------------------------------------------[] +CR EQU 13 +LF EQU 10 +;---------------------------------------------------------------------[] +; + +true equ 1 +false equ 0 + +work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ;!FIXIT перенести в конец +work_buffer2 equ entry - 256 ; 3-й раб. буфер ;!FIXIT перенести в конец + + + + + org 7F00h + + db "EX" ; exe ID + db 45h ; exe тип + db 0 ; exe версия + dw 512 ; 512, мл. смещ. кода + dw 0 ; ст. смещ. кода + dw 0 ; end-beg, первичный загрузчик + dw 0,0,0 ; резерв + dw entry ; адрес загрузки кода + dw shell ; адрес передачи управления + dw 0C000h ; адрес стека + ds 490 ; резерв + + +; Версия/Модификация/Билд шелла +entry: db "0.01.003" ;!FIXIT перенести в конец + +;============================================================== +; Точка входа в Шелл +;============================================================== +shell: + ;!TODO merge: активировать когда буферы будут через структуру, а не нулями + ;LD HL,WORK_BUFFERS + ;LD DE,WORK_BUFFERS+1 + ;LD BC,BUFFERS_STRUCT-1 + ;LD (HL),0 + ;LDIR + ; + + ; сохр. уровень тек. шелла + ld a,(ix-1) + ld (cmd_exit.TASKX),a + push ix + call save_disk_path ; сохр. тек. диск и путь + pop hl ; hl=ix + ; + ; Тест на опции запуска самого шелла + call GET_CMD + ld a,(RUNMODE) ; бит-флаги опций + bit 7,a ; "P" 7-й бит (идет вызов из boot-загрузчика) + jr nz,FPRIMAR + bit 5,a ; "S" 5-й бит (запуск 2-й копии шелла) + ;jp nz,option_s + jr nz,run_shell + bit 4,a ; "C" 4-й бит (выполнить bat-файл) + jr nz,option_c + bit 6,a ; 6-й бит (вводились дополн. параметры) + jr z,back_to_parent_process + ; вводились дополн. параметры + call CMDMODE ; (batch.asm) выполн. команду или запустить файл + call save_disk_path ; узнать и сохр. тек. диск и путь + ; + ; Вернуться в родит. процесс +back_to_parent_process: + ld bc,0*256 + Dss.Exit + RST ToDSS + ret + + + + +;--------------------------------------------------------------- +; Опция "S". Запуск 2-й копии шелла. Без отработки AUTOEXEC.BAT. +; Можно выйти по EXIT. +;--------------------------------------------------------------- +; option_s: +; call cmd_version ; версия ДОС +; jr run_shell + + + +;--------------------------------------------------------------- +; Опция "C". Выполнить BAT-файл. +; После выполнения файла, возвращается в родительский процесс. +;--------------------------------------------------------------- +option_c: + ;ld hl,T96AE ; имя bat-файла, 256 буфер (inline.asm) + ;ld hl,work_buffer+256;; + ld hl,struct_input_line+5 ; имя bat-файла + call BATCH ; обработка bat-файла (batch.asm) + call save_disk_path ; узнать и сохр. тек. диск и путь + jr back_to_parent_process ; вернуться в родит. процесс + + + +;--------------------------------------------------------------- +; Опция "P". Запуск копии шелла. С отработкой AUTOEXEC.BAT. +; С ней идет вызов шелла из boot-загрузчика. +; Можно выйти по EXIT, но не из запущенного boot-загрузчиком. +;--------------------------------------------------------------- +FPRIMAR: + ld c,Dss.CTRLKey ; узнать сост. клавы в данный момент + RST ToDSS + ld hl,autoexec_fname ; имя файла "system.bat" + ld a,b + and #C0 ; нажаты Shift-ы ? + call z,BATCH ; нет, выполнить bat-файл (batch.asm) +;============================================================== +; Запуск копии шелла +;============================================================== +run_shell: + call newline +run_shell_loop: + ;call A82CC ; узнать и уст. полож. курсора + ; вывести тек.сист. путь и войти в строку редактирования + call save_disk_path ; узнать и сохр. тек. диск и путь +run_shell_loop1: + call input_line + call newline ; на новую строку + ld a,(struct_input_line+4) ; число введ. символов + or a + jr z,run_shell_loop1 ; пустая + ; Парсинг и выполнение команд + call A82E7 + jr run_shell_loop ; назад в цикл + + + + + + +; Тест опций шелла +; вход: hl=адрес ком-строки +GET_CMD: + ld e,(hl) ; длина строки + inc hl + ld d,0 + ex de,hl ; hl=длина строки, de=строка + add hl,de + ; убрать концевые пробелы + dec hl + ld a,(hl) + cp " " + jr z,$-4 + inc hl + ld (hl),0 ; в конец ком-строки +.NEXTPRM: + ex de,hl ; hl=тек. адрес в строке +.SKIPSP: + ld a,(hl) + inc hl + cp " " + ret c + jr z,.SKIPSP + dec hl + cp '/' ; опция + jr nz,.PROCESS + ld de,work_buffer1 ; 128 буфер для параметра + ld c,Dss.GSwitch ; выдел. параметр ком-строки + RST ToDSS + push af + ex de,hl + ld hl,work_buffer1 ; 128 буфер для параметра + inc hl + call set_option_flag ; уст. биты флагов + pop af + jr nc,.NEXTPRM + ret +; уст. бит-флаг +.PROCESS: + ld a,(RUNMODE) + set 6,a ; 6-й бит (вводились дополн. параметры) ;!HARDCODE + ld (RUNMODE),a + ; скопир. параметр из ком-строки + ; в буфер строки редактирования + ;copy_to_input_line: + ld iy,struct_input_line ; структура буфера ~input line~ + push hl + call clear_inpline ; обнулить структуру "input line" + pop de ; de=хвост строки +.loop: ld hl,struct_input_line ; структура буфера ~input line~ + ld a,(iy+2) ; X тек. полож. курсора в строке + add a,(iy+3) + add a,l + ld l,a + jr nc,1F + inc h +1: inc hl + inc hl + inc hl + inc hl + inc hl + ld a,(de) ; символ из строки + ld (hl),a + or a + ret z ; конец строки + inc (iy+4) ; число введ. символов + inc (iy+2) ; X тек. полож. курсора в строке + ld a,(width_inpline) ; ширина поля ввода + cp (iy+2) ; X тек. полож. курсора в пределах строки + jr nz,2F + ; курсор за правым краем поля ввода + inc (iy+3) ; смещ. строки за левый край + dec (iy+2) ; X тек. полож. курсора в пределах строки +2: ld a,(de) ; символ из строки + inc de ; продв. поток + cp " " + jr nc,.loop + ret + +; Тест на опции шелла и уст. бит-флагов +; вход: hl=строка опций +set_option_flag: + ld a,(RUNMODE) ; ячейка бит-флагов + ld c,a + ld a,(hl) + cp "a" + jr c,setopt1 + cp "z"+1 + jr nc,$+4 + and 5Fh ; a..z -> A..Z +setopt1: cp "P" ; запуск шелла с отраб. autoexec.bat + jr nz,setopt2 + set 7,c + jr setopt4 + ; +setopt2: cp "S" ; запуск 2-й копии шелла (без отраб. autoexec.bat) + jr nz,setopt3 + set 5,c + jr setopt4 + ; +setopt3:cp "C" ; выполн. bat-файл и вернуться в родит. процесс + ret nz + set 4,c +setopt4: ld a,c + ld (RUNMODE),a + ret + + + + + +;!TODO проверить 4 нижеидущие процедуры когда в DSS будут нормально пути запоминаться +; Сохранить тек. диск и путь +;GETPATH: +save_disk_path: + ; узнать тек. каталог + ld hl,system_path ; 256 буфер сист. пути + ld c,Dss.CurDir + RST ToDSS +save_disk: + ; узнать тек. диск + ld c,Dss.CurDisk + RST ToDSS + add a,"A" + ld (screen_path),a ; 33 строка экранного пути + ret + +; Восстановить тек. диск и путь (после ошибки) +restore_disk_path: + ; уст. тек. диск + ld a,(screen_path) ; 33 строка экранного пути + sub "A" + ld c,Dss.ChDir + RST ToDSS +restore_path: + ; уст. тек. каталог + ld hl,system_path ; 256 буфер сист. пути + ld c,Dss.ChDir + RST ToDSS + ret + + + + +; на новую строку ;!FIXIT сделать через .PChars +newline:ld a,_cc.cr + ld c,Dss.PutChar + RST ToDSS + ld a,_cc.lf + ld c,Dss.PutChar + RST ToDSS + ret + + +; Сравнение строк +; in: de=string1 +; hl=string2 +; b=длина строки +A874E: ld a,(de) + cp "a" + jr c,$+8 + cp "z"+1 + jr nc,$+4 + and 5Fh ; a..z -> A..Z + cp (hl) + ret nz + inc hl + inc de + djnz A874E + ret + + +; Скопир. строку (с нулем), макс. 15 символов +; (hl) -> (de) +ncopy_string: + ld bc,15 ; макс. длина строки + ld a,(hl) + ldi + ret po + or a + jr nz,$-5 + ret + +; Скопир. строку (с нулем) +; (hl) -> (de) +copy_string: + ld a,(hl) + ldi + or a + jr nz,copy_string + ret + + + + + + +; Десятичный вывод в буфер +; вход: a=число +; hl=буфер +A8913: ld c,2Fh + inc c + sub 10 + jr nc,$-3 + add a,10 + add a,"0" + push af + ld a,c + ld (hl),a + inc hl + pop af + ld (hl),a + inc hl + ret + + + +A893C: ld hl,0 +A893F: ld a,(de) + inc de + or a + ret z + cp "." ; раздел. даты + ret z + cp "-" ; раздел. даты + ret z + cp ":" ; раздел. времени + ret z + ld b,h + ld c,l + add hl,hl + add hl,hl + add hl,bc + add hl,hl + call A895A + ret c + add a,l + ld l,a + jr nc,A893F + inc h + jr A893F + + +; char -> int +A895A: cp "0" + ret c + cp "9"+1 + ccf + ret c + sub "0" + ret + + +A8964: ld de,10000 + ld a,0C8h ; ret z + ld (D8996),a + call A898E + ld de,1000 + call A898E + ld de,100 + call A898E + ld de,10 + call A898E + ld a,l + add a,"0" + ;!TEST + ;ld (ix+0),a + ;inc ix + ;ld (ix+0),0 + LD (IX+0),A + LD (IX+1),0 + ; + ret + + +A898E: xor a + inc a + sbc hl,de + jr nc,$-3 + add hl,de + dec a +D8996: ret z + add a,"0" + ld (ix+0),a + inc ix + xor a ; nop + ld (D8996),a + ret + + + + +Restore_Screen: + LD C,Dss.GetVMod + RST ToDSS + AND #80 + RET Z + LD BC,1 * 256 + Dss.SetVMod + LD A,Dss.SetVMod.txt80x32 + JP ToDSS + + + +; цвет экрана шелла +color_screen: + db 07h + + +; Имя файла "autoexec.bat" +autoexec_fname: + db "system.bat",0 + + +; бит-флаги опций самого шелла +RUNMODE: db 0 + + + +; буфер расш. файла +T8C1A: ds 3 + db 0 + +T8C1E: db "BAT" ; расш. bat-файла +T8C21: db "ON",0 +T8C24: db "OFF",0 + + + include "edline.asm" ; строка редактирования + include "batch.asm" ; парсинг bat-файлов + include "shell_exec.asm" ; выполн. введ. команд с консоли + include "error.asm" ; функции вывода сообщений ошибок + ; + include "Commands/exit.asm" ; выход в родит. процесс + include "Commands/pause.asm" ; пауза + include "Commands/rem.asm" ; комментарий + include "Commands/ver.asm" ; вывод версии ДОС + include "Commands/cls.asm" ; очистка экрана + include "Commands/date.asm" ; вывод или установка даты/времени + include "Commands/dir.asm" ; вывод списка директории + include "Commands/chdir.asm" ; смена тек. каталога + include "Commands/mkdir.asm" ; создание каталога + include "Commands/rmdir.asm" ; удаление каталога + include "Commands/del.asm" ; удаление файла + include "Commands/ren.asm" ; переименование файла или каталога + include "Commands/echo.asm" ; эхо-режим + include "Commands/help.asm" ; вывод экрана помощи + include "Commands/path.asm" ; задать сист. путь + include "Commands/set.asm" ; задать переменную окружения + include "Commands/reboot.asm" ; софт ресет + ; +; \ No newline at end of file diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM new file mode 100644 index 0000000..de9b2d9 --- /dev/null +++ b/SHELL/SHELL_EXEC.ASM @@ -0,0 +1,193 @@ +; раб. ячейка +D8374: dw 0 + + + +;------------------------------------------------------------- +; Разбор и выполнение введенных команд и имен файлов +;------------------------------------------------------------- +A82E7: call EVALCMD ; (batch.asm) + ld hl,struct_input_line+5 + dec hl + ;ld hl,struct_input_line+4;; + ld c,(hl) ; длина строки + ld b,0 + inc hl ; struct_input_line+5 + ;ld hl,work_buffer+256;; +A82F2: ld a,(hl) + cp " " + jr nz,A82FC + inc hl + dec c + jr nz,A82F2 + ret + ; +A82FC: ld d,h + ld e,l + add hl,bc + ld (hl),0 + sbc hl,bc + ld a,c + ex af,af' + ld a," " + cpir + jr nz,A830C + inc c +A830C: ex af,af' + sub c + ld c,a + ld hl,CMDLIST ; список команд ДОС-а + ; de=struct_input_line+5, c=длина строки +; от bat-отработки +A8312: push bc + push de +A8314: ld a,(de) + cp "a" + jr c,A8321 + cp "z"+1 + jr nc,A8321 + and 5Fh ; a..z -> A..Z +A8321: cp (hl) + jr nz,COMP002 ; не дос-команды + inc hl + inc de + dec c + jr nz,A8314 + xor a + cp (hl) + jr nz,COMP002 + pop bc + pop bc + ld a,(de) + cp " " + jr nz,A8338 + inc de +A8338: inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + jp (hl) ; на соотв. обработчик дос-команды + +; Не дос-команды. Тест на задание диска и запуск файла +COMP002: xor a + LD C,A + CPIR + inc hl + inc hl + pop de + pop bc + ld a,(hl) + or a + jr nz,A8312 ; назад в цикл, еще не дошли конца списка дос-команд + ld h,d + ld l,e + ; hl=struct_input_line+5 + ld b,(hl) ;+0 1-й символ + inc hl + ld c,(hl) ;+1 2-й символ + inc hl + ld a,(hl) ;+2 3-й символ + or a ; задан диск типа "x:" ? + jr nz,A8376 ; нет, имеем больше 2-х символов + ld a,":" ; постфикс буквы диска + cp c ; 2-й символ + jr nz,A8376 ; задан не диск + ld a,b ; 1-й символ + cp "a" + jr c,A8369 + cp "z"+1 + jr nc,A8369 + and 5Fh ; a..z -> A..Z +A8369: sub "A" ; номер диска + ld c,Dss.ChDisk ; сменить тек. диск + RST ToDSS + jp c,print_err_message ; вывод сообщения + ; тест на существование папки на целевом диске + ld hl,system_path ; буфер сист. пути + ld c,Dss.ChDir ; уст. тек. путь + RST ToDSS + jp nc,save_disk_path ; Ok + ; уст. корень, нет такой папки на новом диске + ld hl,system_path+1 ; буфер сист. пути + ld (hl),0 + dec hl + ld (hl),'\' + ld c,Dss.ChDir ; уст. тек. путь + RST ToDSS + jp c,print_err_message ; вывод сообщения + jp save_disk_path ; Ok + +; задан не диск +A8376: ex de,hl ; восст. адрес начала строки + ld (D8374),hl ; struct_input_line+5 + ld de,T8C1A ; буфер + ld bc,4*256 + Dss.EX_Path ; выделить расш. файла + RST ToDSS + ld hl,(D8374) ; имя файла + jr c,A83D7 ; выполнить exe-файл + bit 1,a ; есть расш. ? + jr z,A839D ; нет + ; есть расш. файла + ld de,T8C1A ; буфер расш. файла + ld hl,T8C1E ; "BAT" + ld b,3 ; длина сравнения + call A874E ; сравнить строки + ld hl,(D8374) + jp z,A83E8 ; выполнить bat-файл (batch.asm) + jr A83D7 ; выполнить exe-файл + +A839D: ld bc,0*256 + Dss.Exec ; загр. и выполнить программу + RST ToDSS + ;R10 + CALL Restore_Screen + ;R10 + ret nc ; Ok + ld hl,(D8374) + cp 3 ; код ошибки "файл не обнаружен" + jr nz,A83DD + push hl + ;ld a,(D96AD) ;; длина строки (inline.asm) + ld a,(struct_input_line+4) ; длина строки + ld b,a +A83AF: ld a,(hl) + cp " "+1 + jr c,A83B7 + inc hl + djnz A83AF +A83B7: ld e,b + ld d,0 + add hl,de + push hl + ld e,4 + add hl,de + pop de + ex de,hl + ld c,b + ld b,0 + inc c + lddr + inc hl + ld (hl),"." + inc hl + ld (hl),"B" + inc hl + ld (hl),"A" + inc hl + ld (hl),"T" + pop hl + jp A83E8 ; выполнить bat-файл (batch.asm) + + +; Выполнить exe-файл +; hl=имя файла +A83D7: ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл + RST ToDSS + ;R10 + CALL Restore_Screen + ;R10 + ret nc +A83DD: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" + jp nc,print_err_message ; вывод сообщения + xor a ; индекс "Bad command or file name" + jp print_err_message diff --git a/SHELL/build.txt b/SHELL/build.txt new file mode 100644 index 0000000..7c6ba0f --- /dev/null +++ b/SHELL/build.txt @@ -0,0 +1 @@ +55 \ No newline at end of file diff --git a/SHELL/version.inc b/SHELL/version.inc new file mode 100644 index 0000000..d78a3bc --- /dev/null +++ b/SHELL/version.inc @@ -0,0 +1,22 @@ +;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] + LUA PASS1 + Console_build = increase_build("./SHELL/build.txt") + if Console_build > 999 then + Console_build = 999 + print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a") + end + ENDLUA + LUA ALLPASS + sj.insert_label("lua_BUILD", Console_build) + ENDLUA +;---------------------------------------------------------------------[] + +; +; Shell full version +; номер версии (0..9) +CONSOLE_VERS EQU 1 +; номер модификации (0..99) +CONSOLE_MODF EQU 2 +; номер билда (0..999) +CONSOLE_BUILD EQU lua_BUILD +; \ No newline at end of file From a99ed14bda46fcaacc775179cdfb6e72769f7ed6 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 12 Aug 2023 05:21:13 +1000 Subject: [PATCH 030/219] bug fix --- Console/build.txt | 2 +- DSS/DOS5.ASM | 8 +++-- DSS/INTMOUSE.ASM | 77 +++++++++++++++++++++++++++-------------- DSS/VIDEO.ASM | 4 +-- DSS/build.txt | 2 +- SHELL/Commands/ECHO.ASM | 2 +- SHELL/ERROR.ASM | 12 +++---- SHELL/SHELL.ASM | 7 ++-- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 10 files changed, 74 insertions(+), 44 deletions(-) diff --git a/Console/build.txt b/Console/build.txt index abc4eff..801f180 100644 --- a/Console/build.txt +++ b/Console/build.txt @@ -1 +1 @@ -46 \ No newline at end of file +47 \ No newline at end of file diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 3fca848..5259962 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -81,9 +81,10 @@ CREATE: CALL MASK RET C CALL SEARCH + JR C,CREAT ;NO FILE, CREAT NEW. CALL DELFILE ;FILE EXIST RECREAT - JR CREAT + JP CREAT ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM @@ -99,7 +100,8 @@ CREAT_N: CALL MASK RET C CALL SEARCH - LD A,7 + + LD A,DSS_Error.sys.FILE_EXISTS CCF RET C CREAT LD HL,MASKARE @@ -645,7 +647,7 @@ GETWORD: JR Z,.DRV_NAME LD (DE),A INC DE - CP '!' + CP ' '+1 CCF RET NC DJNZ .loop diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 648d1f5..f193a66 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -103,40 +103,40 @@ DMOUSE EQU #1A ; !FIXIT ; 5 - CURSOR IMAGE VERY BIG INTMOUS BIT 7,C - JP NZ,EMOUSE + JR NZ,EMOUSE INC C DEC C - JP Z,MS_INIT + JR Z,MS_INIT ; 0 DEC C - JP Z,MS_SHOW + JR Z,MS_SHOW ; 1 DEC C - JP Z,MS_HIDD + JP Z,MS_HIDD ; 2 DEC C - JP Z,MS_READ + JP Z,MS_READ ; 3 DEC C - JP Z,MS_GOTO + JP Z,MS_GOTO ; 4 DEC C - JP Z,MS_RESR + JR Z,MS_RESR ; 5 DEC C - JP Z,MS_RESR + JR Z,MS_RESR ; 6 DEC C - JP Z,MS_VERT + JP Z,MS_VERT ; 7 DEC C - JP Z,MS_HORZ + JP Z,MS_HORZ ; 8 DEC C - JP Z,MS_CURS + JP Z,MS_CURS ; 9 DEC C - JP Z,MS_MASK + JP Z,MS_MASK ; 10 DEC C - JP Z,MS_BCUR + JP Z,MS_BCUR ; 11 DEC C - JP Z,MS_RESR + JR Z,MS_RESR ; 12 DEC C - JP Z,MS_RESR + JR Z,MS_RESR ; 13 DEC C - JP Z,MS_GSEN + JP Z,MS_GSEN ; 14 DEC C - JP Z,MS_SENT + JP Z,MS_SENT ; 15 MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET @@ -637,7 +637,7 @@ MS003 POP BC XOR A RET -READ_M IN A,(CMOUSE) +READ_M: IN A,(CMOUSE) RRCA RET NC IN A,(DMOUSE) @@ -645,18 +645,43 @@ READ_M IN A,(CMOUSE) BIT 6,A CCF RET Z -TST_01 IN A,(CMOUSE) + + ;!TEST mouse freeeeezzzz + LD BC,#2000 + ; +TST_01: IN A,(CMOUSE) RRCA - JP NC,TST_01 - IN A,(DMOUSE) + ;!TEST mouse freeeeezzzz + JR C,.NXT + DEC BC + LD A,B + OR C + JR NZ,TST_01 + ;JR NC,TST_01 + RET + ; + +.NXT: IN A,(DMOUSE) LD E,A BIT 6,A CCF RET NZ -TST_02 IN A,(CMOUSE) - RRCA - JR NC,TST_02 - IN A,(DMOUSE) + + ;!TEST mouse freeeeezzzz + LD BC,#2000 + ; +TST_02: IN A,(CMOUSE) + RRCA + ;!TEST mouse freeeeezzzz + JR C,.NXT + DEC BC + LD A,B + OR C + JR NZ,TST_02 + ;JR NC,TST_02 + RET + ; +.NXT: IN A,(DMOUSE) LD D,A BIT 6,A CCF @@ -711,7 +736,7 @@ MCORECT LD HL,(PIX_X) LD HL,(MAX_X) AND A SBC HL,DE - JP NC,YCOO + JR NC,YCOO LD HL,(MAX_X) LD (PIX_X),HL JP YCOO diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index b228405..6bce28c 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -428,9 +428,9 @@ GRAPH: CALL SAVETXT AND #7F JR Z,G320_16 ; !TODO ? - пока отрабатывает как ошибка DEC A - JP Z,G320_56 + JR Z,G320_56 DEC A - JP Z,G640_16 + JR Z,G640_16 ; DEC A ; JP Z,G640_56 ; !TODO ? - пока отрабатывает как ошибка G320_16: LD A,DSS_Error.sys.INVALID_VIDEO_MODE diff --git a/DSS/build.txt b/DSS/build.txt index e3e1916..cc4f7f3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -187 \ No newline at end of file +218 \ No newline at end of file diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index d86c5b1..574fac5 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -35,7 +35,7 @@ A862E: ld a,(echo_mode) ; фла ld de,7 ; индекс "on" jr nz,$+5 ; false ld de,8 ; индекс "off" - call A8BC6 ; найти строку по индексу + call FMESAGE ; найти строку по индексу ld de,PRM1 ; куда (аргумент %1) call ncopy_string ; скопир. строку (с нулем), макс.15 симв. ld de,6 ; индекс "Echo is %1" diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM index 902f4fd..2796e94 100644 --- a/SHELL/ERROR.ASM +++ b/SHELL/ERROR.ASM @@ -8,7 +8,7 @@ print_err_message: inc de ld hl,ERR0 ; массив строк ld bc,ERR0.Size ; размер массива - call A8BCD ; найти строку + call LCPIR ; найти строку call PRINTZ ; формат. вывод строки call newline jp newline @@ -28,7 +28,7 @@ invalid_param: ; вход: de=индекс строки ;------------------------------------------------- MESSAGE: - call A8BC6 ; найти строку по индексу + call FMESAGE ; найти строку по индексу jp PRINTZ ; формат. вывод строки ;jp A82CC ; узнать и уст. полож. курсора @@ -36,14 +36,14 @@ MESSAGE: ; Найти строку по индексу ; вход: de=индекс строки ; выход: hl=строка -A8BC6: inc de +FMESAGE: inc de ld hl,MSG0 ; начало массива строк ld bc,MSG0.Size ; размер массива -A8BCD: xor a +LCPIR: xor a cpir ret po ret nz - ;R11 + ;R11 XOR A CP (HL) JR Z,.no_mess @@ -51,7 +51,7 @@ A8BCD: xor a dec de ld a,d or e - jr nz,A8BCD + jr nz,LCPIR ret .no_mess: INC HL RET diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 43a733f..0f7ab80 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -450,13 +450,16 @@ D8996: ret z Restore_Screen: + PUSH AF LD C,Dss.GetVMod RST ToDSS AND #80 - RET Z + JR Z,.exit LD BC,1 * 256 + Dss.SetVMod LD A,Dss.SetVMod.txt80x32 - JP ToDSS + RST ToDSS +.exit: POP AF + RET diff --git a/SHELL/build.txt b/SHELL/build.txt index 7c6ba0f..2ebc651 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -55 \ No newline at end of file +56 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 361bce6..cc0bf0d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 361bce691cf4130a703e57b8fc7b3b87d3b929de +Subproject commit cc0bf0dfac766dd97e7a5441b523034921cf3830 From 663016bd1670d0bb3cedaae96b78ceba7f5c4895 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 15 Aug 2023 04:41:57 +1000 Subject: [PATCH 031/219] New rescan drives feature - save bootdisk letter after rescan --- BOOT/DSSBOOT.ASM | 2 +- DSS/DOS_X.ASM | 173 ++++++++++++++++++++++- DSS/DRV-MAIN.ASM | 214 ++++++++++++++++++++++++++++- DSS/DSS_MACROSES.Z80 | 12 ++ DSS/Media_drivers/ide-drv.asm | 34 +++-- DSS/Media_drivers/ram_disk-drv.asm | 12 +- DSS/Media_drivers/shared-drv.asm | 24 ++-- DSS/build.txt | 2 +- DSS/defines.inc | 10 +- Shared_Includes | 2 +- 10 files changed, 440 insertions(+), 45 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index b08db66..8bdf584 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -35,7 +35,7 @@ DRIVE: _mSYSID BIT 7,A JR Z,GOOD_DRIVE EX DE,HL - LD DE,2*256 + 21 ; если версия ниже 2.21, то ошибка + LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка SBC HL,DE LD A,INCORR JR C,FAIL diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 814c550..f3d07fb 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -161,7 +161,7 @@ FRESP2: LD D,B AND A RET -LDRIVE: DB #FF +LDRIVE: DB DSS_MAX_DRIVES_AMOUNT TDRIVE: DB #00 TCLUST: DW #0000 TCOUNT: DW #0000 @@ -426,7 +426,7 @@ RDERR1: LD A,DSS_Error.sys.NOT_READY ;SCF RET -; +;!FIXIT к буферам! FatBuffer: .MSG: DB 'FAT' .READ_PG: DB #00 @@ -527,13 +527,29 @@ BACK_CUR_PATH: ;R11 ;R12 -;///////////////////////////////////////////////////////////////////// +;/////////////////////////////////////////////////////////////////////// ; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. ; ; вход: нет ; выход: A - номер последнего лог. диска в системе -;///////////////////////////////////////////////////////////////////// +;/////////////////////////////////////////////////////////////////////// SCANDRV: +;1 [-----------] [-----------] [-----------] [-----------] [-----------] + CALL GETBOOT + LD (.old_letter),A ; bootdisk Log.number +; [-----------] + +;2 [-----------] [-----------] [-----------] [-----------] [-----------] + ; A = bootdisk Log.number + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + EX AF,AF' + LD (.old_DRIVE_ID),A +; [-----------] + + +;3 [-----------] [-----------] [-----------] [-----------] [-----------] ;!TEST в DRV-MAIN могут быть проблемы с прерываниями ;DI LD A,Dss.DRV.RescanDRV @@ -542,7 +558,154 @@ SCANDRV: LD (LDRIVE),A ;EI ; - RET +; [-----------] + +;4 [-----------] [-----------] [-----------] [-----------] [-----------] +.old_DRIVE_ID+1: + LD A,0 + CALL SETBOOT + JR C,.ERROR_BOOTDRV_DIES + LD (.new_letter),A +; + +;5 [-----------] [-----------] [-----------] [-----------] [-----------] + AND A + LD A,R + PUSH AF + DI + ;;;;;;;; + IN A,(SLOT3) + LD (.restore_page),A + LD A,(DRV_PG_NUMBER) + OUT (SLOT3),A + ;;;;; + + ; вычисляем смещение bootdisk в новой таблице DEVICE +.new_letter+1: + LD A,0 + CALL .get_entry_addr + PUSH HL + ; сохраняем значения нового boot + LD DE,.TMP_BUFFER + LD BC,DEVICE.TBL_Entry + LDIR + ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE +.old_letter+1: + LD A,0 + CALL .get_entry_addr + ; меняем букву диска для девайса занявшего старую букву bootdisk + POP DE + LD BC,DEVICE.TBL_Entry + LDIR + ; восстанавливаем bootdisk на старое место + DEC HL + LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 + LD BC,DEVICE.TBL_Entry + EX DE,HL + LDDR + ; проверяем, не увеличилось ли значение LDRIVE + LD HL,.old_letter + LD A,(LDRIVE) + CP (HL) + JR NC,.no_change_LDRIVE + LD A,(HL) + LD (LDRIVE),A +.no_change_LDRIVE: + ; + ;;;;; +.restore_page+1: + LD A,0 + OUT (SLOT3),A + ;;;;;;;; + POP AF + LD A,(LDRIVE) + RET PO + EI + + RET +.ERROR_BOOTDRV_DIES: + LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_OPEN_S + LD E,0 + RST ToBIOS + + LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_CLS_WIN + LD DE,0 + LD HL,#2050 + RST ToBIOS + + LD A,1 + OUT (RGMOD),A ; set scr-2 + + LD HL,.ERROR_MSG + LD DE,#A000 + LD BC,.ERROR_MSG.size + LD A,C + LDIR + + LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + + LD HL,#A000 + LD DE,0*256 + COLORS.FLASH + COLORS.PAPER.BLUE + COLORS.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + +.loop: DI + HALT + JR .loop + +.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +.ERROR_MSG.size EQU $-.ERROR_MSG +.get_entry_addr: + _CALC_DEVICE_ENTRY DEVICE + #C000 + RET +; +.TMP_BUFFER: BLOCK 3,#FF + MODULE COLORS +; +INC: +.BLACK EQU #00 +.BLUE EQU #01 +.GREEN EQU #02 +.CYAN EQU #03 +.RED EQU #04 +.MAGENTA EQU #05 +.BROWN EQU #06 +.LGRAY EQU #07 +.DGRAY EQU #08 +.LBLUE EQU #09 +.LGREEN EQU #0A +.LCYAN EQU #0B +.LRED EQU #0C +.LMAGENT EQU #0D +.YELLOW EQU #0E +.WHITE EQU #0F +PAPER: +.BLACK EQU 16*INC.BLACK +.BLUE EQU 16*INC.BLUE +.GREEN EQU 16*INC.GREEN +.CYAN EQU 16*INC.CYAN +.RED EQU 16*INC.RED +.MAGENTA EQU 16*INC.MAGENTA +.BROWN EQU 16*INC.BROWN +.LGRAY EQU 16*INC.LGRAY +.DGRAY EQU 16*INC.DGRAY +.LBLUE EQU 16*INC.LBLUE +.LGREEN EQU 16*INC.LGREEN +.LCYAN EQU 16*INC.LCYAN +.LRED EQU 16*INC.LRED +.LMAGENT EQU 16*INC.LMAGENT +.YELLOW EQU 16*INC.YELLOW +.WHITE EQU 16*INC.WHITE + +FLASH EQU #80 + ENDMODULE +; .old_letter: DB #FF +; .old_DRIVE_ID: DB #FF +; .new_letter: DB #FF +;/////////////////////////////////////////////////////////////////////// ;R12 diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index b4a201f..1f0eebb 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -191,7 +191,7 @@ A0066: JP DRV_PAGE.NMI ; ; <[DRIVE PAGE SWITCH]> ; _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: PUSH BC ; -.RETBANK+2: LD BC,0*256+SLOT0 ; +.RETBANK+2: LD BC,SLOT0 + 0*256; .switch: OUT (C),B ; ASSERT $!=84,'-> Portal error!'; ;Entry point from DSS main page @@ -218,6 +218,215 @@ PORTAL.outDRV: ; ; ; + +/* +; !!! ВЫЗЫВАТЬ ТОЛЬКО ЧЕРЕЗ RST #10 в DSS-MAIN !!! +RESCAN_DRV: + AND A + LD A,R + PUSH AF + DI + ;; + IN A,(SLOT3) + LD (.restore_page),A + LD A,(PORTAL.out_DRV.RETBANK) + OUT (SLOT3),A + LD A,(BOOTDRV+#C000) ; узнали лог.номер boot диска + LD (.BOOT),A ; сохранили +.restore_page+1: + LD A,0 + OUT (SLOT3),A + + LD A,(.BOOT) + CP 2 + JR C,.Change ; bootdisk - дискета? + + LD C,A + ADD A + ADD C + LD HL,DEVICE + LD C,A + XOR A + LD B,A + ADC HL,BC + LD DE,.DEVICE + LD BC,3 ;!HARDCODE длина записи в DEVICE + LDIR ; сохранили запись boot-dsk + ;!TODO тут пока работает вариант замены буквы для boot-RAM-DRV и HDD + LD DE,.DEVICE+1 + LD HL,HDDRIVE + AND A + SBC HL,DE + JR Z,.HDD_SYS + ; + LD HL,RMDRIVE + AND A + SBC HL,DE + JR NZ,.Change + ; +.RMD_SYS: + LD A,#60 + LD (.BOOT_TYPE),A + LD A,(.DEVICE) + LD HL,RAMDTBL + SLA A + ADD A,L + LD L,A + LD A,0 + ADC A,H + LD H,A + ;Тут в HL адрес первого байта записи о boot RAM-DRV + LD DE,.RAMDTBL + LD BC,RAMDTBL.TBL_Entry + LDIR ; сохранили запись о RAM-DRV + JP .Change + ; +.HDD_SYS: + LD A,#80 + LD (.BOOT_TYPE),A + ; + LD A,(.DEVICE) + ADD A,A + ADD A,A + ADD A,A + ADD A,A + LD HL,LOGDRV + ADD A,L + LD L,A + LD A,0 + ADC A,H + LD H,A + ; Тут в HL адрес первого байта записи о boot разделе + LD DE,.LOGDRV + LD BC,LOGDRV.TBL_Entry + LDIR ; сохранили запись о HDD разделе + + ;JP .Change +.Change: CALL INITDVC_RET_DRIVE + LD A,(.BOOT) + CP 2 + JR C,.exit ; bootdisk - дискета? + + ; 3. Проверить, сменилась ли буква boot-drv и выйти, если нет. + ; 4. Если boot HDD и его букву занял HDD, то меняем местами их + ; записи в таблицах DEVICE и LOGDRV. + ; Если boot HDD и его букву занял RAM Drive, то иди нахер, не может быть)). + ; Если boot FDD то нихера не случится. + ; Если boot CD-ROM, то подумаем, когда до этого доживём. + ; Если boot RAM Drive и его букву занял HDD, то нужно сменить + ; их местами в таблице DEVICE. + ; !!!!! что будет, если буква бут-диска Е, а после рескана + ; загрузочный раздел оказался единственным в системе? + ; А если сразу будут изменения с RAM дисками и HDD разделами? + + LD A,(.BOOT_TYPE) + CP #60 ;!HARDCODE ram drive + JR NZ,.restore_HDD +.restore_RMD: + LD A,(.RAMDTBL+1) + LD HL,RAMDTBL+1 + LD B,RAMDTBL.Size / RAMDTBL.TBL_Entry + +.loop_RMD: + CP (HL) + JR Z,.found_RMD ; ZF - нашли в новой RAMDTBL bootdisk по его физическому номеру + INC HL + INC HL + DJNZ .loop_RMD + JP .BIG_ERROR ; bootdisk died... + +.found_RMD: + LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry + SUB B + LD (.DEVICE),A ; new bootdisk log.number in RAMDTBL + DEC HL + LD A,(HL) ; логический номер для поиска в DEVICE + LD (.DEVICE_NEW),A ; сохраняем + + ; поиск номера записи по её логическому диску + процедуре обработчика + LD HL,DEVICE-DEVICE.TBL_Entry + LD DE,DEVICE.TBL_Entry + LD BC,DEVICE.Size / DEVICE.TBL_Entry +.found_RMD.nxt: + AND A + ADC HL,DE + PUSH HL + EXX + POP HL + LD DE,.DEVICE + LD B,DEVICE.TBL_Entry + CALL COMPARE_BYTES + EXX + JR Z, found entry + DJNZ NZ,.found_RMD.nxt +.BIG_ERROR: + ;;;; + + + LD BC,DEVICE.Size / DEVICE.TBL_Entry + AND A + + ; длина записи. сравниваем на полное совпадение .DEVICE с + ; одной из записей DEVICE + LD B,DEVICE.TBL_Entry +.rmd_loop_search: + LD A,(DE) + CP (HL) + JR NZ,.nxt_loop_ + INC DE + INC HL + DJNZ .rmd_loop_search + + POP BC + + + ;JP P,.BIG_ERROR ; если прошерстили за пределы таблицы + + ; + JP .exit + ; +.restore_HDD: + + ;JP .exit + ;; +.exit: LD HL,.Start_buffer + LD (HL),#FF + LD DE,.Start_buffer+1 + LD BC,.Size_buffer-1 + LDIR ; помыть за собою)) + + POP AF + LD A,(DRV_PAGE.LDRIVE) + RET PO + EI + RET +.Start_buffer: +.BOOT: DB #FF ; логический номер +.BOOT_TYPE: DB #FF ; 00, #60, #80, #C0 +.DEVICE: BLOCK 3,#FF +.DEVICE_NEW: BLOCK 3,#FF +.LOGDRV: BLOCK 16,#FF +.RAMDTBL: BLOCK 2,#FF ; лог RMD, физ RMD +.Size_buffer EQU $-.Start_buffer + +;ВХОД: HL,DE - адреса сравниваемых блоков, B - длина блока +;ВЫХОД: ZF - блоки одинаковы, в HL и DE адреса следующего байта после совпавшего блока +; NZ - блоки неодинаковы. +COMPARE_BYTES: + LD A,(DE) + CP (HL) + RET NZ + INC HL + INC DE + DJNZ COMPARE_BYTES + XOR A + RET + +*/ + + +DRV_PAGE.LDRIVE: DB #00 + DISPATCH: LD HL,INTDISK LD (ADCALL),HL @@ -226,9 +435,6 @@ INITDVC_RET_DRIVE: LD A,(DRV_PAGE.LDRIVE) AND A RET -; - -DRV_PAGE.LDRIVE: DB #00 INCLUDE 'dss/media_drivers/shared-drv.asm' INCLUDE 'dss/media_drivers/ide-drv.asm' diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index b4c759b..87c8c70 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -1,4 +1,16 @@ +; + MACRO _CALC_DEVICE_ENTRY tbl_addr + LD C,A + ADD A,A + ADD A,C + LD C,A + LD B,0 + LD HL,tbl_addr + ADD HL,BC + ENDM +; + ; MACRO SET_PAGE_X new_page IF OLD_SET_BANK diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index ced41ea..b4ba3b2 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -169,8 +169,6 @@ ; 12 (0Ch) - BUSY (DEVICE OPENED) ; 13 (0Dh) - RESERVED -LD_DSK EQU 16 ; максимальное количество логических дисков в системе - ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 PART EQU #C000 @@ -304,7 +302,6 @@ DRVCLC: INC A ; DS 28 ;RESERVED - ;+00 ;SECTORS PER TRACK ;+01 ;TRACKS PER CYLLINDER ;+02 ;RESERVED @@ -315,24 +312,35 @@ DRVCLC: INC A ;+07 ;RESERVED -LOGDRV: BLOCK 16*LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 -.Size EQU $-LOGDRV - +LOGDRV: BLOCK .TBL_Entry*LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы +.TBL_Entry EQU 16 +.Size EQU $-LOGDRV SELHDD: PUSH DE PUSH BC PUSH HL - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL + ;!TEST + ;SLA A + ;RLCA + ;SLA A + ;LD L,A + ;LD H,0 + ;RL H + ;ADD HL,HL + ; + ; original + LD L,A + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ; EX DE,HL LD IY,LOGDRV ADD IY,DE @@ -547,7 +555,7 @@ GBPB_H: PUSH IY ; DE - ADDRESS ; B - COUNTER ; A'- PAGE -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;READ SECTOR LREADH: PUSH IY CALL SELHDD diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 34417d1..87bb46e 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -332,7 +332,7 @@ INIT_RD: JP 1F .noDRV: POP BC 1: INC B - LD A,RAMDTBL.Size / 2 + LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry CP B JR NZ,.initLoop @@ -345,13 +345,15 @@ INIT_RD: ; LD HL,ENDDRVR AND A RET - + +;!TODO воткнуть эти всякие таблицы в конец файла и активировать как структуры, чтоб бинарник меньше весил ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL: DUP MAX_RAMDRIVES * 2 +; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER +RAMDTBL.TBL_Entry EQU 2 +RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry DB #FF EDUP -.Size EQU $-RAMDTBL +.Size EQU $-RAMDTBL ; diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index 03acf6a..c4c3541 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -123,7 +123,6 @@ ; RST 18h. Вектор дисковых устройств ; вход: a=номер устройства (0-25) ;------------------------------------------------- -DSS_MAX_DRIVES_AMOUNT EQU 26 INTDISK: ;R01 CP #FF @@ -133,14 +132,17 @@ INTDISK: .noNeedRescan: ; PUSH HL - PUSH BC - LD C,A - ADD A,A - ADD A,C - LD C,A - LD B,0 - LD HL,DEVICE - ADD HL,BC + PUSH BC + + _CALC_DEVICE_ENTRY DEVICE + ; LD C,A + ; ADD A,A + ; ADD A,C + ; LD C,A + ; LD B,0 + ; LD HL,DEVICE + ; ADD HL,BC + LD A,(HL) INC A JR Z,NODEV @@ -153,7 +155,6 @@ INTDISK: POP BC EX (SP),HL RET - NODEV: POP BC POP HL LD A,DSS_Error.drv.INVALID_DRIVE @@ -161,8 +162,9 @@ NODEV: POP BC RET PDEVICE DW DEVICE -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*.TBL_Entry,#FF .Size: DB #FF +.TBL_Entry EQU 3 FLOPPY EQU #0001 FIXED EQU #0002 diff --git a/DSS/build.txt b/DSS/build.txt index cc4f7f3..b6e2760 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -218 \ No newline at end of file +242 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 045fb07..ff987ef 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -3,17 +3,19 @@ ; ; - DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. + DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. ; ; +LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе +DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE MAX_RAMDRIVES 16 DEFINE NeedSafePort_Y 1 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 DEFINE SAVE_PATH_MACRO 0 - DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 + DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; DEFINE USING_MEMPAGES 4 @@ -28,7 +30,7 @@ ENVPAGE EQU 2 DRVPAGE EQU 3 ; -DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 +DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 @@ -36,7 +38,7 @@ ENVADDR EQU #E400 DIR EQU #C000 FAT EQU #C000 -FMCOUNT EQU 10 ; Количество файловых манипуляторов +FMCOUNT EQU 10 ; Количество файловых манипуляторов HANDBUF.SIZE EQU 32 ;----------------------------------------------------; ; diff --git a/Shared_Includes b/Shared_Includes index cc0bf0d..84a9262 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit cc0bf0dfac766dd97e7a5441b523034921cf3830 +Subproject commit 84a92620cab98867eb5b892d1ae17cd206c2b1bd From c1bad465f85359e01c214b10446ed5b891e6a443 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 16 Aug 2023 21:14:02 +1000 Subject: [PATCH 032/219] ... --- BOOT/boot.asm | 12 +++--- Console/build.txt | 2 +- DSS/DOS5.ASM | 96 ++++++++++++++++++++++-------------------- DSS/DOS_X.ASM | 12 +++--- DSS/DSS-MAIN.ASM | 4 +- DSS/DSS_MACROSES.Z80 | 99 ++++++++++++++++++++++++++++++++++++++++++++ DSS/KEYINTER.ASM | 20 ++++----- DSS/build.txt | 2 +- SHELL/SHELL.ASM | 26 ++++++++---- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 11 files changed, 196 insertions(+), 81 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index c4a7479..f943d99 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -40,14 +40,14 @@ major_version equ 1 ; minor_version equ 5 ; мл. номер ;; -org_addr EQU #8000 + CLP_Buffer -code_addr EQU BEGIN -program_start EQU BEGIN -stack_point EQU #C000 -Loader_length EQU 0 +org_addr EQU #8000 + CLP_Buffer +code_addr EQU BEGIN +program_start EQU BEGIN +stack_point EQU #BFFE +Loader_length EQU 0 ; -page_buffer equ 0C000h ; буфер файлов +page_buffer equ #C000 ; буфер файлов ;; include 'Shared_Includes/constants/EXE_Header.z80' diff --git a/Console/build.txt b/Console/build.txt index 801f180..31ff414 100644 --- a/Console/build.txt +++ b/Console/build.txt @@ -1 +1 @@ -47 \ No newline at end of file +48 \ No newline at end of file diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 5259962..6136a7d 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -1068,57 +1068,61 @@ DIRSIZE: WORD 0 ; раз ; Массив лог. номеров банок расширения ДОС BANKTBL: BLOCK USING_MEMPAGES+1,#FF + + ;!TODO +GHANDLE: +; PUSH DE +; PUSH HL +; PUSH IX +; CALL TESTDSK +; JP C,G_HAND1 +; CALL LOADDIR +; POP DE +; LD HL,DIR +; LD BC,#0020 +;G_HAND2: +; LD A,D +; OR E +; JP Z,G_HAND3 +; ADD HL,BC +; DEC DE +; JP G_HAND2 +;G_HAND3: +; EXX +; POP DE +; EXX +;G_HAND4: +; EX DE,HL +; LD A,DIRPAGE +; CALL BANK +; EX DE,HL +; LD DE,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; OUT (SLOT3),A +; LD HL,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; POP BC +; DEC BC +; LD A,B +; OR C +; RET Z +; PUSH BC +; JP G_HAND4 ;G_HAND1 POP IX ; POP HL ; POP DE ; RET - -;GHANDLE PUSH DE -; PUSH HL -; PUSH IX -; CALL TESTDSK -; JP C,G_HAND1 -; CALL LOADDIR -; POP DE -; LD HL,DIR -; LD BC,#0020 -;G_HAND2 LD A,D -; OR E -; JP Z,G_HAND3 -; ADD HL,BC -; DEC DE -; JP G_HAND2 -;G_HAND3 EXX -; POP DE -; EXX -;G_HAND4 EX DE,HL -; LD A,DIRPAGE -; CALL BANK -; EX DE,HL -; LD DE,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; OUT (SLOT3),A -; LD HL,HANDTA -; -; DUP 32 -; LDI -; EDUP - -; EXX -; POP BC -; DEC BC -; LD A,B -; OR C -; RET Z -; PUSH BC -; JP G_HAND4 - ;HANDTA BLOCK 32,0 diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index f3d07fb..29576fc 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -188,11 +188,12 @@ TCOUNT: DW #0000 ;R04H_SEC_X DW 0 ; !FIXIT чёт не используется -TESTDSK LD A,(FatBuffer.DRIVE) - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - OR A - RET Z +TESTDSK: + ; LD A,(FatBuffer.DRIVE) + ; LD C,Dss.DRV.MediaCheck + ; RST ToDSS.DRV + ; OR A + ; RET Z RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC @@ -621,7 +622,6 @@ SCANDRV: LD A,(LDRIVE) RET PO EI - RET .ERROR_BOOTDRV_DIES: LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_OPEN_S diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 5e219e9..de73b12 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -560,8 +560,8 @@ DEPLOY: ; ; LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY ; ; SCF ; RET - -; defb 0 + + ; defb 0 IF ENVVALUE != BUFFER ASSERT "Warning! ENVVALUE != BUFFER" diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 87c8c70..cf1ca15 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -1,3 +1,102 @@ +; + MACRO BUFFER_KEYINTER + _mInfoALIGN 256,0 +;KEYBOARD BUFFER +SBUF: BLOCK 64,0 + + +HEAD DB #00 +HOST DB #00 + +K_LOCK EQU $-KEYFLAG +LANG_L EQU 7 +PAUSE_L EQU 6 +RES5_L EQU 5 +RES4_L EQU 4 +NUM_L EQU 3 +SCRL_L EQU 2 +INS_L EQU 1 +CAPS_L EQU 0 +KEYFLAG DB #02 ;D0-Key Pressed + +K_SHIFT EQU $-KEYFLAG +L_SHIFT EQU 7 +R_SHIFT EQU 6 +X_CTRL EQU 5 +X_ALT EQU 4 +L_CTRL EQU 3 +L_ALT EQU 2 +R_CTRL EQU 1 +R_ALT EQU 0 +KEYCTRL DB #00 + +KEYFLG EQU $-KEYFLAG +FLAG_E0 EQU 7 +FLAG_F0 EQU 6 +FLAG_E1 EQU 5 +FLAG_04 EQU 4 +FLAG_03 EQU 3 +FLAG_02 EQU 2 +FLAG_01 EQU 1 +FLAG_00 EQU 0 + DB #00 + +SOUND_K EQU $-KEYFLAG +FLAG_S7 EQU 7 +FLAG_S6 EQU 6 +FLAG_S5 EQU 5 +FLAG_S4 EQU 4 +FLAG_S3 EQU 3 +FLAG_S2 EQU 2 +SF_ALT EQU 1 +SF_BUFF EQU 0 + DB #03 +; +; D15 - LShift +; D14 - RShift +; D13 - CTRL +; D12 - ALT +; D11 - LCTRL +; D10 - LALT +; D9 - RCTRL +; D8 - RALT +; D7 - Language Lock +; D6 - Reserved +; D5 - Reserved +; D4 - Reserved +; D3 - Num Lock +; D2 - Scroll Lock +; D1 - Insert Lock +; D0 - Caps Lock +; +; D15 - Keystroke +; D14 +; D13 \ +; D12 \ +; D11 -- Position code (0...5Ah) +; D10 / +; D9 / +; D8 +; D7..D0 - ASCII code +; + ENDM +; + +; + MACRO TABLE_XLAT_T + _mInfoALIGN 256,0 +; 0 1 2 3 4 5 6 7 8 9 A B C D E F +XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 + DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 + DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 + DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 + DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 + DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 + DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 + DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 + DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 + ENDM +; ; MACRO _CALC_DEVICE_ENTRY tbl_addr diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 6360c36..93883de 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -7,7 +7,7 @@ ;R02 13-04-2023 BAO FIX BUG IN K_CLEAR WITH STACK OVERFLOW ;R01 10-02-2003 DNS Add cursor visualisation ; - _mInfoALIGN 256,0 + _mInfoALIGN 256,0 ;KEYBOARD BUFFER SBUF: BLOCK 64,0 @@ -624,17 +624,17 @@ NSH6 RET ; ;; - _mInfoALIGN 256,0 + _mInfoALIGN 256,0 ; 0 1 2 3 4 5 6 7 8 9 A B C D E F XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 - DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 - DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 - DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 - DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 - DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 - DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 - DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 - DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 + DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 + DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 + DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 + DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 + DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 + DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 + DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 + DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 ; XLAT BIT FLAG_E0,(IX+KEYFLG) JR Z,W_O_E0 diff --git a/DSS/build.txt b/DSS/build.txt index b6e2760..dd4a900 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -242 \ No newline at end of file +254 \ No newline at end of file diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 0f7ab80..499b364 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -21,16 +21,23 @@ ; ; Program EQU section ;---------------------------------------------------------------------[] -CR EQU 13 -LF EQU 10 +CR EQU 13 +LF EQU 10 +true EQU 1 +false EQU 0 + +; Loader_length EQU 0 +; code_addr EQU shell +; program_start EQU shell +; stack_point EQU #BFFE +; org_addr EQU #8000 + CLP_Buffer ;---------------------------------------------------------------------[] ; -true equ 1 -false equ 0 -work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ;!FIXIT перенести в конец -work_buffer2 equ entry - 256 ; 3-й раб. буфер ;!FIXIT перенести в конец + +work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ; 128 bytes +work_buffer2 equ entry - 256 ; 3-й раб. буфер ; 256 bytes @@ -46,13 +53,15 @@ work_buffer2 equ entry - 256 ; 3- dw 0,0,0 ; резерв dw entry ; адрес загрузки кода dw shell ; адрес передачи управления - dw 0C000h ; адрес стека + dw #BFFE ; адрес стека ds 490 ; резерв ; Версия/Модификация/Билд шелла entry: db "0.01.003" ;!FIXIT перенести в конец +; INCLUDE 'Shared_Includes/constants/EXE_Header.z80' +; ORG org_addr ;============================================================== ; Точка входа в Шелл ;============================================================== @@ -510,4 +519,7 @@ T8C24: db "OFF",0 include "Commands/set.asm" ; задать переменную окружения include "Commands/reboot.asm" ; софт ресет ; + +;work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes +;work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes ; \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 2ebc651..4e9e288 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -56 \ No newline at end of file +63 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 84a9262..517e3de 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 84a92620cab98867eb5b892d1ae17cd206c2b1bd +Subproject commit 517e3de074aab733f683abb328a4ffc8e0a2b284 From 6224d9fcb64b7c236aa248eaf0875fae0849f02b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 8 Sep 2023 22:40:45 +1000 Subject: [PATCH 033/219] ... --- Console/build.txt | 2 +- DSS/EXECUTE.ASM | 2 +- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 4 ++-- SHELL/ERROR.ASM | 2 +- SHELL/SHELL.ASM | 52 ++++++++++++++++++++++---------------------- SHELL/SHELL_EXEC.ASM | 47 +++++++++++++++++++-------------------- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 9 files changed, 58 insertions(+), 57 deletions(-) diff --git a/Console/build.txt b/Console/build.txt index 31ff414..2e66562 100644 --- a/Console/build.txt +++ b/Console/build.txt @@ -1 +1 @@ -48 \ No newline at end of file +49 \ No newline at end of file diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 93fa16d..9147251 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -259,7 +259,7 @@ EX_PAT1: LD A,(HL) JR Z,PATH_YEP CP ":" JR Z,DRIVE_YEP - CP #21 + CP "!" JR C,NAME_YEP CP "?" JR Z,GLOBP1 diff --git a/DSS/build.txt b/DSS/build.txt index dd4a900..b8e817d 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -254 \ No newline at end of file +255 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 2781906..3495241 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -303,7 +303,7 @@ A8286: ex af,af' ld hl,BATLIST ; команды "pause","rem" + dos-команды ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - jp A8312 + jp COMP004 @@ -354,7 +354,7 @@ EVALSTR: ld a,(hl) ld (.TVAR_PNT),de jr nz,.TVAR1 inc hl - ld a,(hl) + ld a,(hl) ;!FIXIT я в console.asm исправлял баг с параметром %A например. Тут мои правки или Василя? cp "9"+1 jr c,.TVAR0 .TVAR2: ld a,"%" ; > "9" diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM index 2796e94..9b3fe64 100644 --- a/SHELL/ERROR.ASM +++ b/SHELL/ERROR.ASM @@ -139,7 +139,7 @@ MSG0: db 0 db "Volume Serial Number is %2",0Dh,0Ah db 0Dh,0Ah,"Directory of %3",0Dh,0Ah,0Ah,0 ; 1 - db "Estex DSS version %1. Console version %2.",CR,LF,0 ;R13 + db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 ; 2 db "Current date: %1",0Dh,0Ah,0 ;2 db "Current time: %1",0Dh,0Ah,0 ;3 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 499b364..766e994 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -26,42 +26,42 @@ LF EQU 10 true EQU 1 false EQU 0 -; Loader_length EQU 0 -; code_addr EQU shell -; program_start EQU shell -; stack_point EQU #BFFE -; org_addr EQU #8000 + CLP_Buffer +Loader_length EQU 0 +code_addr EQU shell +program_start EQU shell +stack_point EQU #BFFE +org_addr EQU #8000 + CLP_Buffer ;---------------------------------------------------------------------[] ; -work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ; 128 bytes -work_buffer2 equ entry - 256 ; 3-й раб. буфер ; 256 bytes +;work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ; 128 bytes +;work_buffer2 equ entry - 256 ; 3-й раб. буфер ; 256 bytes - org 7F00h + ; org 7F00h - db "EX" ; exe ID - db 45h ; exe тип - db 0 ; exe версия - dw 512 ; 512, мл. смещ. кода - dw 0 ; ст. смещ. кода - dw 0 ; end-beg, первичный загрузчик - dw 0,0,0 ; резерв - dw entry ; адрес загрузки кода - dw shell ; адрес передачи управления - dw #BFFE ; адрес стека - ds 490 ; резерв + ; db "EX" ; exe ID + ; db 45h ; exe тип + ; db 0 ; exe версия + ; dw 512 ; 512, мл. смещ. кода + ; dw 0 ; ст. смещ. кода + ; dw 0 ; end-beg, первичный загрузчик + ; dw 0,0,0 ; резерв + ; dw entry ; адрес загрузки кода + ; dw shell ; адрес передачи управления + ; dw #BFFE ; адрес стека + ; ds 490 ; резерв ; Версия/Модификация/Билд шелла -entry: db "0.01.003" ;!FIXIT перенести в конец +;entry: db "0.01.003" ;!FIXIT перенести в конец -; INCLUDE 'Shared_Includes/constants/EXE_Header.z80' -; ORG org_addr + INCLUDE 'Shared_Includes/constants/EXE_Header.z80' + ORG org_addr ;============================================================== ; Точка входа в Шелл ;============================================================== @@ -158,7 +158,7 @@ run_shell_loop1: or a jr z,run_shell_loop1 ; пустая ; Парсинг и выполнение команд - call A82E7 + call COMP jr run_shell_loop ; назад в цикл @@ -519,7 +519,7 @@ T8C24: db "OFF",0 include "Commands/set.asm" ; задать переменную окружения include "Commands/reboot.asm" ; софт ресет ; - -;work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes -;work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes + DISPLAY "Empty space for buffers from ",/H,$ +work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes +work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes ; \ No newline at end of file diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index de9b2d9..15b5da7 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -6,7 +6,7 @@ D8374: dw 0 ;------------------------------------------------------------- ; Разбор и выполнение введенных команд и имен файлов ;------------------------------------------------------------- -A82E7: call EVALCMD ; (batch.asm) +COMP: call EVALCMD ; (batch.asm) ld hl,struct_input_line+5 dec hl ;ld hl,struct_input_line+4;; @@ -14,15 +14,15 @@ A82E7: call EVALCMD ; (batch.asm) ld b,0 inc hl ; struct_input_line+5 ;ld hl,work_buffer+256;; -A82F2: ld a,(hl) +.loop: ld a,(hl) cp " " - jr nz,A82FC + jr nz,COMP01 inc hl dec c - jr nz,A82F2 + jr nz,.loop ret ; -A82FC: ld d,h +COMP01: ld d,h ld e,l add hl,bc ld (hl),0 @@ -31,28 +31,28 @@ A82FC: ld d,h ex af,af' ld a," " cpir - jr nz,A830C + jr nz,COMP005 inc c -A830C: ex af,af' +COMP005: ex af,af' sub c ld c,a ld hl,CMDLIST ; список команд ДОС-а ; de=struct_input_line+5, c=длина строки ; от bat-отработки -A8312: push bc +COMP004: push bc push de -A8314: ld a,(de) +COMP000: ld a,(de) cp "a" - jr c,A8321 + jr c,COMP001 cp "z"+1 - jr nc,A8321 - and 5Fh ; a..z -> A..Z -A8321: cp (hl) + jr nc,COMP001 + and #5F ; a..z -> A..Z +COMP001: cp (hl) jr nz,COMP002 ; не дос-команды inc hl inc de dec c - jr nz,A8314 + jr nz,COMP000 xor a cp (hl) jr nz,COMP002 @@ -60,9 +60,9 @@ A8321: cp (hl) pop bc ld a,(de) cp " " - jr nz,A8338 + jr nz,NOSPC inc de -A8338: inc hl +NOSPC: inc hl ld a,(hl) inc hl ld h,(hl) @@ -79,7 +79,7 @@ COMP002: xor a pop bc ld a,(hl) or a - jr nz,A8312 ; назад в цикл, еще не дошли конца списка дос-команд + jr nz,COMP004 ; назад в цикл, еще не дошли конца списка дос-команд ld h,d ld l,e ; hl=struct_input_line+5 @@ -89,17 +89,18 @@ COMP002: xor a inc hl ld a,(hl) ;+2 3-й символ or a ; задан диск типа "x:" ? - jr nz,A8376 ; нет, имеем больше 2-х символов + jr nz,RUN_EXT ; нет, имеем больше 2-х символов ld a,":" ; постфикс буквы диска cp c ; 2-й символ - jr nz,A8376 ; задан не диск + jr nz,RUN_EXT ; задан не диск ld a,b ; 1-й символ cp "a" - jr c,A8369 + jr c,NOUP cp "z"+1 - jr nc,A8369 + jr nc,NOUP and 5Fh ; a..z -> A..Z -A8369: sub "A" ; номер диска +;!!!!! тут восстанавливается директория и могут быть глюки на новом ядре +NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; вывод сообщения @@ -119,7 +120,7 @@ A8369: sub "A" ; jp save_disk_path ; Ok ; задан не диск -A8376: ex de,hl ; восст. адрес начала строки +RUN_EXT: ex de,hl ; восст. адрес начала строки ld (D8374),hl ; struct_input_line+5 ld de,T8C1A ; буфер ld bc,4*256 + Dss.EX_Path ; выделить расш. файла diff --git a/SHELL/build.txt b/SHELL/build.txt index 4e9e288..8323328 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -63 \ No newline at end of file +67 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 517e3de..7f4046e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 517e3de074aab733f683abb328a4ffc8e0a2b284 +Subproject commit 7f4046e7fabff85738efcf2a7aa1dbbeca7af906 From 8a1abd44ab983b55852793da397d07305bded6c1 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 15 Sep 2023 04:28:18 +1000 Subject: [PATCH 034/219] Optimized NSECTOR and RD_BPB --- DSS/DOS_FM.ASM | 84 +++++++++++++++----- DSS/DOS_X.ASM | 198 +++++++++++++++++++++-------------------------- DSS/DSS-MAIN.ASM | 1 + DSS/FAT_X.ASM | 28 +++---- DSS/build.txt | 2 +- DSS/defines.inc | 1 + Shared_Includes | 2 +- 7 files changed, 171 insertions(+), 145 deletions(-) diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index bca1372..976d700 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -179,7 +179,7 @@ BLOK_RD: PUSH BC LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV32 ;!FIXIT заменить вызов HLDE/BC на HLDE/C + CALL DIV_for_SPC ;!FIXIT заменить вызов HLDE/BC на HLDE/C ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb LD B,XH LD C,XL @@ -349,7 +349,7 @@ BLOK_WR PUSH BC LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV32 + CALL DIV_for_SPC LD B,XH LD C,XL @@ -565,22 +565,34 @@ READ: LD (R_POINT),HL ; JP C,RPERR1 ;Расчёт смещения в секторах - LD C,(IY+_sFM.F_POSITION) + ; LD C,(IY+_sFM.F_POSITION) + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD H,0 + ; OR A + ; RR L + ; RR D + ; RR E + LD H,0 + LD L,(IY+_sFM.F_POSITION+3) + LD D,(IY+_sFM.F_POSITION+2) LD E,(IY+_sFM.F_POSITION+1) LD A,E AND #01 LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A + LD C,(IY+_sFM.F_POSITION) + ;OR A RR L RR D RR E ;HL:DE FP (in sectors) ;BC FP residue (in bytes) ; - LD A,B + ;LD A,B OR C JP NZ,ROV1 ROV4: POP BC @@ -890,28 +902,58 @@ WOV3: PUSH HL ADC HL,BC JP WOV4 - +////////////// OLD //////////////// +; HL - CLUSTER +; HL:IX - SECTOR +; NSECTOR: DEC HL +; DEC HL +; EX DE,HL +; LD A,(BootSector.S_P_C) +; LD B,A +; LD HL,0 +; LD IX,0 +; ADD_DE1: ADD IX,DE +; JR NC,ADD_DE2 +; INC HL +; ADD_DE2: DJNZ ADD_DE1 +; LD DE,(FatBuffer.DAT_FRM) ;first data sector +; ADD IX,DE +; LD DE,#0000 +; ADC HL,DE +; RET +///////////////////////////////////// ; HL - CLUSTER ; HL:IX - SECTOR NSECTOR: DEC HL DEC HL - EX DE,HL + LD DE,0 LD A,(BootSector.S_P_C) - LD B,A - LD HL,0 - LD IX,0 -ADD_DE1: ADD IX,DE - JR NC,ADD_DE2 - INC HL -ADD_DE2: DJNZ ADD_DE1 - LD DE,(FatBuffer.DAT_FRM) + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + RRCA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D + LD DE,(FatBuffer.DAT_FRM) ;first data sector ADD IX,DE - LD DE,#0000 + ; A=0 + LD D,A + LD E,A ADC HL,DE RET +///////////////////////////////////// + ; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A -DIV32: LD A,C +DIV_for_SPC: + LD A,C DEC A JR Z,.exit ; @@ -923,7 +965,7 @@ DIV32: LD A,C .loop: SRL H : RR L RR D : RR E RRCA - JR NC,.loop + JP NC,.loop LD A,B ; .exit: LD XH,D diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 29576fc..b672853 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -210,25 +210,25 @@ RD_BPB: LD C,SLOT3 RST ToDSS.DRV POP BC OUT (C),B - JP C,RDERR1 + JP C,DOS_X_Error.Not_ready PUSH IY - LD DE,#AA55 ;R05 -;R08 LD HL,(BOOT+510) ;R07 - LD HL,(SECBUF+510) ;R08 - AND A ;R05 - SBC HL,DE ;R05 - JP NZ,ERR_BPB ;R05 -;R08 - LD HL,SECBUF ;R08 - LD DE,BootSector ;R08 - LD BC,_sBOOT_SEC ;R08 size - LDIR -;R08 + LD DE,#AA55 ;R05 + LD HL,(SECBUF+510) ;R08 ;R07 + ;R05 + AND A + SBC HL,DE + JP NZ,DOS_X_Error.UnknownBPB + ;R08 + LD HL,SECBUF + LD DE,BootSector + LD BC,_sBOOT_SEC ; size + LDIR + ; LD IY,BootSector LD A,(IY+_sBOOT_SEC.ID_FORM) CP #F0 - JP C,ERR_BPB + JP C,DOS_X_Error.UnknownBPB ;!TEST ;LD HL,0 ; calc. first sector FAT @@ -250,17 +250,18 @@ RD_BPB: LD C,SLOT3 LD D,(IY+_sBOOT_SEC.S_P_F+1) LD A,(BootSector.FAT_NUM) ; amount FATs CP 1 - JR Z,C_DATA1 + JR Z,.loop1 DEC A ADD HL,DE LD (FatBuffer.FAT2_XX),HL -C_DATA1 ADD HL,DE +;C_DATA1 +.loop1: ADD HL,DE DEC A - JR NZ,C_DATA1 - LD (FatBuffer.DIR_FRM),HL ; first sector DIR + JR NZ,.loop1 - LD C,(IY+#0B) ; Size sectors - LD B,(IY+#0C) + LD (FatBuffer.DIR_FRM),HL ; first sector DIR + LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors + LD B,(IY+_sBOOT_SEC.B_P_S+1) RL C RL B RL C @@ -276,11 +277,12 @@ C_DATA1 ADD HL,DE EX DE,HL DEC HL XOR A -NEXTAD2 - INC A - JP Z,ERR_BPB +;NEXTAD2 +.loop2: INC A + JP Z,DOS_X_Error.UnknownBPB SBC HL,BC - JR NC,NEXTAD2 + JR NC,.loop2 + EX DE,HL LD C,A ; A - sectors in DIR LD B,0 @@ -290,58 +292,68 @@ NEXTAD2 ;LD HL,0 LD H,B ; тут в B ноль должен быть LD L,B - LD C,(IY+#0B) ; Size sector - LD B,(IY+#0C) + LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector + LD B,(IY+_sBOOT_SEC.B_P_S+1) LD A,(BootSector.S_P_C) -NEXTAD3 - ADD HL,BC ; calc. cluster size + +//////////////////////////////////////////////////////////////////////// + IF COMPILE_UNUSED_CODE +;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer +;NEXTAD3 +.loop3: ADD HL,BC ; calc. cluster size DEC A - JR NZ,NEXTAD3 + JR NZ,.loop3 + + LD (FatBuffer.CLU_LEN),HL EX DE,HL - LD HL,#3FFF + LD HL,#3FFF ;!TODO FATcacheSize XOR A -NEXTAD4 - INC A - JP Z,ERR_BPB +;NEXTAD4 +.loop4: INC A + JP Z,DOS_X_Error.UnknownBPB SBC HL,DE - JR NC,NEXTAD4 + JR NC,.loop4 LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) + ENDIF +//////////////////////////////////////////////////////////////////////// LD HL,BootSector.ID_FAT LD DE,FatBuffer.MSG LD B,3 -R_BPBL1 - LD A,(DE) +;R_BPBL1 +.loop5: LD A,(DE) CP (HL) - JP NZ,IBMDOS_ + JP NZ,.IBM_DOS INC HL INC DE - DJNZ R_BPBL1 -FID: LD A,(HL) + DJNZ .loop5 +;FID +.loop6: LD A,(HL) INC HL CP ' ' - JR Z,FID + JR Z,.loop6 + CP '1' - JP NZ,ERR_BPB + JP NZ,DOS_X_Error.UnknownBPB LD A,(HL) CP '6' ; FAT16 LD HL,#FFFF - JR Z,BPB_FAT + JR Z,.BPB_FAT CP '2' ; FAT12 - JP NZ,ERR_BPB + JP NZ,DOS_X_Error.UnknownBPB LD HL,#0FFF -BPB_FAT: +.BPB_FAT: LD (FatBuffer.FAT_TYP),A LD (FatBuffer.ENDCLUS),HL LD HL,0 LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track LD B,(IY+_sBOOT_SEC.S_P_T+1) LD A,(BootSector.HEADS) -BPB_L1: ; calc. sector per cylinder +.BPB_L1: ; calc. sector per cylinder ADD HL,BC DEC A - JR NZ,BPB_L1 + JR NZ,.BPB_L1 LD (FatBuffer.S_X_H),HL LD DE,(FatBuffer.DAT_FRM) @@ -354,30 +366,30 @@ BPB_L1: ; calc. sector per cylinder LD H,(IY+_sBOOT_SEC.S_P_D+1) LD A,H OR L - JP NZ,HDDSMAL + JP NZ,.HDDSMAL LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) AND A SBC HL,DE - JP NC,HDDBIG + JP NC,.HDDBIG DEC BC - JP HDDBIG -HDDSMAL: + JP .HDDBIG +.HDDSMAL: ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 -HDDBIG LD A,(BootSector.S_P_C) +.HDDBIG: LD A,(BootSector.S_P_C) SCF -S4C01 RRA - JR C,S4C02 +.S4C01: RRA + JR C,.S4C02 RR B RR C RR H RR L - JP S4C01 -S4C02 INC HL + JP .S4C01 +.S4C02: INC HL LD (MAX_CLU),HL POP IY ; LD DE,FAT @@ -402,9 +414,10 @@ S4C02 INC HL XOR A RET -IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) +.IBM_DOS: + LD A,(IY+_sBOOT_SEC.ID_FORM) CP #F0 - JR C,ERR_BPB + JR C,DOS_X_Error.UnknownBPB ;????? надо ли изменить? // OR 2 // CP #FA ; ID ram-диска @@ -412,22 +425,24 @@ IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) ;????? LD A,'6' LD HL,#FFFF - JP Z,BPB_FAT + JP Z,.BPB_FAT LD A,'2' LD HL,#0FFF - JP BPB_FAT + JP .BPB_FAT -ERR_BPB: +DOS_X_Error: +.UnknownBPB: POP IY LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF RET -RDERR1: LD A,DSS_Error.sys.NOT_READY +.Not_ready: + LD A,DSS_Error.sys.NOT_READY ;SCF RET -;!FIXIT к буферам! +;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' .READ_PG: DB #00 @@ -451,14 +466,15 @@ FatBuffer: .ENDCLUS: DW #FFFF ; -; +;!TODO к буферам! DIRSPEC: DB '\' - ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 - BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 + ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 + BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 ; ;R11 ; !TODO починить + IF SAVE_PATH_MACRO SAVE_CUR_PATH PUSH IX PUSH IY @@ -525,6 +541,7 @@ BACK_CUR_PATH: POP IX POP IY RET + ENDIF ;R11 ;R12 @@ -624,11 +641,11 @@ SCANDRV: EI RET .ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_OPEN_S + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S LD E,0 RST ToBIOS - LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_CLS_WIN + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN LD DE,0 LD HL,#2050 RST ToBIOS @@ -647,14 +664,17 @@ SCANDRV: RST ToBIOS LD HL,#A000 - LD DE,0*256 + COLORS.FLASH + COLORS.PAPER.BLUE + COLORS.INC.WHITE + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE LD B,A LD C,BIOS.LP_PRINT_LINE3 RST ToBIOS .loop: DI - HALT - JR .loop +; .loop: LD A,R +; AND 7 +; OUT (BorderColor),A + HALT + JR .loop .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." .ERROR_MSG.size EQU $-.ERROR_MSG @@ -663,45 +683,7 @@ SCANDRV: RET ; .TMP_BUFFER: BLOCK 3,#FF - MODULE COLORS -; -INC: -.BLACK EQU #00 -.BLUE EQU #01 -.GREEN EQU #02 -.CYAN EQU #03 -.RED EQU #04 -.MAGENTA EQU #05 -.BROWN EQU #06 -.LGRAY EQU #07 -.DGRAY EQU #08 -.LBLUE EQU #09 -.LGREEN EQU #0A -.LCYAN EQU #0B -.LRED EQU #0C -.LMAGENT EQU #0D -.YELLOW EQU #0E -.WHITE EQU #0F -PAPER: -.BLACK EQU 16*INC.BLACK -.BLUE EQU 16*INC.BLUE -.GREEN EQU 16*INC.GREEN -.CYAN EQU 16*INC.CYAN -.RED EQU 16*INC.RED -.MAGENTA EQU 16*INC.MAGENTA -.BROWN EQU 16*INC.BROWN -.LGRAY EQU 16*INC.LGRAY -.DGRAY EQU 16*INC.DGRAY -.LBLUE EQU 16*INC.LBLUE -.LGREEN EQU 16*INC.LGREEN -.LCYAN EQU 16*INC.LCYAN -.LRED EQU 16*INC.LRED -.LMAGENT EQU 16*INC.LMAGENT -.YELLOW EQU 16*INC.YELLOW -.WHITE EQU 16*INC.WHITE -FLASH EQU #80 - ENDMODULE ; .old_letter: DB #FF ; .old_DRIVE_ID: DB #FF ; .new_letter: DB #FF diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index de73b12..fca761f 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -30,6 +30,7 @@ includelua 'Shared_includes/lua/Functions.lua' INCLUDE 'defines.inc' include 'shared_includes/constants/sp2000.inc' + include 'shared_includes/constants/standart_colors.inc' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/structures/FileSystem.inc' diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 07e7939..a18cb2e 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -61,11 +61,11 @@ R_F_FAT: EX DE,HL LD A,DSS_Error.sys.DISK_FULL RET C - EXX + EXX ;!TODO optimize SET_PAGE_X FATPAGE + EXX ;!TODO optimize - EXX PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYP) @@ -77,17 +77,17 @@ R_F_F16: AND #0F LD H,A LD A,B - ; A/16 + ; swap bit7..4 and bit3..0. RRCA RRCA RRCA RRCA ; - AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C - CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE LD E,(HL) @@ -247,7 +247,8 @@ W_T_F16: 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 - CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + CP C + CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE POP DE @@ -323,7 +324,7 @@ RE_FAT: PUSH HL PUSH AF LD A,(FATCASH.Update) OR A - CALL NZ,WR_FAT_ + CALL NZ,WR_FAT.Start POP AF LD L,A LD H,0 @@ -340,7 +341,7 @@ RE_FAT: PUSH HL LD HL,0 ;HL:IX - SECTOR FAT FOR READING LD DE,FAT ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) - LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) + LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize RST ToDSS.DRV POP HL RET @@ -350,13 +351,12 @@ WR_FAT: EXX EXX PUSH AF - CALL WR_FAT_ + CALL .Start POP AF OUT (SLOT3),A RET - -WR_FAT_: - LD HL,(FATCASH) + ; +.Start: LD HL,(FATCASH) LD H,0 LD (FATCASH),HL ADD HL,HL @@ -374,14 +374,14 @@ WR_FAT_: LD A,16 AND A SBC HL,DE - JR C,WALLFAT + JR C,.WALLFAT EX DE,HL LD HL,16 ; AND A ;тут точно CF не взведён SBC HL,DE JP C,FATERR LD A,L -WALLFAT: +.WALLFAT: LD H,B LD L,C LD DE,(FatBuffer.FAT_FRM) diff --git a/DSS/build.txt b/DSS/build.txt index b8e817d..61f9147 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -255 \ No newline at end of file +275 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index ff987ef..675eadc 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -4,6 +4,7 @@ ; DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. + DEFINE COMPILE_UNUSED_CODE 0 ; ; diff --git a/Shared_Includes b/Shared_Includes index 7f4046e..cf19a28 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7f4046e7fabff85738efcf2a7aa1dbbeca7af906 +Subproject commit cf19a287a2cfe1946de5c1d50a255c43ae4fc390 From 615d9cb2e2cc3e2ce4d8c136f3f9f4fbac5c8992 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 17 Sep 2023 04:13:36 +1000 Subject: [PATCH 035/219] ... --- BOOT/DSSBOOT.ASM | 2 +- DSS/DOS_FM.ASM | 103 +++++++++++++++++++++++------------------------ DSS/DOS_X.ASM | 47 ++++++++++++++------- DSS/FAT_X.ASM | 13 ++++-- DSS/build.txt | 2 +- Shared_Includes | 2 +- 6 files changed, 95 insertions(+), 74 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 8bdf584..9539114 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -547,7 +547,7 @@ ADD_DE2 DJNZ ADD_DE1 RET ;----------------- - +;!TODO сделать это макросами или инклюдами универсальными. повторяются в досе и ещё где-то ; HL - CLUSTER ; DE - (CLUSTER) R_F_FAT: PUSH HL diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 976d700..02e6d30 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -174,12 +174,12 @@ BLOKRD0 POP BC ;HL:DE - FP (in sectors) ; B - Amount sectors BLOK_RD: PUSH BC - LD (READMEM),IX + LD (READ.MEM),IX LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A - LD B,0 + LD B,0 ;!FIXIT ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC ;!FIXIT заменить вызов HLDE/BC на HLDE/C + CALL DIV_for_SPC ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb LD B,XH LD C,XL @@ -272,19 +272,19 @@ BLOKRD3 LD A,B ; / ADD IX,DE JR NC,BLOKRD4 INC HL -BLOKRD4 LD DE,(READMEM) +BLOKRD4 LD DE,(READ.MEM) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV JP C,BLOKRD0 POP BC - LD HL,(READMEM) + LD HL,(READ.MEM) LD DE,(BootSector.B_P_S) BLOKRD5 ADD HL,DE DEC C JR NZ,BLOKRD5 - LD (READMEM),HL + LD (READ.MEM),HL POP DE LD A,B OR A @@ -309,19 +309,19 @@ BLOKRD7 EX DE,HL PUSH HL PUSH BC CALL NSECTOR - LD DE,(READMEM) + LD DE,(READ.MEM) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV JP C,BLOKRD0 POP BC - LD HL,(READMEM) + LD HL,(READ.MEM) LD DE,(BootSector.B_P_S) BLOKRD8 ADD HL,DE DEC C JR NZ,BLOKRD8 - LD (READMEM),HL + LD (READ.MEM),HL POP DE JR BLOKRD6 @@ -344,7 +344,7 @@ BLOKWR0 POP BC ;HL:DE - FP (in sectors) ; B - Amount sectors BLOK_WR PUSH BC - LD (READMEM),IX + LD (READ.MEM),IX LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 @@ -457,19 +457,19 @@ BLOKWR3 LD A,B ADD IX,DE JR NC,BLOKWR4 INC HL -BLOKWR4 LD DE,(READMEM) +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,(READMEM) + LD HL,(READ.MEM) LD DE,(BootSector.B_P_S) BLOKWR5 ADD HL,DE DEC C JR NZ,BLOKWR5 - LD (READMEM),HL + LD (READ.MEM),HL POP DE LD A,B OR A @@ -499,19 +499,19 @@ BLOKWR9 POP BC PUSH HL PUSH BC CALL NSECTOR - LD DE,(READMEM) + 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,(READMEM) + LD HL,(READ.MEM) LD DE,(BootSector.B_P_S) BLOKWR8 ADD HL,DE DEC C JR NZ,BLOKWR8 - LD (READMEM),HL + LD (READ.MEM),HL POP DE JR BLOKWR6 @@ -521,7 +521,7 @@ BLOKWRA POP BC RET TSTSIZE XOR A - LD (READCOD),A + LD (READ.COD),A LD L,(IY+32) ;FP LOW _sFM.F_POSITION LD H,(IY+33) ADD HL,DE @@ -545,25 +545,24 @@ TSTSIZE XOR A SBC HL,DE ;VERY BIG EX DE,HL LD A,#FF - LD (READCOD),A + LD (READ.COD),A RET ; HL - ADDRESS ; DE - SIZE ; A - FM READ: LD (R_POINT),HL - LD (S_POINT),HL + LD (.S_POINT),HL CALL SET_FM RET C CALL TSTSIZE LD A,D OR E - JP Z,NOREAD ;!FIXIT можно перенести в начало процедуры + JP Z,.NOREAD ;!FIXIT можно перенести в начало процедуры PUSH DE LD A,(IY+_sFM.DRIVE) CALL OPENDSK - ; - JP C,RPERR1 + JP C,.ERR_1 ;Расчёт смещения в секторах ; LD C,(IY+_sFM.F_POSITION) ; LD E,(IY+_sFM.F_POSITION+1) @@ -594,18 +593,18 @@ READ: LD (R_POINT),HL ; ;LD A,B OR C - JP NZ,ROV1 -ROV4: POP BC + JP NZ,.ROV1 +.ROV4: POP BC PUSH BC SRL B - JR Z,ROV2 - LD (SECTORH),HL - LD (SECTORL),DE + JR Z,.ROV2 + LD (.SECTORH),HL + LD (.SECTORL),DE LD IX,(R_POINT) CALL BLOK_RD - JP C,RPERR1 + JP C,.ERR_1 LD DE,(R_POINT) -READMEM+1: LD HL,0 // LD HL,(READMEM) +.MEM+1: LD HL,0 // LD HL,(READMEM) AND A SBC HL,DE LD C,H @@ -613,18 +612,18 @@ READMEM+1: LD HL,0 // LD HL,(READMEM) ADD HL,DE LD (R_POINT),HL SRL C -SECTORL+1: LD HL,0 // LD HL,(SECTORL) +.SECTORL+1: LD HL,0 // LD HL,(SECTORL) ADD HL,BC EX DE,HL -SECTORH+1: LD HL,0 // LD HL,(SECTORH) +.SECTORH+1: LD HL,0 // LD HL,(SECTORH) LD C,B ADC HL,BC -ROV2: POP BC +.ROV2: POP BC LD A,B AND #01 LD B,A OR C - JP Z,ROV6 + JP Z,.ROV6 PUSH BC LD IX,BUFFER+#C000 LD B,1 @@ -636,14 +635,14 @@ ROV2: POP BC POP BC LD C,SLOT3 OUT (C),B - JP C,RPERR1 + JP C,.ERR_1 LD HL,BUFFER LD DE,(R_POINT) POP BC LDIR LD (R_POINT),DE -ROV6: -S_POINT+1: LD HL,0 +.ROV6: +.S_POINT+1: LD HL,0 LD DE,(R_POINT) EX DE,HL AND A @@ -655,12 +654,11 @@ S_POINT+1: LD HL,0 LD HL,0 CALL MOVE_FP.F_current POP DE -NOREAD: -READCOD+1: LD A,0 +.NOREAD: +.COD+1: LD A,0 OR A RET - -ROV1: PUSH BC +.ROV1: PUSH BC PUSH HL PUSH DE LD IX,BUFFER+#C000 @@ -674,7 +672,7 @@ ROV1: PUSH BC LD C,SLOT3 OUT (C),B POP HL - JP C,RPERR3 + JP C,.ERR_3 LD BC,1 ADD HL,BC EX DE,HL @@ -691,23 +689,22 @@ ROV1: PUSH BC POP HL AND A SBC HL,BC - JR NC,ROV3 + JR NC,.ROV3 ADD HL,BC LD B,H LD C,L LD HL,0 -ROV3: PUSH HL +.ROV3: PUSH HL LD HL,BUFFER ADD HL,DE LD DE,(R_POINT) LDIR LD (R_POINT),DE EXX - JP ROV4 - -RPERR3: POP HL -RPERR2: POP HL -RPERR1: POP BC + JP .ROV4 +.ERR_3: POP HL +.ERR_2: POP HL +.ERR_1: POP BC SCF RET @@ -726,7 +723,7 @@ RD_ONLY: POP DE ; DE - SIZE ; A - FM WRITE: LD (R_POINT),HL - LD (S_POINT),HL + LD (READ.S_POINT),HL PUSH DE CALL SET_FM JP C,PWERR1 @@ -762,7 +759,7 @@ WOV4: POP BC PUSH HL PUSH DE PUSH BC -R_POINT+2: LD IX,0 // LD IX,(R_POINT) +R_POINT+2: LD IX,0 // LD IX,(R_POINT) CALL BLOK_WR POP BC @@ -818,7 +815,7 @@ WOV2: POP BC LD C,SLOT3 OUT (C),B RET C -WOV6: LD DE,(S_POINT) +WOV6: LD DE,(READ.S_POINT) LD HL,(R_POINT) AND A SBC HL,DE @@ -922,8 +919,8 @@ WOV3: PUSH HL ; ADC HL,DE ; RET ///////////////////////////////////// -; HL - CLUSTER -; HL:IX - SECTOR +; in: HL - CLUSTER +; out: HL:IX - SECTOR NSECTOR: DEC HL DEC HL LD DE,0 diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index b672853..46c67f8 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -289,27 +289,39 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.DIR_S_S),A ADD HL,BC ; Start DATA area LD (FatBuffer.DAT_FRM),HL - ;LD HL,0 - LD H,B ; тут в B ноль должен быть - LD L,B - LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector - LD B,(IY+_sBOOT_SEC.B_P_S+1) - LD A,(BootSector.S_P_C) - +;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer //////////////////////////////////////////////////////////////////////// IF COMPILE_UNUSED_CODE -;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer -;NEXTAD3 -.loop3: ADD HL,BC ; calc. cluster size - DEC A - JR NZ,.loop3 + ;LD HL,0 + ;LD H,B ; тут в B ноль должен быть + ;LD L,B + ;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector + ;LD B,(IY+_sBOOT_SEC.B_P_S+1) + LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector + LD H,(IY+_sBOOT_SEC.B_P_S+1) + LD A,(BootSector.S_P_C) + +;NEXTAD3 +; .loop3: ADD HL,BC ; calc. cluster size +; DEC A +; JR NZ,.loop3 + ;!TODO проверить правильно ли считает + XOR 1 ; calc. cluster size + JR Z,.loop3.end + RRA +.loop3: ADD HL,HL + RRCA + JP NC,.loop3 +.loop3.end: + ; LD (FatBuffer.CLU_LEN),HL EX DE,HL LD HL,#3FFF ;!TODO FATcacheSize - XOR A -;NEXTAD4 + ;XOR A + ; A = 0 +;NEXTAD4 ;!FIXIT оптимизировать когда понадобится .loop4: INC A JP Z,DOS_X_Error.UnknownBPB SBC HL,DE @@ -346,6 +358,11 @@ RD_BPB: LD C,SLOT3 .BPB_FAT: LD (FatBuffer.FAT_TYP),A LD (FatBuffer.ENDCLUS),HL + +;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer +//////////////////////////////////////////////////////////////////////// + IF COMPILE_UNUSED_CODE + LD HL,0 LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track LD B,(IY+_sBOOT_SEC.S_P_T+1) @@ -355,6 +372,8 @@ RD_BPB: LD C,SLOT3 DEC A JR NZ,.BPB_L1 LD (FatBuffer.S_X_H),HL + ENDIF +//////////////////////////////////////////////////////////////////////// LD DE,(FatBuffer.DAT_FRM) ; LD E,(IY+#1C) ;Hidden sec diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index a18cb2e..b3191e0 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -50,8 +50,8 @@ INC_FA2 CALL R_F_FAT ;R01 -; HL - CLUSTER -; DE - (CLUSTER) +; IN: HL - CLUSTER +; OUT: DE - (CLUSTER) ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb R_F_FAT: EX DE,HL @@ -85,8 +85,13 @@ R_F_F16: ; AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CP C + ;!TEST + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + CP C + //LD C,A + //LD A,(FATCASH.Block) + //CP C + ; CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE diff --git a/DSS/build.txt b/DSS/build.txt index 61f9147..c2567dc 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -275 \ No newline at end of file +280 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index cf19a28..b593cb6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit cf19a287a2cfe1946de5c1d50a255c43ae4fc390 +Subproject commit b593cb606636c961e49597b9b1e5b6ee72d191c9 From 851c2158793c3213c0d6daafbdf535c29ffd220b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 18 Sep 2023 02:30:17 +1000 Subject: [PATCH 036/219] -bug in SCANDRV -bug in NSECTOR -bug in SYS.EXE (boot.asm) --- BOOT/boot.asm | 4 ++-- DSS/DOS_FM.ASM | 8 ++++---- DSS/DOS_X.ASM | 51 +++++++++++++++++++++++++++++++++++-------------- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- 5 files changed, 45 insertions(+), 22 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index f943d99..30be7ca 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -60,12 +60,12 @@ BEGIN: in a,(SLOT3) ld c,0 ; узнать версию ДОС rst 10h ex de,hl ; hl=тек. версия - ld de,013Ch ; 1.60 d=версия, e=модификация, bc - номер сборки. de = #013E, bc = #0064 dos ver 1.62.100 + ld de,#013C ; 1.60 d=версия, e=модификация, bc - номер сборки. de = #013E, bc = #0064 dos ver 1.62.100 and a sbc hl,de jr nc,version_ok pop hl - ld a,9 ; индекс строки "Error: Need DSS version 1.60..." + ld a,11 ; индекс строки "Error: Need DSS version 1.60..." call print_string ld a,-1 jp exit diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 02e6d30..b34e010 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -918,7 +918,7 @@ WOV3: PUSH HL ; LD DE,#0000 ; ADC HL,DE ; RET -///////////////////////////////////// +////////////// NEW ////////////////// ; in: HL - CLUSTER ; out: HL:IX - SECTOR NSECTOR: DEC HL @@ -931,16 +931,16 @@ NSECTOR: DEC HL RRA .loop: ADD HL,HL RL E - RL D - RRCA + ; RL D + RRA JP NC,.loop ; .skip: EX DE,HL LD XL,E LD XH,D LD DE,(FatBuffer.DAT_FRM) ;first data sector + XOR A ADD IX,DE - ; A=0 LD D,A LD E,A ADC HL,DE diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 46c67f8..e101e00 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -239,10 +239,11 @@ RD_BPB: LD C,SLOT3 LD H,(IY+_sBOOT_SEC.RESERVE+1) ; -; LD E,(IY+#1C) ;Hidden sec -; LD D,(IY+#1D) -; ADD HL,DE -; LD (FatBuffer.FAT_FRM),HL ; first sector FAT + ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec + ; LD D,(IY+_sBOOT_SEC.HIDDEN+1) + ; ADD HL,DE + + ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 LD (FatBuffer.FAT2_XX),HL @@ -319,8 +320,7 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.CLU_LEN),HL EX DE,HL LD HL,#3FFF ;!TODO FATcacheSize - ;XOR A - ; A = 0 + XOR A ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится .loop4: INC A JP Z,DOS_X_Error.UnknownBPB @@ -376,8 +376,8 @@ RD_BPB: LD C,SLOT3 //////////////////////////////////////////////////////////////////////// LD DE,(FatBuffer.DAT_FRM) -; LD E,(IY+#1C) ;Hidden sec -; LD D,(IY+#1D) +; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec +; LD D,(IY+_sBOOT_SEC.HIDDEN+1) ; AND A ; SBC HL,DE ; EX DE,HL @@ -572,6 +572,9 @@ BACK_CUR_PATH: ;/////////////////////////////////////////////////////////////////////// SCANDRV: ;1 [-----------] [-----------] [-----------] [-----------] [-----------] + ; LD A,(LDRIVE) + ; LD (.old_ldrive),A + ; CALL GETBOOT LD (.old_letter),A ; bootdisk Log.number ; [-----------] @@ -603,6 +606,9 @@ SCANDRV: CALL SETBOOT JR C,.ERROR_BOOTDRV_DIES LD (.new_letter),A + ; + LD A,(.old_letter) + LD (BOOTDRV),A ; ;5 [-----------] [-----------] [-----------] [-----------] [-----------] @@ -641,14 +647,31 @@ SCANDRV: EX DE,HL LDDR ; проверяем, не увеличилось ли значение LDRIVE - LD HL,.old_letter - LD A,(LDRIVE) - CP (HL) - JR NC,.no_change_LDRIVE - LD A,(HL) - LD (LDRIVE),A + ;!TEST + LD HL,.old_letter + LD A,(LDRIVE) + CP (HL) + JR NC,.no_change_LDRIVE + LD A,(HL) + LD (LDRIVE),A + ; +; .old_ldrive+1: + ;LD L,0 + ;LD A,(LDRIVE) + ;CP L + ;JR NC,.no_change_LDRIVE + ;LD A,L + ;LD (LDRIVE),A + ; .no_change_LDRIVE: ; + ; DEC A + ; LD C,Dss.DskInfo + ; RST ToDSS + ; LD A,(BOOTDRV) + ; LD C,Dss.ChDisk + ; RST ToDSS + ;;;;; .restore_page+1: LD A,0 diff --git a/DSS/build.txt b/DSS/build.txt index c2567dc..da4c6e9 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -280 \ No newline at end of file +297 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 675eadc..5246fad 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -4,7 +4,7 @@ ; DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. - DEFINE COMPILE_UNUSED_CODE 0 + DEFINE COMPILE_UNUSED_CODE 1 ; ; From 91b1e90517a02a89598d85602c5bb9e483210cdd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 22 Sep 2023 03:11:40 +1000 Subject: [PATCH 037/219] =?UTF-8?q?R14=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20"File=20not=20f?= =?UTF-8?q?ound"=20=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B5=20D?= =?UTF-8?q?IR=20=D0=BD=D0=B0=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=BC=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS5.ASM | 3 +- DSS/DOS_X.ASM | 164 ++-------------------------------- DSS/Media_drivers/ide-drv.asm | 3 +- DSS/ScanDRV.ASM | 157 ++++++++++++++++++++++++++++++++ DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/Commands/DIR.ASM | 96 +++++++++++--------- SHELL/ERROR.ASM | 24 ++--- SHELL/SHELL.ASM | 23 +++++ SHELL/build.txt | 2 +- Shared_Includes | 2 +- 11 files changed, 257 insertions(+), 221 deletions(-) create mode 100644 DSS/ScanDRV.ASM diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 6136a7d..b46492d 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -612,7 +612,6 @@ SEARCH5: OUT (SLOT3),A AND A RET - SEARCH3: EXX INC DE @@ -1066,7 +1065,7 @@ DIRSIZE: WORD 0 ; раз ; Массив лог. номеров банок расширения ДОС -BANKTBL: BLOCK USING_MEMPAGES+1,#FF +BANKTBL: BLOCK USING_MEMPAGES,#FF diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index e101e00..5ed58b8 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -570,166 +570,12 @@ BACK_CUR_PATH: ; вход: нет ; выход: A - номер последнего лог. диска в системе ;/////////////////////////////////////////////////////////////////////// -SCANDRV: -;1 [-----------] [-----------] [-----------] [-----------] [-----------] - ; LD A,(LDRIVE) - ; LD (.old_ldrive),A - ; - CALL GETBOOT - LD (.old_letter),A ; bootdisk Log.number -; [-----------] - -;2 [-----------] [-----------] [-----------] [-----------] [-----------] - ; A = bootdisk Log.number - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - EX AF,AF' - LD (.old_DRIVE_ID),A -; [-----------] - - -;3 [-----------] [-----------] [-----------] [-----------] [-----------] - ;!TEST в DRV-MAIN могут быть проблемы с прерываниями - ;DI - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A - ;EI - ; -; [-----------] - -;4 [-----------] [-----------] [-----------] [-----------] [-----------] -.old_DRIVE_ID+1: - LD A,0 - CALL SETBOOT - JR C,.ERROR_BOOTDRV_DIES - LD (.new_letter),A - ; - LD A,(.old_letter) - LD (BOOTDRV),A -; - -;5 [-----------] [-----------] [-----------] [-----------] [-----------] - AND A - LD A,R - PUSH AF - DI - ;;;;;;;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(DRV_PG_NUMBER) - OUT (SLOT3),A - ;;;;; - - ; вычисляем смещение bootdisk в новой таблице DEVICE -.new_letter+1: - LD A,0 - CALL .get_entry_addr - PUSH HL - ; сохраняем значения нового boot - LD DE,.TMP_BUFFER - LD BC,DEVICE.TBL_Entry - LDIR - ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE -.old_letter+1: - LD A,0 - CALL .get_entry_addr - ; меняем букву диска для девайса занявшего старую букву bootdisk - POP DE - LD BC,DEVICE.TBL_Entry - LDIR - ; восстанавливаем bootdisk на старое место - DEC HL - LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 - LD BC,DEVICE.TBL_Entry - EX DE,HL - LDDR - ; проверяем, не увеличилось ли значение LDRIVE - ;!TEST - LD HL,.old_letter - LD A,(LDRIVE) - CP (HL) - JR NC,.no_change_LDRIVE - LD A,(HL) - LD (LDRIVE),A - ; -; .old_ldrive+1: - ;LD L,0 - ;LD A,(LDRIVE) - ;CP L - ;JR NC,.no_change_LDRIVE - ;LD A,L - ;LD (LDRIVE),A - ; -.no_change_LDRIVE: - ; - ; DEC A - ; LD C,Dss.DskInfo - ; RST ToDSS - ; LD A,(BOOTDRV) - ; LD C,Dss.ChDisk - ; RST ToDSS - - ;;;;; -.restore_page+1: - LD A,0 - OUT (SLOT3),A - ;;;;;;;; - POP AF - LD A,(LDRIVE) - RET PO - EI - RET -.ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S - LD E,0 - RST ToBIOS - - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - LD DE,0 - LD HL,#2050 - RST ToBIOS - - LD A,1 - OUT (RGMOD),A ; set scr-2 - - LD HL,.ERROR_MSG - LD DE,#A000 - LD BC,.ERROR_MSG.size - LD A,C - LDIR - - LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - -.loop: DI -; .loop: LD A,R -; AND 7 -; OUT (BorderColor),A - HALT - JR .loop - -.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -.ERROR_MSG.size EQU $-.ERROR_MSG -.get_entry_addr: - _CALC_DEVICE_ENTRY DEVICE + #C000 - RET -; -.TMP_BUFFER: BLOCK 3,#FF - -; .old_letter: DB #FF -; .old_DRIVE_ID: DB #FF -; .new_letter: DB #FF + INCLUDE 'ScanDRV.asm' +; INCLUDE 'NScanDRV.asm' ;/////////////////////////////////////////////////////////////////////// +; + + ;R12 diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index b4ba3b2..8c92c56 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -233,7 +233,6 @@ INIT_H: PUSH IY LD A,C OUT (SLOT3),A JR Z,NO_HARDS - ;LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT NX_DVCI: PUSH BC @@ -317,7 +316,7 @@ DRVCLC: INC A ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 -LOGDRV: BLOCK .TBL_Entry*LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы +LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы .TBL_Entry EQU 16 .Size EQU $-LOGDRV diff --git a/DSS/ScanDRV.ASM b/DSS/ScanDRV.ASM new file mode 100644 index 0000000..d471989 --- /dev/null +++ b/DSS/ScanDRV.ASM @@ -0,0 +1,157 @@ +; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе +SCANDRV: +;1 [-----------] [-----------] [-----------] [-----------] [-----------] + ; LD A,(LDRIVE) + ; LD (.old_ldrive),A + ; + CALL GETBOOT + LD (.old_letter),A ; bootdisk Log.number +; [-----------] + +;2 [-----------] [-----------] [-----------] [-----------] [-----------] + ; A = bootdisk Log.number + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + EX AF,AF' + LD (.old_DRIVE_ID),A +; [-----------] + + +;3 [-----------] [-----------] [-----------] [-----------] [-----------] + ;!TEST в DRV-MAIN могут быть проблемы с прерываниями + ;DI + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A + ;EI + ; +; [-----------] + +;4 [-----------] [-----------] [-----------] [-----------] [-----------] +.old_DRIVE_ID+1: + LD A,0 + CALL SETBOOT + JR C,.ERROR_BOOTDRV_DIES + LD (.new_letter),A + ; + LD A,(.old_letter) + LD (BOOTDRV),A +; + +;5 [-----------] [-----------] [-----------] [-----------] [-----------] + AND A + LD A,R + PUSH AF + DI + ;;;;;;;; + IN A,(SLOT3) + LD (.restore_page),A + LD A,(DRV_PG_NUMBER) + OUT (SLOT3),A + ;;;;; + + ; вычисляем смещение bootdisk в новой таблице DEVICE +.new_letter+1: + LD A,0 + CALL .get_entry_addr + PUSH HL + ; сохраняем значения нового boot + LD DE,.TMP_BUFFER + LD BC,DEVICE.TBL_Entry + LDIR + ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE +.old_letter+1: + LD A,0 + CALL .get_entry_addr + ; меняем букву диска для девайса занявшего старую букву bootdisk + POP DE + LD BC,DEVICE.TBL_Entry + LDIR + ; восстанавливаем bootdisk на старое место + DEC HL + LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 + LD BC,DEVICE.TBL_Entry + EX DE,HL + LDDR + ; проверяем, не увеличилось ли значение LDRIVE + ;!TEST + LD HL,.old_letter + LD A,(LDRIVE) + CP (HL) + JR NC,.no_change_LDRIVE + LD A,(HL) + LD (LDRIVE),A + ; +; .old_ldrive+1: + ;LD L,0 + ;LD A,(LDRIVE) + ;CP L + ;JR NC,.no_change_LDRIVE + ;LD A,L + ;LD (LDRIVE),A + ; +.no_change_LDRIVE: + ; + ; DEC A + ; CALL DISKINF + ; LD A,(BOOTDRV) + ; CALL CHNDISK + ;;;;; +.restore_page+1: + LD A,0 + OUT (SLOT3),A + ;;;;;;;; + POP AF + LD A,(LDRIVE) + RET PO + EI + RET +.ERROR_BOOTDRV_DIES: + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S + LD E,0 + RST ToBIOS + + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + LD DE,0 + LD HL,#2050 + RST ToBIOS + + LD A,1 + OUT (RGMOD),A ; set scr-2 + + LD HL,.ERROR_MSG + LD DE,#A000 + LD BC,.ERROR_MSG.size + LD A,C + LDIR + + LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + +.loop: DI +; .loop: LD A,R +; AND 7 +; OUT (BorderColor),A + HALT + JR .loop + +.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +.ERROR_MSG.size EQU $-.ERROR_MSG +.get_entry_addr: + _CALC_DEVICE_ENTRY DEVICE + #C000 + RET +; +.TMP_BUFFER: BLOCK 3,#FF + +; .old_letter: DB #FF +; .old_DRIVE_ID: DB #FF +; .new_letter: DB #FF \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index da4c6e9..2c136b2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -297 \ No newline at end of file +302 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 5246fad..fd0b202 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -27,7 +27,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DIRPAGE EQU 0 FATPAGE EQU 1 TXTPAGE EQU 2 -ENVPAGE EQU 2 +ENVPAGE EQU TXTPAGE DRVPAGE EQU 3 ; diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index fc0a75b..971c6ee 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -26,42 +26,21 @@ cmd_dir: push de ;ld de,T9186 ; буфер ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер - ld a,37h ; атрибут (все, кроме метки тома) + ld a,#37 ; атрибут (все, кроме метки тома) ld bc,0*256 + Dss.F_First ; f_first (формат 11) RST ToDSS - jp c,print_err_message ; вывод сообщения - ; %1 - ;ld a,(system_path) ; буфер полного сист. пути - ;ld (T90F6),a - ;ld a,":" - ;ld (T90F7),a - ;xor a - ;ld (T90F8),a - ld a,(screen_path) ; диск - ld hl,PRM1 - ld (hl),a - inc hl - ld (hl),":" - inc hl - ld (hl),0 - ; %2 - ld hl,serial_string ; строка серийного номера диска - ld de,PRM2 ; куда - call ncopy_string ; скопир. строку (с нулем) - ;call print_sys_path ; вывод сист. пути на экран - ; %3 - ld hl,screen_path ; экран. путь - ld de,PRM3 ; 16 буфер - ;ld a,(hl) - ;ldi ; скопир. строку - ;or a - ;jr nz,$-4 - call copy_string ; скопир. строку (с нулем) + ;R14 + ;jp c,print_err_message ; вывод сообщения DSS_Error.sys.FILE_NOT_FOUND + JR NC,.not_empty + CP DSS_Error.sys.FILE_NOT_FOUND + JP NZ,print_err_message + SCF + JP .Print_Header +.not_empty: + CALL .Print_Header ; - ld de,0 ; индекс "Volume in drive %1 has no label..." - call MESSAGE ; вывести строку ; цикл вывода списка файлов/папок -A882C: ;ld hl,T9186 ; раб. буфер +.loop: ;ld hl,T9186 ; раб. буфер ld hl,work_buffer1 ; 80 ld de,33 add hl,de @@ -70,7 +49,7 @@ A882C: ;ld hl,T9186 ; раб. ld ix,work_buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and 10h ; папка ? - jr nz,A8866 ; да + jr nz,.next ; да ; прибавить размер тек. файла ld hl,(D88DC) inc hl @@ -89,16 +68,14 @@ A882C: ;ld hl,T9186 ; раб. ld (D88DE),hl exx ld (D88E0),hl -A8866: ;ld de,T9186 ; раб. буфер +.next: ;ld de,T9186 ; раб. буфер ld de,work_buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS - jr nc,A882C ; назад в цикл - jr A8872 ; конец списка, на десят. вывод + jr nc,.loop ; назад в цикл, если не конец списка - -; Десятичный вывод -A8872: ld hl,(D88DC) + ; Десятичный вывод +.print: ld hl,(D88DC) ld ix,PRM1 ; буфер call A8964 ld hl,(D88DE) ; мл. разряд @@ -109,10 +86,11 @@ A8872: ld hl,(D88DC) ld hl,T8B37 ; "0" ld a,(hl) cp " " - jr nz,A8892 + jr nz,.not_zero ld a,"0" ld (hl),a -A8892: ld de,T8B46 ; "0 000 000 000" +.not_zero: + ld de,T8B46 ; "0 000 000 000" ld hl,T8B2E ; "0000000000" ld a,(hl) ldi @@ -148,8 +126,42 @@ A8892: ld de,T8B46 ; "0 000 000 000" ld de,9 ; индекс " %1 file(s) %2 bytes" jp MESSAGE ; вывести строку + ;R14 +.Print_Header: + PUSH AF + ; + ; %1 + ld a,(screen_path) ; диск + ld hl,PRM1 + ld (hl),a + inc hl + ld (hl),":" + inc hl + ld (hl),0 + ; %2 + ld hl,serial_string ; строка серийного номера диска + ld de,PRM2 ; куда + call ncopy_string ; скопир. строку (с нулем) + ; + ;R14 + POP AF + ld hl,screen_path + JR NC,.not_empty_2 + ; + ld a,(screen_path) + LD (.str),A + ld hl,.str ; экран. путь + ; %3 +.not_empty_2: + ; + ld de,PRM3 ; 16 буфер + CALL copy_string ; скопир. строку (с нулем) + ; + ld de,0 ; индекс "Volume in drive %1 has no label..." ;!HARDCODE номер строки MSG0 + JP MESSAGE ; вывести строку - +.str: DZ 'X:\ is empty' ;R14 + ; ; Подготовить строку списка файлов/папок A88E2: ld bc,8 diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM index 9b3fe64..9bab454 100644 --- a/SHELL/ERROR.ASM +++ b/SHELL/ERROR.ASM @@ -6,7 +6,7 @@ print_err_message: ld e,a ld d,0 inc de - ld hl,ERR0 ; массив строк + ld hl,ERR0 ; массив строк ld bc,ERR0.Size ; размер массива call LCPIR ; найти строку call PRINTZ ; формат. вывод строки @@ -133,24 +133,24 @@ HELPMSG EQU 11 MSG0: db 0 ; 0 - db "Volume in drive %1 " + db "Volume on drive %1 " .volume_string: ;!FIXIT сделать через PRM - db "has no label ",0Dh,0Ah ;0 - db "Volume Serial Number is %2",0Dh,0Ah - db 0Dh,0Ah,"Directory of %3",0Dh,0Ah,0Ah,0 + db "has no label ",CR,LF ;0 + db "The volume serial number is %2",CR,LF + db CR,LF,"Directory of %3",CR,LF,LF,0 ; 1 db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 ; 2 - db "Current date: %1",0Dh,0Ah,0 ;2 - db "Current time: %1",0Dh,0Ah,0 ;3 - db "Press any key to continue . . .",0Dh,0Ah,0Ah,0 ;4 - db "Invalid parametr",0Dh,0Ah,0 ;5 - db "Echo is %1",0Dh,0Ah,0 ;6 + db "Current date: %1",CR,LF,0 ;2 + db "Current time: %1",CR,LF,0 ;3 + db "Press any key to continue . . .",CR,LF,LF,0 ;4 + db "Invalid parametr",CR,LF,0 ;5 + db "Echo is %1",CR,LF,0 ;6 db "on",0 ;7 db "off",0 ;8 - db " %1 file(s) %2 bytes",0Dh,0Ah,0Ah,0 ;9 + db " %1 file(s) %2 bytes",CR,LF,LF,0 ;9 ; 10 FILENAME EXT SIZE DATE TIME - db "%1 %2 %3 %4 %5",0Dh,0Ah,0 ;10 + db "%1 %2 %3 %4 %5",CR,LF,0 ;10 ; 11 DB "COMMANDS:",CR,LF,CR,LF DB "DIR REN | RENAME PATH HELP ",CR,LF diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 766e994..b66cd26 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -12,6 +12,29 @@ ; ; +; SYSTEM.EXE /S /P +; +; /P Primary command processor +; /S Secondary command processor +; /C Execute batch file + +;=====================================================================[] +;Rev. Date Name Description +;---------------------------------------------------------------------[] +;R14 22-09-2023 BAO Исправлен баг "File not found" в команде DIR на пустом разделе +;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION +;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти +;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений +;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP +;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET +;R07 14-12-2002 DNS PARSING BATCH LINE +;R06 12-12-2002 DNS ADD %0, %1, %2 ... +;R05 11-12-2002 DNS IMPLEMENTED %VAR% +;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE +;R03 11-12-2002 DNS NEW VERSION +;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES +;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO +;=====================================================================[] includelua 'Shared_includes/lua/Functions.lua' include 'shared_includes/constants/bios_equ.inc' diff --git a/SHELL/build.txt b/SHELL/build.txt index 8323328..780fea9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -67 \ No newline at end of file +77 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b593cb6..a4f1028 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b593cb606636c961e49597b9b1e5b6ee72d191c9 +Subproject commit a4f102897a7fa7488c1e64cf8329f5659c6b0d6b From ca947dec9291239ff51517bb4fd43bd590b59298 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 23 Sep 2023 07:16:52 +1000 Subject: [PATCH 038/219] =?UTF-8?q?INITDVC:=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BD=D0=B0=20=D0=B2=D1=8B=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=B7=D0=B0=20=D0=B3=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D1=8B=20=D0=B2=20DEVICE,=20LOGDRV,=20RAMDTBL.=20=D0=9E?= =?UTF-8?q?=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS_X.ASM | 2 +- DSS/DRV-MAIN.ASM | 43 ++++- DSS/Media_drivers/ide-drv.asm | 256 ++++++++++++----------------- DSS/Media_drivers/ram_disk-drv.asm | 30 ++-- DSS/Media_drivers/shared-drv.asm | 25 ++- DSS/NScanDRV.ASM | 180 ++++++++++++++++++++ DSS/build.txt | 2 +- DSS/defines.inc | 2 +- Shared_Includes | 2 +- 9 files changed, 361 insertions(+), 181 deletions(-) create mode 100644 DSS/NScanDRV.ASM diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 5ed58b8..f44cd3f 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -570,7 +570,7 @@ BACK_CUR_PATH: ; вход: нет ; выход: A - номер последнего лог. диска в системе ;/////////////////////////////////////////////////////////////////////// - INCLUDE 'ScanDRV.asm' + INCLUDE 'ScanDRV.asm' ; INCLUDE 'NScanDRV.asm' ;/////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 1f0eebb..9d25bfa 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -441,17 +441,50 @@ INITDVC_RET_DRIVE: INCLUDE 'dss/media_drivers/fdd-drv.asm' INCLUDE 'dss/media_drivers/ram_disk-drv.asm' -DEVICE_CFG: +; +;------------------------[shared-drv.asm table]------------------------; +DEVICE: ;BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +.TBL_Entry EQU 3 +.Size: EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ;DB #FF +;----------------------------------------------------------------------; +; + +; +;-------------------------[ IDE-DRV.ASM table]-------------------------; +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 FREE +;+15 +LOGDRV EQU $ + DEVICE.Size +.TBL_Entry EQU 16 +.Size EQU .TBL_Entry * DSS_MAX_DRIVES_AMOUNT +;----------------------------------------------------------------------; +; + +; +;-----------------------[ram_disk-drv.asm table]-----------------------; +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER +RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size +.TBL_Entry EQU 2 +.Size EQU .TBL_Entry * MAX_RAMDRIVES +; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry +; DB #FF +; EDUP +; .Size EQU $-RAMDTBL +;----------------------------------------------------------------------; +; + + +; DRV_TEMP_BUFFER: -; - -; ;---------[256 bytes stack for return pages of RST #18 callers]--------; ; #3F00 - #3FFF DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF ;----------------------------------------------------------------------; - ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" +; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" ; ENDMODULE ; OUTEND ;[END] diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 8c92c56..68a298c 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -207,22 +207,32 @@ RESR_H LD A,DSS_Error.drv.INVALID_COMMAND // Commands for restart #18 // //////////////////////////////////////////////////////////////////////// -;!FIXIT ---------------------------------------------------------------------------[v] +;--------------------------------------------------------------------[v] ; c=0 Initialization INIT_H: PUSH IY + ;!TEST ;[ ] + XOR A + LD (DRVCLC.count),A + ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... + ; LD HL,LOGDRV + ; LD (HL),#FF + ; LD DE,LOGDRV+1 + ; LD BC,LOGDRV.Size-1 + ; LDIR + ; LD HL,LOGDRV LD (OFFSECT),HL - ; IN A,(SLOT2) - ; PUSH AF - ; IN A,(SLOT0) - ; OUT (SLOT2),A - - ;LD IX,DEVICE_CFG+#8000 ; могло засрать память LD IX,SYS_PAGE.TMP_BUFFER LD C,BIOS.DRV_LIST RST ToBIOS - + ; DRV_LIST: + ; +0 LEN + ; +1 FDD COUNT + ; +2 HDD COUNT + ; +3 CDROM COUNT + ; +4 RESERVED (28) + ; IN A,(SLOT3) LD C,A LD A,SYS_PAGE @@ -246,91 +256,46 @@ NX_DVCI: PUSH BC INC C JR C,NX_DVCI DJNZ NX_DVCI - - -; c=0 Initialization -; INIT_H: PUSH IY -; LD HL,LOGDRV -; LD (OFFSECT),HL -; LD IX,DEVICE_CFG ;!FIXIT не засрет ли память? -; LD C,BIOS.DRV_LIST -; RST ToBIOS -; XOR A -; ;!TEST -; ;LD B,(IX+2) -; ;CP B -; CP (IX+2) ;HDD -; JR Z,NO_HARDS -; LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT -; ;LD C,#80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT - -; NX_DVCI: PUSH BC -; LD A,C -; LD (DRV_NUM),A -; LD C,BIOS.DRV_DETECT -; RST ToBIOS -; ;JR C,.NO_DRIVE -; CALL NC,PARTIT -; POP BC -; INC C -; ;JR C,NX_DVCI -; DJNZ NX_DVCI -;!FIXIT ---------------------------------------------------------------------------[^] -; - + ; NO_HARDS: POP IY - LD HL,(OFFSECT) - LD DE,LOGDRV - XOR A - SBC HL,DE - RET Z - LD DE,LD_DSK -DRVCLC: INC A - SBC HL,DE - JR NZ,DRVCLC + ;!TEST + ; LD HL,(OFFSECT) + ; LD DE,LOGDRV + ; XOR A + ; SBC HL,DE + ; RET Z + ; LD DE,LOGDRV.TBL_Entry +DRVCLC: ; INC A + ; SBC HL,DE + ; JR NZ,DRVCLC + ; +.count+1: LD A,0 + ; AND A RET +;---------------------------------------------------------------------[^] -;DEVICE_CFG EQU #4000 ;!TEST -;DEVICE_CFG EQU DRV_TEMP_BUFFER ;!TEST -; DB 0 ;LEN -; DB 0 ;FDD COUNT -; DB 0 ;HDD COUNT -; DB 0 ;CDROM COUNT -; DS 28 ;RESERVED - - -;+00 ;SECTORS PER TRACK -;+01 ;TRACKS PER CYLLINDER -;+02 ;RESERVED -;+03 ;HDD/DRIVE/LBA -;+04 ;SECTOR PER CYLINDER LOW -;+05 ;SECTOR PER CYLINDER HIGH -;+06 ;RESERVED -;+07 ;RESERVED - - -;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -;+01 LONG SECTOR OFFSET -;+05 LONG SIZE IN SECTORS -;+09 FREE -;+15 -LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы -.TBL_Entry EQU 16 -.Size EQU $-LOGDRV +; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +; ;+01 LONG SECTOR OFFSET +; ;+05 LONG SIZE IN SECTORS +; ;+09 FREE +; ;+15 +; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы +; .TBL_Entry EQU 16 +; .Size EQU $-LOGDRV SELHDD: PUSH DE PUSH BC PUSH HL ;!TEST - ;SLA A - ;RLCA - ;SLA A - ;LD L,A - ;LD H,0 - ;RL H - ;ADD HL,HL + ; SLA A + ; RLA + ; SLA A + ; LD L,A + ; LD H,0 + ; RL H + ; ADD HL,HL ; ; original LD L,A @@ -428,7 +393,7 @@ HGETPRM: LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET NZ - + ; PUSH IX PUSH IY LD H,0 @@ -440,17 +405,15 @@ HGETPRM: LD C,L LD IY,LOGDRV ADD IY,BC - ; LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -;!TEST --------------------------------------------------------------------------------+ PUSH IY LD C,BIOS.DRV_GET_PAR RST ToBIOS POP IY LD A,DSS_Error.drv.INVALID_DRIVE JR C,.error - + ; перетасовка регистров с результатом от BIOS EX DE,HL LD C,E LD E,D @@ -458,8 +421,7 @@ HGETPRM: LD A,B LD B,D EXX - - ;SECTORS ON LOGICAL DISK + ; SECTORS ON LOGICAL DISK LD E,(IY+5) LD D,(IY+6) LD L,(IY+7) @@ -468,37 +430,7 @@ HGETPRM: EX AF,AF' LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' - -; LD C,A -; LD IY,SYS_PAGE.IDE_0 -; AND #0F -; JR Z,GELH1 -; LD IY,SYS_PAGE.IDE_1 -; CP 2 -; JR C,GELH1 -; LD IY,SYS_PAGE.IDE_2 -; JR Z,GELH1 -; LD IY,SYS_PAGE.IDE_3 -; GELH1: IN A,(SLOT3) -; PUSH AF -; LD A,SYS_PAGE -; OUT (SLOT3),A - -; LD A,(IY+HDD_INIT_TABLE.DRV_Flags) ;HDD/DRV -; EXX -; LD L,(IY+HDD_INIT_TABLE.CylinderNumberLow) ;CYLINDER LOW + -; LD H,(IY+HDD_INIT_TABLE.CylinderNumberHigh) ;CYLINDER HIGH + -; LD E,(IY+HDD_INIT_TABLE.HeadsNumber) ;HEADS + -; LD D,0 -; LD C,(IY+HDD_INIT_TABLE.SectorsPerTrack) ;SECTORS + -; LD B,0 -; EXX -; EX AF,AF' -; POP AF -; OUT (SLOT3),A -; LD A,C -; EX AF,AF' -;!TEST --------------------------------------------------------------------------------+ + ; AND A .error: POP IY POP IX @@ -632,32 +564,56 @@ HIGHDOS: LD (IX+2),D LD (IX+3),L LD (IX+4),H -; LD DE,(CURSECL) -; LD HL,(CURSECH) -; LD (IX+1),E ;START DISK -; LD (IX+2),D -; LD (IX+3),L -; LD (IX+4),H LD E,(IY+12) LD D,(IY+13) LD L,(IY+14) LD H,(IY+15) - LD (IX+5),E ;SIZE DISK + LD (IX+5),E ;SIZE DISK LD (IX+6),D LD (IX+7),L LD (IX+8),H + ;!TEST Подстраховка от переполнения таблицы LOGDRV + LD A,(DRVCLC.count) + INC A + CP DSS_MAX_DRIVES_AMOUNT+1 + RET NC + LD (DRVCLC.count),A + ; LD A,(DRV_NUM) LD (IX+0),A - LD DE,LD_DSK ; DSKITEM + LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE LD (OFFSECT),IX -NXTPART LD DE,#10 +NXTPART: + LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry ADD IY,DE POP BC DJNZ DOSAGA AND A RET + + ; +NOEXTDS: + CP #0F + JR Z,SUBLEV + CP #0E + JR Z,HIGHDOS + CP 6 + JR Z,HIGHDOS + CP 4 + JR Z,MEDIDOS + CP 1 + JR Z,EASYDOS + POP BC + OR A + RET Z +NODEFIN: + SCF + RET + ; + + PARTIT: IN A,(SLOT3) PUSH AF LD A,SHARED_PAGE @@ -667,28 +623,31 @@ PARTIT: IN A,(SLOT3) OUT (SLOT3),A RET -PARTIT1 LD IX,0 +PARTIT1: + LD IX,0 LD DE,0 LD (EXTDOSL),DE ;R01 LD (EXTDOSH),IX ;R01 -PARTIT2 LD (CURSECL),DE +PARTIT2: + LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC ;!TEST ;RET C ; for absent drive ; - LD HL,(PART+510) ;!HARDCODE + LD HL,(PART+510) ;!HARDCODE Signature word LD DE,#AA55 AND A SBC HL,DE JR NZ,NODEFIN - LD IY,PART+#01BE ;!HARDCODE - LD B,4 -DOSAGA PUSH BC + ; + LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR + LD B,4 ;!HARDCODE MBR: Number of entries in the partition table +DOSAGA: PUSH BC LD A,(IY+4) CP 5 JR NZ,NOEXTDS -SUBLEV PUSH IY +SUBLEV: PUSH IY LD DE,(CURSECL) LD IX,(CURSECH) PUSH DE @@ -701,22 +660,7 @@ SUBLEV PUSH IY CALL LOADSEC POP IY JP NXTPART -NOEXTDS CP #0F - JP Z,SUBLEV - CP #0E - JP Z,HIGHDOS - CP 6 - JP Z,HIGHDOS - CP 4 - JP Z,MEDIDOS - CP 1 - JP Z,EASYDOS - POP BC - OR A - RET Z -NODEFIN SCF - RET - + ; EXTDOS: LD HL,(EXTDOSL) LD DE,(EXTDOSH) LD A,L @@ -732,8 +676,9 @@ EXTDOS: LD HL,(EXTDOSL) LD (EXTDOSH),HL LD IX,(EXTDOSH) JP PARTIT2 - -EXTDOS2 LD IX,(EXTDOSL) + ; +EXTDOS2: + LD IX,(EXTDOSL) ADD IX,DE PUSH IX LD DE,(EXTDOSH) @@ -743,7 +688,8 @@ EXTDOS2 LD IX,(EXTDOSL) POP DE JP PARTIT2 -LOADSEC PUSH IY +LOADSEC: + PUSH IY LD IX,(CURSECL) LD HL,(CURSECH) LD DE,PART diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 87bb46e..c907f7a 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -311,9 +311,15 @@ INIT_RD: ; JR NC,.loop ; LD (S_P_P),A + ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... ;[ ] + ; LD HL,RAMDTBL + ; LD (HL),#FF + ; LD DE,RAMDTBL+1 + ; LD BC,RAMDTBL.Size-1 + ; LDIR + LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk LD DE,RAMDTBL - .initLoop: PUSH BC LD A,B @@ -345,16 +351,16 @@ INIT_RD: ; LD HL,ENDDRVR AND A RET - -;!TODO воткнуть эти всякие таблицы в конец файла и активировать как структуры, чтоб бинарник меньше весил -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL.TBL_Entry EQU 2 -RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry - DB #FF - EDUP -.Size EQU $-RAMDTBL -; + +; ; +; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER +; RAMDTBL.TBL_Entry EQU 2 +; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry +; DB #FF +; EDUP +; .Size EQU $-RAMDTBL +; ; ; 00 - GET DEVICE PARAMETERS @@ -461,8 +467,8 @@ IOCTL_RD: ; RET GET_RAMDRV_NUM: + ADD A,A LD BC,RAMDTBL - SLA A ADD A,C LD C,A LD A,0 diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index c4c3541..3ec6149 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -162,9 +162,9 @@ NODEV: POP BC RET PDEVICE DW DEVICE -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*.TBL_Entry,#FF -.Size: DB #FF -.TBL_Entry EQU 3 +; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +; .Size: DB #FF +; .TBL_Entry EQU 3 FLOPPY EQU #0001 FIXED EQU #0002 @@ -210,6 +210,12 @@ INITDVC: XOR A LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку + ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... ;[ ] + LD HL,DEVICE + LD (HL),#FF + LD DE,DEVICE+1 + LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 + LDIR ; FDD девайсы CALL FDDRIVE.INIT ; узнать число FDD-девайсов LD DE,FDDRIVE ; адрес обработчика тек. девайса @@ -232,10 +238,19 @@ MAKEDVC: LD C,A LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска ADD A,(HL) LD (HL),A - LD A,C - LD C,0 ; сбр. + ;!TEST ;[ ] оптимизировать было лень + CP DSS_MAX_DRIVES_AMOUNT+1 + JR C,1F + LD (HL),DSS_MAX_DRIVES_AMOUNT + SUB DSS_MAX_DRIVES_AMOUNT + NEG + ADD C + JP 2F + ; +1: LD A,C OR A RET Z ; нет девайсов +2: LD C,0 ; сбр. LD HL,(PDEVICE) ; тек. полож. в таблице .loop: LD (HL),C ; номер лог.драйва этого устройства INC HL diff --git a/DSS/NScanDRV.ASM b/DSS/NScanDRV.ASM new file mode 100644 index 0000000..a94eb3e --- /dev/null +++ b/DSS/NScanDRV.ASM @@ -0,0 +1,180 @@ +; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе +SCANDRV: +;1 [-----------] [-----------] [-----------] [-----------] [-----------] + ; LD A,(LDRIVE) + ; LD (.old_ldrive),A + ; LD A,(FATCASH.Update) + ; OR A + ; CALL NZ,WR_FAT + + CALL GETBOOT + LD (.old_letter),A ; bootdisk Log.number +; [-----------] + +;2 [-----------] [-----------] [-----------] [-----------] [-----------] + ; A = bootdisk Log.number + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + EX AF,AF' + LD (.old_DRIVE_ID),A +; [-----------] + + +;3 [-----------] [-----------] [-----------] [-----------] [-----------] + ;!TEST в DRV-MAIN могут быть проблемы с прерываниями + ;DI + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A + ;EI + ; +; [-----------] + +;4 [-----------] [-----------] [-----------] [-----------] [-----------] +.old_DRIVE_ID+1: + LD A,0 + CALL SETBOOT + JR C,.ERROR_BOOTDRV_DIES + LD (.new_letter),A + ; + LD A,(.old_letter) + LD (BOOTDRV),A +; + +;5 [-----------] [-----------] [-----------] [-----------] [-----------] + AND A + LD A,R + PUSH AF + DI + ;;;;;;;; + IN A,(SLOT3) + LD (.restore_page),A + LD A,(DRV_PG_NUMBER) + OUT (SLOT3),A + ;;;;; + + ; вычисляем смещение bootdisk в новой таблице DEVICE +.new_letter+1: + LD A,0 + CALL .get_entry_addr + PUSH HL + ; сохраняем значения нового boot + LD DE,.TMP_BUFFER + LD BC,DEVICE.TBL_Entry + LDIR + ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE +.old_letter+1: + LD A,0 + CALL .get_entry_addr + ; меняем букву диска для девайса занявшего старую букву bootdisk + POP DE + LD BC,DEVICE.TBL_Entry + LDIR + ; восстанавливаем bootdisk на старое место + DEC HL + LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 + LD BC,DEVICE.TBL_Entry + EX DE,HL + LDDR + ; проверяем, не увеличилось ли значение LDRIVE + ;!TEST + LD HL,.old_letter + LD A,(LDRIVE) + CP (HL) + JR NC,.no_change_LDRIVE + LD A,(HL) + LD (LDRIVE),A + ; +; .old_ldrive+1: + ;LD L,0 + ;LD A,(LDRIVE) + ;CP L + ;JR NC,.no_change_LDRIVE + ;LD A,L + ;LD (LDRIVE),A + ; +.no_change_LDRIVE: + ; + ; DEC A + ; CALL DISKINF + ; LD A,(BOOTDRV) + ; CALL CHNDISK + ;;;;; +.restore_page+1: + LD A,0 + OUT (SLOT3),A + ;;;;;;;; + POP AF + LD A,(LDRIVE) + RET PO + EI + RET +.ERROR_BOOTDRV_DIES: + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S + LD E,0 + RST ToBIOS + + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + LD DE,0 + LD HL,#2050 + RST ToBIOS + + LD A,1 + OUT (RGMOD),A ; set scr-2 + + LD HL,.ERROR_MSG + LD DE,#A000 + LD BC,.ERROR_MSG.size + LD A,C + LDIR + + LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + +.loop: DI +; .loop: LD A,R +; AND 7 +; OUT (BorderColor),A + HALT + JR .loop + +.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +.ERROR_MSG.size EQU $-.ERROR_MSG +.get_entry_addr: + _CALC_DEVICE_ENTRY DEVICE + #C000 + RET +; +.TMP_BUFFER: BLOCK 3,#FF + +; .old_letter: DB #FF +; .old_DRIVE_ID: DB #FF +; .new_letter: DB #FF + + + +/* +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO +;+13 WORD FREE +;+15 BYTE FREE + +LOGDRV: BLOCK .TBL_Entry*LD_DSK,0 ; ld_dsk = 16 +.TBL_Entry EQU 16 +.Size EQU $-LOGDRV + + +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +.Size: DB #FF +.TBL_Entry EQU 3 +*/ \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 2c136b2..3c7d064 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -302 \ No newline at end of file +312 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index fd0b202..acc2c34 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -8,7 +8,7 @@ ; ; -LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе +;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE MAX_RAMDRIVES 16 DEFINE NeedSafePort_Y 1 diff --git a/Shared_Includes b/Shared_Includes index a4f1028..6eacd64 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a4f102897a7fa7488c1e64cf8329f5659c6b0d6b +Subproject commit 6eacd6475231a504fae4ed03a12f5cd1cb166ac0 From 7bbdc8de36e38e87e6b1d63332f6ab09f6440d82 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 28 Sep 2023 05:08:25 +1000 Subject: [PATCH 039/219] new SCANDRV in DSS. in SHELL fixed bug in READBAT proc. --- DOS/DOS.ASM | 2 +- DSS/DOS5.ASM | 2 +- DSS/DOS_FM.ASM | 6 +- DSS/DOS_X.ASM | 4 +- DSS/DRV-MAIN.ASM | 231 +++----- DSS/DSS-MAIN.ASM | 7 +- DSS/DSS_MACROSES.Z80 | 24 +- DSS/Media_drivers/ide-drv.asm | 57 +- DSS/Media_drivers/ram_disk-drv.asm | 96 +++- DSS/Media_drivers/shared-drv.asm | 16 +- DSS/NScanDRV.ASM | 818 ++++++++++++++++++++++++++++- DSS/ScanDRV.ASM | 2 +- DSS/Structures.inc | 4 +- DSS/VIDEO.ASM | 15 +- DSS/build.txt | 2 +- DSS/defines.inc | 8 +- SHELL/BATCH.ASM | 6 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 19 files changed, 1040 insertions(+), 264 deletions(-) diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM index 80d8a4a..fd9bb15 100755 --- a/DOS/DOS.ASM +++ b/DOS/DOS.ASM @@ -1163,7 +1163,7 @@ A10AB: pop af ; 6 - принтер готов/выводит очередной символ (1/0) ; 7 - принтер свободен/занят (1/0) ; -; вход: A - символ +; вход: A - символ ; выход: B - символ ; CF - ошибка, A=байт состояния (биты 7..3) ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index b46492d..9104c75 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -1065,7 +1065,7 @@ DIRSIZE: WORD 0 ; раз ; Массив лог. номеров банок расширения ДОС -BANKTBL: BLOCK USING_MEMPAGES,#FF +BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index b34e010..3d1d678 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -43,7 +43,7 @@ FM_BUF: _sFM ; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND - CP FMCOUNT+1 + CP FMCOUNT JR NC,ABS_FM PUSH DE @@ -63,7 +63,7 @@ FM_BUF: _sFM SET_FM: _mFM_FIND - LD A,0 ;!HARDCODE номер ошибки + LD A,DSS_Error.sys.NO_ERROR RET NZ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE SCF @@ -72,7 +72,7 @@ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE RES_FM: _mFM_FIND - LD A,5 + LD A,DSS_Error.sys.INVALID_HANDLE EXX SCF RET Z diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index f44cd3f..aa59cf1 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -570,8 +570,8 @@ BACK_CUR_PATH: ; вход: нет ; выход: A - номер последнего лог. диска в системе ;/////////////////////////////////////////////////////////////////////// - INCLUDE 'ScanDRV.asm' -; INCLUDE 'NScanDRV.asm' +; INCLUDE 'ScanDRV.asm' + INCLUDE 'NScanDRV.asm' ;/////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 9d25bfa..db4701e 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -65,11 +65,13 @@ A0010: ;JP DRV_PAGE.RST_10 ; ; <[DRIVE API]> ; BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode ;A0018 JP INTDISK ; -A0018: PUSH AF ; - PUSH BC ; +A0018: ;PUSH AF ; + ;PUSH BC ; + SCF + RET DRV_PAGE.MAIN_PAGE_NUMBER+2: ; LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? - JP PORTAL.outDRV ; + ;JP PORTAL.outDRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; @@ -207,13 +209,13 @@ ADCALL+1: CALL DISPATCH ; ;!FIXIT чёт не то тут ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; - LD B,#00; ; - OUT (C),A ; -;--- ; - POP BC ; - RET ; -PORTAL.outDRV: ; - RET ; +; LD B,#00; ; +; OUT (C),A ; +;--- ; +; POP BC ; +; RET ; +;PORTAL.outDRV: ; +; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -441,11 +443,13 @@ INITDVC_RET_DRIVE: INCLUDE 'dss/media_drivers/fdd-drv.asm' INCLUDE 'dss/media_drivers/ram_disk-drv.asm' +/////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\; ; ;------------------------[shared-drv.asm table]------------------------; -DEVICE: ;BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +DEVICE EQU $ .TBL_Entry EQU 3 -.Size: EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ;DB #FF +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +.End EQU DEVICE.Size + 1 ; для стоп-байта #FF ;----------------------------------------------------------------------; ; @@ -456,17 +460,32 @@ DEVICE: ;BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 -LOGDRV EQU $ + DEVICE.Size +LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU 16 -.Size EQU .TBL_Entry * DSS_MAX_DRIVES_AMOUNT +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +; ВХОД: L - логический номер в таблице +; ВЫХОД: IY - начало записи +; ПОРТИТ: HL, IY. HL<-->DE +; MACRO LOGDRV_ENTRY_FIND tbl_addr +; LD H,0 +; ADD HL,HL +; ADD HL,HL +; ADD HL,HL +; ADD HL,HL +; ;LD B,H +; ;LD C,L +; EX DE,HL +; LD IY,tbl_addr +; ADD IY,DE +; ENDM ;----------------------------------------------------------------------; ; ; ;-----------------------[ram_disk-drv.asm table]-----------------------; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size +; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) +RAMDTBL EQU LOGDRV + LOGDRV.Size .TBL_Entry EQU 2 .Size EQU .TBL_Entry * MAX_RAMDRIVES ; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry @@ -475,10 +494,57 @@ RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size ; .Size EQU $-RAMDTBL ;----------------------------------------------------------------------; ; +////////////////////////////////////////////////////////////////////////; +///////////////////////// [ DRIVE TABLES COPY] \\\\\\\\\\\\\\\\\\\\\\\\\; + MODULE OLD_TABLES +; +;------------------------[shared-drv.asm table]------------------------; +DEVICE EQU @RAMDTBL + @RAMDTBL.Size +.TBL_Entry EQU @DEVICE.TBL_Entry +.Size: EQU @DEVICE.Size +.End EQU @DEVICE.End +;----------------------------------------------------------------------; +; + ; -DRV_TEMP_BUFFER: +;-------------------------[ IDE-DRV.ASM table]-------------------------; +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 FREE +;+15 +LOGDRV EQU DEVICE + DEVICE.End +.TBL_Entry EQU @LOGDRV.TBL_Entry +.Size EQU @LOGDRV.Size +;----------------------------------------------------------------------; +; + +; +;-----------------------[ram_disk-drv.asm table]-----------------------; +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) +RAMDTBL EQU LOGDRV + LOGDRV.Size +.TBL_Entry EQU @RAMDTBL.TBL_Entry +.Size EQU @RAMDTBL.Size +; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry +; DB #FF +; EDUP +; .Size EQU $-RAMDTBL +;----------------------------------------------------------------------; +; + ENDMODULE +////////////////////////////////////////////////////////////////////////; + DISPLAY "DEVICE start: ", /H, DEVICE + DISPLAY "Old DEVICE start: ", /H, OLD_TABLES.DEVICE + DISPLAY "LOGDRV start: ", /H, LOGDRV + DISPLAY "Old LOGDRV start: ", /H, OLD_TABLES.LOGDRV + DISPLAY "RAMDTBL start: ", /H, RAMDTBL + DISPLAY "Old RAMDTBL start: ", /H, OLD_TABLES.RAMDTBL + +; +;DRV_TEMP_BUFFER: ;---------[256 bytes stack for return pages of RST #18 callers]--------; ; #3F00 - #3FFF @@ -487,133 +553,4 @@ DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF ; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" ; ENDMODULE ; OUTEND -;[END] - -/* -; -; NEW RESCAN -;=====================================================================[] -; логический номер устройства + адрес обработчика. -; Порядковый номер * 3 = буква диска + "A" -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF -.Size: EQU $-DEVICE - -; Логический номер раздела. -;Номер группы = логический номер раздела HDD из DEVICE -LOGDRV: BLOCK 16*LD_DSK,0 -.Size: EQU $-LOGDRV -;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -;+01 LONG SECTOR OFFSET -;+05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) -;+09 FREE -;+15 - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL: DUP MAX_RAMDRIVES * 2 - DB #FF - EDUP -.Size EQU $-RAMDTBL - - - - -INTDISK: - ;R01 - CP #FF - JR NZ,.noNeedRescan - CP C - JR Z,INITDVC_RET_DRIVE -.noNeedRescan: - ; - PUSH HL - PUSH BC - ADD A,A - ADD A,A - LD C,A - LD B,0 - LD HL,DEVICE - ADD HL,BC - LD A,(HL) - CP #FF - JR Z,NODEV - INC HL - INC HL - LD C,(HL) - INC HL - LD H,(HL) - LD L,C - POP BC - EX (SP),HL - RET -NODEV: POP BC - POP HL - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET - - - -INITDVC: XOR A - LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку - LD HL,DEVICE - LD (PDEVICE),HL ; восст. ячейку - ; FDD девайсы - CALL FDDRIVE.INIT ; узнать число FDD-девайсов - LD DE,FDDRIVE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы - ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET -.if_old: CALL INIT_H - ;CALL .CHECK_HDD - LD DE,HDDRIVE - CALL MAKEDVC - ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE - CALL MAKEDVC - XOR A - RET -.CHECK_HDD: - - RET - - - ;R01 -INITDVC_RET_DRIVE: - LD DE,DRV_TEMP_BUFFER - LD HL,DEVICE - LD BC,DEVICE.Size - LDIR - LD HL,LOGDRV - LD BC,LOGDRV.Size - LDIR - LD HL,RAMDTBL - LD BC,RAMDTBL.Size - LDIR - - CALL INITDVC - - ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его - LD HL,DEVICE - LD DE,DRV_TEMP_BUFFER - LD B,DEVICE.Size -.loop_DEVICE: - LD A,(DE) - CP (HL) - CALL NZ,.FIND_DEV - INC HL - INC DE - DJNZ .loop_DEVICE - - LD A,(DRV_PAGE.LDRIVE) - AND A - RET - ; - - -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF -;=====================================================================[] -; -; -*/ \ No newline at end of file +;[END] \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index fca761f..e5fff67 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -540,7 +540,12 @@ DEPLOY: LD HL,BANKTBL + #C000 LD C,BIOS.GetMemBlkPages RST ToBIOS - + ; должна идти после GetMemBlkPages, чтоб вместо + ; закрывашки #FF поставить страницу COREPAGE + LD HL,BANKTBL + COREPAGE + IN A,(SLOT0) + LD (HL),A + POP AF OUT (SLOT3),A diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index cf1ca15..7a5b496 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -98,9 +98,31 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ENDM ; +; +; ВХОД: L - логический номер в таблице +; ВЫХОД: IY - начало записи +; ПОРТИТ: HL, IY. HL<-->DE + MACRO LOGDRV_ENTRY_FIND tbl_addr + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ;LD B,H + ;LD C,L + EX DE,HL + LD IY,tbl_addr + ADD IY,DE + ENDM +; + ; MACRO _CALC_DEVICE_ENTRY tbl_addr - LD C,A + CP DSS_MAX_DRIVES_AMOUNT+1 + JR C,.norm + ; Error! + LD A,DSS_MAX_DRIVES_AMOUNT +.norm: LD C,A ADD A,A ADD A,C LD C,A diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 68a298c..db56665 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -213,13 +213,6 @@ INIT_H: PUSH IY ;!TEST ;[ ] XOR A LD (DRVCLC.count),A - ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... - ; LD HL,LOGDRV - ; LD (HL),#FF - ; LD DE,LOGDRV+1 - ; LD BC,LOGDRV.Size-1 - ; LDIR - ; LD HL,LOGDRV LD (OFFSECT),HL @@ -285,29 +278,14 @@ DRVCLC: ; INC A ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV + SELHDD: PUSH DE PUSH BC PUSH HL - ;!TEST - ; SLA A - ; RLA - ; SLA A - ; LD L,A - ; LD H,0 - ; RL H - ; ADD HL,HL - ; - ; original - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL ; - EX DE,HL - LD IY,LOGDRV - ADD IY,DE + LD L,A + LOGDRV_ENTRY_FIND LOGDRV + ; LD C,(IY+1) LD B,(IY+2) LD E,(IY+3) @@ -396,15 +374,8 @@ HGETPRM: ; PUSH IX PUSH IY - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD B,H - LD C,L - LD IY,LOGDRV - ADD IY,BC + ; + LOGDRV_ENTRY_FIND LOGDRV ; LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... PUSH IY @@ -449,8 +420,8 @@ STAT_H: XOR A CHEK_H: ;!TEST - ;LD A,#FF - XOR A + LD A,#FF + ;XOR A ; AND A RET @@ -460,15 +431,9 @@ CHEK_H: GBPB_H: PUSH IY PUSH DE LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD B,H - LD C,L - LD IY,LOGDRV - ADD IY,BC + ; + LOGDRV_ENTRY_FIND LOGDRV + ; LD E,(IY+1) LD D,(IY+2) LD L,(IY+3) diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index c907f7a..1d6948e 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -301,24 +301,73 @@ LWRITE_RD: ; XOR A ; RET +; +;; +;;; +;----------------------------------------------------------------------;!TEST +; ;S_P_P DB #00 +; INIT_RD: +; ; .SectorSize EQU 512 ;!HARDCODE +; ; LD HL,.SectorSize +; ; LD A,#80 +; ; .loop: SRL A +; ; RR H +; ; JR NC,.loop +; ; LD (S_P_P),A + +; LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk +; LD DE,RAMDTBL +; .initLoop: +; PUSH BC +; LD A,B +; PUSH DE +; RST ToBIOS +; POP DE +; OR A +; JR Z,.noDRV + +; LD (DE),A +; INC DE +; POP BC +; LD A,B +; LD (DE),A +; INC DE +; JP 1F +; .noDRV: POP BC +; 1: INC B +; LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry +; CP B +; JR NZ,.initLoop + +; LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL +; EX DE,HL +; AND A ;!FIXIT ---- +; SBC HL,DE ;!FIXIT ADD HL,DE +; SRL L +; LD A,L +; ; LD HL,ENDDRVR +; AND A +; RET +;----------------------------------------------------------------------;!TEST +;;; +;; +; + +; +;; +;;; +;----------------------------------------------------------------------;!TEST ;S_P_P DB #00 INIT_RD: -; .SectorSize EQU 512 ;!HARDCODE -; LD HL,.SectorSize -; LD A,#80 +; .SectorSize EQU 512 ;!HARDCODE +; LD HL,.SectorSize +; LD A,#80 ; .loop: SRL A ; RR H ; JR NC,.loop ; LD (S_P_P),A - ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... ;[ ] - ; LD HL,RAMDTBL - ; LD (HL),#FF - ; LD DE,RAMDTBL+1 - ; LD BC,RAMDTBL.Size-1 - ; LDIR - - LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk + LD BC,0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk LD DE,RAMDTBL .initLoop: PUSH BC @@ -328,29 +377,38 @@ INIT_RD: POP DE OR A JR Z,.noDRV - - LD (DE),A + ; INC DE + LD (DE),A + DEC DE + ; POP BC LD A,B LD (DE),A INC DE + INC DE + ; JP 1F + ; .noDRV: POP BC 1: INC B LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry CP B JR NZ,.initLoop - LD HL,RAMDTBL + LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL EX DE,HL - AND A - SBC HL,DE + AND A ;!FIXIT ---- + SBC HL,DE ;!FIXIT ADD HL,DE SRL L LD A,L ; LD HL,ENDDRVR AND A RET +;----------------------------------------------------------------------;!TEST +;;; +;; +; ; ; ; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID @@ -466,15 +524,17 @@ IOCTL_RD: ; AND A ; RET +;!!!!! вызывается в SCANDRV, когда эта процедура в SLOT3, а не в SLOT0 GET_RAMDRV_NUM: - ADD A,A LD BC,RAMDTBL +.skip_tbl: + ADD A,A ADD A,C LD C,A LD A,0 ADC A,B LD B,A - INC BC + ;INC BC LD A,(BC) OR #60 ;!HARDCODE сделать номера разных устройств через метки RET diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index 3ec6149..3fdd291 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -133,20 +133,10 @@ INTDISK: ; PUSH HL PUSH BC - - _CALC_DEVICE_ENTRY DEVICE - ; LD C,A - ; ADD A,A - ; ADD A,C - ; LD C,A - ; LD B,0 - ; LD HL,DEVICE - ; ADD HL,BC - + _CALC_DEVICE_ENTRY DEVICE LD A,(HL) - INC A + CP #FF JR Z,NODEV - DEC A INC HL LD C,(HL) INC HL @@ -210,7 +200,7 @@ INITDVC: XOR A LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку - ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... ;[ ] + ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] LD HL,DEVICE LD (HL),#FF LD DE,DEVICE+1 diff --git a/DSS/NScanDRV.ASM b/DSS/NScanDRV.ASM index a94eb3e..68c2d84 100644 --- a/DSS/NScanDRV.ASM +++ b/DSS/NScanDRV.ASM @@ -1,3 +1,4 @@ +/* ; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе SCANDRV: ;1 [-----------] [-----------] [-----------] [-----------] [-----------] @@ -22,14 +23,10 @@ SCANDRV: ;3 [-----------] [-----------] [-----------] [-----------] [-----------] - ;!TEST в DRV-MAIN могут быть проблемы с прерываниями - ;DI - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A - ;EI - ; + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A ; [-----------] ;4 [-----------] [-----------] [-----------] [-----------] [-----------] @@ -158,23 +155,816 @@ SCANDRV: ; .old_letter: DB #FF ; .old_DRIVE_ID: DB #FF ; .new_letter: DB #FF +*/ + IF 1 +SCANDRV: +; 0. запоминаем состояние прерываний +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,R + DI + PUSH AF +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 1. запоминаем бут-диск +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + CALL GETBOOT + LD (.old_letter),A + ;; A = bootdisk Log.number + ;;!FIXIT можно доставать из сохраненной таблицы когда понадобится + ; LD DE,Dss.DRV.GenIOCTL.Enter + ; LD BC,Dss.DRV.GenIOCTL.GetParams + ; RST ToDSS.DRV + ; EX AF,AF' + ;; A = bootdisk number + ; LD (.old_DRIVE_ID),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 2. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + SET_PAGE_X DRVPAGE + PUSH AF + + LD HL,DEVICE + #C000 + LD DE,OLD_TABLES.DEVICE + #C000 + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; + LD A,2 ;!HARDCODE количество таблиц второго уровня (LOGDRV, RMDRIVE) + LD (Fill_if_Exists.tbl),A + ;POP AF + ;OUT (SLOT3),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 3. вызываем рескан +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 4. сравниваем записи старых таблиц с новыми: +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + ;SET_PAGE_X DRVPAGE + ;PUSH AF + + + LD HL,OLD_TABLES.DEVICE + #C000 + LD B,DSS_MAX_DRIVES_AMOUNT +.tbl_scanNew_mainLoop: + PUSH BC + PUSH HL + ; получаем номер процедуры для этой буквы диска + LD A,(HL) + ; + CP #FF + JR Z,.nextN + ; + LD B,A + INC HL + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + ; ищем что за драйв + EX DE,HL + ; FDD? + LD HL,FDDRIVE + AND A + SBC HL,DE + JR Z,.nextN ; пропуск FDD драйвов + ; HDD? + LD HL,HDDRIVE + AND A + SBC HL,DE + ; HDD. Сверка по таблице LOGDRV + JP Z,SCAN_TABLES.HARD_DRV + ; RD? + LD HL,RMDRIVE + AND A + SBC HL,DE + ; RAM Drive. Сверка по таблице RAMDTBL + JP Z,SCAN_TABLES.RAM_DRV + ; CD/DVD? + ;LD HL,CDDRIVE + ;AND A + ;SUB HL,DE + ; CD/DVD. + ; JR Z,SCAN_TABLES.CD_ROM + ; + ; следующий виток +.nextN: POP HL +.nextN2: + INC HL + INC HL + INC HL + POP BC + DJNZ .tbl_scanNew_mainLoop +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 5. сравниваем запись новых таблиц со старыми +; а. если драйв только в новой: +; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; ВХОД: IX - OLD_TABLES.DEVICE +; HL - OLD_TABLES.DEVICE.End +; HL' - разница между адресами старых и новых таблиц +; + INC HL + LD (OLD_TABLES_CURRENT),HL + EXX + LD HL,OLD_TABLES.LOGDRV - LOGDRV + LD B,DSS_MAX_DRIVES_AMOUNT + EXX + ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало) + LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry + #C000 + LD IY,LOGDRV + #C000 + LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop1: LD A,#FF + CP (IX+0) + JR NZ,.loop2_start + ADD IX,DE + DJNZ .loop1 +.loop1_exit: + LD A,C ; закончили считать переменную LDRIVE + LD (DRV_PAGE.LDRIVE + #C000),A + LD (LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 6. проверяем, не грохнулся ли бут-диск. +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +.old_letter+1: + LD A,0 + _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE + #C000 + LD A,(HL) + INC A + JP Z,ERROR_BOOTDRV_DIES + +; .old_DRIVE_ID+1: +; LD A,0 +; CALL SETBOOT +; JR C,.ERROR_BOOTDRV_DIES +; LD (.new_letter),A +; ; +; LD A,(.old_letter) +; LD (BOOTDRV),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 7. заменяем новые таблицы на модифицированные старые +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + #C000 + LD DE,DEVICE + #C000 + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + + POP AF + OUT (SLOT3),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;8. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + POP AF + RET PO + EI + RET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + + ; +.loop2_start: + LD C,B ; начинаем считать переменную LDRIVE + ;LD (LDRIVE),A + ;LD C,A + ; + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B ; сколько шагов вперёд по таблице осталось + LD B,A + ; +.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд + ADD IX,DE + ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов + PUSH IX + PUSH BC + CALL Fill_if_Exists + POP BC + POP IX + ; NC: + ; DE = адрес процедуры обработчика таблицы + ; A = логический номер устройства в таблице обработчика + ; + ; CF - нет больше новых записей + JR C,.loop1_exit + + LD (IX+0),A + LD (IX+1),E + LD (IX+2),D + ; + ; LD A,(LDRIVE) + ; INC A + ; LD (LDRIVE),A + INC C ; добавили драйв + ; + DJNZ .loop2 + JR .loop1_exit + ; + +;;; +Fill_if_Exists: +.tbl+1: LD B,2 ; количество таблиц. пока 2 - LOGDRV и RAMDTBL ;!!!!! восстанавливать + DJNZ 1F + ; B=1, RAMDTBL + LD A,RAMDTBL.TBL_Entry + LD IY,RAMDTBL + #C000 + CALL .RUN + LD DE,RMDRIVE + RET NC + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + RET + ; +1: DJNZ 1F + ; B=2, LOGDRV + LD A,LOGDRV.TBL_Entry + LD IY,LOGDRV + #C000 + CALL .RUN + LD DE,HDDRIVE + RET NC + ; переходим на другую таблицу - RAMDTBL + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + LD HL,OLD_TABLES.RAMDTBL + #C000 + LD (OLD_TABLES_CURRENT),HL + EXX + LD B,MAX_RAMDRIVES + EXX + JR Fill_if_Exists + ; + ; +1: SCF ; unknown table number + RET +; +.RUN: EXX + ; + LD D,0 + LD E,A + PUSH DE + ; + LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы + PUSH BC + CALL Find_Record.loop1 ; ищет в новой таблице новую запись + POP BC + JR NC,1F + ; + POP DE + EXX + RET + ; +1: PUSH IY ; сохраняем текущий адрес новой таблицы + ; + ;EX DE,HL + ;ADD IY,DE + ;EX DE,HL + LD IY,(OLD_TABLES_CURRENT) + ; + LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы + LD C,D ; номер записи в таблице. D=0 + PUSH BC + CALL Find_Record.loop2 + LD A,C + POP BC + JR NC,1F + ; + POP DE + POP DE + EXX + RET + ; +1: EX (SP),IY ; переключение со старой на новую таблицу + PUSH IY + EXX + ; перекидываем запись из новой в старую + POP HL + POP DE + POP BC + LDIR + + LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы + AND A + RET +OLD_TABLES_CURRENT: WORD 0 + +; ВХОД: A - Маска для сравнения +; DE - Длина одной записи +; IY - Адрес данных в таблице +; ВЫХОД: NC: +; IY - начало подходящей записи +; C - номер новой записи в старой таблице +; CF - Не найдено, таблица закончилась +Find_Record: +.loop1: CP (IY) + RET NC + ADD IY,DE + INC C + DJNZ .loop1 + ; таблицу прошерстили + SCF + RET +.loop2: CP (IY) + RET Z + ADD IY,DE + INC C + DJNZ .loop2 + ; таблицу прошерстили + SCF + RET +;;; + +ERROR_BOOTDRV_DIES: + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S + LD E,0 + RST ToBIOS + + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + LD DE,0 + LD HL,#2050 + RST ToBIOS + + LD A,1 + OUT (RGMOD),A ; set scr-2 + + LD HL,.ERROR_MSG + LD DE,#A000 + LD BC,.ERROR_MSG.size + LD A,C + LDIR + + LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + +.loop: DI +; .loop: LD A,R +; AND 7 +; OUT (BorderColor),A + HALT + JR .loop + +.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +.ERROR_MSG.size EQU $-.ERROR_MSG + +; +; НЕ ГРОХАТЬ HL! +; а. если драйв есть в новой и старой, то затираем в новой +; таблице совпавший драйв +; б. если драйв есть только в старой, то: +; б1) грохаем файловые манипуляторы с его номером + MODULE SCAN_TABLES +; вход: B - лог.номер драйва, DE +RAM_DRV: + ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL + LD A,B + LD BC,OLD_TABLES.RAMDTBL + #C000 + CALL GET_RAMDRV_NUM.skip_tbl + #C000 + LD (.cur_drv),BC + AND #0F + LD C,A ; номер рамдиска + ; Ищем в новой такой же номер рамдиска + LD B,MAX_RAMDRIVES + LD DE,RAMDTBL + #C000 +.loop: LD A,(DE) + SUB C + JR Z,.found + INC DE + INC DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; грохаем в старой RAMDTBL этот драйв + EX DE,HL +.cur_drv+1: + LD HL,0 + LD (HL),#FF + DEC HL + LD (HL),#FF + EX DE,HL + JP SCANDRV.nextN2 + ; +.found: DEC A + ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (DE),A + DEC DE + LD (DE),A + JP SCANDRV.nextN + +HARD_DRV: + LD L,B + LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV + #C000 + LD IX,LOGDRV + #C000 + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop: LD A,(IY+0) + ;CP #FF + ;JR Z,.skip + CP (IX+0) + JR NZ,.skip + ; + LD A,(IY+1) + CP (IX+1) + JR NZ,.skip + LD A,(IY+2) + CP (IX+2) + JR Z,.found + ; +.skip: ADD IX,DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Грохаем старую запись в OLD_TABLES.LOGDRV + LD A,#FF + LD (IY+0),A + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; + JP SCANDRV.nextN2 + ; +.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (IX+0),#FF + JP SCANDRV.nextN + ; +; CD_ROM: +; JP SCANDRV.nextN + +; ВХОД: HL - текущая запись в таблице DEVICE +; B - шаг общего цикла +KILL_FM: + ; + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B + LD C,A + ; втыкаем страницу ядра с таблицей файловых манипуляторов + PUSH BC + SET_PAGE_X COREPAGE + POP BC + PUSH AF + ; Шерстим манипуляторы на наличие в них грохнутого драйва + LD IY,FM_BUF-FM_BUF.Size + #C000 + LD B,FMCOUNT + LD DE,FM_BUF.Size +.loop_fm: + ADD IY,DE + LD A,(IY+_sFM.DRIVE) + CP C + JR NZ,.skip + XOR A + LD (IY+_sFM.NAME),A ; грохаем манипулятор +.skip: DJNZ .loop_fm + ; + POP AF + OUT (SLOT3),A + ; + ; грохаем в OLD_TABLES.DEVICE убитый драйв + LD (HL),#FF + ; + RET + ENDMODULE + + ENDIF /* +[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78 + 416 + 32 == 526 + +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE EQU $ +.TBL_Entry EQU 3 +.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF +.Size EQU .End - $ + ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO ;+13 WORD FREE ;+15 BYTE FREE +; Логический номер раздела. +;Номер группы = логический номер раздела HDD из DEVICE +LOGDRV EQU DEVICE + DEVICE.Size +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry -LOGDRV: BLOCK .TBL_Entry*LD_DSK,0 ; ld_dsk = 16 -.TBL_Entry EQU 16 -.Size EQU $-LOGDRV +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID +RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size +.TBL_Entry EQU 2 +.Size EQU .TBL_Entry * MAX_RAMDRIVES -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF -.Size: DB #FF -.TBL_Entry EQU 3 + + + +; +; NEW RESCAN +;=====================================================================[] + +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF +.Size: EQU $-DEVICE + + Логический номер раздела. +Номер группы = логический номер раздела HDD из DEVICE +LOGDRV EQU DEVICE + DEVICE.Size +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ++00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ++01 LONG SECTOR OFFSET ++05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) ++09 FREE ++15 + +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) +RAMDTBL: DUP MAX_RAMDRIVES * 2 + DB #FF + EDUP +.Size EQU $-RAMDTBL + + + + +INTDISK: + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + JR Z,INITDVC_RET_DRIVE +.noNeedRescan: + ; + PUSH HL + PUSH BC + ADD A,A + ADD A,A + LD C,A + LD B,0 + LD HL,DEVICE + ADD HL,BC + LD A,(HL) + CP #FF + JR Z,NODEV + INC HL + INC HL + LD C,(HL) + INC HL + LD H,(HL) + LD L,C + POP BC + EX (SP),HL + RET +NODEV: POP BC + POP HL + LD A,DSS_Error.drv.INVALID_DRIVE + SCF + RET + + + +INITDVC: XOR A + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку + LD HL,DEVICE + LD (PDEVICE),HL ; восст. ячейку + ; FDD девайсы + CALL FDDRIVE.INIT ; узнать число FDD-девайсов + LD DE,FDDRIVE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы + ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET +.if_old: CALL INIT_H + ;CALL .CHECK_HDD + LD DE,HDDRIVE + CALL MAKEDVC + ; RAM-диски + CALL INIT_RD + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET +.CHECK_HDD: + + RET + + + ;R01 +INITDVC_RET_DRIVE: + LD DE,DRV_TEMP_BUFFER + LD HL,DEVICE + LD BC,DEVICE.Size + LDIR + LD HL,LOGDRV + LD BC,LOGDRV.Size + LDIR + LD HL,RAMDTBL + LD BC,RAMDTBL.Size + LDIR + + CALL INITDVC + + ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его + LD HL,DEVICE + LD DE,DRV_TEMP_BUFFER + LD B,DEVICE.Size +.loop_DEVICE: + LD A,(DE) + CP (HL) + CALL NZ,.FIND_DEV + INC HL + INC DE + DJNZ .loop_DEVICE + + LD A,(DRV_PAGE.LDRIVE) + AND A + RET + ; + + +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF +;=====================================================================[] +; +; +*/ + + ; LD A,(Fill_if_Exists.tbl) + ; DEC A + ; LD (Fill_if_Exists.tbl),A + + + + + +/* + ; находим в старой DEVICE первую свободную ячейку + LD HL,OLD_TABLES.DEVICE + DEVICE.Size + LD DE,-DEVICE.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + LD A,#FF + ; +.loop1: ADD HL,DE + CP (HL) + JR NZ,.end_found + DJNZ .loop1 +.end_found: + ; HL = first free record in OLD_TABLES.DEVICE + LD (PDEVICE),HL + ; B = last drive + LD A,B + LD (DRV_PAGE.LDRIVE),A + ; Находим в старой LOGDRV первую свободную ячейку + ; !TODO тут оптимизнуть можно + EXX ; для .ldir_to_empty + LD HL,LOGDRV + LD B,DSS_MAX_DRIVES_AMOUNT + EXX + ; + LD HL,OLD_TABLES.LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + LD A,#FF + ; +.loop3: CP (HL) + JR NZ,.loop3_skip + CALL .ldir_to_empty + JR Z.loop3_exit +.loop3_skip: + ADD HL,DE + DJNZ .loop3 +.loop3_exit: ; no free space in old table or no new records in new table + + + + ; Находим в новой LOGDRV первую новую запись + LD HL,LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop2: LD A,(HL) + INC A + CALL NZ,. + JR NZ, ; error - no space for new record + ADD HL,DE + DJNZ .loop2 + ; + + + + + + + + EXX + LD BC,INIT_H + EXX + LD HL,LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT +.loop_logdrv: + LD A,#FF + CP (HL) + EXX + LD A,1 + CALL NZ,MAKEDVC + EXX + ADD HL,DE + DJNZ .loop_logdrv + ; + EXX + LD BC,INIT_RD + EXX + LD HL,RAMDTBL + LD DE,RAMDTBL.TBL_Entry + LD B,MAX_RAMDRIVES +.loop_logdrv: + LD A,#FF + CP (HL) + EXX + LD A,1 + CALL NZ,MAKEDVC + EXX + ADD HL,DE + DJNZ .loop_logdrv + + + + LD B,DSS_MAX_DRIVES_AMOUNT +.tbl_scanOld_mainLoop: + PUSH BC + + + + POP BC + DJNZ .tbl_scanOld_mainLoop + + + + + + +.ldir_to_empty: + ; Находим в новой LOGDRV первую новую запись + ; !TODO тут оптимизнуть можно + PUSH HL + EXX + ; + ; LD HL,LOGDRV + LD DE,LOGDRV.TBL_Entry + ; LD B,DSS_MAX_DRIVES_AMOUNT + LD A,#FF + ; +.loop3: CP (HL) + JR NZ,.run_ldir +.loop3skip: + ADD HL,DE + DJNZ .loop3 + ; no new records in table + ; ZF = 0 + ;LD A,B + ;DEC A ; Set ZF = 0 + EXX + POP HL ; сравняли стек + RET + ; +.run_ldir: + POP DE + PUSH BC + LD BC,LOGDRV.TBL_Entry + LDIR + POP BC + DJNZ .ldir_exit + ; обработали последнюю запись в таблице + LD A,B + DEC A ; Set ZF = 0 + ; +.ldir_exit: + EXX + RET */ \ No newline at end of file diff --git a/DSS/ScanDRV.ASM b/DSS/ScanDRV.ASM index d471989..177200d 100644 --- a/DSS/ScanDRV.ASM +++ b/DSS/ScanDRV.ASM @@ -75,7 +75,7 @@ SCANDRV: LD BC,DEVICE.TBL_Entry EX DE,HL LDDR - ; проверяем, не увеличилось ли значение LDRIVE + ; проверяем, не меньше ли новое значение LDRIVE старого номера бут-диска ;!TEST LD HL,.old_letter LD A,(LDRIVE) diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 9e6ab74..ef955db 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -58,8 +58,8 @@ RESERVED2 BLOCK 490,0 ; STRUCT _sBuffers -FileManipulator _sFM ; 44 bytes * FMCOUNT -FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 +FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) +FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; BootSector _sBOOT_SEC ; 62 bytes ;!TODO перенести в область буферов EXE_Header _sEXE_HEADER ; 512 bytes Stack _sStack ; 256 bytes diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 6bce28c..e034185 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -670,11 +670,12 @@ LPT_A EQU #1B LPT_B EQU #1C PRINT: AND A - LD B,A + LD B,A ; сохраняем символ + ; LD A,R - LD A,B DI PUSH AF + ; XOR A OUT (LPT_A),A LD A,#10 @@ -682,12 +683,12 @@ PRINT: AND A XOR A OUT (LPT_A),A IN A,(LPT_A) ; IN (1Bh): bit 5 - busy, Bit 3 - Ack - ;ld c,a ; САЙМАН + LD C,A BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select JR NZ,LPTBUSY - ;and %11011000 ; САЙМАН - ;jr z,LPTBUSY ; САЙМАН - LD A,B + AND %11011000 + JR Z,LPTBUSY + LD A,B ; восстанавливаем символ OUT (LPT_B),A POP AF RET PO @@ -695,7 +696,7 @@ PRINT: AND A RET LPTBUSY: POP AF - ;ld a,c ; САЙМАН + LD A,C SCF RET PO EI diff --git a/DSS/build.txt b/DSS/build.txt index 3c7d064..1c3e15e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -312 \ No newline at end of file +371 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index acc2c34..a062c73 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -19,17 +19,19 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; - DEFINE USING_MEMPAGES 4 + DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 DEFINE OLD_SET_BANK 0 - DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 +;---------------------[ лог.номера страниц памяти ]--------------------- ; кэш списка каталога DIRPAGE EQU 0 FATPAGE EQU 1 TXTPAGE EQU 2 ENVPAGE EQU TXTPAGE DRVPAGE EQU 3 -; + DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц +COREPAGE EQU 4 ; она отдельно и не с блоком выше. +;----------------------------------------------------------------------- DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 ENVIRONMENT_STRING_LENGTH EQU 255 diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 3495241..3496c7a 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -187,7 +187,11 @@ READBAT: ld c,Dss.Read ; чтение файла RST ToDSS ld a,e - ld (MOVWORD.count),a ; (число прочит. байт из файла)/128 + ; [x] 28/09/23 + JR NC,1F + XOR A + ; +1: ld (MOVWORD.count),a ; (число прочит. байт из файла)/128 ret diff --git a/SHELL/build.txt b/SHELL/build.txt index 780fea9..efee1f8 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -77 \ No newline at end of file +78 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 6eacd64..639cc1e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6eacd6475231a504fae4ed03a12f5cd1cb166ac0 +Subproject commit 639cc1e69de900dd85e1bc4d3525dfeb91ea15ab From f1ea98ff47157e06d9b1950b38c974e5ad20d518 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 1 Oct 2023 02:54:22 +1000 Subject: [PATCH 040/219] some small bugs fixed. rescan moved to drv page --- DOS/DOS.ASM | 14 +- DOS/SYSTEM.DOS | Bin 16265 -> 0 bytes DSS/DOS5.ASM | 43 +- DSS/DOS_FM.ASM | 16 +- DSS/DOS_X.ASM | 181 ++++-- DSS/DRV-MAIN.ASM | 209 +------ DSS/DSS_MACROSES.Z80 | 10 +- DSS/EXECUTE.ASM | 9 +- DSS/FAT_X.ASM | 325 ++++++---- DSS/Media_drivers/NScanDRV2.ASM | 475 ++++++++++++++ DSS/Media_drivers/ram_disk-drv.asm | 1 - DSS/Media_drivers/shared-drv.asm | 162 ++--- DSS/NScanDRV.ASM | 956 +---------------------------- DSS/ScanDRV.ASM | 157 ----- DSS/VIDEO.ASM | 482 ++++++++------- DSS/build.txt | 2 +- DSS/defines.inc | 6 +- SHELL/SHELL_EXEC.ASM | 28 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 20 files changed, 1205 insertions(+), 1875 deletions(-) delete mode 100755 DOS/SYSTEM.DOS create mode 100644 DSS/Media_drivers/NScanDRV2.ASM delete mode 100644 DSS/ScanDRV.ASM diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM index fd9bb15..f9cfc19 100755 --- a/DOS/DOS.ASM +++ b/DOS/DOS.ASM @@ -619,8 +619,6 @@ Func_57:xor a and a ret - - ;///////////////////////////////////////////////////////////////////// ; Функция #58. Вывести символ на экран. ; Управляющие символы выводятся как обычные символы. @@ -711,16 +709,14 @@ Func_5A:ld a,r ; ; A = 0 - очищать строку ; выход: нет ;///////////////////////////////////////////////////////////////////// -Func_55:djnz A0EBA +Func_55: djnz A0EBA ld b,a ld c,h push bc push de push hl - db 0DDh - ld h,d - db 0DDh - ld l,e + LD XH,D + LD XL,E inc d dec h xor a @@ -981,8 +977,8 @@ mode_screen: ;------------------------------------------------- ; Открыть окно -; вход: hl=описатель окна -; e=флаги окна +; вход: hl=описатель окна +; e=флаги окна ;------------------------------------------------- open_window: push de diff --git a/DOS/SYSTEM.DOS b/DOS/SYSTEM.DOS deleted file mode 100755 index dd27b477446dedee894b42e74b2d9d84da00204c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16265 zcmeHu3wRUPweE~9$&!s^Nj6yWb0lFH3lK&SOBj31!`LJQn_?bG2slYwIOzidB(aT+ zAvA4H+S4|D<@9k*OK5N1^!7wR+8COYS~hMqR;P~Z-pNT_w2RzUTf{O*M6vuS4ULODWs9hk6q-tTfI6bRm_iw-6ci<%LsSU? z>gt)g73)?rcxqN`TvUd5q0r3-lz-1WNBPqbYJo86maNrt}w05PAqe7L_ zM7!qbw$I-@zh-`2D__1s=UuMj7M}ELINHZ^x120hfi*Alj^#R(zN8tgI?c{+UxFw6 z-0nHLee?Iue_;NeX>Qj_l1zEM7*4HWGa{Bz%HgGiFB>CzUJR!wHZ$ID+tTsAVAF_> zmAVmo(TgKCrpkK`<*d>1Vmoz#7Mm!@ zNbd@f)FGtMhPqJ1a+-2vt4&bRQdBfx=--3CT*apz4oy5PhN*{{E0UEQv-dKz2On)@k^%Gmt-*$~96{{t`Bix&=w~F;UdVsEu0yudm;* zY4aWQt*h5H+`jhCHKcTfijsV(t+gu_&(e^R?I{l_cX{eU%5A$tN}H!Pw0n+W7r&{H zLNB&=j~mc)qg_m4_+98`2T}8`u1)lw43yR|sr0YX=TL_2Je{Lvu&H!7gJgu?Md$xD z9U-D4GeB27BSCj?2FU~6Vq=m{qh+(TY?_uea3&vLo=SD_Uh<;vqQVCmpXFESo$LZj zPDUj=*Rlt1hb4@6o~3w3B|Fn{5bsP&1aE_7v9Xd(4fuHJSbz`z`oBRKCzSW(E%Gj2 za!Z-dzqE8grQWco>63dOY3dFZw2r#;WH+%>y+`y4l0(l}3V_}G@!8#dm#>DK!7tp}(T4b?TZ zYi?V6d%4p{-F3&R%`5BHRd7{Q+ehJiqs-ShL*{ADMCK&t|F+E6v;mo?wLxS~YU3lz zJa&VgpB{bnr~m6ee)#$u9kD-Cuf>lZ37mW8fB)#ml977zPtl+K8@$+B)+_%5;*tfn*ee-*V4}JBCuYBpzFZ{ca`oX_`?O*=+ z>;Lx1_ve2!Jzu;*=8wSnBg#B>gUla68y`_-&OE5BT$|B+oSDFJYzmy$_6sJ)Bg4+o z2qaEL2qI_@(h#%=_YK;4)0g`@_;y!kNcf}Cc3ELc&5Dtor=+tB6$6{2=-IRweVFc# z@}{r!2cGX+X)5ShX#(6j`p$3kjS0ArO2qq>qEbyZ;MfrTMcTqp6AxeNw@^jGN)yM> zhu8N{3;+bHNBapoK4AKJ|AFcbzP@+J^z%UfK-Bb$0Hl!`#{-v4C;G>HRp%y>sb`ZZ z^Ss*I$?@?%@zdGG0aNFt{t28K11G!oKU%qENUdnK>2N=(r-L`!YS#_*5?pciG;-i1 z`!Y`qgI??dSc5e6!t17B^C&&Y^CNsMGCTP2!Ft9aI<}j|m>wD4d(8R@tU;Bm4l7h8 zTO&rfQXelk%%cbU_GDJ}J%sRY2tAo3zt?dkvpEgVu~EwfbE6Q-47PZGo2gcj*n7CH z!N&u@8~aFj37!UXp#`iQc5@;10W9exn&pGg2*=bR%Q=N+DB)b@fao}zPg_#lt%Hm~jlR4VX@#8&wy;7!R*PTIp<+>>73g>serd8lxwPTPrm- zUm6b#=3y4(AsWf65ASA-qr6~pDv=L7VhH+U4w;O=3s$3Ey&cE znhFk@az@QOB9}1JqNMvm`=4drLRNr}3FpiM!?9Q#1@Y2%;{(D`OH|rAl8so{Y3<IJDRz(ITO!lW{I@+W$URkKC6Z5vTt{79veLG zcylr!ZHV$4x0Tq#`Qd_b;1}&A<7YJOdh9Wv`*r(AGq>2XTSqT8hI7Mt*9VnVrpjt) zN}7S|#o=i0ur(pm?4kD+YG9vh?^ty3e1ISNP>BZo#(l2#(TgXV2nD8%D{KvCT?_4_ zna?&Q*mdwkAJ)z@4_n7}!$^JEN>0PlRzBMvM?X`d9WN-QJd~|7o3yV)`J@`h1yBs0 z=iM(`r^#Z~>nvuf#(^`FBv-3W&6weJ252YNo${=%D)bSC*hVN)uq1D88V%hmiLYv z9z1WM&X7FKD?w?+*7a`7z5rsVA= zd2^=S$!C-QaJIaCmb^Kq{9BYlLohpX?3K(_XMeU_mm$~82wTGDsjx;zwRi_WVUagm zivB`*PJ)Z zKfE{pgN8zdl3qG5(7r`I%ptv1#>BsAv_ zi1t$2C2a+hQ1%LJB>ty^?qB9hTc4opMyzDN%pYj(3^~3|H9uKfSE|!dU#Ra4#S?7j z#ACf+aUJp5J8d^o+j=1Ahe_(`g}vY(mLJNMAIwXd2{G6S(V#7h)K!`u6W%gM{m+qo zLv73(AE7b2SI(x|ZRz?&AaAQ~8O7*dA%zBJXm_J6zIT zkwj;ANGkyq$~8p*hU3KCnFK!X?8}MA`U&xmlPUnm6u6$ve4Mft`u6*BVpd~a;%rd*H?f05fuMrr1CIb5R1;fxCj_4tQANIRx{RXffY zjxa`yK10yLi&Iag=b3SQ3{$g@1IG7WT_UUUXG5 ze};uO{a{6dPiiJv&H_Sl;jmnj(JOqfFgV=Y!NZy;21L3l{B8MxYXzf!@?I@;K3otJ zhH|3A!YO9h@h)TWxP&^_u+YH#=TikX*N5P6X;s4xkINz#(iyPo;^kKhn_M)NzQ<+0 z8WSd5LPK#B2DodF>j7lzNVZT=By>5^u0Ri0*mE@}TxFi>Of9be6>-7=fN17dar^wAJ~=7;{U3ENDPGzx9B7CzB%&V zxe_H-6;)-x+R{bPdw!lXJ%HX1AXMWRpIs5CIs(soCu>z=tO<-nL+P6^QaOWej@(gXS;YZinp?O{Y=KA{r#kBY=L@fYkTZ3UbeBD~0Hcy8`A(tCARt;G6{GGcqiQ{6|I zF7L~i_ZEO9-014CGLvDYA=M@apE~aT zjB)o0R5xm7NjDQU#dR4(b*ZPB-#~M30S&S&gl`{F0R-H*ji%^;bR2K)Zt0Y(gY5AP z4XG1riK<<3o466U^dtq$dGoltPrKL@tYVBlH|rFE%$EsZE%UgVTm;f1QVYr`TW1`k z?VZvQ=3PFpduL3H)(RJLRKcZvZB8f*cR3bO)X)u2M$578PdZVMnD_GLTzPxm{%6@N z)uXgLAXsyy29rw_&@E((?*8oZKV<8eCrVQe)shpo7U%s})Z!bey@8>bOvbGyS3oGq zdw*`aX>JrTRq^S_FmfK7=nr}Is>^jR>O-E`(0!lIDr3;~(y@VPyW;V&DT;$L57Q}z zb}~K{C%as6Bg|v{%6xW-;$c@Q3)%S?!K|{3ovl=`j8e(wD;#T6wzApk=-$T8P}*3% zFzm9TqdV0RUga{U*v73{=Bql|_9KpQnbUL{BlBHbl;qhiDfbRzz^A^%@XC>4_L)w4PVSx+;0oc>mci&7PGeJUn}RmLBhc#-UjnHI)DRJkR zvVPpJ=j`GOti`6oF8u;)7@y@eUG5)4p}1RY6Iy1&H?*!=yr-nZP*S~)yyK!h7{%cL zEE*F&v@MT4cKER^t)rQTd1-4-vD;oOt<5VI-37(KqNIkLVkfdzAq^Lwn2Z5pi%O|J`I3XtNm9bggM1cWO2QO%gfxy#~=`)@v zy?Us&g*bXgFCODzs$lF6rI8IN;f|42cZYBQLX2Z$9~Dr$S}867nX@l=jXuF2_`2YEgl?a2vyARt@8{G90_+&LpeRl!d~X-`7AH z7$T+$O=+$-Q#55Bnn`!U7ICwNy?`&DO8y_*PyxBaB)-D~vMxlPth(J8&1nbb1I4`q~ ztP7HW^MDNhAXVC*yf7Yx!|o^HO?mDiDZ14#L}uO zY}`iaBLVjW+vL8Ca0OwUZHnkEud_65Y)>puGq7gu!+Lh7;_zoqYjxrisq+|6^++~*YNXHqwDOK8fg~g7U$}#h>;u)Ds0joaT zuh)lvtB=Ak3}AOB)Z?JWaMFig(f6!ok=qN=u#;gUivuB;EPa`jUbor9LS%I%StS&{ z>L;J~lp;X|ti%O6%w9nZ!=m&ZSZ9=#H+A7#S9gCSS2#S2a!|A##%U97vNTSoPIE=R zuAx>_PyYZ{G)zzeO*a;=A8HkzDk0^~zYO^^R<@e{y}ub00e=4zwQGA(L9iAzw3xn+ zEZtZ#on2 zj}M!UO3S5|WmgxDYgmGzqy4hm*E zSKj0jIH&NS+i~bBOm$bd&K2v8|L)Un;hAE8mSe6bF)RIg;lBC)R2&9^(b81&kT2K_ zr$5fvGVr3jgwor;J4BT`Jg`m9er~>qv>REg?~pcd7GF1V+EY6@D}kh~ z3q7qTx}TV@T12`OLUbWV+UoP{AFbLV+F=&KrPhXBV5YiD;0+6!cC~eOKQe!{;4L}( z$b7HULmU;b0uQQ_t0mka;K*sHvSoU3P_m(QdNL7 zh1Ll20`AZgUP`m5xRje5JUZAtc;4;vfJNJAm$Dq5{X+;{tUh<}XjblEH^O=0n+x0v zJfeG^N2j*=Le8S9<)j5Lw_rqqJfR8l{$8Qfy39j39-?sMQJpgGr5;P;{Gk}%bN>Q| z&0{HZ;o}01J9_B|`3vy5r+r8?O{b`Jh)+n^i`)Z+io zzeTN};iSV8`uG4%G?0Pd7(;$4=GS>s4!1$3_Ts%OoZinJ34$$x?|_nK<} zcRalj>HbK2M7lSEi3a~vgn1L+<^{c1#nlU=iw0n4lo}HIPaZdkOB=9wrVz$~P-?(Q zz4BON~-L8~M<_fWBRSPnJn~<;JxIZNdQl#?O0Jb(z$6)u)$UO}S7zuP^ zz5$pSq{xbG0v13eo88G8h&h*KzG$;^mDVh@lP7O@pRJ}zQcK8urP-RLenASiFw18c z*$qbapt0|Q*Vw0BZ0y4wzrN3VjjYqy_cXvG2=fq5Abe`EkidYk^-;N$b#rL{S}BTqLG zz)k@1z~E7_ZSZl}nz+V6P4Oi0`|(|WGrr(>jTeVIqUeuX1<85vd>Hy^k)r zt^ulNPFm~miTC1CcY)6!tu6AQHB!R^w~${SO*Q7#>BfxYWxhC)yF1)e6#`f~F_PN| zxGM>7A#m$xRpWut)XdCh8;K2hU~~p?7@XJwS3_F3vos}q8E%VIZ<eo_+A*Nx?hLeTL#Y!nlD6DdD1oe2w9l`XwqlrVDAl7z@~X4##o zpv@$-FCs#UpQ23l`O~DW7?&t9swEhW2YwN%47G+2>Lyu@?x0ky`Bv%Ga5JlG4*y!J zuDxUbbtT`tzGOY`rF@<6deQKDrLb8_DqDyFqgNhb)0D%k6_N%cIv z*m5w%_GWTCVV(+S%aSVP0b1qT z*~nKRlA2v`t{bP?1C+Z%*p}hjP zEM0Z39rp)c<*^{b>#!&BtHSGA^#2G3yk%La%emW+o1Yby*DHj-_yhGq^-@dq(ggT? zrRDib0`m2avaByOwU{s#+`IjIT;$|Aqmp?W#Fb6>NkNw%H^U~#XBvD?)T`V4WCves zqIz3sJ!SdnCR`#**Pmo`E#9J~9sCSnpJHD1@!0wn8v8uUjD4jDUW77)M-f^O+z8(( zS9iOQ1KhQYFqUJE<4c{R75G51+|<|~5NlFSvL@4^-WIP|AzWS-oMC=Tj=D!HEXSAP z7GMZBdavd$#q{!P-<;|KXxov{`D!~Ch z+{~EJ6Z5rfj+V8l7Q#uStyaq@=_}@r~(?8vWReLw!E;*K{rFxxO zjX~b7l{f3;U1{J!KZP5|TyqFy&hG zauk)&@I2vJ-^T7KH*M&bqe-yg8o2oy zxak_WQ3bc_<;@0pSGv3-Lv;UFg^2qJ=PDAHaYT#^aUU)2O%WeT6(5AWGvv)id6!Av zkty!eihFh9LuulJ`f{-XzwyD~5$z&I8vxlJG(%&g#gjPaYb($`o_vBQUWtbD6{7RC z3aJ6LInPxHzpZd9LEK@)+Rv<)9jAjjO|RUpQM8OxhKCtg?sFAGVoYeO5TgUvk;zfp zH?lMJ3UK;YE@e)o}u)$zw2z%7|3Tf+W6$gI)>mmuT}J9 zBZ63V5fwtTyYP`|0GUcgNJ$GRheOKeLP{KpB`Sh6FeIRKw411KdPW>yiaA#Q`goI09P@WJ6@xW=w_FwqG9hsH?{4n&7(8-6)6wBK|`e_J%RbIf!n zJaeW^a0YJfCnHslk!hM9qqh?1`muOmG;q!-*XgLw+!K#<@MC1T9FN35dH)!w@zLWB$l-s3R6U#+jIft)<&12Wk+m9G zi~6=1*&0&$)HqExLr3?*tnC#Ja6#mxAR(OM#Awhw4yzdV?bp<@_~wAiF#%p98di|_ zuL#CJgn(nbCppV!Ir{fhZ*zYqn_|rhYB=*rX3X(fj$GF{(D7HF)9BA~kJNM2Ki8(~ z$>p%}lUydQhUVj|2d;SQx?x#cT$;d&-TXAkt_0O V#H4QRB0rJ{fV7_%mR3#h{})N31T_Ev diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 9104c75..9609242 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -674,8 +674,8 @@ GETWORD: .next: SUB 'A' PUSH HL ;!TEST CHNDISK OPENDSK - ;CALL OPENDSK - CALL CHNDISK + CALL OPENDSK + ;CALL CHNDISK ; POP HL JP NC,GETWORD @@ -702,14 +702,10 @@ CHNDISK: LD A,B RET - /* - RET C - - PUSH AF - CALL LOADDIR - POP AF - */ - + ; RET C + ; PUSH AF + ; CALL LOADDIR + ; POP AF RET ; ;????? R10 @@ -937,13 +933,16 @@ IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) ; ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 +; !FIXIT может выйти за пределы буфера? ////////////////////////////////////////////////////////////////////// CURRDIR: EX DE,HL LD HL,DIRSPEC -CURDIR1 LD A,(HL) - OR A + XOR A +.loop: ;LD A,(HL) + ;OR A + CP (HL) LDI - JR NZ,CURDIR1 + JR NZ,.loop RET @@ -1760,15 +1759,15 @@ MKD03 INC HL INC HL - IF OLD_SET_BANK - PUSH HL - ENDIF + ; IF OLD_SET_BANK + ; PUSH HL + ; ENDIF SET_PAGE_X DIRPAGE - IF OLD_SET_BANK - POP HL - ENDIF + ; IF OLD_SET_BANK + ; POP HL + ; ENDIF PUSH AF LD A,(DIR) @@ -1785,6 +1784,7 @@ MKD04 EX DE,HL LDIR POP AF OUT (SLOT3),A + EX DE,HL LD D,H LD E,L @@ -1792,6 +1792,7 @@ MKD04 EX DE,HL LD (HL),0 LD BC,512-65 LDIR ;!FIXIT нужно ли так много грохать? + POP HL CALL NSECTOR LD A,(BootSector.S_P_C) ; секторов на кластер @@ -1816,6 +1817,7 @@ MKD12 PUSH AF LD BC,511 LD (HL),0 LDIR ;!FIXIT нужно ли так много грохать? + POP IX POP HL INC IX @@ -1877,7 +1879,7 @@ RMD12 PUSH AF POP AF OUT (SLOT3),A - LD B,16 + LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD HL,SECBUF RMD10 LD A,(HL) OR A @@ -1896,6 +1898,7 @@ RMD10 LD A,(HL) RMD14 LD DE,#0020 ADD HL,DE DJNZ RMD10 + POP IX POP HL INC IX diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 3d1d678..f0de378 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -43,21 +43,21 @@ FM_BUF: _sFM ; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND - CP FMCOUNT - JR NC,ABS_FM + CP FMCOUNT + JR NC,ABS_FM PUSH DE LD IY,FM_BUF - LD DE,FM_BUF.Size - AND A - JR Z,.endLoop + LD DE,FM_BUF.Size + AND A + JR Z,.endLoop .loop: ADD IY,DE - DEC A + DEC A JR NZ,.loop .endLoop: POP DE - ; A=0 - OR (IY) ;+00 NAME + ; A=0 + OR (IY) ;+00 NAME ENDM SET_FM: diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index aa59cf1..e345f96 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -34,11 +34,19 @@ // SCF // RET +;///////////////////////////////////////////////////////////////////// +; Функция #00. Версия ДОС. +; Возвращает номер версии дисковой системы. +; вход: нет +; выход: DE = номер версии/модификации +; BC = номер билда (0..999) +;///////////////////////////////////////////////////////////////////// VERSION: + ;XOR A + ;LD H,A ;!TODO пихать сюда OSINFO + ;LD L,A + LD HL,0 LD DE,VERS*256+MODF - XOR A - LD H,A ;!TODO пихать сюда OSINFO - LD L,A LD BC,BUILD RET @@ -127,14 +135,32 @@ NDISK11: RET */ - +;///////////////////////////////////////////////////////////////////// +; Функция #02. Номер текущего диска. +; +; вход: нет +; выход: A - номер диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// CURRDSK: LD A,(FatBuffer.DRIVE) AND A RET -DISKINF: INC A + +;///////////////////////////////////////////////////////////////////// +; Функция #03. Информация о диске. +; Возвращает информацию об общем и свободном пространстве дискового +; устройства. +; +; вход: A - номер диска (0=A,1=B,..#FF-текущий) +; выход: A - размер кластера в секторах, если CF=0 +; HL - общее кол-во кластеров +; DE - свободных кластеров +; BC - размер сектора в байтах +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +DISKINF: + CP #FF JR Z,CURRDS ;R06 - DEC A ;R06 CALL CHNDISK ;R06 RET C ;R06 CURRDS: LD HL,2 @@ -161,11 +187,13 @@ FRESP2: LD D,B AND A RET +; Номер последнего диска в системе LDRIVE: DB DSS_MAX_DRIVES_AMOUNT + IF COMPILE_UNUSED_CODE TDRIVE: DB #00 TCLUST: DW #0000 TCOUNT: DW #0000 - + ENDIF ;R04SIZE2CL LD DE,(B_P_C) ;R04 XOR A ;R04 SCF @@ -187,13 +215,15 @@ TCOUNT: DW #0000 ;R04L_SEC_X DW 0 ;R04H_SEC_X DW 0 -; !FIXIT чёт не используется + ; !FIXIT чёт не используется + IF COMPILE_UNUSED_CODE TESTDSK: - ; LD A,(FatBuffer.DRIVE) - ; LD C,Dss.DRV.MediaCheck - ; RST ToDSS.DRV - ; OR A - ; RET Z + LD A,(FatBuffer.DRIVE) + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + OR A + RET Z + ENDIF RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC @@ -211,8 +241,10 @@ RD_BPB: LD C,SLOT3 POP BC OUT (C),B JP C,DOS_X_Error.Not_ready - PUSH IY - LD DE,#AA55 ;R05 + + //PUSH IY ; пока без индексного, но может пригодиться + + LD DE,#AA55 ; сигнатура ;R05 LD HL,(SECBUF+510) ;R08 ;R07 ;R05 AND A @@ -225,8 +257,10 @@ RD_BPB: LD C,SLOT3 LDIR ; - LD IY,BootSector - LD A,(IY+_sBOOT_SEC.ID_FORM) + //LD IY,BootSector ; пока без индексного, но может пригодиться + //LD A,(IY+_sBOOT_SEC.ID_FORM) + LD A,(BootSector.ID_FORM) + CP #F0 JP C,DOS_X_Error.UnknownBPB @@ -235,8 +269,10 @@ RD_BPB: LD C,SLOT3 ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec ;LD D,(IY+_sBOOT_SEC.RESERVE+1) ;ADD HL,DE - LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - LD H,(IY+_sBOOT_SEC.RESERVE+1) + + //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + //LD H,(IY+_sBOOT_SEC.RESERVE+1) + LD HL,(BootSector.RESERVE) ; ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec @@ -247,8 +283,11 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 LD (FatBuffer.FAT2_XX),HL - LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT - LD D,(IY+_sBOOT_SEC.S_P_F+1) + //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT + //LD D,(IY+_sBOOT_SEC.S_P_F+1) + LD DE,(BootSector.S_P_F) + + LD A,(BootSector.FAT_NUM) ; amount FATs CP 1 JR Z,.loop1 @@ -259,22 +298,40 @@ RD_BPB: LD C,SLOT3 .loop1: ADD HL,DE DEC A JR NZ,.loop1 - LD (FatBuffer.DIR_FRM),HL ; first sector DIR - LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors - LD B,(IY+_sBOOT_SEC.B_P_S+1) + ; CF = ? мало ли + AND A + ; CF = 0 + + //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors + //LD B,(IY+_sBOOT_SEC.B_P_S+1) + LD BC,(BootSector.B_P_S) + ; RL C + ; RL B + ; RL C + ; RL B + ; RL C + ; RL B + ; LD C,B + ; LD B,0 ; BC - File handels in sectors + ; LD A,C + ;;;; + LD A,B RL C - RL B + RLA RL C - RL B + RLA RL C - RL B - LD C,B + RLA + LD C,A LD B,0 ; BC - File handels in sectors - LD A,C + ;;;; LD (FatBuffer.F_P_S),A - LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel - LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + + //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel + //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + LD DE,(BootSector.F_P_DIR) + EX DE,HL DEC HL XOR A @@ -299,10 +356,12 @@ RD_BPB: LD C,SLOT3 ;LD L,B ;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector ;LD B,(IY+_sBOOT_SEC.B_P_S+1) - LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector - LD H,(IY+_sBOOT_SEC.B_P_S+1) - LD A,(BootSector.S_P_C) - + + //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector + //LD H,(IY+_sBOOT_SEC.B_P_S+1) + LD HL,(BootSector.B_P_S) ; Size sector + + LD A,(BootSector.S_P_C) ;!TODO FATcacheSize ;NEXTAD3 ; .loop3: ADD HL,BC ; calc. cluster size ; DEC A @@ -312,7 +371,7 @@ RD_BPB: LD C,SLOT3 JR Z,.loop3.end RRA .loop3: ADD HL,HL - RRCA + RRA JP NC,.loop3 .loop3.end: ; @@ -330,7 +389,7 @@ RD_BPB: LD C,SLOT3 ENDIF //////////////////////////////////////////////////////////////////////// - LD HL,BootSector.ID_FAT + LD HL,BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG LD B,3 ;R_BPBL1 @@ -364,9 +423,12 @@ RD_BPB: LD C,SLOT3 IF COMPILE_UNUSED_CODE LD HL,0 - LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track - LD B,(IY+_sBOOT_SEC.S_P_T+1) - LD A,(BootSector.HEADS) + + //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track + //LD B,(IY+_sBOOT_SEC.S_P_T+1) + LD BC,(BootSector.S_P_T) ; Sector per track + + LD A,(BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага .BPB_L1: ; calc. sector per cylinder ADD HL,BC DEC A @@ -381,15 +443,23 @@ RD_BPB: LD C,SLOT3 ; AND A ; SBC HL,DE ; EX DE,HL - LD L,(IY+_sBOOT_SEC.S_P_D) - LD H,(IY+_sBOOT_SEC.S_P_D+1) + + //LD L,(IY+_sBOOT_SEC.S_P_D) + //LD H,(IY+_sBOOT_SEC.S_P_D+1) + LD HL,(BootSector.S_P_D) + LD A,H OR L JP NZ,.HDDSMAL - LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) - LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) - LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) - LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) + ; + //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) + //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) + LD HL,(BootSector.BPB_BIG_TOTAL_SECTORS) + + //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) + //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) + LD BC,(BootSector.BPB_BIG_TOTAL_SECTORS+2) + AND A SBC HL,DE JP NC,.HDDBIG @@ -399,7 +469,7 @@ RD_BPB: LD C,SLOT3 ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 -.HDDBIG: LD A,(BootSector.S_P_C) +.HDDBIG: LD A,(BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага SCF .S4C01: RRA JR C,.S4C02 @@ -410,7 +480,9 @@ RD_BPB: LD C,SLOT3 JP .S4C01 .S4C02: INC HL LD (MAX_CLU),HL - POP IY + + //POP IY + ; LD DE,FAT ; LD HL,0 ; LD IX,(FAT_FRM) @@ -434,7 +506,7 @@ RD_BPB: LD C,SLOT3 RET .IBM_DOS: - LD A,(IY+_sBOOT_SEC.ID_FORM) + LD A,(BootSector.ID_FORM) CP #F0 JR C,DOS_X_Error.UnknownBPB ;????? надо ли изменить? @@ -452,15 +524,19 @@ RD_BPB: LD C,SLOT3 DOS_X_Error: .UnknownBPB: - POP IY + + //POP IY + LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF RET .Not_ready: LD A,DSS_Error.sys.NOT_READY - ;SCF + ; CF = 1 RET + + ;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' @@ -487,8 +563,7 @@ FatBuffer: ;!TODO к буферам! DIRSPEC: DB '\' - ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 - BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 + BLOCK DIRSPEC.DEPTH ; ;R11 diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index db4701e..5a6c42d 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -193,7 +193,7 @@ A0066: JP DRV_PAGE.NMI ; ; <[DRIVE PAGE SWITCH]> ; _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: PUSH BC ; -.RETBANK+2: LD BC,SLOT0 + 0*256; +.RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV использует это значение .switch: OUT (C),B ; ASSERT $!=84,'-> Portal error!'; ;Entry point from DSS main page @@ -219,213 +219,6 @@ ADCALL+1: CALL DISPATCH ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -; - -/* -; !!! ВЫЗЫВАТЬ ТОЛЬКО ЧЕРЕЗ RST #10 в DSS-MAIN !!! -RESCAN_DRV: - AND A - LD A,R - PUSH AF - DI - ;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(PORTAL.out_DRV.RETBANK) - OUT (SLOT3),A - LD A,(BOOTDRV+#C000) ; узнали лог.номер boot диска - LD (.BOOT),A ; сохранили -.restore_page+1: - LD A,0 - OUT (SLOT3),A - - LD A,(.BOOT) - CP 2 - JR C,.Change ; bootdisk - дискета? - - LD C,A - ADD A - ADD C - LD HL,DEVICE - LD C,A - XOR A - LD B,A - ADC HL,BC - LD DE,.DEVICE - LD BC,3 ;!HARDCODE длина записи в DEVICE - LDIR ; сохранили запись boot-dsk - ;!TODO тут пока работает вариант замены буквы для boot-RAM-DRV и HDD - LD DE,.DEVICE+1 - LD HL,HDDRIVE - AND A - SBC HL,DE - JR Z,.HDD_SYS - ; - LD HL,RMDRIVE - AND A - SBC HL,DE - JR NZ,.Change - ; -.RMD_SYS: - LD A,#60 - LD (.BOOT_TYPE),A - LD A,(.DEVICE) - LD HL,RAMDTBL - SLA A - ADD A,L - LD L,A - LD A,0 - ADC A,H - LD H,A - ;Тут в HL адрес первого байта записи о boot RAM-DRV - LD DE,.RAMDTBL - LD BC,RAMDTBL.TBL_Entry - LDIR ; сохранили запись о RAM-DRV - JP .Change - ; -.HDD_SYS: - LD A,#80 - LD (.BOOT_TYPE),A - ; - LD A,(.DEVICE) - ADD A,A - ADD A,A - ADD A,A - ADD A,A - LD HL,LOGDRV - ADD A,L - LD L,A - LD A,0 - ADC A,H - LD H,A - ; Тут в HL адрес первого байта записи о boot разделе - LD DE,.LOGDRV - LD BC,LOGDRV.TBL_Entry - LDIR ; сохранили запись о HDD разделе - - ;JP .Change -.Change: CALL INITDVC_RET_DRIVE - LD A,(.BOOT) - CP 2 - JR C,.exit ; bootdisk - дискета? - - ; 3. Проверить, сменилась ли буква boot-drv и выйти, если нет. - ; 4. Если boot HDD и его букву занял HDD, то меняем местами их - ; записи в таблицах DEVICE и LOGDRV. - ; Если boot HDD и его букву занял RAM Drive, то иди нахер, не может быть)). - ; Если boot FDD то нихера не случится. - ; Если boot CD-ROM, то подумаем, когда до этого доживём. - ; Если boot RAM Drive и его букву занял HDD, то нужно сменить - ; их местами в таблице DEVICE. - ; !!!!! что будет, если буква бут-диска Е, а после рескана - ; загрузочный раздел оказался единственным в системе? - ; А если сразу будут изменения с RAM дисками и HDD разделами? - - LD A,(.BOOT_TYPE) - CP #60 ;!HARDCODE ram drive - JR NZ,.restore_HDD -.restore_RMD: - LD A,(.RAMDTBL+1) - LD HL,RAMDTBL+1 - LD B,RAMDTBL.Size / RAMDTBL.TBL_Entry - -.loop_RMD: - CP (HL) - JR Z,.found_RMD ; ZF - нашли в новой RAMDTBL bootdisk по его физическому номеру - INC HL - INC HL - DJNZ .loop_RMD - JP .BIG_ERROR ; bootdisk died... - -.found_RMD: - LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry - SUB B - LD (.DEVICE),A ; new bootdisk log.number in RAMDTBL - DEC HL - LD A,(HL) ; логический номер для поиска в DEVICE - LD (.DEVICE_NEW),A ; сохраняем - - ; поиск номера записи по её логическому диску + процедуре обработчика - LD HL,DEVICE-DEVICE.TBL_Entry - LD DE,DEVICE.TBL_Entry - LD BC,DEVICE.Size / DEVICE.TBL_Entry -.found_RMD.nxt: - AND A - ADC HL,DE - PUSH HL - EXX - POP HL - LD DE,.DEVICE - LD B,DEVICE.TBL_Entry - CALL COMPARE_BYTES - EXX - JR Z, found entry - DJNZ NZ,.found_RMD.nxt -.BIG_ERROR: - ;;;; - - - LD BC,DEVICE.Size / DEVICE.TBL_Entry - AND A - - ; длина записи. сравниваем на полное совпадение .DEVICE с - ; одной из записей DEVICE - LD B,DEVICE.TBL_Entry -.rmd_loop_search: - LD A,(DE) - CP (HL) - JR NZ,.nxt_loop_ - INC DE - INC HL - DJNZ .rmd_loop_search - - POP BC - - - ;JP P,.BIG_ERROR ; если прошерстили за пределы таблицы - - ; - JP .exit - ; -.restore_HDD: - - ;JP .exit - ;; -.exit: LD HL,.Start_buffer - LD (HL),#FF - LD DE,.Start_buffer+1 - LD BC,.Size_buffer-1 - LDIR ; помыть за собою)) - - POP AF - LD A,(DRV_PAGE.LDRIVE) - RET PO - EI - RET -.Start_buffer: -.BOOT: DB #FF ; логический номер -.BOOT_TYPE: DB #FF ; 00, #60, #80, #C0 -.DEVICE: BLOCK 3,#FF -.DEVICE_NEW: BLOCK 3,#FF -.LOGDRV: BLOCK 16,#FF -.RAMDTBL: BLOCK 2,#FF ; лог RMD, физ RMD -.Size_buffer EQU $-.Start_buffer - -;ВХОД: HL,DE - адреса сравниваемых блоков, B - длина блока -;ВЫХОД: ZF - блоки одинаковы, в HL и DE адреса следующего байта после совпавшего блока -; NZ - блоки неодинаковы. -COMPARE_BYTES: - LD A,(DE) - CP (HL) - RET NZ - INC HL - INC DE - DJNZ COMPARE_BYTES - XOR A - RET - -*/ - DRV_PAGE.LDRIVE: DB #00 diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 7a5b496..0d476d4 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -134,17 +134,17 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ; MACRO SET_PAGE_X new_page - IF OLD_SET_BANK - LD A,new_page - CALL BANK + ; IF OLD_SET_BANK + ; LD A,new_page + ; CALL BANK - ELSE + ; ELSE LD A,(BANKTBL+new_page) LD B,A LD C,SLOT3 IN A,(SLOT3) OUT (C),B - ENDIF + ; ENDIF ENDM ; diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 9147251..5dd5b66 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -829,7 +829,7 @@ EXEC1: CALL EXEC_1 ; при выходе с ошибкой, в регистре А - код ошибки EXEC_1: LD (CMDLINE),HL - LD A,#01 ; %7600000R = !FAT_ATTR + LD A,#01 ; %7600000R = !FAT_ATTR ;!HARDCODE LD (ACCESS),A CALL GETWORD RET C @@ -838,7 +838,7 @@ EXEC_1: LD (CMDLINE),HL CALL MASK RET C CALL TST_EXT - LD A,3 + LD A,DSS_Error.sys.FILE_NOT_FOUND RET C CALL INCTASK ;R08 CALL OPENEXE @@ -872,6 +872,9 @@ COPYEXN: LD A,(HL) JR NZ,COPYEXN CALL FINDPATH + ;[x] 1/10/2023 + RET C + ; LD HL,(CMDLINE) JR EXEC1 @@ -959,7 +962,7 @@ NOINK: LD A,H LD (EXSTACK),SP LD SP,HL EXX -;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; + ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит LD A,(EXE_MEM) LD DE,RAMMAP LD BC,0*256 + BIOS.GetMemPage diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index b3191e0..31ed55d 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -9,17 +9,18 @@ ;R01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- +; Установить начальный кластер для чтения R_CLUST LD HL,#0001 LD (G_CLUST.num),HL RET G_CLUST: .num+1: LD HL,#0001 -G_CLUS1: INC HL - CALL R_F_FAT +G_CLUS1: INC HL ; номер кластера + CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF - RET Z + RET Z ; ошибка ? LD A,D OR E JR NZ,G_CLUS1 @@ -34,25 +35,30 @@ INC_FAT PUSH HL RET C PUSH HL PUSH HL + EX DE,HL ; hl=номер кластера +INC_FA2 CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL -INC_FA2 CALL R_F_FAT + JR NC,INC_FA2 ; не конец цепочки EX DE,HL - JR NC,INC_FA2 - EX DE,HL - POP DE - CALL W_T_FAT + POP DE ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера POP HL - LD DE,(FatBuffer.ENDCLUS) - CALL W_T_FAT - CALL WR_FAT + LD DE,(FatBuffer.ENDCLUS) ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера + CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск AND A RET ;R01 -; IN: HL - CLUSTER -; OUT: DE - (CLUSTER) +;----------------------------------------------------------- +; Прочитать из кеша FAT-а номер след. кластера +; вход: hl = номер кластера +; выход: hl = номер кластера +; de = номер след. кластера +; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb +;----------------------------------------------------------- R_F_FAT: EX DE,HL LD HL,(MAX_CLU) @@ -62,49 +68,42 @@ R_F_FAT: LD A,DSS_Error.sys.DISK_FULL RET C - EXX ;!TODO optimize - SET_PAGE_X FATPAGE - EXX ;!TODO optimize - + SET_PAGE_X FATPAGE + PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYP) - CP "2" + CP "2" ; fat12 JR Z,R_F_F12 + ; fat16, просто читать след. номер R_F_F16: LD A,H - LD B,A + LD B,H AND #0F LD H,A LD A,B - ; swap bit7..4 and bit3..0. + ; bit7..4 --> bit3..0. RRCA RRCA RRCA RRCA + AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ; - AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - ;!TEST - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CP C - //LD C,A - //LD A,(FATCASH.Block) - //CP C - ; + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT - ADD HL,DE - LD E,(HL) + LD DE,FAT_CACHE ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) POP AF OUT (SLOT3),A - LD HL,#FFEF ;!HARDCODE - XOR A ;DssErr.sys.NO_ERROR - SBC HL,DE + LD HL,#FFEF ;!HARDCODE + XOR A ; DssErr.sys.NO_ERROR + SBC HL,DE ; проверка на служ. кластеры POP HL - ;LD A,DssErr.sys.NO_ERROR RET ;R01; HL - CLUSTER @@ -165,28 +164,39 @@ R_F_F16: ;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 - ADD HL,HL - ADD HL,DE RR H - RR L ;CLUSTER * 1.5 - PUSH AF - LD A,H - LD B,A - AND #1F - LD H,A - LD A,B - RLCA - RLCA - RLCA - AND #07 - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,RE_FAT - LD DE,FAT - 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,(FATCASH) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а + ENDIF + ; + LD DE,FAT_CACHE ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + POP AF ; восст. флаг LD E,(HL) INC HL LD D,(HL) @@ -196,27 +206,45 @@ R_F_F12 LD D,H 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 + RR D ; вправо на 4 битa + RRA + RR D + RRA + RR D + RRA + RR D + RRA LD E,A - RR D - RR E - RR D - RR E - RR D - RR E - RR D - RR E R_F_F02 POP AF OUT (SLOT3),A LD HL,#0FEF - XOR A ; обнуляем CF и устанавливаем код ошибки = нулю - SBC HL,DE + XOR A ; обнуляем CF и устанавливаем код ошибки = нулю + SBC HL,DE ; проверка на служ. кластеры POP HL RET -; HL - CLUSTER -; DE - (CLUSTER) +;----------------------------------------------------------- +; Записать в кеш FAT-а номер кластера +; вход: de = номер кластера +; hl = ? номер первого кластера +; выход: hl = ? номер след. кластера +; de = номер кластера +; in: HL - CLUSTER +; out: DE - (CLUSTER) +;----------------------------------------------------------- W_T_FAT PUSH DE EX DE,HL LD HL,(MAX_CLU) @@ -224,11 +252,11 @@ W_T_FAT PUSH DE SBC HL,DE EX DE,HL POP DE - LD A,10 ;!HARDCODE error number + LD A,DSS_Error.sys.DISK_FULL RET C EXX - SET_PAGE_X FATPAGE + SET_PAGE_X FATPAGE EXX PUSH HL @@ -236,12 +264,12 @@ W_T_FAT PUSH DE LD A,1 LD (FATCASH.Update),A LD A,(FatBuffer.FAT_TYP) - CP "2" + CP "2" ; fat12 JR Z,W_T_F12 W_T_F16: PUSH DE LD A,H - LD B,A + LD B,H AND #0F LD H,A LD A,B @@ -254,43 +282,53 @@ W_T_F16: LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT - ADD HL,DE - POP DE - LD (HL),E - INC HL + LD DE,FAT_CACHE + ADD HL,DE ; на ячейку FAT + POP DE + LD (HL),E ; сохр. в кеше FAT-а + INC HL ; номер кластера LD (HL),D - POP AF + POP AF ; восст. порт POP HL OUT (SLOT3),A XOR A RET - + ; + ; fat12 W_T_F12 PUSH DE LD D,H LD E,L - ADD HL,HL - ADD HL,DE + ; ADD HL,HL + ; ADD HL,DE + ; RR H + ; RR L ;CLUSTER * 1.5 + ; PUSH AF RR H - RR L ;CLUSTER * 1.5 - PUSH AF - LD A,H - LD B,A - AND #1F - LD H,A - LD A,B - RLCA - RLCA - RLCA - AND #07 - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,RE_FAT - LD DE,FAT + 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,(FATCASH) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а + ENDIF + ; + LD DE,FAT_CACHE ADD HL,DE POP AF POP DE - JP C,W_T_F01 + JP C,W_T_F01 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -303,19 +341,32 @@ W_T_F12 PUSH DE 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 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 + RL D + RLA + RL D + RLA + RL D + RLA + RL D + LD E,A + ; LD A,(HL) AND #0F OR E - LD (HL),A - INC HL + LD (HL),A ; сохр. в кеше FAT-а + INC HL ; номер кластера LD (HL),D POP AF POP HL @@ -324,6 +375,7 @@ W_T_F01 SLA E RET ;R01 +; Прочитать в кеш 16 секторов FAT-а ; A - NEW FAT BLOCK RE_FAT: PUSH HL PUSH AF @@ -334,55 +386,55 @@ RE_FAT: PUSH HL LD L,A LD H,0 LD (FATCASH),HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT + ;FAT BLOCK * 16 = SECTOR OF FAT + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL ;!TODO FATcacheSize + ; LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL LD IX,0 - ADD IX,DE - LD HL,0 ;HL:IX - SECTOR FAT FOR READING - LD DE,FAT ; DE - FAT ADDRESS - LD A,(FatBuffer.DRIVE) + ADD IX,DE ; номер лог. сектора + LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING + LD DE,FAT_CACHE ; куда ; DE - FAT ADDRESS + LD A,(FatBuffer.DRIVE) ; номер диска LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize RST ToDSS.DRV POP HL RET -WR_FAT: EXX - SET_PAGE_X FATPAGE - - EXX +; Подключить банку кеша FAT и записать его на диск +WR_FAT: SET_PAGE_X FATPAGE PUSH AF CALL .Start POP AF OUT (SLOT3),A RET - ; + ; Запись кеша (всего?) FAT-а на диск .Start: LD HL,(FATCASH) LD H,0 LD (FATCASH),HL ADD HL,HL ADD HL,HL ADD HL,HL - ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT + 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 - ADD HL,DE ;+ SIZE CASH (16 SECTORS) + LD C,L ;BC - BLOCK OF FAT + LD DE,16 ;!HARDCODE ;!TODO FATcacheSize + ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD DE,(BootSector.S_P_F) - LD A,16 + LD DE,(BootSector.S_P_F) ; секторов на FAT + LD A,16 ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize AND A SBC HL,DE JR C,.WALLFAT EX DE,HL - LD HL,16 -; AND A ;тут точно CF не взведён + LD HL,16 ;!HARDCODE ; число секторов ;!TODO FATcacheSize + ; CF = 0 SBC HL,DE JP C,FATERR LD A,L @@ -393,22 +445,23 @@ WR_FAT: EXX ADD HL,DE EX DE,HL LD IX,0 - ADD IX,DE - LD HL,0 ;HL:IX - SECTOR OF FAT FOR SAVE - LD DE,FAT - LD B,A - LD C,Dss.DRV.Write - LD A,(FatBuffer.DRIVE) + ;HL:IX - SECTOR OF FAT FOR SAVE + ADD IX,DE ; номер лог. сектора + LD HL,0 ; ст. разряд + LD DE,FAT_CACHE ; откуда + LD B,A ; число секторов + LD C,Dss.DRV.Write ; запись секторов + LD A,(FatBuffer.DRIVE) ; номер диска PUSH BC RST ToDSS.DRV - POP BC + POP BC ; b=число секторов POP HL LD DE,(FatBuffer.FAT2_XX) ADD HL,DE EX DE,HL LD IX,0 ADD IX,DE - LD DE,FAT + LD DE,FAT_CACHE LD HL,0 LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write @@ -469,13 +522,13 @@ WR_FAT: EXX ;R01 RET FATERR: POP HL -; SCF + ; CF = 1 RET FATCASH: WORD #0000 .Block EQU FATCASH .Update EQU FATCASH+1 -MAX_CLU: WORD #0FF0 +MAX_CLU: WORD #0FF0 ; макс. число кластеров FAT12 (без служ.) ;//MODULE: FAT_X ;[END] diff --git a/DSS/Media_drivers/NScanDRV2.ASM b/DSS/Media_drivers/NScanDRV2.ASM new file mode 100644 index 0000000..2498532 --- /dev/null +++ b/DSS/Media_drivers/NScanDRV2.ASM @@ -0,0 +1,475 @@ +;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC +ReScanDRV: +.NUMBER_OF_SUBTABLES EQU 2 ;количество таблиц второго уровня (LOGDRV, RMDRIVE) +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 0. запоминаем бут-диск +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,B + LD (.old_letter),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 1. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,DEVICE + LD DE,OLD_TABLES.DEVICE + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; + LD A,.NUMBER_OF_SUBTABLES + LD (Fill_if_Exists.tbl),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 2. вызываем инициализацию драйвов +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + CALL INITDVC_RET_DRIVE + LD (DRV_PAGE.LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 3. сравниваем записи старых таблиц с новыми: +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + LD B,DSS_MAX_DRIVES_AMOUNT +.tbl_scanNew_mainLoop: + PUSH BC + PUSH HL + ; получаем номер процедуры для этой буквы диска + LD A,(HL) + ; + CP #FF + JR Z,.nextN + ; + LD B,A + INC HL + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + + ; [ищем что за драйв] + EX DE,HL + ; FDD? + LD HL,FDDRIVE + AND A + SBC HL,DE + JR Z,.nextN ; пропуск FDD драйвов + ; HDD? + LD HL,HDDRIVE + AND A + SBC HL,DE + ; HDD! Сверка по таблице LOGDRV + JP Z,SCAN_TABLES.HARD_DRV + ; RD? + LD HL,RMDRIVE + AND A + SBC HL,DE + ; RAM Drive! Сверка по таблице RAMDTBL + JP Z,SCAN_TABLES.RAM_DRV + ; CD/DVD? + ;LD HL,CDDRIVE + ;AND A + ;SUB HL,DE + ; CD/DVD! + ; JR Z,SCAN_TABLES.CD_ROM + + ; следующий виток +.nextN: POP HL +.nextN2: + INC HL + INC HL + INC HL + POP BC + DJNZ .tbl_scanNew_mainLoop +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 4. сравниваем запись новых таблиц со старыми +; а. если драйв только в новой: +; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) +; +; ВХОД: IX - OLD_TABLES.DEVICE +; HL - OLD_TABLES.DEVICE.End +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + INC HL + LD (OLD_TABLES_CURRENT),HL + EXX + LD HL,OLD_TABLES.LOGDRV - LOGDRV + LD B,DSS_MAX_DRIVES_AMOUNT + EXX + ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало) + LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry + LD IY,LOGDRV + LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop1: LD A,#FF + CP (IX+0) + JR NZ,.loop2_start + ADD IX,DE + DJNZ .loop1 +.loop1_exit: + LD A,C ; закончили считать переменную LDRIVE + LD (DRV_PAGE.LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 5. проверяем, не грохнулся ли бут-диск. +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +.old_letter+1: + LD A,0 + _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE + LD A,(HL) + INC A + JP Z,ERROR_BOOTDRV_DIES +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 6. заменяем новые таблицы на модифицированные старые +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + LD DE,DEVICE + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;7. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,(DRV_PAGE.LDRIVE) + RET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;-----------------------[] +.loop2_start: + LD C,B ; начинаем считать переменную LDRIVE + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B ; сколько шагов вперёд по таблице осталось + LD B,A + ; +.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд + ADD IX,DE + ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов + PUSH IX + PUSH BC + CALL Fill_if_Exists + POP BC + POP IX + ; NC: + ; DE = адрес процедуры обработчика таблицы + ; A = логический номер устройства в таблице обработчика + ; + ; CF - нет больше новых записей + JR C,.loop1_exit + + LD (IX+0),A + LD (IX+1),E + LD (IX+2),D + ; + INC C ; добавили драйв + ; + DJNZ .loop2 + JR .loop1_exit +;-----------------------[] + +;-----------------------[] +Fill_if_Exists: +.tbl+1: LD B,ReScanDRV.NUMBER_OF_SUBTABLES + DJNZ 1F + ; B=1, RAMDTBL + LD A,RAMDTBL.TBL_Entry + LD IY,RAMDTBL + CALL .RUN + LD DE,RMDRIVE + RET NC + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + RET + ; +1: DJNZ 1F + ; B=2, LOGDRV + LD A,LOGDRV.TBL_Entry + LD IY,LOGDRV + CALL .RUN + LD DE,HDDRIVE + RET NC + ; переходим на другую таблицу - RAMDTBL + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + LD HL,OLD_TABLES.RAMDTBL + LD (OLD_TABLES_CURRENT),HL + EXX + LD B,MAX_RAMDRIVES + EXX + JR Fill_if_Exists + ; +1: SCF ; unknown table number + RET +; +.RUN: EXX + ; + LD D,0 + LD E,A + PUSH DE + ; + LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы + PUSH BC + CALL Find_Record.loop1 ; ищет в новой таблице новую запись + POP BC + JR NC,1F + ; + POP DE + EXX + RET + ; +1: PUSH IY ; сохраняем текущий адрес новой таблицы + ; + LD IY,(OLD_TABLES_CURRENT) + ; + LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы + LD C,D ; номер записи в таблице. D=0 + PUSH BC + CALL Find_Record.loop2 + LD A,C + POP BC + JR NC,1F + ; + POP DE + POP DE + EXX + RET + ; +1: EX (SP),IY ; переключение со старой на новую таблицу + PUSH IY + EXX + ; перекидываем запись из новой в старую + POP HL + POP DE + POP BC + LDIR + + LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы + AND A + RET +OLD_TABLES_CURRENT: WORD 0 +;-----------------------[] + +;-----------------------[] +; ВХОД: A - Маска для сравнения +; DE - Длина одной записи +; IY - Адрес данных в таблице +; ВЫХОД: NC: +; IY - начало подходящей записи +; C - номер новой записи в старой таблице +; CF - Не найдено, таблица закончилась +Find_Record: +.loop1: CP (IY) + RET NC + ADD IY,DE + INC C + DJNZ .loop1 + ; таблицу прошерстили + SCF + RET +.loop2: CP (IY) + RET Z + ADD IY,DE + INC C + DJNZ .loop2 + ; таблицу прошерстили + SCF + RET +;-----------------------[] + +;-----------------------[] +ERROR_BOOTDRV_DIES: + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S + LD E,0 + RST ToBIOS + ; + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + LD DE,0 + LD HL,#2050 + RST ToBIOS + ; + LD A,1 + OUT (RGMOD),A ; set scr-2 + ; + LD HL,.ERROR_MSG + LD DE,#A000 + LD BC,.ERROR_MSG.size + LD A,C + LDIR + ; + LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + ; +.loop: DI + HALT + JR .loop + ; +.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +.ERROR_MSG.size EQU $-.ERROR_MSG +;-----------------------[] + + +;-----------------------[] +; НЕ ГРОХАТЬ HL! +; а. если драйв есть в новой и старой, то затираем в новой +; таблице совпавший драйв +; б. если драйв есть только в старой, то: +; б1) грохаем файловые манипуляторы с его номером + MODULE SCAN_TABLES +; вход: B - лог.номер драйва, DE +RAM_DRV: + ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL + LD A,B + LD BC,OLD_TABLES.RAMDTBL + CALL GET_RAMDRV_NUM.skip_tbl + LD (.cur_drv),BC + AND #0F + LD C,A ; номер рамдиска + ; Ищем в новой такой же номер рамдиска + LD B,MAX_RAMDRIVES + LD DE,RAMDTBL +.loop: LD A,(DE) + SUB C + JR Z,.found + INC DE + INC DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; грохаем в старой RAMDTBL этот драйв + EX DE,HL +.cur_drv+1: + LD HL,0 + LD (HL),#FF + DEC HL + LD (HL),#FF + EX DE,HL + JP ReScanDRV.nextN2 + ; +.found: DEC A + ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (DE),A + DEC DE + LD (DE),A + JP ReScanDRV.nextN +;-----[] +HARD_DRV: + LD L,B + LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV + LD IX,LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop: LD A,(IY+0) + ;CP #FF + ;JR Z,.skip + CP (IX+0) + JR NZ,.skip + ; + LD A,(IY+1) + CP (IX+1) + JR NZ,.skip + LD A,(IY+2) + CP (IX+2) + JR Z,.found + ; +.skip: ADD IX,DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Грохаем старую запись в OLD_TABLES.LOGDRV + LD A,#FF + LD (IY+0),A + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; + JP ReScanDRV.nextN2 + ; +.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (IX+0),#FF + JP ReScanDRV.nextN + ; +; CD_ROM: +; JP ReScanDRV.nextN +;-----[] +; ВХОД: HL - текущая запись в таблице DEVICE +; B - шаг общего цикла +KILL_FM: + ; + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B + LD C,A + ; втыкаем страницу ядра с таблицей файловых манипуляторов + PUSH BC + LD A,(PORTAL.out_DRV.RETBANK) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B + POP BC + PUSH AF + ; Шерстим манипуляторы на наличие в них грохнутого драйва + LD IY,FM_BUF-FM_BUF.Size + #C000 + LD B,FMCOUNT + LD DE,FM_BUF.Size +.loop_fm: + ADD IY,DE + LD A,(IY+_sFM.DRIVE) + CP C + JR NZ,.skip + XOR A + LD (IY+_sFM.NAME),A ; грохаем манипулятор +.skip: DJNZ .loop_fm + ; + POP AF + OUT (SLOT3),A + ; + ; грохаем в OLD_TABLES.DEVICE убитый драйв + LD (HL),#FF + ; + RET + ENDMODULE +;-----------------------[] + +/* +[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78+1 + 416 + 32 == 526 + +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE EQU $ +.TBL_Entry EQU 3 +.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF +.Size EQU .End - $ + +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO +;+13 WORD FREE +;+15 BYTE FREE +; Логический номер раздела. +;Номер группы = логический номер раздела HDD из DEVICE +LOGDRV EQU DEVICE + DEVICE.Size +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry + +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID +RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size +.TBL_Entry EQU 2 +.Size EQU .TBL_Entry * MAX_RAMDRIVES +*/ \ No newline at end of file diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 1d6948e..4596085 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -524,7 +524,6 @@ IOCTL_RD: ; AND A ; RET -;!!!!! вызывается в SCANDRV, когда эта процедура в SLOT3, а не в SLOT0 GET_RAMDRV_NUM: LD BC,RAMDTBL .skip_tbl: diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index 3fdd291..0c2abf9 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -116,82 +116,6 @@ ; EX (SP),HL ; RET -;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые - - -;------------------------------------------------- -; RST 18h. Вектор дисковых устройств -; вход: a=номер устройства (0-25) -;------------------------------------------------- -INTDISK: - ;R01 - CP #FF - JR NZ,.noNeedRescan - CP C - JR Z,INITDVC_RET_DRIVE -.noNeedRescan: - ; - PUSH HL - PUSH BC - _CALC_DEVICE_ENTRY DEVICE - LD A,(HL) - CP #FF - JR Z,NODEV - INC HL - LD C,(HL) - INC HL - LD H,(HL) - LD L,C - POP BC - EX (SP),HL - RET -NODEV: POP BC - POP HL - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET - -PDEVICE DW DEVICE -; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF -; .Size: DB #FF -; .TBL_Entry EQU 3 - -FLOPPY EQU #0001 -FIXED EQU #0002 -CDROM EQU #0004 -NETWORK EQU #0008 - -;DISKS: DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"A:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #00 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"B:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #01 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FIXED ;DISK TYPE -; DB 2,"C:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT16 " -; DB #80 ;PHISICAL DRIVE NUMBER -; -; DB #00 ;END OF TABLE -;----------------------------------------------------------------------- - - ;R01 -; INITDVC_RET_DRIVE: -; CALL INITDVC -; LD A,(DRV_PAGE.LDRIVE) -; AND A -; RET - ; ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски @@ -256,6 +180,92 @@ MAKEDVC: LD C,A LD (HL),A RET + +;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые +;------------------------------------------------- +; RST 18h. Вектор дисковых устройств +; вход: a=номер устройства (0-25) +;------------------------------------------------- +INTDISK: + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + ;JR Z,INITDVC_RET_DRIVE + JR Z,ReScanDRV +.noNeedRescan: + ; + PUSH HL + PUSH BC + _CALC_DEVICE_ENTRY DEVICE + LD A,(HL) + CP #FF + JR Z,NODEV + INC HL + LD C,(HL) + INC HL + LD H,(HL) + LD L,C + POP BC + EX (SP),HL + RET +NODEV: POP BC + POP HL + LD A,DSS_Error.drv.INVALID_DRIVE + SCF + RET + +PDEVICE DW DEVICE +; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +; .Size: DB #FF +; .TBL_Entry EQU 3 + +FLOPPY EQU #0001 +FIXED EQU #0002 +CDROM EQU #0004 +NETWORK EQU #0008 + +;DISKS: DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"A:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #00 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"B:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #01 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FIXED ;DISK TYPE +; DB 2,"C:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT16 " +; DB #80 ;PHISICAL DRIVE NUMBER +; +; DB #00 ;END OF TABLE +;----------------------------------------------------------------------- + + ;R01 +; INITDVC_RET_DRIVE: +; CALL INITDVC +; LD A,(DRV_PAGE.LDRIVE) +; AND A +; RET + ; + + + + + +//////////////////////////////////////////////////////////////////////// +// NEW RESCAN // +//////////////////////////////////////////////////////////////////////// + INCLUDE 'NScanDRV2.ASM' +//////////////////////////////////////////////////////////////////////// ;DEVICE DB #00 ; DW FDDRIVE ; FDD A ; DB #01 diff --git a/DSS/NScanDRV.ASM b/DSS/NScanDRV.ASM index 68c2d84..2364310 100644 --- a/DSS/NScanDRV.ASM +++ b/DSS/NScanDRV.ASM @@ -1,970 +1,28 @@ -/* -; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе +;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC SCANDRV: -;1 [-----------] [-----------] [-----------] [-----------] [-----------] - ; LD A,(LDRIVE) - ; LD (.old_ldrive),A - ; LD A,(FATCASH.Update) - ; OR A - ; CALL NZ,WR_FAT - - CALL GETBOOT - LD (.old_letter),A ; bootdisk Log.number -; [-----------] - -;2 [-----------] [-----------] [-----------] [-----------] [-----------] - ; A = bootdisk Log.number - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - EX AF,AF' - LD (.old_DRIVE_ID),A -; [-----------] - - -;3 [-----------] [-----------] [-----------] [-----------] [-----------] - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A -; [-----------] - -;4 [-----------] [-----------] [-----------] [-----------] [-----------] -.old_DRIVE_ID+1: - LD A,0 - CALL SETBOOT - JR C,.ERROR_BOOTDRV_DIES - LD (.new_letter),A - ; - LD A,(.old_letter) - LD (BOOTDRV),A -; - -;5 [-----------] [-----------] [-----------] [-----------] [-----------] - AND A - LD A,R - PUSH AF - DI - ;;;;;;;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(DRV_PG_NUMBER) - OUT (SLOT3),A - ;;;;; - - ; вычисляем смещение bootdisk в новой таблице DEVICE -.new_letter+1: - LD A,0 - CALL .get_entry_addr - PUSH HL - ; сохраняем значения нового boot - LD DE,.TMP_BUFFER - LD BC,DEVICE.TBL_Entry - LDIR - ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE -.old_letter+1: - LD A,0 - CALL .get_entry_addr - ; меняем букву диска для девайса занявшего старую букву bootdisk - POP DE - LD BC,DEVICE.TBL_Entry - LDIR - ; восстанавливаем bootdisk на старое место - DEC HL - LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 - LD BC,DEVICE.TBL_Entry - EX DE,HL - LDDR - ; проверяем, не увеличилось ли значение LDRIVE - ;!TEST - LD HL,.old_letter - LD A,(LDRIVE) - CP (HL) - JR NC,.no_change_LDRIVE - LD A,(HL) - LD (LDRIVE),A - ; -; .old_ldrive+1: - ;LD L,0 - ;LD A,(LDRIVE) - ;CP L - ;JR NC,.no_change_LDRIVE - ;LD A,L - ;LD (LDRIVE),A - ; -.no_change_LDRIVE: - ; - ; DEC A - ; CALL DISKINF - ; LD A,(BOOTDRV) - ; CALL CHNDISK - ;;;;; -.restore_page+1: - LD A,0 - OUT (SLOT3),A - ;;;;;;;; - POP AF - LD A,(LDRIVE) - RET PO - EI - RET -.ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S - LD E,0 - RST ToBIOS - - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - LD DE,0 - LD HL,#2050 - RST ToBIOS - - LD A,1 - OUT (RGMOD),A ; set scr-2 - - LD HL,.ERROR_MSG - LD DE,#A000 - LD BC,.ERROR_MSG.size - LD A,C - LDIR - - LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - -.loop: DI -; .loop: LD A,R -; AND 7 -; OUT (BorderColor),A - HALT - JR .loop - -.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -.ERROR_MSG.size EQU $-.ERROR_MSG -.get_entry_addr: - _CALC_DEVICE_ENTRY DEVICE + #C000 - RET -; -.TMP_BUFFER: BLOCK 3,#FF - -; .old_letter: DB #FF -; .old_DRIVE_ID: DB #FF -; .new_letter: DB #FF -*/ - - - IF 1 -SCANDRV: -; 0. запоминаем состояние прерываний +; 1. запоминаем состояние прерываний ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; LD A,R DI PUSH AF ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 1. запоминаем бут-диск +; 2. узнаём букву бут-диска ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; CALL GETBOOT - LD (.old_letter),A - ;; A = bootdisk Log.number - ;;!FIXIT можно доставать из сохраненной таблицы когда понадобится - ; LD DE,Dss.DRV.GenIOCTL.Enter - ; LD BC,Dss.DRV.GenIOCTL.GetParams - ; RST ToDSS.DRV - ; EX AF,AF' - ;; A = bootdisk number - ; LD (.old_DRIVE_ID),A ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 2. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - SET_PAGE_X DRVPAGE - PUSH AF - - LD HL,DEVICE + #C000 - LD DE,OLD_TABLES.DEVICE + #C000 - LD BC,OLD_TABLES.DEVICE - DEVICE - LDIR - ; - LD A,2 ;!HARDCODE количество таблиц второго уровня (LOGDRV, RMDRIVE) - LD (Fill_if_Exists.tbl),A - ;POP AF - ;OUT (SLOT3),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - ; 3. вызываем рескан ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + ; A = Boot disk + LD B,A LD A,Dss.DRV.RescanDRV LD C,Dss.DRV.RescanDRV RST ToDSS.DRV LD (LDRIVE),A ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 4. сравниваем записи старых таблиц с новыми: -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - ;SET_PAGE_X DRVPAGE - ;PUSH AF - - - LD HL,OLD_TABLES.DEVICE + #C000 - LD B,DSS_MAX_DRIVES_AMOUNT -.tbl_scanNew_mainLoop: - PUSH BC - PUSH HL - ; получаем номер процедуры для этой буквы диска - LD A,(HL) - ; - CP #FF - JR Z,.nextN - ; - LD B,A - INC HL - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - ; ищем что за драйв - EX DE,HL - ; FDD? - LD HL,FDDRIVE - AND A - SBC HL,DE - JR Z,.nextN ; пропуск FDD драйвов - ; HDD? - LD HL,HDDRIVE - AND A - SBC HL,DE - ; HDD. Сверка по таблице LOGDRV - JP Z,SCAN_TABLES.HARD_DRV - ; RD? - LD HL,RMDRIVE - AND A - SBC HL,DE - ; RAM Drive. Сверка по таблице RAMDTBL - JP Z,SCAN_TABLES.RAM_DRV - ; CD/DVD? - ;LD HL,CDDRIVE - ;AND A - ;SUB HL,DE - ; CD/DVD. - ; JR Z,SCAN_TABLES.CD_ROM - ; - ; следующий виток -.nextN: POP HL -.nextN2: - INC HL - INC HL - INC HL - POP BC - DJNZ .tbl_scanNew_mainLoop -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 5. сравниваем запись новых таблиц со старыми -; а. если драйв только в новой: -; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; ВХОД: IX - OLD_TABLES.DEVICE -; HL - OLD_TABLES.DEVICE.End -; HL' - разница между адресами старых и новых таблиц -; - INC HL - LD (OLD_TABLES_CURRENT),HL - EXX - LD HL,OLD_TABLES.LOGDRV - LOGDRV - LD B,DSS_MAX_DRIVES_AMOUNT - EXX - ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало) - LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry + #C000 - LD IY,LOGDRV + #C000 - LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад - LD B,DSS_MAX_DRIVES_AMOUNT - ; -.loop1: LD A,#FF - CP (IX+0) - JR NZ,.loop2_start - ADD IX,DE - DJNZ .loop1 -.loop1_exit: - LD A,C ; закончили считать переменную LDRIVE - LD (DRV_PAGE.LDRIVE + #C000),A - LD (LDRIVE),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 6. проверяем, не грохнулся ли бут-диск. -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -.old_letter+1: - LD A,0 - _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE + #C000 - LD A,(HL) - INC A - JP Z,ERROR_BOOTDRV_DIES - -; .old_DRIVE_ID+1: -; LD A,0 -; CALL SETBOOT -; JR C,.ERROR_BOOTDRV_DIES -; LD (.new_letter),A -; ; -; LD A,(.old_letter) -; LD (BOOTDRV),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 7. заменяем новые таблицы на модифицированные старые -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD HL,OLD_TABLES.DEVICE + #C000 - LD DE,DEVICE + #C000 - LD BC,OLD_TABLES.DEVICE - DEVICE - LDIR - - POP AF - OUT (SLOT3),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -;8. выход +; 4. выход ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; POP AF RET PO EI RET -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - - ; -.loop2_start: - LD C,B ; начинаем считать переменную LDRIVE - ;LD (LDRIVE),A - ;LD C,A - ; - LD A,DSS_MAX_DRIVES_AMOUNT - SUB B ; сколько шагов вперёд по таблице осталось - LD B,A - ; -.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд - ADD IX,DE - ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов - PUSH IX - PUSH BC - CALL Fill_if_Exists - POP BC - POP IX - ; NC: - ; DE = адрес процедуры обработчика таблицы - ; A = логический номер устройства в таблице обработчика - ; - ; CF - нет больше новых записей - JR C,.loop1_exit - - LD (IX+0),A - LD (IX+1),E - LD (IX+2),D - ; - ; LD A,(LDRIVE) - ; INC A - ; LD (LDRIVE),A - INC C ; добавили драйв - ; - DJNZ .loop2 - JR .loop1_exit - ; - -;;; -Fill_if_Exists: -.tbl+1: LD B,2 ; количество таблиц. пока 2 - LOGDRV и RAMDTBL ;!!!!! восстанавливать - DJNZ 1F - ; B=1, RAMDTBL - LD A,RAMDTBL.TBL_Entry - LD IY,RAMDTBL + #C000 - CALL .RUN - LD DE,RMDRIVE - RET NC - LD A,(.tbl) - DEC A ;!!!!! может быть переполнение - LD (.tbl),A - RET - ; -1: DJNZ 1F - ; B=2, LOGDRV - LD A,LOGDRV.TBL_Entry - LD IY,LOGDRV + #C000 - CALL .RUN - LD DE,HDDRIVE - RET NC - ; переходим на другую таблицу - RAMDTBL - LD A,(.tbl) - DEC A ;!!!!! может быть переполнение - LD (.tbl),A - LD HL,OLD_TABLES.RAMDTBL + #C000 - LD (OLD_TABLES_CURRENT),HL - EXX - LD B,MAX_RAMDRIVES - EXX - JR Fill_if_Exists - ; - ; -1: SCF ; unknown table number - RET -; -.RUN: EXX - ; - LD D,0 - LD E,A - PUSH DE - ; - LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы - PUSH BC - CALL Find_Record.loop1 ; ищет в новой таблице новую запись - POP BC - JR NC,1F - ; - POP DE - EXX - RET - ; -1: PUSH IY ; сохраняем текущий адрес новой таблицы - ; - ;EX DE,HL - ;ADD IY,DE - ;EX DE,HL - LD IY,(OLD_TABLES_CURRENT) - ; - LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы - LD C,D ; номер записи в таблице. D=0 - PUSH BC - CALL Find_Record.loop2 - LD A,C - POP BC - JR NC,1F - ; - POP DE - POP DE - EXX - RET - ; -1: EX (SP),IY ; переключение со старой на новую таблицу - PUSH IY - EXX - ; перекидываем запись из новой в старую - POP HL - POP DE - POP BC - LDIR - - LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы - AND A - RET -OLD_TABLES_CURRENT: WORD 0 - -; ВХОД: A - Маска для сравнения -; DE - Длина одной записи -; IY - Адрес данных в таблице -; ВЫХОД: NC: -; IY - начало подходящей записи -; C - номер новой записи в старой таблице -; CF - Не найдено, таблица закончилась -Find_Record: -.loop1: CP (IY) - RET NC - ADD IY,DE - INC C - DJNZ .loop1 - ; таблицу прошерстили - SCF - RET -.loop2: CP (IY) - RET Z - ADD IY,DE - INC C - DJNZ .loop2 - ; таблицу прошерстили - SCF - RET -;;; - -ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S - LD E,0 - RST ToBIOS - - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - LD DE,0 - LD HL,#2050 - RST ToBIOS - - LD A,1 - OUT (RGMOD),A ; set scr-2 - - LD HL,.ERROR_MSG - LD DE,#A000 - LD BC,.ERROR_MSG.size - LD A,C - LDIR - - LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - -.loop: DI -; .loop: LD A,R -; AND 7 -; OUT (BorderColor),A - HALT - JR .loop - -.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -.ERROR_MSG.size EQU $-.ERROR_MSG - -; -; НЕ ГРОХАТЬ HL! -; а. если драйв есть в новой и старой, то затираем в новой -; таблице совпавший драйв -; б. если драйв есть только в старой, то: -; б1) грохаем файловые манипуляторы с его номером - MODULE SCAN_TABLES -; вход: B - лог.номер драйва, DE -RAM_DRV: - ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL - LD A,B - LD BC,OLD_TABLES.RAMDTBL + #C000 - CALL GET_RAMDRV_NUM.skip_tbl + #C000 - LD (.cur_drv),BC - AND #0F - LD C,A ; номер рамдиска - ; Ищем в новой такой же номер рамдиска - LD B,MAX_RAMDRIVES - LD DE,RAMDTBL + #C000 -.loop: LD A,(DE) - SUB C - JR Z,.found - INC DE - INC DE - DJNZ .loop - ; ЗАПИСЬ НЕ НАЙДЕНА - ; Достаём положение в OLD_TABLES.DEVICE - POP HL - ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM - POP BC - PUSH BC - ; Грохаем ФМ и запись в OLD_TABLES.DEVICE - CALL KILL_FM - ; грохаем в старой RAMDTBL этот драйв - EX DE,HL -.cur_drv+1: - LD HL,0 - LD (HL),#FF - DEC HL - LD (HL),#FF - EX DE,HL - JP SCANDRV.nextN2 - ; -.found: DEC A - ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (DE),A - DEC DE - LD (DE),A - JP SCANDRV.nextN - -HARD_DRV: - LD L,B - LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV + #C000 - LD IX,LOGDRV + #C000 - LD DE,LOGDRV.TBL_Entry - LD B,DSS_MAX_DRIVES_AMOUNT - ; -.loop: LD A,(IY+0) - ;CP #FF - ;JR Z,.skip - CP (IX+0) - JR NZ,.skip - ; - LD A,(IY+1) - CP (IX+1) - JR NZ,.skip - LD A,(IY+2) - CP (IX+2) - JR Z,.found - ; -.skip: ADD IX,DE - DJNZ .loop - ; ЗАПИСЬ НЕ НАЙДЕНА - ; Грохаем старую запись в OLD_TABLES.LOGDRV - LD A,#FF - LD (IY+0),A - ; Достаём положение в OLD_TABLES.DEVICE - POP HL - ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM - POP BC - PUSH BC - ; Грохаем ФМ и запись в OLD_TABLES.DEVICE - CALL KILL_FM - ; - JP SCANDRV.nextN2 - ; -.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (IX+0),#FF - JP SCANDRV.nextN - ; -; CD_ROM: -; JP SCANDRV.nextN - -; ВХОД: HL - текущая запись в таблице DEVICE -; B - шаг общего цикла -KILL_FM: - ; - LD A,DSS_MAX_DRIVES_AMOUNT - SUB B - LD C,A - ; втыкаем страницу ядра с таблицей файловых манипуляторов - PUSH BC - SET_PAGE_X COREPAGE - POP BC - PUSH AF - ; Шерстим манипуляторы на наличие в них грохнутого драйва - LD IY,FM_BUF-FM_BUF.Size + #C000 - LD B,FMCOUNT - LD DE,FM_BUF.Size -.loop_fm: - ADD IY,DE - LD A,(IY+_sFM.DRIVE) - CP C - JR NZ,.skip - XOR A - LD (IY+_sFM.NAME),A ; грохаем манипулятор -.skip: DJNZ .loop_fm - ; - POP AF - OUT (SLOT3),A - ; - ; грохаем в OLD_TABLES.DEVICE убитый драйв - LD (HL),#FF - ; - RET - ENDMODULE - - ENDIF - -/* -[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78 + 416 + 32 == 526 - -; логический номер устройства + адрес обработчика. -; Порядковый номер * 3 = буква диска + "A" -DEVICE EQU $ -.TBL_Entry EQU 3 -.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF -.Size EQU .End - $ - -;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -;+01 LONG SECTOR OFFSET -;+05 LONG SIZE IN SECTORS -;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO -;+13 WORD FREE -;+15 BYTE FREE -; Логический номер раздела. -;Номер группы = логический номер раздела HDD из DEVICE -LOGDRV EQU DEVICE + DEVICE.Size -.TBL_Entry EQU 16 -.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID -RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size -.TBL_Entry EQU 2 -.Size EQU .TBL_Entry * MAX_RAMDRIVES - - - - - -; -; NEW RESCAN -;=====================================================================[] - -; логический номер устройства + адрес обработчика. -; Порядковый номер * 3 = буква диска + "A" -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF -.Size: EQU $-DEVICE - - Логический номер раздела. -Номер группы = логический номер раздела HDD из DEVICE -LOGDRV EQU DEVICE + DEVICE.Size -.TBL_Entry EQU 16 -.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry -+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -+01 LONG SECTOR OFFSET -+05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) -+09 FREE -+15 - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) -RAMDTBL: DUP MAX_RAMDRIVES * 2 - DB #FF - EDUP -.Size EQU $-RAMDTBL - - - - -INTDISK: - ;R01 - CP #FF - JR NZ,.noNeedRescan - CP C - JR Z,INITDVC_RET_DRIVE -.noNeedRescan: - ; - PUSH HL - PUSH BC - ADD A,A - ADD A,A - LD C,A - LD B,0 - LD HL,DEVICE - ADD HL,BC - LD A,(HL) - CP #FF - JR Z,NODEV - INC HL - INC HL - LD C,(HL) - INC HL - LD H,(HL) - LD L,C - POP BC - EX (SP),HL - RET -NODEV: POP BC - POP HL - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET - - - -INITDVC: XOR A - LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку - LD HL,DEVICE - LD (PDEVICE),HL ; восст. ячейку - ; FDD девайсы - CALL FDDRIVE.INIT ; узнать число FDD-девайсов - LD DE,FDDRIVE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы - ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET -.if_old: CALL INIT_H - ;CALL .CHECK_HDD - LD DE,HDDRIVE - CALL MAKEDVC - ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE - CALL MAKEDVC - XOR A - RET -.CHECK_HDD: - - RET - - - ;R01 -INITDVC_RET_DRIVE: - LD DE,DRV_TEMP_BUFFER - LD HL,DEVICE - LD BC,DEVICE.Size - LDIR - LD HL,LOGDRV - LD BC,LOGDRV.Size - LDIR - LD HL,RAMDTBL - LD BC,RAMDTBL.Size - LDIR - - CALL INITDVC - - ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его - LD HL,DEVICE - LD DE,DRV_TEMP_BUFFER - LD B,DEVICE.Size -.loop_DEVICE: - LD A,(DE) - CP (HL) - CALL NZ,.FIND_DEV - INC HL - INC DE - DJNZ .loop_DEVICE - - LD A,(DRV_PAGE.LDRIVE) - AND A - RET - ; - - -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF -;=====================================================================[] -; -; -*/ - - ; LD A,(Fill_if_Exists.tbl) - ; DEC A - ; LD (Fill_if_Exists.tbl),A - - - - - -/* - ; находим в старой DEVICE первую свободную ячейку - LD HL,OLD_TABLES.DEVICE + DEVICE.Size - LD DE,-DEVICE.TBL_Entry - LD B,DSS_MAX_DRIVES_AMOUNT - LD A,#FF - ; -.loop1: ADD HL,DE - CP (HL) - JR NZ,.end_found - DJNZ .loop1 -.end_found: - ; HL = first free record in OLD_TABLES.DEVICE - LD (PDEVICE),HL - ; B = last drive - LD A,B - LD (DRV_PAGE.LDRIVE),A - ; Находим в старой LOGDRV первую свободную ячейку - ; !TODO тут оптимизнуть можно - EXX ; для .ldir_to_empty - LD HL,LOGDRV - LD B,DSS_MAX_DRIVES_AMOUNT - EXX - ; - LD HL,OLD_TABLES.LOGDRV - LD DE,LOGDRV.TBL_Entry - LD B,DSS_MAX_DRIVES_AMOUNT - LD A,#FF - ; -.loop3: CP (HL) - JR NZ,.loop3_skip - CALL .ldir_to_empty - JR Z.loop3_exit -.loop3_skip: - ADD HL,DE - DJNZ .loop3 -.loop3_exit: ; no free space in old table or no new records in new table - - - - ; Находим в новой LOGDRV первую новую запись - LD HL,LOGDRV - LD DE,LOGDRV.TBL_Entry - LD B,DSS_MAX_DRIVES_AMOUNT - ; -.loop2: LD A,(HL) - INC A - CALL NZ,. - JR NZ, ; error - no space for new record - ADD HL,DE - DJNZ .loop2 - ; - - - - - - - - EXX - LD BC,INIT_H - EXX - LD HL,LOGDRV - LD DE,LOGDRV.TBL_Entry - LD B,DSS_MAX_DRIVES_AMOUNT -.loop_logdrv: - LD A,#FF - CP (HL) - EXX - LD A,1 - CALL NZ,MAKEDVC - EXX - ADD HL,DE - DJNZ .loop_logdrv - ; - EXX - LD BC,INIT_RD - EXX - LD HL,RAMDTBL - LD DE,RAMDTBL.TBL_Entry - LD B,MAX_RAMDRIVES -.loop_logdrv: - LD A,#FF - CP (HL) - EXX - LD A,1 - CALL NZ,MAKEDVC - EXX - ADD HL,DE - DJNZ .loop_logdrv - - - - LD B,DSS_MAX_DRIVES_AMOUNT -.tbl_scanOld_mainLoop: - PUSH BC - - - - POP BC - DJNZ .tbl_scanOld_mainLoop - - - - - - -.ldir_to_empty: - ; Находим в новой LOGDRV первую новую запись - ; !TODO тут оптимизнуть можно - PUSH HL - EXX - ; - ; LD HL,LOGDRV - LD DE,LOGDRV.TBL_Entry - ; LD B,DSS_MAX_DRIVES_AMOUNT - LD A,#FF - ; -.loop3: CP (HL) - JR NZ,.run_ldir -.loop3skip: - ADD HL,DE - DJNZ .loop3 - ; no new records in table - ; ZF = 0 - ;LD A,B - ;DEC A ; Set ZF = 0 - EXX - POP HL ; сравняли стек - RET - ; -.run_ldir: - POP DE - PUSH BC - LD BC,LOGDRV.TBL_Entry - LDIR - POP BC - DJNZ .ldir_exit - ; обработали последнюю запись в таблице - LD A,B - DEC A ; Set ZF = 0 - ; -.ldir_exit: - EXX - RET -*/ \ No newline at end of file +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; \ No newline at end of file diff --git a/DSS/ScanDRV.ASM b/DSS/ScanDRV.ASM deleted file mode 100644 index 177200d..0000000 --- a/DSS/ScanDRV.ASM +++ /dev/null @@ -1,157 +0,0 @@ -; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе -SCANDRV: -;1 [-----------] [-----------] [-----------] [-----------] [-----------] - ; LD A,(LDRIVE) - ; LD (.old_ldrive),A - ; - CALL GETBOOT - LD (.old_letter),A ; bootdisk Log.number -; [-----------] - -;2 [-----------] [-----------] [-----------] [-----------] [-----------] - ; A = bootdisk Log.number - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - EX AF,AF' - LD (.old_DRIVE_ID),A -; [-----------] - - -;3 [-----------] [-----------] [-----------] [-----------] [-----------] - ;!TEST в DRV-MAIN могут быть проблемы с прерываниями - ;DI - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A - ;EI - ; -; [-----------] - -;4 [-----------] [-----------] [-----------] [-----------] [-----------] -.old_DRIVE_ID+1: - LD A,0 - CALL SETBOOT - JR C,.ERROR_BOOTDRV_DIES - LD (.new_letter),A - ; - LD A,(.old_letter) - LD (BOOTDRV),A -; - -;5 [-----------] [-----------] [-----------] [-----------] [-----------] - AND A - LD A,R - PUSH AF - DI - ;;;;;;;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(DRV_PG_NUMBER) - OUT (SLOT3),A - ;;;;; - - ; вычисляем смещение bootdisk в новой таблице DEVICE -.new_letter+1: - LD A,0 - CALL .get_entry_addr - PUSH HL - ; сохраняем значения нового boot - LD DE,.TMP_BUFFER - LD BC,DEVICE.TBL_Entry - LDIR - ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE -.old_letter+1: - LD A,0 - CALL .get_entry_addr - ; меняем букву диска для девайса занявшего старую букву bootdisk - POP DE - LD BC,DEVICE.TBL_Entry - LDIR - ; восстанавливаем bootdisk на старое место - DEC HL - LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 - LD BC,DEVICE.TBL_Entry - EX DE,HL - LDDR - ; проверяем, не меньше ли новое значение LDRIVE старого номера бут-диска - ;!TEST - LD HL,.old_letter - LD A,(LDRIVE) - CP (HL) - JR NC,.no_change_LDRIVE - LD A,(HL) - LD (LDRIVE),A - ; -; .old_ldrive+1: - ;LD L,0 - ;LD A,(LDRIVE) - ;CP L - ;JR NC,.no_change_LDRIVE - ;LD A,L - ;LD (LDRIVE),A - ; -.no_change_LDRIVE: - ; - ; DEC A - ; CALL DISKINF - ; LD A,(BOOTDRV) - ; CALL CHNDISK - ;;;;; -.restore_page+1: - LD A,0 - OUT (SLOT3),A - ;;;;;;;; - POP AF - LD A,(LDRIVE) - RET PO - EI - RET -.ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S - LD E,0 - RST ToBIOS - - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - LD DE,0 - LD HL,#2050 - RST ToBIOS - - LD A,1 - OUT (RGMOD),A ; set scr-2 - - LD HL,.ERROR_MSG - LD DE,#A000 - LD BC,.ERROR_MSG.size - LD A,C - LDIR - - LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - -.loop: DI -; .loop: LD A,R -; AND 7 -; OUT (BorderColor),A - HALT - JR .loop - -.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -.ERROR_MSG.size EQU $-.ERROR_MSG -.get_entry_addr: - _CALC_DEVICE_ENTRY DEVICE + #C000 - RET -; -.TMP_BUFFER: BLOCK 3,#FF - -; .old_letter: DB #FF -; .old_DRIVE_ID: DB #FF -; .new_letter: DB #FF \ No newline at end of file diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index e034185..350c84b 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -6,63 +6,47 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R03 04-04-2023 BAO FIXED BUGS IN FN SCROLL, SETVMOD, SELPAGE ;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" ;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) ;--------------------------------------------------------------- -; CLEAR TEXT WINDOW +;///////////////////////////////////////////////////////////////////// +; Функция #56. Очистить окно. +; +; вход: D - строка левого верхнего угла окна +; E - столбец левого верхнего угла окна +; H - высота окна +; L - ширина окна +; A - символ заполнитель +; B - атрибут заполнитель +; выход: нет +;///////////////////////////////////////////////////////////////////// CLEAR: LD C,BIOS.LP_CLS_WIN2 RST ToBIOS AND A RET ; - +;///////////////////////////////////////////////////////////////////// +; Функция #5C. Вывод строки на экран. +; +; вход: HL - указатель на строку символов +; выход: нет ; PRINT NULL-TERMINATED CHARS STRING -; HL - STRING POINTER -PCHARS: -.loop: LD A,(HL) +;///////////////////////////////////////////////////////////////////// +PCHARS: LD A,(HL) INC HL OR A RET Z - - ;!TEST FOR LP_PR_LINE_DIR - ;PUSH HL - ;CALL CURSOR - ;LD (.CHAR),A - ;LD A,(SLOT1) - ;PUSH AF - ;LD A,(SLOT0) - ;LD (SLOT1),A - ;LD HL,.CHAR + #4000 - ;LD BC,0*256 + BIOS.LP_PR_LINE_DIR - ;RST ToBIOS - ;POP AF - ;LD (SLOT1),A - ;POP HL - ;JP .loop - ; - CALL PUTCHAR - ;!TEST CR+LF+SCROLL - ;CALL CURSOR - ;LD A,D ; проверка на переход курсора - ;OR E ; в самое начало (X:Y == 0:0) - ;CALL Z,PUTCHAR.LFF - ; - JP .loop -;.CHAR: DZ " ",0 + JP PCHARS - -; PRINT CHAR -; A - CHAR +;///////////////////////////////////////////////////////////////////// +; Функция #5B. Вывод символа на экран в тек. позиции. +; +; вход: A - символ +; выход: нет +;///////////////////////////////////////////////////////////////////// PUTCHAR: - ;LD B,A - ;CALL CURSOR - ;LD A,B - - ;CP ' ' - ;JR NC,.CHAR CP #0D JR Z,.CR_ CP #0A @@ -73,40 +57,25 @@ PUTCHAR: JR Z,.BK_ CP #07 JR Z,.BELL - ;SCF - ;RET + ; .CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - ;!TEST CR+LF+SCROLL - ;JP ToBIOS + ;[x] CR+LF+SCROLL RST ToBIOS ; проверка на переход курсора в самое начало (X:Y == 0:0) CALL CURSOR LD A,D OR E RET NZ - ;LD A,D ; в DE координаты текущего знакоместа - ;XOR E ; Проверяем на координаты #1F:#4F - ;XOR #50 - ;RET NZ ; если другие - то выход - ;LD E,A - ;CALL LOCATE ; .LFF: PUSH HL ;!FIXIT сохранять текущие прерывания - ;PUSH DE LD BC,1*256 + BIOS.LP_SCROLL_UD LD DE,#0020 - ;EI - ;HALT - ;DI RST ToBIOS LD DE,#1F00 - ;PUSH DE CALL LOCATE LD A,' ' LD BC,#50*256 + BIOS.LP_PRINT_SYM RST ToBIOS - ;EI - ;POP DE LD DE,#1F00 CALL LOCATE POP HL @@ -134,9 +103,7 @@ PUTCHAR: RST ToBIOS XOR A CP E - ;!TEST - ;JP Z,LOCATE - RET Z + RET Z DEC E JP LOCATE .LF_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR @@ -159,8 +126,6 @@ PUTCHAR: LD HL,4 JP BEEP .NO_SCROLL: - ;CP ' ' - ;JR NC,.CHAR CP #0D JR Z,.CR_ CP #0A @@ -171,41 +136,40 @@ PUTCHAR: JR Z,.BK_ CP #07 JR Z,.BELL - ;SCF - ;RET ._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - ;!TEST CR+LF+SCROLL - JP ToBIOS - ;RST ToBIOS + JP ToBIOS ;-----[] ; ; -; SET CURRENT CURSOR POSITION -;=============================== -; D = Y -; E = X +;///////////////////////////////////////////////////////////////////// +; Функция #52. Установить положение курсора. +; +; вход: D - строка курсора +; E - колонка курсора +; выход: нет +;///////////////////////////////////////////////////////////////////// LOCATE: LD C,BIOS.LP_SET_PLACE - ; LD A,C - ; LD (NO_NEED_SCROLL),A JP ToBIOS - ;RET -; GET CURRENT CURSOR POSITION -; out: -; D - Y -; E - X +;///////////////////////////////////////////////////////////////////// +; Функция #53. Узнать положение курсора. +; +; вход: нет +; выход: D - строка курсора +; E - колонка курсора +;///////////////////////////////////////////////////////////////////// CURSOR: LD C,BIOS.LP_GET_PLACE JP ToBIOS - ;RET -; READ CHAR & ATTR FROM THE SCREEN -; in: -; D - Y -; E - X -; out: -; A - CHAR -; B - ATTR +;///////////////////////////////////////////////////////////////////// +; Функция #57. Прочитать символ с экрана. +; +; вход: D - строка +; E - колонка +; выход: A - символ +; B - атрибут +;///////////////////////////////////////////////////////////////////// RDCHAR: XOR A LD C,BIOS.WIN_GET_SYM RST ToBIOS @@ -214,12 +178,17 @@ RDCHAR: XOR A AND A RET -; WRITE CHAR & ATTR TO THE SCREEN -; D - Y -; E - X -; A - CHAR -; B - ATTR +;///////////////////////////////////////////////////////////////////// +; Функция #58. Вывести символ на экран. +; Управляющие символы выводятся как обычные символы. +; +; вход: D - строка +; E - колонка +; A - символ +; B - атрибут +; выход: нет ;!FIXIT slow как без WIN_GET_SYM тут обойтись? +;///////////////////////////////////////////////////////////////////// WRCHAR: LD C,A PUSH BC PUSH DE @@ -234,20 +203,21 @@ WRCHAR: LD C,A AND A RET -; COPY WINDOW FROM THE SCREEN -; D - Y -; E - X -; H - HEIGHT -; L - WIDTH -; IX - ADDRESS -; B - PAGE, IF IX > #C000 +;///////////////////////////////////////////////////////////////////// +; Функция #59. Сохранить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера, если IX >= #C000 +; IX - адрес буфера +; выход: нет +;///////////////////////////////////////////////////////////////////// WINCOPY: AND A LD A,R ;R02 PUSH AF ;R02 XOR A - ;EX AF,AF' ;R03 - ;LD A,B ;R03 - ;EX AF,AF' ;R03 LD C,BIOS.WIN_COPY DI ;R02 RST ToBIOS @@ -256,20 +226,21 @@ WINCOPY: AND A EI ;R02 RET -; RESTORE WINDOW TO THE SCREEN -; D - Y -; E - X -; H - HEIGHT -; L - WIDTH -; IX - ADDRESS -; B - PAGE, IF IX > #C000 +;///////////////////////////////////////////////////////////////////// +; Функция #5A. Восстановить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера, если IX >= #C000 +; IX - адрес буфера +; выход: нет +;///////////////////////////////////////////////////////////////////// WINREST: AND A LD A,R ;R02 PUSH AF ;R02 XOR A - ;EX AF,AF' ;R03 - ;LD A,B ;R03 - ;EX AF,AF' ;R03 DI ;R02 LD C,BIOS.WIN_RESTORE RST ToBIOS @@ -277,18 +248,20 @@ WINREST: AND A RET PO ;R02 EI ;R02 RET - -; SCROLL WINDOW -; D - Y -; E - X -; H - HEIGHT -; L - WIDTH -; B - SCROLL DIRECTION -; B = 1 - SCROLL UP -; B = 2 - SCROLL DOWN -; A = 0 - CLEAR LINE +;///////////////////////////////////////////////////////////////////// +; Функция #55. Скроллинг экрана. +; +; вход: D - строка левого верхнего угла окна +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B = 1 - прокрутка вверх +; B = 2 - прокрутка вниз +; A = 0 - очищать строку +; выход: нет +;///////////////////////////////////////////////////////////////////// SCROLL: DJNZ SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее - ;!TEST + ; [x] 04/04/23 ;LD B,A ;LD C,H ;PUSH BC @@ -301,11 +274,21 @@ SCROLL: DJNZ SCR_DW ;!TODO INC D DEC H LD C,BIOS.WIN_MOVE + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A + DI ; [x] 29/9/23 RST ToBIOS + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; POP HL POP DE - ;!TEST + ; [x] 04/04/23 ;POP BC POP AF ;XOR A @@ -329,11 +312,11 @@ SCROLL: DJNZ SCR_DW ;!TODO RET SCR_DW: DJNZ SCR_ERR - ;!TEST + ; [x] 04/04/23 ;LD B,A ;LD C,H ;PUSH BC - PUSH AF ;R03 + PUSH AF ; PUSH DE PUSH HL @@ -342,74 +325,92 @@ SCR_DW: DJNZ SCR_ERR INC XH DEC H LD C,BIOS.WIN_MOVE + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A + DI ; [x] 29/9/23 RST ToBIOS + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; POP HL POP DE - ;!TEST + ; [x] 29/9/23 ;POP BC - POP AF ;R03 + POP AF ;XOR A ;CP B AND A ; RET NZ JP SCROLL.print - ; PUSH DE ;R01 - ; CALL LOCATE - ; LD A,#20 - ; LD B,L - ; LD C,BIOS.LP_PRINT_SYM - ; RST ToBIOS - ; POP DE ;R01 - ; CALL LOCATE ;R01 - ; AND A - RET + SCR_ERR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET -; SELECT SCREEN PAGE -; B - SCREEN PAGE -SELPAGE:;PUSH BC +;///////////////////////////////////////////////////////////////////// +; Функция #54. Выбрать активную страницу экрана. +; +; вход: B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +SELPAGE: LD A,(VMODE) - BIT 7,A - JR NZ,.SEL2 + ;BIT 7,A + CP %1000'0000 + JR NC,.SEL2 PUSH BC LD C,A CALL SETVMOD.TEXT_M POP BC -.SEL2: ;POP BC - LD A,B +.SEL2: LD A,B AND #01 OUT (SCREEN_SWITCH),A RET -; GET CURRENT VIDEO MODE -; out: -; A - MODE -; B - PAGE +;///////////////////////////////////////////////////////////////////// +; Функция #51. Получить текущий режим экрана. +; +; вход: нет +; выход: A - текущий режим экрана +; B - страница экрана 0/1 +;///////////////////////////////////////////////////////////////////// GETVMOD IN A,(SCREEN_SWITCH) LD B,A LD A,(VMODE) AND A RET -; SET CURRENT VIDEO MODE -; A - MODE -; B - PAGE -SETVMOD: BIT 7,A +;///////////////////////////////////////////////////////////////////// +; Функция #50. Выбор режима экрана. +; +; вход: A - режим экрана +; 02h - текстовый 40x32x16 цветов +; 03h - текстовый 80x32x16 цветов +; 81h - графический 320x256x256 цветов +; 82h - графический 640x256x16 цветов +; B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +SETVMOD:;BIT 7,A + CP %1000'0000 LD C,A - JR NZ,GRAPH + JR NC,GRAPH .TEXT_M: LD IX,BACKTXT PUSH IX EX AF,AF' LD A,(VMODE) LD (VVMODE),A EX AF,AF' - INC A - DEC A + //INC A + //DEC A + OR A JR Z,.NOMODE DEC A JR Z,.NOMODE @@ -424,6 +425,7 @@ SETVMOD: BIT 7,A SCF RET +; Установка граф. режимов GRAPH: CALL SAVETXT AND #7F JR Z,G320_16 ; !TODO ? - пока отрабатывает как ошибка @@ -531,15 +533,20 @@ G640_16 PUSH BC ; SAFE_PORTY ; XOR A ; RET - VMODE: DB #03 +;----------------------------------------------------------------------- +; Открыть окно +; вход: hl=описатель окна +; e=флаги окна +; ;02h - TEXT 40 x 32 (16 colors) ;03h - TEXT 80 x 32 (16 colors) ;80h - GRAF 320 x 256 (16 colors) ;81h - GRAF 320 x 256 (256 colors) ;82h - GRAF 640 x 256 (16 colors) ;83h - GRAF 640 x 256 (256 colors) UNUSED +;----------------------------------------------------------------------- SETMODE: PUSH DE LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса. LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает @@ -554,7 +561,7 @@ SETMODE: PUSH DE LD IX,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. LD C,BIOS.WIN_OPEN RST ToBIOS - SAFE_PORTY ;????? - возможно, что теперь не нужно, везде с банкой 3 работают, проверить + SAFE_PORTY XOR A RET @@ -569,31 +576,42 @@ SETMODE: PUSH DE ; ;....................................................................... +;+0 X размер окна в знакоместах +;+1 Y размер окна в знакоместах +;+2 X полож. окна на экране +;+3 Y полож. окна на экране +;+4 режим знакоместа +;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) +;+6 X полож. в поле графики (в знакоместах) +;+7 Y полож. в поле графики (в знакоместах) ScreenDescriptorTable EQU $ -;80x32 -TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1 -;40x32 -TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2 -;640x256 PAGE 0 -TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3 -;320x256 PAGE 0 -TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4 -;640x256 PAGE 1 -TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5 -;320x256 PAGE 1 -TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6 +; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген. +TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1 +; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген. +TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2 +; 640x256. графическое, 0-й экран +TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3 +; 320x256. графическое, 0-й экран +TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4 +; 640x256. графическое, 1-й экран +TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5 +; 320x256. графическое, 1-й экран +TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6 ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 ;....................................................................... ; +;---------------------------------------------------------------------- +; Сохранить экран текст. режима. +; Для буфера экрана исп. 2-я банка расширения ДОС. SAVETXT PUSH AF - ;!!!!! перенесена логика супер дичайшего ускорения LD A,(VMODE) - BIT 7,A - JR NZ,NOSAVET + ;BIT 7,A + CP %1000'0000 + JR NC,NOSAVET SUB #02 JR C,NOSAVET -;; + PUSH BC PUSH DE PUSH HL @@ -611,27 +629,35 @@ SAVETXT PUSH AF LD L,#28 SVTEXT1 LD (SVHL1),HL LD DE,#0000 - ;EX AF,AF' ;R03 LD A,(BANKTBL+TXTPAGE) LD B,A - ;EX AF,AF' ;R03 LD C,BIOS.WIN_COPY + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A DI RST ToBIOS - EI + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; POP IX POP HL POP DE POP BC NOSAVET: POP AF RET +;---------------------------------------------------------------------- BACKTXT PUSH AF VVMODE+1: LD A,#00 - BIT 7,A - JR Z,NOBACKT + ;BIT 7,A + CP %1000'0000 + JR C,NOBACKT PUSH BC PUSH DE @@ -641,19 +667,23 @@ VVMODE+1: SVHL1+1: LD HL,#2050 LD DE,#0000 - ;EX AF,AF' ;R03 LD A,(BANKTBL+TXTPAGE) LD B,A - ;EX AF,AF' ;R03 LD C,BIOS.WIN_RESTORE + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A DI RST ToBIOS - EI + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; TCURS+1: LD DE,#0000 - ;LD C,BIOS.LP_SET_PLACE - ;RST ToBIOS CALL LOCATE POP IX POP HL @@ -662,9 +692,21 @@ TCURS+1: NOBACKT: POP AF RET -; SEND A SYMBOL TO THE PRINTER -;============================== -; A - SYMBOL +;///////////////////////////////////////////////////////////////////// +; Функция #5F. Вывод символа на принтер без ожидания. +; +; Интерпретация байта состояния принтера: +; 0..2 - не используются, обычно уст. в "1" +; 3 - ошибка принтера - есть/нет (1/0) +; 4 - принтер подключен/не подключен (1/0) +; 5 - бумаги нет/есть (1/0) +; 6 - принтер готов/выводит очередной символ (1/0) +; 7 - принтер свободен/занят (1/0) +; +; вход: A - символ +; выход: B - символ +; CF - ошибка, A=байт состояния (биты 7..3) +;///////////////////////////////////////////////////////////////////// ;!FIXIT заменить на sp2000.inc LPT_A EQU #1B LPT_B EQU #1C @@ -710,63 +752,33 @@ LPT2_D EQU #1E LPT2_C EQU #1F PRINT_INIT: DI - LD A,#CF ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан) + LD A,#CF ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан) LD BC,LPT2_C OUT (C),A - LD A,#63 + ; [x] 29/9/23 + ;LD A,#63 + LD A,63 + ; OUT (C),A - LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1) + LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1) OUT (LPT2_D),A - LD A,#0F ; Init printer port for Out + LD A,#0F ; Init printer port for Out OUT (LPT1_C),A -; САЙМАН ВЫРЕЗАЛ - XOR A ;LD A,0 + ; клава + XOR A ;LD A,0 OUT (COM_A),A - ;LD A,0 - OUT (COM_A),A ; ????? надо ли второй раз зассылать и вообще имеет ли смысл com инитить? + ; [x] 29/9/23 + INC A + OUT (COM_A),A + DEC A + ; + OUT (COM_A),A + LD A,5 OUT (COM_A),A - LD A,#62 ; bit 7 - Direction for Bufer (0), Bit 1 - Bufer Enable (1) + LD A,#62 ; bit 7 - Direction for Bufer (0), Bit 1 - Bufer Enable (1) OUT (COM_A),A RET -; САЙМАН ВЫРЕЗАЛ - ;//MODULE: VIDEO -;[END] - - -; ; САЙМАН -; PUSH AF -; LD A,E -; CP #4F -; JP NZ,.exit -; LD A,D -; CP #1F -; JP NZ,.exit -; LD E,0 -; LD C,BIOS.LP_SET_PLACE -; RST ToBIOS -; CALL LFF -; .exit: -; pop af -; RET -; ; САЙМАН - - -; LD A,D ; в DE координаты текущего знакоместа -; XOR E ; Проверяем на координаты #1F:#4F -; XOR #50 -; RET NZ ; если другие - то выход -; LD E,A -; LD C,BIOS.LP_SET_PLACE -; RST ToBIOS -;LFF: -; ... - -;;;;;;;; - ; LD A,D ; в DE координаты текущего знакоместа - ; XOR E ; Проверяем на координаты #1F:#4F - ; XOR #50 - ; RET NZ ; если другие - то выход -;;;;;;;; \ No newline at end of file +;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 1c3e15e..43f9cb6 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -371 \ No newline at end of file +396 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index a062c73..e74f3cd 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -4,7 +4,7 @@ ; DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. - DEFINE COMPILE_UNUSED_CODE 1 + DEFINE COMPILE_UNUSED_CODE 0 ; ; @@ -20,7 +20,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 ; ;-------------------[MEMORY]-------------------------; DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 - DEFINE OLD_SET_BANK 0 +; DEFINE OLD_SET_BANK 0 ;---------------------[ лог.номера страниц памяти ]--------------------- ; кэш списка каталога @@ -39,7 +39,7 @@ ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 ENVADDR EQU #E400 DIR EQU #C000 -FAT EQU #C000 +FAT_CACHE EQU #C000 FMCOUNT EQU 10 ; Количество файловых манипуляторов HANDBUF.SIZE EQU 32 diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index 15b5da7..3d919ae 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -98,25 +98,35 @@ COMP002: xor a jr c,NOUP cp "z"+1 jr nc,NOUP - and 5Fh ; a..z -> A..Z + and #5F ; a..z -> A..Z ;!!!!! тут восстанавливается директория и могут быть глюки на новом ядре NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; вывод сообщения - ; тест на существование папки на целевом диске - ld hl,system_path ; буфер сист. пути - ld c,Dss.ChDir ; уст. тек. путь - RST ToDSS - jp nc,save_disk_path ; Ok + + ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) + ; тест на существование папки на целевом диске + IFDEF MANY_SYS_PATHES + ld hl,system_path ; буфер сист. пути + ld c,Dss.ChDir ; уст. тек. путь + RST ToDSS + jp nc,save_disk_path ; Ok + ENDIF + ; + ; уст. корень, нет такой папки на новом диске ld hl,system_path+1 ; буфер сист. пути ld (hl),0 dec hl ld (hl),'\' - ld c,Dss.ChDir ; уст. тек. путь - RST ToDSS - jp c,print_err_message ; вывод сообщения + ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) + IFDEF MANY_SYS_PATHES + ld c,Dss.ChDir ; уст. тек. путь + RST ToDSS + jp c,print_err_message ; вывод сообщения + ENDIF + ; jp save_disk_path ; Ok ; задан не диск diff --git a/SHELL/build.txt b/SHELL/build.txt index efee1f8..e3f1e9b 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -78 \ No newline at end of file +80 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 639cc1e..1b02533 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 639cc1e69de900dd85e1bc4d3525dfeb91ea15ab +Subproject commit 1b025338c449183aa1cfbe595994fd9ddf7feb8e From bd5eb85d7b7752af86cf8cc1d035b3875c4c47ff Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 1 Oct 2023 02:58:21 +1000 Subject: [PATCH 041/219] ... --- DSS/DOS_X.ASM | 29 ++++++++++++++++++- .../{NScanDRV2.ASM => ReScanDRV.ASM} | 0 DSS/Media_drivers/shared-drv.asm | 6 ++-- DSS/NScanDRV.ASM | 28 ------------------ DSS/build.txt | 2 +- 5 files changed, 32 insertions(+), 33 deletions(-) rename DSS/Media_drivers/{NScanDRV2.ASM => ReScanDRV.ASM} (100%) delete mode 100644 DSS/NScanDRV.ASM diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index e345f96..a127d51 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -646,7 +646,34 @@ BACK_CUR_PATH: ; выход: A - номер последнего лог. диска в системе ;/////////////////////////////////////////////////////////////////////// ; INCLUDE 'ScanDRV.asm' - INCLUDE 'NScanDRV.asm' +;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC +SCANDRV: +; 1. запоминаем состояние прерываний +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,R + DI + PUSH AF +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 2. узнаём букву бут-диска +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + CALL GETBOOT +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 3. вызываем рескан +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + ; A = Boot disk + LD B,A + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 4. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + POP AF + RET PO + EI + RET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ;/////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/Media_drivers/NScanDRV2.ASM b/DSS/Media_drivers/ReScanDRV.ASM similarity index 100% rename from DSS/Media_drivers/NScanDRV2.ASM rename to DSS/Media_drivers/ReScanDRV.ASM diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index 0c2abf9..af304f2 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -259,13 +259,13 @@ NETWORK EQU #0008 - - //////////////////////////////////////////////////////////////////////// // NEW RESCAN // //////////////////////////////////////////////////////////////////////// - INCLUDE 'NScanDRV2.ASM' + INCLUDE 'ReScanDRV.ASM' //////////////////////////////////////////////////////////////////////// + + ;DEVICE DB #00 ; DW FDDRIVE ; FDD A ; DB #01 diff --git a/DSS/NScanDRV.ASM b/DSS/NScanDRV.ASM deleted file mode 100644 index 2364310..0000000 --- a/DSS/NScanDRV.ASM +++ /dev/null @@ -1,28 +0,0 @@ -;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC -SCANDRV: -; 1. запоминаем состояние прерываний -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,R - DI - PUSH AF -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 2. узнаём букву бут-диска -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - CALL GETBOOT -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 3. вызываем рескан -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - ; A = Boot disk - LD B,A - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 4. выход -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - POP AF - RET PO - EI - RET -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 43f9cb6..c0220a2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -396 \ No newline at end of file +397 \ No newline at end of file From f236cf5bcf1a45527f64d449c317014ecf4e96bf Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 6 Oct 2023 00:31:46 +1000 Subject: [PATCH 042/219] some bug fixes with shell. Testing independed current dir --- DSS/DOS5.ASM | 231 ++++++++++++++++++++------------ DSS/DOS_FM.ASM | 60 +++++---- DSS/DOS_X.ASM | 53 ++++---- DSS/DSS-MAIN.ASM | 40 +++--- DSS/DSS_MACROSES.Z80 | 10 +- DSS/ENVIRON.ASM | 10 +- DSS/EXECUTE.ASM | 177 ++++++++++++------------ DSS/FAT_X.ASM | 2 +- DSS/Media_drivers/ReScanDRV.ASM | 4 +- DSS/Media_drivers/ide-drv.asm | 15 ++- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/Commands/DEL.ASM | 5 +- SHELL/Commands/DIR.ASM | 9 +- SHELL/SHELL_EXEC.ASM | 9 +- SHELL/build.txt | 2 +- 16 files changed, 356 insertions(+), 275 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 9609242..fcd9064 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -29,7 +29,7 @@ ; B = 1 SET ATTRIB ; OUTPUT: A - ATTRIB ATTRIB: - _mSavePath + _mSavePath 1 INC B DEC B JP Z,RATTRIB @@ -48,7 +48,7 @@ RATTRIB XOR A POP BC RET C LD A,B - AND A + ;AND A RET WATTRIB PUSH AF @@ -64,47 +64,29 @@ WATTRIB PUSH AF POP BC RET C LD A,B - AND A + ;AND A RET -; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 -; OUTPUT: A - FM -CREATE: - _mSavePath - AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (ACCESS),A - LD (PATH0),HL - CALL GETWORD - RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK - RET C - CALL SEARCH - - JR C,CREAT ;NO FILE, CREAT NEW. - CALL DELFILE ;FILE EXIST RECREAT - JP CREAT ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -CREAT_N: - _mSavePath - AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (ACCESS),A - LD (PATH0),HL - CALL GETWORD - RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK +CREATE: _mSavePath 0 + CALL .Prepare + RET C + CALL SEARCH + CALL NC,DELFILE ;FILE EXIST RECREAT + JR .DO +; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; OUTPUT: A - FM +.NEW: _mSavePath 0 + CALL .Prepare RET C CALL SEARCH - LD A,DSS_Error.sys.FILE_EXISTS CCF RET C -CREAT LD HL,MASKARE + ; +.DO: LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR @@ -112,10 +94,12 @@ CREAT LD HL,MASKARE LD A,(ACCESS) LD (HL),A INC HL - LD BC,#0A00 -FIHND LD (HL),C + LD BC,#0A00 ;!HARDCODE + ; +.loop1: LD (HL),C INC HL - DJNZ FIHND + DJNZ .loop1 + ; PUSH HL CALL SYSTIME CALL MK_TIME @@ -129,19 +113,42 @@ FIHND LD (HL),C LD (HL),B INC HL LD BC,#0600 -FIHND1 LD (HL),C + ; +.loop2: LD (HL),C INC HL - DJNZ FIHND1 + DJNZ .loop2 + ; CALL WRT_HND CALL SAVEDIR LD HL,(PATH0) XOR A JP OPEN ;R08 +.Prepare: + AND #E7 ;R04 %76A00SHR = !FAT_ATTR + LD (ACCESS),A + LD (PATH0),HL + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + JP MASK +CREAT_N EQU CREATE.NEW + ; INPUT: HL - "filename.ext",#00 without simbols * ? -DELETE: LD DE,MASKARE - CALL MASK - RET C +DELETE: + ;!TEST + _mSavePath 1 + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + ; + ; LD DE,MASKARE + ; CALL MASK + ; RET C LD HL,MASKARE LD BC,11 LD A,"?" @@ -263,9 +270,9 @@ OPENATR: ; код ошибки, если CF=1 ////////////////////////////////////////////////////////////////////// OPEN_FN: - _mSavePath -OPEN: ;R08 - LD (ACCESS),A + _mSavePath 1 +;R08 +OPEN: LD (ACCESS),A CALL GETWORD RET C LD HL,TMPNAME @@ -300,7 +307,7 @@ OPENAT: ;R02 LD (IY+_sFM.F_POSITION+3),A LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A - LD HL,FM_BUF+_sFM.ST_CLUSTER + LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER LD E,(HL) INC HL LD D,(HL) @@ -311,9 +318,9 @@ OPENAT: ;R02 RET CLOSE_FN: - _mSavePath -CLOSE: ;R08 - LD (ACCESS),A + _mSavePath 1 +;R08 +CLOSE: LD (ACCESS),A CALL SET_FM RET C LD A,(TASK) @@ -631,25 +638,81 @@ SEARCH4: SCF RET + +; ;!TEST +; SAVE_CURRENT_PATH: +; SET_PAGE_X ENVPAGE +; PUSH AF +; CALL CURRDSK +; ADD A,"A" +; LD HL,TMP_CURDIR +; LD (HL),A +; INC HL +; LD A,":" +; LD (HL),A +; INC HL +; CALL CURRDIR +; POP AF +; OUT (SLOT3),A +; RET +; BACK_CURRENT_PATH: +; SET_PAGE_X ENVPAGE +; PUSH AF +; LD HL,TMP_CURDIR +; CALL CHDIR +; POP AF +; OUT (SLOT3),A +; RET +; ; ;------------------------------------------------- ; Тест на допустимое имя и настроиться на диск. ; вход: hl=строка имени ;------------------------------------------------- GETWORD: + ; !TEST + INC HL + LD A,(HL) + DEC HL + CP ':' + JR NZ,.dir_loop + + LD A,(HL) + CP 'a' + JR C,.next + CP '{' + JR NC,.next + SUB #20 +.next: SUB 'A' + INC HL + INC HL + PUSH HL + ;!TEST CHNDISK OPENDSK + ;CALL OPENDSK + CALL CHNDISK + ; + POP HL + RET C + ; +.dir_loop: LD DE,TMPNAME LD BC,#0DFF + ; .loop: LD A,(HL) INC HL CP '\' JR Z,.DIR_NAME - CP ':' - JR Z,.DRV_NAME + ;CP ':' + ;JR Z,.DRV_NAME LD (DE),A INC DE CP ' '+1 CCF RET NC DJNZ .loop + ; + ; ;!TEST + ; CALL BACK_CURRENT_PATH + ; LD A,DSS_Error.sys.INVALID_NAME SCF RET @@ -661,25 +724,25 @@ GETWORD: LD HL,TMPNAME CALL OPENDIR POP HL - JR NC,GETWORD - RET + RET C + JR .dir_loop -.DRV_NAME: - LD A,(TMPNAME) - CP 'a' - JR C,.next - CP '{' - JR NC,.next - SUB #20 -.next: SUB 'A' - PUSH HL - ;!TEST CHNDISK OPENDSK - CALL OPENDSK - ;CALL CHNDISK - ; - POP HL - JP NC,GETWORD - RET +; .DRV_NAME: +; LD A,(TMPNAME) +; CP 'a' +; JR C,.next +; CP '{' +; JR NC,.next +; SUB #20 +; .next: SUB 'A' +; PUSH HL +; ;!TEST CHNDISK OPENDSK +; ;CALL OPENDSK +; CALL CHNDISK +; ; +; POP HL +; RET C +; JR .loop ; Буфер имени 8.3 формата TMPNAME: DZ ' ' ; 12 пробелов и 0 @@ -687,8 +750,8 @@ TMPNAME: DZ ' ' ; 12 ; RestoreDIR: CHNDISK: ;!TEST - ;CALL OPENDSK - CALL OPENDSK.force + CALL OPENDSK + ;CALL OPENDSK.force ; ;????? R10 RET C @@ -700,8 +763,6 @@ CHNDISK: POP BC RET C LD A,B - RET - ; RET C ; PUSH AF ; CALL LOADDIR @@ -741,7 +802,7 @@ OPENDIR: CALL SET_FM LD A,(HL) OR A - JP NZ,SUBDIR + JR NZ,SUBDIR REROOT1: LD DE,0 LD (IY+_sFM.ST_CLUSTER),E @@ -1659,7 +1720,9 @@ RMKTIME EX DE,HL ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 ////////////////////////////////////////////////////////////////////// -CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск +CHDIR: + _mSavePath 0 +.tmp: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME LD A,(HL) @@ -1676,7 +1739,7 @@ CHDIR: CALL GETWORD ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 ////////////////////////////////////////////////////////////////////// MKDIR: - _mSavePath + _mSavePath 1 CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME ; 8.3 имя @@ -1735,7 +1798,7 @@ MKDIR: CALL WRT_HND ; скопир. новую запись в список диска (каталога) CALL SAVEDIR ; сбросить кеш каталога на диск - LD HL,SECBUF ; буфер + LD HL,CORE_BUFFERS.SECBUF ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; b=счетчик, c=пробел @@ -1795,7 +1858,7 @@ MKD04 EX DE,HL POP HL CALL NSECTOR - LD A,(BootSector.S_P_C) ; секторов на кластер + LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер MKD12 PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора @@ -1805,15 +1868,15 @@ MKD12 PUSH AF OUT (SLOT3),A ; LD A,(FatBuffer.DRIVE) - LD DE,SECBUF+#C000 + LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Write RST ToDSS.DRV ; POP AF OUT (SLOT3),A - LD HL,SECBUF - LD DE,SECBUF+1 + LD HL,CORE_BUFFERS.SECBUF + LD DE,CORE_BUFFERS.SECBUF+1 LD BC,511 LD (HL),0 LDIR ;!FIXIT нужно ли так много грохать? @@ -1841,7 +1904,7 @@ MKD11 POP AF ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 ////////////////////////////////////////////////////////////////////// RMDIR: - _mSavePath + _mSavePath 1 CALL GETWORD RET C LD HL,TMPNAME @@ -1862,7 +1925,7 @@ RMDIR: PUSH IX RMD17 PUSH HL CALL NSECTOR - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) RMD12 PUSH AF PUSH HL PUSH IX @@ -1871,7 +1934,7 @@ RMD12 PUSH AF IN A,(SLOT0) OUT (SLOT3),A - LD DE,SECBUF+#C000 + LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Read LD A,(FatBuffer.DRIVE) RST ToDSS.DRV @@ -1880,7 +1943,7 @@ RMD12 PUSH AF OUT (SLOT3),A LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора - LD HL,SECBUF + LD HL,CORE_BUFFERS.SECBUF RMD10 LD A,(HL) OR A JP Z,RMD15 ;DIR EMPTY diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index f0de378..dfe28a6 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -47,8 +47,8 @@ FM_BUF: _sFM JR NC,ABS_FM PUSH DE - LD IY,FM_BUF - LD DE,FM_BUF.Size + LD IY,CORE_BUFFERS.FM_BUF + LD DE,CORE_BUFFERS.FM_BUF.Size AND A JR Z,.endLoop .loop: ADD IY,DE @@ -82,8 +82,8 @@ RES_FM: GET_FM: LD B,FMCOUNT LD C,#FF - LD IY,FM_BUF-FM_BUF.Size - LD DE,FM_BUF.Size + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size .loop: ADD IY,DE INC C LD A,(IY+0) @@ -175,7 +175,7 @@ BLOKRD0 POP BC ; B - Amount sectors BLOK_RD: PUSH BC LD (READ.MEM),IX - LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 ;!FIXIT ;HL:DE / BC => DE:IX HL-OSTATOK @@ -255,7 +255,7 @@ BLOKRD2: POP DE POP BC - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) SUB E LD C,A ;\ CP B ; \ @@ -280,7 +280,7 @@ BLOKRD4 LD DE,(READ.MEM) JP C,BLOKRD0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKRD5 ADD HL,DE DEC C JR NZ,BLOKRD5 @@ -289,7 +289,7 @@ BLOKRD5 ADD HL,DE LD A,B OR A RET Z -BLOKRD6 LD HL,BootSector.S_P_C +BLOKRD6 LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A @@ -317,7 +317,7 @@ BLOKRD7 EX DE,HL JP C,BLOKRD0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKRD8 ADD HL,DE DEC C JR NZ,BLOKRD8 @@ -345,7 +345,7 @@ BLOKWR0 POP BC ; B - Amount sectors BLOK_WR PUSH BC LD (READ.MEM),IX - LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK @@ -440,7 +440,7 @@ BLOKWR2 LD A,B POP DE POP BC - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) SUB E LD C,A CP B @@ -465,7 +465,7 @@ BLOKWR4 LD DE,(READ.MEM) JP C,BLOKWR0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKWR5 ADD HL,DE DEC C JR NZ,BLOKWR5 @@ -474,7 +474,7 @@ BLOKWR5 ADD HL,DE LD A,B OR A RET Z -BLOKWR6 LD HL,BootSector.S_P_C +BLOKWR6 LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A @@ -507,7 +507,7 @@ BLOKWR9 POP BC JP C,BLOKWR0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKWR8 ADD HL,DE DEC C JR NZ,BLOKWR8 @@ -556,9 +556,11 @@ READ: LD (R_POINT),HL CALL SET_FM RET C CALL TSTSIZE - LD A,D - OR E - JP Z,.NOREAD ;!FIXIT можно перенести в начало процедуры + ;!FIXIT можно перенести в начало процедуры + LD A,D + OR E + JP Z,.NOREAD + ; PUSH DE LD A,(IY+_sFM.DRIVE) CALL OPENDSK @@ -625,7 +627,7 @@ READ: LD (R_POINT),HL OR C JP Z,.ROV6 PUSH BC - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -636,7 +638,7 @@ READ: LD (R_POINT),HL LD C,SLOT3 OUT (C),B JP C,.ERR_1 - LD HL,BUFFER + LD HL,CORE_BUFFERS.BUFFER LD DE,(R_POINT) POP BC LDIR @@ -661,7 +663,7 @@ READ: LD (R_POINT),HL .ROV1: PUSH BC PUSH HL PUSH DE - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -695,7 +697,7 @@ READ: LD (R_POINT),HL LD C,L LD HL,0 .ROV3: PUSH HL - LD HL,BUFFER + LD HL,CORE_BUFFERS.BUFFER ADD HL,DE LD DE,(R_POINT) LDIR @@ -786,7 +788,7 @@ WOV2: POP BC PUSH HL PUSH DE PUSH BC - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -796,7 +798,7 @@ WOV2: POP BC POP BC LD C,SLOT3 OUT (C),B - LD DE,BUFFER + LD DE,CORE_BUFFERS.BUFFER LD HL,(R_POINT) POP BC JP C,PWERR2 @@ -804,7 +806,7 @@ WOV2: POP BC LD (R_POINT),HL POP DE POP HL - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -841,7 +843,7 @@ WOV6: LD DE,(READ.S_POINT) WOV1: PUSH BC PUSH HL PUSH DE - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -870,7 +872,7 @@ WOV1: PUSH BC LD C,L LD HL,0 WOV3: PUSH HL - LD HL,BUFFER + LD HL,CORE_BUFFERS.BUFFER ADD HL,DE LD DE,(R_POINT) EX DE,HL @@ -879,7 +881,7 @@ WOV3: PUSH HL EXX PUSH HL PUSH DE - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -905,7 +907,7 @@ WOV3: PUSH HL ; NSECTOR: DEC HL ; DEC HL ; EX DE,HL -; LD A,(BootSector.S_P_C) +; LD A,(CORE_BUFFERS.BootSector.S_P_C) ; LD B,A ; LD HL,0 ; LD IX,0 @@ -924,7 +926,7 @@ WOV3: PUSH HL NSECTOR: DEC HL DEC HL LD DE,0 - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) XOR 1 JR Z,.skip ; diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index a127d51..102336c 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -182,8 +182,8 @@ FRESP2: LD D,B LD E,C LD HL,(MAX_CLU) DEC HL - LD BC,(BootSector.B_P_S) - LD A,(BootSector.S_P_C) + LD BC,(CORE_BUFFERS.BootSector.B_P_S) + LD A,(CORE_BUFFERS.BootSector.S_P_C) AND A RET @@ -232,7 +232,7 @@ RD_BPB: LD C,SLOT3 OUT (SLOT3),A ;R08 ;LD DE,BOOT+#C000 - LD DE,SECBUF+#C000 + LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE @@ -245,21 +245,21 @@ RD_BPB: LD C,SLOT3 //PUSH IY ; пока без индексного, но может пригодиться LD DE,#AA55 ; сигнатура ;R05 - LD HL,(SECBUF+510) ;R08 ;R07 + LD HL,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07 ;R05 AND A SBC HL,DE JP NZ,DOS_X_Error.UnknownBPB ;R08 - LD HL,SECBUF - LD DE,BootSector + LD HL,CORE_BUFFERS.SECBUF + LD DE,CORE_BUFFERS.BootSector LD BC,_sBOOT_SEC ; size LDIR ; //LD IY,BootSector ; пока без индексного, но может пригодиться //LD A,(IY+_sBOOT_SEC.ID_FORM) - LD A,(BootSector.ID_FORM) + LD A,(CORE_BUFFERS.BootSector.ID_FORM) CP #F0 JP C,DOS_X_Error.UnknownBPB @@ -272,7 +272,7 @@ RD_BPB: LD C,SLOT3 //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec //LD H,(IY+_sBOOT_SEC.RESERVE+1) - LD HL,(BootSector.RESERVE) + LD HL,(CORE_BUFFERS.BootSector.RESERVE) ; ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec @@ -285,10 +285,10 @@ RD_BPB: LD C,SLOT3 //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT //LD D,(IY+_sBOOT_SEC.S_P_F+1) - LD DE,(BootSector.S_P_F) + LD DE,(CORE_BUFFERS.BootSector.S_P_F) - LD A,(BootSector.FAT_NUM) ; amount FATs + LD A,(CORE_BUFFERS.BootSector.FAT_NUM) ; amount FATs CP 1 JR Z,.loop1 DEC A @@ -305,7 +305,7 @@ RD_BPB: LD C,SLOT3 //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors //LD B,(IY+_sBOOT_SEC.B_P_S+1) - LD BC,(BootSector.B_P_S) + LD BC,(CORE_BUFFERS.BootSector.B_P_S) ; RL C ; RL B ; RL C @@ -330,7 +330,7 @@ RD_BPB: LD C,SLOT3 //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) - LD DE,(BootSector.F_P_DIR) + LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) EX DE,HL DEC HL @@ -359,9 +359,9 @@ RD_BPB: LD C,SLOT3 //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector //LD H,(IY+_sBOOT_SEC.B_P_S+1) - LD HL,(BootSector.B_P_S) ; Size sector + LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector - LD A,(BootSector.S_P_C) ;!TODO FATcacheSize + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize ;NEXTAD3 ; .loop3: ADD HL,BC ; calc. cluster size ; DEC A @@ -389,7 +389,7 @@ RD_BPB: LD C,SLOT3 ENDIF //////////////////////////////////////////////////////////////////////// - LD HL,BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага + LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG LD B,3 ;R_BPBL1 @@ -426,9 +426,9 @@ RD_BPB: LD C,SLOT3 //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track //LD B,(IY+_sBOOT_SEC.S_P_T+1) - LD BC,(BootSector.S_P_T) ; Sector per track + LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track - LD A,(BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага + LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага .BPB_L1: ; calc. sector per cylinder ADD HL,BC DEC A @@ -446,7 +446,7 @@ RD_BPB: LD C,SLOT3 //LD L,(IY+_sBOOT_SEC.S_P_D) //LD H,(IY+_sBOOT_SEC.S_P_D+1) - LD HL,(BootSector.S_P_D) + LD HL,(CORE_BUFFERS.BootSector.S_P_D) LD A,H OR L @@ -454,11 +454,11 @@ RD_BPB: LD C,SLOT3 ; //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) - LD HL,(BootSector.BPB_BIG_TOTAL_SECTORS) + LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS) //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) - LD BC,(BootSector.BPB_BIG_TOTAL_SECTORS+2) + LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2) AND A SBC HL,DE @@ -469,7 +469,7 @@ RD_BPB: LD C,SLOT3 ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 -.HDDBIG: LD A,(BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага +.HDDBIG: LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага SCF .S4C01: RRA JR C,.S4C02 @@ -506,7 +506,7 @@ RD_BPB: LD C,SLOT3 RET .IBM_DOS: - LD A,(BootSector.ID_FORM) + LD A,(CORE_BUFFERS.BootSector.ID_FORM) CP #F0 JR C,DOS_X_Error.UnknownBPB ;????? надо ли изменить? @@ -582,7 +582,7 @@ SAVE_CUR_PATH CALL CURRDSK ADD A,"A" - LD HL,TMP_CURDIR + LD HL,TMP_CURDIR_AUTO LD (HL),A INC HL LD A,":" @@ -608,7 +608,8 @@ SAVE_CUR_PATH ; !TODO починить BACK_CUR_PATH: - PUSH IY + RET NC +.force: PUSH IY PUSH IX PUSH HL PUSH DE @@ -618,8 +619,8 @@ BACK_CUR_PATH: SET_PAGE_X ENVPAGE PUSH AF - LD HL,TMP_CURDIR - CALL CHDIR + LD HL,TMP_CURDIR_AUTO + CALL CHDIR.tmp ; почему не POP AF : OUT (SLOT3),A //POP BC diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index e5fff67..f5332f4 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -320,7 +320,7 @@ F_START: DI LDIR ;R07 ;R11 ;R11 - LD HL,FM_BUF + LD HL,CORE_BUFFERS.FM_BUF LD (HL),'.' ;R11 ;---------------------------; @@ -456,6 +456,7 @@ ADRST10: ;DS 512 ;,0 ; CLEAR_ZONE.start EQU $ + MODULE CORE_BUFFERS BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM @@ -465,15 +466,15 @@ EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER - + ENDMODULE CLEAR_ZONE.size EQU _sBuffers - ASSERT (BUFFERSplace+_sBuffers)<#3FFF, "Warning!!! OUT OF SLOT0" + ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "BUFFERSplace.BootSector ",/H,BUFFERSplace.BootSector - DISPLAY "BootSector ", /H, BootSector - DISPLAY "EXEBUFF ", /H, EXEBUFF - DISPLAY "Size ", /H, EXEBUFF-BootSector + DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector + DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector + DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF + DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector DISPLAY "--- --- --- --- --- --- --- ---" @@ -508,12 +509,12 @@ BUFFER EQU XSTACK+1 SECBUF EQU BUFFER ;R11 //////////////////////////////// */ - DISPLAY "FM_BUF addr: ",/H,FM_BUF - DISPLAY "FM_BUF.Size: ",/H,FM_BUF.Size - DISPLAY "FM_BUF.FullSize: ",/H,FM_BUF.FullSize - DISPLAY "EXEBUFF: ",/H,EXEBUFF - DISPLAY "XSTACK: ",/H,XSTACK - DISPLAY "BUFFER: ",/H,BUFFER + DISPLAY "FM_BUF addr: ",/H,CORE_BUFFERS.FM_BUF + DISPLAY "FM_BUF.Size: ",/H,CORE_BUFFERS.FM_BUF.Size + DISPLAY "FM_BUF.FullSize: ",/H,CORE_BUFFERS.FM_BUF.FullSize + DISPLAY "EXEBUFF: ",/H,CORE_BUFFERS.EXEBUFF + DISPLAY "XSTACK: ",/H,CORE_BUFFERS.XSTACK + DISPLAY "BUFFER: ",/H,CORE_BUFFERS.BUFFER ; ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < @@ -523,8 +524,7 @@ SECBUF EQU BUFFER ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; ; !!!!! эта процедура затрётся после исполнения -DEPLOY: - ;Allocate memory +DEPLOY: ;Allocate memory LD BC,USING_MEMPAGES*256 + BIOS.GetMem RST ToBIOS RET C ;R10 @@ -550,7 +550,7 @@ DEPLOY: OUT (SLOT3),A SET_PAGE_X DRVPAGE - +\ PUSH AF LD HL,DRV_CONTENT LD DE,#C000 @@ -562,14 +562,8 @@ DEPLOY: OUT (SLOT3),A AND A ;R10 RET -; .halt: POP HL ;снимаем лишнее со стека -; ; LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY -; ; SCF -; RET - - ; defb 0 - IF ENVVALUE != BUFFER + IF ENVVALUE != CORE_BUFFERS.BUFFER ASSERT "Warning! ENVVALUE != BUFFER" //BLOCK 1000,0 ENDIF diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 0d476d4..40e3f84 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -149,17 +149,21 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ; ; - MACRO _mSavePath + MACRO _mSavePath force IF SAVE_PATH_MACRO PUSH HL - LD HL,BACK_CUR_PATH + IF force==1 + LD HL,BACK_CUR_PATH.force + ELSE + LD HL,BACK_CUR_PATH + ENDIF EX (SP),HL CALL SAVE_CUR_PATH ENDIF ENDM MACRO _mRestorePath IF SAVE_PATH_MACRO - CALL BACK_CUR_PATH + CALL BACK_CUR_PATH.force ENDIF ENDM MACRO _mRestorStackAfterRestorePath diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index 15d2eb9..410ed0f 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -4,7 +4,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте ;!TODO проверить как у Саймана сделано +;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте ;R03 09-03-2007 VAS Функция ENV_EX теперь обрезает слишком длинную строку перед выходом ;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV ;--------------------------------------------------------------- @@ -13,6 +13,7 @@ ; Функция #46. Системное окружение. ; ; вход: B - номер подфункции: +; B=#FF, инициализация ; B=0, получение системного окружения. ; HL - буфер ; B=1, получить переменную окружения. @@ -47,6 +48,7 @@ ENVIRON: INITENV: SET_PAGE_X ENVPAGE PUSH AF + ; ;R02 LD A,(BOOTDRV) ADD A,'A' @@ -65,6 +67,7 @@ INITENV: AND A SBC HL,DE LD (ENVSIZE),HL + ; POP AF OUT (SLOT3),A AND A @@ -82,6 +85,7 @@ READENV: LD C,SLOT3 IN L,(C) EXX + LD HL,ENVIRONMENT INC HL POP DE @@ -265,8 +269,8 @@ ENV_E2 LD A,(HL) SCF RET -ENVNAME EQU EXEBUFF ;DS 32 -ENVVALUE EQU BUFFER //#3800 ; BUFFER ;DS 128 +ENVNAME EQU CORE_BUFFERS.EXEBUFF ;DS 32 +ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128 ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 5dd5b66..5f0161d 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -6,7 +6,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 +//;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE ;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR @@ -135,7 +135,7 @@ EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 EX_PATH: EXX - LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!FIXIT не чё, что используется общий буфер? + LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер LD (NM_PATH),HL LD HL,NM_NAME_A LD (NM_NAME),HL @@ -364,7 +364,7 @@ NM_NAME_A: DB " ",#00 NM_EXTN_A: DB " ",0 -NM_PATH_A EQU BUFFER ;DS 256 +NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer ////////////////////////////////////////////////////////////////////// @@ -646,27 +646,6 @@ SETWIN2 LD C,BIOS.GetMemPage ; // SLOT0 - #C2 %1100'0010 ; // SLOT0 - #E2 %1110'0010 - -;///////////////////////////////////////////////////////////////////// -; Функция #40. Выполнить файл. -; -; вход: HL - указатель на имя файла -; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) -; B=1 - загрузить и выполнить программу с полным путём до программы -; выход: A - код завершения, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -EXEC: - _mSavePath - INC B ;R03 - DEC B ;R03 - JP Z,EXEC0 ;R03 - DEC B ;R03 - JP Z,EXEC1 ;R03 - LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 - SCF ;R03 - RET ;R03 - CHECKPATH: ; !TODO сделать проверку на количество циклов LD A,(HL) INC HL @@ -697,7 +676,7 @@ FINDPATH: CALL MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY -NEXTPATHI: +.NEXTPATHI: LD E,(HL) INC HL LD D,(HL) @@ -708,22 +687,22 @@ NEXTPATHI: PUSH BC EX DE,HL CALL Z,GOTO_CURDIR - CALL CHDIR - JR C,BADPATH - LD HL,EXEBUFF + CALL CHDIR.tmp + JR C,.BADPATH + LD HL,CORE_BUFFERS.EXEBUFF LD DE,MASKARE CALL MASK - JR C,BADPATH + JR C,.BADPATH CALL TST_EXT - JR C,BADPATH + JR C,.BADPATH CALL SEARCH -BADPATH: +.BADPATH: POP BC POP HL - JR NC,PATHFOUND - DJNZ NEXTPATHI + JR NC,.PATHFOUND + DJNZ .NEXTPATHI SCF -PATHFOUND: +.PATHFOUND: POP BC LD A,B OUT (SLOT3),A @@ -733,7 +712,7 @@ PATHFOUND: GOTO_CURDIR: PUSH HL LD HL,TMP_CURDIR - CALL CHDIR + CALL CHDIR.tmp POP HL RET @@ -779,7 +758,8 @@ NEXTCH: LD A,(DE) ENVPATH DB "PATH=",0 ;;; -; !TODO СДЕЛАТЬ СТРУКТУРОЙ +; !TODO СДЕЛАТЬ СТРУКТУРОЙ и обозначить страницу +TMP_CURDIR_AUTO EQU #FB00 PATH_PNT_ARRAY EQU #FC80 TMP_CURDIR EQU #FD00 ENVTEMP EQU #FE00 @@ -792,9 +772,18 @@ DECTASK: LD HL,TASK ;R08 DEC (HL) ;R08 RET ;R08 -;------------------------------------------------------------------------ + +;///////////////////////////////////////////////////////////////////// +; Функция #40. Выполнить файл. +; +; вход: HL - указатель на имя файла +; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) +; B=1 - загрузить и выполнить программу с полным путём до программы +; выход: A - код завершения, если CF=0 +; код ошибки, если CF=1 +;--------------------------------------------------------------------- ; Загрузить и выполнить программу. -; функ. 40h, B=0. +; функ. #40, B=0. ; ; 1) Открывает exe-файл на чтение; ; 2) Считывает в рабочую область префикс exe-файла; @@ -816,13 +805,22 @@ DECTASK: LD HL,TASK ;R08 ; -01 1 db ? ; Уровень текущей программы ; +00 1 db ? ; Длина ком-строки ; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем -;------------------------------------------------------------------------ -EXEC0: LD (CMDLINE),HL +;///////////////////////////////////////////////////////////////////// +EXEC: _mSavePath 1 + INC B ;R03 + DEC B ;R03 + JR Z,.VAR_1 ;R03 + DEC B ;R03 + JR Z,.VAR_2 ;R03 + LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 + SCF ;R03 + RET ;R03 + ; +.VAR_1: LD (CMDLINE),HL CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME LD HL,(CMDLINE) JR C,EXEC0_SHORT - -EXEC1: CALL EXEC_1 +.VAR_2: CALL EXEC_1 SCF RET ; File not found - exit @@ -846,6 +844,7 @@ EXEC_1: LD (CMDLINE),HL CALL DECTASK ;R08 AND A RET + ; .noError: POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM @@ -865,7 +864,7 @@ EXEC0_SHORT: CALL ENVIRON LD HL,(CMDLINE) - LD DE,EXEBUFF + LD DE,CORE_BUFFERS.EXEBUFF COPYEXN: LD A,(HL) LDI OR A @@ -876,16 +875,16 @@ COPYEXN: LD A,(HL) RET C ; LD HL,(CMDLINE) - JR EXEC1 + JR EXEC.VAR_2 EXEC02: LD (EXE_FM),A - LD HL,EXEBUFF + LD HL,CORE_BUFFERS.EXEBUFF LD DE,#0080 ;!#0200(512) ;R02 LD A,(EXE_FM) CALL READ JP C,ERREXE - LD IX,EXEBUFF - LD HL,(EXEBUFF) + LD IX,CORE_BUFFERS.EXEBUFF + LD HL,(CORE_BUFFERS.EXEBUFF) LD DE,'E'+'X'*256 ;AND A ; не нужно, если бы был CF=1, то чуть выше мы бы ушли на JP C,ERREXE SBC HL,DE @@ -900,13 +899,14 @@ EXEC02: LD (EXE_FM),A ; LD HL,TASK ; INC (HL) ; -; HERE TO DO: BACK TO CURRDIR +; !TODO: BACK TO CURRDIR ; ;R09 _mRestorStackAfterRestorePath + _mRestorePath ;R09 ; - LD DE,(EXEBUFF.LOADER) + LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) LD A,E OR D JP NZ,PRELOAD @@ -919,7 +919,7 @@ EXEC02: LD (EXE_FM),A LD B,#02 LD A,(EXE_FM) CALL MOVE_FP - LD DE,(EXEBUFF.LD_ADDR) + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD A,D AND #3F LD D,A @@ -985,19 +985,19 @@ NOINK: LD A,H LD (DE),A ;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; LD HL,(CMDLINE) - LD DE,SECBUF+1 + LD DE,CORE_BUFFERS.SECBUF+1 CALL SCOPYS - LD A,#80 + LD A,#80 ;!HARDCODE cmd line size SUB B - LD (SECBUF),A + LD (CORE_BUFFERS.SECBUF),A ;R02 - LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; LD A,SHARED_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A - LD HL,(EXEBUFF.LD_ADDR) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,RAMMAP LD A,H AND #C0 @@ -1016,8 +1016,10 @@ FR8000: LD A,(DE) FRC000: LD A,(DE) OUT (SLOT3),A CALL M_PSP - LD HL,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) + + + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) LD B,Dss.Move_FP.FrStart LD A,(EXE_FM) CALL MOVE_FP @@ -1025,13 +1027,13 @@ FRC000: LD A,(DE) LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE ; ; - LD DE,(EXEBUFF.LD_ADDR) + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) XOR A LD H,A LD L,A SBC HL,DE EX DE,HL ; de=число чит. байт - LD HL,(EXEBUFF.LD_ADDR) ; буфер + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла LD A,(EXE_FM) ; дескр. файла @@ -1041,15 +1043,15 @@ FRC000: LD A,(DE) ;R09 _mRestorePath ; - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) + LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,#0080 AND A SBC HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(EXEBUFF.PC_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE PUSH HL @@ -1094,7 +1096,7 @@ ERREXE: PUSH AF RET PRELOAD: EX DE,HL - LD DE,(EXEBUFF.LD_ADDR) + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD A,D AND #3F LD D,A @@ -1131,7 +1133,7 @@ NOINK2: LD (EXSTACK),SP LD SP,HL EXX -;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; + ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит LD A,(EXE_MEM) LD DE,RAMMAP LD BC,#00*256 + BIOS.GetMemPage @@ -1154,19 +1156,19 @@ NOINK2: LD (DE),A ;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; LD HL,(CMDLINE) - LD DE,SECBUF+1 + LD DE,CORE_BUFFERS.SECBUF+1 CALL SCOPYS LD A,#80 SUB B - LD (SECBUF),A + LD (CORE_BUFFERS.SECBUF),A ;R02 - LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; LD A,SHARED_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A - LD HL,(EXEBUFF.LD_ADDR) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,RAMMAP LD A,H AND #C0 @@ -1185,8 +1187,9 @@ FR8000H: LD A,(DE) FRC000H: LD A,(DE) OUT (SLOT3),A CALL M_PSP - LD HL,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) + + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) LD B,Dss.Move_FP.FrStart LD A,(EXE_FM) CALL MOVE_FP @@ -1195,8 +1198,8 @@ FRC000H: LD A,(DE) ; ; - LD HL,(EXEBUFF.LD_ADDR) ; буфер - LD DE,(EXEBUFF.LOADER) ; число чит. байт + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер + LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла @@ -1204,15 +1207,15 @@ FRC000H: LD A,(DE) ;R09 _mRestorePath ; - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) + LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,#0080 AND A SBC HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(EXEBUFF.PC_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) LD DE,RETFAR PUSH DE PUSH HL @@ -1251,12 +1254,14 @@ LEAVE: LD A,B LD SP,HL EX DE,HL LD A,(ERLEVEL) - AND A ;R12 - JR Z,.exit + CP DSS_Error.sys.UNEXPECTED_APP_TRMN + JR NZ,.exit SCF + JP (HL) ; -.exit: JP (HL) +.exit: AND A + JP (HL) ;///////////////////////////////////////////////////////////////////// ; Функция #42. Получить код завершения программы. @@ -1267,13 +1272,17 @@ LEAVE: LD A,B WAIT: LD A,(ERLEVEL) AND A RET +;///////////////////////////////////////////////////////////////////// -M_PSP: LD HL,(EXEBUFF.LD_ADDR) + + +;!TODO заменить тут CALL CURRDIR и CALL CURRDSK на другое, когда будет сохраняться current dir +M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) DEC H LD D,H LD E,L INC DE - LD BC,#00FF + LD BC,#00FF ;!HARDCODE LD (HL),B LDIR EX DE,HL @@ -1283,7 +1292,7 @@ M_PSP: LD HL,(EXEBUFF.LD_ADDR) EX DE,HL LD XH,D LD XL,E - LD HL,SECBUF + LD HL,CORE_BUFFERS.SECBUF LD C,(HL) INC C LDIR @@ -1333,7 +1342,7 @@ M_PSP: LD HL,(EXEBUFF.LD_ADDR) ; RET -SCOPYS: LD BC,#80*256 + ' '+1 +SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size .loop: LD A,(HL) CP C JR C,.copy @@ -1343,7 +1352,7 @@ SCOPYS: LD BC,#80*256 + ' '+1 LD (DE),A LD B,#80 RET -.copy: LD BC,#80*256 + ' ' +.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size .loop2: LD A,(HL) LD (DE),A INC HL @@ -1367,7 +1376,7 @@ EXE_MEM: DB #00 ; CMDLINE: DW #0000 -EXSTACK: DW XSTACK ; адрес стека +EXSTACK: DW CORE_BUFFERS.XSTACK ; адрес стека ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;; diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 31ed55d..65a9cc6 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -427,7 +427,7 @@ WR_FAT: SET_PAGE_X FATPAGE LD DE,16 ;!HARDCODE ;!TODO FATcacheSize ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD DE,(BootSector.S_P_F) ; секторов на FAT + LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT LD A,16 ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize AND A SBC HL,DE diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index 2498532..dd97687 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -423,9 +423,9 @@ KILL_FM: POP BC PUSH AF ; Шерстим манипуляторы на наличие в них грохнутого драйва - LD IY,FM_BUF-FM_BUF.Size + #C000 + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + #C000 LD B,FMCOUNT - LD DE,FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size .loop_fm: ADD IY,DE LD A,(IY+_sFM.DRIVE) diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index db56665..8a769bc 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -412,6 +412,8 @@ REMOV_H: AND A RET + + RESE_H: XOR A RET @@ -419,13 +421,12 @@ STAT_H: XOR A RET CHEK_H: - ;!TEST - LD A,#FF - ;XOR A - ; - AND A + LD A,#FF + ;XOR A + ;AND A RET + ;HL:IX - SECTOR ; DE - ADDRESS GBPB_H: PUSH IY @@ -444,8 +445,8 @@ GBPB_H: PUSH IY POP DE POP IY LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - RET + JP ToBIOS + ;RET ;HL:IX - SECTOR ; DE - ADDRESS diff --git a/DSS/build.txt b/DSS/build.txt index c0220a2..a21cae3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -397 \ No newline at end of file +454 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index e74f3cd..2c2a1bf 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +15,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 - DEFINE SAVE_PATH_MACRO 0 + DEFINE SAVE_PATH_MACRO 1 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; diff --git a/SHELL/Commands/DEL.ASM b/SHELL/Commands/DEL.ASM index 320b4cd..25f16b6 100644 --- a/SHELL/Commands/DEL.ASM +++ b/SHELL/Commands/DEL.ASM @@ -3,14 +3,13 @@ ; DEL, ERASE. Удалить файл ; ;/////////////////////////////////////////////////// -cmd_del:ex de,hl - ;ld de,T9186 +cmd_del: ex de,hl ld de,work_buffer1; ld c,Dss.GSwitch RST ToDSS - ;ld hl,T9186 ld hl,work_buffer1; ld c,Dss.Delete RST ToDSS call c,print_err_message ; вывод сообщения ret +;/////////////////////////////////////////////////// \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 971c6ee..9d1e598 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -4,7 +4,7 @@ ; ;/////////////////////////////////////////////////// cmd_dir: push de - ld c,Dss.CurDisk ; узнать тек. диск + ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS ld (disk+1),a ; номер диска call read_disk_info ; прочитать метку и серийный номер диска @@ -16,12 +16,15 @@ cmd_dir: push de ex de,hl ld a,(hl) or a - jr nz,$+5 ; задана маска имен + jr nz,1F ; задана маска имен ld hl,mask_fname ; "*.*" ;ld de,T9186 ; буфер - ld de,work_buffer1 ; 80 +1: ld de,work_buffer1 ; 80 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS + ; [ ] 1/10/23 + + ; ;ld hl,T9186 ; имя файла ;ld de,T9186 ; буфер ld hl,work_buffer1 ; имя файла diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index 3d919ae..0d6bcdb 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -120,6 +120,7 @@ NOUP: sub "A" ; ld (hl),0 dec hl ld (hl),'\' + ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) IFDEF MANY_SYS_PATHES ld c,Dss.ChDir ; уст. тек. путь @@ -155,10 +156,10 @@ A839D: ld bc,0*256 + Dss.Exec ; ;R10 ret nc ; Ok ld hl,(D8374) - cp 3 ; код ошибки "файл не обнаружен" + cp DSS_Error.sys.FILE_NOT_FOUND jr nz,A83DD push hl - ;ld a,(D96AD) ;; длина строки (inline.asm) + ;ld a,(D96AD) ; длина строки (inline.asm) ld a,(struct_input_line+4) ; длина строки ld b,a A83AF: ld a,(hl) @@ -199,6 +200,6 @@ A83D7: ld bc,0*256 + Dss.Exec ; ;R10 ret nc A83DD: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" - jp nc,print_err_message ; вывод сообщения - xor a ; индекс "Bad command or file name" + jp nc,print_err_message ; вывод сообщения + xor a ; индекс "Bad command or file name" jp print_err_message diff --git a/SHELL/build.txt b/SHELL/build.txt index e3f1e9b..3ca9062 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -80 \ No newline at end of file +84 \ No newline at end of file From 33b49c9f4dcb204368a444aee30f24626c80ca01 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 13 Oct 2023 23:24:31 +1000 Subject: [PATCH 043/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOS/DOS.ASM | 2 +- DSS/DOS5.ASM | 2370 ++++++++++++++++++++++---------------------- DSS/DOS_FM.ASM | 5 + DSS/DOS_X.ASM | 19 +- DSS/DSS-MAIN.ASM | 8 +- DSS/EXECUTE.ASM | 79 +- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 5 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 11 files changed, 1289 insertions(+), 1207 deletions(-) diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM index f9cfc19..0abef18 100755 --- a/DOS/DOS.ASM +++ b/DOS/DOS.ASM @@ -3845,7 +3845,7 @@ A227F: ;ld (hl),'\' ; ; ; выход: A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// Func_1E:ex de,hl ; de=куда - ld hl,T1510 ; откуда ; DIRSPEC + ld hl,T1510 ; откуда ; CurrentDirectory ld a,(hl) or a ldi diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index fcd9064..0778594 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -21,26 +21,27 @@ ;------------------------------------------------------------- - +//////////////////////////////////////////////////////////////////////// ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; A - ATTRIB ; B - MODE ; B = 0 GET ATTRIB ; B = 1 SET ATTRIB ; OUTPUT: A - ATTRIB +//////////////////////////////////////////////////////////////////////// ATTRIB: _mSavePath 1 INC B DEC B - JP Z,RATTRIB + JP Z,.RATTRIB DEC B - JP Z,WATTRIB + JP Z,.WATTRIB LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET - -RATTRIB XOR A - CALL OPENATR ;R02 +.RATTRIB: + XOR A + CALL .OPENATR ;R02 RET C LD B,(IY+_sFM.ATTRIBUT) PUSH BC @@ -50,10 +51,10 @@ RATTRIB XOR A LD A,B ;AND A RET - -WATTRIB PUSH AF +.WATTRIB: + PUSH AF XOR A - CALL OPENATR ;R02 + CALL .OPENATR ;R02 POP BC RET C SET 7,(IY+_sFM.ACCESS_MODE) @@ -66,15 +67,33 @@ WATTRIB PUSH AF LD A,B ;AND A RET +;R02 +.OPENATR: + LD (F_FIRST.ACCESS),A ; раб. ячейка (здесь атрибут записи) + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + LD A,FAT_ATTR.NoVolID + CALL SEARCH.ASEARCH + ; JR NC,OPENAT ; на поиск своб. дескриптора + ; ; запись не найдена + ; RET + RET C ; запись не найдена + JP OPEN.FM ; на поиск своб. дескриптора +;R02 - +//////////////////////////////////////////////////////////////////////// ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM +//////////////////////////////////////////////////////////////////////// CREATE: _mSavePath 0 CALL .Prepare RET C CALL SEARCH - CALL NC,DELFILE ;FILE EXIST RECREAT + CALL NC,DELETE ;FILE EXIST RECREAT JR .DO ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM @@ -91,7 +110,7 @@ CREATE: _mSavePath 0 LD BC,11 LDIR EX DE,HL - LD A,(ACCESS) + LD A,(F_FIRST.ACCESS) LD (HL),A INC HL LD BC,#0A00 ;!HARDCODE @@ -120,13 +139,14 @@ CREATE: _mSavePath 0 ; CALL WRT_HND CALL SAVEDIR - LD HL,(PATH0) +.PATH0+1: + LD HL,0 XOR A JP OPEN ;R08 .Prepare: AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (ACCESS),A - LD (PATH0),HL + LD (F_FIRST.ACCESS),A + LD (.PATH0),HL CALL GETWORD RET C LD HL,TMPNAME @@ -134,10 +154,10 @@ CREATE: _mSavePath 0 JP MASK CREAT_N EQU CREATE.NEW - -; INPUT: HL - "filename.ext",#00 without simbols * ? -DELETE: - ;!TEST +//////////////////////////////////////////////////////////////////////// +; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? +//////////////////////////////////////////////////////////////////////// +DEL_FN: ;!TEST _mSavePath 1 CALL GETWORD ; тест на допуст. имя и настр. на диск RET C @@ -159,19 +179,18 @@ DELETE: CALL LOADDIR CALL SEARCH RET C + ;JP DELETE ; пометить запись как "удаленная" -DELFILE: - SET_PAGE_X DIRPAGE - +DELETE: SET_PAGE_X DIRPAGE LD (IX+_sFM.NAME),#E5 ; признак удаления файла LD E,(IX+_sFM.ST_CLUSTER) ; № первого кластера LD D,(IX+_sFM.ST_CLUSTER+1) - + ; OUT (SLOT3),A LD A,E OR D JP Z,SAVEDIR ; сбросить кеш каталога на диск -DEL01 EX DE,HL ; hl=номер кластера +.loop: EX DE,HL ; hl=номер кластера CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера PUSH DE ; номер след. кластера PUSH AF @@ -179,11 +198,11 @@ DEL01 EX DE,HL ; hl= CALL W_T_FAT ; записать в кеш FAT-а номер кластера POP AF POP DE - JP NC,DEL01 + JP NC,.loop CALL WR_FAT JP SAVEDIR ; сбросить кеш каталога на диск -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #10. Переименование файла. ; Глобальные символы * и ? в именах файлов не допускаются. ; @@ -193,7 +212,7 @@ DEL01 EX DE,HL ; hl= ; ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// RENAME: PUSH DE LD DE,MASKARE CALL MASK @@ -210,7 +229,7 @@ RENAME: PUSH DE CALL LOADDIR ; прочитать список каталога ;LD A,#33 LD A,FAT_ATTR.NoSYSnoVolID - CALL ASEARCH ; поиск записи в списке диска + CALL SEARCH.ASEARCH ; поиск записи в списке диска POP HL RET C LD DE,MASKARE @@ -225,7 +244,7 @@ RENAME: PUSH DE RET Z PUSH IX LD A,FAT_ATTR.NoSYSnoVolID - CALL ASEARCH ; поиск записи в списке диска + CALL SEARCH.ASEARCH ; поиск записи в списке диска POP IX LD A,DSS_Error.sys.FILE_EXISTS CCF @@ -241,24 +260,7 @@ RENAME: PUSH DE OUT (SLOT3),A JP SAVEDIR -;R02 -OPENATR: - LD (ACCESS),A ; раб. ячейка (здесь атрибут записи) - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK - RET C - LD A,FAT_ATTR.NoVolID - CALL ASEARCH - JR NC,OPENAT ; на поиск своб. дескриптора - ; запись не найдена - RET -;R02 - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; ; вход: HL - указатель на имя файла @@ -268,22 +270,21 @@ OPENATR: ; A=2 запись ; выход: A - дескриптор файла, если CF=0 ; код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// OPEN_FN: _mSavePath 1 ;R08 -OPEN: LD (ACCESS),A +OPEN: LD (F_FIRST.ACCESS),A CALL GETWORD RET C LD HL,TMPNAME LD DE,MASKARE CALL MASK RET C -OPENEXE: - CALL SEARCH +.FILE: CALL SEARCH RET C -OPENAT: ;R02 - CALL GET_FM +;R02 +.FM: CALL GET_FM RET C LD A,C EX AF,AF' @@ -296,7 +297,7 @@ OPENAT: ;R02 LD HL,HANDBUF LD BC,HANDBUF.SIZE LDIR - LD A,(ACCESS) + LD A,(F_FIRST.ACCESS) LD (IY+_sFM.ACCESS_MODE),A LD A,(TASK) LD (IY+_sFM.TASK_NUM),A @@ -317,10 +318,14 @@ OPENAT: ;R02 AND A RET +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// CLOSE_FN: _mSavePath 1 ;R08 -CLOSE: LD (ACCESS),A +CLOSE: LD (F_FIRST.ACCESS),A CALL SET_FM RET C LD A,(TASK) @@ -329,7 +334,7 @@ CLOSE: LD (ACCESS),A SCF RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) - JR Z,NOTMODF + JR Z,.NOTMODF LD D,(IY+_sFM.DIR_CLUSTER) LD E,(IY+_sFM.DIR_CLUSTER+1) PUSH DE @@ -339,18 +344,20 @@ CLOSE: LD (ACCESS),A LD (IY+_sFM.DIR_CLUSTER),D LD (IY+_sFM.DIR_CLUSTER+1),E CALL LOADDIR - LD A,(ACCESS) + LD A,(F_FIRST.ACCESS) CALL SET_FM LD HL,DIR LD DE,#0020 LD C,(IY+_sFM.HANDLE) LD B,(IY+_sFM.HANDLE+1) - JR CLOSE2 -CLOSE1: ADD HL,DE + JR .CLOSE2 +.CLOSE1: + ADD HL,DE DEC BC -CLOSE2: LD A,B +.CLOSE2: + LD A,B OR C - JR NZ,CLOSE1 + JR NZ,.CLOSE1 LD D,YH LD E,YL EX DE,HL @@ -363,115 +370,20 @@ CLOSE2: LD A,B LDIR OUT (SLOT3),A CALL SAVEDIR -NOTMODF: - LD A,(ACCESS) +.NOTMODF: + LD A,(F_FIRST.ACCESS) CALL RES_FM RET -PATH0: DW #0000 - -ACCESS: DB #00 - -HANDBUF: BLOCK HANDBUF.SIZE,0 - - -WRT_HND: - SET_PAGE_X DIRPAGE - - PUSH AF - LD IX,DIR - EXX - LD DE,0 - EXX -WRT_HN1: - LD A,(IX+00) - OR A - JR Z,WRT_HN2 - CP #E5 - JR Z,WRT_HN2 - LD BC,#0020 - ADD IX,BC - JR NC,WRT_HN1 - POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.ROOT_OVERFLOW - SCF - RET - -WRT_HN2: - LD D,XH - LD E,XL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR - POP AF - OUT (SLOT3),A - LD HL,DIR - LD BC,(DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - RET NC - LD HL,(DIRSIZE) - LD BC,(FatBuffer.B_P_C) - ADD HL,BC - LD (DIRSIZE),HL - AND A - RET - -DOSNAME: - INC B - DEC B - JP Z,GETNAME - DEC B - JP Z,MASK - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET - -; HL - 11 bytes filename "FILENAMEEXT" -; DE - DOS filename "FILENAME.EXT",0 -GETNAME: - LD BC,#08FF -GETN1: LD A,(HL) - CP " " - JR NZ,GETN3 -GETN2: INC HL - DJNZ GETN2 - JR GETN4 -GETN3: LDI - DJNZ GETN1 -GETN4: LD A,(HL) - CP " " - LD A,"." - JR NZ,GETN5 - LD A,#00 -GETN5: LD (DE),A - INC DE - RET Z - LD B,#03 -GETN6: LD A,(HL) - CP " " - RET Z - LDI - XOR A - LD (DE),A - DJNZ GETN6 - RET - -DTABUF: DW #0000 -CURHND: DW #0000 -NO_NEXT: DB #00 -.YES EQU 0 -.NO EQU #FF -FNDMODE: DB #00 - +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// F_FIRST: - LD (ACCESS),A - LD (DTABUF),DE + LD (.ACCESS),A + LD (.DTABUF),DE LD A,B - LD (FNDMODE),A + LD (.FNDMODE),A PUSH HL CALL LOADDIR POP HL @@ -481,64 +393,75 @@ F_FIRST: LD DE,MASKARE CALL MASK RET C - LD A,(ACCESS) - CALL ASEARCH +.ACCESS+1: + LD A,0 + CALL SEARCH.ASEARCH RET C LD HL,MASKARE - LD DE,(DTABUF) +.DTABUF+1: + LD DE,0 LD BC,11 ;!HARDCODE LDIR - LD A,(ACCESS) + LD A,(.ACCESS) LD (DE),A -FIND_S: INC DE +.FIND_S: + INC DE LD BC,#0020 ADD IX,BC - LD (CURHND),IX - LD HL,HANDBUF+12 + LD (F_NEXT.CURHND),IX + LD HL,HANDBUF+12 ;!HARDCODE LD BC,HANDBUF.SIZE-12 ;????? метку вместо числа? LDIR LD A,(HANDBUF+11) LD (DE),A INC DE LD HL,HANDBUF - LD A,(FNDMODE) +.FNDMODE+1: + LD A,0 OR A - JR NZ,FIND_M2 + JR NZ,.FIND_M2 LD BC,11 ;!HARDCODE LDIR - LD A,NO_NEXT.NO - LD (NO_NEXT),A + LD A,F_NEXT.NO_NEXT.NO + LD (F_NEXT.NO_NEXT),A XOR A RET -FIND_M2: +.FIND_M2: CALL GETNAME - LD A,NO_NEXT.NO - LD (NO_NEXT),A + LD A,F_NEXT.NO_NEXT.NO + LD (F_NEXT.NO_NEXT),A XOR A RET -F_NEXT: LD A,(NO_NEXT) +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// +F_NEXT: +.NO_NEXT.YES EQU 0 +.NO_NEXT.NO EQU #FF +.NO_NEXT+1: + LD A,0 OR A LD A,DSS_Error.sys.INVALID_ACCESS SCF RET Z - LD (DTABUF),DE + LD (F_FIRST.DTABUF),DE EX DE,HL LD DE,MASKARE LD BC,11 ;!HARDCODE LDIR - XOR A - LD (NO_NEXT),A + XOR A ; F_NEXT.NO_NEXT.YES + LD (F_NEXT.NO_NEXT),A LD A,(HL) PUSH HL - CALL NSEARCH + CALL .NSEARCH POP DE RET C - JP FIND_S - -NSEARCH: + JP F_FIRST.FIND_S +.NSEARCH: EX AF,AF' SET_PAGE_X DIRPAGE @@ -551,201 +474,17 @@ NSEARCH: EXX LD DE,0 EXX - LD IX,(CURHND) +.CURHND+2: + LD IX,0 LD A,XH OR XL - JR Z,SEARCH3.error - JP SEARCH1 + JP Z,SEARCH.error + JP SEARCH.SEARCH1 -;------------------------------------------------- -; Поиск записи каталога в списке каталога +//////////////////////////////////////////////////////////////////////// ; -; вход: a=атрибут записи -; выход: de'=индекс записи в списке каталога -; CF - каталог не найден -;------------------------------------------------- -DSEARCH: - LD A,FAT_ATTR.DIRECTORY - CALL ASEARCH - RET NC - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET - -SEARCH: LD A,FAT_ATTR.NoDIRnoVolID -ASEARCH: - EX AF,AF' ; 76ADLSHR - - SET_PAGE_X DIRPAGE - - PUSH AF - EX AF,AF' - CPL - LD C,A - LD IX,DIR - EXX - LD DE,0 - EXX -SEARCH1: - LD A,(IX+00) - OR A - JR Z,SEARCH4 - CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,SEARCH3 - LD A,(IX+11) - AND C - JR NZ,SEARCH3 - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 - EX DE,HL -SEARCH2: - LD A,(DE) - CP '?' - JR Z,SEARCH5 - CP (HL) - JR NZ,SEARCH3 -SEARCH5: - INC HL - INC DE - DJNZ SEARCH2 - LD D,XH - LD E,XL - LD HL,HANDBUF - EX DE,HL - LD BC,HANDBUF.SIZE - LDIR - POP AF - OUT (SLOT3),A - AND A - RET -SEARCH3: - EXX - INC DE - EXX - LD DE,#0020 ;!HARDCODE - ADD IX,DE - JR NC,SEARCH1 -.error: POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - SCF - RET -SEARCH4: - POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.FILE_NOT_FOUND - SCF - RET - - -; ;!TEST -; SAVE_CURRENT_PATH: -; SET_PAGE_X ENVPAGE -; PUSH AF -; CALL CURRDSK -; ADD A,"A" -; LD HL,TMP_CURDIR -; LD (HL),A -; INC HL -; LD A,":" -; LD (HL),A -; INC HL -; CALL CURRDIR -; POP AF -; OUT (SLOT3),A -; RET -; BACK_CURRENT_PATH: -; SET_PAGE_X ENVPAGE -; PUSH AF -; LD HL,TMP_CURDIR -; CALL CHDIR -; POP AF -; OUT (SLOT3),A -; RET -; ; -;------------------------------------------------- -; Тест на допустимое имя и настроиться на диск. -; вход: hl=строка имени -;------------------------------------------------- -GETWORD: - ; !TEST - INC HL - LD A,(HL) - DEC HL - CP ':' - JR NZ,.dir_loop - - LD A,(HL) - CP 'a' - JR C,.next - CP '{' - JR NC,.next - SUB #20 -.next: SUB 'A' - INC HL - INC HL - PUSH HL - ;!TEST CHNDISK OPENDSK - ;CALL OPENDSK - CALL CHNDISK - ; - POP HL - RET C - ; -.dir_loop: - LD DE,TMPNAME - LD BC,#0DFF - ; -.loop: LD A,(HL) - INC HL - CP '\' - JR Z,.DIR_NAME - ;CP ':' - ;JR Z,.DRV_NAME - LD (DE),A - INC DE - CP ' '+1 - CCF - RET NC - DJNZ .loop - ; - ; ;!TEST - ; CALL BACK_CURRENT_PATH - ; - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -.DIR_NAME: - XOR A - LD (DE),A - PUSH HL - LD HL,TMPNAME - CALL OPENDIR - POP HL - RET C - JR .dir_loop - -; .DRV_NAME: -; LD A,(TMPNAME) -; CP 'a' -; JR C,.next -; CP '{' -; JR NC,.next -; SUB #20 -; .next: SUB 'A' -; PUSH HL -; ;!TEST CHNDISK OPENDSK -; ;CALL OPENDSK -; CALL CHNDISK -; ; -; POP HL -; RET C -; JR .loop -; Буфер имени 8.3 формата -TMPNAME: DZ ' ' ; 12 пробелов и 0 - +; +//////////////////////////////////////////////////////////////////////// ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: CHNDISK: @@ -755,8 +494,9 @@ CHNDISK: ; ;????? R10 RET C - ;LD HL,DIRSPEC+1 - LD HL,DIRSPEC + ;LD HL,CurrentDirectory+1 + ;LD HL,CurrentDirectory + LD HL,WorkDirectory LD (HL),0 PUSH AF CALL OPENDIR @@ -768,236 +508,16 @@ CHNDISK: ; CALL LOADDIR ; POP AF RET - ; - ;????? R10 -OPENDSK: - ;!TEST DRV.Open обход - LD C,A - LD A,(FatBuffer.DRIVE) - CP C - JR Z,.exit - LD A,C - ; -.force: PUSH AF - LD C,Dss.DRV.Open - RST ToDSS.DRV - POP BC - JP C,.error - LD A,B - LD (FatBuffer.DRIVE),A - CALL RD_BPB - RET C -.exit: LD A,(LDRIVE) - AND A - RET -.error: CP DSS_Error.sys.INVALID_DRIVE - SCF - RET Z - LD A,DSS_Error.sys.NOT_READY - RET -; -OPENDIR: - XOR A - CALL SET_FM - LD A,(HL) - OR A - JR NZ,SUBDIR -REROOT1: - LD DE,0 - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D - CALL LOADDIR - LD HL,DIRSPEC - LD (HL),'\' - INC HL - LD (HL),#00 - AND A - RET - -SUBDIR: CP "." - JR NZ,SUBDIR2 - LD A,(IY+_sFM.ST_CLUSTER) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY - OR (IY+_sFM.ST_CLUSTER+1) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY - JR NZ,SUDI1 ;R05 - INC HL ;R05 - LD A,(HL) ;R05 - OR A ;R05 - DEC HL ;R05 - JR Z,REROOT1 ;R05 -SUDI1: EXX - LD HL,MASKARE - LD DE,MASKARE+1 - LD BC,10 ;!HARDCODE - LD (HL),' ' - LDIR - EXX - LD DE,MASKARE -SUBDIR0: - LDI - LD A,(HL) - OR A - JR NZ,SUBDIR0 - JR SUBDIR3 - -SUBDIR2: - LD DE,MASKARE - CALL MASK - RET C -SUBDIR3: - CALL FINDDIR - RET C - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D - LD DE,#4000 - LD (IY+_sFM.F_SIZE),E - LD (IY+_sFM.F_SIZE+1),D - CALL LOADDIR - AND A - RET - - -; FIND "MASKAREA" IN DIRECTORY -FINDDIR: - SET_PAGE_X DIRPAGE - - PUSH AF - LD IX,DIR -.F_01: LD A,(IX+00) - OR A - JR Z,.error - CP #E5 - JR Z,.F_03 - LD A,(IX+11) - AND #10 - JR Z,.F_03 - LD HL,MASKARE - LD D,XH - LD E,XL - EX DE,HL - LD B,11 -.loop: LD A,(DE) - CP "?" - JR Z,.F_05 - CP (HL) - JR NZ,.F_03 -.F_05: INC HL - INC DE - DJNZ .loop - LD A,(IX+0) - CP "." - JP NZ,ADDSPEC - LD A,(IX+1) - CP "." - JP NZ,IT_DIR - LD HL,DIRSPEC - LD D,H - LD E,L - INC HL - LD BC,DIRSPEC.DEPTH - XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 - DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога - DEC HL - LD BC,DIRSPEC.DEPTH - LD A,'\' - CPDR - INC HL - AND A - EX DE,HL - SBC HL,DE - EX DE,HL -; JR NZ,ROTZ - JR NZ,MM3 - JP MM2_5 -; INC HL -; ROTZ LD (HL),0 -; JP IT_DIR -; IT_DIR LD E,(IX+_sFM.ST_CLUSTER) -; LD D,(IX+_sFM.ST_CLUSTER+1) -; POP AF -; OUT (SLOT3),A -; AND A -; RET -.F_03: LD BC,#0020 - ADD IX,BC - JR NC,.F_01 -.error: POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.PATH_NOT_FOUND - SCF - RET - -ADDSPEC LD E,XL - LD D,XH - LD HL,DIRSPEC+1 - LD BC,DIRSPEC.DEPTH-1 - XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 - DEC HL - DEC HL - LD A,'\' ; #5C - CP (HL) - INC HL - JR Z,ADDSPE0 - LD (HL),A - INC HL -ADDSPE0: - ;R11 - LD A,B - AND A - JR NZ,MM1 - LD A,C - CP 8 - JR C,FINDDIR.error - ;R11 - LD BC,#0820 -MM1 LD A,(DE) - INC DE - CP C - JR Z,MM2 - LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём - INC HL -MM2 DJNZ MM1 - LD A,(DE) - INC DE - CP C - JR Z,MM3 - LD (HL),"." - INC HL - LD (HL),A - INC HL - LD A,(DE) - INC DE - CP C - JR Z,MM3 - LD (HL),A - INC HL - LD A,(DE) - CP C - JR Z,MM3 - LD (HL),A - -MM2_5: INC HL -MM3: LD (HL),0 -; JP IT_DIR -IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) - LD D,(IX+_sFM.ST_CLUSTER+1) - POP AF - OUT (SLOT3),A - AND A - RET - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1E. Информация о текущем каталоге. ; ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 ; !FIXIT может выйти за пределы буфера? -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// CURRDIR: EX DE,HL - LD HL,DIRSPEC + LD HL,CurrentDirectory XOR A .loop: ;LD A,(HL) ;OR A @@ -1006,328 +526,7 @@ CURRDIR: EX DE,HL JR NZ,.loop RET - -;------------------------------------------------- -; Прочитать список каталога -;------------------------------------------------- -LOADDIR: - XOR A - LD H,A - LD L,A - LD IX,0 - LD B,A ; от начала файла - CALL MOVE_FP - - SET_PAGE_X DIRPAGE - - PUSH AF - ;!TEST no ldir - ; очистить кеш каталога - ;LD HL,#C000 - ;LD DE,#C001 - ;LD BC,#3FFF - ;LD (HL),L - ;LDIR - ; - LD A,(FatBuffer.DRIVE) ; номер диска - LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор - LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера - LD E,(IY+_sFM.ST_CLUSTER+1) - LD A,D - OR E - JP Z,LROTDIR ; root ?? - LD HL,DIR ; куда - LD DE,#4000 ; сколько - XOR A ; дескриптор - CALL READ ; чтение из файла - LD (DIRSIZE),DE ; число прочит. байтов - POP AF - OUT (SLOT3),A - AND A - RET - -LROTDIR 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 ; число секторов -RTD1 LD A,(FatBuffer.DRIVE) ; номер диска - LD DE,DIR ; буфер - LD C,Dss.DRV.Read ; чтение секторов - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - AND A - RET - -;------------------------------------------------- -; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -;------------------------------------------------- -SAVEDIR XOR A - LD HL,0 - LD IX,0 - LD B,0 - CALL MOVE_FP - - SET_PAGE_X DIRPAGE - - PUSH AF - LD A,(FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - LD D,(IY+_sFM.ST_CLUSTER) - LD E,(IY+_sFM.ST_CLUSTER+1) - LD A,D - OR E - JP Z,SROTDIR - LD HL,DIR - LD DE,(DIRSIZE) - XOR A - CALL WRITE - POP AF - OUT (SLOT3),A - AND A - RET - -SROTDIR LD HL,(FatBuffer.DIR_FRH) - LD IX,(FatBuffer.DIR_FRL) - LD A,(FatBuffer.DIR_S_S) - LD B,32 - SUB B - JR NC,RTD1S - ADD A,B - LD B,A -RTD1S LD A,(FatBuffer.DRIVE) - LD DE,DIR - LD C,Dss.DRV.Write - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - AND A - RET - -DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory - -;!TEST - ;BANK: - ; LD C,A - ; LD B,0 - ; LD HL,BANKTBL - ; ADD HL,BC - ; IN A,(SLOT3) - ; LD C,SLOT3 - ; OUTI - ; RET -; - - -; Массив лог. номеров банок расширения ДОС -BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE - - - -;!TODO -GHANDLE: -; PUSH DE -; PUSH HL -; PUSH IX -; CALL TESTDSK -; JP C,G_HAND1 -; CALL LOADDIR -; POP DE -; LD HL,DIR -; LD BC,#0020 -;G_HAND2: -; LD A,D -; OR E -; JP Z,G_HAND3 -; ADD HL,BC -; DEC DE -; JP G_HAND2 -;G_HAND3: -; EXX -; POP DE -; EXX -;G_HAND4: -; EX DE,HL -; LD A,DIRPAGE -; CALL BANK -; EX DE,HL -; LD DE,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; OUT (SLOT3),A -; LD HL,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; POP BC -; DEC BC -; LD A,B -; OR C -; RET Z -; PUSH BC -; JP G_HAND4 -;G_HAND1 POP IX -; POP HL -; POP DE -; RET -;HANDTA BLOCK 32,0 - - -MASKARE: BLOCK 8,0 ; имя файла - BLOCK 3,0 ; расш. - BLOCK 21,0 ; 11+21=32 -;------------------------------------------------- -; Преобразовать имя 8.3 -> 11 формат -; вход: hl = 8.3 имя -; de = буфер имени 11 симв. формата -; при ошибке CF - недоп. имя -; -; HL - MASK "file*.t??" -; DE - 11 bytes filename -; RET: C=2 FILE WITHOUT EXTENTION -; C=1 FILE WITH EXTENTION -;------------------------------------------------- -MASK: PUSH HL - PUSH DE - LD H,D - LD L,E - INC DE - LD (HL),' ' - LD BC,10 ;!HARDCODE = size (FileName + Extension - 1) - LDIR - POP DE - POP HL - LD A,(HL) - CP '.' ;R07 - SCF ;R07 - JR Z,.MASKB ;R07 - CP ' '+1 -.MASKB: LD A,DSS_Error.sys.INVALID_NAME - RET C - LD BC,#0902 ; B - счетчик -MASK1: LD A,(HL) - CP ' '+1 - CCF - RET NC - CP '"' - JR Z,MASK_ERR - CP '*' - JR Z,MASK3 - CP '+' - JR Z,MASK_ERR - CP ',' - JR Z,MASK_ERR - CP '.' - JR Z,MASK5 - CP '/' - JR Z,MASK_ERR - CP ':' - JR Z,MASK_ERR - CP ';' - JR Z,MASK_ERR - CP '<' - JR Z,MASK_ERR - CP '=' - JR Z,MASK_ERR - CP '>' - JR Z,MASK_ERR - CP '[' - JR Z,MASK_ERR - CP '\' - JR Z,MASK_ERR - CP ']' - JR Z,MASK_ERR - CP '|' - JR Z,MASK_ERR -; CP 'a' ;????? -; JR C,MASK2 -; CP '{' -; JR NC,MASK2 -; SUB #20 - CALL UPPER ; a..z -> A..Z -MASK2 LD (DE),A - INC HL - INC DE - DJNZ MASK1 -MASK_ERR: - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -MASK3: LD A,'?' - INC HL - DJNZ MASK6 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -MASK6: LD (DE),A - INC DE - DJNZ MASK6 - LD B,1 - JR MASK1 - -MASK5: LD A,' ' - INC HL - DJNZ MASK4 - LD B,4 - DEC C - JP NZ,MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -MASK4: LD (DE),A - INC DE - DJNZ MASK4 - LD B,4 - DEC C - JP NZ,MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -; a..z -> A..Z -UPPER: CP 'a' - RET C - CP '{' - JR NC,MDUPPER - SUB #20 -NOUPPER RET - -MDUPPER CP 'а' ; русская буква а, код #A0 - JR C,NOUPPER - CP 'п' ; русская буква п, код #B0 - JR NC,BGUPPER - SUB #20 - RET - -BGUPPER CP 'р' ; русская буква р, код #E0 - JR C,NOUPPER - CP 'Ё' ; русская буква Ё, код #F0 - JR NC,HGUPPER - SUB #50 - RET - -HGUPPER CP 'ё' ; русская буква ё, код #F1 - RET NZ - DEC A - RET - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #21. Текущая дата и время. ; ; вход: нет @@ -1338,10 +537,11 @@ HGUPPER CP ' ; L - минуты ; B - секунды ; C - день недели -////////////////////////////////////////////////////////////////////// -SYSTIME LD C,BIOS.CMOS_TEST +//////////////////////////////////////////////////////////////////////// +SYSTIME: + LD C,BIOS.CMOS_TEST RST ToBIOS - JP C,NOCMOS + JP C,.NOCMOS LD D,7 ;DAY CALL RCMOS PUSH AF @@ -1378,22 +578,24 @@ SYSTIME LD C,BIOS.CMOS_TEST POP AF CP 80 ;R01, TEST DECIMAL FIX PUSH AF - JR C,XXIAGE + JR C,.XXIAGE LD A,#19 CP XH - JR Z,GOODAGE - JR BADAGE - -XXIAGE LD A,#20 + JR Z,.GOODAGE + JR .BADAGE +.XXIAGE: + LD A,#20 CP XH - JR Z,GOODAGE -BADAGE PUSH AF + JR Z,.GOODAGE +.BADAGE: + PUSH AF LD D,#32 ;CENTURY LD C,BIOS.CMOS_WR RST ToBIOS POP AF LD XH,A -GOODAGE POP AF +.GOODAGE: + POP AF LD XL,A LD A,XH CALL BCD2HEX @@ -1419,49 +621,19 @@ GOODAGE POP AF POP DE AND A RET - -; Чтение регистров CMOS -; вход: d=номер регистра - -RCMOS LD C,BIOS.CMOS_RD - RST ToBIOS -; INPUT : A - BCD -; OUTPUT: A - HEX -BCD2HEX - LD E,A - RRCA - RRCA - RRCA - RRCA - AND #0F - LD D,A - ADD A,A - ADD A,A - ADD A,D - ADD A,A - LD D,A - LD A,E - AND #0F - ADD A,D - RET - -NOCMOS LD DE,(NC_DAY) ;DAY/MONTH - LD HL,(NC_HOUR) ;HOUR/MINUTE - LD BC,(NC_SEC) ;SECOND/WEEKDAY - LD IX,(NC_YEAR) ;YEAR +.NOCMOS: +.NC_DAY+1: + LD DE,DAY*256+MONTH ;DAY/MONTH +.NC_HOUR+1: + LD HL,0 ;HOUR/MINUTE +.NC_SEC+1: + LD BC,1 ;SECOND/WEEKDAY +.NC_YEAR+2: + LD IX,YEAR ;YEAR AND A RET -; !FIXIT новый биос выставляет время, если с ним что-то не так. -NOCMOS2 LD C,0 - LD (NC_DAY),DE ;DAY/MONTH - LD (NC_HOUR),HL ;HOUR/MINUTE - LD (NC_SEC),BC ;SECOND/WEEKDAY - LD (NC_YEAR),IX ;YEAR - AND A - RET - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #22. Установить текущую дату и время. ; ; вход: D - день @@ -1471,14 +643,15 @@ NOCMOS2 LD C,0 ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -SETTIME PUSH IX +//////////////////////////////////////////////////////////////////////// +SETTIME: + PUSH IX PUSH BC PUSH HL PUSH DE LD C,BIOS.CMOS_TEST RST ToBIOS - JP C,NOCMOS2 + JP C,.NOCMOS2 POP AF PUSH AF LD D,7 ;DAY @@ -1504,13 +677,13 @@ SETTIME PUSH IX LD D,6 ;WEEK DAY LD C,BIOS.CMOS_WR RST ToBIOS - + ; POP HL XOR A LD DE,100 -YR INC A +.YR: INC A SBC HL,DE - JR NC,YR + JR NC,.YR ADD HL,DE DEC A PUSH HL @@ -1522,42 +695,23 @@ YR INC A CALL WCMOS AND A RET - -;!FIXIT переделать по доке на Даллас и заись в ячейки часов -; Запись регистров CMOS -; вход: d=номер регистра -WCMOS CALL HEX2BCD - LD C,BIOS.CMOS_WR - RST ToBIOS - RET - -; INPUT : A - HEX -; OUTPUT: A - BCD -HEX2BCD - LD BC,#0AFF -H2B INC C - SUB B - JR NC,H2B - ADD A,B - LD B,A - LD A,C - RLCA - RLCA - RLCA - RLCA - AND #F0 - OR B +; !FIXIT новый биос выставляет время, если с ним что-то не так. +.NOCMOS2: + LD C,0 + LD (SYSTIME.NC_DAY),DE ;DAY/MONTH + LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE + LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY + LD (SYSTIME.NC_YEAR),IX ;YEAR + AND A RET ; Дата по-умолчанию -NC_DAY DW DAY*256+MONTH ;DAY/MONTH -NC_HOUR DW #0000 ;HOUR/MINUTE -NC_SEC DW #0001 ;SECOND/WEEKDAY -NC_YEAR DW YEAR ;YEAR +; NC_DAY DW DAY*256+MONTH ;DAY/MONTH +; NC_HOUR DW #0000 ;HOUR/MINUTE +; NC_SEC DW #0001 ;SECOND/WEEKDAY +; NC_YEAR DW YEAR ;YEAR - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #17. Информация о дате и времени файла. ; ; вход: A - дескриптор файла @@ -1568,8 +722,8 @@ NC_YEAR DW YEAR ;YEAR ; L - минуты ; B - секунды ; A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -GET_D_T +//////////////////////////////////////////////////////////////////////// +GET_D_T: CALL SET_FM RET C ; время/дату из структуры дескр. @@ -1581,7 +735,7 @@ GET_D_T AND A RET -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #18. Изменение даты и времени файла. ; ; вход: A - дескриптор файла @@ -1592,8 +746,9 @@ GET_D_T ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -PUT_D_T PUSH AF +//////////////////////////////////////////////////////////////////////// +PUT_D_T: + PUSH AF CALL MK_TIME ; закодировать время/дату POP AF ; дескриптор PUSH DE @@ -1610,106 +765,7 @@ PUT_D_T PUSH AF AND A RET -;------------------------------------------------- -; Закодировать время/дату -; вход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; выход: de - время -; bc - месяц/день -; ix - год -; -;INPUT: D - DAY; E - MONTH -; H - HOUR; L - MINUTE -; B - SECOND (0...59) -; IX- YEAR (0...65535) -;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 -; BC - yyyyyyymmmmddddd y - year, m - month, d - day -; (1980-2108) -;------------------------------------------------- -MK_TIME LD A,L - RLCA - RLCA - SLA A - RL H - SLA A - RL H - SLA A - RL H - SRL B - OR B - LD L,A - - LD BC,#F844 ;(-1980) - ADD IX,BC - LD A,E - RLCA - RLCA - RLCA - RLCA - AND #F0 - LD B,XL - SLA A - RL B - OR D - LD C,A - EX DE,HL - AND A - RET - -;------------------------------------------------- -; Раскодировать время/дату -; вход: de - время -; bc - месяц/день -; ix - год -; выход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; -;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 -; BC - yyyyyyymmmmddddd y - year, m - month, d - day -; (1980-2108) -;OUTPUT: D - DAY; E - MONTH -; H - HOUR; L - MINUTE -; B - SECOND (0...59) -; IX- YEAR (0...65535) -;------------------------------------------------- -RMKTIME EX DE,HL - LD A,C - AND #1F - LD D,A - SRL B - RR C - LD A,C - RRCA - RRCA - RRCA - RRCA - AND #0F - LD E,A - LD C,B - LD B,0 - LD IX,1980 - ADD IX,BC - LD A,L - AND #1F - ADD A,A - LD B,A - SRL H - RR L - SRL H - RR L - SRL H - RR L - SRL L - SRL L - AND A - RET - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1D. Смена текущего каталога. ; Меняет текущий каталог и текущий диск, если он указан в файловой ; спецификации. Если путь начинается с "\" - это означает путь от @@ -1719,10 +775,16 @@ RMKTIME EX DE,HL ; выход: нет ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 -////////////////////////////////////////////////////////////////////// -CHDIR: +//////////////////////////////////////////////////////////////////////// +CHDIR_FN: _mSavePath 0 -.tmp: CALL GETWORD ; тест на допуст. имя и настр. на диск + ; EX DE,HL + ; LD HL,OPENDIR.dir + ; LD (HL),CurrentDirectory + ; CALL CHDIR + ; RET +; +CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME LD A,(HL) @@ -1730,16 +792,15 @@ CHDIR: CALL NZ,OPENDIR RET -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -////////////////////////////////////////////////////////////////////// -MKDIR: - _mSavePath 1 +//////////////////////////////////////////////////////////////////////// +MKDIR: _mSavePath 1 CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME ; 8.3 имя @@ -1816,9 +877,9 @@ MKDIR: INC HL LD (HL),"." LD BC,9*256 + ' ' ; b=счетчик, c=пробел -MKD03 INC HL +.MKD03: INC HL LD (HL),C - DJNZ MKD03 + DJNZ .MKD03 INC HL @@ -1836,13 +897,13 @@ MKD03 INC HL LD A,(DIR) CP "." LD DE,DIR+11 ; атрибуты записи - JP Z,MKD04 + JP Z,.MKD04 LD IX,HANDBUF XOR A LD (IX+_sFM.ST_CLUSTER),A LD (IX+_sFM.ST_CLUSTER+1),A LD DE,HANDBUF+11 ; ячейка атрибутов файла -MKD04 EX DE,HL +.MKD04: EX DE,HL LD BC,HANDBUF.SIZE-11 LDIR POP AF @@ -1859,7 +920,7 @@ MKD04 EX DE,HL POP HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер -MKD12 PUSH AF +.MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора IN A,(SLOT3) @@ -1886,15 +947,15 @@ MKD12 PUSH AF INC IX LD A,XH OR XL - JR NZ,MKD11 + JR NZ,.MKD11 INC HL -MKD11 POP AF +.MKD11 POP AF DEC A - JR NZ,MKD12 + JR NZ,.MKD12 AND A RET -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. ; @@ -1902,9 +963,8 @@ MKD11 POP AF ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -////////////////////////////////////////////////////////////////////// -RMDIR: - _mSavePath 1 +//////////////////////////////////////////////////////////////////////// +RMDIR: _mSavePath 1 CALL GETWORD RET C LD HL,TMPNAME @@ -1923,10 +983,10 @@ RMDIR: RET C LD HL,(HANDBUF+_sFM.ST_CLUSTER) PUSH IX -RMD17 PUSH HL +.RMD17: PUSH HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) -RMD12 PUSH AF +.RMD12: PUSH AF PUSH HL PUSH IX IN A,(SLOT3) @@ -1944,48 +1004,46 @@ RMD12 PUSH AF LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD HL,CORE_BUFFERS.SECBUF -RMD10 LD A,(HL) +.RMD10: LD A,(HL) OR A - JP Z,RMD15 ;DIR EMPTY + JP Z,.RMD15 ;DIR EMPTY CP "." - JR Z,RMD14 + JR Z,.RMD14 CP #E5 ;!HARDCODE байт удаления файла - JR Z,RMD14 + JR Z,.RMD14 LD DE,11 ;!HARDCODE смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE ;BIT 3,A AND %0000'1000 - JP Z,RMD16 ;DIR NOT EMPTY -RMD14 LD DE,#0020 + JP Z,.error ;DIR NOT EMPTY +.RMD14: LD DE,#0020 ADD HL,DE - DJNZ RMD10 + DJNZ .RMD10 POP IX POP HL INC IX LD A,XH OR XL - JR NZ,RMD11 + JR NZ,.RMD11 INC HL -RMD11 POP AF +.RMD11: POP AF DEC A - JR NZ,RMD12 + JR NZ,.RMD12 POP HL ; номер кластера CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера - JR NC,RMD17 ; не конец цепочки -RMD18 POP IX - JP DELFILE ; пометить запись как "удаленная" - -RMD15 POP IX + JR NC,.RMD17 ; не конец цепочки +.RMD18: POP IX + JP DELETE ; пометить запись как "удаленная" +.RMD15: POP IX POP HL POP AF POP HL - JR RMD18 - -RMD16 POP IX + JR .RMD18 +.error: POP IX POP HL POP AF POP HL @@ -1993,7 +1051,1003 @@ RMD16 POP IX LD A,DSS_Error.sys.DIR_NOT_EMPTY SCF RET +//////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// + +;----------------------------------------------------------------------; +; Чтение регистров CMOS +; вход: d=номер регистра +RCMOS: LD C,BIOS.CMOS_RD + RST ToBIOS + ;JP BCD2HEX +; INPUT : A - BCD +; OUTPUT: A - HEX +BCD2HEX: + LD E,A + RRCA + RRCA + RRCA + RRCA + AND #0F + LD D,A + ADD A,A + ADD A,A + ADD A,D + ADD A,A + LD D,A + LD A,E + AND #0F + ADD A,D + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +;!FIXIT переделать по доке на Даллас и заись в ячейки часов +; Запись регистров CMOS +; вход: d=номер регистра +WCMOS: CALL HEX2BCD + LD C,BIOS.CMOS_WR + JP ToBIOS + +; INPUT : A - HEX +; OUTPUT: A - BCD +HEX2BCD: + LD BC,#0AFF +.loop: INC C + SUB B + JR NC,.loop + ADD A,B + LD B,A + LD A,C + RLCA + RLCA + RLCA + RLCA + AND #F0 + OR B + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Закодировать время/дату +; вход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; выход: de - время +; bc - месяц/день +; ix - год +; +;INPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) + +MK_TIME: + LD A,L + RLCA + RLCA + SLA A + RL H + SLA A + RL H + SLA A + RL H + SRL B + OR B + LD L,A + + LD BC,#F844 ;(-1980) + ADD IX,BC + LD A,E + RLCA + RLCA + RLCA + RLCA + AND #F0 + LD B,XL + SLA A + RL B + OR D + LD C,A + EX DE,HL + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Раскодировать время/дату +; вход: de - время +; bc - месяц/день +; ix - год +; выход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; +;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) +;OUTPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +RMKTIME: + EX DE,HL + LD A,C + AND #1F + LD D,A + SRL B + RR C + LD A,C + RRCA + RRCA + RRCA + RRCA + AND #0F + LD E,A + LD C,B + LD B,0 + LD IX,1980 + ADD IX,BC + LD A,L + AND #1F + ADD A,A + LD B,A + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL L + SRL L + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; скопировать запись в список диска (каталога) +WRT_HND: + SET_PAGE_X DIRPAGE + + PUSH AF + LD IX,DIR + EXX + LD DE,0 + EXX + ; +.loop: LD A,(IX+00) + OR A + JR Z,.WRT_HN2 + CP #E5 + JR Z,.WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,.loop + ; + POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF + RET +.WRT_HN2: + LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR + POP AF + OUT (SLOT3),A + LD HL,DIR + LD BC,(SAVEDIR.DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + RET NC + LD HL,(SAVEDIR.DIRSIZE) + LD BC,(FatBuffer.B_P_C) + ADD HL,BC + LD (SAVEDIR.DIRSIZE),HL + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +DOSNAME: + INC B + DEC B + JP Z,GETNAME + DEC B + JP Z,MASK + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; HL - 11 bytes filename "FILENAMEEXT" +; DE - DOS filename "FILENAME.EXT",0 +GETNAME: + LD BC,#08FF +.GETN1: LD A,(HL) + CP " " + JR NZ,.GETN3 +.GETN2: INC HL + DJNZ .GETN2 + JR .GETN4 +.GETN3: LDI + DJNZ .GETN1 +.GETN4: LD A,(HL) + CP " " + LD A,"." + JR NZ,.GETN5 + LD A,#00 +.GETN5: LD (DE),A + INC DE + RET Z + LD B,#03 +.GETN6: LD A,(HL) + CP " " + RET Z + LDI + XOR A + LD (DE),A + DJNZ .GETN6 + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Поиск записи каталога в списке каталога +; +; вход: a=атрибут записи +; выход: de'=индекс записи в списке каталога +; CF - каталог не найден +DSEARCH: + LD A,FAT_ATTR.DIRECTORY + CALL SEARCH.ASEARCH + RET NC + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +SEARCH: LD A,FAT_ATTR.NoDIRnoVolID +.ASEARCH: + EX AF,AF' ; 76ADLSHR + + SET_PAGE_X DIRPAGE + + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,DIR + EXX + LD DE,0 + EXX +.SEARCH1: + LD A,(IX+00) + OR A + JR Z,.SEARCH4 + CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены + JR Z,.SEARCH3 + LD A,(IX+11) + AND C + JR NZ,.SEARCH3 + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +.SEARCH2: + LD A,(DE) + CP '?' + JR Z,.SEARCH5 + CP (HL) + JR NZ,.SEARCH3 +.SEARCH5: + INC HL + INC DE + DJNZ .SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,HANDBUF.SIZE + LDIR + POP AF + OUT (SLOT3),A + AND A + RET +.SEARCH3: + EXX + INC DE + EXX + LD DE,#0020 ;!HARDCODE + ADD IX,DE + JR NC,SEARCH.SEARCH1 +.error: POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET +.SEARCH4: + POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.FILE_NOT_FOUND + SCF + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Тест на допустимое имя и настроиться на диск. +; вход: hl=строка имени +GETWORD: + ; !TEST + INC HL + LD A,(HL) + DEC HL + CP ':' + JR NZ,.dir_loop + + LD A,(HL) + CP 'a' + JR C,.next + CP '{' + JR NC,.next + SUB #20 +.next: SUB 'A' + INC HL + INC HL + PUSH HL + ;!TEST CHNDISK OPENDSK + ;CALL OPENDSK + CALL CHNDISK + ; + POP HL + RET C + ; +.dir_loop: + LD DE,TMPNAME + LD BC,#0DFF + ; +.loop: LD A,(HL) + INC HL + CP '\' + JR Z,.DIR_NAME + ;CP ':' + ;JR Z,.DRV_NAME + LD (DE),A + INC DE + CP ' '+1 + CCF + RET NC + DJNZ .loop + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.DIR_NAME: + XOR A + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + RET C + JR .dir_loop +; .DRV_NAME: +; LD A,(TMPNAME) +; CP 'a' +; JR C,.next +; CP '{' +; JR NC,.next +; SUB #20 +; .next: SUB 'A' +; PUSH HL +; ;!TEST CHNDISK OPENDSK +; ;CALL OPENDSK +; CALL CHNDISK +; ; +; POP HL +; RET C +; JR .loop +; + +; Буфер имени 8.3 формата +TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; + ;????? R10 +OPENDSK: + ;!TEST DRV.Open обход + LD C,A + LD A,(FatBuffer.DRIVE) + CP C + JR Z,.exit + LD A,C + ; +.force: PUSH AF + LD C,Dss.DRV.Open + RST ToDSS.DRV + POP BC + JP C,.error + LD A,B + LD (FatBuffer.DRIVE),A + CALL RD_BPB + RET C +.exit: LD A,(LDRIVE) + AND A + RET +.error: CP DSS_Error.sys.INVALID_DRIVE + SCF + RET Z + LD A,DSS_Error.sys.NOT_READY + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +OPENDIR: + XOR A + CALL SET_FM + LD A,(HL) + OR A + JR NZ,.SUBDIR +.REROOT1: + LD DE,0 + LD (IY+_sFM.ST_CLUSTER),E + LD (IY+_sFM.ST_CLUSTER+1),D + CALL LOADDIR + ;LD HL,CurrentDirectory +.dir+1: LD HL,WorkDirectory + LD (HL),'\' + INC HL + LD (HL),#00 + AND A + RET +.SUBDIR: + CP "." + JR NZ,.SUBDIR2 + LD A,(IY+_sFM.ST_CLUSTER) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY + OR (IY+_sFM.ST_CLUSTER+1) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY + JR NZ,.SUDI1 ;R05 + INC HL ;R05 + LD A,(HL) ;R05 + OR A ;R05 + DEC HL ;R05 + JR Z,.REROOT1 ;R05 +.SUDI1: EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 ;!HARDCODE + LD (HL),' ' + LDIR + EXX + LD DE,MASKARE +.SUBDIR0: + LDI + LD A,(HL) + OR A + JR NZ,.SUBDIR0 + JR .SUBDIR3 +.SUBDIR2: + LD DE,MASKARE + CALL MASK + RET C +.SUBDIR3: + CALL FINDDIR + RET C + LD (IY+_sFM.ST_CLUSTER),E + LD (IY+_sFM.ST_CLUSTER+1),D + LD DE,#4000 + LD (IY+_sFM.F_SIZE),E + LD (IY+_sFM.F_SIZE+1),D + CALL LOADDIR + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; FIND "MASKAREA" IN DIRECTORY +FINDDIR: + SET_PAGE_X DIRPAGE + ; + PUSH AF + LD IX,DIR +.F_01: LD A,(IX+00) + OR A + JR Z,.error + CP #E5 + JR Z,.F_03 + LD A,(IX+11) + AND #10 + JR Z,.F_03 + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 +.loop: LD A,(DE) + CP "?" + JR Z,.F_05 + CP (HL) + JR NZ,.F_03 +.F_05: INC HL + INC DE + DJNZ .loop + LD A,(IX+0) + CP "." + JP NZ,.ADDSPEC + LD A,(IX+1) + CP "." + JP NZ,.IT_DIR + LD HL,CurrentDirectory + LD D,H + LD E,L + INC HL + LD BC,CurrentDirectory.DEPTH + XOR A + CPIR ;!FIXIT нет проверки на завершение по BC=0 + DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога + DEC HL + LD BC,CurrentDirectory.DEPTH + LD A,'\' + CPDR + INC HL + ;AND A + ; CF = 0 + EX DE,HL + SBC HL,DE + EX DE,HL + JR NZ,.MM3 + JP .MM2_5 +.F_03: LD BC,#0020 + ADD IX,BC + JR NC,.F_01 +.error: POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.PATH_NOT_FOUND + SCF + RET +.ADDSPEC: + LD E,XL + LD D,XH + LD HL,CurrentDirectory+1 + LD BC,CurrentDirectory.DEPTH-1 + XOR A + CPIR ;!FIXIT нет проверки на завершение по BC=0 + DEC HL + DEC HL + LD A,'\' ; #5C + CP (HL) + INC HL + JR Z,.ADDSPE0 + LD (HL),A + INC HL +.ADDSPE0: + ;R11 + LD A,B + AND A + JR NZ,.MM1 + LD A,C + CP 8 + JR C,FINDDIR.error + ;R11 + LD BC,#0820 +.MM1: LD A,(DE) + INC DE + CP C + JR Z,.MM2 + LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём + INC HL +.MM2 DJNZ .MM1 + LD A,(DE) + INC DE + CP C + JR Z,.MM3 + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD A,(DE) + INC DE + CP C + JR Z,.MM3 + LD (HL),A + INC HL + LD A,(DE) + CP C + JR Z,.MM3 + LD (HL),A +.MM2_5: INC HL +.MM3: LD (HL),0 +; JP IT_DIR +.IT_DIR: + LD E,(IX+_sFM.ST_CLUSTER) + LD D,(IX+_sFM.ST_CLUSTER+1) + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Преобразовать имя 8.3 -> 11 формат +; вход: hl = 8.3 имя +; de = буфер имени 11 симв. формата +; при ошибке CF - недоп. имя +; +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION +MASK: PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),' ' + LD BC,10 ;!HARDCODE = size (FileName + Extension - 1) + LDIR + POP DE + POP HL + LD A,(HL) + CP '.' ;R07 + SCF ;R07 + JR Z,.MASKB ;R07 + CP ' '+1 +.MASKB: LD A,DSS_Error.sys.INVALID_NAME + RET C + LD BC,#0902 ; B - счетчик +.MASK1: LD A,(HL) + CP ' '+1 + CCF + RET NC + CP '"' + JR Z,.MASK_ERR + CP '*' + JR Z,.MASK3 + CP '+' + JR Z,.MASK_ERR + CP ',' + JR Z,.MASK_ERR + CP '.' + JR Z,.MASK5 + CP '/' + JR Z,.MASK_ERR + CP ':' + JR Z,.MASK_ERR + CP ';' + JR Z,.MASK_ERR + CP '<' + JR Z,.MASK_ERR + CP '=' + JR Z,.MASK_ERR + CP '>' + JR Z,.MASK_ERR + CP '[' + JR Z,.MASK_ERR + CP '\' + JR Z,.MASK_ERR + CP ']' + JR Z,.MASK_ERR + CP '|' + JR Z,.MASK_ERR +; CP 'a' ;????? +; JR C,.MASK2 +; CP 'z' + 1 +; JR NC,.MASK2 +; SUB #20 + CALL UPPER ; a..z -> A..Z +.MASK2: LD (DE),A + INC HL + INC DE + DJNZ .MASK1 +.MASK_ERR: + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK3: LD A,'?' + INC HL + DJNZ .MASK6 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK6: LD (DE),A + INC DE + DJNZ .MASK6 + LD B,1 + JR .MASK1 +.MASK5: LD A,' ' + INC HL + DJNZ .MASK4 + LD B,4 + DEC C + JP NZ,.MASK1 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK4: LD (DE),A + INC DE + DJNZ .MASK4 + LD B,4 + DEC C + JP NZ,.MASK1 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; a..z -> A..Z +UPPER: CP 'a' + RET C + CP 'z' + 1 + JR NC,.MDUPPER + SUB #20 +.NOUPPER: + RET +.MDUPPER: + CP 'а' ; русская буква а, код #A0 + JR C,.NOUPPER + CP 'п' ; русская буква п, код #B0 + JR NC,.BGUPPER + SUB #20 + RET +.BGUPPER: + CP 'р' ; русская буква р, код #E0 + JR C,.NOUPPER + CP 'Ё' ; русская буква Ё, код #F0 + JR NC,.HGUPPER + SUB #50 + RET +.HGUPPER: CP 'ё' ; русская буква ё, код #F1 + RET NZ + DEC A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Прочитать список каталога +LOADDIR: + XOR A + LD H,A + LD L,A + LD IX,0 + LD B,A ; от начала файла + CALL MOVE_FP + + SET_PAGE_X DIRPAGE + + PUSH AF + ;!TEST no ldir + ; очистить кеш каталога + ;LD HL,#C000 + ;LD DE,#C001 + ;LD BC,#3FFF + ;LD (HL),L + ;LDIR + ; + LD A,(FatBuffer.DRIVE) ; номер диска + LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор + LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера + LD E,(IY+_sFM.ST_CLUSTER+1) + LD A,D + OR E + JP Z,.LROTDIR ; root ?? + LD HL,DIR ; куда + LD DE,#4000 ; сколько + XOR A ; дескриптор + CALL READ ; чтение из файла + LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов + POP AF + OUT (SLOT3),A + AND A + RET +.LROTDIR: + 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 ; число секторов +.RTD1: LD A,(FatBuffer.DRIVE) ; номер диска + LD DE,DIR ; буфер + LD C,Dss.DRV.Read ; чтение секторов + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +SAVEDIR: + XOR A + LD HL,0 + LD IX,0 + LD B,0 + CALL MOVE_FP + + SET_PAGE_X DIRPAGE + + PUSH AF + LD A,(FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + LD D,(IY+_sFM.ST_CLUSTER) + LD E,(IY+_sFM.ST_CLUSTER+1) + LD A,D + OR E + JP Z,.SROTDIR + LD HL,DIR +; размер списка каталога size_cash_directory +.DIRSIZE+1: + LD DE,0 + XOR A + CALL WRITE + POP AF + OUT (SLOT3),A + AND A + RET +.SROTDIR: + LD HL,(FatBuffer.DIR_FRH) + LD IX,(FatBuffer.DIR_FRL) + LD A,(FatBuffer.DIR_S_S) + LD B,32 + SUB B + JR NC,.RTD1S + ADD A,B + LD B,A +.RTD1S: LD A,(FatBuffer.DRIVE) + LD DE,DIR + LD C,Dss.DRV.Write + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; +;DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory + + + +;!FIXIT к буферам +; Массив лог. номеров банок расширения DSS +BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE +HANDBUF: BLOCK HANDBUF.SIZE,0 +MASKARE: BLOCK 8,0 ; имя файла + BLOCK 3,0 ; расш. + BLOCK 21,0 ; 11+21=32 +; + +;PATH0: DW #0000 +;ACCESS: DB #00 +;DTABUF: DW #0000 +;CURHND: DW #0000 +;NO_NEXT: DB #00 +;.YES EQU 0 +;.NO EQU #FF +;FNDMODE: DB #00 ;//MODULE: DOS5 ;[END] + + +;!TODO ? +GHANDLE: +; PUSH DE +; PUSH HL +; PUSH IX +; CALL TESTDSK +; JP C,G_HAND1 +; CALL LOADDIR +; POP DE +; LD HL,DIR +; LD BC,#0020 +;G_HAND2: +; LD A,D +; OR E +; JP Z,G_HAND3 +; ADD HL,BC +; DEC DE +; JP G_HAND2 +;G_HAND3: +; EXX +; POP DE +; EXX +;G_HAND4: +; EX DE,HL +; LD A,DIRPAGE +; CALL BANK +; EX DE,HL +; LD DE,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; OUT (SLOT3),A +; LD HL,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; POP BC +; DEC BC +; LD A,B +; OR C +; RET Z +; PUSH BC +; JP G_HAND4 +;G_HAND1 POP IX +; POP HL +; POP DE +; RET +;HANDTA BLOCK 32,0 +;----------------------------------------------------------------------; +; ;!TEST +; SAVE_CURRENT_PATH: +; SET_PAGE_X ENVPAGE +; PUSH AF +; CALL CURRDSK +; ADD A,"A" +; LD HL,TMP_CURDIR +; LD (HL),A +; INC HL +; LD A,":" +; LD (HL),A +; INC HL +; CALL CURRDIR +; POP AF +; OUT (SLOT3),A +; RET +; BACK_CURRENT_PATH: +; SET_PAGE_X ENVPAGE +; PUSH AF +; LD HL,TMP_CURDIR +; CALL CHDIR +; POP AF +; OUT (SLOT3),A +; RET +; ; +;----------------------------------------------------------------------; +;!TEST + ;BANK: + ; LD C,A + ; LD B,0 + ; LD HL,BANKTBL + ; ADD HL,BC + ; IN A,(SLOT3) + ; LD C,SLOT3 + ; OUTI + ; RET +; diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index dfe28a6..367b81e 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -548,6 +548,11 @@ TSTSIZE XOR A LD (READ.COD),A RET +; HL - ADDRESS +; DE - SIZE +; A - FM +READ_FN: +; _mSavePath 1 ; HL - ADDRESS ; DE - SIZE ; A - FM diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 102336c..f4a79af 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -159,7 +159,7 @@ CURRDSK: LD A,(FatBuffer.DRIVE) ; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// DISKINF: - CP #FF + CP #FF ; !FIXIT WorkDirectory JR Z,CURRDS ;R06 CALL CHNDISK ;R06 RET C ;R06 @@ -562,9 +562,18 @@ FatBuffer: ; ;!TODO к буферам! -DIRSPEC: DB '\' - BLOCK DIRSPEC.DEPTH -; +CurrentDirectory: DB '\' +.DEPTH: EQU DIRECTORY_PATH_LENGTH + BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + + IF SAVE_PATH_MACRO +WorkDirectory: DB '\' +.DEPTH: EQU DIRECTORY_PATH_LENGTH + BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + ELSE +WorkDirectory EQU CurrentDirectory +.DEPTH EQU CurrentDirectory.DEPTH + ENDIF ;R11 ; !TODO починить @@ -620,7 +629,7 @@ BACK_CUR_PATH: PUSH AF LD HL,TMP_CURDIR_AUTO - CALL CHDIR.tmp + CALL CHDIR ; почему не POP AF : OUT (SLOT3),A //POP BC diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f5332f4..981510c 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -378,8 +378,8 @@ ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK, low CURRDSK, low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DELETE, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR ; 2 14..1D + DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ_FN ; 1 0A..13 + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR, low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B @@ -405,8 +405,8 @@ ADRST10: ;DS 512 ;,0 ENDIF ;...............................................[HIGH ADDRESS]: DB high F_START,high CHNDISK,high CURRDSK,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE, high CREAT_N,high NOPS, high NOPS, high DELETE, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP,high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR + DB high CREATE, high CREAT_N,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high WRITE, high MOVE_FP,high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN DB high CURRDIR,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY DB high ECHOKEY,high CTRLKEY,high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 5f0161d..2786eb6 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -23,6 +23,7 @@ ////////////////////////////////////////////////////////////////////// +; !FIXIT тут одни затупы и дебилизм ; Функция #47. Получение информации приложения. ; ; вход: HL - буфер данных @@ -40,11 +41,12 @@ ////////////////////////////////////////////////////////////////////// ;LAST_PSP_PTR: DW 0 APPINFO: INC B -APPINF0: DJNZ APPINF1 - EX DE,HL + ; + DJNZ .FN1 + ; получение параметров командной строки EX DE,HL XOR A LD (DE),A - LD HL,(LAST_PSP_PTR) + LD HL,(.LAST_PSP_PTR) LD C,(HL) INC C RET Z @@ -53,13 +55,11 @@ APPINF0: DJNZ APPINF1 AND A RET -; Получение параметров командной строки -APPINF1: - DJNZ APPINF2 +.FN1: DJNZ .FN2 + ; получение полного пути к каталогу программы EX DE,HL -LAST_PSP_PTR+1: +.LAST_PSP_PTR+1: LD HL,0 - LD C,(HL) INC HL ADD HL,BC @@ -69,9 +69,9 @@ LAST_PSP_PTR+1: LD BC,#100 ;!HARDCODE длина коммандной строки XOR A CPIR - DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога - DEC HL ;R10,5 - не тестил ;!!!!! - LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки + DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога + DEC HL ;R10,5 - не тестил ;!!!!! + LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки LD A,'\' CPDR INC HL @@ -79,6 +79,10 @@ LAST_PSP_PTR+1: POP BC AND A SBC HL,BC + ;R10 ;[x] могло всё в космос улететь + LD A,DSS_Error.sys.COMMON_ERROR + JR C,.error + ; LD A,B ;EX HL,A,BC LD B,H LD H,A @@ -89,25 +93,29 @@ LAST_PSP_PTR+1: XOR A LD (DE),A RET - -; Получение полного пути к каталогу программы -APPINF2: - DJNZ APPINF3 + ; +.FN2: DJNZ .FN3 + ; получение полного пути и имени файла EX DE,HL - LD HL,(LAST_PSP_PTR) + LD HL,(.LAST_PSP_PTR) LD C,(HL) INC HL ADD HL,BC INC HL INC HL -APINF2 LD A,(HL) + ; +.loop LD A,(HL) LDI OR A - JR NZ,APINF2 + JR NZ,.loop + ; RET - -APPINF3 LD A,DSS_Error.sys.INVALID_FUNCTION - SCF + ; +.FN3: + ; + ; ошибка + LD A,DSS_Error.sys.INVALID_FUNCTION +.error: SCF RET ////////////////////////////////////////////////////////////////////// @@ -337,7 +345,7 @@ PATH_YEP: XOR A PUSH HL PUSH BC LD HL,(NM_PATH) - LD BC,#00FF ; !FIXIT глубина буфера не зависит от DIRSPEC.DEPTH + LD BC,#00FF ; !FIXIT глубина буфера не зависит от CurrentDirectory.DEPTH CPIR DEC HL EX DE,HL @@ -687,7 +695,7 @@ FINDPATH: PUSH BC EX DE,HL CALL Z,GOTO_CURDIR - CALL CHDIR.tmp + CALL CHDIR JR C,.BADPATH LD HL,CORE_BUFFERS.EXEBUFF LD DE,MASKARE @@ -712,7 +720,7 @@ FINDPATH: GOTO_CURDIR: PUSH HL LD HL,TMP_CURDIR - CALL CHDIR.tmp + CALL CHDIR POP HL RET @@ -828,7 +836,7 @@ EXEC: _mSavePath 1 ; при выходе с ошибкой, в регистре А - код ошибки EXEC_1: LD (CMDLINE),HL LD A,#01 ; %7600000R = !FAT_ATTR ;!HARDCODE - LD (ACCESS),A + LD (F_FIRST.ACCESS),A CALL GETWORD RET C LD HL,TMPNAME @@ -839,7 +847,7 @@ EXEC_1: LD (CMDLINE),HL LD A,DSS_Error.sys.FILE_NOT_FOUND RET C CALL INCTASK ;R08 - CALL OPENEXE + CALL OPEN.FILE JR NC,.noError CALL DECTASK ;R08 AND A @@ -903,7 +911,7 @@ EXEC02: LD (EXE_FM),A ; ;R09 _mRestorStackAfterRestorePath - _mRestorePath + ;_mRestorePath ;R09 ; LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) @@ -1017,7 +1025,6 @@ FRC000: LD A,(DE) OUT (SLOT3),A CALL M_PSP - LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) LD B,Dss.Move_FP.FrStart @@ -1041,7 +1048,7 @@ FRC000: LD A,(DE) ;!FIXIT double 2 ;R09 - _mRestorePath + ;_mRestorePath ; LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) @@ -1055,6 +1062,9 @@ FRC000: LD A,(DE) LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE PUSH HL + + _mRestorePath + RET ; ;[ ] @@ -1205,7 +1215,7 @@ FRC000H: LD A,(DE) ;!FIXIT double 2 ;R09 - _mRestorePath + ;_mRestorePath ; LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) @@ -1219,6 +1229,9 @@ FRC000H: LD A,(DE) LD DE,RETFAR PUSH DE PUSH HL + + _mRestorePath + RET ; @@ -1308,6 +1321,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) INC HL LD (HL),B INC HL + ;!FIXIT тут восстанавливать правильный каталог CALL CURRDSK ADD A,'A' LD (HL),A @@ -1317,9 +1331,10 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) INC HL PUSH HL CALL CURRDIR + ; POP HL XOR A - LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH + LD BC,#0100 ;!FIXIT нет привязки к CurrentDirectory.DEPTH CPIR ;!FIXIT нет проверки на выход по BC=0 DEC HL DEC HL @@ -1338,7 +1353,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) DEC DE XOR A LD (DE),A - LD (LAST_PSP_PTR),IX + LD (APPINFO.LAST_PSP_PTR),IX ; RET diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ef955db..520fab2 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -38,7 +38,7 @@ RESERVED2 BLOCK 490,0 .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 +.ACCESS_MODE: BYTE #00 ;+41 ACCESS MODE признак изменения файла .TASK_NUM: BYTE #00 ;+42 TASK .EMPTY: BYTE #00 ;+43 EMPTY ENDS diff --git a/DSS/build.txt b/DSS/build.txt index a21cae3..6a5426c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -454 \ No newline at end of file +474 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 2c2a1bf..a28e102 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +15,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 - DEFINE SAVE_PATH_MACRO 1 + DEFINE SAVE_PATH_MACRO 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; @@ -32,8 +32,7 @@ DRVPAGE EQU 3 DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц COREPAGE EQU 4 ; она отдельно и не с блоком выше. ;----------------------------------------------------------------------- - -DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 +DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 1..255 ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 diff --git a/SHELL/build.txt b/SHELL/build.txt index 3ca9062..615be70 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -84 \ No newline at end of file +85 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 1b02533..a7128fd 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 1b025338c449183aa1cfbe595994fd9ddf7feb8e +Subproject commit a7128fd1547d624249d95fdcbbb3aaa090f90357 From 66c77848edadcdb970b164f33d15cb5814ec1f1f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 14 Oct 2023 23:40:22 +1000 Subject: [PATCH 044/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B0=D1=8F=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 30 +++--- DSS/DOS5.ASM | 269 +++++++++++++++++++++++++++++++++++++++++------ DSS/DOS_FM.ASM | 2 +- DSS/DOS_X.ASM | 28 ++++- DSS/DSS-MAIN.ASM | 40 +++---- DSS/EXECUTE.ASM | 151 ++++++++++++++++++++++++-- DSS/build.txt | 2 +- DSS/defines.inc | 5 +- 8 files changed, 436 insertions(+), 91 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 9539114..136f0a1 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -176,28 +176,27 @@ CONTINUE: IF UNIVERSAL_BOOT LD A,(DRIVE) - LD C,#00 - RST #10 + LD C,Dss.Version + RST ToDSS jp c,XFAIL.fail LD A,STARTDO CALL DOSMESS LD A,(DRIVE) - LD B,1 - LD C,Dss.BootDSK - RST #10 + LD BC,Dss.BootDSK.Set*256 + Dss.BootDSK + RST ToDSS LD B,0 ELSE IF ORIGINAL_DSS - LD C,#00 - RST #10 + LD C,Dss.Version + RST ToDSS ELSE LD A,(DRIVE) - LD C,#00 - RST #10 + LD C,Dss.Version + RST ToDSS jp c,XFAIL.fail ENDIF @@ -206,27 +205,26 @@ CONTINUE: IF ORIGINAL_DSS LD A,(DRIVE) - LD B,1 - LD C,Dss.BootDSK - RST #10 + LD BC,Dss.BootDSK.Set*256 + Dss.BootDSK + RST ToDSS LD B,0 ENDIF ENDIF LD C,Dss.BootDSK - RST #10 + RST ToDSS ADD A,"A" LD HL,ROOT LD (HL),A LD C,Dss.ChDir - RST #10 + RST ToDSS LD HL,PSHELL LD BC,Dss.Exec - RST #10 + RST ToDSS LD A,NOSHELL JP XFAIL @@ -235,7 +233,7 @@ ROOT: DB 'X:\',0 DOSMESS CALL FMESAGE LD C,Dss.PChars - RST #10 + RST ToDSS RET XFAIL: CALL DOSMESS diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 0778594..00c5de1 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -31,6 +31,18 @@ //////////////////////////////////////////////////////////////////////// ATTRIB: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + + INC B DEC B JP Z,.RATTRIB @@ -90,14 +102,27 @@ ATTRIB: ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// CREATE: _mSavePath 0 + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL .Prepare RET C CALL SEARCH CALL NC,DELETE ;FILE EXIST RECREAT JR .DO + ; ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM .NEW: _mSavePath 0 + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL .Prepare RET C CALL SEARCH @@ -154,11 +179,18 @@ CREATE: _mSavePath 0 JP MASK CREAT_N EQU CREATE.NEW + //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// DEL_FN: ;!TEST _mSavePath 1 + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME @@ -213,7 +245,17 @@ DELETE: SET_PAGE_X DIRPAGE ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -RENAME: PUSH DE +RENAME: + ;!Test Current Dir + PUSH HL + PUSH DE + CALL DIR_PATH_CHECK.forceCheck + POP DE + POP HL + RET C + ; + + PUSH DE LD DE,MASKARE CALL MASK POP DE @@ -273,6 +315,16 @@ RENAME: PUSH DE //////////////////////////////////////////////////////////////////////// OPEN_FN: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK.forceCheck + POP BC + POP HL + RET C + LD A,C + ; ;R08 OPEN: LD (F_FIRST.ACCESS),A CALL GETWORD @@ -319,8 +371,11 @@ OPEN: LD (F_FIRST.ACCESS),A RET //////////////////////////////////////////////////////////////////////// -; -; +;Входные значения: +; C - #12 +; A - файловый манипулятор +;Выходные значения: +; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// CLOSE_FN: _mSavePath 1 @@ -376,10 +431,31 @@ CLOSE: LD (F_FIRST.ACCESS),A RET //////////////////////////////////////////////////////////////////////// -; -; +;Входные значения: +; C - #19 +; HL - указатель на файловую спецификацию +; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт +; A - атрибуты, используемые при поиске +; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" +; B = 1 - имя найденного файла в формате DOS "filename.ext",0 +;Выходные значения: +; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// F_FIRST: + ;!Test Current Dir + LD C,A + PUSH HL + PUSH DE + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP DE + POP HL + RET C + LD A,C + ; + + LD (.ACCESS),A LD (.DTABUF),DE LD A,B @@ -487,9 +563,16 @@ F_NEXT: //////////////////////////////////////////////////////////////////////// ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: +CHNDISK_FN: + CALL CHNDISK + RET C + PUSH AF + CALL DIR_PATH_CHANGE.FullCurrent + POP AF + RET CHNDISK: ;!TEST - CALL OPENDSK + CALL OPENDSK ;CALL OPENDSK.force ; ;????? R10 @@ -516,12 +599,13 @@ CHNDISK: ; выход: A - код ошибки, если CF=1 ; !FIXIT может выйти за пределы буфера? //////////////////////////////////////////////////////////////////////// -CURRDIR: EX DE,HL - LD HL,CurrentDirectory +CURRDIR: LD DE,WorkDirectory + JR CURRDIR_FN.skip +CURRDIR_FN: + LD DE,CurrentDirectory +.skip: EX DE,HL XOR A -.loop: ;LD A,(HL) - ;OR A - CP (HL) +.loop: CP (HL) LDI JR NZ,.loop RET @@ -778,10 +862,14 @@ PUT_D_T: //////////////////////////////////////////////////////////////////////// CHDIR_FN: _mSavePath 0 - ; EX DE,HL - ; LD HL,OPENDIR.dir - ; LD (HL),CurrentDirectory - ; CALL CHDIR + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; + CALL CHDIR + JP DIR_PATH_CHANGE.FullCurrent ; RET ; CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск @@ -801,6 +889,17 @@ CHDIR: CALL GETWORD ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// MKDIR: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME ; 8.3 имя @@ -965,6 +1064,17 @@ MKDIR: _mSavePath 1 ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL GETWORD RET C LD HL,TMPNAME @@ -1051,9 +1161,35 @@ RMDIR: _mSavePath 1 LD A,DSS_Error.sys.DIR_NOT_EMPTY SCF RET + +//////////////////////////////////////////////////////////////////////// +;Входные значения: +; C - #44 +; B = 0, преобразовать из 11 символьного формата в формат ДОС +; HL - 11 символов имени файла +; DE - буфер для имени в формате ДОС +; B = 1, преобразовать из формата ДОС в 11 символьный формат +; HL - имя файла в формате ДОС +; DE - 11 символов имени файла +;Выходные значения: +; A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +DOSNAME: + INC B + DEC B + JP Z,GETNAME + DEC B + JP Z,MASK + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET //////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////// + + + + + ;----------------------------------------------------------------------; ; Чтение регистров CMOS @@ -1263,19 +1399,6 @@ WRT_HND: ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -DOSNAME: - INC B - DEC B - JP Z,GETNAME - DEC B - JP Z,MASK - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -;----------------------------------------------------------------------; - - ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 @@ -1599,16 +1722,19 @@ FINDDIR: LD A,(IX+1) CP "." JP NZ,.IT_DIR - LD HL,CurrentDirectory + ;LD HL,CurrentDirectory + LD HL,WorkDirectory LD D,H LD E,L INC HL - LD BC,CurrentDirectory.DEPTH + ;LD BC,CurrentDirectory.DEPTH + LD BC,WorkDirectory.DEPTH XOR A CPIR ;!FIXIT нет проверки на завершение по BC=0 DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога DEC HL - LD BC,CurrentDirectory.DEPTH + ;LD BC,CurrentDirectory.DEPTH + LD BC,WorkDirectory.DEPTH LD A,'\' CPDR INC HL @@ -1630,8 +1756,10 @@ FINDDIR: .ADDSPEC: LD E,XL LD D,XH - LD HL,CurrentDirectory+1 - LD BC,CurrentDirectory.DEPTH-1 + ;LD HL,CurrentDirectory+1 + ;LD BC,CurrentDirectory.DEPTH-1 + LD HL,WorkDirectory+1 + LD BC,WorkDirectory.DEPTH-1 XOR A CPIR ;!FIXIT нет проверки на завершение по BC=0 DEC HL @@ -1933,7 +2061,77 @@ SAVEDIR: AND A RET ;----------------------------------------------------------------------; -;DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory + + +;----------------------------------------------------------------------; +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 + ; +.FullWork: LD A,(CurrentPath) + SUB 'A' + LD (FatBuffer.DRIVE),A + ; +.Work: LD HL,CurrentDirectory + LD DE,WorkDirectory + LD BC,DIRECTORY_PATH_LENGTH + LDIR + RET +DIR_PATH_CHECK: LD A,(HL) + CP '\' + JR NZ,.notRootDir + ; + CALL .checkDrive + RET Z + LD A,(CurrentPath) + SUB 'A' + JP OPENDSK + ; +.notRootDir: INC HL + LD A,(HL) + CP ':' + RET Z + ; +.forceCheck: CALL .checkDrive + JR Z,.checkDir + ; + LD HL,CurrentPath + LD A,(FatBuffer.DRIVE) + ADD 'A' + CP (HL) + JP NZ,GETWORD + ; +.checkDir: LD HL,CurrentDirectory+1 + LD DE,WorkDirectory+1 + ; +.loop: LD A,(DE) + AND A + JR Z,.end + CP (HL) + INC HL + INC DE + JR Z,.loop + ; + JR .ReDir +.end: CP (HL) + RET Z +.ReDir: LD HL,CurrentDirectory + JP GETWORD + ; +.checkDrive: LD HL,CurrentPath + LD A,(FatBuffer.DRIVE) + ADD 'A' + CP (HL) + RET +;----------------------------------------------------------------------; + @@ -1957,6 +2155,7 @@ MASKARE: BLOCK 8,0 ; ;//MODULE: DOS5 ;[END] +;DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory ;!TODO ? diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 367b81e..e7105c0 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -551,7 +551,7 @@ TSTSIZE XOR A ; HL - ADDRESS ; DE - SIZE ; A - FM -READ_FN: +;READ_FN: ; _mSavePath 1 ; HL - ADDRESS ; DE - SIZE diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index f4a79af..97816e7 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -141,6 +141,12 @@ NDISK11: ; вход: нет ; выход: A - номер диска (0=A,1=B,..) ;///////////////////////////////////////////////////////////////////// +CURRDSK_FN: + LD A,(CurrentPath) + SUB 'A' + RET NC + LD A,DSS_Error.sys.INVALID_DRIVE + RET CURRDSK: LD A,(FatBuffer.DRIVE) AND A RET @@ -160,10 +166,20 @@ CURRDSK: LD A,(FatBuffer.DRIVE) ;///////////////////////////////////////////////////////////////////// DISKINF: CP #FF ; !FIXIT WorkDirectory - JR Z,CURRDS ;R06 + ;!TEST Current Dir + ;JR Z,CURRDS ;R06 + JR NZ,.CustomDisk + LD A,(CurrentPath) + SUB 'A' + LD HL,FatBuffer.DRIVE + CP (HL) + JR Z,CURRDS + ; +.CustomDisk: CALL CHNDISK ;R06 RET C ;R06 -CURRDS: LD HL,2 +CURRDS: + LD HL,2 LD BC,0 FRESP: PUSH BC CALL R_F_FAT @@ -540,7 +556,7 @@ DOS_X_Error: ;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' -.READ_PG: DB #00 +.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) .BLOCK: DB #00 .DIR_CLU: DW #0000 .DRIVE: DB #FF @@ -562,11 +578,13 @@ FatBuffer: ; ;!TODO к буферам! +CurrentPath: DB 'X' + DB ':' CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце - IF SAVE_PATH_MACRO + IF SAVE_PATH_CODE WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце @@ -597,7 +615,7 @@ SAVE_CUR_PATH LD A,":" LD (HL),A INC HL - CALL CURRDIR + CALL CURRDIR_FN ; почему не POP AF : OUT (SLOT3),A //POP BC diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 981510c..e0a14df 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -377,16 +377,16 @@ GO_ZERO EQU #0000 ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX - DB low F_START, low CHNDISK, low CURRDSK, low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ_FN ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D - DB low CURRDIR, low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 - DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B - DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low WAIT, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 - DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F - DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 - DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT ; 9 5A..5F + DB low F_START, low CHNDISK_FN, low CURRDSK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 + DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D + DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 + DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B + DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low WAIT, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 + DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F + DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 + DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT ; 9 5A..5F IFN SHORT_RSTx10_TABLE ;[ ] R09 @@ -404,16 +404,16 @@ ADRST10: ;DS 512 ;,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: - DB high F_START,high CHNDISK,high CURRDSK,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE, high CREAT_N,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP,high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN - DB high CURRDIR,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY - DB high ECHOKEY,high CTRLKEY,high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 - DB high FREEMEM,high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high WAIT, high GSWITCH,high DOSNAME, high EX_PATH - DB high ENVIRON,high APPINFO,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high SETVMOD,high GETVMOD,high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY - DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT + DB high F_START, high CHNDISK_FN,high CURRDSK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK + DB high CREATE, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN + DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY + DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 + DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high WAIT, high GSWITCH,high DOSNAME, high EX_PATH + DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY + DB high WINREST, high PUTCHAR, high PCHARS, high NOPS, high NOPS, high PRINT IFN SHORT_RSTx10_TABLE ;[ ] R09 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 2786eb6..aa6c19e 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -672,7 +672,7 @@ FINDPATH: SET_PAGE_X ENVPAGE PUSH AF - CALL CURRDSK + CALL CURRDSK_FN ADD A,"A" LD HL,TMP_CURDIR LD (HL),A @@ -680,7 +680,7 @@ FINDPATH: LD A,":" LD (HL),A INC HL - CALL CURRDIR + CALL CURRDIR_FN CALL MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY @@ -769,6 +769,7 @@ ENVPATH DB "PATH=",0 ; !TODO СДЕЛАТЬ СТРУКТУРОЙ и обозначить страницу TMP_CURDIR_AUTO EQU #FB00 PATH_PNT_ARRAY EQU #FC80 +; !FIXIT не нужно если SAVE_PATH_MACRO = 1 TMP_CURDIR EQU #FD00 ENVTEMP EQU #FE00 @@ -949,6 +950,10 @@ NOINK: LD A,H JP NZ,ERREXE0 LD B,L + LD HL,_RET_1 + LD (_ret),HL + JP _TST_PROC +/* ;!FIXIT double 1 CALL GETMEM JP C,ERREXE0 @@ -1031,10 +1036,12 @@ FRC000: LD A,(DE) LD A,(EXE_FM) CALL MOVE_FP ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE ; ; - LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) +*/ + +_RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) XOR A LD H,A LD L,A @@ -1045,7 +1052,8 @@ FRC000: LD A,(DE) CALL READ ; чтение из файла LD A,(EXE_FM) ; дескр. файла CALL CLOSE ; закрыть файл - + JP _TST_PROC_2 +/* ;!FIXIT double 2 ;R09 ;_mRestorePath @@ -1067,6 +1075,7 @@ FRC000: LD A,(DE) RET ; +*/ ;[ ] RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN JP LEAVE ; завершить программу (процесс) @@ -1121,7 +1130,10 @@ PRELOAD: EX DE,HL OR L JR Z,NOINK2 INC B -NOINK2: +NOINK2: LD HL,_RET_2 + LD (_ret),HL + JR _TST_PROC +/* ;!FIXIT double 1 CALL GETMEM JP C,ERREXE0 @@ -1204,15 +1216,17 @@ FRC000H: LD A,(DE) LD A,(EXE_FM) CALL MOVE_FP ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE ; ; - - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер +*/ +_RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла + JP _TST_PROC_2 +/* ;!FIXIT double 2 ;R09 ;_mRestorePath @@ -1234,6 +1248,121 @@ FRC000H: LD A,(DE) RET ; +*/ + + +;----------------------------------------------------------------------- +_TST_PROC: + ;!FIXIT double 1 + CALL GETMEM + JP C,ERREXE0 + LD (EXE_MEM),A + EXX + POP DE ;снимаем со стека адрес возврата + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX + ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит + LD A,(EXE_MEM) + LD DE,RAMMAP + LD BC,0*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,1*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,2*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,3*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A +;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; + LD HL,(CMDLINE) + LD DE,CORE_BUFFERS.SECBUF+1 + CALL SCOPYS + LD A,#80 ;!HARDCODE cmd line size + SUB B + LD (CORE_BUFFERS.SECBUF),A + ;R02 + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE + ; + LD A,SHARED_PAGE + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,RAMMAP + LD A,H + AND #C0 + CP #40 + JR Z,FR4000 + CP #80 + JR Z,FR8000 + CP #C0 + JR Z,FRC000 +FR4000: LD A,(DE) + OUT (SLOT1),A + INC DE +FR8000: LD A,(DE) + OUT (SLOT2),A + INC DE +FRC000: LD A,(DE) + OUT (SLOT3),A + CALL M_PSP + + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) + LD B,Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE + ; +_ret+1: JP 0 + ; + +_TST_PROC_2: + ;!FIXIT double 2 + ;R09 + ;_mRestorePath + ; + LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) + LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" + PUSH DE + PUSH HL + + _mRestorePath + + RET + ; +;----------------------------------------------------------------------- ;///////////////////////////////////////////////////////////////////// ; Функция #41. Завершить программу (процесс). @@ -1322,7 +1451,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),B INC HL ;!FIXIT тут восстанавливать правильный каталог - CALL CURRDSK + CALL CURRDSK_FN ADD A,'A' LD (HL),A INC HL @@ -1330,7 +1459,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),A INC HL PUSH HL - CALL CURRDIR + CALL CURRDIR_FN ; POP HL XOR A diff --git a/DSS/build.txt b/DSS/build.txt index 6a5426c..9301519 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -474 \ No newline at end of file +483 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index a28e102..d931abd 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +15,8 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 - DEFINE SAVE_PATH_MACRO 0 + DEFINE SAVE_PATH_MACRO 0 ;\____ либо то, либо то + DEFINE SAVE_PATH_CODE 1 ;/ DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; @@ -32,7 +33,7 @@ DRVPAGE EQU 3 DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц COREPAGE EQU 4 ; она отдельно и не с блоком выше. ;----------------------------------------------------------------------- -DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 1..255 +DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 From 2df0b56e56a968b7bb0d01c30ce081ae692179ff Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 15 Oct 2023 03:34:27 +1000 Subject: [PATCH 045/219] Current Directory --- DSS/DOS5.ASM | 48 +++-- DSS/EXECUTE.ASM | 487 ++++++++++++++---------------------------------- DSS/build.txt | 2 +- Shared_Includes | 2 +- 4 files changed, 169 insertions(+), 370 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 00c5de1..1cd16ee 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -561,8 +561,6 @@ F_NEXT: ; ; //////////////////////////////////////////////////////////////////////// -;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка -; RestoreDIR: CHNDISK_FN: CALL CHNDISK RET C @@ -577,8 +575,6 @@ CHNDISK: ; ;????? R10 RET C - ;LD HL,CurrentDirectory+1 - ;LD HL,CurrentDirectory LD HL,WorkDirectory LD (HL),0 PUSH AF @@ -1553,6 +1549,8 @@ GETWORD: INC HL CP '\' JR Z,.DIR_NAME + ; AND A + ; JR Z,.DIR_NAME ;CP ':' ;JR Z,.DRV_NAME LD (DE),A @@ -1760,17 +1758,18 @@ FINDDIR: ;LD BC,CurrentDirectory.DEPTH-1 LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 - XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 - DEC HL - DEC HL - LD A,'\' ; #5C - CP (HL) - INC HL - JR Z,.ADDSPE0 - LD (HL),A - INC HL -.ADDSPE0: +; XOR A +; CPIR ;!FIXIT нет проверки на завершение по BC=0 +; DEC HL +; DEC HL +; LD A,'\' ; #5C +; CP (HL) +; INC HL +; JR Z,.ADDSPE0 +; LD (HL),A +; INC HL +; .ADDSPE0: + CALL .CHECK_SLASH ;R11 LD A,B AND A @@ -1815,6 +1814,18 @@ FINDDIR: OUT (SLOT3),A AND A RET +.CHECK_SLASH: + XOR A + CPIR ;!FIXIT нет проверки на завершение по BC=0 + DEC HL + DEC HL + LD A,'\' ; #5C + CP (HL) + INC HL + RET Z + LD (HL),A + INC HL + RET ;----------------------------------------------------------------------; @@ -2099,7 +2110,10 @@ DIR_PATH_CHECK: LD A,(HL) CP ':' RET Z ; -.forceCheck: CALL .checkDrive +.forceCheck: LD HL,CurrentDirectory+1 + LD BC,CurrentDirectory.DEPTH-1 + CALL FINDDIR.CHECK_SLASH + CALL .checkDrive JR Z,.checkDir ; LD HL,CurrentPath @@ -2122,7 +2136,7 @@ DIR_PATH_CHECK: LD A,(HL) JR .ReDir .end: CP (HL) RET Z -.ReDir: LD HL,CurrentDirectory +.ReDir: LD HL,CurrentPath JP GETWORD ; .checkDrive: LD HL,CurrentPath diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index aa6c19e..f9e4c44 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -671,18 +671,18 @@ ABSOLUTE_DIR EQU 1 FINDPATH: SET_PAGE_X ENVPAGE PUSH AF - - CALL CURRDSK_FN - ADD A,"A" - LD HL,TMP_CURDIR - LD (HL),A - INC HL - LD A,":" - LD (HL),A - INC HL - CALL CURRDIR_FN - - CALL MAKE_PATH_ARRAY + ;!TEST + ;CALL CURRDSK_FN + ;ADD A,"A" + ;LD HL,TMP_CURDIR + ;LD (HL),A + ;INC HL + ;LD A,":" + ;LD (HL),A + ;INC HL + ;CALL CURRDIR_FN + ; + CALL .MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY .NEXTPATHI: LD E,(HL) @@ -694,8 +694,8 @@ FINDPATH: PUSH HL PUSH BC EX DE,HL - CALL Z,GOTO_CURDIR - CALL CHDIR + CALL Z,.GOTO_CURDIR + CALL NZ,CHDIR JR C,.BADPATH LD HL,CORE_BUFFERS.EXEBUFF LD DE,MASKARE @@ -716,19 +716,21 @@ FINDPATH: OUT (SLOT3),A LD A,DSS_Error.sys.PATH_NOT_FOUND RET - -GOTO_CURDIR: +.GOTO_CURDIR: + PUSH AF PUSH HL - LD HL,TMP_CURDIR + ;LD HL,TMP_CURDIR + LD HL,CurrentDirectory CALL CHDIR POP HL + POP AF RET - -MAKE_PATH_ARRAY: +.MAKE_PATH_ARRAY: LD HL,PATH_PNT_ARRAY-1 ;R04 -1 LD DE,ENVTEMP-1 LD B,#00 -NEXTAR: LD (HL),C ;R04 +.NEXTAR: + LD (HL),C ;R04 INC HL ;R04 XOR A LD (DE),A @@ -741,21 +743,25 @@ NEXTAR: LD (HL),C ;R04 ;R04 LD (HL),C ;R04 INC HL INC B -NEXTRT: LD A,(DE) +.NEXTRT: + LD A,(DE) CP '\' - JR NZ,NEXTCH -NEXTDR: SET ABSOLUTE_DIR,C -NEXTRL: ;SET RELATIVE_DIR,C ;!TODO ???? -NEXTCH: LD A,(DE) + JR NZ,.NEXTCH +.NEXTDR: + SET ABSOLUTE_DIR,C +.NEXTRL: + ;SET RELATIVE_DIR,C ;!TODO ???? +.NEXTCH: + LD A,(DE) CP ";" - JR Z,NEXTAR + JR Z,.NEXTAR INC DE ; CP "." ; JR Z,NEXTRL CP ":" - JR Z,NEXTRT + JR Z,.NEXTRT OR A - JR NZ,NEXTCH + JR NZ,.NEXTCH LD (HL),C ;R04 INC HL ;R04 LD (HL),A @@ -953,93 +959,6 @@ NOINK: LD A,H LD HL,_RET_1 LD (_ret),HL JP _TST_PROC -/* - ;!FIXIT double 1 - CALL GETMEM - JP C,ERREXE0 - LD (EXE_MEM),A - EXX - POP DE ;снимаем со стека адрес возврата - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL - EXX - ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит - LD A,(EXE_MEM) - LD DE,RAMMAP - LD BC,0*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,1*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,2*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,3*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A -;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; - LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECBUF+1 - CALL SCOPYS - LD A,#80 ;!HARDCODE cmd line size - SUB B - LD (CORE_BUFFERS.SECBUF),A - ;R02 - LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE - ; - LD A,SHARED_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,RAMMAP - LD A,H - AND #C0 - CP #40 - JR Z,FR4000 - CP #80 - JR Z,FR8000 - CP #C0 - JR Z,FRC000 -FR4000: LD A,(DE) - OUT (SLOT1),A - INC DE -FR8000: LD A,(DE) - OUT (SLOT2),A - INC DE -FRC000: LD A,(DE) - OUT (SLOT3),A - CALL M_PSP - - LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) - LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) - LD B,Dss.Move_FP.FrStart - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE - ; - ; -*/ _RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) XOR A @@ -1053,30 +972,7 @@ _RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD A,(EXE_FM) ; дескр. файла CALL CLOSE ; закрыть файл JP _TST_PROC_2 -/* - ;!FIXIT double 2 - ;R09 - ;_mRestorePath - ; - LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) - LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" - PUSH DE - PUSH HL - _mRestorePath - - RET - ; -*/ -;[ ] RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN JP LEAVE ; завершить программу (процесс) @@ -1133,234 +1029,123 @@ PRELOAD: EX DE,HL NOINK2: LD HL,_RET_2 LD (_ret),HL JR _TST_PROC -/* - ;!FIXIT double 1 - CALL GETMEM - JP C,ERREXE0 - LD (EXE_MEM),A - EXX - POP DE - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL - EXX - ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит - LD A,(EXE_MEM) - LD DE,RAMMAP - LD BC,#00*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,1*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,2*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,3*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A -;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; - LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECBUF+1 - CALL SCOPYS - LD A,#80 - SUB B - LD (CORE_BUFFERS.SECBUF),A - ;R02 - LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE - ; - LD A,SHARED_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,RAMMAP - LD A,H - AND #C0 - CP #40 - JR Z,FR4000H - CP #80 - JR Z,FR8000H - CP #C0 - JR Z,FRC000H -FR4000H: LD A,(DE) - OUT (SLOT1),A - INC DE -FR8000H: LD A,(DE) - OUT (SLOT2),A - INC DE -FRC000H: LD A,(DE) - OUT (SLOT3),A - CALL M_PSP - LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) - LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) - LD B,Dss.Move_FP.FrStart - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE - ; - ; -*/ _RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла JP _TST_PROC_2 -/* - ;!FIXIT double 2 - ;R09 - ;_mRestorePath - ; - LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) - LD DE,RETFAR - PUSH DE - PUSH HL - _mRestorePath - - RET - ; -*/ - - -;----------------------------------------------------------------------- +;-------------------------------------------------------------------;[ ] _TST_PROC: - ;!FIXIT double 1 - CALL GETMEM - JP C,ERREXE0 - LD (EXE_MEM),A - EXX - POP DE ;снимаем со стека адрес возврата - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL - EXX + CALL GETMEM + JP C,ERREXE0 + LD (EXE_MEM),A + EXX + POP DE ;снимаем со стека адрес возврата + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит - LD A,(EXE_MEM) - LD DE,RAMMAP - LD BC,0*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,1*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,2*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,3*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A -;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; - LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECBUF+1 - CALL SCOPYS - LD A,#80 ;!HARDCODE cmd line size - SUB B - LD (CORE_BUFFERS.SECBUF),A - ;R02 - LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE - ; - LD A,SHARED_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,RAMMAP - LD A,H - AND #C0 - CP #40 - JR Z,FR4000 - CP #80 - JR Z,FR8000 - CP #C0 - JR Z,FRC000 -FR4000: LD A,(DE) - OUT (SLOT1),A - INC DE -FR8000: LD A,(DE) - OUT (SLOT2),A - INC DE -FRC000: LD A,(DE) - OUT (SLOT3),A - CALL M_PSP + LD A,(EXE_MEM) + LD DE,RAMMAP + LD BC,0*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,1*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,2*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A + INC DE + LD A,(EXE_MEM) + LD BC,3*256 + BIOS.GetMemPage + RST ToBIOS + LD (DE),A - LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) - LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) - LD B,Dss.Move_FP.FrStart - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE - ; -_ret+1: JP 0 + LD HL,(CMDLINE) + LD DE,CORE_BUFFERS.SECBUF+1 + CALL SCOPYS + LD A,#80 ;!HARDCODE cmd line size + SUB B + LD (CORE_BUFFERS.SECBUF),A + ;R02 + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; + LD A,SHARED_PAGE + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,RAMMAP + LD A,H + AND #C0 + CP #40 + JR Z,FR4000 + CP #80 + JR Z,FR8000 + CP #C0 + JR Z,FRC000 +FR4000: LD A,(DE) + OUT (SLOT1),A + INC DE +FR8000: LD A,(DE) + OUT (SLOT2),A + INC DE +FRC000: LD A,(DE) + OUT (SLOT3),A + CALL M_PSP + + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) + LD B,Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE + ; +_ret+1: JP 0 _TST_PROC_2: - ;!FIXIT double 2 - ;R09 - ;_mRestorePath - ; - LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) - LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" - PUSH DE - PUSH HL + LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) + LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" + PUSH DE + PUSH HL _mRestorePath + + PUSH IX + LD HL,CurrentDirectory + CALL CHDIR_FN + POP IX - RET + RET ; ;----------------------------------------------------------------------- @@ -1451,7 +1236,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),B INC HL ;!FIXIT тут восстанавливать правильный каталог - CALL CURRDSK_FN + CALL CURRDSK ADD A,'A' LD (HL),A INC HL @@ -1459,7 +1244,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),A INC HL PUSH HL - CALL CURRDIR_FN + CALL CURRDIR ; POP HL XOR A diff --git a/DSS/build.txt b/DSS/build.txt index 9301519..755ab3c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -483 \ No newline at end of file +495 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index a7128fd..12ce194 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a7128fd1547d624249d95fdcbbb3aaa090f90357 +Subproject commit 12ce1947adb0a8d902cd6d89042fe23cb9a33c21 From fb6c8a2cafa4f4d80cfc1a80cee6158834aafe65 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 15 Oct 2023 20:26:15 +1000 Subject: [PATCH 046/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B5=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS5.ASM | 145 ++++++++++++++++++++++-------------------------- DSS/EXECUTE.ASM | 22 ++------ DSS/build.txt | 2 +- 3 files changed, 72 insertions(+), 97 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 1cd16ee..9d9f180 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -29,19 +29,16 @@ ; B = 1 SET ATTRIB ; OUTPUT: A - ATTRIB //////////////////////////////////////////////////////////////////////// -ATTRIB: - _mSavePath 1 - ;!Test Current Dir - LD C,A - PUSH HL - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - +ATTRIB: ;!Test Current Dir ;[x] 15/10/23 + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; INC B DEC B @@ -101,13 +98,12 @@ ATTRIB: ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE: _mSavePath 0 - ;!Test Current Dir - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; +CREATE: ;!Test Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL .Prepare RET C CALL SEARCH @@ -116,13 +112,12 @@ CREATE: _mSavePath 0 ; ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -.NEW: _mSavePath 0 - ;!Test Current Dir - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; +.NEW: ;!Test Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL .Prepare RET C CALL SEARCH @@ -184,8 +179,7 @@ CREAT_N EQU CREATE.NEW ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// DEL_FN: ;!TEST - _mSavePath 1 - ;!Test Current Dir + ;!Test Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL @@ -313,18 +307,16 @@ RENAME: ; выход: A - дескриптор файла, если CF=0 ; код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -OPEN_FN: - _mSavePath 1 - ;!Test Current Dir - LD C,A - PUSH HL - PUSH BC - CALL DIR_PATH_CHECK.forceCheck - POP BC - POP HL - RET C - LD A,C - ; +OPEN_FN:;!Test Current Dir ;[x] 15/10/23 + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK.forceCheck + POP BC + POP HL + RET C + LD A,C + ; ;R08 OPEN: LD (F_FIRST.ACCESS),A CALL GETWORD @@ -378,7 +370,6 @@ OPEN: LD (F_FIRST.ACCESS),A ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// CLOSE_FN: - _mSavePath 1 ;R08 CLOSE: LD (F_FIRST.ACCESS),A CALL SET_FM @@ -857,17 +848,14 @@ PUT_D_T: ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 //////////////////////////////////////////////////////////////////////// CHDIR_FN: - _mSavePath 0 - ;!Test Current Dir - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; - CALL CHDIR - JP DIR_PATH_CHANGE.FullCurrent - ; RET -; + ;!Test Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL CHDIR + JP DIR_PATH_CHANGE.FullCurrent + ; CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME @@ -884,17 +872,16 @@ CHDIR: CALL GETWORD ; ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// -MKDIR: _mSavePath 1 - ;!Test Current Dir - LD C,A - PUSH HL - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; +MKDIR: ;!Test Current Dir ;[x] 15/10/23 + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C @@ -1059,18 +1046,16 @@ MKDIR: _mSavePath 1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// -RMDIR: _mSavePath 1 - ;!Test Current Dir - LD C,A - PUSH HL - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - +RMDIR: ;!Test Current Dir ;[x] 15/10/23 + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; CALL GETWORD RET C LD HL,TMPNAME @@ -2112,7 +2097,7 @@ DIR_PATH_CHECK: LD A,(HL) ; .forceCheck: LD HL,CurrentDirectory+1 LD BC,CurrentDirectory.DEPTH-1 - CALL FINDDIR.CHECK_SLASH + ;CALL FINDDIR.CHECK_SLASH CALL .checkDrive JR Z,.checkDir ; @@ -2120,7 +2105,7 @@ DIR_PATH_CHECK: LD A,(HL) LD A,(FatBuffer.DRIVE) ADD 'A' CP (HL) - JP NZ,GETWORD + JP NZ,.gotoPath ; .checkDir: LD HL,CurrentDirectory+1 LD DE,WorkDirectory+1 @@ -2137,13 +2122,15 @@ DIR_PATH_CHECK: LD A,(HL) .end: CP (HL) RET Z .ReDir: LD HL,CurrentPath - JP GETWORD + JP .gotoPath ; .checkDrive: LD HL,CurrentPath LD A,(FatBuffer.DRIVE) ADD 'A' CP (HL) RET +.gotoPath: CALL FINDDIR.CHECK_SLASH + JP GETWORD ;----------------------------------------------------------------------; diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index f9e4c44..07604fe 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -9,7 +9,7 @@ //;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE ;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER -;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR +;R09 -- 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR ;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR ;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH ;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING @@ -821,8 +821,7 @@ DECTASK: LD HL,TASK ;R08 ; +00 1 db ? ; Длина ком-строки ; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем ;///////////////////////////////////////////////////////////////////// -EXEC: _mSavePath 1 - INC B ;R03 +EXEC: INC B ;R03 DEC B ;R03 JR Z,.VAR_1 ;R03 DEC B ;R03 @@ -911,16 +910,7 @@ EXEC02: LD (EXE_FM),A LD A,DSS_Error.sys.UNKNOWN_EXE SCF JP NZ,ERREXE -; LD HL,TASK -; INC (HL) -; -; !TODO: BACK TO CURRDIR -; -;R09 - _mRestorStackAfterRestorePath - ;_mRestorePath -;R09 -; + LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) LD A,E OR D @@ -1137,14 +1127,12 @@ _TST_PROC_2: LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE PUSH HL - - _mRestorePath - + ;!Test Current Dir ;[x] 15/10/23 PUSH IX LD HL,CurrentDirectory CALL CHDIR_FN POP IX - + ; RET ; ;----------------------------------------------------------------------- diff --git a/DSS/build.txt b/DSS/build.txt index 755ab3c..5f5c389 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -495 \ No newline at end of file +496 \ No newline at end of file From 1aa15566bfc6b10e8d3f97bdf8445109274f3320 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 25 Oct 2023 01:38:14 +1000 Subject: [PATCH 047/219] =?UTF-8?q?-=20bug=20=D1=81=20=D0=B2=D1=8B=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=BC=20=D0=B8=D0=B7=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F,=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=BB=D1=81=D1=8F=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=BF=D1=83=D0=BB=D1=8F=D1=82=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS5.ASM | 5 ++--- DSS/EXECUTE.ASM | 11 ++++++++++- DSS/build.txt | 2 +- Shared_Includes | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 9d9f180..87656a3 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -2097,7 +2097,6 @@ DIR_PATH_CHECK: LD A,(HL) ; .forceCheck: LD HL,CurrentDirectory+1 LD BC,CurrentDirectory.DEPTH-1 - ;CALL FINDDIR.CHECK_SLASH CALL .checkDrive JR Z,.checkDir ; @@ -2105,7 +2104,7 @@ DIR_PATH_CHECK: LD A,(HL) LD A,(FatBuffer.DRIVE) ADD 'A' CP (HL) - JP NZ,.gotoPath + JR NZ,.gotoPath ; .checkDir: LD HL,CurrentDirectory+1 LD DE,WorkDirectory+1 @@ -2122,7 +2121,7 @@ DIR_PATH_CHECK: LD A,(HL) .end: CP (HL) RET Z .ReDir: LD HL,CurrentPath - JP .gotoPath + JR .gotoPath ; .checkDrive: LD HL,CurrentPath LD A,(FatBuffer.DRIVE) diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 07604fe..d8d42fe 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -1046,6 +1046,10 @@ _TST_PROC: IN A,(SLOT1) PUSH DE PUSH AF + ;!Test close EXE FM [x] 25/10/23 + LD A,(EXE_FM) + PUSH AF + ; LD (EXSTACK),SP LD SP,HL EXX @@ -1154,8 +1158,13 @@ _TST_PROC_2: LEAVE: LD A,B LD (ERLEVEL),A CALL LEAVMEM - CALL DECTASK + ;CALL DECTASK ;!Test close EXE FM [x] 25/10/23 LD SP,(EXSTACK) + ;!Test close EXE FM [x] 25/10/23 + POP AF + CALL RES_FM + CALL DECTASK + ; POP AF POP HL OUT (SLOT1),A diff --git a/DSS/build.txt b/DSS/build.txt index 5f5c389..9889789 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -496 \ No newline at end of file +499 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 12ce194..9319bb7 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 12ce1947adb0a8d902cd6d89042fe23cb9a33c21 +Subproject commit 9319bb78d96af2573dd54d8d2f422f2f134b5653 From 80772913368f6a4ebf70b8f35073d5d881784fb8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 25 Oct 2023 02:50:02 +1000 Subject: [PATCH 048/219] [x] 25/10/23 --- DSS/build.txt | 2 +- SHELL/SHELL.ASM | 13 ++++++------- SHELL/SHELL_EXEC.ASM | 19 ++++++++++++++++--- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/DSS/build.txt b/DSS/build.txt index 9889789..0316458 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -499 \ No newline at end of file +503 \ No newline at end of file diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index b66cd26..cfe8a7e 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -334,13 +334,12 @@ restore_path: ; на новую строку ;!FIXIT сделать через .PChars -newline:ld a,_cc.cr - ld c,Dss.PutChar - RST ToDSS - ld a,_cc.lf - ld c,Dss.PutChar - RST ToDSS - ret +newline: ld a,_cc.cr + ld c,Dss.PutChar + rst ToDSS + ld a,_cc.lf + ld c,Dss.PutChar + jp ToDSS ; Сравнение строк diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index 0d6bcdb..6fcd0a2 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -154,7 +154,9 @@ A839D: ld bc,0*256 + Dss.Exec ; ;R10 CALL Restore_Screen ;R10 - ret nc ; Ok + ;[x] 25/10/23 + JP NC,Ret_New_Line ; Ok + ; ld hl,(D8374) cp DSS_Error.sys.FILE_NOT_FOUND jr nz,A83DD @@ -196,10 +198,21 @@ A83B7: ld e,b A83D7: ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл RST ToDSS ;R10 - CALL Restore_Screen + CALL Restore_Screen ;R10 - ret nc + ; + ;[x] 25/10/23 + JP NC,Ret_New_Line ; Ok + ; A83DD: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" jp nc,print_err_message ; вывод сообщения xor a ; индекс "Bad command or file name" jp print_err_message + +Ret_New_Line: + LD C,Dss.Cursor + RST ToDSS + XOR A + OR E + RET Z + jp newline \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 615be70..9f72858 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -85 \ No newline at end of file +88 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 9319bb7..3744776 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9319bb78d96af2573dd54d8d2f422f2f134b5653 +Subproject commit 374477690571809e7318bd4279bc7da120b6c492 From 5cce74f2a04a99e657d8cb1f66eb397d97649440 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 1 Nov 2023 01:30:19 +1000 Subject: [PATCH 049/219] some fixes with "Current dir" logic --- DSS/DRV-MAIN.ASM | 2 +- DSS/DSS-MAIN.ASM | 10 +++++----- DSS/INTMOUSE.ASM | 16 ++++++++-------- DSS/KEYINTER.ASM | 2 +- DSS/VIDEO.ASM | 8 ++++---- DSS/build.txt | 2 +- SHELL/SHELL_EXEC.ASM | 41 ++++++++++++++++++++++++++++++++++------- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 9 files changed, 56 insertions(+), 29 deletions(-) diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 5a6c42d..d851905 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -141,7 +141,7 @@ A0038: ; ; PUSH IY ; ; CALL KEYSCAN ; ; LD C,#80 ; -; RST #30 ; +; RST ToDSS.Mouse ; ; POP IY ; ; POP IX ; ; POP HL ; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index e0a14df..8c67153 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -153,7 +153,7 @@ INT_: PUSH AF ; PUSH IY ; CALL KEYSCAN ; LD C,#80 ; - RST #30 ; + RST ToDSS.Mouse ; IFN CLASSIC_CURSOR ; CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL ENDIF ; @@ -286,11 +286,11 @@ F_START: DI RET C ;R10 CALL KINIT CALL PRINT_INIT - LD C,0 ;!HARDCODE - RST #30 ;!HARDCODE + LD C,Dss.Mouse.Init + RST ToDSS.Mouse LD A,(VMODE) - LD C,#81 ;!HARDCODE - RST #30 ;!HARDCODE + LD C,Dss.Mouse.SetVideoMode + RST ToDSS.Mouse ;CALL INITDVC ;R05 ;R05 LD C,Dss.DRV.Init diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index f193a66..896e980 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -78,13 +78,13 @@ DMOUSE EQU #1A ; !FIXIT ;--------------------------------------------- ; COMMAND 0Dh (RESERVED) ;--------------------------------------------- -; COMMAND 0Eh (GET SENSETIVE) -; OUTPUT: H - VERTICAL SENSETIVE -; L - HORIZONTAL SENSETIVE +; COMMAND 0Eh (GET SENSITIVE) +; OUTPUT: H - VERTICAL SENSITIVE +; L - HORIZONTAL SENSITIVE ;--------------------------------------------- -; COMMAND 0Fh (SET SENSETIVE) -; INPUT: H - VERTICAL SENSETIVE -; L - HORIZONTAL SENSETIVE +; COMMAND 0Fh (SET SENSITIVE) +; INPUT: H - VERTICAL SENSITIVE +; L - HORIZONTAL SENSITIVE ;--------------------------------------------- ; COMMAND 80h (MOUSE HARDWARE INTERRUPT) ;--------------------------------------------- @@ -358,8 +358,8 @@ MS_MASK XOR A RET -; H - VERTICAL SENSETIVE -; L - HORIZONTAL SENSETIVE +; H - VERTICAL SENSITIVE +; L - HORIZONTAL SENSITIVE MS_SENT LD (SENSEXY),HL diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 93883de..392f7e8 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -357,7 +357,7 @@ K_CLEAR LD A,(HOST) CP B JR C,.error LD C,B - JP #10 + JP RST_10 .error: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 350c84b..d3dd389 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -416,10 +416,10 @@ SETVMOD:;BIT 7,A JR Z,.NOMODE DEC A LD HL,TAB_40x32 - JP Z,T_40_32 + JR Z,T_40_32 DEC A LD HL,TAB_80x32 - JP Z,T_80_32 + JR Z,T_80_32 .NOMODE: POP IX LD A,DSS_Error.sys.INVALID_VIDEO_MODE SCF @@ -460,8 +460,8 @@ GRAPH_NEXT: AND #01 OUT (SCREEN_SWITCH),A LD A,(VMODE) - LD C,#81 - RST #30 + LD C,Dss.Mouse.SetVideoMode + RST ToDSS.Mouse SAFE_PORTY XOR A RET diff --git a/DSS/build.txt b/DSS/build.txt index 0316458..5da127e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -503 \ No newline at end of file +507 \ No newline at end of file diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index 6fcd0a2..c6487a3 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -151,12 +151,17 @@ RUN_EXT: ex de,hl ; A839D: ld bc,0*256 + Dss.Exec ; загр. и выполнить программу RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 + + ;[x] 01/11/23 ;!TEST + PUSH AF + CALL RESTORE_ALL + POP AF + ; + ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; + ld hl,(D8374) cp DSS_Error.sys.FILE_NOT_FOUND jr nz,A83DD @@ -197,10 +202,13 @@ A83B7: ld e,b ; hl=имя файла A83D7: ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 + + ;[x] 01/11/23 ;!TEST + PUSH AF + CALL RESTORE_ALL + POP AF ; + ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; @@ -215,4 +223,23 @@ Ret_New_Line: XOR A OR E RET Z - jp newline \ No newline at end of file + jp newline + +RESTORE_ALL: + ;[x] 01/11/23 ;!TEST + CALL save_disk_path + ; + LD A,(screen_path) + SUB 'A' + LD C,Dss.ChDisk + RST ToDSS + ; + LD HL,system_path + LD C,Dss.ChDir + RST ToDSS + ; + ;R10 + CALL Restore_Screen + ;R10 + ; + RET \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 9f72858..bd753cc 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -88 \ No newline at end of file +94 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 3744776..a15861c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 374477690571809e7318bd4279bc7da120b6c492 +Subproject commit a15861c07cab60eaf09c28226d0c7761b4fd8235 From 8d824dcc3cb048c59b0f171fc856d62416b66aa1 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 5 Nov 2023 01:15:01 +1000 Subject: [PATCH 050/219] ... --- DSS/DSS-MAIN.ASM | 2 +- Shared_Includes | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 8c67153..7d5b25e 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -376,7 +376,7 @@ GO_ZERO EQU #0000 ;FUNCTION ADDRESS ARRAY ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: -; 0 1 2 3 4 5 6 7 8 9 DEC HEX +; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURRDSK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D diff --git a/Shared_Includes b/Shared_Includes index a15861c..8c5550f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a15861c07cab60eaf09c28226d0c7761b4fd8235 +Subproject commit 8c5550f810d173790e4665d610328b9247b00f02 From 5c283a4d7fc1ad0b092653b3099877e4febc6a16 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 5 Nov 2023 02:24:19 +1000 Subject: [PATCH 051/219] -bug in ERROR_BOOTDRV_DIES --- DSS/Media_drivers/ReScanDRV.ASM | 6 +++--- DSS/build.txt | 2 +- Shared_Includes | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index dd97687..b62d351 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -276,11 +276,11 @@ Find_Record: ;-----------------------[] ERROR_BOOTDRV_DIES: - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S - LD E,0 + LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default + LD E,1 RST ToBIOS ; - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + LD BC,256*COLORS.CGA.INC.BLUE + BIOS.LP_CLS_WIN LD DE,0 LD HL,#2050 RST ToBIOS diff --git a/DSS/build.txt b/DSS/build.txt index 5da127e..1dd3380 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -507 \ No newline at end of file +516 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 8c5550f..a8a109e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 8c5550f810d173790e4665d610328b9247b00f02 +Subproject commit a8a109eb8f4ee85e47d65911e8a0f2d2f5b71db1 From fed7066721594d24ff31f5796f88b25ba5c303e7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 8 Nov 2023 20:36:22 +1000 Subject: [PATCH 052/219] some optimization --- DSS/DOS5.ASM | 47 ++++++++++++++++++++++---------------------- DSS/DOS_FM.ASM | 2 +- DSS/EXECUTE.ASM | 32 +++++++++++++++--------------- DSS/VIDEO.ASM | 30 ++++++++++++++-------------- DSS/build.txt | 2 +- SHELL/SHELL_EXEC.ASM | 1 - Shared_Includes | 2 +- 7 files changed, 58 insertions(+), 58 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 87656a3..d7f66e3 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -29,7 +29,7 @@ ; B = 1 SET ATTRIB ; OUTPUT: A - ATTRIB //////////////////////////////////////////////////////////////////////// -ATTRIB: ;!Test Current Dir ;[x] 15/10/23 +ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD C,A PUSH HL PUSH BC @@ -98,7 +98,7 @@ ATTRIB: ;!Test Current Dir ;[x] 15/10/23 ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE: ;!Test Current Dir ;[x] 15/10/23 +CREATE: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL @@ -112,7 +112,7 @@ CREATE: ;!Test Current Dir ;[x] 15/10/23 ; ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -.NEW: ;!Test Current Dir ;[x] 15/10/23 +.NEW: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL @@ -179,7 +179,7 @@ CREAT_N EQU CREATE.NEW ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// DEL_FN: ;!TEST - ;!Test Current Dir ;[x] 15/10/23 + ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL @@ -240,7 +240,7 @@ DELETE: SET_PAGE_X DIRPAGE ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// RENAME: - ;!Test Current Dir + ;!TEST Current Dir ;[x] 15/10/23 PUSH HL PUSH DE CALL DIR_PATH_CHECK.forceCheck @@ -307,7 +307,7 @@ RENAME: ; выход: A - дескриптор файла, если CF=0 ; код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -OPEN_FN:;!Test Current Dir ;[x] 15/10/23 +OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD C,A PUSH HL PUSH BC @@ -433,25 +433,26 @@ CLOSE: LD (F_FIRST.ACCESS),A ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// F_FIRST: - ;!Test Current Dir - LD C,A - PUSH HL - PUSH DE - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP DE - POP HL - RET C - LD A,C - ; - - + ; Current Dir [x] 15/10/23 + ; LD C,A + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; CALL DIR_PATH_CHECK + ; POP BC + ; POP DE + ; POP HL + ; RET C + ; LD A,C + ; ; LD (.ACCESS),A LD (.DTABUF),DE LD A,B LD (.FNDMODE),A PUSH HL + ;!TEST Current Dir ;[x] 15/10/23 + CALL DIR_PATH_CHECK + ; CALL LOADDIR POP HL CALL GETWORD @@ -848,7 +849,7 @@ PUT_D_T: ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 //////////////////////////////////////////////////////////////////////// CHDIR_FN: - ;!Test Current Dir ;[x] 15/10/23 + ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL @@ -872,7 +873,7 @@ CHDIR: CALL GETWORD ; ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// -MKDIR: ;!Test Current Dir ;[x] 15/10/23 +MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD C,A PUSH HL PUSH BC @@ -1046,7 +1047,7 @@ MKDIR: ;!Test Current Dir ;[x] 15/10/23 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// -RMDIR: ;!Test Current Dir ;[x] 15/10/23 +RMDIR: ;!TEST Current Dir ;[x] 15/10/23 LD C,A PUSH HL PUSH BC diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e7105c0..95debd3 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -73,7 +73,7 @@ RES_FM: _mFM_FIND LD A,DSS_Error.sys.INVALID_HANDLE - EXX + ;EXX SCF RET Z XOR A diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index d8d42fe..8cbc0b5 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -21,6 +21,15 @@ ;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE ;--------------------------------------------------------------- + MACRO _mINCTASK + LD HL,TASK ;R08 + INC (HL) ;R08 + ENDM + ; + MACRO _mDECTASK + LD HL,TASK ;R08 + DEC (HL) ;R08 + ENDM ////////////////////////////////////////////////////////////////////// ; !FIXIT тут одни затупы и дебилизм @@ -779,14 +788,6 @@ PATH_PNT_ARRAY EQU #FC80 TMP_CURDIR EQU #FD00 ENVTEMP EQU #FE00 -INCTASK: LD HL,TASK ;R08 - INC (HL) ;R08 - RET ;R08 - -DECTASK: LD HL,TASK ;R08 - DEC (HL) ;R08 - RET ;R08 - ;///////////////////////////////////////////////////////////////////// ; Функция #40. Выполнить файл. @@ -852,10 +853,10 @@ EXEC_1: LD (CMDLINE),HL CALL TST_EXT LD A,DSS_Error.sys.FILE_NOT_FOUND RET C - CALL INCTASK ;R08 + _mINCTASK ;R08 CALL OPEN.FILE JR NC,.noError - CALL DECTASK ;R08 + _mDECTASK ;R08 AND A RET ; @@ -996,7 +997,7 @@ ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY ERREXE: PUSH AF LD A,(EXE_FM) CALL CLOSE - CALL DECTASK + _mDECTASK POP AF RET @@ -1046,7 +1047,7 @@ _TST_PROC: IN A,(SLOT1) PUSH DE PUSH AF - ;!Test close EXE FM [x] 25/10/23 + ;[x] 25/10/23 close EXE FM LD A,(EXE_FM) PUSH AF ; @@ -1131,7 +1132,7 @@ _TST_PROC_2: LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE PUSH HL - ;!Test Current Dir ;[x] 15/10/23 + ;!TEST Current Dir ;[x] 15/10/23 PUSH IX LD HL,CurrentDirectory CALL CHDIR_FN @@ -1158,12 +1159,11 @@ _TST_PROC_2: LEAVE: LD A,B LD (ERLEVEL),A CALL LEAVMEM - ;CALL DECTASK ;!Test close EXE FM [x] 25/10/23 LD SP,(EXSTACK) - ;!Test close EXE FM [x] 25/10/23 + ;[x] 25/10/23 close EXE FM POP AF CALL RES_FM - CALL DECTASK + _mDECTASK ; POP AF POP HL diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index d3dd389..ca42338 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -261,7 +261,7 @@ WINREST: AND A ; выход: нет ;///////////////////////////////////////////////////////////////////// SCROLL: DJNZ SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее - ; [x] 04/04/23 + ;[x] 04/04/23 ;LD B,A ;LD C,H ;PUSH BC @@ -274,21 +274,21 @@ SCROLL: DJNZ SCR_DW ;!TODO INC D DEC H LD C,BIOS.WIN_MOVE - ; [x] 29/9/23 + ;[x] 29/9/23 LD A,R PUSH AF ; XOR A - DI ; [x] 29/9/23 + DI ;[x] 29/9/23 RST ToBIOS - ; [x] 29/9/23 + ;[x] 29/9/23 POP AF JP PO,1F EI 1: ; POP HL POP DE - ; [x] 04/04/23 + ;[x] 04/04/23 ;POP BC POP AF ;XOR A @@ -312,7 +312,7 @@ SCROLL: DJNZ SCR_DW ;!TODO RET SCR_DW: DJNZ SCR_ERR - ; [x] 04/04/23 + ;[x] 04/04/23 ;LD B,A ;LD C,H ;PUSH BC @@ -325,12 +325,12 @@ SCR_DW: DJNZ SCR_ERR INC XH DEC H LD C,BIOS.WIN_MOVE - ; [x] 29/9/23 + ;[x] 29/9/23 LD A,R PUSH AF ; XOR A - DI ; [x] 29/9/23 + DI ;[x] 29/9/23 RST ToBIOS ; [x] 29/9/23 POP AF @@ -339,7 +339,7 @@ SCR_DW: DJNZ SCR_ERR 1: ; POP HL POP DE - ; [x] 29/9/23 + ;[x] 29/9/23 ;POP BC POP AF ;XOR A @@ -632,14 +632,14 @@ SVTEXT1 LD (SVHL1),HL LD A,(BANKTBL+TXTPAGE) LD B,A LD C,BIOS.WIN_COPY - ; [x] 29/9/23 + ;[x] 29/9/23 LD A,R PUSH AF ; XOR A DI RST ToBIOS - ; [x] 29/9/23 + ;[x] 29/9/23 POP AF JP PO,1F EI @@ -670,14 +670,14 @@ SVHL1+1: LD A,(BANKTBL+TXTPAGE) LD B,A LD C,BIOS.WIN_RESTORE - ; [x] 29/9/23 + ;[x] 29/9/23 LD A,R PUSH AF ; XOR A DI RST ToBIOS - ; [x] 29/9/23 + ;[x] 29/9/23 POP AF JP PO,1F EI @@ -755,7 +755,7 @@ PRINT_INIT: LD A,#CF ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан) LD BC,LPT2_C OUT (C),A - ; [x] 29/9/23 + ;[x] 29/9/23 ;LD A,#63 LD A,63 ; @@ -768,7 +768,7 @@ PRINT_INIT: ; клава XOR A ;LD A,0 OUT (COM_A),A - ; [x] 29/9/23 + ;[x] 29/9/23 INC A OUT (COM_A),A DEC A diff --git a/DSS/build.txt b/DSS/build.txt index 1dd3380..8db1e5f 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -516 \ No newline at end of file +522 \ No newline at end of file diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index c6487a3..a8be837 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -157,7 +157,6 @@ A839D: ld bc,0*256 + Dss.Exec ; CALL RESTORE_ALL POP AF ; - ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; diff --git a/Shared_Includes b/Shared_Includes index a8a109e..4c835d3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a8a109eb8f4ee85e47d65911e8a0f2d2f5b71db1 +Subproject commit 4c835d305fd5d1bc296039706d5e163c1f2224ca From 59a72bf0847200a6ab8edcf7f5a04f24fa0308c3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 11 Nov 2023 00:26:36 +1000 Subject: [PATCH 053/219] ... --- DSS/DOS5.ASM | 118 +++++++++++++++++++++++++++------------------ DSS/DOS_FM.ASM | 91 ++++++++++++++++++++-------------- DSS/EXECUTE.ASM | 56 ++++++++++++--------- DSS/Structures.inc | 27 +++++++---- DSS/build.txt | 2 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 7 files changed, 181 insertions(+), 117 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index d7f66e3..028aa57 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -78,7 +78,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET ;R02 .OPENATR: - LD (F_FIRST.ACCESS),A ; раб. ячейка (здесь атрибут записи) + LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME @@ -130,7 +130,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 LD BC,11 LDIR EX DE,HL - LD A,(F_FIRST.ACCESS) +.TMP+1: LD A,0 LD (HL),A INC HL LD BC,#0A00 ;!HARDCODE @@ -165,7 +165,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 JP OPEN ;R08 .Prepare: AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (F_FIRST.ACCESS),A + LD (.TMP),A LD (.PATH0),HL CALL GETWORD RET C @@ -318,17 +318,17 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD A,C ; ;R08 -OPEN: LD (F_FIRST.ACCESS),A +OPEN: LD (.TMP),A ; enter point for CREATE CALL GETWORD RET C LD HL,TMPNAME LD DE,MASKARE CALL MASK RET C -.FILE: CALL SEARCH +.FILE: CALL SEARCH ; enter point for EXEC RET C ;R02 -.FM: CALL GET_FM +.FM: CALL GET_FM ; enter point for ATTRIB RET C LD A,C EX AF,AF' @@ -341,11 +341,17 @@ OPEN: LD (F_FIRST.ACCESS),A LD HL,HANDBUF LD BC,HANDBUF.SIZE LDIR - LD A,(F_FIRST.ACCESS) +.TMP+1: LD A,0 LD (IY+_sFM.ACCESS_MODE),A LD A,(TASK) LD (IY+_sFM.TASK_NUM),A XOR A + ; + LD (IY+_sFM.KnownCluster_L),A + LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownOffset_L),A + LD (IY+_sFM.KnownOffset_H),A + ; LD (IY+_sFM.F_POSITION),A LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+2),A @@ -371,7 +377,7 @@ OPEN: LD (F_FIRST.ACCESS),A //////////////////////////////////////////////////////////////////////// CLOSE_FN: ;R08 -CLOSE: LD (F_FIRST.ACCESS),A +CLOSE: LD (.TMP),A CALL SET_FM RET C LD A,(TASK) @@ -390,20 +396,25 @@ CLOSE: LD (F_FIRST.ACCESS),A LD (IY+_sFM.DIR_CLUSTER),D LD (IY+_sFM.DIR_CLUSTER+1),E CALL LOADDIR - LD A,(F_FIRST.ACCESS) +.TMP+1: LD A,0 CALL SET_FM - LD HL,DIR - LD DE,#0020 - LD C,(IY+_sFM.HANDLE) - LD B,(IY+_sFM.HANDLE+1) - JR .CLOSE2 -.CLOSE1: - ADD HL,DE - DEC BC -.CLOSE2: - LD A,B - OR C - JR NZ,.CLOSE1 + ; + ;TEST 9/11/23 + ; LD HL,DIR + ; LD DE,#0020 + ; LD C,(IY+_sFM.HANDLE) + ; LD B,(IY+_sFM.HANDLE+1) + ; JR .CLOSE2 + ; .CLOSE1: + ; ADD HL,DE + ; DEC BC + ; .CLOSE2: + ; LD A,B + ; OR C + ; JR NZ,.CLOSE1 + LD L,(IY+_sFM.HANDLE) + LD H,(IY+_sFM.HANDLE+1) + ; LD D,YH LD E,YL EX DE,HL @@ -417,7 +428,7 @@ CLOSE: LD (F_FIRST.ACCESS),A OUT (SLOT3),A CALL SAVEDIR .NOTMODF: - LD A,(F_FIRST.ACCESS) + LD A,(.TMP) CALL RES_FM RET @@ -445,7 +456,7 @@ F_FIRST: ; RET C ; LD A,C ; ; - LD (.ACCESS),A + LD (.TMP),A LD (.DTABUF),DE LD A,B LD (.FNDMODE),A @@ -461,8 +472,7 @@ F_FIRST: LD DE,MASKARE CALL MASK RET C -.ACCESS+1: - LD A,0 + LD A,(.TMP) CALL SEARCH.ASEARCH RET C LD HL,MASKARE @@ -470,7 +480,7 @@ F_FIRST: LD DE,0 LD BC,11 ;!HARDCODE LDIR - LD A,(.ACCESS) +.TMP+1: LD A,0 LD (DE),A .FIND_S: INC DE @@ -538,10 +548,11 @@ F_NEXT: EX AF,AF' CPL LD C,A - - EXX - LD DE,0 - EXX + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; .CURHND+2: LD IX,0 LD A,XH @@ -1339,10 +1350,11 @@ WRT_HND: PUSH AF LD IX,DIR - EXX - LD DE,0 - EXX - ; + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; .loop: LD A,(IX+00) OR A JR Z,.WRT_HN2 @@ -1430,20 +1442,23 @@ DSEARCH: ;----------------------------------------------------------------------; +;OUT: DE' - порядковый номер FM SEARCH: LD A,FAT_ATTR.NoDIRnoVolID .ASEARCH: - EX AF,AF' ; 76ADLSHR - + ; A = 76ADLSHR + EX AF,AF' SET_PAGE_X DIRPAGE - PUSH AF EX AF,AF' + ; CPL LD C,A LD IX,DIR - EXX - LD DE,0 - EXX + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; .SEARCH1: LD A,(IX+00) OR A @@ -1468,8 +1483,16 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID INC HL INC DE DJNZ .SEARCH2 - LD D,XH - LD E,XL + ;!TEST 9/11/23 + ; LD D,XH + ; LD E,XL + LD D,XH + LD E,XL + EXX + LD D,XH + LD E,XL + EXX + ; LD HL,HANDBUF EX DE,HL LD BC,HANDBUF.SIZE @@ -1479,12 +1502,14 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID AND A RET .SEARCH3: - EXX - INC DE - EXX + ;!TEST 9/11/23 + ; EXX + ; INC DE + ; EXX + ; LD DE,#0020 ;!HARDCODE ADD IX,DE - JR NC,SEARCH.SEARCH1 + JR NC,.SEARCH1 .error: POP AF OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR @@ -2143,6 +2168,7 @@ HANDBUF: BLOCK HANDBUF.SIZE,0 MASKARE: BLOCK 8,0 ; имя файла BLOCK 3,0 ; расш. BLOCK 21,0 ; 11+21=32 +;TMP_BYTE: DB 0 ; ACCESS: ; ;PATH0: DW #0000 diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 95debd3..bbd5489 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -59,19 +59,18 @@ FM_BUF: _sFM ; A=0 OR (IY) ;+00 NAME ENDM +//////////////////////////////////////////////////////////////////////// -SET_FM: - _mFM_FIND - LD A,DSS_Error.sys.NO_ERROR +SET_FM: _mFM_FIND + LD A,DSS_Error.sys.NO_ERROR RET NZ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE SCF RET -RES_FM: - _mFM_FIND +RES_FM: _mFM_FIND LD A,DSS_Error.sys.INVALID_HANDLE ;EXX SCF @@ -79,7 +78,7 @@ RES_FM: XOR A LD (IY+0),A RET - +; GET_FM: LD B,FMCOUNT LD C,#FF LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size @@ -93,6 +92,29 @@ GET_FM: LD B,FMCOUNT LD A,DSS_Error.sys.NO_HANDLES SCF RET +/* + ;!TEST CHECK LOCKING 10/11/2023 +GET_FM: LD IY,0 + LD (.freeHandle),IY + ; + LD B,FMCOUNT + LD C,#FF + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size +.loop: ADD IY,DE + INC C + ; CHECK LOCKING + + ; +.cont: LD A,(IY+0) + OR A + RET Z + DJNZ .loop + LD A,DSS_Error.sys.NO_HANDLES + SCF + RET +*/ + ; HL:IX - OFFSET POINTER ; A - FILE MANIPULATOR @@ -157,7 +179,7 @@ MOVE_CP: ;-------------------- ECL2: - ;!TEST SAVE CLUSTER AFTER READ + ;[x] SAVE CLUSTER AFTER READ ;!TEST POP BC ; POP BC @@ -188,15 +210,15 @@ BLOK_RD: PUSH BC LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L - ;!TEST SAVE CLUSTER AFTER READ + ;[x] SAVE CLUSTER AFTER READ ;!TEST ;JR NZ,BLOKRD2 PUSH BC - JR NZ,.testFunc + JR NZ,.saveClustersOffset ; JP ECL2 ;R01 JR BLOKRD0 -.testFunc: - ;!TEST SAVE CLUSTER AFTER READ +.saveClustersOffset: + ;[x] SAVE CLUSTER AFTER READ ;!TEST LD E,(IY+_sFM.KnownCluster_L) LD D,(IY+_sFM.KnownCluster_H) LD A,D @@ -225,14 +247,14 @@ BLOK_RD: PUSH BC EX DE,HL JP BLOKRD2 - ; .noOptimization_1: - POP BC + POP BC .noOptimization_2: - POP HL - POP DE - JP BLOKRD2 - + POP HL + POP DE + JP BLOKRD2 + ; + BLOKRD1: PUSH BC CALL R_F_FAT @@ -245,7 +267,7 @@ BLOKRD2: OR C JR NZ,BLOKRD1 - ;!TEST SAVE CLUSTER AFTER READ + ;[x] SAVE CLUSTER AFTER READ ;!TEST LD (IY+_sFM.KnownCluster_L),L LD (IY+_sFM.KnownCluster_H),H POP BC @@ -332,7 +354,7 @@ ECL1 AND A BLOKWRC: POP BC - ;!TEST SAVE CLUSTER AFTER WRITE + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST POP BC ; BLOKWR0 POP BC @@ -358,10 +380,10 @@ BLOK_WR PUSH BC LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L - ;!TEST SAVE CLUSTER AFTER WRITE + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST ;JR NZ,BLOKWR2 PUSH BC - JR NZ,.testFunc + JR NZ,.saveClustersOffset ; PUSH BC CALL G_CLUST @@ -376,14 +398,14 @@ BLOK_WR PUSH BC POP BC JP BLOKWR2 -.testFunc: - ;!TEST SAVE CLUSTER AFTER WRITE +.saveClustersOffset: + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST LD E,(IY+_sFM.KnownCluster_L) LD D,(IY+_sFM.KnownCluster_H) LD A,D OR E JR Z,BLOKWR2 - + ; PUSH DE PUSH HL PUSH BC @@ -392,27 +414,26 @@ BLOK_WR PUSH BC LD A,D OR E JR Z,.noOptimization_1 - + ; POP HL AND A SBC HL,DE JR C,.noOptimization_2 - + ; LD C,L LD B,H POP HL POP DE - - + ; EX DE,HL JP BLOKWR2 - ; .noOptimization_1: - POP BC + POP BC .noOptimization_2: - POP HL - POP DE - JP BLOKWR2 + POP HL + POP DE + JP BLOKWR2 + ; BLOKWR1 PUSH BC @@ -430,7 +451,7 @@ BLOKWR2 LD A,B OR C JR NZ,BLOKWR1 - ;!TEST SAVE CLUSTER AFTER WRITE + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST LD (IY+_sFM.KnownCluster_L),L LD (IY+_sFM.KnownCluster_H),H POP BC @@ -735,7 +756,7 @@ WRITE: LD (R_POINT),HL CALL SET_FM JP C,PWERR1 LD A,(IY+_sFM.ACCESS_MODE) - AND #01 + AND FAT_ATTR.READ_ONLY JR NZ,RD_ONLY SET 7,(IY+_sFM.ACCESS_MODE) SET 5,(IY+_sFM.ATTRIBUT) diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 8cbc0b5..c14bcca 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -822,7 +822,8 @@ ENVTEMP EQU #FE00 ; +00 1 db ? ; Длина ком-строки ; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем ;///////////////////////////////////////////////////////////////////// -EXEC: INC B ;R03 +EXEC: LD (CMDLINE),HL + INC B ;R03 DEC B ;R03 JR Z,.VAR_1 ;R03 DEC B ;R03 @@ -831,19 +832,19 @@ EXEC: INC B ;R03 SCF ;R03 RET ;R03 ; -.VAR_1: LD (CMDLINE),HL +.VAR_1: ;LD (CMDLINE),HL CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME - LD HL,(CMDLINE) + ;LD HL,(CMDLINE) JR C,EXEC0_SHORT .VAR_2: CALL EXEC_1 SCF RET ; File not found - exit - ; при выходе с ошибкой, в регистре А - код ошибки -EXEC_1: LD (CMDLINE),HL - LD A,#01 ; %7600000R = !FAT_ATTR ;!HARDCODE - LD (F_FIRST.ACCESS),A +EXEC_1: ;LD (CMDLINE),HL + LD HL,(CMDLINE) + LD A,FAT_ATTR.READ_ONLY + LD (OPEN.TMP),A CALL GETWORD RET C LD HL,TMPNAME @@ -853,16 +854,22 @@ EXEC_1: LD (CMDLINE),HL CALL TST_EXT LD A,DSS_Error.sys.FILE_NOT_FOUND RET C - _mINCTASK ;R08 + _mINCTASK ;R08 CALL OPEN.FILE - JR NC,.noError - _mDECTASK ;R08 - AND A - RET - ; -.noError: + JR C,.Error POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM +.Error: _mDECTASK ;R08 + AND A + RET +; JR NC,.noError +; _mDECTASK ;R08 +; AND A +; RET +; ; +; .noError: +; POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру +; JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM ;SHORT NAME @@ -871,7 +878,7 @@ EXEC0_SHORT: CALL EXEC_1 RET C - ;FILE NO FOUND, SEARCHING IN PATH + ;FILE NOT FOUND, SEARCHING IN PATH ; GET PATH AND ETC. LD HL,ENVPATH LD DE,ENVTEMP @@ -960,8 +967,10 @@ _RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла - LD A,(EXE_FM) ; дескр. файла - CALL CLOSE ; закрыть файл + ;!TEST ;[x] no close source EXE file before start 08/11/23 + ; LD A,(EXE_FM) ; дескр. файла + ; CALL CLOSE ; закрыть файл + ; JP _TST_PROC_2 RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN @@ -997,7 +1006,7 @@ ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY ERREXE: PUSH AF LD A,(EXE_FM) CALL CLOSE - _mDECTASK + _mDECTASK POP AF RET @@ -1111,7 +1120,7 @@ FRC000: LD A,(DE) LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) - LD B,Dss.Move_FP.FrStart + LD B,high Dss.Move_FP.FrStart LD A,(EXE_FM) CALL MOVE_FP ;R02 @@ -1162,8 +1171,9 @@ LEAVE: LD A,B LD SP,(EXSTACK) ;[x] 25/10/23 close EXE FM POP AF - CALL RES_FM - _mDECTASK + ;CALL RES_FM + CALL CLOSE + _mDECTASK ; POP AF POP HL @@ -1198,9 +1208,7 @@ WAIT: LD A,(ERLEVEL) RET ;///////////////////////////////////////////////////////////////////// - - -;!TODO заменить тут CALL CURRDIR и CALL CURRDSK на другое, когда будет сохраняться current dir +; M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) DEC H LD D,H diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 520fab2..fcf1d4d 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -21,28 +21,37 @@ RESERVED2 BLOCK 490,0 ; ;File Manipulator (FM) - STRUCT _sFM ; 44 bytes + STRUCT _sFM ; 47 bytes + ; from FAT .NAME: TEXT 8,{". "," "} ;+00 NAME .EXT: TEXT 3,{" "," "} ;+08 EXT .ATTRIBUT: BYTE #10 ;+11 ATTRIBUT -.KnownCluster_L: BYTE 0 ;+12 Младший байт номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: BYTE 0 ;+13 Старший байт номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: BYTE 0 ;+14 Младший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: BYTE 0 ;+15 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.RESERVED_X: BLOCK 6,0 ;+16 RESERVED +.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 #0000 ;+28 SIZE FILE -.F_POSITION: DWORD #0000 ;+32 FILE POSITION (FP) +.F_SIZE: DWORD #00000000 ;+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 +;.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 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS ; + +; ; NAM EQU 0 ; LEN4 EQU 31 ; EXT EQU 8 ; POS1 EQU 32 ; ATR EQU 11 ; POS2 EQU 33 diff --git a/DSS/build.txt b/DSS/build.txt index 8db1e5f..d759b56 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -522 \ No newline at end of file +537 \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index bd753cc..56749c8 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -94 \ No newline at end of file +96 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 4c835d3..8641b77 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4c835d305fd5d1bc296039706d5e163c1f2224ca +Subproject commit 8641b77d8ebe42ae042bb8df3902300e678048eb From c37fdf343c82d1c41e0ca2b5b26e1440f91277f7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 14 Nov 2023 04:30:26 +1000 Subject: [PATCH 054/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 8 +- DSS/CHANGES.LOG | 17 +-- DSS/DOS5.ASM | 170 +++++++++++++++++++++------ DSS/DOS_FM.ASM | 252 +++++++++++++++++++++------------------- DSS/EXECUTE.ASM | 2 +- DSS/FAT_X.ASM | 54 +++++---- DSS/Structures.inc | 48 ++++---- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/BATCH.ASM | 2 +- SHELL/Commands/PATH.ASM | 4 +- SHELL/Commands/SET.ASM | 4 +- Shared_Includes | 2 +- 13 files changed, 344 insertions(+), 223 deletions(-) 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 From 34ee5a9db84e9eacd2fd2ab18570dae66465e63a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 15 Nov 2023 02:43:58 +1000 Subject: [PATCH 055/219] =?UTF-8?q?-bug:=20CLOSE=5FFN=20=D0=BC=D0=BE=D0=B3?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D1=82=D0=B5=D1=80=D1=8F?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D1=8B=20=D0=B8=20=D0=B7=D0=B0=D0=BF=D0=B0=D1=80=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B.=20?= =?UTF-8?q?=D0=98=20=D0=BA=D1=83=D1=87=D0=B0=20=D0=BC=D0=B5=D0=BB=D0=BA?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BA=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BE=D0=B4=D0=BD=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/CHANGES.LOG | 11 +- DSS/DOS5.ASM | 400 +++++++++++++++++++------------------------ DSS/DOS_FM.ASM | 8 +- DSS/DOS_X.ASM | 140 +++++++-------- DSS/DSS_MACROSES.Z80 | 51 +++--- DSS/EXECUTE.ASM | 33 ++-- DSS/FAT_X.ASM | 14 +- DSS/INTMOUSE.ASM | 9 +- DSS/KEYINTER.ASM | 50 +++--- DSS/build.txt | 2 +- DSS/defines.inc | 18 +- 11 files changed, 340 insertions(+), 396 deletions(-) diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index 2256ee4..0b235c9 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -1,3 +1,12 @@ +!FIXIT +[ ] D:\>copy dss\system.dos c:\system.dos + Can't open source file +[ ] E:\BIN\MENU>c:\dss + что-то про заполненность директории +[ ] C:\????? или ????? + исполняется как команда + +----------------------------------------------------------------------------------------------------------------------------------------------- !TODO Важное: [ ] перед началом работы любой процедуры записи/чтения драйва устанавливать флаг, чтоб не было повторного вызова (из прерывания, например) @@ -8,7 +17,7 @@ Вообще не важное: [ ] исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255 -------------------------------- +----------------------------------------------------------------------------------------------------------------------------------------------- DSS 1.70.2 Изменения после версии 1.70 diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index f2ebd7c..dc0721a 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -81,12 +81,12 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C LD A,FAT_ATTR.NoVolID - CALL SEARCH.ASEARCH + CALL SEARCH.Custom ; JR NC,OPENAT ; на поиск своб. дескриптора ; ; запись не найдена ; RET @@ -106,7 +106,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; CALL .Prepare RET C - CALL SEARCH + CALL SEARCH.File CALL NC,DELETE ;FILE EXIST RECREAT JR .DO ; @@ -120,7 +120,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; CALL .Prepare RET C - CALL SEARCH + CALL SEARCH.File LD A,DSS_Error.sys.FILE_EXISTS CCF RET C @@ -158,19 +158,21 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 DJNZ .loop2 ; CALL WRT_HND - CALL SAVEDIR + RET C + ;CALL SAVEDIR .PATH0+1: LD HL,0 XOR A - JP OPEN ;R08 + LD (OPEN.TMP),A + JP OPEN.FILE ;R08 .Prepare: - AND #E7 ;R04 %76A00SHR = !FAT_ATTR + AND #E7 ;R04 %76A00SHR = !FAT_ATTR ;!HARDCODE LD (.TMP),A LD (.PATH0),HL CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE JP MASK CREAT_N EQU CREATE.NEW @@ -187,8 +189,8 @@ DEL_FN: ;!TEST ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C ; @@ -203,7 +205,7 @@ DEL_FN: ;!TEST SCF RET Z CALL LOADDIR - CALL SEARCH + CALL SEARCH.File RET C ;JP DELETE ; пометить запись как "удаленная" @@ -239,19 +241,17 @@ DELETE: SET_PAGE_X DIRPAGE ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -RENAME: - ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - PUSH DE - CALL DIR_PATH_CHECK.forceCheck - POP DE - POP HL - RET C - ; - +RENAME: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + PUSH DE + CALL DIR_PATH_CHECK.forceCheck + POP DE + POP HL + RET C + ; PUSH DE - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name POP DE RET C LD HL,MASKARE @@ -265,11 +265,11 @@ RENAME: CALL LOADDIR ; прочитать список каталога ;LD A,#33 LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.ASEARCH ; поиск записи в списке диска + CALL SEARCH.Custom ; поиск записи в списке диска POP HL RET C - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name RET C LD HL,MASKARE LD BC,11 @@ -280,7 +280,7 @@ RENAME: RET Z PUSH IX LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.ASEARCH ; поиск записи в списке диска + CALL SEARCH.Custom ; поиск записи в списке диска POP IX LD A,DSS_Error.sys.FILE_EXISTS CCF @@ -304,8 +304,8 @@ RENAME: ; A=0 чтение/запись ; A=1 чтение ; A=2 запись -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 +; выход: CF=0, A - дескриптор файла. +; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD C,A @@ -322,22 +322,14 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 OPEN: LD (.TMP),A ; enter point for CREATE CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C -.FILE: CALL SEARCH ; enter point for EXEC +.FILE: CALL SEARCH.File ; enter point for EXEC RET C ;R02 -.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 +.FM: CALL GET_FM ; enter point for ATTRIB RET C LD A,C EX AF,AF' @@ -396,25 +388,28 @@ CLOSE: LD (.TMP),A RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) JR Z,.NOTMODF - LD D,(IY+_sFM.DIR_CLUSTER) - LD E,(IY+_sFM.DIR_CLUSTER+1) + LD E,(IY+_sFM.DIR_CLUSTER) + LD D,(IY+_sFM.DIR_CLUSTER+1) PUSH DE - ; [ ] 13/11/2023 -bug with bad clusters ;!TEST + ; [ ] 15/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 - LD (IY+_sFM.DIR_CLUSTER),D - LD (IY+_sFM.DIR_CLUSTER+1),E + LD (IY+_sFM.DIR_CLUSTER),E + LD (IY+_sFM.DIR_CLUSTER+1),D + ; [ ] 15/11/2023 -bug with bad clusters ;!TEST + LD (IY+_sFM.ST_CLUSTER),E + LD (IY+_sFM.ST_CLUSTER+1),D + ; CALL LOADDIR .TMP+1: LD A,0 CALL SET_FM ; + SET_PAGE_X DIRPAGE + ; ;TEST 9/11/23 ; LD HL,DIR ; LD DE,#0020 @@ -434,12 +429,10 @@ CLOSE: LD (.TMP),A LD D,YH LD E,YL EX DE,HL - PUSH HL - - SET_PAGE_X DIRPAGE - - POP HL - LD BC,#0020 + ;PUSH HL + ;SET_PAGE_X DIRPAGE + ;POP HL + LD BC,#0020 ;!HARDCODE LDIR OUT (SLOT3),A CALL SAVEDIR @@ -484,12 +477,12 @@ F_FIRST: POP HL CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C LD A,(.TMP) - CALL SEARCH.ASEARCH + CALL SEARCH.Custom RET C LD HL,MASKARE .DTABUF+1: @@ -573,8 +566,8 @@ F_NEXT: LD IX,0 LD A,XH OR XL - JP Z,SEARCH.error - JP SEARCH.SEARCH1 + JP Z,SEARCH.error_too_many_files + JP SEARCH.loop //////////////////////////////////////////////////////////////////////// ; @@ -926,18 +919,18 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; .START: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME ; 8.3 имя - LD DE,MASKARE ; буфер имени 11 симв. формата + ;LD HL,TMPNAME ; 8.3 имя + ;LD DE,MASKARE ; буфер имени 11 симв. формата CALL MASK ; преобр. имя 8.3 -> 11 формат RET C ;!TEST optimization ранее GETWORD уже загрузил директорию ;CALL LOADDIR ; прочитать список каталога ; - CALL DSEARCH ; поиск записи каталога в списке диска + CALL SEARCH.Dir ; поиск записи каталога в списке диска LD A,DSS_Error.sys.DIR_EXISTS CCF RET C ; каталог найден - + ; CALL G_CLUST RET C PUSH HL @@ -953,11 +946,11 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD (HL),A INC HL LD BC,#0A00 ; b=счетчик - + ; .loop1: LD (HL),C INC HL DJNZ .loop1 - + ; PUSH HL CALL SYSTIME ; узнать тек. дату и время CALL MK_TIME ; закодировать время/дату @@ -977,21 +970,21 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD (HL),D INC HL LD BC,#0400 ; b=счетчик - + ; .loop2: LD (HL),C INC HL DJNZ .loop2 - + ; CALL WRT_HND ; скопир. новую запись в список диска (каталога) - CALL SAVEDIR ; сбросить кеш каталога на диск + ;CALL SAVEDIR ; и сбросить кеш каталога на диск LD HL,CORE_BUFFERS.SECBUF ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; b=счетчик, c=пробел - + ; .loop3: INC HL LD (HL),C DJNZ .loop3 - + ; INC HL LD DE,HANDBUF+11 ; ячейка атрибутов файла EX DE,HL @@ -1005,23 +998,14 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 .MKD03: INC HL LD (HL),C DJNZ .MKD03 - + ; INC HL - - ; IF OLD_SET_BANK - ; PUSH HL - ; ENDIF - SET_PAGE_X DIRPAGE - - ; IF OLD_SET_BANK - ; POP HL - ; ENDIF - PUSH AF - LD A,(DIR) + ; + LD A,(DIRPAGE.buffer) CP "." - LD DE,DIR+11 ; атрибуты записи + LD DE,DIRPAGE.buffer+11 ; атрибуты записи ;!HARDCODE JP Z,.MKD04 LD IX,HANDBUF XOR A @@ -1033,7 +1017,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LDIR POP AF OUT (SLOT3),A - + ; EX DE,HL LD D,H LD E,L @@ -1041,7 +1025,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD (HL),0 LD BC,512-65 LDIR ;!FIXIT нужно ли так много грохать? - + ; POP HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер @@ -1052,21 +1036,21 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH AF IN A,(SLOT0) OUT (SLOT3),A -; + ; LD A,(FatBuffer.DRIVE) LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Write RST ToDSS.DRV -; + ; POP AF OUT (SLOT3),A - + ; LD HL,CORE_BUFFERS.SECBUF LD DE,CORE_BUFFERS.SECBUF+1 LD BC,511 LD (HL),0 LDIR ;!FIXIT нужно ли так много грохать? - + ; POP IX POP HL INC IX @@ -1109,8 +1093,8 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; .START: CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C LD HL,MASKARE @@ -1121,7 +1105,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 SCF RET Z CALL LOADDIR - CALL DSEARCH + CALL SEARCH.Dir RET C LD HL,(HANDBUF+_sFM.ST_CLUSTER) PUSH IX @@ -1211,7 +1195,7 @@ DOSNAME: DEC B JP Z,GETNAME DEC B - JP Z,MASK + JP Z,MASK.custom LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET @@ -1382,56 +1366,6 @@ RMKTIME: ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -; скопировать запись в список диска (каталога) -WRT_HND: - SET_PAGE_X DIRPAGE - - PUSH AF - LD IX,DIR - ;TEST 9/11/23 - ; EXX - ; LD DE,0 - ; EXX - ; -.loop: LD A,(IX+00) - OR A - JR Z,.WRT_HN2 - CP #E5 - JR Z,.WRT_HN2 - LD BC,#0020 - ADD IX,BC - JR NC,.loop - ; - POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.ROOT_OVERFLOW - SCF - RET -.WRT_HN2: - LD D,XH - LD E,XL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR - POP AF - OUT (SLOT3),A - LD HL,DIR - LD BC,(SAVEDIR.DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - RET NC - LD HL,(SAVEDIR.DIRSIZE) - LD BC,(FatBuffer.B_P_C) - ADD HL,BC - LD (SAVEDIR.DIRSIZE),HL - AND A - RET -;----------------------------------------------------------------------; - - ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 @@ -1471,57 +1405,54 @@ GETNAME: ; вход: a=атрибут записи ; выход: de'=индекс записи в списке каталога ; CF - каталог не найден -DSEARCH: - LD A,FAT_ATTR.DIRECTORY - CALL SEARCH.ASEARCH +SEARCH: +.Dir: LD A,FAT_ATTR.DIRECTORY + CALL SEARCH.Custom RET NC - LD A,DSS_Error.sys.PATH_NOT_FOUND + CP DSS_Error.sys.PATH_NOT_FOUND + 1 + RET C + ; + SCF + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -;OUT: DE' - порядковый номер FM -SEARCH: LD A,FAT_ATTR.NoDIRnoVolID -.ASEARCH: - ; A = 76ADLSHR - EX AF,AF' + ; +.File: LD A,FAT_ATTR.NoDIRnoVolID +.Custom: EX AF,AF' ; A = 76ADLSHR SET_PAGE_X DIRPAGE PUSH AF EX AF,AF' ; CPL LD C,A - LD IX,DIR + LD IX,DIRPAGE.buffer ;TEST 9/11/23 ; EXX ; LD DE,0 ; EXX ; -.SEARCH1: - LD A,(IX+00) +.loop: LD A,(IX+00) OR A - JR Z,.SEARCH4 + JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.SEARCH3 + JR Z,.next_record LD A,(IX+11) AND C - JR NZ,.SEARCH3 + JR NZ,.next_record LD HL,MASKARE LD D,XH LD E,XL LD B,11 EX DE,HL -.SEARCH2: +.loop_compare: LD A,(DE) CP '?' - JR Z,.SEARCH5 + JR Z,.next_char CP (HL) - JR NZ,.SEARCH3 -.SEARCH5: + JR NZ,.next_record +.next_char: INC HL INC DE - DJNZ .SEARCH2 + DJNZ .loop_compare ;!TEST 9/11/23 ; LD D,XH ; LD E,XL @@ -1540,7 +1471,7 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID OUT (SLOT3),A AND A RET -.SEARCH3: +.next_record: ;!TEST 9/11/23 ; EXX ; INC DE @@ -1548,13 +1479,15 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID ; LD DE,#0020 ;!HARDCODE ADD IX,DE - JR NC,.SEARCH1 -.error: POP AF + JR NC,.loop +.error_too_many_files: + POP AF OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR SCF RET -.SEARCH4: + ; +.error_file_not_found: POP AF OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND @@ -1657,13 +1590,6 @@ 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 @@ -1727,8 +1653,8 @@ OPENDIR: JR NZ,.loop JR .SUBDIR3 .SUBDIR2: - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name RET C .SUBDIR3: CALL FINDDIR @@ -1750,7 +1676,7 @@ FINDDIR: SET_PAGE_X DIRPAGE ; PUSH AF - LD IX,DIR + LD IX,DIRPAGE.buffer .F_01: LD A,(IX+00) OR A JR Z,.error @@ -1888,6 +1814,7 @@ FINDDIR: ;----------------------------------------------------------------------; +; .custom: ; Преобразовать имя 8.3 -> 11 формат ; вход: hl = 8.3 имя ; de = буфер имени 11 симв. формата @@ -1897,7 +1824,9 @@ FINDDIR: ; DE - 11 bytes filename ; RET: C=2 FILE WITHOUT EXTENTION ; C=1 FILE WITH EXTENTION -MASK: PUSH HL +MASK: LD HL,TMPNAME +.name: LD DE,MASKARE +.custom: PUSH HL PUSH DE LD H,D LD L,E @@ -2053,10 +1982,11 @@ LOADDIR: LD A,D OR E JP Z,.LROTDIR ; root ?? - LD HL,DIR ; куда + LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько XOR A ; дескриптор CALL READ ; чтение из файла + ;!FIXIT проверка на ошибку LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов POP AF OUT (SLOT3),A @@ -2078,7 +2008,7 @@ LOADDIR: ;LD B,A ; число секторов ; .RTD1: LD A,(FatBuffer.DRIVE) ; номер диска - LD DE,DIR ; буфер + LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV POP AF @@ -2088,6 +2018,56 @@ LOADDIR: ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; скопировать запись в список диска (каталога) +; и сбросить кеш каталога на диск +WRT_HND: SET_PAGE_X DIRPAGE + EX AF,AF' + ; + LD IX,DIRPAGE.buffer + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; +.loop: LD A,(IX+00) + OR A + JR Z,.WRT_HN2 + CP #E5 + JR Z,.WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,.loop + ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF + RET +.WRT_HN2: + LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR + EX AF,AF' + OUT (SLOT3),A + LD HL,DIRPAGE.buffer + LD BC,(SAVEDIR.DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + JR NC,SAVEDIR + LD HL,(SAVEDIR.DIRSIZE) + LD BC,(FatBuffer.B_P_C) + ADD HL,BC + LD (SAVEDIR.DIRSIZE),HL + AND A + JP SAVEDIR +;----------------------------------------------------------------------; + + ;----------------------------------------------------------------------; ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора @@ -2097,10 +2077,10 @@ SAVEDIR: LD IX,0 LD B,0 CALL MOVE_FP - + ; SET_PAGE_X DIRPAGE - PUSH AF + ; LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A LD D,(IY+_sFM.ST_CLUSTER) @@ -2108,7 +2088,7 @@ SAVEDIR: LD A,D OR E JP Z,.SROTDIR - LD HL,DIR + LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory .DIRSIZE+1: LD DE,0 @@ -2128,7 +2108,7 @@ SAVEDIR: ADD A,B LD B,A .RTD1S: LD A,(FatBuffer.DRIVE) - LD DE,DIR + LD DE,DIRPAGE.buffer LD C,Dss.DRV.Write RST ToDSS.DRV POP AF @@ -2219,47 +2199,11 @@ 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 -;----------------------------------------------------------------------; - - ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE +; HANDBUF: BLOCK HANDBUF.SIZE,0 MASKARE: BLOCK 8,0 ; имя файла BLOCK 3,0 ; расш. diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e653c66..c454f1c 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -770,12 +770,7 @@ WRITE: LD (.R_POINT),HL LD A,(IY+_sFM.DRIVE) CALL OPENDSK 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 @@ -882,6 +877,7 @@ WRITE: LD (.R_POINT),HL LD (IY+_sFM.F_SIZE+3),B AND A RET + ; .WOV1: PUSH BC PUSH HL PUSH DE diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 97816e7..7ce405b 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -8,7 +8,7 @@ ;--------------------------------------------------------------- ;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) ;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 -;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;!FIXIT работает криво +;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;R10 03-04-2003 DNS IMPROVED FN. VERSION ;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. ;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION @@ -593,79 +593,6 @@ WorkDirectory EQU CurrentDirectory .DEPTH EQU CurrentDirectory.DEPTH ENDIF -;R11 -; !TODO починить - IF SAVE_PATH_MACRO -SAVE_CUR_PATH - PUSH IX - PUSH IY - PUSH HL - PUSH DE - PUSH BC - PUSH AF - - SET_PAGE_X ENVPAGE - PUSH AF - - CALL CURRDSK - ADD A,"A" - LD HL,TMP_CURDIR_AUTO - LD (HL),A - INC HL - LD A,":" - LD (HL),A - INC HL - CALL CURRDIR_FN - - ; почему не POP AF : OUT (SLOT3),A - //POP BC - //LD A,B - //OUT (SLOT3),A - POP AF - OUT (SLOT3),A - ; -; - POP AF - POP BC - POP DE - POP HL - POP IY - POP IX - RET - -; !TODO починить -BACK_CUR_PATH: - RET NC -.force: PUSH IY - PUSH IX - PUSH HL - PUSH DE - PUSH BC - PUSH AF - - SET_PAGE_X ENVPAGE - PUSH AF - - LD HL,TMP_CURDIR_AUTO - CALL CHDIR - - ; почему не POP AF : OUT (SLOT3),A - //POP BC - //LD A,B - //OUT (SLOT3),A - POP AF - OUT (SLOT3),A -; - POP AF - POP BC - POP DE - POP HL - POP IX - POP IY - RET - ENDIF -;R11 - ;R12 ;/////////////////////////////////////////////////////////////////////// ; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. @@ -705,10 +632,6 @@ SCANDRV: ;/////////////////////////////////////////////////////////////////////// ; - -;R12 - - ;GOD EQU 1999-1980*512 ;FHAND DB " " @@ -723,3 +646,64 @@ SCANDRV: ;//MODULE: DOS_X ;[END] +;R11 + ; IF SAVE_PATH_MACRO + ; SAVE_CUR_PATH + ; PUSH IX + ; PUSH IY + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; PUSH AF + ; + ; SET_PAGE_X ENVPAGE + ; PUSH AF + ; + ; CALL CURRDSK + ; ADD A,"A" + ; LD HL,TMP_CURDIR_AUTO + ; LD (HL),A + ; INC HL + ; LD A,":" + ; LD (HL),A + ; INC HL + ; CALL CURRDIR_FN + ; + ; POP AF + ; OUT (SLOT3),A + ; + ; POP AF + ; POP BC + ; POP DE + ; POP HL + ; POP IY + ; POP IX + ; RET + ; + ; BACK_CUR_PATH: + ; RET NC + ; .force: PUSH IY + ; PUSH IX + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; PUSH AF + ; + ; SET_PAGE_X ENVPAGE + ; PUSH AF + ; + ; LD HL,TMP_CURDIR_AUTO + ; CALL CHDIR + ; + ; POP AF + ; OUT (SLOT3),A + ; + ; POP AF + ; POP BC + ; POP DE + ; POP HL + ; POP IX + ; POP IY + ; RET + ; ENDIF +; diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 40e3f84..0c4f187 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -148,31 +148,6 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ENDM ; -; - MACRO _mSavePath force - IF SAVE_PATH_MACRO - PUSH HL - IF force==1 - LD HL,BACK_CUR_PATH.force - ELSE - LD HL,BACK_CUR_PATH - ENDIF - EX (SP),HL - CALL SAVE_CUR_PATH - ENDIF - ENDM - MACRO _mRestorePath - IF SAVE_PATH_MACRO - CALL BACK_CUR_PATH.force - ENDIF - ENDM - MACRO _mRestorStackAfterRestorePath - IF SAVE_PATH_MACRO - POP HL ;CLEAR STACK "BACK_CUR_PATH" - ENDIF - ENDM -; - ; MACRO _mDSS_Version DB 'DSS_' @@ -224,4 +199,30 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 MACRO C_OSRELEASE DB "Estex DSS",0 ENDM +; + +//////////////////////////////////////////////////////////////////////// +; +; MACRO _mSavePath force +; IF SAVE_PATH_MACRO +; PUSH HL +; IF force==1 +; LD HL,BACK_CUR_PATH.force +; ELSE +; LD HL,BACK_CUR_PATH +; ENDIF +; EX (SP),HL +; CALL SAVE_CUR_PATH +; ENDIF +; ENDM +; MACRO _mRestorePath +; IF SAVE_PATH_MACRO +; CALL BACK_CUR_PATH.force +; ENDIF +; ENDM +; MACRO _mRestorStackAfterRestorePath +; IF SAVE_PATH_MACRO +; POP HL ;CLEAR STACK "BACK_CUR_PATH" +; ENDIF +; ENDM ; \ No newline at end of file diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 37d66eb..4210567 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -182,7 +182,7 @@ EX_PATH: EXX DEC B JP Z,GETNAME ;8 ; преобр. имя 11 -> 8.3 формат DEC B - JP Z,MASK ;9 ; преобр. имя 8.3 -> 11 формат + JP Z,MASK.custom ;9 ; преобр. имя 8.3 -> 11 формат EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET @@ -692,7 +692,7 @@ FINDPATH: ;CALL CURRDIR_FN ; CALL .MAKE_PATH_ARRAY - LD HL,PATH_PNT_ARRAY + LD HL,ENVPAGE.PATH_PNT_ARRAY .NEXTPATHI: LD E,(HL) INC HL @@ -707,12 +707,12 @@ FINDPATH: CALL NZ,CHDIR JR C,.BADPATH LD HL,CORE_BUFFERS.EXEBUFF - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name JR C,.BADPATH CALL TST_EXT JR C,.BADPATH - CALL SEARCH + CALL SEARCH.File .BADPATH: POP BC POP HL @@ -728,15 +728,14 @@ FINDPATH: .GOTO_CURDIR: PUSH AF PUSH HL - ;LD HL,TMP_CURDIR LD HL,CurrentDirectory CALL CHDIR POP HL POP AF RET .MAKE_PATH_ARRAY: - LD HL,PATH_PNT_ARRAY-1 ;R04 -1 - LD DE,ENVTEMP-1 + LD HL,ENVPAGE.PATH_PNT_ARRAY-1 ;R04 -1 + LD DE,ENVPAGE.ENVTEMP-1 LD B,#00 .NEXTAR: LD (HL),C ;R04 @@ -778,15 +777,12 @@ FINDPATH: LD (HL),A RET -ENVPATH DB "PATH=",0 +ENVPATH: DB "PATH=",0 ;;; -; !TODO СДЕЛАТЬ СТРУКТУРОЙ и обозначить страницу -TMP_CURDIR_AUTO EQU #FB00 -PATH_PNT_ARRAY EQU #FC80 -; !FIXIT не нужно если SAVE_PATH_MACRO = 1 -TMP_CURDIR EQU #FD00 -ENVTEMP EQU #FE00 +;TMP_CURDIR_AUTO EQU #FB00 +; не нужно если SAVE_PATH_MACRO = 1 +; TMP_CURDIR EQU #FD00 ;///////////////////////////////////////////////////////////////////// @@ -847,8 +843,8 @@ EXEC_1: ;LD (CMDLINE),HL LD (OPEN.TMP),A CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C CALL TST_EXT @@ -877,11 +873,10 @@ EXEC_1: ;LD (CMDLINE),HL EXEC0_SHORT: CALL EXEC_1 RET C - ;FILE NOT FOUND, SEARCHING IN PATH ; GET PATH AND ETC. LD HL,ENVPATH - LD DE,ENVTEMP + LD DE,ENVPAGE.ENVTEMP LD B,high Dss.Environ.Get CALL ENVIRON diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 42c7ee9..debb81d 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -94,7 +94,7 @@ R_F_F16: LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT_CACHE ; начало кеша FAT-а + LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT LD E,(HL) ; прочитать номер кластера INC HL @@ -196,7 +196,7 @@ R_F_F12: CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а ENDIF ; - LD DE,FAT_CACHE ; начало кеша FAT-а + LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT POP AF ; восст. флаг LD E,(HL) @@ -286,7 +286,7 @@ W_T_F16: LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT_CACHE + LD DE,FATPAGE.cache ADD HL,DE ; на ячейку FAT POP DE LD (HL),E ; сохр. в кеше FAT-а @@ -329,7 +329,7 @@ W_T_F12: CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а ENDIF ; - LD DE,FAT_CACHE + LD DE,FATPAGE.cache ADD HL,DE POP AF POP DE @@ -403,7 +403,7 @@ RE_FAT: PUSH HL LD IX,0 ADD IX,DE ; номер лог. сектора LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING - LD DE,FAT_CACHE ; куда ; DE - FAT ADDRESS + 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 RST ToDSS.DRV @@ -452,7 +452,7 @@ WR_FAT: SET_PAGE_X FATPAGE ;HL:IX - SECTOR OF FAT FOR SAVE ADD IX,DE ; номер лог. сектора LD HL,0 ; ст. разряд - LD DE,FAT_CACHE ; откуда + LD DE,FATPAGE.cache ; откуда LD B,A ; число секторов LD C,Dss.DRV.Write ; запись секторов LD A,(FatBuffer.DRIVE) ; номер диска @@ -465,7 +465,7 @@ WR_FAT: SET_PAGE_X FATPAGE EX DE,HL LD IX,0 ADD IX,DE - LD DE,FAT_CACHE + LD DE,FATPAGE.cache LD HL,0 LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 896e980..05f0ec5 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -657,8 +657,9 @@ TST_01: IN A,(CMOUSE) LD A,B OR C JR NZ,TST_01 - ;JR NC,TST_01 + SCF RET + ;JR NC,TST_01 ; .NXT: IN A,(DMOUSE) @@ -667,19 +668,19 @@ TST_01: IN A,(CMOUSE) CCF RET NZ - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz !TEST LD BC,#2000 ; TST_02: IN A,(CMOUSE) RRCA - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz !TEST JR C,.NXT DEC BC LD A,B OR C JR NZ,TST_02 - ;JR NC,TST_02 RET + ;JR NC,TST_02 ; .NXT: IN A,(DMOUSE) LD D,A diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 392f7e8..4673c3d 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -302,7 +302,8 @@ SETUP_CURSORS: -CTRLKEY LD HL,HOST +CTRLKEY: + LD HL,HOST LD A,(HEAD) CP (HL) LD BC,(KEYFLAG) @@ -311,7 +312,8 @@ CTRLKEY LD HL,HOST DEC A RET -TESTKEY LD HL,HOST +TESTKEY: + LD HL,HOST LD A,(HEAD) CP (HL) RET Z @@ -348,7 +350,8 @@ TESTKEY LD HL,HOST ; RET ;small optimization -K_CLEAR LD A,(HOST) +K_CLEAR: + LD A,(HOST) LD (HEAD),A LD A,#2F CP B @@ -363,7 +366,7 @@ K_CLEAR LD A,(HOST) RET ; -PUTSYM LD HL,HEAD +PUTSYM: LD HL,HEAD LD A,(HOST) SUB 4 AND #3F @@ -386,7 +389,7 @@ PUTSYM LD HL,HEAD LD (HL),C RET -GETSYM LD HL,HOST +GETSYM: LD HL,HOST LD A,(HEAD) CP (HL) RET Z @@ -407,38 +410,41 @@ GETSYM LD HL,HOST LD C,(HL) RET -FULL_BF EX AF,AF' +FULL_BF: + EX AF,AF' BIT SF_BUFF,(IX+SOUND_K) - JR Z,FBF + JR Z,.FBF EXX LD DE,230 LD HL,50 CALL BEEP EXX -FBF EX AF,AF' +.FBF: EX AF,AF' RET +.E0_KEY: + SET FLAG_E0,(IX+KEYFLG) + JR KEYSCAN.RESCAN +.F0_KEY: + SET FLAG_F0,(IX+KEYFLG) + JR KEYSCAN.RESCAN +.E1_KEY: + SET FLAG_E1,(IX+KEYFLG) + JR KEYSCAN.RESCAN -E0_KEY SET FLAG_E0,(IX+KEYFLG) - JR RESCAN -F0_KEY SET FLAG_F0,(IX+KEYFLG) - JR RESCAN - -E1_KEY SET FLAG_E1,(IX+KEYFLG) - JR RESCAN - -KEYSCAN LD IX,KEYFLAG - -RESCAN IN A,(COM_A) +KEYSCAN: + LD IX,KEYFLAG +.RESCAN: + IN A,(COM_A) BIT 0,A RET Z IN A,(DAT_A) CP #F0 - JR Z,F0_KEY + JR Z,FULL_BF.F0_KEY CP #E0 - JR Z,E0_KEY + JR Z,FULL_BF.E0_KEY CP #E1 - JR Z,E1_KEY + JR Z,FULL_BF.E1_KEY BIT FLAG_F0,(IX+KEYFLG) JR NZ,UN_KEY LD L,A diff --git a/DSS/build.txt b/DSS/build.txt index 2bf5aee..72b67e0 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -567 \ No newline at end of file +579 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 9bba147..d0a96f5 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,8 +15,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 - DEFINE SAVE_PATH_MACRO 0 ;\____ либо то, либо то - DEFINE SAVE_PATH_CODE 1 ;/ + DEFINE SAVE_PATH_CODE 1 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; @@ -24,13 +23,22 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 ; DEFINE OLD_SET_BANK 0 ;---------------------[ лог.номера страниц памяти ]--------------------- + DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц ; кэш списка каталога DIRPAGE EQU 0 +.buffer EQU #C000 +; FATPAGE EQU 1 +.cache EQU #C000 +; TXTPAGE EQU 2 +; ENVPAGE EQU TXTPAGE +.PATH_PNT_ARRAY EQU #FC80 +.ENVTEMP EQU #FE00 +; DRVPAGE EQU 3 - DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц +; COREPAGE EQU 4 ; она отдельно и не с блоком выше. ;----------------------------------------------------------------------- DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 @@ -38,8 +46,8 @@ ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 ENVADDR EQU #E400 -DIR EQU #C000 -FAT_CACHE EQU #C000 +;DIR EQU #C000 +;FAT_CACHE EQU #C000 FMCOUNT EQU 10 ; Количество файловых манипуляторов HANDBUF.SIZE EQU 32 From 6333672fa61010b52eb9ff8a2e6c8eaa4d6cd482 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 15 Nov 2023 04:04:38 +1000 Subject: [PATCH 056/219] testing --- DSS/DOS5.ASM | 118 ++++++++++++++++++++++++++++---------------------- DSS/build.txt | 2 +- 2 files changed, 68 insertions(+), 52 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index dc0721a..46573d5 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -7,7 +7,7 @@ ;Rev Date Name Description ;------------------------------------------------------------- ;R11 17-04-2023 BAO Временный костыль для недопускания переполнения буфера пути каталога -;R10 15-04-2023 BAO ;????? FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH ;!FIXIT пока в виде заплатки полунеработающей +;R10 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH ;R09 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R08 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS ;R07 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN @@ -181,12 +181,12 @@ CREAT_N EQU CREATE.NEW ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// DEL_FN: ;!TEST - ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; + ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C ; LD HL,TMPNAME @@ -316,7 +316,7 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 POP HL RET C LD A,C - ;!FIXIT сделать как в mkdir или rmdir + ;!FIXIT сделать как в mkdir или rmdir? ; ;R08 OPEN: LD (.TMP),A ; enter point for CREATE @@ -580,24 +580,18 @@ CHNDISK_FN: CALL DIR_PATH_CHANGE.FullCurrent POP AF RET -CHNDISK: - ;!TEST +CHNDISK:;[x] более корректная смена диска CALL OPENDSK - ;CALL OPENDSK.force ; - ;????? R10 - RET C + ;R10 + RET C LD HL,WorkDirectory - LD (HL),0 - PUSH AF - CALL OPENDIR - POP BC - RET C - LD A,B - ; RET C - ; PUSH AF - ; CALL LOADDIR - ; POP AF + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B RET //////////////////////////////////////////////////////////////////////// @@ -605,19 +599,24 @@ CHNDISK: ; ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 -; !FIXIT может выйти за пределы буфера? //////////////////////////////////////////////////////////////////////// CURRDIR: LD DE,WorkDirectory JR CURRDIR_FN.skip CURRDIR_FN: LD DE,CurrentDirectory .skip: EX DE,HL + LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 могло выйти за пределы буфера XOR A .loop: CP (HL) - LDI + LDI + JP PO,.error ;[x] 15/11/2023 могло выйти за пределы буфера JR NZ,.loop RET - + ;[x] 15/11/2023 могло выйти за пределы буфера +.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH + SCF + RET + ; //////////////////////////////////////////////////////////////////////// ; Функция #21. Текущая дата и время. ; @@ -1023,8 +1022,8 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD E,L INC DE LD (HL),0 - LD BC,512-65 - LDIR ;!FIXIT нужно ли так много грохать? + LD BC,512-65 ;!HARDCODE + LDIR ; POP HL CALL NSECTOR @@ -1049,7 +1048,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD DE,CORE_BUFFERS.SECBUF+1 LD BC,511 LD (HL),0 - LDIR ;!FIXIT нужно ли так много грохать? + LDIR ; POP IX POP HL @@ -1453,7 +1452,7 @@ SEARCH: INC HL INC DE DJNZ .loop_compare - ;!TEST 9/11/23 + ;!TEST 9/11/23 ;[x] some optimize ; LD D,XH ; LD E,XL LD D,XH @@ -1472,7 +1471,7 @@ SEARCH: AND A RET .next_record: - ;!TEST 9/11/23 + ;!TEST 9/11/23 ;[x] some optimize ; EXX ; INC DE ; EXX @@ -1580,9 +1579,9 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; ; IN: A - drive number ; - ;????? R10 + OPENDSK: - ;!TEST DRV.Open обход + ;!TEST DRV.Open обход R10 LD C,A LD A,(FatBuffer.DRIVE) CP C @@ -1610,19 +1609,25 @@ OPENDSK: ;----------------------------------------------------------------------; -OPENDIR: - XOR A - CALL SET_FM +OPENDIR:;!TEST ;[ ] some optimize + ;XOR A + ;CALL SET_FM + LD IY,CORE_BUFFERS.FM_BUF + ; LD A,(HL) OR A JR NZ,.SUBDIR .REROOT1: LD DE,0 - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D + ;!TEST ;[ ] some optimize + ;LD (IY+_sFM.ST_CLUSTER),E + ;LD (IY+_sFM.ST_CLUSTER+1),D + EX DE,HL + LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + EX DE,HL + ; CALL LOADDIR - ;LD HL,CurrentDirectory -.dir+1: LD HL,WorkDirectory + LD HL,WorkDirectory LD (HL),'\' INC HL LD (HL),#00 @@ -1631,8 +1636,11 @@ OPENDIR: .SUBDIR: CP "." JR NZ,.SUBDIR2 - LD A,(IY+_sFM.ST_CLUSTER) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY - OR (IY+_sFM.ST_CLUSTER+1) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY + ;!TEST ;[ ] some optimize + ;LD A,(IY+_sFM.ST_CLUSTER) ;R05 + LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R05 + ; + OR (IY+_sFM.ST_CLUSTER+1) ;R05 JR NZ,.SUDI1 ;R05 INC HL ;R05 LD A,(HL) ;R05 @@ -1640,7 +1648,7 @@ OPENDIR: DEC HL ;R05 JR Z,.REROOT1 ;R05 .SUDI1: EXX - LD HL,MASKARE ;!FIXIT можно не затирать предварительно? + LD HL,MASKARE LD DE,MASKARE+1 LD BC,10 ;!HARDCODE LD (HL),' ' @@ -1653,17 +1661,23 @@ OPENDIR: JR NZ,.loop JR .SUBDIR3 .SUBDIR2: - ;LD DE,MASKARE CALL MASK.name RET C .SUBDIR3: CALL FINDDIR RET C - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D - LD DE,#4000 ;!HARDCODE - LD (IY+_sFM.F_SIZE),E - LD (IY+_sFM.F_SIZE+1),D + ;!TEST ;[ ] some optimize + ;LD (IY+_sFM.ST_CLUSTER),E + ;LD (IY+_sFM.ST_CLUSTER+1),D + ;LD DE,#4000 ;!HARDCODE + ;LD (IY+_sFM.F_SIZE),E + ;LD (IY+_sFM.F_SIZE+1),D + EX DE,HL + LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + LD HL,#4000 ;!HARDCODE + LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL + EX DE,HL + ; CALL LOADDIR AND A RET @@ -1738,8 +1752,6 @@ FINDDIR: .ADDSPEC: LD E,XL LD D,XH - ;LD HL,CurrentDirectory+1 - ;LD BC,CurrentDirectory.DEPTH-1 LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 ; XOR A @@ -1975,6 +1987,7 @@ LOADDIR: ; LD (HL),L ; LDIR ; + ; LD A,(FatBuffer.DRIVE) ; номер диска LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера @@ -2204,7 +2217,10 @@ DIR_PATH_CHECK: LD A,(HL) ; Массив лог. номеров банок расширения DSS BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE ; + HANDBUF: BLOCK HANDBUF.SIZE,0 +; + MASKARE: BLOCK 8,0 ; имя файла BLOCK 3,0 ; расш. BLOCK 21,0 ; 11+21=32 diff --git a/DSS/build.txt b/DSS/build.txt index 72b67e0..6001de1 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -579 \ No newline at end of file +595 \ No newline at end of file From f93e0ad5b2f212f7cf3ed13a9a8b1d6451c6aee5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 17 Nov 2023 02:11:03 +1000 Subject: [PATCH 057/219] bug fixing --- DSS/CHANGES.LOG | 3 +- DSS/DOS5.ASM | 294 ++++++++++++++++++++++++++++-------------------- DSS/DOS_FM.ASM | 8 +- DSS/EXECUTE.ASM | 1 - DSS/build.txt | 2 +- 5 files changed, 177 insertions(+), 131 deletions(-) diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index 0b235c9..a87e1be 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -1,6 +1,7 @@ !FIXIT -[ ] D:\>copy dss\system.dos c:\system.dos +[ ] D:\>copy dss\system.dos c:\system.dos (bp 812d, 8136) Can't open source file + [ ] E:\BIN\MENU>c:\dss что-то про заполненность директории [ ] C:\????? или ????? diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 46573d5..e87c9dd 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -39,7 +39,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET C LD A,C ; - + ; INC B DEC B JP Z,.RATTRIB @@ -49,21 +49,31 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 SCF RET .RATTRIB: - XOR A + ;!TEST ;[ ] 16/11/23 optimize get attribute + ;XOR A + ; CALL .OPENATR ;R02 RET C - LD B,(IY+_sFM.ATTRIBUT) - PUSH BC - CALL CLOSE - POP BC - RET C - LD A,B - ;AND A + ;!TEST ;[ ] 16/11/23 optimize get attribute + LD A,(HANDBUF+_sFM.ATTRIBUT) + ;LD B,(IY+_sFM.ATTRIBUT) + ;PUSH BC + ;CALL CLOSE + ;POP BC + ;RET C + ;LD A,B + ; RET .WATTRIB: PUSH AF XOR A + ;!TEST ;[ ] 16/11/23 optimize get attribute + LD (OPEN.TMP),A + ; CALL .OPENATR ;R02 + ;!TEST ;[ ] 16/11/23 optimize get attribute + CALL NC,OPEN.FM + ; POP BC RET C SET 7,(IY+_sFM.ACCESS_MODE) @@ -71,27 +81,27 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.ATTRIBUT),B PUSH BC CALL CLOSE - POP BC +.error: POP BC RET C LD A,B - ;AND A RET ;R02 .OPENATR: - LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) + ;!TEST ;[ ] 16/11/23 optimize get attribute + ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) + ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C LD A,FAT_ATTR.NoVolID - CALL SEARCH.Custom - ; JR NC,OPENAT ; на поиск своб. дескриптора - ; ; запись не найдена - ; RET - RET C ; запись не найдена - JP OPEN.FM ; на поиск своб. дескриптора + ;!TEST ;[ ] 16/11/23 optimize get attribute + JP SEARCH.Custom + ;CALL SEARCH.Custom + ;RET C ; запись не найдена + ;JP OPEN.FM ; на поиск своб. дескриптора + ; + ; ;R02 //////////////////////////////////////////////////////////////////////// @@ -308,28 +318,24 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 - LD C,A + LD (OPEN.TMP),A PUSH HL - PUSH BC CALL DIR_PATH_CHECK.forceCheck - POP BC POP HL RET C - LD A,C + JR OPEN.start ;!FIXIT сделать как в mkdir или rmdir? ; ;R08 -OPEN: LD (.TMP),A ; enter point for CREATE - CALL GETWORD +OPEN: LD (.TMP),A ; enter point from CREATE +.start: CALL GETWORD RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE - CALL MASK + CALL MASK ; enter point from OPEN_FN RET C -.FILE: CALL SEARCH.File ; enter point for EXEC +.FILE: CALL SEARCH.File ; enter point from EXEC RET C ;R02 -.FM: CALL GET_FM ; enter point for ATTRIB +.FM: CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' @@ -581,17 +587,17 @@ CHNDISK_FN: POP AF RET CHNDISK:;[x] более корректная смена диска - CALL OPENDSK + CALL OPENDSK ; - ;R10 + ;R10 RET C LD HL,WorkDirectory - LD (HL),0 - PUSH AF - CALL OPENDIR - POP BC - RET C - LD A,B + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B RET //////////////////////////////////////////////////////////////////////// @@ -1204,8 +1210,6 @@ DOSNAME: - - ;----------------------------------------------------------------------; ; Чтение регистров CMOS ; вход: d=номер регистра @@ -1368,32 +1372,69 @@ RMKTIME: ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 +;!FIXIT некорректно работает +; GETNAME: +; LD BC,#08FF +; .GETN1: LD A,(HL) +; CP " " +; JR NZ,.GETN3 +; .GETN2: INC HL +; DJNZ .GETN2 +; JR .GETN4 +; .GETN3: LDI +; DJNZ .GETN1 +; ; +; .GETN4: LD A,(HL) +; CP " " +; LD A,"." +; JR NZ,.GETN5 +; LD A,#00 +; .GETN5: LD (DE),A +; INC DE +; RET Z +; LD B,#03 +; .GETN6: LD A,(HL) +; CP " " +; RET Z +; LDI +; XOR A +; LD (DE),A +; DJNZ .GETN6 +; RET +;---------------;---------------;--------------- GETNAME: LD BC,#08FF -.GETN1: LD A,(HL) - CP " " - JR NZ,.GETN3 -.GETN2: INC HL - DJNZ .GETN2 - JR .GETN4 -.GETN3: LDI - DJNZ .GETN1 -.GETN4: LD A,(HL) - CP " " - LD A,"." - JR NZ,.GETN5 - LD A,#00 -.GETN5: LD (DE),A - INC DE - RET Z - LD B,#03 -.GETN6: LD A,(HL) - CP " " - RET Z + LD A,' ' +.loop: CP (HL) + JR Z,.skip LDI + DJNZ .loop + ;;;; + JP .extension + ;;;; +.skip: LD C,B + LD B,0 + ; CF=0 + ADC HL,BC + ;;;; +.extension: + CP (HL) + LD A,"." + JR NZ,.copy_extension XOR A +.copy_extension: + LD (DE),A + INC DE + RET Z ;no copy extension + ; copy extension + LD BC,#03FF ;!HARDCODE длина расширения + счётчик + LD A,' ' +.loop2: CP (HL) + JR Z,.exit + LDI + DJNZ .loop2 +.exit: XOR A LD (DE),A - DJNZ .GETN6 RET ;----------------------------------------------------------------------; @@ -1401,8 +1442,9 @@ GETNAME: ;----------------------------------------------------------------------; ; Поиск записи каталога в списке каталога ; -; вход: a=атрибут записи +; вход: a=атрибут записи ; выход: de'=индекс записи в списке каталога +; (HANDBUF) = file's direcory record ; CF - каталог не найден SEARCH: .Dir: LD A,FAT_ATTR.DIRECTORY @@ -1497,7 +1539,8 @@ SEARCH: ;----------------------------------------------------------------------; ; Тест на допустимое имя и настроиться на диск. -; вход: hl=строка имени +; вход: hl=строка имени +; выход: (TMPNAME) GETWORD: ; !TEST INC HL @@ -1517,11 +1560,21 @@ GETWORD: INC HL PUSH HL ;!TEST CHNDISK OPENDSK - ;CALL OPENDSK CALL CHNDISK + ;CALL OPENDSK ; POP HL RET C + LD A,(HL) + OR A + RET Z + CP ' ' ; + RET Z + CP '\' ; + SCF + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET NZ + INC HL ; .dir_loop: LD DE,TMPNAME @@ -1529,7 +1582,7 @@ GETWORD: ; .loop: LD A,(HL) INC HL - CP '\' + CP '\' ; JR Z,.DIR_NAME ; AND A ; JR Z,.DIR_NAME @@ -1544,6 +1597,7 @@ GETWORD: LD A,DSS_Error.sys.INVALID_NAME SCF RET + ; .DIR_NAME: XOR A LD (DE),A @@ -1631,7 +1685,8 @@ OPENDIR:;!TEST ;[ ] some optimize LD (HL),'\' INC HL LD (HL),#00 - AND A + ; CF=0 + ;AND A RET .SUBDIR: CP "." @@ -1679,7 +1734,8 @@ OPENDIR:;!TEST ;[ ] some optimize EX DE,HL ; CALL LOADDIR - AND A + ; CF=0 + ;AND A RET ;----------------------------------------------------------------------; @@ -1691,97 +1747,96 @@ FINDDIR: ; PUSH AF LD IX,DIRPAGE.buffer -.F_01: LD A,(IX+00) +.big_loop: + LD A,(IX+00) OR A JR Z,.error CP #E5 - JR Z,.F_03 - LD A,(IX+11) - AND #10 - JR Z,.F_03 + JR Z,.next_step + LD A,(IX+11) ;!HARDCODE + AND #10 ;!HARDCODE + JR Z,.next_step LD HL,MASKARE LD D,XH LD E,XL EX DE,HL - LD B,11 + LD B,11 ;!HARDCODE .loop: LD A,(DE) CP "?" - JR Z,.F_05 + JR Z,.compared CP (HL) - JR NZ,.F_03 -.F_05: INC HL + JR NZ,.next_step +.compared: + INC HL INC DE DJNZ .loop + ; LD A,(IX+0) CP "." JP NZ,.ADDSPEC - LD A,(IX+1) + LD A,(IX+1) ;!HARDCODE CP "." JP NZ,.IT_DIR - ;LD HL,CurrentDirectory LD HL,WorkDirectory LD D,H LD E,L INC HL - ;LD BC,CurrentDirectory.DEPTH LD BC,WorkDirectory.DEPTH XOR A CPIR ;!FIXIT нет проверки на завершение по BC=0 - DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога + DEC HL ;R09 DEC HL - ;LD BC,CurrentDirectory.DEPTH LD BC,WorkDirectory.DEPTH LD A,'\' CPDR INC HL - ;AND A - ; CF = 0 EX DE,HL + ; CF = 0 SBC HL,DE EX DE,HL JR NZ,.MM3 - JP .MM2_5 -.F_03: LD BC,#0020 + INC HL +.MM3: LD (HL),0 + JP .IT_DIR + ; +.next_step: + LD BC,#0020 ;!HARDCODE ADD IX,BC - JR NC,.F_01 + JR NC,.big_loop + ; .error: POP AF OUT (SLOT3),A LD A,DSS_Error.sys.PATH_NOT_FOUND SCF RET .ADDSPEC: - LD E,XL - LD D,XH LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 -; XOR A -; CPIR ;!FIXIT нет проверки на завершение по BC=0 -; DEC HL -; DEC HL -; LD A,'\' ; #5C -; CP (HL) -; INC HL -; JR Z,.ADDSPE0 -; LD (HL),A -; INC HL -; .ADDSPE0: CALL .CHECK_SLASH - ;R11 - LD A,B - AND A - JR NZ,.MM1 - LD A,C - CP 8 - JR C,FINDDIR.error - ;R11 - LD BC,#0820 + ;R11 + LD A,B + AND A + JR NZ,.nxt + LD A,C + CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение + JR C,FINDDIR.error +.nxt: ; + LD E,XL + LD D,XH + ; [ ] оптимизация по размеру + EX DE,HL + CALL GETNAME + EX DE,HL + ; +/* + LD BC,256*8 + ' ' ;!HARDCODE .MM1: LD A,(DE) INC DE CP C JR Z,.MM2 LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём INC HL -.MM2 DJNZ .MM1 +.MM2 DJNZ .MM1 ;x42-40 50-55 LD A,(DE) INC DE CP C @@ -1803,6 +1858,7 @@ FINDDIR: .MM2_5: INC HL .MM3: LD (HL),0 ; JP IT_DIR +*/ .IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) LD D,(IX+_sFM.ST_CLUSTER+1) @@ -2138,24 +2194,14 @@ DIR_PATH_CHANGE: ADD 'A' LD (CurrentPath),A ; -.Current: ;LD HL,WorkDirectory - ;LD DE,CurrentDirectory - ;LD BC,DIRECTORY_PATH_LENGTH - ;LDIR - ;RET - LD HL,CurrentDirectory +.Current: 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 - LD HL,WorkDirectory +.Work: LD HL,WorkDirectory JP CURRDIR_FN ; @@ -2196,11 +2242,10 @@ DIR_PATH_CHECK: LD A,(HL) INC HL INC DE JR Z,.loop + JP .gotoPath ; - JR .ReDir .end: CP (HL) RET Z -.ReDir: LD HL,CurrentPath JR .gotoPath ; .checkDrive: LD HL,CurrentPath @@ -2209,6 +2254,7 @@ DIR_PATH_CHECK: LD A,(HL) CP (HL) RET .gotoPath: CALL FINDDIR.CHECK_SLASH + LD HL,CurrentPath JP GETWORD ;----------------------------------------------------------------------; diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index c454f1c..44ced0c 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -590,10 +590,10 @@ READ: LD (.R_POINT),HL CALL SET_FM RET C CALL TSTSIZE - ;!FIXIT можно перенести в начало процедуры - LD A,D - OR E - JP Z,.NOREAD + ; + LD A,D + OR E + JP Z,.NOREAD ; PUSH DE LD A,(IY+_sFM.DRIVE) diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 4210567..4312538 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -707,7 +707,6 @@ FINDPATH: CALL NZ,CHDIR JR C,.BADPATH LD HL,CORE_BUFFERS.EXEBUFF - ;LD DE,MASKARE CALL MASK.name JR C,.BADPATH CALL TST_EXT diff --git a/DSS/build.txt b/DSS/build.txt index 6001de1..e250839 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -595 \ No newline at end of file +618 \ No newline at end of file From 497344d117a750c48d18c0128b86c4a80d39e38b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 20 Nov 2023 03:59:47 +1000 Subject: [PATCH 058/219] ... --- DSS/DOS5.ASM | 216 ++++++++++++++++++++++++++---------------------- DSS/build.txt | 2 +- Shared_Includes | 2 +- 3 files changed, 118 insertions(+), 102 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index e87c9dd..3e45047 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -49,12 +49,12 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 SCF RET .RATTRIB: - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute ;XOR A ; CALL .OPENATR ;R02 RET C - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute LD A,(HANDBUF+_sFM.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT) ;PUSH BC @@ -67,11 +67,11 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 .WATTRIB: PUSH AF XOR A - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute LD (OPEN.TMP),A ; CALL .OPENATR ;R02 - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute CALL NC,OPEN.FM ; POP BC @@ -87,7 +87,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET ;R02 .OPENATR: - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) ; CALL GETWORD ; тест на допуст. имя и настр. на диск @@ -95,7 +95,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 CALL MASK RET C LD A,FAT_ATTR.NoVolID - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute JP SEARCH.Custom ;CALL SEARCH.Custom ;RET C ; запись не найдена @@ -199,20 +199,18 @@ DEL_FN: ;!TEST ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C ; - ; LD DE,MASKARE - ; CALL MASK - ; RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z CALL LOADDIR CALL SEARCH.File @@ -264,12 +262,15 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 CALL MASK.name POP DE RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z PUSH DE CALL LOADDIR ; прочитать список каталога @@ -281,12 +282,15 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 ;LD DE,MASKARE CALL MASK.name RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z PUSH IX LD A,FAT_ATTR.NoSYSnoVolID @@ -397,7 +401,7 @@ CLOSE: LD (.TMP),A LD E,(IY+_sFM.DIR_CLUSTER) LD D,(IY+_sFM.DIR_CLUSTER+1) PUSH DE - ; [ ] 15/11/2023 -bug with bad clusters ;!TEST + ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD A,(IY+_sFM.DRIVE) CALL OPENDSK ; @@ -406,7 +410,7 @@ CLOSE: LD (.TMP),A POP DE LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER+1),D - ; [ ] 15/11/2023 -bug with bad clusters ;!TEST + ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD (IY+_sFM.ST_CLUSTER),E LD (IY+_sFM.ST_CLUSTER+1),D ; @@ -452,6 +456,7 @@ CLOSE: LD (.TMP),A ; C - #19 ; HL - указатель на файловую спецификацию ; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт +; ;!!!!! на самом деле сейчас если B=1, рабочий буфер 46 байт ; A - атрибуты, используемые при поиске ; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" ; B = 1 - имя найденного файла в формате DOS "filename.ext",0 @@ -478,13 +483,12 @@ F_FIRST: PUSH HL ;!TEST Current Dir ;[x] 15/10/23 CALL DIR_PATH_CHECK + RET C ; CALL LOADDIR POP HL CALL GETWORD RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C LD A,(.TMP) @@ -556,10 +560,8 @@ F_NEXT: JP F_FIRST.FIND_S .NSEARCH: EX AF,AF' - SET_PAGE_X DIRPAGE - PUSH AF - + ;PUSH AF EX AF,AF' CPL LD C,A @@ -907,14 +909,10 @@ CHDIR: CALL GETWORD ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// MKDIR: ;!TEST Current Dir ;[x] 15/10/23 - LD C,A PUSH HL - PUSH BC CALL DIR_PATH_CHECK - POP BC POP HL RET C - LD A,C CALL .START PUSH AF LD HL,CurrentDirectory @@ -1080,14 +1078,10 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: ;!TEST Current Dir ;[x] 15/10/23 - LD C,A PUSH HL - PUSH BC CALL DIR_PATH_CHECK - POP BC POP HL RET C - LD A,C CALL .START PUSH AF LD HL,CurrentDirectory @@ -1098,16 +1092,17 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; .START: CALL GETWORD RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z CALL LOADDIR CALL SEARCH.Dir @@ -1372,7 +1367,6 @@ RMKTIME: ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 -;!FIXIT некорректно работает ; GETNAME: ; LD BC,#08FF ; .GETN1: LD A,(HL) @@ -1460,7 +1454,7 @@ SEARCH: .File: LD A,FAT_ATTR.NoDIRnoVolID .Custom: EX AF,AF' ; A = 76ADLSHR SET_PAGE_X DIRPAGE - PUSH AF + ;PUSH AF EX AF,AF' ; CPL @@ -1508,8 +1502,10 @@ SEARCH: EX DE,HL LD BC,HANDBUF.SIZE LDIR - POP AF + ;POP AF + EX AF,AF' OUT (SLOT3),A + EX AF,AF' AND A RET .next_record: @@ -1522,14 +1518,16 @@ SEARCH: ADD IX,DE JR NC,.loop .error_too_many_files: - POP AF + ;POP AF + EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR SCF RET ; .error_file_not_found: - POP AF + ;POP AF + EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND SCF @@ -1559,10 +1557,8 @@ GETWORD: INC HL INC HL PUSH HL - ;!TEST CHNDISK OPENDSK - CALL CHNDISK - ;CALL OPENDSK - ; + CALL CHNDISK + ;CALL OPENDSK POP HL RET C LD A,(HL) @@ -1663,7 +1659,7 @@ OPENDSK: ;----------------------------------------------------------------------; -OPENDIR:;!TEST ;[ ] some optimize +OPENDIR:;!TEST ;[x] some optimize ;XOR A ;CALL SET_FM LD IY,CORE_BUFFERS.FM_BUF @@ -1673,7 +1669,7 @@ OPENDIR:;!TEST ;[ ] some optimize JR NZ,.SUBDIR .REROOT1: LD DE,0 - ;!TEST ;[ ] some optimize + ;!TEST ;[x] some optimize ;LD (IY+_sFM.ST_CLUSTER),E ;LD (IY+_sFM.ST_CLUSTER+1),D EX DE,HL @@ -1691,7 +1687,7 @@ OPENDIR:;!TEST ;[ ] some optimize .SUBDIR: CP "." JR NZ,.SUBDIR2 - ;!TEST ;[ ] some optimize + ;!TEST ;[x] some optimize ;LD A,(IY+_sFM.ST_CLUSTER) ;R05 LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R05 ; @@ -1721,7 +1717,7 @@ OPENDIR:;!TEST ;[ ] some optimize .SUBDIR3: CALL FINDDIR RET C - ;!TEST ;[ ] some optimize + ;!TEST ;[x] some optimize ;LD (IY+_sFM.ST_CLUSTER),E ;LD (IY+_sFM.ST_CLUSTER+1),D ;LD DE,#4000 ;!HARDCODE @@ -1783,7 +1779,8 @@ FINDDIR: INC HL LD BC,WorkDirectory.DEPTH XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 + CPIR + JP PO,.error ;[x] 20/11/23 проверка на выход за границы DEC HL ;R09 DEC HL LD BC,WorkDirectory.DEPTH @@ -1813,52 +1810,53 @@ FINDDIR: LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 CALL .CHECK_SLASH + JR C,.error ;R11 LD A,B AND A JR NZ,.nxt LD A,C CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение - JR C,FINDDIR.error + JR C,.error .nxt: ; LD E,XL LD D,XH - ; [ ] оптимизация по размеру + ; [x] оптимизация по размеру EX DE,HL CALL GETNAME EX DE,HL ; -/* - LD BC,256*8 + ' ' ;!HARDCODE -.MM1: LD A,(DE) - INC DE - CP C - JR Z,.MM2 - LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём - INC HL -.MM2 DJNZ .MM1 ;x42-40 50-55 - LD A,(DE) - INC DE - CP C - JR Z,.MM3 - LD (HL),"." - INC HL - LD (HL),A - INC HL - LD A,(DE) - INC DE - CP C - JR Z,.MM3 - LD (HL),A - INC HL - LD A,(DE) - CP C - JR Z,.MM3 - LD (HL),A -.MM2_5: INC HL -.MM3: LD (HL),0 -; JP IT_DIR -*/ + +; LD BC,256*8 + ' ' ;!HARDCODE +; .MM1: LD A,(DE) +; INC DE +; CP C +; JR Z,.MM2 +; LD (HL),A +; INC HL +; .MM2 DJNZ .MM1 ;x42-40 50-55 +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),"." +; INC HL +; LD (HL),A +; INC HL +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),A +; INC HL +; LD A,(DE) +; CP C +; JR Z,.MM3 +; LD (HL),A +; .MM2_5: INC HL +; .MM3: LD (HL),0 +; ; JP IT_DIR + .IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) LD D,(IX+_sFM.ST_CLUSTER+1) @@ -1868,7 +1866,11 @@ FINDDIR: RET .CHECK_SLASH: XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 + CPIR + ;[x] 20/11/23 проверка на выход за границы + SCF + RET PO + ; DEC HL DEC HL LD A,'\' ; #5C @@ -2254,11 +2256,25 @@ DIR_PATH_CHECK: LD A,(HL) CP (HL) RET .gotoPath: CALL FINDDIR.CHECK_SLASH + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET C LD HL,CurrentPath JP GETWORD ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +CHECK_NAME: + LD HL,MASKARE +.custom: LD BC,11 ;!HARDCODE + LD A,"?" + CPIR + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +;----------------------------------------------------------------------; + + ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE diff --git a/DSS/build.txt b/DSS/build.txt index e250839..a9ba125 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -618 \ No newline at end of file +607 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b69773d..1826974 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b69773d50cb2c0e1da44f7f20c7daa32871f2308 +Subproject commit 18269745815d90e76686f5693e0cb45f8f31741c From 55e6b9b07d0272969c35da9f39fc3b1f0c508e0b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 23 Nov 2023 05:40:42 +1000 Subject: [PATCH 059/219] ... --- BOOT/boot.asm | 6 +- DSS/DOS_X.ASM | 132 ++++++++++++++++---- DSS/Media_drivers/ide-drv.asm | 2 +- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 228 +++++++++++++++++++--------------- SHELL/EDLINE.ASM | 39 +++--- SHELL/ERROR.ASM | 50 ++++---- SHELL/SHELL.ASM | 3 + SHELL/build.txt | 2 +- Shared_Includes | 2 +- 10 files changed, 296 insertions(+), 170 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 30be7ca..bd19f1c 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -1,4 +1,8 @@ -;!TODO определение попытки сделать загрузочным не первый раздел +//////////////////////////////////////////////////////////////////////// +; CHANGELOG +; [ ] - определение попытки сделать загрузочным не первый раздел +//////////////////////////////////////////////////////////////////////// + ; Программа записи на FDD/HDD boot-загрузчика и файлов системы. ; diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 7ce405b..22f61ec 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -153,55 +153,141 @@ CURRDSK: LD A,(FatBuffer.DRIVE) ;///////////////////////////////////////////////////////////////////// -; Функция #03. Информация о диске. +; [ ] новая подфункция с битом 7 в рег. А ; Возвращает информацию об общем и свободном пространстве дискового ; устройства. ; -; вход: A - номер диска (0=A,1=B,..#FF-текущий) +; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий) +; При A bit7 = 1: +; HL - буфер (256 байтов) для расширенных данных: +; B != 0 - считать свободное место +; ; +; размер поля - 1 байт +; Файловая система +; ; +; размер поля - 1 байт +; Серийный номер диска +; ; +; размер поля - 1 байт +; Метка диска +; ; +; размер поля - 1 байт +; Зарезервировано... +; ; +; A xor #80 - номер диска +; ; выход: A - размер кластера в секторах, если CF=0 ; HL - общее кол-во кластеров ; DE - свободных кластеров ; BC - размер сектора в байтах ; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// -DISKINF: - CP #FF ; !FIXIT WorkDirectory + ; [ ] 22/11/23 подфункция с доп.инфой + MACRO _mCOPY_LOOP + LD C,A + LD B,0 + LD (DE),A + INC DE + LDIR +; .loop: +; LD (HL),A +; INC DE +; INC HL +; LD A,(DE) +; DJNZ .loop + ENDM + ; +DISKINF:; [ ] 22/11/23 подфункция с доп.инфой + CP #80 + JR C,.CustomDisk + CP #FF + JR Z,.CurrentDisk + ; more info + PUSH HL + AND %0111'1111 + CALL .CustomDisk + JR C,.error + ; + EX (SP),HL + PUSH AF + PUSH DE + PUSH BC + ;;;; + ; + EX DE,HL + LD HL,CORE_BUFFERS.BootSector.ID_FAT + LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length + _mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER + LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER + _mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_LABEL + LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL + _mCOPY_LOOP + ; + + XOR A + LD (DE),A + ;;;; + POP BC + POP DE + POP AF +.error: POP HL + RET + ; + + ;CP #FF ; !FIXIT WorkDirectory ;!TEST Current Dir ;JR Z,CURRDS ;R06 - JR NZ,.CustomDisk +.CurrentDisk: LD A,(CurrentPath) SUB 'A' LD HL,FatBuffer.DRIVE CP (HL) - JR Z,CURRDS + JR Z,.CheckFreeSpace ; .CustomDisk: + PUSH BC CALL CHNDISK ;R06 - RET C ;R06 -CURRDS: - LD HL,2 - LD BC,0 -FRESP: PUSH BC - CALL R_F_FAT POP BC - CP DSS_Error.sys.DISK_FULL - JR Z,FRESP2 + RET C ;R06 - LD A,E - OR D - JR NZ,SKIC - INC BC -SKIC: INC HL - JP FRESP - -FRESP2: LD D,B +.CheckFreeSpace: + ; + XOR A + OR B + CALL NZ,.CURRDS + ; + ; +.FRESP2: + LD D,B LD E,C LD HL,(MAX_CLU) DEC HL LD BC,(CORE_BUFFERS.BootSector.B_P_S) LD A,(CORE_BUFFERS.BootSector.S_P_C) AND A - RET + RET + ; +.CURRDS: + LD HL,2 + LD BC,0 +.FRESP: PUSH BC + CALL R_F_FAT + POP BC + CP DSS_Error.sys.DISK_FULL + RET Z + + LD A,E + OR D + JR NZ,.SKIC + INC BC +.SKIC: INC HL + JP .FRESP +; + ; Номер последнего диска в системе LDRIVE: DB DSS_MAX_DRIVES_AMOUNT diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 8a769bc..ec9e206 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -446,7 +446,7 @@ GBPB_H: PUSH IY POP IY LD BC,1*256 + BIOS.DRV_READ JP ToBIOS - ;RET + ;HL:IX - SECTOR ; DE - ADDRESS diff --git a/DSS/build.txt b/DSS/build.txt index a9ba125..a0d1ef1 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -607 \ No newline at end of file +620 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 9d1e598..f0a6352 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -3,10 +3,13 @@ ; DIR. Вывод списка файлов и папок ; ;/////////////////////////////////////////////////// -cmd_dir: push de +cmd_dir: + push de ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS - ld (disk+1),a ; номер диска + ADD A,"A" + ld (root_path),a ; номер диска + SUB "A" call read_disk_info ; прочитать метку и серийный номер диска pop de ld hl,0 @@ -51,9 +54,15 @@ cmd_dir: push de ;ld ix,T9186 ld ix,work_buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи - and 10h ; папка ? - jr nz,.next ; да + and FAT_ATTR.DIRECTORY ; папка ? + jr z,.calc_size ; нет + ; увеличиваем счётчик папок + ld hl,(dir_number) + inc hl + ld (dir_number),hl + jr .next ; прибавить размер тек. файла +.calc_size: ld hl,(D88DC) inc hl ld (D88DC),hl @@ -71,8 +80,7 @@ cmd_dir: push de ld (D88DE),hl exx ld (D88E0),hl -.next: ;ld de,T9186 ; раб. буфер - ld de,work_buffer1 ; 80 буфер +.next: ld de,work_buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS jr nc,.loop ; назад в цикл, если не конец списка @@ -123,6 +131,7 @@ cmd_dir: push de ldi ldi ldi +недоделано ld hl,T8B46 ; "0 000 000 000" ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем), макс.15 симв. @@ -163,7 +172,7 @@ cmd_dir: push de ld de,0 ; индекс "Volume in drive %1 has no label..." ;!HARDCODE номер строки MSG0 JP MESSAGE ; вывести строку -.str: DZ 'X:\ is empty' ;R14 +.str: DZ 'X:\ is empty' ;R14 ;!FIXIT ; ; Подготовить строку списка файлов/папок @@ -402,127 +411,151 @@ A8B16: inc a ld (ix+0),a inc ix ret - - - +; D88DC: dw 0 D88DE: dw 0 D88E0: dw 0 - - +; T8B2E: db "000000000" T8B37: db "0" T8B38: db " ",0 T8B46: db "0 000 000 000",0 db 0 - - - - +; ;!FIXIT перенести в DSS - FN #04: GET_BPB ; прочитать BPB диска read_disk_info: -disk: ld a,0 ; сохр. номер диска - ld c,1 ; open device - rst 18h - jr c,get_inf_data_err ;!FIXIT нет обработчика ошибк - ld a,(disk+1) - ld de,work_buffer ; буфер - ld c,4 ; get BPB - rst 18h - push af - ld a,(disk+1) ; номер диска - ld c,2 ; close device - rst 18h - pop af - jr c,get_inf_data_err ;!FIXIT нет обработчика ошибки -; -get_inf_data_err: -; + OR #80 + LD HL,work_buffer + LD BC,Dss.DskInfo + RST ToDSS + ; Файловая система + ; Серийный номер диска + ; Метка диска в BPB - ; Серийный номер лог. диска - ld hl,(work_buffer+41) ; ст.часть + ; parse + LD D,0 + LD HL,work_buffer + ; тут в HL длина поля "Файловая система" + LD E,(HL) + ADD HL,DE + INC HL + ; длина поля "Серийный номер диска" + LD A,(HL) + LD E,A + ADD HL,DE + INC HL + PUSH HL ; указатель на длину поля "Метка диска" + CP 4 ;!HARDCODE длина поля серийного номера + JR NZ,unknown_serial + DEC HL + ; старшее слово серийника + LD D,(HL) + DEC HL + LD E,(HL) + DEC HL + PUSH HL + EX DE,HL ld de,serial_string ; xxxx-xxxx call hex16 + POP HL + ; ld a,"-" ld (de),a - inc de - ld hl,(work_buffer+39) ; мл.часть + INC DE + ; младшее слово серийника + LD A,(HL) + DEC HL + LD L,(HL) + LD H,A call hex16 ; + ; Метка диска - ld a,(disk+1) ; номер диска - cp 2 ; меньше "C:" ? - jr nc,get_inf_data1 ; метка в BPB - ; floppy, метка - как запись файла - ld c,Dss.ChDisk ; уст. диск - RST ToDSS + ; ld a,(disk) ; номер диска + ; cp 2 ; меньше "C:" ? + ; jr nc,get_inf_data1 ; метка в BPB + +.get_label: + ; ищем метку в корне ФС раздела ; уст. корень диска - ld hl,root_path ; "\",0 + ld hl,root_path ; "x:\",0 ld c,Dss.ChDir RST ToDSS ; поиск метки ld hl,mask_fname ; "*.*" имя метки ld de,work_buffer1 ; куда - ld a,8 ; атрибут метки тома + ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома ld bc,0*256 + Dss.F_First ; f_first, формат 11 RST ToDSS push af call restore_path ; восст. тек. путь pop af - jr c,no_volume_label ; метки нет + ;jr c,no_volume_label ; метки нет дирректории ld hl,work_buffer1+33 ; начало метки в буфере f_first - jr volume_label + jr nc,volume_label ; метка в корневом каталоге + ; берём метку из BPB + ; тут в HL длина поля "Метка диска" + POP hl + LD A,(HL) + INC HL + AND A + jr z,.no_volume_label ; да + PUSH HL + LD B,A + LD A,' ' ; -get_inf_data1: ;!FIXIT так там пробелы стоять могут, если метка короче 11 символов - ld hl,work_buffer+53 ; конец метки в BPB - ld a,(hl) - cp " " ; есть метка ? - ld hl,work_buffer+43 ; начало метки в BPB - jr nz,volume_label ; да -;!FIXIT сделать через аргументы %1-%9 +.loop: CP (HL) + JR NZ,.good_label + INC HL + DJNZ .loop + POP HL ; снимаем лишнее ; нет метки -no_volume_label: ;!FIXIT сделать через PRM %4 - ld hl,volume_string1 ; "has no label " - ld de,MSG0.volume_string ; куда - ld bc,14 - ldir +.no_volume_label: + ; %4 + ld hl,volume_string_no ; строка + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем) + XOR A + LD (PRM5),A ret +.good_label: + POP HL + PUSH HL ; лишнее ;!FIXIT сделать через аргументы %1-%9 ; есть метка volume_label: - ex de,hl - ld hl,MSG0.volume_string ; куда - ld (hl),"i" - inc hl - ld (hl),"s" - inc hl - ld (hl)," " - inc hl - ex de,hl - ; скопир. имя метки - ld bc,11 ; макс. длина метки - ld a,(hl) - cp " "+1 - jr nc,$+6 - inc hl - dec c - jr $-7 - ld a,11 - sub c + pop DE ; лишнее + ; %5 + ld de,PRM5 + ld bc,11 ;!HARDCODE длина метки ldir - ld b,a - or a ; длина метки 11 симв. ? - ret z ; да - ; дополнить хвост. пробелами + xor a ld (de),a - inc de - djnz $-2 - ret + ; %4 + ld hl,volume_string_yes ; строка + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем) + ret + ; +; если не удалось прочитать серийный номер диска или формат неизвестен +unknown_serial: + ; серийный номер диска - неизвестен ;!HARDCODE ниже + LD HL,serial_string + LD A,'?' + LD B,serial_string.Size +.loop: LD (HL),A + INC HL + DJNZ .loop + LD HL,serial_string+4 + LD (HL),'-' + ;POP HL ; лишнее + JP read_disk_info.get_label + ; @@ -538,33 +571,34 @@ hex8: push af rrca rrca rrca - call $+4 + call .num pop af - and 0Fh - add a,90h + ; +.num: and %0000'1111 + add a,#90 daa - adc a,40h + adc a,#40 daa ld (de),a inc de ret - - ; маска файлов mask_fname: db "*.*",0 ; корень диска root_path: - db '\',0 - - + db 'X:\',0 ; Серийный номер диска serial_string: - db "xxxx-xxxx",0 + db "xxxx-xxxx" +.Size equ $-serial_string + db 0 ; закрывашка -volume_string1: ;!FIXIT сделать через PRM - db "has no label " ; 14 +volume_string_no: ;!FIXIT сделать через PRM + db "has no label",0 +volume_string_yes: + db "has label",0 \ No newline at end of file diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index 55b76f6..7b8087f 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -226,7 +226,9 @@ prne1__:ld (cursor_position),a ; X ; Чтение событий ;------------------------------------------------- handle_event: - ld de,(cursor_position) +cursor_position+1: + ld de,0 + ; ld c,Dss.Locate RST ToDSS ld c,Dss.EchoKey ; опрос клавы @@ -956,36 +958,37 @@ not_move_to_end: +;!FIXIT к буферам почти всё +//////////////////////////////////////////////////////////////////////// +; 1 0 +;cursor_position: +; dw 0 ; Y/X полож. курсора - -cursor_position: - dw 0 ; Y/X полож. курсора - +; 2 0 width_inpline: .MAX EQU 80 db width_inpline.MAX-4 ; тек. ширина поля ввода +; 3 0 YXpos: dw 0 ; Y/X начало ком-строки - +; 4 0 ; режим ввода insert_mode: db 1 ; 01/00 inser/overwrite - - +; 5 0 ; экранный путь screen_path: db "A:" - ds max_screen_path+1 ; 32+1 + BLOCK max_screen_path+1,0 ; 32+1 +; 6 0 ; системный путь system_path: - ;db "\BORLAND\LMDTOOLS\TESTING\PROGRAM\SOURCES\TURBO\PR",0 - ds 256 - - + BLOCK 256,0 ;!HARDCODE +; 7 0 ; Структура строки ввода ~input line~ struct_input_line: db max_len_comline ;+0 254 макс. число ввод. символов @@ -995,12 +998,14 @@ struct_input_line: db 0 ;+4 число введенных символов ds max_len_comline+1 ;+5 строка ввода - +; 8 0 ; Буфер истории history_buff: - ds history_size ; 256 - + BLOCK history_size,0 ; 256 +; 9 0 ; Рабочий буфер work_buffer: - ds 512 + BLOCK 512,0 +//////////////////////////////////////////////////////////////////////// +; \ No newline at end of file diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM index 9bab454..1f0a770 100644 --- a/SHELL/ERROR.ASM +++ b/SHELL/ERROR.ASM @@ -131,35 +131,29 @@ DIR2MSG EQU 9 DIR3MSG EQU 10 HELPMSG EQU 11 -MSG0: db 0 -; 0 - db "Volume on drive %1 " -.volume_string: ;!FIXIT сделать через PRM - db "has no label ",CR,LF ;0 - db "The volume serial number is %2",CR,LF - db CR,LF,"Directory of %3",CR,LF,LF,0 -; 1 - db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 -; 2 - db "Current date: %1",CR,LF,0 ;2 - db "Current time: %1",CR,LF,0 ;3 - db "Press any key to continue . . .",CR,LF,LF,0 ;4 - db "Invalid parametr",CR,LF,0 ;5 - db "Echo is %1",CR,LF,0 ;6 - db "on",0 ;7 - db "off",0 ;8 - db " %1 file(s) %2 bytes",CR,LF,LF,0 ;9 -; 10 FILENAME EXT SIZE DATE TIME - db "%1 %2 %3 %4 %5",CR,LF,0 ;10 -; 11 - DB "COMMANDS:",CR,LF,CR,LF - DB "DIR REN | RENAME PATH HELP ",CR,LF - DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - DB "MD | MKDIR TIME ECHO EXIT ",CR,LF - DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 +MSG0: db 0 +/* 0 */ db "Volume in drive %1 %4 %5",CR,LF + db "Volume Serial Number is %2",CR,LF + db CR,LF,"Directory of %3",CR,LF,LF,0 +/* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 +/* 2 */ db "Current date: %1",CR,LF,0 +/* 3 */ db "Current time: %1",CR,LF,0 +/* 4 */ db "Press any key to continue . . .",CR,LF,LF,0 +/* 5 */ db "Invalid parametr",CR,LF,0 +/* 6 */ db "Echo is %1",CR,LF,0 +/* 7 */ db "on",0 +/* 8 */ db "off",0 +/* 9 */ db " %1 File(s) %2 bytes",CR,LF + db " %3 Dir(s) %4 bytes",CR,LF,LF,0 +/* 10 */ db "%1 %2 %3 %4 %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME +/* 11 */ DB "COMMANDS:",CR,LF,CR,LF + DB "DIR REN | RENAME PATH HELP ",CR,LF + DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF + DB "MD | MKDIR TIME ECHO EXIT ",CR,LF + DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 ;R11 - BYTE 0 - DZ "Unknown command" + DB 0 + DZ "Unknown command" ; .Size EQU $-MSG0 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index cfe8a7e..a0f5008 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -316,6 +316,7 @@ save_disk: ld (screen_path),a ; 33 строка экранного пути ret + ;!FIXIT убрать лишние вызовы ; Восстановить тек. диск и путь (после ошибки) restore_disk_path: ; уст. тек. диск @@ -323,6 +324,8 @@ restore_disk_path: sub "A" ld c,Dss.ChDir RST ToDSS + + ;!FIXIT убрать лишние вызовы restore_path: ; уст. тек. каталог ld hl,system_path ; 256 буфер сист. пути diff --git a/SHELL/build.txt b/SHELL/build.txt index 56749c8..405e057 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -96 \ No newline at end of file +127 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 1826974..349ba28 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 18269745815d90e76686f5693e0cb45f8f31741c +Subproject commit 349ba286106d21a77cf3f8a25b6f7c952eccb046 From 1533b897380105cba2ffebcd61e58207982e5035 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 24 Nov 2023 05:20:54 +1000 Subject: [PATCH 060/219] DSS: +new options for Dss.DskInfo. SHELL: keys for cmd_dir in progress... --- DSS/DOS5.ASM | 2 +- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 2 +- SHELL/Commands/DATE.ASM | 4 +- SHELL/Commands/DIR.ASM | 184 +++++++++++------- SHELL/Commands/ECHO.ASM | 2 +- SHELL/Commands/HELP.ASM | 2 +- SHELL/Commands/PAUSE.ASM | 6 +- SHELL/Commands/VER.ASM | 47 +---- SHELL/ERROR.ASM | 303 ----------------------------- SHELL/{SHELL_EXEC.ASM => EXEC.ASM} | 56 +----- SHELL/Messages/errors.asm | 60 ++++++ SHELL/Messages/main.asm | 44 +++++ SHELL/Procedures/Print.ASM | 118 +++++++++++ SHELL/Procedures/math.asm | 76 ++++++++ SHELL/Procedures/parsers.asm | 113 +++++++++++ SHELL/SHELL.ASM | 51 ++--- SHELL/build.txt | 2 +- 18 files changed, 572 insertions(+), 502 deletions(-) delete mode 100644 SHELL/ERROR.ASM rename SHELL/{SHELL_EXEC.ASM => EXEC.ASM} (77%) create mode 100644 SHELL/Messages/errors.asm create mode 100644 SHELL/Messages/main.asm create mode 100644 SHELL/Procedures/Print.ASM create mode 100644 SHELL/Procedures/math.asm create mode 100644 SHELL/Procedures/parsers.asm diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 3e45047..91fe33d 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -1460,7 +1460,7 @@ SEARCH: CPL LD C,A LD IX,DIRPAGE.buffer - ;TEST 9/11/23 + ;!TEST 9/11/23 ; EXX ; LD DE,0 ; EXX diff --git a/DSS/build.txt b/DSS/build.txt index a0d1ef1..c8a110e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -620 \ No newline at end of file +621 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index f025f2a..a00c92c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -307,7 +307,7 @@ A8286: ex af,af' ld hl,BATLIST ; команды "pause","rem" + dos-команды ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - jp COMP004 + jp COMP005.start diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index ebfc58e..b6f4b53 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -67,7 +67,7 @@ cmd_dt1:ld c,Dss.SysTime pop ix pop hl call A8964 - ld de,2 ; индекс "Current date: %1" + ld de,MAIN_MSG.DATE ; индекс "Current date: %1" jp MESSAGE ; вывести строку @@ -148,5 +148,5 @@ cmd_tm1:ld c,Dss.SysTime call A8913 ; десят. вывод в буфер xor a ld (hl),a ; в конец строки - ld de,3 ; индекс "Current time: %1" + ld de,MAIN_MSG.TIME ; индекс "Current time: %1" jp MESSAGE ; вывести строку diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index f0a6352..45ffc1f 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -5,17 +5,32 @@ ;/////////////////////////////////////////////////// cmd_dir: push de - ld c,Dss.CurDisk ; узнать тек. диск + ;;;; [ ] поддержка параметров + ; зануляем все параметры на старте + xor a + ld (read_disk_info.full),a + + + ; выполняем/настраиваем все найденные параметры в строке + ld hl,cmd_dir_options + LD C,256-3 ;!HARDCODE длина строки с командой +.parse: call RUN_OPTION + jr nc,.skip + jp (hl) + ; +.skip: ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS ADD A,"A" ld (root_path),a ; номер диска SUB "A" call read_disk_info ; прочитать метку и серийный номер диска + ; pop de ld hl,0 ld (D88DC),hl ld (D88DE),hl ld (D88E0),hl + ld (dir_number),hl ex de,hl ld a,(hl) or a @@ -26,41 +41,51 @@ cmd_dir: ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ; [ ] 1/10/23 - - ; - ;ld hl,T9186 ; имя файла - ;ld de,T9186 ; буфер ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер ld a,#37 ; атрибут (все, кроме метки тома) ld bc,0*256 + Dss.F_First ; f_first (формат 11) RST ToDSS - ;R14 - ;jp c,print_err_message ; вывод сообщения DSS_Error.sys.FILE_NOT_FOUND - JR NC,.not_empty - CP DSS_Error.sys.FILE_NOT_FOUND - JP NZ,print_err_message - SCF - JP .Print_Header -.not_empty: - CALL .Print_Header - ; + JR C,.dir_empty ;R14 + CALL .Print_Header ; цикл вывода списка файлов/папок -.loop: ;ld hl,T9186 ; раб. буфер - ld hl,work_buffer1 ; 80 +.loop: ld hl,work_buffer1 ; 80 ld de,33 add hl,de call A88E2 - ;ld ix,T9186 ld ix,work_buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and FAT_ATTR.DIRECTORY ; папка ? jr z,.calc_size ; нет + ; считаем папки + ; не считаем папкой служебные "." и ".." + ld d,(ix+33) + ld e,(ix+34) + ld hl,-('..') + add hl,de + ld a,h + or l + jr z,.next + ld hl,-('. ') + add hl,de + ld a,h + or l + jr z,.next ; увеличиваем счётчик папок ld hl,(dir_number) inc hl ld (dir_number),hl jr .next + + ;;R14 +.dir_empty: + push af + CALL .Print_Header + pop af + CALL print_err_message + jr .print + ;;R14 + ; прибавить размер тек. файла .calc_size: ld hl,(D88DC) @@ -131,17 +156,27 @@ cmd_dir: ldi ldi ldi -недоделано +; [ ] вывод количества папок +; [ ] вывод общего количества свободного места ld hl,T8B46 ; "0 000 000 000" ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ld de,9 ; индекс " %1 file(s) %2 bytes" + ; + ;!TEST + ;ld hl,(dir_number) + ;ld de,PRM3 + ;call hex2dec_ascii_16bit.n10000 + ; Десятичный вывод + ld hl,(dir_number) + ld ix,PRM3 ; буфер + call A8964 + ;xor a + ;ld (de),a + ; + ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s) %2 bytes" jp MESSAGE ; вывести строку - ;R14 .Print_Header: - PUSH AF - ; ; %1 ld a,(screen_path) ; диск ld hl,PRM1 @@ -154,27 +189,16 @@ cmd_dir: ld hl,serial_string ; строка серийного номера диска ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем) - ; - ;R14 - POP AF - ld hl,screen_path - JR NC,.not_empty_2 - ; - ld a,(screen_path) - LD (.str),A - ld hl,.str ; экран. путь - ; %3 -.not_empty_2: - ; + ; %3 + ld hl,screen_path ld de,PRM3 ; 16 буфер CALL copy_string ; скопир. строку (с нулем) ; - ld de,0 ; индекс "Volume in drive %1 has no label..." ;!HARDCODE номер строки MSG0 + ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." ;!HARDCODE номер строки MSG0 JP MESSAGE ; вывести строку - -.str: DZ 'X:\ is empty' ;R14 ;!FIXIT ; + ; Подготовить строку списка файлов/папок A88E2: ld bc,8 ld de,PRM1 ; буфер @@ -186,12 +210,11 @@ A88E2: ld bc,8 ldi ldi ld (de),a - ;ld ix,T9186 ld ix,work_buffer1 call A89A4 ; вывести в буфер имя файла и его размер (у папки ) call A89FA ; вывести в буфер дату файла/папки call A8A19 ; вывести в буфер время файла/папки - ld de,10 ; индекс "%1 %2 %3 %4 %5" + ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" jp MESSAGE ; вывод строки @@ -326,7 +349,7 @@ A8A7E: ld c,2Fh inc hl ret - +;!TODO перетащить в procedures/math.asm ; Десятичный 32-х разрядный вывод A8A8F: ld ix,T8B2E ; "0000000000" exx @@ -413,9 +436,10 @@ A8B16: inc a ret ; -D88DC: dw 0 -D88DE: dw 0 -D88E0: dw 0 +D88DC: dw 0 +D88DE: dw 0 +D88E0: dw 0 +dir_number: dw 0 ; T8B2E: db "000000000" @@ -425,12 +449,14 @@ T8B46: db "0 000 000 000",0 db 0 ; -;!FIXIT перенести в DSS - FN #04: GET_BPB -; прочитать BPB диска +; [ ] теперь не лезет напрямую, делает через новый параметр функции DskInfo +; иная логика получения метки тома - сначала ищется в корневой директории, +; если там нет, то берётся из BPB read_disk_info: OR #80 LD HL,work_buffer - LD BC,Dss.DskInfo +.full+1: LD B,0 + LD C,Dss.DskInfo RST ToDSS ; Файловая система ; Серийный номер диска @@ -558,32 +584,6 @@ unknown_serial: ; - -; Вывод HL в hex-формате -; de=буфер -; hl=число -hex16: ld a,h - call hex8 - ld a,l -; вывод "a" -hex8: push af - rrca - rrca - rrca - rrca - call .num - pop af - ; -.num: and %0000'1111 - add a,#90 - daa - adc a,#40 - daa - ld (de),a - inc de - ret - - ; маска файлов mask_fname: db "*.*",0 @@ -598,7 +598,41 @@ serial_string: .Size equ $-serial_string db 0 ; закрывашка -volume_string_no: ;!FIXIT сделать через PRM +volume_string_no: db "has no label",0 volume_string_yes: - db "has label",0 \ No newline at end of file + db "has label",0 + +; +cmd_dir_options: + ; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) + DB 'f' : DW cmd_dir_freeSpace +.Size EQU ($-cmd_dir_options)/3 +.paramLength equ 3 +; + +; +cmd_dir_freeSpace: + PUSH DE + PUSH BC + ; затираем найденый ключ + ld A,'/' + ex de,hl + ld bc,4 + CPDR + inc hl + ld (hl),' ' + inc hl + ld (hl),' ' + + ; ставим опцию для API DSS DskInfo + ld a,1 + ld (read_disk_info.full),a + ; выводим строку о расчёте свободного места так, чтоб она затёрлась + LD DE,MAIN_MSG.CALCULATING + CALL MESSAGE + ; возвращаемся в цикл + POP BC + POP DE + jp cmd_dir.parse +; \ No newline at end of file diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 574fac5..5974267 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -38,7 +38,7 @@ A862E: ld a,(echo_mode) ; фла call FMESAGE ; найти строку по индексу ld de,PRM1 ; куда (аргумент %1) call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ld de,6 ; индекс "Echo is %1" + ld de,MAIN_MSG.ECHO ; индекс "Echo is %1" jp MESSAGE ; A864B: ld (echo_mode),a ; флаг echo-режима diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index 782b68a..4d74175 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -4,5 +4,5 @@ ; ;/////////////////////////////////////////////////// cmd_help: - ld de,11 ; индекс "COMMANDS: ..." + ld de,MAIN_MSG.HELP ; индекс "COMMANDS: ..." jp MESSAGE diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 01a0d68..6debe1d 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -4,8 +4,8 @@ ; ;/////////////////////////////////////////////////// cmd_pause: - ld de,4 ; индекс "Press any key to continue ..." + ld de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." call MESSAGE ; вывод строки ld c,Dss.WaitKey ; ждем нажатия клавиши - RST ToDSS - ret + JP ToDSS + ;ret diff --git a/SHELL/Commands/VER.ASM b/SHELL/Commands/VER.ASM index b779bfd..f0fc837 100644 --- a/SHELL/Commands/VER.ASM +++ b/SHELL/Commands/VER.ASM @@ -16,46 +16,9 @@ cmd_version: LD DE,PRM2 CALL .Set_Ver_to_PRM ; set Shell version ;R13 - LD DE,VERSMSG + LD DE,MAIN_MSG.VERSION JP MESSAGE - ; вход: hl=число, de=буфер -.num_ver: -.num_mod: - ld ix,.tmp1__ - res 7,(ix+0) - jr .decim - - ; вход: hl=число, de=буфер -.num_build: - ld ix,.tmp1__ - res 7,(ix+0) - ld bc,100 ; 100 - call .num16 -.decim: ld bc,10 ; 10 - call .num16 - ld a,l - add a,"0" - jr .num16_exit - -.tmp1__: BYTE 0 - -.num16: ld a,'0'-1 - and a - inc a - sbc hl,bc - jr nc,$-3 - add hl,bc - cp "0" - jr z,$+6 - set 7,(ix+0) - bit 7,(ix+0) - ret z -.num16_exit: - ld (de),a ; сохр. в буфере - inc de - ret - ; ; Вход: ; L - номер версии (0..9) ; H - номер модификации (0..99) @@ -65,20 +28,20 @@ cmd_version: PUSH BC PUSH HL LD H,0 - CALL .num_ver ;decim2 номер версии (0..9) + CALL hex2dec_ascii_16bit.n10 ;decim2 номер версии (0..9) LD A,'.' LD (DE),A INC DE POP HL LD L,H LD H,0 - CALL .num_mod ;decim2 номер модификации (0..99) + CALL hex2dec_ascii_16bit.n10 ;decim2 номер модификации (0..99) POP HL LD A,'.' LD (DE),A INC DE - CALL .num_build ;decim3 номер билда (0..999) + CALL hex2dec_ascii_16bit.n100 ;decim3 номер билда (0..999) XOR A LD (DE),A RET -; +; \ No newline at end of file diff --git a/SHELL/ERROR.ASM b/SHELL/ERROR.ASM deleted file mode 100644 index 1f0a770..0000000 --- a/SHELL/ERROR.ASM +++ /dev/null @@ -1,303 +0,0 @@ -;------------------------------------------------- -; Вывод сообщения ошибки по индексу -; вход: a=номер ошибки -;------------------------------------------------- -print_err_message: - ld e,a - ld d,0 - inc de - ld hl,ERR0 ; массив строк - ld bc,ERR0.Size ; размер массива - call LCPIR ; найти строку - call PRINTZ ; формат. вывод строки - call newline - jp newline - - - -; Вывод строки ошибки -;A850D: -invalid_param: - ld de,5 ; индекс "Invalid parametr" - jr MESSAGE - - - -;------------------------------------------------- -; Вывод сообщения ошибки по индексу -; вход: de=индекс строки -;------------------------------------------------- -MESSAGE: - call FMESAGE ; найти строку по индексу - jp PRINTZ ; формат. вывод строки - ;jp A82CC ; узнать и уст. полож. курсора - - -; Найти строку по индексу -; вход: de=индекс строки -; выход: hl=строка -FMESAGE: inc de - ld hl,MSG0 ; начало массива строк - ld bc,MSG0.Size ; размер массива -LCPIR: xor a - cpir - ret po - ret nz - ;R11 - XOR A - CP (HL) - JR Z,.no_mess - ; - dec de - ld a,d - or e - jr nz,LCPIR - ret -.no_mess: INC HL - RET - -;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована -;----------------------------------------------------------------------; -; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 -; вход: hl=буфер строки -;----------------------------------------------------------------------; -PRINTZ: ld a,(hl) - inc hl - or a - ret z - cp '%' - jr z,.check_PRM -.char: ld c,Dss.PutChar - RST ToDSS - jp PRINTZ -.bad_PRM: - ld a,'%' - jp .char -.check_PRM: - ld a,(hl) - cp '9'+1 - jr nc,.bad_PRM - inc hl - sub '1' - push hl - ;!TEST - ;ld l,a - ;ld h,0 - ;add hl,hl ;1+1=2 - ;add hl,hl ;2+2=4 - ;add hl,hl ;4+4=8 - ;add hl,hl ;8+8=16 размер отдельного подбуфера - ADD A - ADD A - ADD A - ADD A - LD L,A - LD H,0 - ; - ld bc,PRM1 ; буфер - add hl,bc - ld c,Dss.PChars ; вывод строки - RST ToDSS - pop hl - jp PRINTZ - - - -;!FIXIT перенести к общим буферам как у меня -; буферы аргументов командной строки -PRM1: BLOCK 16,0 ; аргумент %1 -PRM2: BLOCK 16,0 ; аргумент %2 -PRM3: BLOCK 16,0 ; аргумент %3 -PRM4: BLOCK 16,0 ; аргумент %4 -PRM5: BLOCK 16,0 ; аргумент %5 -PRM6: BLOCK 16,0 ; аргумент %6 -PRM7: BLOCK 16,0 ; аргумент %7 -PRM8: BLOCK 16,0 ; аргумент %8 -PRM9: BLOCK 16,0 ; аргумент %9 - - - -;!TODO не забыть заменить цифры на эти метки -DIR1MSG EQU 0 -VERSMSG EQU 1 -DATEMSG EQU 2 -TIMEMSG EQU 3 -PAUSMSG EQU 4 -ILLGMSG EQU 5 -ECHOMSG EQU 6 -ON__MSG EQU 7 -OFF_MSG EQU 8 -DIR2MSG EQU 9 -DIR3MSG EQU 10 -HELPMSG EQU 11 - -MSG0: db 0 -/* 0 */ db "Volume in drive %1 %4 %5",CR,LF - db "Volume Serial Number is %2",CR,LF - db CR,LF,"Directory of %3",CR,LF,LF,0 -/* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 -/* 2 */ db "Current date: %1",CR,LF,0 -/* 3 */ db "Current time: %1",CR,LF,0 -/* 4 */ db "Press any key to continue . . .",CR,LF,LF,0 -/* 5 */ db "Invalid parametr",CR,LF,0 -/* 6 */ db "Echo is %1",CR,LF,0 -/* 7 */ db "on",0 -/* 8 */ db "off",0 -/* 9 */ db " %1 File(s) %2 bytes",CR,LF - db " %3 Dir(s) %4 bytes",CR,LF,LF,0 -/* 10 */ db "%1 %2 %3 %4 %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME -/* 11 */ DB "COMMANDS:",CR,LF,CR,LF - DB "DIR REN | RENAME PATH HELP ",CR,LF - DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - DB "MD | MKDIR TIME ECHO EXIT ",CR,LF - DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 - ;R11 - DB 0 - DZ "Unknown command" - ; -.Size EQU $-MSG0 - -/* -MSG0: DB 0 - DB "Volume in drive %1 has no label",CR,LF ; !FIXIT - DB "Volume Serial number is %2",CR,LF - DB "Directory of %3",CR,LF,CR,LF,0 - DB "Estex DSS: Version %1",CR,LF,0 ;R02 - DB "Current date: %1",CR,LF,0 - DB "Current time: %1",CR,LF,0 - DB "Press any key to continue . . .",CR,LF,0 - DB "Invalid parametr",CR,LF,0 - DB "Echo is %1",CR,LF,0 - DB "on",0 - DB "off",0 - DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 -; FILENAME EXT SIZE DATE TIME - DB "%1 %2 %3 %4 %5",CR,LF,0 - DB "COMMANDS:",CR,LF,CR,LF - DB "DIR REN | RENAME PATH HELP ",CR,LF - DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - DB "MD | MKDIR TIME ECHO EXIT ",CR,LF - DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 - ;R11 - BYTE 0 - DZ "Unknown command" - ; -.Size EQU $-MSG0 - -*/ -;----------------------------------------------------------------------- -;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются -ERR0: DB #00 - DZ "Bad command or file name" - DZ "Invalid function" ; 01 - неверный номер функции - DZ "Invalid drive number" ; 02 - неправильный номер устройства - DZ "File not found" ; 03 - файл не обнаружен - DZ "Path not found" ; 04 - неверный путь - DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "Too many open files" ; 06 - нет свободного файлового манипулятора - DZ "File already exist" ; 07 - файл существует - DZ "File read only" ; 08 - файл только для чтения - DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) - DZ "No free space" ; 10 - нет свободного места на диске - DZ "Directory not empty" ; 11 - каталог не пуст - DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог - DZ "Invalid media" ; 13 - неизвестный формат - DZ "Unknown operation" ;R02 ; 14 - невозможная операция - DZ "Directory exist" ; 15 - каталог уже есть - DZ "Invalid filename" ; 16 - неверное имя - DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл - DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен - DZ "Not ready" ; 20 - нет готовности - DZ "Seek error" ; 21 - ошибка позиционирования - DZ "Sector not found" ; 22 - сектор не найден - DZ "CRC error" ; 23 - ошибка CRC - DZ "Write protect" ; 24 - защита записи - DZ "Read error" ; 25 - ошибка чтения - DZ "Write error" ; 26 - ошибка записи - DZ "Drive failure" ; 27 - сбой диска - DZ "Extended error 28" - DZ "Extended error 29" - DZ "Not enough memory" ; 30 - недостаточно памяти - DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "Extended error 32" - DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной - DZ "Extended error 34" - DZ "Too many files in directory" ; 35 - слишком много файлов в директории - DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation aborted by user" ; 37 - операция прервана пользователем - DZ "Common error" ; 38 - общая ошибка - DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения - DZ "40" - DZ "41" - DZ "42" - DZ "43" - DZ "44" - DZ "45" - DZ "46" - DZ "Wrong video mode" ; 48 - неправильный видеорежим - DZ "48" - DZ "49" - DZ "50" - ;R11 - DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: - DZ "Unknown error" - ; -.Size EQU $-ERR0 -;----------------------------------------------------------------------- -/* -; Сообщения ошибок ДОС -ERR0: db 0 - db "Bad command or file name",0 ;0 - db "Invalid function",0 ;1 - db "Invalid drive number",0 ;2 - db "File not found",0 ;3 - db "Path not found",0 ;4 - db "Invalid handle",0 ;5 - db "Too many open files",0 ;6 - db "File already exist",0 ;7 - db "File read only",0 ;8 - db "Root overflow",0 ;9 - db "No free space",0 ;10 - db "Directory not empty",0 ;11 - db "Can't delete current directory",0 ;12 - db "Invalid media",0 ;13 - db "Unknown operation",0 ;14 - db "Directory exist",0 ;15 - db "Invalid filename",0 ;16 - db "Invalid EXE-file",0 ;17 - db "Not supported EXE-file",0 ;18 - db "Access denied",0 ;19 - db "Not ready",0 ;20 - db "Seek error",0 ;21 - db "Sector not found",0 ;22 - db "CRC error",0 ;23 - db "Write protect",0 ;24 - db "Read error",0 ;25 - db "Write error",0 ;26 - db "Drive failure",0 ;27 - db "Extended error 28",0 ;28 - db "Extended error 29",0 ;29 - db "Not enough memory",0 ;30 - db "Invalid memory block",0 ;31 - db "Extended error 32",0 ;32 - db "Extended error 33",0 ;33 - db "Extended error 34",0 ;34 - db "Too many files in directory",0 ;35 список файлов - db "36",0 ;36 (слишком большая влож. папок или >= 1024 папок) - db "User abort",0 ;37 User abort (операция прервана пользователем) - db "38",0 ;38 - db "39",0 ;39 - db "40",0 ;40 - db "41",0 ;41 - db "42",0 ;42 - db "43",0 ;43 - db "44",0 ;44 - db "45",0 ;45 - db "46",0 ;46 - db "47",0 ;47 - db "48",0 ;48 - db "49",0 ;49 - db "50",0 ;50 -.Size EQU $-ERR0 -*/ diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/EXEC.ASM similarity index 77% rename from SHELL/SHELL_EXEC.ASM rename to SHELL/EXEC.ASM index a8be837..31f4e8e 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -9,11 +9,9 @@ D8374: dw 0 COMP: call EVALCMD ; (batch.asm) ld hl,struct_input_line+5 dec hl - ;ld hl,struct_input_line+4;; ld c,(hl) ; длина строки ld b,0 inc hl ; struct_input_line+5 - ;ld hl,work_buffer+256;; .loop: ld a,(hl) cp " " jr nz,COMP01 @@ -36,50 +34,11 @@ COMP01: ld d,h COMP005: ex af,af' sub c ld c,a - ld hl,CMDLIST ; список команд ДОС-а - ; de=struct_input_line+5, c=длина строки -; от bat-отработки -COMP004: push bc - push de -COMP000: ld a,(de) - cp "a" - jr c,COMP001 - cp "z"+1 - jr nc,COMP001 - and #5F ; a..z -> A..Z -COMP001: cp (hl) - jr nz,COMP002 ; не дос-команды - inc hl - inc de - dec c - jr nz,COMP000 - xor a - cp (hl) - jr nz,COMP002 - pop bc - pop bc - ld a,(de) - cp " " - jr nz,NOSPC - inc de -NOSPC: inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - jp (hl) ; на соотв. обработчик дос-команды - -; Не дос-команды. Тест на задание диска и запуск файла -COMP002: xor a - LD C,A - CPIR - inc hl - inc hl - pop de - pop bc - ld a,(hl) - or a - jr nz,COMP004 ; назад в цикл, еще не дошли конца списка дос-команд + ld hl,CMDLIST ; список команд ДОС-а +.start: call RUN_COMMAND + jr nc,.skip ; NC если не найдена команда + jp (hl) +.skip: ; Не дос-команды. Тест на зад`ание диска и запуск файла ld h,d ld l,e ; hl=struct_input_line+5 @@ -99,7 +58,7 @@ COMP002: xor a cp "z"+1 jr nc,NOUP and #5F ; a..z -> A..Z -;!!!!! тут восстанавливается директория и могут быть глюки на новом ядре +;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS @@ -241,4 +200,5 @@ RESTORE_ALL: CALL Restore_Screen ;R10 ; - RET \ No newline at end of file + RET +; \ No newline at end of file diff --git a/SHELL/Messages/errors.asm b/SHELL/Messages/errors.asm new file mode 100644 index 0000000..da24021 --- /dev/null +++ b/SHELL/Messages/errors.asm @@ -0,0 +1,60 @@ +;----------------------------------------------------------------------- +;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются +ERR0: DB #00 + DZ "Bad command or file name" + DZ "Invalid function" ; 01 - неверный номер функции + DZ "Invalid drive number" ; 02 - неправильный номер устройства + DZ "File not found" ; 03 - файл не обнаружен + DZ "Path not found" ; 04 - неверный путь + DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор + DZ "Too many open files" ; 06 - нет свободного файлового манипулятора + DZ "File already exist" ; 07 - файл существует + DZ "File read only" ; 08 - файл только для чтения + DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) + DZ "No free space" ; 10 - нет свободного места на диске + DZ "Directory not empty" ; 11 - каталог не пуст + DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог + DZ "Invalid media" ; 13 - неизвестный формат + DZ "Unknown operation" ;R02 ; 14 - невозможная операция + DZ "Directory exist" ; 15 - каталог уже есть + DZ "Invalid filename" ; 16 - неверное имя + DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл + DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла + DZ "Access denied" ; 19 - ресурс не доступен + DZ "Not ready" ; 20 - нет готовности + DZ "Seek error" ; 21 - ошибка позиционирования + DZ "Sector not found" ; 22 - сектор не найден + DZ "CRC error" ; 23 - ошибка CRC + DZ "Write protect" ; 24 - защита записи + DZ "Read error" ; 25 - ошибка чтения + DZ "Write error" ; 26 - ошибка записи + DZ "Drive failure" ; 27 - сбой диска + DZ "Extended error 28" + DZ "Extended error 29" + DZ "Not enough memory" ; 30 - недостаточно памяти + DZ "Invalid memory block" ; 31 - несуществующий блок памяти + DZ "Extended error 32" + DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной + DZ "Extended error 34" + DZ "Too many files in directory" ; 35 - слишком много файлов в директории + DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + DZ "Operation aborted by user" ; 37 - операция прервана пользователем + DZ "Common error" ; 38 - общая ошибка + DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения + DZ "40" + DZ "41" + DZ "42" + DZ "43" + DZ "44" + DZ "45" + DZ "46" + DZ "Wrong video mode" ; 48 - неправильный видеорежим + DZ "48" + DZ "49" + DZ "50" + ;R11 + DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: + DZ "Unknown error" + ; +.Size EQU $-ERR0 +;----------------------------------------------------------------------- \ No newline at end of file diff --git a/SHELL/Messages/main.asm b/SHELL/Messages/main.asm new file mode 100644 index 0000000..24315db --- /dev/null +++ b/SHELL/Messages/main.asm @@ -0,0 +1,44 @@ +;!TODO не забыть заменить цифры на эти метки +MAIN_MSG: +.DIR_1 EQU 0 +.VERSION EQU 1 +.DATE EQU 2 +.TIME EQU 3 +.PAUSE EQU 4 +.INVALID EQU 5 +.ECHO EQU 6 +.ON EQU 7 +.OFF EQU 8 +.DIR_2 EQU 9 +.DIR_3 EQU 10 +.HELP EQU 11 +.CALCULATING EQU 12 + +.TABLE: db 0 +/* 0 */ db "Volume in drive %1 %4 %5",CR,LF + db "Volume Serial Number is %2",CR,LF + db CR,LF,"Directory of %3",CR,LF,LF,0 +/* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 +/* 2 */ db "Current date: %1",CR,LF,0 +/* 3 */ db "Current time: %1",CR,LF,0 +/* 4 */ db "Press any key to continue . . .",CR,LF,LF,0 +/* 5 */ db "Invalid parametr",CR,LF,0 +/* 6 */ db "Echo is %1",CR,LF,0 +/* 7 */ db "on",0 +/* 8 */ db "off",0 +/* 9 */ db " %1 File(s) %2 bytes",CR,LF + db " %3 Dir(s)",CR,LF,LF,0 +; db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 +/* 10 */ db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME +/* 11 */ DB "COMMANDS:",CR,LF,CR,LF + DB "DIR REN | RENAME PATH HELP ",CR,LF + DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF + DB "MD | MKDIR TIME ECHO EXIT ",CR,LF + DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 +/* 12 */ DB "Calculating free space...",CR,0 + ;R11 + DB 0 + DZ "Unknown command" + ; +.TABLE.Size EQU $-.TABLE +; \ No newline at end of file diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM new file mode 100644 index 0000000..3d84414 --- /dev/null +++ b/SHELL/Procedures/Print.ASM @@ -0,0 +1,118 @@ +;------------------------------------------------- +; Вывод сообщения ошибки по индексу +; вход: a=номер ошибки +;------------------------------------------------- +print_err_message: + ld e,a + ld d,0 + inc de + ld hl,ERR0 ; массив строк + ld bc,ERR0.Size ; размер массива + call LCPIR ; найти строку + call PRINTZ ; формат. вывод строки + call newline + jp newline + + + +; Вывод строки ошибки +;A850D: +invalid_param: + ld de,MAIN_MSG.INVALID ; индекс "Invalid parametr" + jr MESSAGE + + + +;------------------------------------------------- +; Вывод сообщения ошибки по индексу +; вход: de=индекс строки +;------------------------------------------------- +MESSAGE: + call FMESAGE ; найти строку по индексу + jp PRINTZ ; формат. вывод строки + ;jp A82CC ; узнать и уст. полож. курсора + + +; Найти строку по индексу +; вход: de=индекс строки +; выход: hl=строка +FMESAGE: inc de + ld hl,MAIN_MSG.TABLE ; начало массива строк + ld bc,MAIN_MSG.TABLE.Size ; размер массива +LCPIR: xor a + cpir + ret po + ret nz + ;R11 + XOR A + CP (HL) + JR Z,.no_mess + ; + dec de + ld a,d + or e + jr nz,LCPIR + ret +.no_mess: INC HL + RET + +;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована +;----------------------------------------------------------------------; +; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 +; вход: hl=буфер строки +;----------------------------------------------------------------------; +PRINTZ: ld a,(hl) + inc hl + or a + ret z + cp '%' + jr z,.check_PRM +.char: ld c,Dss.PutChar + RST ToDSS + jp PRINTZ +.bad_PRM: + ld a,'%' + jp .char +.check_PRM: + ld a,(hl) + cp '9'+1 + jr nc,.bad_PRM + inc hl + sub '1' + push hl + ;!TEST + ;ld l,a + ;ld h,0 + ;add hl,hl ;1+1=2 + ;add hl,hl ;2+2=4 + ;add hl,hl ;4+4=8 + ;add hl,hl ;8+8=16 размер отдельного подбуфера + ADD A + ADD A + ADD A + ADD A + LD L,A + LD H,0 + ; + ld bc,PRM1 ; буфер + add hl,bc + ld c,Dss.PChars ; вывод строки + RST ToDSS + pop hl + jp PRINTZ + + + + +;!FIXIT перенести к общим буферам как у меня +; буферы аргументов командной строки +PRM1: BLOCK 16,0 ; аргумент %1 +PRM2: BLOCK 16,0 ; аргумент %2 +PRM3: BLOCK 16,0 ; аргумент %3 +PRM4: BLOCK 16,0 ; аргумент %4 +PRM5: BLOCK 16,0 ; аргумент %5 +PRM6: BLOCK 16,0 ; аргумент %6 +PRM7: BLOCK 16,0 ; аргумент %7 +PRM8: BLOCK 16,0 ; аргумент %8 +PRM9: BLOCK 16,0 ; аргумент %9 +; \ No newline at end of file diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm new file mode 100644 index 0000000..9e3ac42 --- /dev/null +++ b/SHELL/Procedures/math.asm @@ -0,0 +1,76 @@ +;----------------------------------------------------------------------; +; Вывод HL в hex-формате +; de=буфер +; hl=число +hex16: ld a,h + call hex8 + ld a,l +; вывод "a" +hex8: push af + rrca + rrca + rrca + rrca + call .num + pop af + ; +.num: and %0000'1111 + add a,#90 + daa + adc a,#40 + daa + ld (de),a + inc de + ret +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +;!FIXIT есть дубль hex2dec_ascii_16bit +; вход: hl=число, de=буфер +hex2dec_ascii_16bit: +.n10: ld ix,.tmp1 + res 7,(ix+0) + jr .decim + ; +.n10000: ld ix,.tmp1 + res 7,(ix+0) + ld bc,100 + call .num16 + jr .skip1 + ; +.n1000: ld ix,.tmp1 + res 7,(ix+0) +.skip1: ld bc,100 + call .num16 + jr .skip2 + ; +.n100: ld ix,.tmp1 + res 7,(ix+0) +.skip2: ld bc,100 + call .num16 + ; +.decim: ld bc,10 + call .num16 + ld a,l + add a,"0" + jr .num16_exit + ; +.num16: ld a,'0'-1 + and a + inc a + sbc hl,bc + jr nc,$-3 + add hl,bc + cp "0" + jr z,$+6 + set 7,(ix+0) + bit 7,(ix+0) + ret z +.num16_exit: + ld (de),a ; сохр. в буфере + inc de + ret + ; +.tmp1: BYTE 0 +;----------------------------------------------------------------------; diff --git a/SHELL/Procedures/parsers.asm b/SHELL/Procedures/parsers.asm new file mode 100644 index 0000000..826fe41 --- /dev/null +++ b/SHELL/Procedures/parsers.asm @@ -0,0 +1,113 @@ +//////////////////////////////////////////////////////////////////////// +; Вход: hl - список команд формата: "строка",0,cmd_addr +; de - строка с командой +; c - длина строки +; Выход: CF=1 - в HL адрес команды на исполнение +; CF=0 - нет опознаной команды +RUN_COMMAND: + push bc + push de + ; +.loop: ld a,(de) + cp "a" + jr c,.skip + cp "z"+1 + jr nc,.skip + and %0101'1111 ; a..z -> A..Z +.skip: cp (hl) + jr nz,.not_cmd ; не команда + inc hl + inc de + dec c + jr nz,.loop + ; + xor a + cp (hl) + jr nz,.not_cmd + pop bc + pop bc + ld a,(de) + cp " " + jr nz,.no_sp + inc de +.no_sp: inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + scf ; маркер опознаной команды + ret + ;jp (hl) ; на соотв. обработчик команды +.not_cmd: + xor a + LD C,A + CPIR + inc hl + inc hl + pop de + pop bc + ld a,(hl) + or a + jr nz,RUN_COMMAND ; назад в цикл, еще не дошли конца списка дкоманд + ret + ; +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// +; Вход: hl - список ключей формата: "строка",cmd_addr +; de - строка с командой +; c - длина строки с командой +; Выход: CF=1 - в HL адрес ключа на исполнение +; CF=0 - нет опознаного ключа +RUN_OPTION: +.cont: EX DE,HL + LD B,C +.loop: LD A,(HL) + CP '/' ; + INC HL + JR Z,.got + AND A + RET Z + DJNZ .loop + ; not found key + AND A + RET + ; +.got: LD C,B + INC HL + LD A,(HL) + DEC C + CP ' ' + JR Z,.good + AND A + JR NZ,RUN_OPTION.loop + LD C,1 + ; +.good: push hl + dec hl + ld b,cmd_dir_options.Size ;!HARDCODE + ex de,hl + ld a,(de) + OR %0010'0000 + ld de,cmd_dir_options.paramLength ;!HARDCODE + ; +.find: cp (hl) + jr z,.found + add hl,de + djnz .find + ; not found + pop hl + jr RUN_OPTION + ; found +.found: pop de + LD B,C + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + scf ; маркер опознаной опции + ret + +//////////////////////////////////////////////////////////////////////// diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index a0f5008..58f6514 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -443,9 +443,9 @@ A895A: cp "0" sub "0" ret - +;!FIXIT есть дубл A8964: ld de,10000 - ld a,0C8h ; ret z + ld a,#C8 ; ret z ld (D8996),a call A898E ld de,1000 @@ -521,28 +521,33 @@ T8C21: db "ON",0 T8C24: db "OFF",0 - include "edline.asm" ; строка редактирования - include "batch.asm" ; парсинг bat-файлов - include "shell_exec.asm" ; выполн. введ. команд с консоли - include "error.asm" ; функции вывода сообщений ошибок + include 'edline.asm' ; строка редактирования + include 'batch.asm' ; парсинг bat-файлов + include 'exec.asm' ; выполн. введ. команд с консоли + include 'procedures/print.asm' ; функции вывода сообщений + include 'messages/errors.asm' ; сообщения об ошибках + include 'messages/main.asm' ; сообщения + include 'procedures/parsers.asm' ; функции прочесывания и выбора + include 'procedures/math.asm' ; функции математические + ; - include "Commands/exit.asm" ; выход в родит. процесс - include "Commands/pause.asm" ; пауза - include "Commands/rem.asm" ; комментарий - include "Commands/ver.asm" ; вывод версии ДОС - include "Commands/cls.asm" ; очистка экрана - include "Commands/date.asm" ; вывод или установка даты/времени - include "Commands/dir.asm" ; вывод списка директории - include "Commands/chdir.asm" ; смена тек. каталога - include "Commands/mkdir.asm" ; создание каталога - include "Commands/rmdir.asm" ; удаление каталога - include "Commands/del.asm" ; удаление файла - include "Commands/ren.asm" ; переименование файла или каталога - include "Commands/echo.asm" ; эхо-режим - include "Commands/help.asm" ; вывод экрана помощи - include "Commands/path.asm" ; задать сист. путь - include "Commands/set.asm" ; задать переменную окружения - include "Commands/reboot.asm" ; софт ресет + include 'Commands/exit.asm' ; выход в родит. процесс + include 'Commands/pause.asm' ; пауза + include 'Commands/rem.asm' ; комментарий + include 'Commands/ver.asm' ; вывод версии ДОС + include 'Commands/cls.asm' ; очистка экрана + include 'Commands/date.asm' ; вывод или установка даты/времени + include 'Commands/dir.asm' ; вывод списка директории + include 'Commands/chdir.asm' ; смена тек. каталога + include 'Commands/mkdir.asm' ; создание каталога + include 'Commands/rmdir.asm' ; удаление каталога + include 'Commands/del.asm' ; удаление файла + include 'Commands/ren.asm' ; переименование файла или каталога + include 'Commands/echo.asm' ; эхо-режим + include 'Commands/help.asm' ; вывод экрана помощи + include 'Commands/path.asm' ; задать сист. путь + include 'Commands/set.asm' ; задать переменную окружения + include 'Commands/reboot.asm' ; софт ресет ; DISPLAY "Empty space for buffers from ",/H,$ work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes diff --git a/SHELL/build.txt b/SHELL/build.txt index 405e057..83981c0 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -127 \ No newline at end of file +175 \ No newline at end of file From ce4125e4c666d564658e9cdabbd79186bf6aa304 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 25 Nov 2023 08:26:45 +1000 Subject: [PATCH 061/219] dir.asm: pause scrolling, full info key '/f' --- SHELL/Commands/DIR.ASM | 281 +++++++++++++++++++++++++++++++-------- SHELL/Commands/PAUSE.ASM | 3 + SHELL/Messages/main.asm | 12 +- SHELL/build.txt | 2 +- 4 files changed, 240 insertions(+), 58 deletions(-) diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 45ffc1f..54b02cb 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -26,33 +26,56 @@ cmd_dir: call read_disk_info ; прочитать метку и серийный номер диска ; pop de + ld a,#ff + ld (.key_p),a ld hl,0 ld (D88DC),hl ld (D88DE),hl ld (D88E0),hl ld (dir_number),hl + ex de,hl - ld a,(hl) - or a - jr nz,1F ; задана маска имен - ld hl,mask_fname ; "*.*" - ;ld de,T9186 ; буфер -1: ld de,work_buffer1 ; 80 + ld de,work_buffer1 ; 80 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS + ; + ld a,(work_buffer1) + or a + jr nz,1F ; задана маска имен + ; + ld hl,mask_fname ; "*.*" + ld de,work_buffer1 + call copy_string ; [ ] 1/10/23 - ld hl,work_buffer1 ; имя файла +1: ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер ld a,#37 ; атрибут (все, кроме метки тома) ld bc,0*256 + Dss.F_First ; f_first (формат 11) RST ToDSS JR C,.dir_empty ;R14 CALL .Print_Header + ; + LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE + PUSH AF ; цикл вывода списка файлов/папок -.loop: ld hl,work_buffer1 ; 80 - ld de,33 - add hl,de +.loop: POP AF +.key_p+1: and #ff + dec a + jr nz,.skip_wait + ld de,MAIN_MSG.PAUSE + call MESSAGE ; вывести строку + ld c,Dss.WaitKey + rst ToDSS + ld a,32-1 +.skip_wait: + PUSH AF + ; + ld hl,work_buffer1+33 ; 80 + ;push af + ;ld de,33 + ;add hl,de call A88E2 + ; ld ix,work_buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and FAT_ATTR.DIRECTORY ; папка ? @@ -109,53 +132,61 @@ cmd_dir: ld c,Dss.F_Next ; поиск след. RST ToDSS jr nc,.loop ; назад в цикл, если не конец списка + pop af ; лишнее ; Десятичный вывод .print: ld hl,(D88DC) ld ix,PRM1 ; буфер call A8964 + ; ld hl,(D88DE) ; мл. разряд exx ld hl,(D88E0) ; ст. разряд exx - call A8A8F ; десятичный 32-х разрядный вывод - ld hl,T8B37 ; "0" - ld a,(hl) - cp " " - jr nz,.not_zero - ld a,"0" - ld (hl),a -.not_zero: - ld de,T8B46 ; "0 000 000 000" - ld hl,T8B2E ; "0000000000" - ld a,(hl) - ldi - cp " " - jr z,$+4 - ld a,"," ; разд. разрядов - ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,$+4 - ld a,"," ; разд. разрядов - ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,$+4 - ld a,"," ; разд. разрядов - ld (de),a - inc de - ldi - ldi - ldi + ; + ;;;;;;;;;;;;; +; call A8A8F ; десятичный 32-х разрядный вывод +; ld hl,T8B37 ; "0" +; ld a,(hl) +; cp " " +; jr nz,.not_zero +; ld a,"0" +; ld (hl),a +; .not_zero: +; ld de,T8B46 ; "0 000 000 000" +; ld hl,T8B2E ; "0000000000" +; ld a,(hl) +; ldi +; cp " " +; jr z,1F +; ld a,"," ; разд. разрядов +; 1: ld (de),a +; inc de +; ldi +; ldi +; ld a,(hl) +; ldi +; cp " " +; jr z,1F +; ld a,"," ; разд. разрядов +; 1: ld (de),a +; inc de +; ldi +; ldi +; ld a,(hl) +; ldi +; cp " " +; jr z,1F +; ld a,"," ; разд. разрядов +; 1: ld (de),a +; inc de +; ldi +; ldi +; ldi +; ret + CALL Size2Char + ;;;;;;;;;;;;; + ; ; [ ] вывод количества папок ; [ ] вывод общего количества свободного места ld hl,T8B46 ; "0 000 000 000" @@ -173,6 +204,24 @@ cmd_dir: ;xor a ;ld (de),a ; + ; + LD A,(read_disk_info.full) + OR A + ld hl,has_not_full_info + JR Z,.skip_full_space + ; + ld hl,(free_space) ; мл. разряд + exx + ld hl,(free_space+2) ; ст. разряд + exx + CALL Size2Char + ld hl,T8B46 ; "0 000 000 000" + ; +.skip_full_space: + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем), макс.15 симв. + ; + ; ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s) %2 bytes" jp MESSAGE ; вывести строку @@ -197,7 +246,7 @@ cmd_dir: ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." ;!HARDCODE номер строки MSG0 JP MESSAGE ; вывести строку ; - +; ; Подготовить строку списка файлов/папок A88E2: ld bc,8 @@ -440,6 +489,7 @@ D88DC: dw 0 D88DE: dw 0 D88E0: dw 0 dir_number: dw 0 +free_space: dword 0 ; T8B2E: db "000000000" @@ -461,7 +511,31 @@ read_disk_info: ; Файловая система ; Серийный номер диска ; Метка диска в BPB - + EX AF,AF' + LD A,(.full) + OR A + JR Z,.no_full_space_option + ; + ; (DE*A)*BC + ;PUSH HL ; общее кол-во кластеров + ;PUSH DE ; свободных кластеров + PUSH BC ; размер сектора в байтах + EX AF,AF' + LD C,A ; A - размер кластера в секторах + CALL Mult16X8 + ; A:HL = DE*A + ; + EX DE,HL + LD H,0 + LD L,A + POP BC + CALL Mult32 + LD (free_space+2),HL + EX DE,HL + LD (free_space),HL + ; + ; +.no_full_space_option: ; parse LD D,0 LD HL,work_buffer @@ -602,11 +676,13 @@ volume_string_no: db "has no label",0 volume_string_yes: db "has label",0 - +has_not_full_info: + db ' (?)',0 ; cmd_dir_options: ; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) DB 'f' : DW cmd_dir_freeSpace + ;DB 'p' : DW cmd_dir_pause .Size EQU ($-cmd_dir_options)/3 .paramLength equ 3 ; @@ -635,4 +711,105 @@ cmd_dir_freeSpace: POP BC POP DE jp cmd_dir.parse -; \ No newline at end of file +; +; cmd_dir_pause: +; xor a +; ld (cmd_dir.key_p),a +; jp cmd_dir.parse +/////////////////////////////////////////////////////////////////////////////////////// +Size2Char: + call A8A8F ; десятичный 32-х разрядный вывод + ld hl,T8B37 ; "0" + ld a,(hl) + cp " " + jr nz,.not_zero + ld a,"0" + ld (hl),a +.not_zero: + ld de,T8B46 ; "0 000 000 000" + ld hl,T8B2E ; "0000000000" + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ldi + ret +/////////////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------; +;Процедура умножения (16*8bit) +;На вход: DE*C +;На выход:A+HL-результат +Mult16X8: + SUB A + LD L,A + LD H,A + CP C + RET Z + OR D + OR E + RET Z + LD A,C + LD C,#00 + LD B,#08 +Mlt16x8: + ADD HL,HL + RLA + JR NC,1F + ADD HL,DE + ADC A,C +1: DJNZ Mlt16x8 + RET +;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +;Процедура умножения (32bit) +;На вход: HL+DE*BC +;На выход:HL+DE-результат +Mult32: + PUSH IX + LD IX,#0000 + LD A,#20 + EX DE,HL +mul32b: + ADD IX,IX + ADC HL,HL + RL E + RL D + JR NC,noadd1 + ADD IX,BC + JR NC,noadd1 + INC HL +noadd1: + DEC A + JR NZ,mul32b + LD E,LX + LD D,HX + POP IX + RET +;----------------------------------------------------------------------; +/////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 6debe1d..84cf4e3 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -6,6 +6,9 @@ cmd_pause: ld de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." call MESSAGE ; вывод строки + LD A,LF + LD C,Dss.PutChar + RST ToDSS ld c,Dss.WaitKey ; ждем нажатия клавиши JP ToDSS ;ret diff --git a/SHELL/Messages/main.asm b/SHELL/Messages/main.asm index 24315db..9754937 100644 --- a/SHELL/Messages/main.asm +++ b/SHELL/Messages/main.asm @@ -13,6 +13,7 @@ MAIN_MSG: .DIR_3 EQU 10 .HELP EQU 11 .CALCULATING EQU 12 +.CRLF EQU 13 .TABLE: db 0 /* 0 */ db "Volume in drive %1 %4 %5",CR,LF @@ -21,21 +22,22 @@ MAIN_MSG: /* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 /* 2 */ db "Current date: %1",CR,LF,0 /* 3 */ db "Current time: %1",CR,LF,0 -/* 4 */ db "Press any key to continue . . .",CR,LF,LF,0 +/* 4 */ db "Press any key to continue . . .",CR,0 /* 5 */ db "Invalid parametr",CR,LF,0 /* 6 */ db "Echo is %1",CR,LF,0 /* 7 */ db "on",0 /* 8 */ db "off",0 -/* 9 */ db " %1 File(s) %2 bytes",CR,LF - db " %3 Dir(s)",CR,LF,LF,0 -; db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 -/* 10 */ db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME +/* 9 */ db " %1 File(s) %2 bytes",CR,LF + db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 +; db " %3 Dir(s)",CR,LF,LF,0 +/* 10 */ db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME /* 11 */ DB "COMMANDS:",CR,LF,CR,LF DB "DIR REN | RENAME PATH HELP ",CR,LF DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF DB "MD | MKDIR TIME ECHO EXIT ",CR,LF DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 /* 12 */ DB "Calculating free space...",CR,0 +/* 13 */ DB CR,LF,0 ;R11 DB 0 DZ "Unknown command" diff --git a/SHELL/build.txt b/SHELL/build.txt index 83981c0..05cf258 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -175 \ No newline at end of file +201 \ No newline at end of file From c5ca8e7597956bd8ab909bec18b727026d79f2cd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 26 Nov 2023 06:28:22 +1000 Subject: [PATCH 062/219] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=20/f=20?= =?UTF-8?q?=D0=B8=20/p=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D1=8B=20DIR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SHELL/Commands/DIR.ASM | 85 +++++++++++-------- SHELL/Commands/ECHO.ASM | 2 +- SHELL/Messages/{errors.asm => errors_txt.asm} | 0 SHELL/Messages/main.asm | 46 ---------- SHELL/Messages/main_txt.asm | 59 +++++++++++++ SHELL/Procedures/parsers.asm | 30 +++++-- SHELL/SHELL.ASM | 4 +- SHELL/build.txt | 2 +- 8 files changed, 136 insertions(+), 92 deletions(-) rename SHELL/Messages/{errors.asm => errors_txt.asm} (100%) delete mode 100644 SHELL/Messages/main.asm create mode 100644 SHELL/Messages/main_txt.asm diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 54b02cb..f295c1e 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -9,15 +9,21 @@ cmd_dir: ; зануляем все параметры на старте xor a ld (read_disk_info.full),a - + ld (.key_p),a ; выполняем/настраиваем все найденные параметры в строке - ld hl,cmd_dir_options LD C,256-3 ;!HARDCODE длина строки с командой -.parse: call RUN_OPTION - jr nc,.skip +.parse: ld hl,cmd_dir_options + call RUN_OPTION + jr nc,.end_opt jp (hl) - ; +.end_opt: + ; выводим строку о расчёте свободного места так, чтоб она затёрлась + ld a,(read_disk_info.full) + and a + jr z,.skip + LD DE,MAIN_MSG.CALCULATING + CALL MESSAGE .skip: ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS ADD A,"A" @@ -26,8 +32,6 @@ cmd_dir: call read_disk_info ; прочитать метку и серийный номер диска ; pop de - ld a,#ff - ld (.key_p),a ld hl,0 ld (D88DC),hl ld (D88DE),hl @@ -205,10 +209,10 @@ cmd_dir: ;ld (de),a ; ; - LD A,(read_disk_info.full) - OR A - ld hl,has_not_full_info - JR Z,.skip_full_space + ;LD A,(read_disk_info.full) + ;OR A + ;ld hl,has_not_full_info + ;JR Z,.skip_full_space ; ld hl,(free_space) ; мл. разряд exx @@ -217,13 +221,20 @@ cmd_dir: CALL Size2Char ld hl,T8B46 ; "0 000 000 000" ; -.skip_full_space: +;.skip_full_space: ld de,PRM4 ; куда call ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; ; ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s) %2 bytes" - jp MESSAGE ; вывести строку + CALL MESSAGE ; вывести строку + ld a,(read_disk_info.full) + and a + ld de,MAIN_MSG.DIR_4 ; + jp nz,MESSAGE + ld de,MAIN_MSG.CRLF ; + jp MESSAGE + .Print_Header: ; %1 @@ -243,7 +254,7 @@ cmd_dir: ld de,PRM3 ; 16 буфер CALL copy_string ; скопир. строку (с нулем) ; - ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." ;!HARDCODE номер строки MSG0 + ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." JP MESSAGE ; вывести строку ; ; @@ -625,7 +636,7 @@ read_disk_info: .good_label: POP HL PUSH HL ; лишнее -;!FIXIT сделать через аргументы %1-%9 + ; есть метка volume_label: pop DE ; лишнее @@ -676,46 +687,46 @@ volume_string_no: db "has no label",0 volume_string_yes: db "has label",0 -has_not_full_info: - db ' (?)',0 +; has_not_full_info: +; db ' (?)',0 ; cmd_dir_options: ; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) DB 'f' : DW cmd_dir_freeSpace - ;DB 'p' : DW cmd_dir_pause + DB 'p' : DW cmd_dir_pause .Size EQU ($-cmd_dir_options)/3 .paramLength equ 3 ; ; cmd_dir_freeSpace: - PUSH DE - PUSH BC + ;PUSH DE + ;PUSH BC ; затираем найденый ключ - ld A,'/' - ex de,hl - ld bc,4 - CPDR - inc hl - ld (hl),' ' - inc hl - ld (hl),' ' + ; ld A,'/' + ; ex de,hl + ; ld bc,4 + ; CPDR + ; inc hl + ; ld (hl),' ' + ; inc hl + ; ld (hl),' ' ; ставим опцию для API DSS DskInfo ld a,1 ld (read_disk_info.full),a - ; выводим строку о расчёте свободного места так, чтоб она затёрлась - LD DE,MAIN_MSG.CALCULATING - CALL MESSAGE + ; ; выводим строку о расчёте свободного места так, чтоб она затёрлась + ; LD DE,MAIN_MSG.CALCULATING + ; CALL MESSAGE ; возвращаемся в цикл - POP BC - POP DE + ;POP BC + ;POP DE jp cmd_dir.parse ; -; cmd_dir_pause: -; xor a -; ld (cmd_dir.key_p),a -; jp cmd_dir.parse +cmd_dir_pause: + ld a,#ff + ld (cmd_dir.key_p),a + jp cmd_dir.parse /////////////////////////////////////////////////////////////////////////////////////// Size2Char: call A8A8F ; десятичный 32-х разрядный вывод diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 5974267..9e030b2 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -34,7 +34,7 @@ A862E: ld a,(echo_mode) ; фла or a ld de,7 ; индекс "on" jr nz,$+5 ; false - ld de,8 ; индекс "off" + ld de,MAIN_MSG.OFF ; индекс "off" call FMESAGE ; найти строку по индексу ld de,PRM1 ; куда (аргумент %1) call ncopy_string ; скопир. строку (с нулем), макс.15 симв. diff --git a/SHELL/Messages/errors.asm b/SHELL/Messages/errors_txt.asm similarity index 100% rename from SHELL/Messages/errors.asm rename to SHELL/Messages/errors_txt.asm diff --git a/SHELL/Messages/main.asm b/SHELL/Messages/main.asm deleted file mode 100644 index 9754937..0000000 --- a/SHELL/Messages/main.asm +++ /dev/null @@ -1,46 +0,0 @@ -;!TODO не забыть заменить цифры на эти метки -MAIN_MSG: -.DIR_1 EQU 0 -.VERSION EQU 1 -.DATE EQU 2 -.TIME EQU 3 -.PAUSE EQU 4 -.INVALID EQU 5 -.ECHO EQU 6 -.ON EQU 7 -.OFF EQU 8 -.DIR_2 EQU 9 -.DIR_3 EQU 10 -.HELP EQU 11 -.CALCULATING EQU 12 -.CRLF EQU 13 - -.TABLE: db 0 -/* 0 */ db "Volume in drive %1 %4 %5",CR,LF - db "Volume Serial Number is %2",CR,LF - db CR,LF,"Directory of %3",CR,LF,LF,0 -/* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 -/* 2 */ db "Current date: %1",CR,LF,0 -/* 3 */ db "Current time: %1",CR,LF,0 -/* 4 */ db "Press any key to continue . . .",CR,0 -/* 5 */ db "Invalid parametr",CR,LF,0 -/* 6 */ db "Echo is %1",CR,LF,0 -/* 7 */ db "on",0 -/* 8 */ db "off",0 -/* 9 */ db " %1 File(s) %2 bytes",CR,LF - db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 -; db " %3 Dir(s)",CR,LF,LF,0 -/* 10 */ db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME -/* 11 */ DB "COMMANDS:",CR,LF,CR,LF - DB "DIR REN | RENAME PATH HELP ",CR,LF - DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - DB "MD | MKDIR TIME ECHO EXIT ",CR,LF - DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 -/* 12 */ DB "Calculating free space...",CR,0 -/* 13 */ DB CR,LF,0 - ;R11 - DB 0 - DZ "Unknown command" - ; -.TABLE.Size EQU $-.TABLE -; \ No newline at end of file diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm new file mode 100644 index 0000000..e330bea --- /dev/null +++ b/SHELL/Messages/main_txt.asm @@ -0,0 +1,59 @@ + + MACRO stN Name? +@Name? EQU txtCounter +!txtCounter=txtCounter+1 + ENDM + +MAIN_MSG: +; для удобства: +.DIR_1 EQU .DIR_1_ +.VERSION EQU .VERS_ +.DATE EQU .DATE_ +.TIME EQU .TIME_ +.PAUSE EQU .PAUSE_ +.INVALID EQU .INV_ +.ECHO EQU .ECHO_ +.ON EQU .ON_ +.OFF EQU .OFF_ +.DIR_2 EQU .DIR_2_ +.DIR_3 EQU .DIR_3_ +.DIR_4 EQU .DIR_4_ +.HELP EQU .HELP_ +.CALCULATING EQU .CALC_ +.CRLF EQU .CRLF_ +; +!txtCounter DEFL 0 +; +.TABLE: : db 0 + stN .DIR_1_ : db "Volume in drive %1 %4 %5",CR,LF + db "Volume Serial Number is %2",CR,LF + db CR,LF,"Directory of %3",CR,LF,LF,0 + stN .VERS_ : db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 + stN .DATE_ : db "Current date: %1",CR,LF,0 + stN .TIME_ : db "Current time: %1",CR,LF,0 + stN .PAUSE_ : db "Press any key to continue . . .",CR,0 + stN .INV_ : db "Invalid parametr",CR,LF,0 + stN .ECHO_ : db "Echo is %1",CR,LF,0 + stN .ON_ : db "on",0 + stN .OFF_ : db "off",0 + stN .DIR_2_ : db " %1 File(s) %2 bytes",CR,LF + db " %3 Dir(s) ",0 + stN .DIR_4_ : db "%4 bytes free",CR,LF,0 + ; db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 +; : db " %3 Dir(s)",CR,LF,LF,0 + stN .DIR_3_ : db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME + stN .HELP_ : db "COMMANDS:",CR,LF,CR,LF + db "DIR REN | RENAME PATH HELP ",CR,LF + db "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF + db "MD | MKDIR TIME ECHO EXIT ",CR,LF + db "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 + stN .CALC_ : db "Calculating free space...",CR,0 + stN .CRLF_ : db CR,LF,0 +; ;R11 + db 0 + DZ "Unknown command" +; ; +.TABLE.Size EQU $-.TABLE +; +!txtCounter=0 +; \ No newline at end of file diff --git a/SHELL/Procedures/parsers.asm b/SHELL/Procedures/parsers.asm index 826fe41..5cd6346 100644 --- a/SHELL/Procedures/parsers.asm +++ b/SHELL/Procedures/parsers.asm @@ -82,10 +82,10 @@ RUN_OPTION: JR Z,.good AND A JR NZ,RUN_OPTION.loop - LD C,1 + ;LD C,1 ; -.good: push hl - dec hl +.good: dec hl + push hl ld b,cmd_dir_options.Size ;!HARDCODE ex de,hl ld a,(de) @@ -100,7 +100,27 @@ RUN_OPTION: pop hl jr RUN_OPTION ; found -.found: pop de +.found: ; затираем найденый ключ + pop de + ex de,hl + ld (hl),' ' + dec hl + ld (hl),' ' + inc hl + inc hl + inc hl + ex de,hl + ;ld A,'/' + ;ex de,hl + ;ld bc,4 + ;CPDR + ;inc hl + ;ld (hl),' ' + ;inc hl + ;ld (hl),' ' + ;inc hl + ;ex de,hl + ; LD B,C inc hl ld a,(hl) @@ -108,6 +128,6 @@ RUN_OPTION: ld h,(hl) ld l,a scf ; маркер опознаной опции - ret + ret //////////////////////////////////////////////////////////////////////// diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 58f6514..1a36d36 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -525,8 +525,8 @@ T8C24: db "OFF",0 include 'batch.asm' ; парсинг bat-файлов include 'exec.asm' ; выполн. введ. команд с консоли include 'procedures/print.asm' ; функции вывода сообщений - include 'messages/errors.asm' ; сообщения об ошибках - include 'messages/main.asm' ; сообщения + include 'messages/errors_txt.asm' ; сообщения об ошибках + include 'messages/main_txt.asm' ; сообщения include 'procedures/parsers.asm' ; функции прочесывания и выбора include 'procedures/math.asm' ; функции математические diff --git a/SHELL/build.txt b/SHELL/build.txt index 05cf258..9754915 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -201 \ No newline at end of file +259 \ No newline at end of file From 5cf26d589f354023c2884c9b3d21cfde4fc51185 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 28 Nov 2023 06:04:19 +1000 Subject: [PATCH 063/219] -bug in new sub-function of DskInfo --- BOOT/DSSBOOT.ASM | 10 +- DSS/DOS5.ASM | 2 +- DSS/DOS_X.ASM | 10 +- DSS/FAT_X.ASM | 375 +++++++++++++++++------------------ DSS/build.txt | 2 +- DSS/defines.inc | 25 +++ SHELL/Procedures/parsers.asm | 1 + 7 files changed, 222 insertions(+), 203 deletions(-) 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 Date: Fri, 1 Dec 2023 02:05:37 +1000 Subject: [PATCH 064/219] =?UTF-8?q?-bug=20in=20NSECTOR=20=D1=81=D0=B0?= =?UTF-8?q?=D0=BC=20=D0=B7=D0=B0=D1=82=D1=83=D0=BF=D0=B8=D0=BB,=20=D1=81?= =?UTF-8?q?=D0=B0=D0=BC=20=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D0=BB.=20?= =?UTF-8?q?=20=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 76 +- DSS/API.asm | 180 ++ DSS/API/Attribute.asm | 81 + DSS/API/ChDir.asm | 35 + DSS/API/ChnDisk.asm | 25 + DSS/API/Close.asm | 74 + DSS/API/Create.asm | 82 + DSS/API/CurrDir.asm | 24 + DSS/API/Delete.asm | 51 + DSS/API/DosName.asm | 22 + DSS/API/Find.asm | 126 ++ DSS/API/GetDateTime.asm | 24 + DSS/API/MkDir.asm | 167 ++ DSS/API/Open.asm | 69 + DSS/API/Rename.asm | 72 + DSS/API/RmDir.asm | 110 ++ DSS/API/ScanDRV.asm | 38 + DSS/API/SetDateTime.asm | 30 + DSS/API/Time.asm | 180 ++ DSS/API/Version.asm | 19 + DSS/API/bootDsk.asm | 57 + DSS/API/curDisk.asm | 16 + DSS/API/diskINF.asm | 139 ++ DSS/DOS5.ASM | 2397 ------------------------ DSS/DOS_FM.ASM | 9 +- DSS/DOS_Proc.asm | 512 +++++ DSS/DOS_X.ASM | 799 -------- DSS/DSS-MAIN.ASM | 41 +- DSS/ENVIRON.ASM | 2 +- DSS/EXECUTE.ASM | 12 +- DSS/FS/FAT/FAT.asm | 829 ++++++++ DSS/{FAT_X.ASM => FS/FAT/FAT12_16.asm} | 1069 +++++------ DSS/Media_drivers/ide-drv.asm | 11 +- DSS/Procedures.asm | 191 ++ DSS/build.txt | 2 +- DSS/defines.inc | 34 +- 36 files changed, 3821 insertions(+), 3784 deletions(-) create mode 100644 DSS/API.asm create mode 100644 DSS/API/Attribute.asm create mode 100644 DSS/API/ChDir.asm create mode 100644 DSS/API/ChnDisk.asm create mode 100644 DSS/API/Close.asm create mode 100644 DSS/API/Create.asm create mode 100644 DSS/API/CurrDir.asm create mode 100644 DSS/API/Delete.asm create mode 100644 DSS/API/DosName.asm create mode 100644 DSS/API/Find.asm create mode 100644 DSS/API/GetDateTime.asm create mode 100644 DSS/API/MkDir.asm create mode 100644 DSS/API/Open.asm create mode 100644 DSS/API/Rename.asm create mode 100644 DSS/API/RmDir.asm create mode 100644 DSS/API/ScanDRV.asm create mode 100644 DSS/API/SetDateTime.asm create mode 100644 DSS/API/Time.asm create mode 100644 DSS/API/Version.asm create mode 100644 DSS/API/bootDsk.asm create mode 100644 DSS/API/curDisk.asm create mode 100644 DSS/API/diskINF.asm delete mode 100644 DSS/DOS5.ASM create mode 100644 DSS/DOS_Proc.asm delete mode 100644 DSS/DOS_X.ASM create mode 100644 DSS/FS/FAT/FAT.asm rename DSS/{FAT_X.ASM => FS/FAT/FAT12_16.asm} (86%) create mode 100644 DSS/Procedures.asm diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index dcd444f..88062d5 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -523,27 +523,61 @@ SMALL_CLUSTER: ; HL - CLUSTER ; HL:IX - SECTOR -NSECTOR DEC HL +; NSECTOR: +; DEC HL +; DEC HL +; EX DE,HL +; LD A,(BOOT.S_P_C) +; LD B,A +; LD HL,0 +; LD IX,0 +; ADD_DE1 ADD IX,DE +; JP NC,ADD_DE2 +; INC HL +; ADD_DE2 DJNZ ADD_DE1 +; LD DE,(DAT_FRM) +; ADD IX,DE +; LD DE,#0000 +; ADC HL,DE + +; LD DE,(DISKL) +; ADD IX,DE +; LD DE,(DISKH) +; ADC HL,DE +; RET + + +NSECTOR: + LD DE,0 + DEC HL DEC HL - EX DE,HL LD A,(BOOT.S_P_C) - LD B,A - LD HL,0 - LD IX,0 -ADD_DE1 ADD IX,DE - JP NC,ADD_DE2 - INC HL -ADD_DE2 DJNZ ADD_DE1 - LD DE,(DAT_FRM) + 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,(DAT_FRM) ;first data sector + XOR A ADD IX,DE - LD DE,#0000 + LD D,A + LD E,A ADC HL,DE + ; LD DE,(DISKL) ADD IX,DE LD DE,(DISKH) ADC HL,DE - RET - + RET ;----------------- ;!TODO сделать это макросами или инклюдами универсальными. повторяются в досе и ещё где-то ; HL - CLUSTER @@ -611,15 +645,15 @@ R_F_00 INC A ; HL - FAT OFFSET R_F_F01 LD A,E AND #F0 + RR D ; вправо на 4 битa + RRA + RR D + RRA + RR D + RRA + RR D + RRA LD E,A - RR D - RR E - RR D - RR E - RR D - RR E - RR D - RR E R_F_F02 LD HL,#0FEF XOR A SBC HL,DE diff --git a/DSS/API.asm b/DSS/API.asm new file mode 100644 index 0000000..b0c0c0d --- /dev/null +++ b/DSS/API.asm @@ -0,0 +1,180 @@ + +;[BEGIN] +;//MODULE: DOS_X +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R011 17-04-2023 BAO Временный костыль для недопускания переполнения буфера пути каталога +;R010 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH +;R009 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER +;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) +;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 +;R008 - 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS +;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR +;R10 - 03-04-2003 DNS IMPROVED FN. VERSION +;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. +;R007 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN FROM "." ".NAM" +;R006 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME +;R005 26-11-2002 DNS FIX ERROR IN CHDIR, DON'T ALLOWED "." FOR ROOT +;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES +;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT +;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES +;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION +;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET +;R001 16-12-1999 DNS Y2K fix +;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS +;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR +;R04 08-11-1999 DNS KILL OLD FUNCTIONS +;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) +;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" +;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" + +; +;--------------------------------------------------------------- + + include 'API/Version.asm' + include 'API/bootDsk.asm' + include 'API/curDisk.asm' + include 'API/diskINF.asm' + include 'API/ScanDRV.asm' + include 'API/Attribute.asm' + include 'API/Create.asm' + include 'API/Delete.asm' + include 'API/Rename.asm' + include 'API/Open.asm' + include 'API/Close.asm' + include 'API/Find.asm' + include 'API/ChnDisk.asm' + include 'API/CurrDir.asm' + include 'API/Time.asm' + include 'API/GetDateTime.asm' + include 'API/SetDateTime.asm' + include 'API/ChDir.asm' + include 'API/MkDir.asm' + include 'API/RmDir.asm' + include 'API/DosName.asm' + +;R09 + ;Дубль - CHNDISK = OPENDSK + ;CHNDISK: + ; PUSH AF + ; LD C,Dss.DRV.Open + ; RST ToDSS.DRV + ; POP BC + ; JP C,NDISK11 + ; LD A,B + ; LD (FatBuffer.DRIVE),A + ; CALL RD_BPB + ; RET C + ; LD A,(LDRIVE) + ; AND A + ; RET + ;NDISK11: + ; CP DSS_Error.sys.INVALID_DRIVE + ; SCF + ; RET Z + ; LD A,DSS_Error.sys.NOT_READY + ; RET +; + + +;R04 + ;SIZE2CL: LD DE,(B_P_C) + ; XOR A + ; SCF + ;S2C01: RR D + ; RR E + ; JR C,S2C02 + ; RR H + ; RR L + ; RR B + ; RR C + ; JP NC,S2C01 + ; LD A,1 + ; JP S2C01 + ;S2C02: OR A + ; RET Z + ; INC BC + ; RET + ;L_SEC_X: DW 0 + ;H_SEC_X: DW 0 +; + + +;GOD EQU 1999-1980*512 + +;FHAND DB " " +; DB " " +; DB #20 +; DW 0,0,0,0,0 +; DW #0000 +; DW 5*32+19+GOD +;SAVEC DW #0000 +;SIZEC DW #0000,#0000 +;============================================= +;//MODULE: DOS_X +;[END] + +;R11 + ; IF SAVE_PATH_MACRO + ; SAVE_CUR_PATH + ; PUSH IX + ; PUSH IY + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; PUSH AF + ; + ; SET_PAGE_X ENVPAGE + ; PUSH AF + ; + ; CALL CURRDSK + ; ADD A,"A" + ; LD HL,TMP_CURDIR_AUTO + ; LD (HL),A + ; INC HL + ; LD A,":" + ; LD (HL),A + ; INC HL + ; CALL CURRDIR_FN + ; + ; POP AF + ; OUT (SLOT3),A + ; + ; POP AF + ; POP BC + ; POP DE + ; POP HL + ; POP IY + ; POP IX + ; RET + ; + ; BACK_CUR_PATH: + ; RET NC + ; .force: PUSH IY + ; PUSH IX + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; PUSH AF + ; + ; SET_PAGE_X ENVPAGE + ; PUSH AF + ; + ; LD HL,TMP_CURDIR_AUTO + ; CALL CHDIR + ; + ; POP AF + ; OUT (SLOT3),A + ; + ; POP AF + ; POP BC + ; POP DE + ; POP HL + ; POP IX + ; POP IY + ; RET + ; ENDIF +; \ No newline at end of file diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm new file mode 100644 index 0000000..18b2568 --- /dev/null +++ b/DSS/API/Attribute.asm @@ -0,0 +1,81 @@ +//////////////////////////////////////////////////////////////////////// +; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; A - ATTRIB +; B - MODE +; B = 0 GET ATTRIB +; B = 1 SET ATTRIB +; OUTPUT: A - ATTRIB +//////////////////////////////////////////////////////////////////////// +ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + ; + INC B + DEC B + JP Z,.READ + DEC B + JP Z,.WRITE + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +.READ: ;!TEST ;[x] 16/11/23 optimize get attribute + ;XOR A + ; + CALL .OPENATR ;R002 + RET C + ;!TEST ;[x] 16/11/23 optimize get attribute + LD A,(HANDBUF+_sFM.ATTRIBUT) + ;LD B,(IY+_sFM.ATTRIBUT) + ;PUSH BC + ;CALL CLOSE + ;POP BC + ;RET C + ;LD A,B + ; + RET + ; +.WRITE: PUSH AF + XOR A + ;!TEST ;[x] 16/11/23 optimize get attribute + LD (OPEN_FN.TMP),A + ; + CALL .OPENATR ;R002 + ;!TEST ;[x] 16/11/23 optimize get attribute + CALL NC,OPEN_FN.FM + ; + POP BC + RET C + SET 7,(IY+_sFM.ACCESS_MODE) + RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit + LD (IY+_sFM.ATTRIBUT),B + PUSH BC + CALL CLOSE_FN +.error: POP BC + RET C + LD A,B + RET +;R002 +.OPENATR: + ;!TEST ;[x] 16/11/23 optimize get attribute + ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + CALL MASK + RET C + LD A,FAT_ATTR.NoVolID + ;!TEST ;[x] 16/11/23 optimize get attribute + JP SEARCH.Custom + ;CALL SEARCH.Custom + ;RET C ; запись не найдена + ;JP OPEN.FM ; на поиск своб. дескриптора + ; + ; +;R002 \ No newline at end of file diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm new file mode 100644 index 0000000..2f82fa0 --- /dev/null +++ b/DSS/API/ChDir.asm @@ -0,0 +1,35 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #1D. Смена текущего каталога. +; Меняет текущий каталог и текущий диск, если он указан в файловой +; спецификации. Если путь начинается с "\" - это означает путь от +; корневого каталога, иначе от текущего. +; +; вход: HL - указатель на имя каталога +; выход: нет +; +; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 +//////////////////////////////////////////////////////////////////////// +CHDIR_FN: + ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL CHDIR + ; если удачно, то копируем WorkDirectory в CurrentDirectory + JP NC,DIR_PATH_CHANGE.FullCurrent + ; если неудачно, то возвращаемся туда откуда пришли + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + POP AF + RET + ; +CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + LD HL,TMPNAME + LD A,(HL) + OR A + CALL NZ,OPENDIR + RET +; \ No newline at end of file diff --git a/DSS/API/ChnDisk.asm b/DSS/API/ChnDisk.asm new file mode 100644 index 0000000..272db10 --- /dev/null +++ b/DSS/API/ChnDisk.asm @@ -0,0 +1,25 @@ +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// +CHNDISK_FN: + CALL CHNDISK + RET C + PUSH AF + CALL DIR_PATH_CHANGE.FullCurrent + POP AF + RET +CHNDISK:;[x] более корректная смена диска + CALL OPENDSK + ; + ;R010 + RET C + LD HL,WorkDirectory + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B + RET +; \ No newline at end of file diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm new file mode 100644 index 0000000..256e18e --- /dev/null +++ b/DSS/API/Close.asm @@ -0,0 +1,74 @@ +//////////////////////////////////////////////////////////////////////// +;Входные значения: +; C - #12 +; A - файловый манипулятор +;Выходные значения: +; A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +CLOSE_FN: +;R008 ; +;CLOSE: ; + LD (.TMP),A + CALL SET_FM + RET C + LD A,(TASK) + CP (IY+_sFM.TASK_NUM) + LD A,DSS_Error.sys.ACCESS_DENIED + SCF + RET NZ + BIT 7,(IY+_sFM.ACCESS_MODE) + JR Z,.NOTMODF + LD E,(IY+_sFM.DIR_CLUSTER) + LD D,(IY+_sFM.DIR_CLUSTER+1) + PUSH DE + ; [x] 15/11/2023 -bug with bad clusters ;!TEST + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + ; + XOR A + CALL SET_FM + POP DE + LD (IY+_sFM.DIR_CLUSTER),E + LD (IY+_sFM.DIR_CLUSTER+1),D + ; [x] 15/11/2023 -bug with bad clusters ;!TEST + LD (IY+_sFM.ST_CLUSTER),E + LD (IY+_sFM.ST_CLUSTER+1),D + ; + CALL LOADDIR +.TMP+1: LD A,0 + CALL SET_FM + ; + SET_PAGE_X DIRPAGE + ; + ;TEST 9/11/23 + ; LD HL,DIR + ; LD DE,#0020 + ; LD C,(IY+_sFM.HANDLE) + ; LD B,(IY+_sFM.HANDLE+1) + ; JR .CLOSE2 + ; .CLOSE1: + ; ADD HL,DE + ; DEC BC + ; .CLOSE2: + ; LD A,B + ; OR C + ; JR NZ,.CLOSE1 + LD L,(IY+_sFM.HANDLE) + LD H,(IY+_sFM.HANDLE+1) + ; + LD D,YH + LD E,YL + EX DE,HL + ;PUSH HL + ;SET_PAGE_X DIRPAGE + ;POP HL + LD BC,#0020 ;!HARDCODE + LDIR + OUT (SLOT3),A + CALL SAVEDIR +.NOTMODF: + LD A,(.TMP) + ;CALL RES_FM + JP RES_FM + ;RET +; \ No newline at end of file diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm new file mode 100644 index 0000000..d69d921 --- /dev/null +++ b/DSS/API/Create.asm @@ -0,0 +1,82 @@ +//////////////////////////////////////////////////////////////////////// +; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; OUTPUT: A - FM +//////////////////////////////////////////////////////////////////////// +CREATE: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; + CALL .Prepare + RET C + CALL SEARCH.File + CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT + JR .DO + ; +.NEW: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; + CALL .Prepare + RET C + CALL SEARCH.File + LD A,DSS_Error.sys.FILE_EXISTS + CCF + RET C + ; +.DO: LD HL,MASKARE + LD DE,HANDBUF + LD BC,11 + LDIR + EX DE,HL +.TMP+1: LD A,0 + LD (HL),A + INC HL + LD BC,#0A00 ;!HARDCODE + ; +.loop1: LD (HL),C + INC HL + DJNZ .loop1 + ; + PUSH HL + CALL SYSTIME + CALL MK_TIME + POP HL + LD (HL),E + INC HL + LD (HL),D + INC HL + LD (HL),C + INC HL + LD (HL),B + INC HL + LD BC,#0600 + ; +.loop2: LD (HL),C + INC HL + DJNZ .loop2 + ; + CALL WRT_HND + RET C + ;CALL SAVEDIR +.PATH0+1: + LD HL,0 + XOR A + LD (OPEN_FN.TMP),A + JP OPEN_FN.FILE ;R008 +.Prepare: + AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE + LD (.TMP),A + LD (.PATH0),HL + CALL GETWORD + RET C + ; LD HL,TMPNAME + ; LD DE,MASKARE + JP MASK +; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; OUTPUT: A - FM +CREAT_N EQU CREATE.NEW +; \ No newline at end of file diff --git a/DSS/API/CurrDir.asm b/DSS/API/CurrDir.asm new file mode 100644 index 0000000..93e2d5a --- /dev/null +++ b/DSS/API/CurrDir.asm @@ -0,0 +1,24 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #1E. Информация о текущем каталоге. +; +; вход: HL - буфер в памяти 256 байт +; выход: A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +CURRDIR: LD DE,WorkDirectory + JR CURRDIR_FN.skip +CURRDIR_FN: + LD DE,CurrentDirectory +.skip: EX DE,HL + LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 могло выйти за пределы буфера + XOR A +.loop: CP (HL) + LDI + JP PO,.error ;[x] 15/11/2023 могло выйти за пределы буфера + JR NZ,.loop + RET + ;[x] 15/11/2023 могло выйти за пределы буфера +.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH + SCF + RET + ; +; \ No newline at end of file diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm new file mode 100644 index 0000000..63cea09 --- /dev/null +++ b/DSS/API/Delete.asm @@ -0,0 +1,51 @@ +//////////////////////////////////////////////////////////////////////// +; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? +//////////////////////////////////////////////////////////////////////// +DEL_FN: ;!TEST + ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + CALL MASK + RET C + ; + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + CALL LOADDIR + CALL SEARCH.File + RET C + ;JP .DELETE +; пометить запись как "удаленная" +.DELETE: SET_PAGE_X DIRPAGE + LD (IX+_sFM.NAME),#E5 ; признак удаления файла + LD E,(IX+_sFM.ST_CLUSTER) ; № первого кластера + LD D,(IX+_sFM.ST_CLUSTER+1) + ; + OUT (SLOT3),A + LD A,E + OR D + JP Z,SAVEDIR ; сбросить кеш каталога на диск +.loop: EX DE,HL ; hl=номер кластера + CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + PUSH DE ; номер след. кластера + PUSH AF + LD DE,#0000 ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера + POP AF + POP DE + JP NC,.loop + CALL WR_FAT + JP SAVEDIR ; сбросить кеш каталога на диск +; \ No newline at end of file diff --git a/DSS/API/DosName.asm b/DSS/API/DosName.asm new file mode 100644 index 0000000..512de5c --- /dev/null +++ b/DSS/API/DosName.asm @@ -0,0 +1,22 @@ +//////////////////////////////////////////////////////////////////////// +;Входные значения: +; C - #44 +; B = 0, преобразовать из 11 символьного формата в формат ДОС +; HL - 11 символов имени файла +; DE - буфер для имени в формате ДОС +; B = 1, преобразовать из формата ДОС в 11 символьный формат +; HL - имя файла в формате ДОС +; DE - 11 символов имени файла +;Выходные значения: +; A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +DOSNAME: + INC B + DEC B + JP Z,GetName + DEC B + JP Z,MASK.custom + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +; \ No newline at end of file diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm new file mode 100644 index 0000000..c3c3972 --- /dev/null +++ b/DSS/API/Find.asm @@ -0,0 +1,126 @@ +//////////////////////////////////////////////////////////////////////// +;Входные значения: +; C - #19 +; HL - указатель на файловую спецификацию +; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт +; ;!!!!! на самом деле сейчас если B=1, рабочий буфер 46 байт +; A - атрибуты, используемые при поиске +; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" +; B = 1 - имя найденного файла в формате DOS "filename.ext",0 +;Выходные значения: +; A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +F_FIRST: + ; Current Dir [x] 15/10/23 + ; LD C,A + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; CALL DIR_PATH_CHECK + ; POP BC + ; POP DE + ; POP HL + ; RET C + ; LD A,C + ; ; + LD (.TMP),A + LD (.DTABUF),DE + LD A,B + LD (.FNDMODE),A + PUSH HL + ;!TEST Current Dir ;[x] 15/10/23 + CALL DIR_PATH_CHECK + RET C + ; + CALL LOADDIR + POP HL + CALL GETWORD + RET C + CALL MASK + RET C + LD A,(.TMP) + CALL SEARCH.Custom + RET C + LD HL,MASKARE +.DTABUF+1: + LD DE,0 + LD BC,11 ;!HARDCODE + LDIR +.TMP+1: LD A,0 + LD (DE),A +.FIND_S: + INC DE + LD BC,#0020 + ADD IX,BC + LD (F_NEXT.CURHND),IX + LD HL,HANDBUF+12 ;!HARDCODE + LD BC,HANDBUF.SIZE-12 ;????? метку вместо числа? + LDIR + LD A,(HANDBUF+11) + LD (DE),A + INC DE + LD HL,HANDBUF +.FNDMODE+1: + LD A,0 + OR A + JR NZ,.FIND_M2 + LD BC,11 ;!HARDCODE + LDIR + LD A,F_NEXT.NO_NEXT.NO + LD (F_NEXT.NO_NEXT),A + XOR A + RET +.FIND_M2: + CALL GetName + LD A,F_NEXT.NO_NEXT.NO + LD (F_NEXT.NO_NEXT),A + XOR A + RET + +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// +F_NEXT: +.NO_NEXT.YES EQU 0 +.NO_NEXT.NO EQU #FF +.NO_NEXT+1: + LD A,0 + OR A + LD A,DSS_Error.sys.INVALID_ACCESS + SCF + RET Z + LD (F_FIRST.DTABUF),DE + EX DE,HL + LD DE,MASKARE + LD BC,11 ;!HARDCODE + LDIR + + XOR A ; F_NEXT.NO_NEXT.YES + LD (F_NEXT.NO_NEXT),A + + LD A,(HL) + PUSH HL + CALL .NSEARCH + POP DE + RET C + JP F_FIRST.FIND_S +.NSEARCH: + EX AF,AF' + SET_PAGE_X DIRPAGE + ;PUSH AF + EX AF,AF' + CPL + LD C,A + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; +.CURHND+2: + LD IX,0 + LD A,XH + OR XL + JP Z,SEARCH.error_too_many_files + JP SEARCH.loop +; \ No newline at end of file diff --git a/DSS/API/GetDateTime.asm b/DSS/API/GetDateTime.asm new file mode 100644 index 0000000..ed8ba32 --- /dev/null +++ b/DSS/API/GetDateTime.asm @@ -0,0 +1,24 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #17. Информация о дате и времени файла. +; +; вход: A - дескриптор файла +; выход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +GET_D_T: + CALL SET_FM + RET C + ; время/дату из структуры дескр. + LD E,(IY+_sFM.TIME) ; время + LD D,(IY+_sFM.TIME+1) ; + LD C,(IY+_sFM.DATE) ; дата + LD B,(IY+_sFM.DATE+1) ; + CALL RMKTIME ; раскодировать время/дату + AND A + RET +; \ No newline at end of file diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm new file mode 100644 index 0000000..7173502 --- /dev/null +++ b/DSS/API/MkDir.asm @@ -0,0 +1,167 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #1B. Создание каталога. +; +; вход: HL - указатель на имя каталога +; выход: A - код ошибки, если CF=1 +; +; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 +//////////////////////////////////////////////////////////////////////// +MKDIR: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + POP AF + RET + ; +.START: CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + ;LD HL,TMPNAME ; 8.3 имя + ;LD DE,MASKARE ; буфер имени 11 симв. формата + CALL MASK ; преобр. имя 8.3 -> 11 формат + RET C + ;!TEST optimization ранее GETWORD уже загрузил директорию + ;CALL LOADDIR ; прочитать список каталога + ; + CALL SEARCH.Dir ; поиск записи каталога в списке диска + LD A,DSS_Error.sys.DIR_EXISTS + CCF + RET C ; каталог найден + ; + CALL G_CLUST + RET C + PUSH HL + LD DE,(FatBuffer.ENDCLUS) ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера + CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + LD HL,MASKARE + LD DE,HANDBUF + LD BC,11 + LDIR + EX DE,HL + LD A,#10 ; атрибут записи каталога + LD (HL),A + INC HL + LD BC,#0A00 ; b=счетчик + ; +.loop1: LD (HL),C + INC HL + DJNZ .loop1 + ; + PUSH HL + CALL SYSTIME ; узнать тек. дату и время + CALL MK_TIME ; закодировать время/дату + POP HL + LD (HL),E ; de=время + INC HL + LD (HL),D + INC HL + LD (HL),C ; день + INC HL + LD (HL),B ; месяц + INC HL + POP DE + PUSH DE + LD (HL),E + INC HL + LD (HL),D + INC HL + LD BC,#0400 ; b=счетчик + ; +.loop2: LD (HL),C + INC HL + DJNZ .loop2 + ; + CALL WRT_HND ; скопир. новую запись в список диска (каталога) + ;CALL SAVEDIR ; и сбросить кеш каталога на диск + LD HL,CORE_BUFFERS.SECBUF ; буфер + LD (HL),"." ; запись тек. каталога + LD BC,10*256 + ' ' ; b=счетчик, c=пробел + ; +.loop3: INC HL + LD (HL),C + DJNZ .loop3 + ; + INC HL + LD DE,HANDBUF+11 ; ячейка атрибутов файла + EX DE,HL + LD BC,21 + LDIR + EX DE,HL + LD (HL),"." ; запись родит. каталога + INC HL + LD (HL),"." + LD BC,9*256 + ' ' ; b=счетчик, c=пробел +.MKD03: INC HL + LD (HL),C + DJNZ .MKD03 + ; + INC HL + SET_PAGE_X DIRPAGE + PUSH AF + ; + LD A,(DIRPAGE.buffer) + CP "." + LD DE,DIRPAGE.buffer+11 ; атрибуты записи ;!HARDCODE + JP Z,.MKD04 + LD IX,HANDBUF + XOR A + LD (IX+_sFM.ST_CLUSTER),A + LD (IX+_sFM.ST_CLUSTER+1),A + LD DE,HANDBUF+11 ; ячейка атрибутов файла +.MKD04: EX DE,HL + LD BC,HANDBUF.SIZE-11 + LDIR + POP AF + OUT (SLOT3),A + ; + EX DE,HL + LD D,H + LD E,L + INC DE + LD (HL),0 + LD BC,512-65 ;!HARDCODE + LDIR + ; + POP HL + CALL NSECTOR + LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер +.MKD12: PUSH AF + PUSH HL ; ст. разряд + PUSH IX ; номер лог. сектора + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + ; + LD A,(FatBuffer.DRIVE) + LD DE,CORE_BUFFERS.SECBUF+#C000 + LD BC,1*256 + Dss.DRV.Write + RST ToDSS.DRV + ; + POP AF + OUT (SLOT3),A + ; + LD HL,CORE_BUFFERS.SECBUF + LD DE,CORE_BUFFERS.SECBUF+1 + LD BC,511 + LD (HL),0 + LDIR + ; + POP IX + POP HL + INC IX + LD A,XH + OR XL + JR NZ,.MKD11 + INC HL +.MKD11 POP AF + DEC A + JR NZ,.MKD12 + AND A + RET +; \ No newline at end of file diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm new file mode 100644 index 0000000..3bcf788 --- /dev/null +++ b/DSS/API/Open.asm @@ -0,0 +1,69 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #11. Открытие файла. +; +; вход: HL - указатель на имя файла +; A - режим доступа: +; A=0 чтение/запись +; A=1 чтение +; A=2 запись +; выход: CF=0, A - дескриптор файла. +; CF=1, A - код ошибки. +//////////////////////////////////////////////////////////////////////// +OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 + LD (.TMP),A + PUSH HL + CALL DIR_PATH_CHECK.forceCheck + POP HL + RET C + JR .start + ;!FIXIT сделать как в mkdir или rmdir? +;R008 ; +;OPEN: ; + LD (.TMP),A ; enter point from CREATE +.start: CALL GETWORD + RET C + CALL MASK ; enter point from OPEN_FN + RET C +.FILE: CALL SEARCH.File ; enter point from EXEC + RET C +;R002 ; +.FM: CALL GET_FM ; enter point from ATTRIB + RET C + LD A,C + EX AF,AF' + EXX + LD (IY+_sFM.HANDLE),E + LD (IY+_sFM.HANDLE+1),D + EXX + LD D,YH + LD E,YL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR +.TMP+1: LD A,0 + LD (IY+_sFM.ACCESS_MODE),A + LD A,(TASK) + LD (IY+_sFM.TASK_NUM),A + XOR A + ; + LD (IY+_sFM.KnownCluster_L),A + LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownOffset_L),A + LD (IY+_sFM.KnownOffset_H),A + ; + LD (IY+_sFM.F_POSITION),A + LD (IY+_sFM.F_POSITION+1),A + LD (IY+_sFM.F_POSITION+2),A + LD (IY+_sFM.F_POSITION+3),A + LD A,(FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+_sFM.DIR_CLUSTER),E + LD (IY+_sFM.DIR_CLUSTER+1),D + EX AF,AF' + AND A + RET +; \ No newline at end of file diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm new file mode 100644 index 0000000..e324224 --- /dev/null +++ b/DSS/API/Rename.asm @@ -0,0 +1,72 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #10. Переименование файла. +; Глобальные символы * и ? в именах файлов не допускаются. +; +; вход: HL - указатель на старое имя файла +; DE - указатель на новое имя файла +; выход: A - код ошибки, если CF=1 +; +; INPUT: HL - "old_name.ext",#00 without simbols * ? +; DE - "new_name.ext",#00 without simbols * ? +//////////////////////////////////////////////////////////////////////// +RENAME: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + PUSH DE + CALL DIR_PATH_CHECK.forceCheck + POP DE + POP HL + RET C + ; + PUSH DE + ;LD DE,MASKARE + CALL MASK.name + POP DE + RET C + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + PUSH DE + CALL LOADDIR ; прочитать список каталога + ;LD A,#33 + LD A,FAT_ATTR.NoSYSnoVolID + CALL SEARCH.Custom ; поиск записи в списке диска + POP HL + RET C + ;LD DE,MASKARE + CALL MASK.name + RET C + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + PUSH IX + LD A,FAT_ATTR.NoSYSnoVolID + CALL SEARCH.Custom ; поиск записи в списке диска + POP IX + LD A,DSS_Error.sys.FILE_EXISTS + CCF + RET C + + SET_PAGE_X DIRPAGE + + LD HL,MASKARE + LD D,XH + LD E,XL + LD BC,11 + LDIR + OUT (SLOT3),A + JP SAVEDIR +; \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm new file mode 100644 index 0000000..d3ee43a --- /dev/null +++ b/DSS/API/RmDir.asm @@ -0,0 +1,110 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #1C. Удаление каталога. +; Можно удалить только пустой каталог. +; +; вход: HL - указатель на имя каталога +; выход: A - код ошибки, если CF=1 +; +; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 +//////////////////////////////////////////////////////////////////////// +RMDIR: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + CALL DIR_PATH_CHANGE.Current + POP AF + RET + ; +.START: CALL GETWORD + RET C + CALL MASK + RET C + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + CALL LOADDIR + CALL SEARCH.Dir + RET C + LD HL,(HANDBUF+_sFM.ST_CLUSTER) + PUSH IX +.RMD17: PUSH HL + CALL NSECTOR + LD A,(CORE_BUFFERS.BootSector.S_P_C) +.RMD12: PUSH AF + PUSH HL + PUSH IX + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + + LD DE,CORE_BUFFERS.SECBUF+#C000 + LD BC,1*256 + Dss.DRV.Read + LD A,(FatBuffer.DRIVE) + RST ToDSS.DRV + + POP AF + OUT (SLOT3),A + + LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + LD HL,CORE_BUFFERS.SECBUF +.RMD10: LD A,(HL) + OR A + JP Z,.RMD15 ;DIR EMPTY + CP "." + JR Z,.RMD14 + CP #E5 ;!HARDCODE байт удаления файла + JR Z,.RMD14 + LD DE,11 ;!HARDCODE смещ. до байта атрибутов + ADD HL,DE + LD A,(HL) + SBC HL,DE + ;BIT 3,A + AND %0000'1000 + JP Z,.error ;DIR NOT EMPTY +.RMD14: LD DE,#0020 + ADD HL,DE + DJNZ .RMD10 + + POP IX + POP HL + INC IX + LD A,XH + OR XL + JR NZ,.RMD11 + INC HL +.RMD11: POP AF + DEC A + JR NZ,.RMD12 + POP HL ; номер кластера + CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + EX DE,HL ; hl=номер след. кластера + JR NC,.RMD17 ; не конец цепочки +.RMD18: POP IX + JP DEL_FN.DELETE ; пометить запись как "удаленная" +.RMD15: POP IX + POP HL + POP AF + POP HL + JR .RMD18 +.error: POP IX + POP HL + POP AF + POP HL + POP IX + LD A,DSS_Error.sys.DIR_NOT_EMPTY + SCF + RET +; \ No newline at end of file diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm new file mode 100644 index 0000000..38da595 --- /dev/null +++ b/DSS/API/ScanDRV.asm @@ -0,0 +1,38 @@ +;R12 +;/////////////////////////////////////////////////////////////////////// +; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. +; +; вход: нет +; выход: A - номер последнего лог. диска в системе +;/////////////////////////////////////////////////////////////////////// +; INCLUDE 'ScanDRV.asm' +;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC +SCANDRV: +; 1. запоминаем состояние прерываний +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,R + DI + PUSH AF +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 2. узнаём букву бут-диска +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + CALL BOOTDSK.GET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 3. вызываем рескан +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + ; A = Boot disk + LD B,A + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 4. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + POP AF + RET PO + EI + RET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +;/////////////////////////////////////////////////////////////////////// +; diff --git a/DSS/API/SetDateTime.asm b/DSS/API/SetDateTime.asm new file mode 100644 index 0000000..c95ae82 --- /dev/null +++ b/DSS/API/SetDateTime.asm @@ -0,0 +1,30 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #18. Изменение даты и времени файла. +; +; вход: A - дескриптор файла +; D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; выход: A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +PUT_D_T: + PUSH AF + CALL MK_TIME ; закодировать время/дату + POP AF ; дескриптор + PUSH DE + PUSH BC + CALL SET_FM + POP BC + POP DE + RET C + LD (IY+_sFM.TIME),E + LD (IY+_sFM.TIME+1),D + LD (IY+_sFM.DATE),C + LD (IY+_sFM.DATE+1),B + SET 7,(IY+_sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла + AND A + RET +; \ No newline at end of file diff --git a/DSS/API/Time.asm b/DSS/API/Time.asm new file mode 100644 index 0000000..0d0813a --- /dev/null +++ b/DSS/API/Time.asm @@ -0,0 +1,180 @@ +//////////////////////////////////////////////////////////////////////// +; Функция #21. Текущая дата и время. +; +; вход: нет +; выход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; C - день недели +//////////////////////////////////////////////////////////////////////// +SYSTIME: + LD C,BIOS.CMOS_TEST + RST ToBIOS + JP C,.NOCMOS + LD D,7 ;DAY + CALL RCMOS + PUSH AF + LD D,8 ;MONTH + CALL RCMOS + POP DE + LD E,A + PUSH DE + LD D,4 ;HOUR + CALL RCMOS + PUSH AF + LD D,2 ;MINUTE + CALL RCMOS + POP DE + LD E,A + PUSH DE + LD D,0 ;SECOND + CALL RCMOS + PUSH AF + LD D,6 ;WEEK DAY + LD C,BIOS.CMOS_RD + RST ToBIOS + POP DE + LD E,A + PUSH DE + LD D,9 ;YEAR + CALL RCMOS ;READ AND CONVERT TO DECIMAL + PUSH AF + LD D,#32 ;CENTURY + LD C,BIOS.CMOS_RD + RST ToBIOS + LD XH,A + + POP AF + CP 80 ;R001, TEST DECIMAL FIX + PUSH AF + JR C,.XXIAGE + LD A,#19 + CP XH + JR Z,.GOODAGE + JR .BADAGE +.XXIAGE: + LD A,#20 + CP XH + JR Z,.GOODAGE +.BADAGE: + PUSH AF + LD D,#32 ;CENTURY + LD C,BIOS.CMOS_WR + RST ToBIOS + POP AF + LD XH,A +.GOODAGE: + POP AF + LD XL,A + LD A,XH + CALL BCD2HEX + LD L,A + LD H,0 + LD C,L + LD B,H + LD XH,B + ADD HL,HL + ADD HL,HL + ADD HL,BC + ADD HL,HL ;*10 + LD B,H + LD C,L + ADD HL,HL + ADD HL,HL + ADD HL,BC + ADD HL,HL ;*10(100) + EX DE,HL + ADD IX,DE + POP BC + POP HL + POP DE + AND A + RET +.NOCMOS: +.NC_DAY+1: + LD DE,DAY*256+MONTH ;DAY/MONTH +.NC_HOUR+1: + LD HL,0 ;HOUR/MINUTE +.NC_SEC+1: + LD BC,1 ;SECOND/WEEKDAY +.NC_YEAR+2: + LD IX,YEAR ;YEAR + AND A + RET +; + +//////////////////////////////////////////////////////////////////////// +; Функция #22. Установить текущую дату и время. +; +; вход: D - день +; E - месяц +; IX - год +; H - час +; L - минуты +; B - секунды +; выход: A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +SETTIME: + PUSH IX + PUSH BC + PUSH HL + PUSH DE + LD C,BIOS.CMOS_TEST + RST ToBIOS + JP C,.NOCMOS2 + POP AF + PUSH AF + LD D,7 ;DAY + CALL WCMOS + POP BC + LD A,C + LD D,8 ;MONTH + CALL WCMOS + POP AF + PUSH AF + LD D,4 ;HOUR + CALL WCMOS + POP BC + LD A,C + LD D,2 ;MINUTE + CALL WCMOS + POP AF + PUSH AF + LD D,0 ;SECOND + CALL WCMOS + POP BC + LD A,C + LD D,6 ;WEEK DAY + LD C,BIOS.CMOS_WR + RST ToBIOS + ; + POP HL + XOR A + LD DE,100 +.YR: INC A + SBC HL,DE + JR NC,.YR + ADD HL,DE + DEC A + PUSH HL + LD D,#32 ;CENTURY + CALL WCMOS + POP BC + LD A,C + LD D,9 ;YEAR + CALL WCMOS + AND A + RET +; !FIXIT новый биос выставляет время, если с ним что-то не так. +.NOCMOS2: + LD C,0 + LD (SYSTIME.NC_DAY),DE ;DAY/MONTH + LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE + LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY + LD (SYSTIME.NC_YEAR),IX ;YEAR + AND A + RET +; \ No newline at end of file diff --git a/DSS/API/Version.asm b/DSS/API/Version.asm new file mode 100644 index 0000000..561de06 --- /dev/null +++ b/DSS/API/Version.asm @@ -0,0 +1,19 @@ +;///////////////////////////////////////////////////////////////////// +; Функция #00. Версия ДОС. +; Возвращает номер версии дисковой системы. +; вход: нет +; выход: DE = номер версии/модификации +; BC = номер билда (0..999) +;///////////////////////////////////////////////////////////////////// +VERSION: + ;XOR A + ;LD H,A ;!TODO пихать сюда OSINFO + ;LD L,A + LD HL,0 + LD DE,VERS*256+MODF + LD BC,BUILD + RET + +//;R10 +//OSINFO: +//OSINFO_SIG: DB "OSINFOSTRUCTURE",0 \ No newline at end of file diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm new file mode 100644 index 0000000..b2c5934 --- /dev/null +++ b/DSS/API/bootDsk.asm @@ -0,0 +1,57 @@ +;///////////////////////////////////////////////////////////////////// +; Функция #09. Номер системного диска. +; Возвращает номер диска, c которого загружена система. +; +; вход: B = 0 (01h - исп. boot-загрузчик системы) +; выход: A - номер системного диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// +BOOTDSK: + INC B + DEC B + JR Z,.GET + DEC B +.chg: JR Z,.SET ;R13 меняется на JR С,SETBOOT после первого удачного исполнения SETBOOT + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +.GET: ;GET BOOT DISK +.NUM+1: LD A,0 ;R09 + AND A + RET + ; Сообщить DSS с какого диска загружается система. + ; Исп. загрузчик системы для иниц. ячейки "boot_disk". +.SET: LD B,A ;SET BOOT DISK + LD C,0 +.loop: PUSH BC + LD A,C + LD DE,#55AA + LD BC,256*0 + Dss.DRV.GenIOCTL + RST ToDSS.DRV + POP BC + JR C,.NoSupport + EX AF,AF' ;PHISICAL DRIVE NUMBER + CP B + JR NZ,.NoSupport + ;R13 + LD A,#38 ; opcode for JR C,addr + LD (BOOTDSK.chg),A + ;R13 + LD A,C + LD (BOOTDSK.NUM),A + AND A + RET +.NoSupport: + INC C + LD A,(LDRIVE) + CP C + JR NZ,.loop + SCF + RET +; Номер последнего диска в системе +LDRIVE: DB DSS_MAX_DRIVES_AMOUNT + IF COMPILE_UNUSED_CODE +TDRIVE: DB #00 +TCLUST: DW #0000 +TCOUNT: DW #0000 + ENDIF +; \ No newline at end of file diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm new file mode 100644 index 0000000..7bc73e1 --- /dev/null +++ b/DSS/API/curDisk.asm @@ -0,0 +1,16 @@ +;///////////////////////////////////////////////////////////////////// +; Функция #02. Номер текущего диска. +; +; вход: нет +; выход: A - номер диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// +CURDISK_FN: + LD A,(CurrentPath) + SUB 'A' + RET NC + LD A,DSS_Error.sys.INVALID_DRIVE + RET +CURDISK: LD A,(FatBuffer.DRIVE) + AND A + RET +; \ No newline at end of file diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm new file mode 100644 index 0000000..0f33db5 --- /dev/null +++ b/DSS/API/diskINF.asm @@ -0,0 +1,139 @@ +;///////////////////////////////////////////////////////////////////// +; [ ] новая подфункция с битом 7 в рег. А +; Возвращает информацию об общем и свободном пространстве дискового +; устройства. +; +; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий) +; При A bit7 = 1: +; HL - буфер (256 байтов) для расширенных данных: +; B != 0 - считать свободное место +; ; +; размер поля - 1 байт +; Файловая система +; ; +; размер поля - 1 байт +; Серийный номер диска +; ; +; размер поля - 1 байт +; Метка диска +; ; +; размер поля - 1 байт +; Зарезервировано... +; ; +; A xor #80 - номер диска +; +; выход: A - размер кластера в секторах, если CF=0 +; HL - общее кол-во кластеров +; DE - свободных кластеров +; BC - размер сектора в байтах +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// + ; [ ] 22/11/23 подфункция с доп.инфой + MACRO _mCOPY_LOOP + LD C,A + LD B,0 + LD (DE),A + INC DE + LDIR +; .loop: +; LD (HL),A +; INC DE +; INC HL +; LD A,(DE) +; DJNZ .loop + 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 + JR C,.error + ; + EX (SP),HL + PUSH AF + PUSH DE + PUSH BC + ;;;; + ; + EX DE,HL + LD HL,CORE_BUFFERS.BootSector.ID_FAT + LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length + _mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER + LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER + _mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_LABEL + LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL + _mCOPY_LOOP + ; + + XOR A + LD (DE),A + ;;;; + POP BC + POP DE + POP AF +.error: POP HL + RET + ; + + ;CP #FF ; !FIXIT WorkDirectory + ;!TEST Current Dir + ;JR Z,CURRDS ;R06 +.CurrentDisk: + LD A,(CurrentPath) + SUB 'A' + LD HL,FatBuffer.DRIVE + CP (HL) + JR Z,.CheckFreeSpace + ; +.CustomDisk: + PUSH BC + CALL CHNDISK ;R06 + POP BC + RET C ;R06 + ; +.CheckFreeSpace: + ; + XOR A + OR B + CALL NZ,.CURRDS + ; + ; +.FRESP2: + LD D,B + LD E,C + LD HL,(FAT_Max_Cluster) + DEC HL + LD BC,(CORE_BUFFERS.BootSector.B_P_S) + LD A,(CORE_BUFFERS.BootSector.S_P_C) + AND A + RET + ; +.CURRDS: + LD HL,2 + LD BC,0 +.FRESP: PUSH BC + CALL R_F_FAT + POP BC + CP DSS_Error.sys.DISK_FULL + RET Z + + LD A,E + OR D + JR NZ,.SKIC + INC BC +.SKIC: INC HL + JP .FRESP +; \ No newline at end of file diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM deleted file mode 100644 index d28b2e5..0000000 --- a/DSS/DOS5.ASM +++ /dev/null @@ -1,2397 +0,0 @@ - -;[BEGIN] -;//MODULE: DOS5 -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;------------------------------------------------------------- -;Rev Date Name Description -;------------------------------------------------------------- -;R11 17-04-2023 BAO Временный костыль для недопускания переполнения буфера пути каталога -;R10 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH -;R09 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER -;R08 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS -;R07 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN -; FROM "." ".NAM" -;R06 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME -;R05 26-11-2002 DNS FIX ERROR IN CHDIR, DON'T ALLOWED "." FOR ROOT -;R04 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES -;R03 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT -;R02 19-11-2002 DNS FIX GET/SET ATTRIBUTES -;R01 16-12-1999 DNS Y2K fix -;------------------------------------------------------------- - - -//////////////////////////////////////////////////////////////////////// -; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 -; A - ATTRIB -; B - MODE -; B = 0 GET ATTRIB -; B = 1 SET ATTRIB -; OUTPUT: A - ATTRIB -//////////////////////////////////////////////////////////////////////// -ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 - LD C,A - PUSH HL - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - ; - INC B - DEC B - JP Z,.RATTRIB - DEC B - JP Z,.WATTRIB - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -.RATTRIB: - ;!TEST ;[x] 16/11/23 optimize get attribute - ;XOR A - ; - CALL .OPENATR ;R02 - RET C - ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF+_sFM.ATTRIBUT) - ;LD B,(IY+_sFM.ATTRIBUT) - ;PUSH BC - ;CALL CLOSE - ;POP BC - ;RET C - ;LD A,B - ; - RET -.WATTRIB: - PUSH AF - XOR A - ;!TEST ;[x] 16/11/23 optimize get attribute - LD (OPEN.TMP),A - ; - CALL .OPENATR ;R02 - ;!TEST ;[x] 16/11/23 optimize get attribute - CALL NC,OPEN.FM - ; - POP BC - RET C - SET 7,(IY+_sFM.ACCESS_MODE) - RES 3,B ;CLEAR LABEL ATTR ;R03 ;!HARDCODE attribute bit - LD (IY+_sFM.ATTRIBUT),B - PUSH BC - CALL CLOSE -.error: POP BC - RET C - LD A,B - RET -;R02 -.OPENATR: - ;!TEST ;[x] 16/11/23 optimize get attribute - ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) - ; - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - CALL MASK - RET C - LD A,FAT_ATTR.NoVolID - ;!TEST ;[x] 16/11/23 optimize get attribute - JP SEARCH.Custom - ;CALL SEARCH.Custom - ;RET C ; запись не найдена - ;JP OPEN.FM ; на поиск своб. дескриптора - ; - ; -;R02 - -//////////////////////////////////////////////////////////////////////// -; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 -; OUTPUT: A - FM -//////////////////////////////////////////////////////////////////////// -CREATE: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; - CALL .Prepare - RET C - CALL SEARCH.File - CALL NC,DELETE ;FILE EXIST RECREAT - JR .DO - ; -; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 -; OUTPUT: A - FM -.NEW: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; - CALL .Prepare - RET C - CALL SEARCH.File - LD A,DSS_Error.sys.FILE_EXISTS - CCF - RET C - ; -.DO: LD HL,MASKARE - LD DE,HANDBUF - LD BC,11 - LDIR - EX DE,HL -.TMP+1: LD A,0 - LD (HL),A - INC HL - LD BC,#0A00 ;!HARDCODE - ; -.loop1: LD (HL),C - INC HL - DJNZ .loop1 - ; - PUSH HL - CALL SYSTIME - CALL MK_TIME - POP HL - LD (HL),E - INC HL - LD (HL),D - INC HL - LD (HL),C - INC HL - LD (HL),B - INC HL - LD BC,#0600 - ; -.loop2: LD (HL),C - INC HL - DJNZ .loop2 - ; - CALL WRT_HND - RET C - ;CALL SAVEDIR -.PATH0+1: - LD HL,0 - XOR A - LD (OPEN.TMP),A - JP OPEN.FILE ;R08 -.Prepare: - AND #E7 ;R04 %76A00SHR = !FAT_ATTR ;!HARDCODE - LD (.TMP),A - LD (.PATH0),HL - CALL GETWORD - RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE - JP MASK -CREAT_N EQU CREATE.NEW - - -//////////////////////////////////////////////////////////////////////// -; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? -//////////////////////////////////////////////////////////////////////// -DEL_FN: ;!TEST - ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - CALL MASK - RET C - ; - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - CALL LOADDIR - CALL SEARCH.File - RET C - ;JP DELETE -; пометить запись как "удаленная" -DELETE: SET_PAGE_X DIRPAGE - LD (IX+_sFM.NAME),#E5 ; признак удаления файла - LD E,(IX+_sFM.ST_CLUSTER) ; № первого кластера - LD D,(IX+_sFM.ST_CLUSTER+1) - ; - OUT (SLOT3),A - LD A,E - OR D - JP Z,SAVEDIR ; сбросить кеш каталога на диск -.loop: EX DE,HL ; hl=номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера - PUSH DE ; номер след. кластера - PUSH AF - LD DE,#0000 ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - POP AF - POP DE - JP NC,.loop - CALL WR_FAT - JP SAVEDIR ; сбросить кеш каталога на диск - -//////////////////////////////////////////////////////////////////////// -; Функция #10. Переименование файла. -; Глобальные символы * и ? в именах файлов не допускаются. -; -; вход: HL - указатель на старое имя файла -; DE - указатель на новое имя файла -; выход: A - код ошибки, если CF=1 -; -; INPUT: HL - "old_name.ext",#00 without simbols * ? -; DE - "new_name.ext",#00 without simbols * ? -//////////////////////////////////////////////////////////////////////// -RENAME: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - PUSH DE - CALL DIR_PATH_CHECK.forceCheck - POP DE - POP HL - RET C - ; - PUSH DE - ;LD DE,MASKARE - CALL MASK.name - POP DE - RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - PUSH DE - CALL LOADDIR ; прочитать список каталога - ;LD A,#33 - LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.Custom ; поиск записи в списке диска - POP HL - RET C - ;LD DE,MASKARE - CALL MASK.name - RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - PUSH IX - LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.Custom ; поиск записи в списке диска - POP IX - LD A,DSS_Error.sys.FILE_EXISTS - CCF - RET C - - SET_PAGE_X DIRPAGE - - LD HL,MASKARE - LD D,XH - LD E,XL - LD BC,11 - LDIR - OUT (SLOT3),A - JP SAVEDIR - -//////////////////////////////////////////////////////////////////////// -; Функция #11. Открытие файла. -; -; вход: HL - указатель на имя файла -; A - режим доступа: -; A=0 чтение/запись -; A=1 чтение -; A=2 запись -; выход: CF=0, A - дескриптор файла. -; CF=1, A - код ошибки. -//////////////////////////////////////////////////////////////////////// -OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 - LD (OPEN.TMP),A - PUSH HL - CALL DIR_PATH_CHECK.forceCheck - POP HL - RET C - JR OPEN.start - ;!FIXIT сделать как в mkdir или rmdir? - ; -;R08 -OPEN: LD (.TMP),A ; enter point from CREATE -.start: CALL GETWORD - RET C - CALL MASK ; enter point from OPEN_FN - RET C -.FILE: CALL SEARCH.File ; enter point from EXEC - RET C -;R02 -.FM: CALL GET_FM ; enter point from ATTRIB - RET C - LD A,C - EX AF,AF' - EXX - LD (IY+_sFM.HANDLE),E - LD (IY+_sFM.HANDLE+1),D - EXX - LD D,YH - LD E,YL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR -.TMP+1: LD A,0 - LD (IY+_sFM.ACCESS_MODE),A - LD A,(TASK) - LD (IY+_sFM.TASK_NUM),A - XOR A - ; - LD (IY+_sFM.KnownCluster_L),A - LD (IY+_sFM.KnownCluster_H),A - LD (IY+_sFM.KnownOffset_L),A - LD (IY+_sFM.KnownOffset_H),A - ; - LD (IY+_sFM.F_POSITION),A - LD (IY+_sFM.F_POSITION+1),A - LD (IY+_sFM.F_POSITION+2),A - LD (IY+_sFM.F_POSITION+3),A - LD A,(FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER - LD E,(HL) - INC HL - LD D,(HL) - LD (IY+_sFM.DIR_CLUSTER),E - LD (IY+_sFM.DIR_CLUSTER+1),D - EX AF,AF' - AND A - RET - -//////////////////////////////////////////////////////////////////////// -;Входные значения: -; C - #12 -; A - файловый манипулятор -;Выходные значения: -; A - код ошибки, если CF=1 -//////////////////////////////////////////////////////////////////////// -CLOSE_FN: -;R08 -CLOSE: LD (.TMP),A - CALL SET_FM - RET C - LD A,(TASK) - CP (IY+_sFM.TASK_NUM) - LD A,DSS_Error.sys.ACCESS_DENIED - SCF - RET NZ - BIT 7,(IY+_sFM.ACCESS_MODE) - JR Z,.NOTMODF - LD E,(IY+_sFM.DIR_CLUSTER) - LD D,(IY+_sFM.DIR_CLUSTER+1) - PUSH DE - ; [x] 15/11/2023 -bug with bad clusters ;!TEST - LD A,(IY+_sFM.DRIVE) - CALL OPENDSK - ; - XOR A - CALL SET_FM - POP DE - LD (IY+_sFM.DIR_CLUSTER),E - LD (IY+_sFM.DIR_CLUSTER+1),D - ; [x] 15/11/2023 -bug with bad clusters ;!TEST - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D - ; - CALL LOADDIR -.TMP+1: LD A,0 - CALL SET_FM - ; - SET_PAGE_X DIRPAGE - ; - ;TEST 9/11/23 - ; LD HL,DIR - ; LD DE,#0020 - ; LD C,(IY+_sFM.HANDLE) - ; LD B,(IY+_sFM.HANDLE+1) - ; JR .CLOSE2 - ; .CLOSE1: - ; ADD HL,DE - ; DEC BC - ; .CLOSE2: - ; LD A,B - ; OR C - ; JR NZ,.CLOSE1 - LD L,(IY+_sFM.HANDLE) - LD H,(IY+_sFM.HANDLE+1) - ; - LD D,YH - LD E,YL - EX DE,HL - ;PUSH HL - ;SET_PAGE_X DIRPAGE - ;POP HL - LD BC,#0020 ;!HARDCODE - LDIR - OUT (SLOT3),A - CALL SAVEDIR -.NOTMODF: - LD A,(.TMP) - CALL RES_FM - RET - -//////////////////////////////////////////////////////////////////////// -;Входные значения: -; C - #19 -; HL - указатель на файловую спецификацию -; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт -; ;!!!!! на самом деле сейчас если B=1, рабочий буфер 46 байт -; A - атрибуты, используемые при поиске -; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" -; B = 1 - имя найденного файла в формате DOS "filename.ext",0 -;Выходные значения: -; A - код ошибки, если CF=1 -//////////////////////////////////////////////////////////////////////// -F_FIRST: - ; Current Dir [x] 15/10/23 - ; LD C,A - ; PUSH HL - ; PUSH DE - ; PUSH BC - ; CALL DIR_PATH_CHECK - ; POP BC - ; POP DE - ; POP HL - ; RET C - ; LD A,C - ; ; - LD (.TMP),A - LD (.DTABUF),DE - LD A,B - LD (.FNDMODE),A - PUSH HL - ;!TEST Current Dir ;[x] 15/10/23 - CALL DIR_PATH_CHECK - RET C - ; - CALL LOADDIR - POP HL - CALL GETWORD - RET C - CALL MASK - RET C - LD A,(.TMP) - CALL SEARCH.Custom - RET C - LD HL,MASKARE -.DTABUF+1: - LD DE,0 - LD BC,11 ;!HARDCODE - LDIR -.TMP+1: LD A,0 - LD (DE),A -.FIND_S: - INC DE - LD BC,#0020 - ADD IX,BC - LD (F_NEXT.CURHND),IX - LD HL,HANDBUF+12 ;!HARDCODE - LD BC,HANDBUF.SIZE-12 ;????? метку вместо числа? - LDIR - LD A,(HANDBUF+11) - LD (DE),A - INC DE - LD HL,HANDBUF -.FNDMODE+1: - LD A,0 - OR A - JR NZ,.FIND_M2 - LD BC,11 ;!HARDCODE - LDIR - LD A,F_NEXT.NO_NEXT.NO - LD (F_NEXT.NO_NEXT),A - XOR A - RET -.FIND_M2: - CALL GETNAME - LD A,F_NEXT.NO_NEXT.NO - LD (F_NEXT.NO_NEXT),A - XOR A - RET - -//////////////////////////////////////////////////////////////////////// -; -; -//////////////////////////////////////////////////////////////////////// -F_NEXT: -.NO_NEXT.YES EQU 0 -.NO_NEXT.NO EQU #FF -.NO_NEXT+1: - LD A,0 - OR A - LD A,DSS_Error.sys.INVALID_ACCESS - SCF - RET Z - LD (F_FIRST.DTABUF),DE - EX DE,HL - LD DE,MASKARE - LD BC,11 ;!HARDCODE - LDIR - - XOR A ; F_NEXT.NO_NEXT.YES - LD (F_NEXT.NO_NEXT),A - - LD A,(HL) - PUSH HL - CALL .NSEARCH - POP DE - RET C - JP F_FIRST.FIND_S -.NSEARCH: - EX AF,AF' - SET_PAGE_X DIRPAGE - ;PUSH AF - EX AF,AF' - CPL - LD C,A - ;TEST 9/11/23 - ; EXX - ; LD DE,0 - ; EXX - ; -.CURHND+2: - LD IX,0 - LD A,XH - OR XL - JP Z,SEARCH.error_too_many_files - JP SEARCH.loop - -//////////////////////////////////////////////////////////////////////// -; -; -//////////////////////////////////////////////////////////////////////// -CHNDISK_FN: - CALL CHNDISK - RET C - PUSH AF - CALL DIR_PATH_CHANGE.FullCurrent - POP AF - RET -CHNDISK:;[x] более корректная смена диска - CALL OPENDSK - ; - ;R10 - RET C - LD HL,WorkDirectory - LD (HL),0 - PUSH AF - CALL OPENDIR - POP BC - RET C - LD A,B - RET - -//////////////////////////////////////////////////////////////////////// -; Функция #1E. Информация о текущем каталоге. -; -; вход: HL - буфер в памяти 256 байт -; выход: A - код ошибки, если CF=1 -//////////////////////////////////////////////////////////////////////// -CURRDIR: LD DE,WorkDirectory - JR CURRDIR_FN.skip -CURRDIR_FN: - LD DE,CurrentDirectory -.skip: EX DE,HL - LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 могло выйти за пределы буфера - XOR A -.loop: CP (HL) - LDI - JP PO,.error ;[x] 15/11/2023 могло выйти за пределы буфера - JR NZ,.loop - RET - ;[x] 15/11/2023 могло выйти за пределы буфера -.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH - SCF - RET - ; -//////////////////////////////////////////////////////////////////////// -; Функция #21. Текущая дата и время. -; -; вход: нет -; выход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; C - день недели -//////////////////////////////////////////////////////////////////////// -SYSTIME: - LD C,BIOS.CMOS_TEST - RST ToBIOS - JP C,.NOCMOS - LD D,7 ;DAY - CALL RCMOS - PUSH AF - LD D,8 ;MONTH - CALL RCMOS - POP DE - LD E,A - PUSH DE - LD D,4 ;HOUR - CALL RCMOS - PUSH AF - LD D,2 ;MINUTE - CALL RCMOS - POP DE - LD E,A - PUSH DE - LD D,0 ;SECOND - CALL RCMOS - PUSH AF - LD D,6 ;WEEK DAY - LD C,BIOS.CMOS_RD - RST ToBIOS - POP DE - LD E,A - PUSH DE - LD D,9 ;YEAR - CALL RCMOS ;READ AND CONVERT TO DECIMAL - PUSH AF - LD D,#32 ;CENTURY - LD C,BIOS.CMOS_RD - RST ToBIOS - LD XH,A - - POP AF - CP 80 ;R01, TEST DECIMAL FIX - PUSH AF - JR C,.XXIAGE - LD A,#19 - CP XH - JR Z,.GOODAGE - JR .BADAGE -.XXIAGE: - LD A,#20 - CP XH - JR Z,.GOODAGE -.BADAGE: - PUSH AF - LD D,#32 ;CENTURY - LD C,BIOS.CMOS_WR - RST ToBIOS - POP AF - LD XH,A -.GOODAGE: - POP AF - LD XL,A - LD A,XH - CALL BCD2HEX - LD L,A - LD H,0 - LD C,L - LD B,H - LD XH,B - ADD HL,HL - ADD HL,HL - ADD HL,BC - ADD HL,HL ;*10 - LD B,H - LD C,L - ADD HL,HL - ADD HL,HL - ADD HL,BC - ADD HL,HL ;*10(100) - EX DE,HL - ADD IX,DE - POP BC - POP HL - POP DE - AND A - RET -.NOCMOS: -.NC_DAY+1: - LD DE,DAY*256+MONTH ;DAY/MONTH -.NC_HOUR+1: - LD HL,0 ;HOUR/MINUTE -.NC_SEC+1: - LD BC,1 ;SECOND/WEEKDAY -.NC_YEAR+2: - LD IX,YEAR ;YEAR - AND A - RET - -//////////////////////////////////////////////////////////////////////// -; Функция #22. Установить текущую дату и время. -; -; вход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; выход: A - код ошибки, если CF=1 -//////////////////////////////////////////////////////////////////////// -SETTIME: - PUSH IX - PUSH BC - PUSH HL - PUSH DE - LD C,BIOS.CMOS_TEST - RST ToBIOS - JP C,.NOCMOS2 - POP AF - PUSH AF - LD D,7 ;DAY - CALL WCMOS - POP BC - LD A,C - LD D,8 ;MONTH - CALL WCMOS - POP AF - PUSH AF - LD D,4 ;HOUR - CALL WCMOS - POP BC - LD A,C - LD D,2 ;MINUTE - CALL WCMOS - POP AF - PUSH AF - LD D,0 ;SECOND - CALL WCMOS - POP BC - LD A,C - LD D,6 ;WEEK DAY - LD C,BIOS.CMOS_WR - RST ToBIOS - ; - POP HL - XOR A - LD DE,100 -.YR: INC A - SBC HL,DE - JR NC,.YR - ADD HL,DE - DEC A - PUSH HL - LD D,#32 ;CENTURY - CALL WCMOS - POP BC - LD A,C - LD D,9 ;YEAR - CALL WCMOS - AND A - RET -; !FIXIT новый биос выставляет время, если с ним что-то не так. -.NOCMOS2: - LD C,0 - LD (SYSTIME.NC_DAY),DE ;DAY/MONTH - LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE - LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY - LD (SYSTIME.NC_YEAR),IX ;YEAR - AND A - RET - -; Дата по-умолчанию -; NC_DAY DW DAY*256+MONTH ;DAY/MONTH -; NC_HOUR DW #0000 ;HOUR/MINUTE -; NC_SEC DW #0001 ;SECOND/WEEKDAY -; NC_YEAR DW YEAR ;YEAR - -//////////////////////////////////////////////////////////////////////// -; Функция #17. Информация о дате и времени файла. -; -; вход: A - дескриптор файла -; выход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; A - код ошибки, если CF=1 -//////////////////////////////////////////////////////////////////////// -GET_D_T: - CALL SET_FM - RET C - ; время/дату из структуры дескр. - LD E,(IY+_sFM.TIME) ; время - LD D,(IY+_sFM.TIME+1) ; - LD C,(IY+_sFM.DATE) ; дата - LD B,(IY+_sFM.DATE+1) ; - CALL RMKTIME ; раскодировать время/дату - AND A - RET - -//////////////////////////////////////////////////////////////////////// -; Функция #18. Изменение даты и времени файла. -; -; вход: A - дескриптор файла -; D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; выход: A - код ошибки, если CF=1 -//////////////////////////////////////////////////////////////////////// -PUT_D_T: - PUSH AF - CALL MK_TIME ; закодировать время/дату - POP AF ; дескриптор - PUSH DE - PUSH BC - CALL SET_FM - POP BC - POP DE - RET C - LD (IY+_sFM.TIME),E - LD (IY+_sFM.TIME+1),D - LD (IY+_sFM.DATE),C - LD (IY+_sFM.DATE+1),B - SET 7,(IY+_sFM.ACCESS_MODE) ;R06 ; уст. признак изменения файла - AND A - RET - -//////////////////////////////////////////////////////////////////////// -; Функция #1D. Смена текущего каталога. -; Меняет текущий каталог и текущий диск, если он указан в файловой -; спецификации. Если путь начинается с "\" - это означает путь от -; корневого каталога, иначе от текущего. -; -; вход: HL - указатель на имя каталога -; выход: нет -; -; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 -//////////////////////////////////////////////////////////////////////// -CHDIR_FN: - ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL CHDIR - ; если удачно, то копируем WorkDirectory в CurrentDirectory - JP NC,DIR_PATH_CHANGE.FullCurrent - ; если неудачно, то возвращаемся туда откуда пришли - PUSH AF - LD HL,CurrentDirectory - CALL CHDIR - POP AF - RET - ; -CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - LD HL,TMPNAME - LD A,(HL) - OR A - CALL NZ,OPENDIR - RET - - -//////////////////////////////////////////////////////////////////////// -; Функция #1B. Создание каталога. -; -; вход: HL - указатель на имя каталога -; выход: A - код ошибки, если CF=1 -; -; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -//////////////////////////////////////////////////////////////////////// -MKDIR: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL .START - PUSH AF - LD HL,CurrentDirectory - CALL CHDIR - POP AF - RET - ; -.START: CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - ;LD HL,TMPNAME ; 8.3 имя - ;LD DE,MASKARE ; буфер имени 11 симв. формата - CALL MASK ; преобр. имя 8.3 -> 11 формат - RET C - ;!TEST optimization ранее GETWORD уже загрузил директорию - ;CALL LOADDIR ; прочитать список каталога - ; - CALL SEARCH.Dir ; поиск записи каталога в списке диска - LD A,DSS_Error.sys.DIR_EXISTS - CCF - RET C ; каталог найден - ; - CALL G_CLUST - RET C - PUSH HL - LD DE,(FatBuffer.ENDCLUS) ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск - LD HL,MASKARE - LD DE,HANDBUF - LD BC,11 - LDIR - EX DE,HL - LD A,#10 ; атрибут записи каталога - LD (HL),A - INC HL - LD BC,#0A00 ; b=счетчик - ; -.loop1: LD (HL),C - INC HL - DJNZ .loop1 - ; - PUSH HL - CALL SYSTIME ; узнать тек. дату и время - CALL MK_TIME ; закодировать время/дату - POP HL - LD (HL),E ; de=время - INC HL - LD (HL),D - INC HL - LD (HL),C ; день - INC HL - LD (HL),B ; месяц - INC HL - POP DE - PUSH DE - LD (HL),E - INC HL - LD (HL),D - INC HL - LD BC,#0400 ; b=счетчик - ; -.loop2: LD (HL),C - INC HL - DJNZ .loop2 - ; - CALL WRT_HND ; скопир. новую запись в список диска (каталога) - ;CALL SAVEDIR ; и сбросить кеш каталога на диск - LD HL,CORE_BUFFERS.SECBUF ; буфер - LD (HL),"." ; запись тек. каталога - LD BC,10*256 + ' ' ; b=счетчик, c=пробел - ; -.loop3: INC HL - LD (HL),C - DJNZ .loop3 - ; - INC HL - LD DE,HANDBUF+11 ; ячейка атрибутов файла - EX DE,HL - LD BC,21 - LDIR - EX DE,HL - LD (HL),"." ; запись родит. каталога - INC HL - LD (HL),"." - LD BC,9*256 + ' ' ; b=счетчик, c=пробел -.MKD03: INC HL - LD (HL),C - DJNZ .MKD03 - ; - INC HL - SET_PAGE_X DIRPAGE - PUSH AF - ; - LD A,(DIRPAGE.buffer) - CP "." - LD DE,DIRPAGE.buffer+11 ; атрибуты записи ;!HARDCODE - JP Z,.MKD04 - LD IX,HANDBUF - XOR A - LD (IX+_sFM.ST_CLUSTER),A - LD (IX+_sFM.ST_CLUSTER+1),A - LD DE,HANDBUF+11 ; ячейка атрибутов файла -.MKD04: EX DE,HL - LD BC,HANDBUF.SIZE-11 - LDIR - POP AF - OUT (SLOT3),A - ; - EX DE,HL - LD D,H - LD E,L - INC DE - LD (HL),0 - LD BC,512-65 ;!HARDCODE - LDIR - ; - POP HL - CALL NSECTOR - LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер -.MKD12: PUSH AF - PUSH HL ; ст. разряд - PUSH IX ; номер лог. сектора - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - ; - LD A,(FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Write - RST ToDSS.DRV - ; - POP AF - OUT (SLOT3),A - ; - LD HL,CORE_BUFFERS.SECBUF - LD DE,CORE_BUFFERS.SECBUF+1 - LD BC,511 - LD (HL),0 - LDIR - ; - POP IX - POP HL - INC IX - LD A,XH - OR XL - JR NZ,.MKD11 - INC HL -.MKD11 POP AF - DEC A - JR NZ,.MKD12 - AND A - RET - - -//////////////////////////////////////////////////////////////////////// -; Функция #1C. Удаление каталога. -; Можно удалить только пустой каталог. -; -; вход: HL - указатель на имя каталога -; выход: A - код ошибки, если CF=1 -; -; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -//////////////////////////////////////////////////////////////////////// -RMDIR: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL .START - PUSH AF - LD HL,CurrentDirectory - CALL CHDIR - CALL DIR_PATH_CHANGE.Current - POP AF - RET - ; -.START: CALL GETWORD - RET C - CALL MASK - RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - CALL LOADDIR - CALL SEARCH.Dir - RET C - LD HL,(HANDBUF+_sFM.ST_CLUSTER) - PUSH IX -.RMD17: PUSH HL - CALL NSECTOR - LD A,(CORE_BUFFERS.BootSector.S_P_C) -.RMD12: PUSH AF - PUSH HL - PUSH IX - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Read - LD A,(FatBuffer.DRIVE) - RST ToDSS.DRV - - POP AF - OUT (SLOT3),A - - LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора - LD HL,CORE_BUFFERS.SECBUF -.RMD10: LD A,(HL) - OR A - JP Z,.RMD15 ;DIR EMPTY - CP "." - JR Z,.RMD14 - CP #E5 ;!HARDCODE байт удаления файла - JR Z,.RMD14 - LD DE,11 ;!HARDCODE смещ. до байта атрибутов - ADD HL,DE - LD A,(HL) - SBC HL,DE - ;BIT 3,A - AND %0000'1000 - JP Z,.error ;DIR NOT EMPTY -.RMD14: LD DE,#0020 - ADD HL,DE - DJNZ .RMD10 - - POP IX - POP HL - INC IX - LD A,XH - OR XL - JR NZ,.RMD11 - INC HL -.RMD11: POP AF - DEC A - JR NZ,.RMD12 - POP HL ; номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера - EX DE,HL ; hl=номер след. кластера - JR NC,.RMD17 ; не конец цепочки -.RMD18: POP IX - JP DELETE ; пометить запись как "удаленная" -.RMD15: POP IX - POP HL - POP AF - POP HL - JR .RMD18 -.error: POP IX - POP HL - POP AF - POP HL - POP IX - LD A,DSS_Error.sys.DIR_NOT_EMPTY - SCF - RET - -//////////////////////////////////////////////////////////////////////// -;Входные значения: -; C - #44 -; B = 0, преобразовать из 11 символьного формата в формат ДОС -; HL - 11 символов имени файла -; DE - буфер для имени в формате ДОС -; B = 1, преобразовать из формата ДОС в 11 символьный формат -; HL - имя файла в формате ДОС -; DE - 11 символов имени файла -;Выходные значения: -; A - код ошибки, если CF=1 -//////////////////////////////////////////////////////////////////////// -DOSNAME: - INC B - DEC B - JP Z,GETNAME - DEC B - JP Z,MASK.custom - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -//////////////////////////////////////////////////////////////////////// - - - - - -;----------------------------------------------------------------------; -; Чтение регистров CMOS -; вход: d=номер регистра -RCMOS: LD C,BIOS.CMOS_RD - RST ToBIOS - ;JP BCD2HEX -; INPUT : A - BCD -; OUTPUT: A - HEX -BCD2HEX: - LD E,A - RRCA - RRCA - RRCA - RRCA - AND #0F - LD D,A - ADD A,A - ADD A,A - ADD A,D - ADD A,A - LD D,A - LD A,E - AND #0F - ADD A,D - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -;!FIXIT переделать по доке на Даллас и заись в ячейки часов -; Запись регистров CMOS -; вход: d=номер регистра -WCMOS: CALL HEX2BCD - LD C,BIOS.CMOS_WR - JP ToBIOS - -; INPUT : A - HEX -; OUTPUT: A - BCD -HEX2BCD: - LD BC,#0AFF -.loop: INC C - SUB B - JR NC,.loop - ADD A,B - LD B,A - LD A,C - RLCA - RLCA - RLCA - RLCA - AND #F0 - OR B - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; Закодировать время/дату -; вход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; выход: de - время -; bc - месяц/день -; ix - год -; -;INPUT: D - DAY; E - MONTH -; H - HOUR; L - MINUTE -; B - SECOND (0...59) -; IX- YEAR (0...65535) -;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 -; BC - yyyyyyymmmmddddd y - year, m - month, d - day -; (1980-2108) - -MK_TIME: - LD A,L - RLCA - RLCA - SLA A - RL H - SLA A - RL H - SLA A - RL H - SRL B - OR B - LD L,A - - LD BC,#F844 ;(-1980) - ADD IX,BC - LD A,E - RLCA - RLCA - RLCA - RLCA - AND #F0 - LD B,XL - SLA A - RL B - OR D - LD C,A - EX DE,HL - AND A - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; Раскодировать время/дату -; вход: de - время -; bc - месяц/день -; ix - год -; выход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; -;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 -; BC - yyyyyyymmmmddddd y - year, m - month, d - day -; (1980-2108) -;OUTPUT: D - DAY; E - MONTH -; H - HOUR; L - MINUTE -; B - SECOND (0...59) -; IX- YEAR (0...65535) -RMKTIME: - EX DE,HL - LD A,C - AND #1F - LD D,A - SRL B - RR C - LD A,C - RRCA - RRCA - RRCA - RRCA - AND #0F - LD E,A - LD C,B - LD B,0 - LD IX,1980 - ADD IX,BC - LD A,L - AND #1F - ADD A,A - LD B,A - SRL H - RR L - SRL H - RR L - SRL H - RR L - SRL L - SRL L - AND A - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; HL - 11 bytes filename "FILENAMEEXT" -; DE - DOS filename "FILENAME.EXT",0 -; GETNAME: -; LD BC,#08FF -; .GETN1: LD A,(HL) -; CP " " -; JR NZ,.GETN3 -; .GETN2: INC HL -; DJNZ .GETN2 -; JR .GETN4 -; .GETN3: LDI -; DJNZ .GETN1 -; ; -; .GETN4: LD A,(HL) -; CP " " -; LD A,"." -; JR NZ,.GETN5 -; LD A,#00 -; .GETN5: LD (DE),A -; INC DE -; RET Z -; LD B,#03 -; .GETN6: LD A,(HL) -; CP " " -; RET Z -; LDI -; XOR A -; LD (DE),A -; DJNZ .GETN6 -; RET -;---------------;---------------;--------------- -GETNAME: - LD BC,#08FF - LD A,' ' -.loop: CP (HL) - JR Z,.skip - LDI - DJNZ .loop - ;;;; - JP .extension - ;;;; -.skip: LD C,B - LD B,0 - ; CF=0 - ADC HL,BC - ;;;; -.extension: - CP (HL) - LD A,"." - JR NZ,.copy_extension - XOR A -.copy_extension: - LD (DE),A - INC DE - RET Z ;no copy extension - ; copy extension - LD BC,#03FF ;!HARDCODE длина расширения + счётчик - LD A,' ' -.loop2: CP (HL) - JR Z,.exit - LDI - DJNZ .loop2 -.exit: XOR A - LD (DE),A - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; Поиск записи каталога в списке каталога -; -; вход: a=атрибут записи -; выход: de'=индекс записи в списке каталога -; (HANDBUF) = file's direcory record -; CF - каталог не найден -SEARCH: -.Dir: LD A,FAT_ATTR.DIRECTORY - CALL SEARCH.Custom - RET NC - CP DSS_Error.sys.PATH_NOT_FOUND + 1 - RET C - ; - SCF - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - RET - ; -.File: LD A,FAT_ATTR.NoDIRnoVolID -.Custom: EX AF,AF' ; A = 76ADLSHR - SET_PAGE_X DIRPAGE - ;PUSH AF - EX AF,AF' - ; - CPL - LD C,A - LD IX,DIRPAGE.buffer - ;!TEST 9/11/23 - ; EXX - ; LD DE,0 - ; EXX - ; -.loop: LD A,(IX+00) - OR A - JR Z,.error_file_not_found - CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.next_record - LD A,(IX+11) - AND C - JR NZ,.next_record - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 - EX DE,HL -.loop_compare: - LD A,(DE) - CP '?' - JR Z,.next_char - CP (HL) - JR NZ,.next_record -.next_char: - INC HL - INC DE - DJNZ .loop_compare - ;!TEST 9/11/23 ;[x] some optimize - ; LD D,XH - ; LD E,XL - LD D,XH - LD E,XL - EXX - LD D,XH - LD E,XL - EXX - ; - LD HL,HANDBUF - EX DE,HL - LD BC,HANDBUF.SIZE - LDIR - ;POP AF - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - AND A - RET -.next_record: - ;!TEST 9/11/23 ;[x] some optimize - ; EXX - ; INC DE - ; EXX - ; - LD DE,#0020 ;!HARDCODE - ADD IX,DE - JR NC,.loop -.error_too_many_files: - ;POP AF - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - SCF - RET - ; -.error_file_not_found: - ;POP AF - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.FILE_NOT_FOUND - SCF - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; Тест на допустимое имя и настроиться на диск. -; вход: hl=строка имени -; выход: (TMPNAME) -GETWORD: - ; !TEST - INC HL - LD A,(HL) - DEC HL - CP ':' - JR NZ,.dir_loop - - LD A,(HL) - CP 'a' - JR C,.next - CP '{' - JR NC,.next - SUB #20 -.next: SUB 'A' - INC HL - INC HL - PUSH HL - CALL CHNDISK - ;CALL OPENDSK - POP HL - RET C - LD A,(HL) - OR A - RET Z - CP ' ' ; - RET Z - CP '\' ; - SCF - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET NZ - INC HL - ; -.dir_loop: - LD DE,TMPNAME - LD BC,#0DFF - ; -.loop: LD A,(HL) - INC HL - CP '\' ; - JR Z,.DIR_NAME - ; AND A - ; JR Z,.DIR_NAME - ;CP ':' - ;JR Z,.DRV_NAME - LD (DE),A - INC DE - CP ' '+1 - CCF - RET NC - DJNZ .loop - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - ; -.DIR_NAME: - XOR A - LD (DE),A - PUSH HL - LD HL,TMPNAME - CALL OPENDIR - POP HL - RET C - JR .dir_loop -; .DRV_NAME: -; LD A,(TMPNAME) -; CP 'a' -; JR C,.next -; CP '{' -; JR NC,.next -; SUB #20 -; .next: SUB 'A' -; PUSH HL -; ;!TEST CHNDISK OPENDSK -; ;CALL OPENDSK -; CALL CHNDISK -; ; -; POP HL -; RET C -; JR .loop -; - -; Буфер имени 8.3 формата -TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; IN: A - drive number -; - -OPENDSK: - ;!TEST DRV.Open обход R10 - LD C,A - LD A,(FatBuffer.DRIVE) - CP C - JR Z,.exit - LD A,C - ; -.force: PUSH AF - LD C,Dss.DRV.Open - RST ToDSS.DRV - POP BC - JP C,.error - LD A,B - LD (FatBuffer.DRIVE),A - CALL RD_BPB - RET C -.exit: LD A,(LDRIVE) - AND A - RET -.error: CP DSS_Error.sys.INVALID_DRIVE - SCF - RET Z - LD A,DSS_Error.sys.NOT_READY - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -OPENDIR:;!TEST ;[x] some optimize - ;XOR A - ;CALL SET_FM - LD IY,CORE_BUFFERS.FM_BUF - ; - LD A,(HL) - OR A - JR NZ,.SUBDIR -.REROOT1: - LD DE,0 - ;!TEST ;[x] some optimize - ;LD (IY+_sFM.ST_CLUSTER),E - ;LD (IY+_sFM.ST_CLUSTER+1),D - EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL - EX DE,HL - ; - CALL LOADDIR - LD HL,WorkDirectory - LD (HL),'\' - INC HL - LD (HL),#00 - ; CF=0 - ;AND A - RET -.SUBDIR: - CP "." - JR NZ,.SUBDIR2 - ;!TEST ;[x] some optimize - ;LD A,(IY+_sFM.ST_CLUSTER) ;R05 - LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R05 - ; - OR (IY+_sFM.ST_CLUSTER+1) ;R05 - JR NZ,.SUDI1 ;R05 - INC HL ;R05 - LD A,(HL) ;R05 - OR A ;R05 - DEC HL ;R05 - JR Z,.REROOT1 ;R05 -.SUDI1: EXX - LD HL,MASKARE - LD DE,MASKARE+1 - LD BC,10 ;!HARDCODE - LD (HL),' ' - LDIR - EXX - LD DE,MASKARE -.loop: LDI - LD A,(HL) - OR A - JR NZ,.loop - JR .SUBDIR3 -.SUBDIR2: - CALL MASK.name - RET C -.SUBDIR3: - CALL FINDDIR - RET C - ;!TEST ;[x] some optimize - ;LD (IY+_sFM.ST_CLUSTER),E - ;LD (IY+_sFM.ST_CLUSTER+1),D - ;LD DE,#4000 ;!HARDCODE - ;LD (IY+_sFM.F_SIZE),E - ;LD (IY+_sFM.F_SIZE+1),D - EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL - LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL - EX DE,HL - ; - CALL LOADDIR - ; CF=0 - ;AND A - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; FIND "MASKAREA" IN DIRECTORY -FINDDIR: - SET_PAGE_X DIRPAGE - ; - PUSH AF - LD IX,DIRPAGE.buffer -.big_loop: - LD A,(IX+00) - OR A - JR Z,.error - CP #E5 - JR Z,.next_step - LD A,(IX+11) ;!HARDCODE - AND #10 ;!HARDCODE - JR Z,.next_step - LD HL,MASKARE - LD D,XH - LD E,XL - EX DE,HL - LD B,11 ;!HARDCODE -.loop: LD A,(DE) - CP "?" - JR Z,.compared - CP (HL) - JR NZ,.next_step -.compared: - INC HL - INC DE - DJNZ .loop - ; - LD A,(IX+0) - CP "." - JP NZ,.ADDSPEC - LD A,(IX+1) ;!HARDCODE - CP "." - JP NZ,.IT_DIR - LD HL,WorkDirectory - LD D,H - LD E,L - INC HL - LD BC,WorkDirectory.DEPTH - XOR A - CPIR - JP PO,.error ;[x] 20/11/23 проверка на выход за границы - DEC HL ;R09 - DEC HL - LD BC,WorkDirectory.DEPTH - LD A,'\' - CPDR - INC HL - EX DE,HL - ; CF = 0 - SBC HL,DE - EX DE,HL - JR NZ,.MM3 - INC HL -.MM3: LD (HL),0 - JP .IT_DIR - ; -.next_step: - LD BC,#0020 ;!HARDCODE - ADD IX,BC - JR NC,.big_loop - ; -.error: POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.PATH_NOT_FOUND - SCF - RET -.ADDSPEC: - LD HL,WorkDirectory+1 - LD BC,WorkDirectory.DEPTH-1 - CALL .CHECK_SLASH - JR C,.error - ;R11 - LD A,B - AND A - JR NZ,.nxt - LD A,C - CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение - JR C,.error -.nxt: ; - LD E,XL - LD D,XH - ; [x] оптимизация по размеру - EX DE,HL - CALL GETNAME - EX DE,HL - ; - -; LD BC,256*8 + ' ' ;!HARDCODE -; .MM1: LD A,(DE) -; INC DE -; CP C -; JR Z,.MM2 -; LD (HL),A -; INC HL -; .MM2 DJNZ .MM1 ;x42-40 50-55 -; LD A,(DE) -; INC DE -; CP C -; JR Z,.MM3 -; LD (HL),"." -; INC HL -; LD (HL),A -; INC HL -; LD A,(DE) -; INC DE -; CP C -; JR Z,.MM3 -; LD (HL),A -; INC HL -; LD A,(DE) -; CP C -; JR Z,.MM3 -; LD (HL),A -; .MM2_5: INC HL -; .MM3: LD (HL),0 -; ; JP IT_DIR - -.IT_DIR: - LD E,(IX+_sFM.ST_CLUSTER) - LD D,(IX+_sFM.ST_CLUSTER+1) - POP AF - OUT (SLOT3),A - AND A - RET -.CHECK_SLASH: - XOR A - CPIR - ;[x] 20/11/23 проверка на выход за границы - SCF - RET PO - ; - DEC HL - DEC HL - LD A,'\' ; #5C - CP (HL) - INC HL - RET Z - LD (HL),A - INC HL - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; .custom: -; Преобразовать имя 8.3 -> 11 формат -; вход: hl = 8.3 имя -; de = буфер имени 11 симв. формата -; при ошибке CF - недоп. имя -; -; HL - MASK "file*.t??" -; DE - 11 bytes filename -; RET: C=2 FILE WITHOUT EXTENTION -; C=1 FILE WITH EXTENTION -MASK: LD HL,TMPNAME -.name: LD DE,MASKARE -.custom: PUSH HL - PUSH DE - LD H,D - LD L,E - INC DE - LD (HL),' ' - LD BC,10 ;!HARDCODE = size (FileName + Extension - 1) - LDIR - POP DE - POP HL - LD A,(HL) - CP '.' ;R07 - SCF ;R07 - JR Z,.MASKB ;R07 - CP ' '+1 -.MASKB: LD A,DSS_Error.sys.INVALID_NAME - RET C - LD BC,#0902 ; B - счетчик -.MASK1: LD A,(HL) - CP ' '+1 - CCF - RET NC - CP '"' - JR Z,.MASK_ERR - CP '*' - JR Z,.MASK3 - CP '+' - JR Z,.MASK_ERR - CP ',' - JR Z,.MASK_ERR - CP '.' - JR Z,.MASK5 - CP '/' - JR Z,.MASK_ERR - CP ':' - JR Z,.MASK_ERR - CP ';' - JR Z,.MASK_ERR - CP '<' - JR Z,.MASK_ERR - CP '=' - JR Z,.MASK_ERR - CP '>' - JR Z,.MASK_ERR - CP '[' - JR Z,.MASK_ERR - CP '\' - JR Z,.MASK_ERR - CP ']' - JR Z,.MASK_ERR - CP '|' - JR Z,.MASK_ERR -; CP 'a' ;????? -; JR C,.MASK2 -; CP 'z' + 1 -; JR NC,.MASK2 -; SUB #20 - CALL UPPER ; a..z -> A..Z -.MASK2: LD (DE),A - INC HL - INC DE - DJNZ .MASK1 -.MASK_ERR: - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET -.MASK3: LD A,'?' - INC HL - DJNZ .MASK6 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET -.MASK6: LD (DE),A - INC DE - DJNZ .MASK6 - LD B,1 - JR .MASK1 -.MASK5: LD A,' ' - INC HL - DJNZ .MASK4 - LD B,4 - DEC C - JP NZ,.MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET -.MASK4: LD (DE),A - INC DE - DJNZ .MASK4 - LD B,4 - DEC C - JP NZ,.MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; a..z -> A..Z -UPPER: CP 'a' - RET C - CP 'z' + 1 - JR NC,.MDUPPER - SUB #20 -.NOUPPER: - RET -.MDUPPER: - CP 'а' ; русская буква а, код #A0 - JR C,.NOUPPER - CP 'п' ; русская буква п, код #B0 - JR NC,.BGUPPER - SUB #20 - RET -.BGUPPER: - CP 'р' ; русская буква р, код #E0 - JR C,.NOUPPER - CP 'Ё' ; русская буква Ё, код #F0 - JR NC,.HGUPPER - SUB #50 - RET -.HGUPPER: CP 'ё' ; русская буква ё, код #F1 - RET NZ - DEC A - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; Прочитать список каталога -LOADDIR: - XOR A - LD H,A - LD L,A - LD IX,0 - LD B,A ; от начала файла - CALL MOVE_FP - - SET_PAGE_X DIRPAGE - - PUSH AF - ;!TEST no ldir - ; очистить кеш каталога - ; LD HL,#C000 - ; LD DE,#C001 - ; LD BC,#3FFF - ; LD (HL),L - ; LDIR - ; - ; - LD A,(FatBuffer.DRIVE) ; номер диска - LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор - LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера - LD E,(IY+_sFM.ST_CLUSTER+1) - LD A,D - OR E - JP Z,.LROTDIR ; root ?? - LD HL,DIRPAGE.buffer ; куда - LD DE,#4000 ; сколько - XOR A ; дескриптор - CALL READ ; чтение из файла - ;!FIXIT проверка на ошибку - LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов - POP AF - OUT (SLOT3),A - AND A - RET -.LROTDIR: - LD HL,(FatBuffer.DIR_FRH) ; ст. разряд - LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора - LD A,(FatBuffer.DIR_S_S) - ;!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,DIRPAGE.buffer ; буфер - LD C,Dss.DRV.Read ; чтение секторов - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - AND A - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; скопировать запись в список диска (каталога) -; и сбросить кеш каталога на диск -WRT_HND: SET_PAGE_X DIRPAGE - EX AF,AF' - ; - LD IX,DIRPAGE.buffer - ;TEST 9/11/23 - ; EXX - ; LD DE,0 - ; EXX - ; -.loop: LD A,(IX+00) - OR A - JR Z,.WRT_HN2 - CP #E5 - JR Z,.WRT_HN2 - LD BC,#0020 - ADD IX,BC - JR NC,.loop - ; - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.ROOT_OVERFLOW - SCF - RET -.WRT_HN2: - LD D,XH - LD E,XL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR - EX AF,AF' - OUT (SLOT3),A - LD HL,DIRPAGE.buffer - LD BC,(SAVEDIR.DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - JR NC,SAVEDIR - LD HL,(SAVEDIR.DIRSIZE) - LD BC,(FatBuffer.B_P_C) - ADD HL,BC - LD (SAVEDIR.DIRSIZE),HL - AND A - JP SAVEDIR -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -SAVEDIR: - XOR A - LD HL,0 - LD IX,0 - LD B,0 - CALL MOVE_FP - ; - SET_PAGE_X DIRPAGE - PUSH AF - ; - LD A,(FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - LD D,(IY+_sFM.ST_CLUSTER) - LD E,(IY+_sFM.ST_CLUSTER+1) - LD A,D - OR E - JP Z,.SROTDIR - LD HL,DIRPAGE.buffer -; размер списка каталога size_cash_directory -.DIRSIZE+1: - LD DE,0 - XOR A - CALL WRITE - POP AF - OUT (SLOT3),A - AND A - RET -.SROTDIR: - LD HL,(FatBuffer.DIR_FRH) - LD IX,(FatBuffer.DIR_FRL) - LD A,(FatBuffer.DIR_S_S) - LD B,32 ;!HARDCODE - SUB B - JR NC,.RTD1S - ADD A,B - LD B,A -.RTD1S: LD A,(FatBuffer.DRIVE) - LD DE,DIRPAGE.buffer - LD C,Dss.DRV.Write - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - AND A - RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -;!TEST Current Dir ;[x] 15/10/23 -DIR_PATH_CHANGE: -.FullCurrent: LD A,(FatBuffer.DRIVE) - ADD 'A' - LD (CurrentPath),A - ; -.Current: LD HL,CurrentDirectory - JP CURRDIR - ; -.FullWork: LD A,(CurrentPath) - SUB 'A' - LD (FatBuffer.DRIVE),A - ; -.Work: LD HL,WorkDirectory - JP CURRDIR_FN -; - -; -DIR_PATH_CHECK: LD A,(HL) - CP '\' - JR NZ,.notRootDir - ; - CALL .checkDrive - RET Z - LD A,(CurrentPath) - SUB 'A' - JP OPENDSK - ; -.notRootDir: INC HL - LD A,(HL) - CP ':' - RET Z - ; -.forceCheck: LD HL,CurrentDirectory+1 - LD BC,CurrentDirectory.DEPTH-1 - CALL .checkDrive - JR Z,.checkDir - ; - LD HL,CurrentPath - LD A,(FatBuffer.DRIVE) - ADD 'A' - CP (HL) - JR NZ,.gotoPath - ; -.checkDir: LD HL,CurrentDirectory+1 - LD DE,WorkDirectory+1 - ; -.loop: LD A,(DE) - AND A - JR Z,.end - CP (HL) - INC HL - INC DE - JR Z,.loop - JP .gotoPath - ; -.end: CP (HL) - RET Z - JR .gotoPath - ; -.checkDrive: LD HL,CurrentPath - LD A,(FatBuffer.DRIVE) - ADD 'A' - CP (HL) - RET -.gotoPath: CALL FINDDIR.CHECK_SLASH - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET C - LD HL,CurrentPath - JP GETWORD -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -CHECK_NAME: - LD HL,MASKARE -.custom: LD BC,11 ;!HARDCODE - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET -;----------------------------------------------------------------------; - - -;!FIXIT к буферам -; Массив лог. номеров банок расширения DSS -BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE -; - -HANDBUF: BLOCK HANDBUF.SIZE,0 -; - -MASKARE: BLOCK 8,0 ; имя файла - BLOCK 3,0 ; расш. - BLOCK 21,0 ; 11+21=32 -;TMP_BYTE: DB 0 ; ACCESS: -; - -;PATH0: DW #0000 -;ACCESS: DB #00 -;DTABUF: DW #0000 -;CURHND: DW #0000 -;NO_NEXT: DB #00 -;.YES EQU 0 -;.NO EQU #FF -;FNDMODE: DB #00 -;//MODULE: DOS5 -;[END] - -;DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory - - -;!TODO ? -GHANDLE: -; PUSH DE -; PUSH HL -; PUSH IX -; CALL TESTDSK -; JP C,G_HAND1 -; CALL LOADDIR -; POP DE -; LD HL,DIR -; LD BC,#0020 -;G_HAND2: -; LD A,D -; OR E -; JP Z,G_HAND3 -; ADD HL,BC -; DEC DE -; JP G_HAND2 -;G_HAND3: -; EXX -; POP DE -; EXX -;G_HAND4: -; EX DE,HL -; LD A,DIRPAGE -; CALL BANK -; EX DE,HL -; LD DE,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; OUT (SLOT3),A -; LD HL,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; POP BC -; DEC BC -; LD A,B -; OR C -; RET Z -; PUSH BC -; JP G_HAND4 -;G_HAND1 POP IX -; POP HL -; POP DE -; RET -;HANDTA BLOCK 32,0 -;----------------------------------------------------------------------; -; ;!TEST -; SAVE_CURRENT_PATH: -; SET_PAGE_X ENVPAGE -; PUSH AF -; CALL CURRDSK -; ADD A,"A" -; LD HL,TMP_CURDIR -; LD (HL),A -; INC HL -; LD A,":" -; LD (HL),A -; INC HL -; CALL CURRDIR -; POP AF -; OUT (SLOT3),A -; RET -; BACK_CURRENT_PATH: -; SET_PAGE_X ENVPAGE -; PUSH AF -; LD HL,TMP_CURDIR -; CALL CHDIR -; POP AF -; OUT (SLOT3),A -; RET -; ; -;----------------------------------------------------------------------; -;!TEST - ;BANK: - ; LD C,A - ; LD B,0 - ; LD HL,BANKTBL - ; ADD HL,BC - ; IN A,(SLOT3) - ; LD C,SLOT3 - ; OUTI - ; RET -; diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 44ced0c..72e1d29 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -961,9 +961,10 @@ WRITE: LD (.R_POINT),HL ////////////// NEW ////////////////// ; in: HL - CLUSTER ; out: HL:IX - SECTOR -NSECTOR: DEC HL - DEC HL +NSECTOR: LD DE,0 + DEC HL + DEC HL LD A,(CORE_BUFFERS.BootSector.S_P_C) XOR 1 JR Z,.skip @@ -971,7 +972,8 @@ NSECTOR: DEC HL RRA .loop: ADD HL,HL RL E - ; RL D + RL D + ; RRA JP NC,.loop ; @@ -984,6 +986,7 @@ NSECTOR: DEC HL LD D,A LD E,A ADC HL,DE + ;!TODO а надо ли проверять переполнение HL:IX? RET ///////////////////////////////////// diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm new file mode 100644 index 0000000..73b42b3 --- /dev/null +++ b/DSS/DOS_Proc.asm @@ -0,0 +1,512 @@ +;[BEGIN] +;//MODULE: DOS_X +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) +;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 +;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR +;R10 - 03-04-2003 DNS IMPROVED FN. VERSION +;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. +;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION +;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET +;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS +;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR +;R04 08-11-1999 DNS KILL OLD FUNCTIONS +;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) +;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" +;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" +;--------------------------------------------------------------- + +;[BEGIN] +;//MODULE: FAT_X +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;RX01 10-02-1999 DNS UPGRADE FAT CASH +;--------------------------------------------------------------- + + +;----------------------------------------------------------------------; +; HL - 11 bytes filename "FILENAMEEXT" +; DE - DOS filename "FILENAME.EXT",0 +; GetName: +; LD BC,#08FF +; .GETN1: LD A,(HL) +; CP " " +; JR NZ,.GETN3 +; .GETN2: INC HL +; DJNZ .GETN2 +; JR .GETN4 +; .GETN3: LDI +; DJNZ .GETN1 +; ; +; .GETN4: LD A,(HL) +; CP " " +; LD A,"." +; JR NZ,.GETN5 +; LD A,#00 +; .GETN5: LD (DE),A +; INC DE +; RET Z +; LD B,#03 +; .GETN6: LD A,(HL) +; CP " " +; RET Z +; LDI +; XOR A +; LD (DE),A +; DJNZ .GETN6 +; RET +;---------------;---------------;--------------- +GetName: + LD BC,#08FF ;!HARDCODE длина имени + счётчик + LD A,' ' +.loop: CP (HL) + JR Z,.skip + LDI + DJNZ .loop + ;;;; + JP .extension + ;;;; +.skip: LD C,B + LD B,0 + ; CF=0 + ADC HL,BC + ;;;; +.extension: + CP (HL) + LD A,"." + JR NZ,.copy_extension + XOR A +.copy_extension: + LD (DE),A + INC DE + RET Z ;no copy extension + ; copy extension + LD BC,#03FF ;!HARDCODE длина расширения + счётчик + LD A,' ' +.loop2: CP (HL) + JR Z,.exit + LDI + DJNZ .loop2 +.exit: XOR A + LD (DE),A + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +; Тест на допустимое имя и настроиться на диск. +; вход: hl=строка имени +; выход: (TMPNAME) +GETWORD: + ; !TEST + INC HL + LD A,(HL) + DEC HL + CP ':' + JR NZ,.dir_loop + + LD A,(HL) + CP 'a' + JR C,.next + CP '{' + JR NC,.next + SUB #20 +.next: SUB 'A' + INC HL + INC HL + PUSH HL + CALL CHNDISK + ;CALL OPENDSK + POP HL + RET C + LD A,(HL) + OR A + RET Z + CP ' ' ; + RET Z + CP '\' ; + SCF + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET NZ + INC HL + ; +.dir_loop: + LD DE,TMPNAME + LD BC,#0DFF + ; +.loop: LD A,(HL) + INC HL + CP '\' ; + JR Z,.DIR_NAME + ; AND A + ; JR Z,.DIR_NAME + ;CP ':' + ;JR Z,.DRV_NAME + LD (DE),A + INC DE + CP ' '+1 + CCF + RET NC + DJNZ .loop + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET + ; +.DIR_NAME: + XOR A + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + RET C + JR .dir_loop +; .DRV_NAME: +; LD A,(TMPNAME) +; CP 'a' +; JR C,.next +; CP '{' +; JR NC,.next +; SUB #20 +; .next: SUB 'A' +; PUSH HL +; ;!TEST CHNDISK OPENDSK +; ;CALL OPENDSK +; CALL CHNDISK +; ; +; POP HL +; RET C +; JR .loop +; + +; Буфер имени 8.3 формата +TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +; IN: A - drive number +; +OPENDSK: + ;!TEST DRV.Open обход R10 + LD C,A + LD A,(FatBuffer.DRIVE) + CP C + IF CHECK_DRIVE_CHANGE + JR NZ,.open + PUSH BC + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + POP BC + ENDIF + JR Z,.exit + +.open: LD A,C + ; +.force: PUSH AF + LD C,Dss.DRV.Open + RST ToDSS.DRV + POP BC + JP C,.error + LD A,B + LD (FatBuffer.DRIVE),A + CALL RD_BPB + RET C +.exit: LD A,(LDRIVE) + AND A + RET +.error: CP DSS_Error.sys.INVALID_DRIVE + SCF + RET Z + LD A,DSS_Error.sys.NOT_READY + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +OPENDIR:;!TEST ;[x] some optimize + ;XOR A + ;CALL SET_FM + LD IY,CORE_BUFFERS.FM_BUF + ; + LD A,(HL) + OR A + JR NZ,.SUBDIR +.REROOT1: + LD DE,0 + ;!TEST ;[x] some optimize + ;LD (IY+_sFM.ST_CLUSTER),E + ;LD (IY+_sFM.ST_CLUSTER+1),D + EX DE,HL + LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + EX DE,HL + ; + CALL LOADDIR + LD HL,WorkDirectory + LD (HL),'\' + INC HL + LD (HL),#00 + ; CF=0 + ;AND A + RET +.SUBDIR: + CP "." + JR NZ,.SUBDIR2 + ;!TEST ;[x] some optimize + ;LD A,(IY+_sFM.ST_CLUSTER) ;R005 + LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R005 + ; + OR (IY+_sFM.ST_CLUSTER+1) ;R005 + JR NZ,.SUDI1 ;R005 + INC HL ;R005 + LD A,(HL) ;R005 + OR A ;R005 + DEC HL ;R005 + JR Z,.REROOT1 ;R005 +.SUDI1: EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 ;!HARDCODE + LD (HL),' ' + LDIR + EXX + LD DE,MASKARE +.loop: LDI + LD A,(HL) + OR A + JR NZ,.loop + JR .SUBDIR3 +.SUBDIR2: + CALL MASK.name + RET C +.SUBDIR3: + CALL FINDDIR + RET C + ;!TEST ;[x] some optimize + ;LD (IY+_sFM.ST_CLUSTER),E + ;LD (IY+_sFM.ST_CLUSTER+1),D + ;LD DE,#4000 ;!HARDCODE + ;LD (IY+_sFM.F_SIZE),E + ;LD (IY+_sFM.F_SIZE+1),D + EX DE,HL + LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + LD HL,#4000 ;!HARDCODE + LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL + EX DE,HL + ; + CALL LOADDIR + ; CF=0 + ;AND A + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +; .custom: +; Преобразовать имя 8.3 -> 11 формат +; вход: hl = 8.3 имя +; de = буфер имени 11 симв. формата +; при ошибке CF - недоп. имя +; +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION +MASK: LD HL,TMPNAME +.name: LD DE,MASKARE +.custom: PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),' ' + LD BC,10 ;!HARDCODE = size (FileName + Extension - 1) + LDIR + POP DE + POP HL + LD A,(HL) + CP '.' ;R007 + SCF ;R007 + JR Z,.MASKB ;R007 + CP ' '+1 +.MASKB: LD A,DSS_Error.sys.INVALID_NAME + RET C + LD BC,#0902 ; B - счетчик +.MASK1: LD A,(HL) + CP ' '+1 + CCF + RET NC + CP '"' + JR Z,.MASK_ERR + CP '*' + JR Z,.MASK3 + CP '+' + JR Z,.MASK_ERR + CP ',' + JR Z,.MASK_ERR + CP '.' + JR Z,.MASK5 + CP '/' + JR Z,.MASK_ERR + CP ':' + JR Z,.MASK_ERR + CP ';' + JR Z,.MASK_ERR + CP '<' + JR Z,.MASK_ERR + CP '=' + JR Z,.MASK_ERR + CP '>' + JR Z,.MASK_ERR + CP '[' + JR Z,.MASK_ERR + CP '\' + JR Z,.MASK_ERR + CP ']' + JR Z,.MASK_ERR + CP '|' + JR Z,.MASK_ERR +; CP 'a' ;????? +; JR C,.MASK2 +; CP 'z' + 1 +; JR NC,.MASK2 +; SUB #20 + CALL UPPER ; a..z -> A..Z +.MASK2: LD (DE),A + INC HL + INC DE + DJNZ .MASK1 +.MASK_ERR: + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK3: LD A,'?' + INC HL + DJNZ .MASK6 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK6: LD (DE),A + INC DE + DJNZ .MASK6 + LD B,1 + JR .MASK1 +.MASK5: LD A,' ' + INC HL + DJNZ .MASK4 + LD B,4 + DEC C + JP NZ,.MASK1 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK4: LD (DE),A + INC DE + DJNZ .MASK4 + LD B,4 + DEC C + JP NZ,.MASK1 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +;!TEST Current Dir ;[x] 15/10/23 +DIR_PATH_CHANGE: +.FullCurrent: LD A,(FatBuffer.DRIVE) + ADD 'A' + LD (CurrentPath),A + ; +.Current: LD HL,CurrentDirectory + JP CURRDIR + ; +.FullWork: LD A,(CurrentPath) + SUB 'A' + LD (FatBuffer.DRIVE),A + ; +.Work: LD HL,WorkDirectory + JP CURRDIR_FN +; +DIR_PATH_CHECK: LD A,(HL) + CP '\' + JR NZ,.notRootDir + ; + CALL .checkDrive + RET Z + LD A,(CurrentPath) + SUB 'A' + JP OPENDSK + ; +.notRootDir: INC HL + LD A,(HL) + CP ':' + RET Z + ; +.forceCheck: LD HL,CurrentDirectory+1 + LD BC,CurrentDirectory.DEPTH-1 + CALL .checkDrive + JR Z,.checkDir + ; + LD HL,CurrentPath + LD A,(FatBuffer.DRIVE) + ADD 'A' + CP (HL) + JR NZ,.gotoPath + ; +.checkDir: LD HL,CurrentDirectory+1 + LD DE,WorkDirectory+1 + ; +.loop: LD A,(DE) + AND A + JR Z,.end + CP (HL) + INC HL + INC DE + JR Z,.loop + JP .gotoPath + ; +.end: CP (HL) + RET Z + JR .gotoPath + ; +.checkDrive: LD HL,CurrentPath + LD A,(FatBuffer.DRIVE) + ADD 'A' + CP (HL) + RET +.gotoPath: CALL FINDDIR.CHECK_SLASH + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET C + LD HL,CurrentPath + JP GETWORD +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +CHECK_NAME: + LD HL,MASKARE +.custom: LD BC,11 ;!HARDCODE + LD A,"?" + CPIR + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +;----------------------------------------------------------------------; + + + diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM deleted file mode 100644 index 8de28c4..0000000 --- a/DSS/DOS_X.ASM +++ /dev/null @@ -1,799 +0,0 @@ - -;[BEGIN] -;//MODULE: DOS_X -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) -;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 -;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR -;R10 03-04-2003 DNS IMPROVED FN. VERSION -;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. -;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION -;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET -;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS -;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR -;R04 08-11-1999 DNS KILL OLD FUNCTIONS -;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) -;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" -;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" -;--------------------------------------------------------------- - -; RGADR EQU #89 ;VIDEO CONTROL REGISTER -; SLOT0 EQU #82 ;WIN #0000-#3FFF -; SLOT1 EQU #A2 ;WIN #4000-#7FFF -; SLOT2 EQU #C2 ;WIN #8000-#BFFF -; SLOT3 EQU #E2 ;WIN #C000-#FFFF - -; SYSPAGE EQU #FE - -;Commands for restart #10 -//NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION -// SCF -// RET - -;///////////////////////////////////////////////////////////////////// -; Функция #00. Версия ДОС. -; Возвращает номер версии дисковой системы. -; вход: нет -; выход: DE = номер версии/модификации -; BC = номер билда (0..999) -;///////////////////////////////////////////////////////////////////// -VERSION: - ;XOR A - ;LD H,A ;!TODO пихать сюда OSINFO - ;LD L,A - LD HL,0 - LD DE,VERS*256+MODF - LD BC,BUILD - RET - -//;R10 -//OSINFO: -//OSINFO_SIG: DB "OSINFOSTRUCTURE",0 - -//BOOTDRV: DB 0 - -;///////////////////////////////////////////////////////////////////// -; Функция #09. Номер системного диска. -; Возвращает номер диска, c которого загружена система. -; -; вход: B = 0 (01h - исп. boot-загрузчик системы) -; выход: A - номер системного диска (0=A,1=B,..) -;///////////////////////////////////////////////////////////////////// -BOOTDSK: - INC B - DEC B - JR Z,GETBOOT - DEC B -.chg: JR Z,SETBOOT ;R13 меняется на JR С,SETBOOT после первого удачного исполнения SETBOOT - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET - -;GET BOOT DISK -GETBOOT: -BOOTDRV+1: LD A,0 ;R09 - AND A - RET - -;SET BOOT DISK -; Сообщить DSS с какого диска загружается система. -; Исп. загрузчик системы для иниц. ячейки "boot_disk". -SETBOOT: - LD B,A - LD C,0 -.loop: PUSH BC - LD A,C - LD DE,#55AA - LD BC,256*0 + Dss.DRV.GenIOCTL - RST ToDSS.DRV - POP BC - JR C,.NoSupport - EX AF,AF' ;PHISICAL DRIVE NUMBER - CP B - JR NZ,.NoSupport - ;R13 - LD A,#38 ; opcode for JR C,addr - LD (BOOTDSK.chg),A - ;R13 - LD A,C - LD (BOOTDRV),A - AND A - RET -.NoSupport: - INC C - LD A,(LDRIVE) - CP C - JR NZ,.loop - SCF - RET -;R09 - -;!!!!! Дубль - CHNDISK = OPENDSK -/* -CHNDISK: - PUSH AF - LD C,Dss.DRV.Open - RST ToDSS.DRV - POP BC - JP C,NDISK11 - LD A,B - LD (FatBuffer.DRIVE),A - CALL RD_BPB - RET C - LD A,(LDRIVE) - AND A - RET -NDISK11: - CP DSS_Error.sys.INVALID_DRIVE - SCF - RET Z - LD A,DSS_Error.sys.NOT_READY - RET -*/ - -;///////////////////////////////////////////////////////////////////// -; Функция #02. Номер текущего диска. -; -; вход: нет -; выход: A - номер диска (0=A,1=B,..) -;///////////////////////////////////////////////////////////////////// -CURRDSK_FN: - LD A,(CurrentPath) - SUB 'A' - RET NC - LD A,DSS_Error.sys.INVALID_DRIVE - RET -CURRDSK: LD A,(FatBuffer.DRIVE) - AND A - RET - - -;///////////////////////////////////////////////////////////////////// -; [ ] новая подфункция с битом 7 в рег. А -; Возвращает информацию об общем и свободном пространстве дискового -; устройства. -; -; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий) -; При A bit7 = 1: -; HL - буфер (256 байтов) для расширенных данных: -; B != 0 - считать свободное место -; ; -; размер поля - 1 байт -; Файловая система -; ; -; размер поля - 1 байт -; Серийный номер диска -; ; -; размер поля - 1 байт -; Метка диска -; ; -; размер поля - 1 байт -; Зарезервировано... -; ; -; A xor #80 - номер диска -; -; выход: A - размер кластера в секторах, если CF=0 -; HL - общее кол-во кластеров -; DE - свободных кластеров -; BC - размер сектора в байтах -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// - ; [ ] 22/11/23 подфункция с доп.инфой - MACRO _mCOPY_LOOP - LD C,A - LD B,0 - LD (DE),A - INC DE - LDIR -; .loop: -; LD (HL),A -; INC DE -; INC HL -; LD A,(DE) -; DJNZ .loop - 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 - JR C,.error - ; - EX (SP),HL - PUSH AF - PUSH DE - PUSH BC - ;;;; - ; - EX DE,HL - LD HL,CORE_BUFFERS.BootSector.ID_FAT - LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length - _mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER - LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER - _mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_LABEL - LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL - _mCOPY_LOOP - ; - - XOR A - LD (DE),A - ;;;; - POP BC - POP DE - POP AF -.error: POP HL - RET - ; - - ;CP #FF ; !FIXIT WorkDirectory - ;!TEST Current Dir - ;JR Z,CURRDS ;R06 -.CurrentDisk: - LD A,(CurrentPath) - SUB 'A' - LD HL,FatBuffer.DRIVE - CP (HL) - JR Z,.CheckFreeSpace - ; -.CustomDisk: - PUSH BC - CALL CHNDISK ;R06 - POP BC - RET C ;R06 - -.CheckFreeSpace: - ; - XOR A - OR B - CALL NZ,.CURRDS - ; - ; -.FRESP2: - LD D,B - LD E,C - LD HL,(FAT_Max_Cluster) - DEC HL - LD BC,(CORE_BUFFERS.BootSector.B_P_S) - LD A,(CORE_BUFFERS.BootSector.S_P_C) - AND A - RET - ; -.CURRDS: - LD HL,2 - LD BC,0 -.FRESP: PUSH BC - CALL R_F_FAT - POP BC - CP DSS_Error.sys.DISK_FULL - RET Z - - LD A,E - OR D - JR NZ,.SKIC - INC BC -.SKIC: INC HL - JP .FRESP -; - - -; Номер последнего диска в системе -LDRIVE: DB DSS_MAX_DRIVES_AMOUNT - IF COMPILE_UNUSED_CODE -TDRIVE: DB #00 -TCLUST: DW #0000 -TCOUNT: DW #0000 - ENDIF -;R04SIZE2CL LD DE,(B_P_C) -;R04 XOR A -;R04 SCF -;R04S2C01 RR D -;R04 RR E -;R04 JR C,S2C02 -;R04 RR H -;R04 RR L -;R04 RR B -;R04 RR C -;R04 JP NC,S2C01 -;R04 LD A,1 -;R04 JP S2C01 -;R04S2C02 OR A -;R04 RET Z -;R04 INC BC -;R04 RET - -;R04L_SEC_X DW 0 -;R04H_SEC_X DW 0 - - ; !FIXIT чёт не используется - IF COMPILE_UNUSED_CODE -TESTDSK: - LD A,(FatBuffer.DRIVE) - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - OR A - RET Z - ENDIF -RD_BPB: LD C,SLOT3 - IN B,(C) - PUSH BC - - IN A,(SLOT0) - OUT (SLOT3),A - ;R08 - ;LD DE,BOOT+#C000 - LD DE,CORE_BUFFERS.SECBUF+#C000 - ;R08 - LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE - - LD C,Dss.DRV.GetBPB - RST ToDSS.DRV - POP BC - OUT (C),B - JP C,DOS_X_Error.Not_ready - - //PUSH IY ; пока без индексного, но может пригодиться - - LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07 - ;R05 - AND A - SBC HL,DE - JP NZ,DOS_X_Error.UnknownBPB - ;R08 - LD HL,CORE_BUFFERS.SECBUF - LD DE,CORE_BUFFERS.BootSector - LD BC,_sBOOT_SEC ; size - LDIR - ; - - //LD IY,BootSector ; пока без индексного, но может пригодиться - //LD A,(IY+_sBOOT_SEC.ID_FORM) - LD A,(CORE_BUFFERS.BootSector.ID_FORM) - - CP #F0 - JP C,DOS_X_Error.UnknownBPB - - ;!TEST - ;LD HL,0 ; calc. first sector FAT - ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - ;LD D,(IY+_sBOOT_SEC.RESERVE+1) - ;ADD HL,DE - - //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - //LD H,(IY+_sBOOT_SEC.RESERVE+1) - LD HL,(CORE_BUFFERS.BootSector.RESERVE) - ; - - ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec - ; LD D,(IY+_sBOOT_SEC.HIDDEN+1) - ; ADD HL,DE - - ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT - LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 - LD (FatBuffer.FAT2_XX),HL - - //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT - //LD D,(IY+_sBOOT_SEC.S_P_F+1) - LD DE,(CORE_BUFFERS.BootSector.S_P_F) - - - LD A,(CORE_BUFFERS.BootSector.FAT_NUM) ; amount FATs - CP 1 - JR Z,.loop1 - DEC A - ADD HL,DE - LD (FatBuffer.FAT2_XX),HL -;C_DATA1 -.loop1: ADD HL,DE - DEC A - JR NZ,.loop1 - LD (FatBuffer.DIR_FRM),HL ; first sector DIR - ; CF = ? мало ли - AND A - ; CF = 0 - - //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors - //LD B,(IY+_sBOOT_SEC.B_P_S+1) - LD BC,(CORE_BUFFERS.BootSector.B_P_S) - ; RL C - ; RL B - ; RL C - ; RL B - ; RL C - ; RL B - ; LD C,B - ; LD B,0 ; BC - File handels in sectors - ; LD A,C - ;;;; - LD A,B - RL C - RLA - RL C - RLA - RL C - RLA - LD C,A - LD B,0 ; BC - File handels in sectors - ;;;; - LD (FatBuffer.F_P_S),A - - //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel - //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) - LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) - - EX DE,HL - DEC HL - XOR A -;NEXTAD2 -.loop2: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,BC - JR NC,.loop2 - - EX DE,HL - LD C,A ; A - sectors in DIR - LD B,0 - LD (FatBuffer.DIR_S_S),A - ADD HL,BC ; Start DATA area - LD (FatBuffer.DAT_FRM),HL -;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer -//////////////////////////////////////////////////////////////////////// - IF COMPILE_UNUSED_CODE - ;LD HL,0 - - ;LD H,B ; тут в B ноль должен быть - ;LD L,B - ;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector - ;LD B,(IY+_sBOOT_SEC.B_P_S+1) - - //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector - //LD H,(IY+_sBOOT_SEC.B_P_S+1) - LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector - - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize -;NEXTAD3 -; .loop3: ADD HL,BC ; calc. cluster size -; DEC A -; JR NZ,.loop3 - ;!TODO проверить правильно ли считает - XOR 1 ; calc. cluster size - JR Z,.loop3.end - RRA -.loop3: ADD HL,HL - RRA - JP NC,.loop3 -.loop3.end: - ; - - LD (FatBuffer.CLU_LEN),HL - EX DE,HL - LD HL,#3FFF ;!TODO FATcacheSize - XOR A -;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -.loop4: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,DE - JR NC,.loop4 - LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) - ENDIF -//////////////////////////////////////////////////////////////////////// - - LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага - LD DE,FatBuffer.MSG - LD B,3 -;R_BPBL1 -.loop5: LD A,(DE) - CP (HL) - JP NZ,.IBM_DOS - INC HL - INC DE - DJNZ .loop5 -;FID -.loop6: LD A,(HL) - INC HL - CP ' ' - JR Z,.loop6 - - CP '1' - JP NZ,DOS_X_Error.UnknownBPB - LD A,(HL) - CP '6' ; FAT16 - LD HL,#FFFF - JR Z,.BPB_FAT - CP '2' ; FAT12 - JP NZ,DOS_X_Error.UnknownBPB - LD HL,#0FFF -.BPB_FAT: - LD (FatBuffer.FAT_TYP),A - LD (FatBuffer.ENDCLUS),HL - -;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer -//////////////////////////////////////////////////////////////////////// - IF COMPILE_UNUSED_CODE - - LD HL,0 - - //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track - //LD B,(IY+_sBOOT_SEC.S_P_T+1) - LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track - - LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага -.BPB_L1: ; calc. sector per cylinder - ADD HL,BC - DEC A - JR NZ,.BPB_L1 - LD (FatBuffer.S_X_H),HL - ENDIF -//////////////////////////////////////////////////////////////////////// - - LD DE,(FatBuffer.DAT_FRM) -; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec -; LD D,(IY+_sBOOT_SEC.HIDDEN+1) -; AND A -; SBC HL,DE -; EX DE,HL - - //LD L,(IY+_sBOOT_SEC.S_P_D) - //LD H,(IY+_sBOOT_SEC.S_P_D+1) - LD HL,(CORE_BUFFERS.BootSector.S_P_D) - - LD A,H - OR L - JP NZ,.HDDSMAL - ; - //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) - //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) - LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS) - - //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) - //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) - LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2) - - AND A - SBC HL,DE - JP NC,.HDDBIG - DEC BC - JP .HDDBIG -.HDDSMAL: - ;AND A ;тут CF полюбас сброшен должен быть - SBC HL,DE - LD BC,0 -.HDDBIG: LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага - SCF -.S4C01: RRA - JR C,.S4C02 - RR B - RR C - RR H - RR L - JP .S4C01 -.S4C02: INC HL - LD (FAT_Max_Cluster),HL - - //POP IY - -; LD DE,FAT -; LD HL,0 -; LD IX,(FAT_FRM) -; LD B,3 -; LD A,(DRIVE) -; LD C,Dss.DRV.Read -; RST ToDSS.DRV -; JP C,RDERR1 - LD HL,0 - LD (FatCache),HL - - SET_PAGE_X FATPAGE - - PUSH AF - XOR A - CALL RE_FAT - POP AF - OUT (SLOT3),A - CALL R_CLUST - XOR A - RET - -.IBM_DOS: - LD A,(CORE_BUFFERS.BootSector.ID_FORM) - CP #F0 - JR C,DOS_X_Error.UnknownBPB -;????? надо ли изменить? -// OR 2 -// CP #FA ; ID ram-диска - CP #F8 ; а если не F8? -;????? - LD A,'6' - LD HL,#FFFF - JP Z,.BPB_FAT - - LD A,'2' - LD HL,#0FFF - JP .BPB_FAT - -DOS_X_Error: -.UnknownBPB: - - //POP IY - - LD A,DSS_Error.sys.UNKNOWN_FORMAT - SCF - RET -.Not_ready: - LD A,DSS_Error.sys.NOT_READY - ; CF = 1 - RET - - - -;!TODO к буферам! -FatBuffer: -.MSG: DB 'FAT' -.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) -.BLOCK: DB #00 -.DIR_CLU: DW #0000 -.DRIVE: DB #FF -.FAT_FRM: -.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT -.FAT2_XX: DW #0000 -.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR -.DIR_FRL: -.DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR -.F_P_S: DB #00 ; число файловых записей в секторе -.DIR_S_S: DB #00 ; DIR_SEC_SIZE -.DAT_FRM: DW #0000 ; MSD_DAT_SEC -.CLU_LEN: -.B_P_C: DW #0000 ; CLUSTER_LEN -.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) -.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? -.ENDCLUS: DW #FFFF -; - -;!TODO к буферам! -CurrentPath: DB 'X' - DB ':' -CurrentDirectory: DB '\' -.DEPTH: EQU DIRECTORY_PATH_LENGTH - BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце - - IF SAVE_PATH_CODE -WorkDirectory: DB '\' -.DEPTH: EQU DIRECTORY_PATH_LENGTH - BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце - ELSE -WorkDirectory EQU CurrentDirectory -.DEPTH EQU CurrentDirectory.DEPTH - ENDIF - -;R12 -;/////////////////////////////////////////////////////////////////////// -; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. -; -; вход: нет -; выход: A - номер последнего лог. диска в системе -;/////////////////////////////////////////////////////////////////////// -; INCLUDE 'ScanDRV.asm' -;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC -SCANDRV: -; 1. запоминаем состояние прерываний -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,R - DI - PUSH AF -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 2. узнаём букву бут-диска -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - CALL GETBOOT -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 3. вызываем рескан -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - ; A = Boot disk - LD B,A - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 4. выход -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - POP AF - RET PO - EI - RET -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -;/////////////////////////////////////////////////////////////////////// -; - -;GOD EQU 1999-1980*512 - -;FHAND DB " " -; DB " " -; DB #20 -; DW 0,0,0,0,0 -; DW #0000 -; DW 5*32+19+GOD -;SAVEC DW #0000 -;SIZEC DW #0000,#0000 -;============================================= -;//MODULE: DOS_X -;[END] - -;R11 - ; IF SAVE_PATH_MACRO - ; SAVE_CUR_PATH - ; PUSH IX - ; PUSH IY - ; PUSH HL - ; PUSH DE - ; PUSH BC - ; PUSH AF - ; - ; SET_PAGE_X ENVPAGE - ; PUSH AF - ; - ; CALL CURRDSK - ; ADD A,"A" - ; LD HL,TMP_CURDIR_AUTO - ; LD (HL),A - ; INC HL - ; LD A,":" - ; LD (HL),A - ; INC HL - ; CALL CURRDIR_FN - ; - ; POP AF - ; OUT (SLOT3),A - ; - ; POP AF - ; POP BC - ; POP DE - ; POP HL - ; POP IY - ; POP IX - ; RET - ; - ; BACK_CUR_PATH: - ; RET NC - ; .force: PUSH IY - ; PUSH IX - ; PUSH HL - ; PUSH DE - ; PUSH BC - ; PUSH AF - ; - ; SET_PAGE_X ENVPAGE - ; PUSH AF - ; - ; LD HL,TMP_CURDIR_AUTO - ; CALL CHDIR - ; - ; POP AF - ; OUT (SLOT3),A - ; - ; POP AF - ; POP BC - ; POP DE - ; POP HL - ; POP IX - ; POP IY - ; RET - ; ENDIF -; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 7d5b25e..4db215d 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -377,7 +377,7 @@ GO_ZERO EQU #0000 ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX - DB low F_START, low CHNDISK_FN, low CURRDSK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 + DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 @@ -404,7 +404,7 @@ ADRST10: ;DS 512 ;,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: - DB high F_START, high CHNDISK_FN,high CURRDSK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK + DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK DB high CREATE, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS @@ -437,18 +437,47 @@ ADRST10: ;DS 512 ;,0 ;!TODO заменить по-максимому всё в KEYINTER.ASM на вызовы биоса INCLUDE "KEYINTER.ASM" ;!FIXIT из-за буфера с выравниванием align 256 в начале приходится ADRST10 добивать нулями в конце INCLUDE "VIDEO.ASM" - INCLUDE "FAT_X.ASM" - INCLUDE "DOS_X.ASM" + INCLUDE "API.ASM" + INCLUDE "DOS_Proc.asm" + INCLUDE "FS/FAT/FAT.ASM" INCLUDE "DOS_FM.ASM" - INCLUDE "DOS5.ASM" + INCLUDE "EXECUTE.ASM" INCLUDE "ENVIRON.ASM" INCLUDE "INTMOUSE.ASM" -; + INCLUDE "Procedures.asm" + + +;!FIXIT к буферам +; Массив лог. номеров банок расширения DSS +BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE +HANDBUF: BLOCK HANDBUF.SIZE,0 +; + +MASKARE: BLOCK 8,0 ; имя файла + BLOCK 3,0 ; расш. + BLOCK 21,0 ; 11+21=32 +; DISPLAY "DOS-MAIN end address: ",/H,$-1 ; +;!TODO к буферам! +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +CurrentPath: DB 'X' + DB ':' +CurrentDirectory: DB '\' +.DEPTH: EQU DIRECTORY_PATH_LENGTH + BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + IF SAVE_PATH_CODE +WorkDirectory: DB '\' +.DEPTH: EQU DIRECTORY_PATH_LENGTH + BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + ELSE +WorkDirectory EQU CurrentDirectory +.DEPTH EQU CurrentDirectory.DEPTH + ENDIF +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index 410ed0f..4a3c1d3 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -50,7 +50,7 @@ INITENV: PUSH AF ; ;R02 - LD A,(BOOTDRV) + LD A,(BOOTDSK.NUM) ADD A,'A' LD (DEFAULT_ENV.boot_disk),A ; diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 4312538..be7d562 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -180,7 +180,7 @@ EX_PATH: EXX DEC B JP Z,GSWITCH ;7 ; выделить параметр ком-строки DEC B - JP Z,GETNAME ;8 ; преобр. имя 11 -> 8.3 формат + JP Z,GetName ;8 ; преобр. имя 11 -> 8.3 формат DEC B JP Z,MASK.custom ;9 ; преобр. имя 8.3 -> 11 формат EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION @@ -839,7 +839,7 @@ EXEC: LD (CMDLINE),HL EXEC_1: ;LD (CMDLINE),HL LD HL,(CMDLINE) LD A,FAT_ATTR.READ_ONLY - LD (OPEN.TMP),A + LD (OPEN_FN.TMP),A CALL GETWORD RET C ; LD HL,TMPNAME @@ -850,7 +850,7 @@ EXEC_1: ;LD (CMDLINE),HL LD A,DSS_Error.sys.FILE_NOT_FOUND RET C _mINCTASK ;R08 - CALL OPEN.FILE + CALL OPEN_FN.FILE JR C,.Error POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM @@ -999,7 +999,7 @@ TST_EXT: LD HL,EXE_EXT ; "EXE" ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY ERREXE: PUSH AF LD A,(EXE_FM) - CALL CLOSE + CALL CLOSE_FN _mDECTASK POP AF RET @@ -1166,7 +1166,7 @@ LEAVE: LD A,B ;[x] 25/10/23 close EXE FM POP AF ;CALL RES_FM - CALL CLOSE + CALL CLOSE_FN _mDECTASK ; POP AF @@ -1235,7 +1235,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),B INC HL ;!FIXIT тут восстанавливать правильный каталог - CALL CURRDSK + CALL CURDISK ADD A,'A' LD (HL),A INC HL diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm new file mode 100644 index 0000000..5863482 --- /dev/null +++ b/DSS/FS/FAT/FAT.asm @@ -0,0 +1,829 @@ +;[BEGIN] +;//MODULE: FAT +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;RX01 10-02-1999 DNS UPGRADE FAT CASH +;--------------------------------------------------------------- + +;----------------------------------------------------------------------; +; Поиск записи каталога в списке каталога +; +; вход: a=атрибут записи +; выход: de'=индекс записи в списке каталога +; (HANDBUF) = file's direcory record +; CF - каталог не найден +SEARCH: +.Dir: LD A,FAT_ATTR.DIRECTORY + CALL SEARCH.Custom + RET NC + CP DSS_Error.sys.PATH_NOT_FOUND + 1 + RET C + ; + SCF + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + RET + ; +.File: LD A,FAT_ATTR.NoDIRnoVolID +.Custom: EX AF,AF' ; A = 76ADLSHR + SET_PAGE_X DIRPAGE + ;PUSH AF + EX AF,AF' + ; + CPL + LD C,A + LD IX,DIRPAGE.buffer + ;!TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; +.loop: LD A,(IX+00) + OR A + JR Z,.error_file_not_found + CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены + JR Z,.next_record + LD A,(IX+11) + AND C + JR NZ,.next_record + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +.loop_compare: + LD A,(DE) + CP '?' + JR Z,.next_char + CP (HL) + JR NZ,.next_record +.next_char: + INC HL + INC DE + DJNZ .loop_compare + ;!TEST 9/11/23 ;[x] some optimize + ; LD D,XH + ; LD E,XL + LD D,XH + LD E,XL + EXX + LD D,XH + LD E,XL + EXX + ; + LD HL,HANDBUF + EX DE,HL + LD BC,HANDBUF.SIZE + LDIR + ;POP AF + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + AND A + RET +.next_record: + ;!TEST 9/11/23 ;[x] some optimize + ; EXX + ; INC DE + ; EXX + ; + LD DE,#0020 ;!HARDCODE + ADD IX,DE + JR NC,.loop +.error_too_many_files: + ;POP AF + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET + ; +.error_file_not_found: + ;POP AF + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.FILE_NOT_FOUND + SCF + RET +;----------------------------------------------------------------------; + +; +;!TODO ? +;GHANDLE: +; PUSH DE +; PUSH HL +; PUSH IX +; CALL TESTDSK +; JP C,G_HAND1 +; CALL LOADDIR +; POP DE +; LD HL,DIR +; LD BC,#0020 +;G_HAND2: +; LD A,D +; OR E +; JP Z,G_HAND3 +; ADD HL,BC +; DEC DE +; JP G_HAND2 +;G_HAND3: +; EXX +; POP DE +; EXX +;G_HAND4: +; EX DE,HL +; LD A,DIRPAGE +; CALL BANK +; EX DE,HL +; LD DE,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; OUT (SLOT3),A +; LD HL,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; POP BC +; DEC BC +; LD A,B +; OR C +; RET Z +; PUSH BC +; JP G_HAND4 +;G_HAND1 POP IX +; POP HL +; POP DE +; RET +;HANDTA BLOCK 32,0 +; + +;----------------------------------------------------------------------; +; FIND "MASKAREA" IN DIRECTORY +FINDDIR: + SET_PAGE_X DIRPAGE + ; + PUSH AF + LD IX,DIRPAGE.buffer +.big_loop: + LD A,(IX+00) + OR A + JR Z,.error + CP #E5 + JR Z,.next_step + LD A,(IX+11) ;!HARDCODE + AND #10 ;!HARDCODE + JR Z,.next_step + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 ;!HARDCODE +.loop: LD A,(DE) + CP "?" + JR Z,.compared + CP (HL) + JR NZ,.next_step +.compared: + INC HL + INC DE + DJNZ .loop + ; + LD A,(IX+0) + CP "." + JP NZ,.ADDSPEC + LD A,(IX+1) ;!HARDCODE + CP "." + JP NZ,.IT_DIR + LD HL,WorkDirectory + LD D,H + LD E,L + INC HL + LD BC,WorkDirectory.DEPTH + XOR A + CPIR + JP PO,.error ;[x] 20/11/23 проверка на выход за границы + DEC HL ;R009 + DEC HL + LD BC,WorkDirectory.DEPTH + LD A,'\' + CPDR + INC HL + EX DE,HL + ; CF = 0 + SBC HL,DE + EX DE,HL + JR NZ,.MM3 + INC HL +.MM3: LD (HL),0 + JP .IT_DIR + ; +.next_step: + LD BC,#0020 ;!HARDCODE + ADD IX,BC + JR NC,.big_loop + ; +.error: POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.PATH_NOT_FOUND + SCF + RET +.ADDSPEC: + LD HL,WorkDirectory+1 + LD BC,WorkDirectory.DEPTH-1 + CALL .CHECK_SLASH + JR C,.error + ;R011 + LD A,B + AND A + JR NZ,.nxt + LD A,C + CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение + JR C,.error +.nxt: ; + LD E,XL + LD D,XH + ; [x] оптимизация по размеру + EX DE,HL + CALL GetName + EX DE,HL + ; + +; LD BC,256*8 + ' ' ;!HARDCODE +; .MM1: LD A,(DE) +; INC DE +; CP C +; JR Z,.MM2 +; LD (HL),A +; INC HL +; .MM2 DJNZ .MM1 ;x42-40 50-55 +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),"." +; INC HL +; LD (HL),A +; INC HL +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),A +; INC HL +; LD A,(DE) +; CP C +; JR Z,.MM3 +; LD (HL),A +; .MM2_5: INC HL +; .MM3: LD (HL),0 +; ; JP IT_DIR + ; +.IT_DIR: + LD E,(IX+_sFM.ST_CLUSTER) + LD D,(IX+_sFM.ST_CLUSTER+1) + POP AF + OUT (SLOT3),A + AND A + RET +.CHECK_SLASH: + XOR A + CPIR + ;[x] 20/11/23 проверка на выход за границы + SCF + RET PO + ; + DEC HL + DEC HL + LD A,'\' ; #5C + CP (HL) + INC HL + RET Z + LD (HL),A + INC HL + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +; Прочитать список каталога +LOADDIR: + XOR A + LD H,A + LD L,A + LD IX,0 + LD B,A ; от начала файла + CALL MOVE_FP + + SET_PAGE_X DIRPAGE + + PUSH AF + ;!TEST no ldir + ; очистить кеш каталога + ; LD HL,#C000 + ; LD DE,#C001 + ; LD BC,#3FFF + ; LD (HL),L + ; LDIR + ; + ; + LD A,(FatBuffer.DRIVE) ; номер диска + LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор + LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера + LD E,(IY+_sFM.ST_CLUSTER+1) + LD A,D + OR E + JP Z,.LROTDIR ; root ?? + LD HL,DIRPAGE.buffer ; куда + LD DE,#4000 ; сколько + XOR A ; дескриптор + CALL READ ; чтение из файла + ;!FIXIT проверка на ошибку + LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов + POP AF + OUT (SLOT3),A + AND A + RET +.LROTDIR: + LD HL,(FatBuffer.DIR_FRH) ; ст. разряд + LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора + LD A,(FatBuffer.DIR_S_S) + ;!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,DIRPAGE.buffer ; буфер + LD C,Dss.DRV.Read ; чтение секторов + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +; скопировать запись в список диска (каталога) +; и сбросить кеш каталога на диск +WRT_HND: SET_PAGE_X DIRPAGE + EX AF,AF' + ; + LD IX,DIRPAGE.buffer + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; +.loop: LD A,(IX+00) + OR A + JR Z,.WRT_HN2 + CP #E5 + JR Z,.WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,.loop + ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF + RET +.WRT_HN2: + LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR + EX AF,AF' + OUT (SLOT3),A + LD HL,DIRPAGE.buffer + LD BC,(SAVEDIR.DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + JR NC,SAVEDIR + LD HL,(SAVEDIR.DIRSIZE) + LD BC,(FatBuffer.B_P_C) + ADD HL,BC + LD (SAVEDIR.DIRSIZE),HL + AND A + JP SAVEDIR +;----------------------------------------------------------------------; + +;!TODO FAT procedures +;----------------------------------------------------------------------; +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +SAVEDIR: + XOR A + LD HL,0 + LD IX,0 + LD B,0 + CALL MOVE_FP + ; + SET_PAGE_X DIRPAGE + PUSH AF + ; + LD A,(FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + LD D,(IY+_sFM.ST_CLUSTER) + LD E,(IY+_sFM.ST_CLUSTER+1) + LD A,D + OR E + JP Z,.SROTDIR + LD HL,DIRPAGE.buffer +; размер списка каталога size_cash_directory +.DIRSIZE+1: + LD DE,0 + XOR A + CALL WRITE + POP AF + OUT (SLOT3),A + AND A + RET +.SROTDIR: + LD HL,(FatBuffer.DIR_FRH) + LD IX,(FatBuffer.DIR_FRL) + LD A,(FatBuffer.DIR_S_S) + LD B,32 ;!HARDCODE + SUB B + JR NC,.RTD1S + ADD A,B + LD B,A +.RTD1S: LD A,(FatBuffer.DRIVE) + LD DE,DIRPAGE.buffer + LD C,Dss.DRV.Write + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ; !FIXIT чёт не используется + IF COMPILE_UNUSED_CODE +TESTDSK: + LD A,(FatBuffer.DRIVE) + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + OR A + RET Z + ENDIF +RD_BPB: LD C,SLOT3 + IN B,(C) + PUSH BC + + IN A,(SLOT0) + OUT (SLOT3),A + ;R08 + ;LD DE,BOOT+#C000 + LD DE,CORE_BUFFERS.SECBUF+#C000 + ;R08 + LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE + + LD C,Dss.DRV.GetBPB + RST ToDSS.DRV + POP BC + OUT (C),B + JP C,DOS_X_Error.Not_ready + + //PUSH IY ; пока без индексного, но может пригодиться + + LD DE,#AA55 ; сигнатура ;R05 + LD HL,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07 + ;R05 + AND A + SBC HL,DE + JP NZ,DOS_X_Error.UnknownBPB + ;R08 + LD HL,CORE_BUFFERS.SECBUF + LD DE,CORE_BUFFERS.BootSector + LD BC,_sBOOT_SEC ; size + LDIR + ; + + //LD IY,BootSector ; пока без индексного, но может пригодиться + //LD A,(IY+_sBOOT_SEC.ID_FORM) + LD A,(CORE_BUFFERS.BootSector.ID_FORM) + + CP #F0 + JP C,DOS_X_Error.UnknownBPB + + ;!TEST + ;LD HL,0 ; calc. first sector FAT + ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + ;LD D,(IY+_sBOOT_SEC.RESERVE+1) + ;ADD HL,DE + + //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + //LD H,(IY+_sBOOT_SEC.RESERVE+1) + LD HL,(CORE_BUFFERS.BootSector.RESERVE) + ; + + ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec + ; LD D,(IY+_sBOOT_SEC.HIDDEN+1) + ; ADD HL,DE + + ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT + LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 + LD (FatBuffer.FAT2_XX),HL + + //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT + //LD D,(IY+_sBOOT_SEC.S_P_F+1) + LD DE,(CORE_BUFFERS.BootSector.S_P_F) + + + LD A,(CORE_BUFFERS.BootSector.FAT_NUM) ; amount FATs + CP 1 + JR Z,.loop1 + DEC A + ADD HL,DE + LD (FatBuffer.FAT2_XX),HL +;C_DATA1 +.loop1: ADD HL,DE + DEC A + JR NZ,.loop1 + LD (FatBuffer.DIR_FRM),HL ; first sector DIR + ; CF = ? мало ли + AND A + ; CF = 0 + + //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors + //LD B,(IY+_sBOOT_SEC.B_P_S+1) + LD BC,(CORE_BUFFERS.BootSector.B_P_S) + ; RL C + ; RL B + ; RL C + ; RL B + ; RL C + ; RL B + ; LD C,B + ; LD B,0 ; BC - File handels in sectors + ; LD A,C + ;;;; + LD A,B + RL C + RLA + RL C + RLA + RL C + RLA + LD C,A + LD B,0 ; BC - File handels in sectors + ;;;; + LD (FatBuffer.F_P_S),A + + //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel + //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) + + EX DE,HL + DEC HL + XOR A +;NEXTAD2 +.loop2: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,BC + JR NC,.loop2 + + EX DE,HL + LD C,A ; A - sectors in DIR + LD B,0 + LD (FatBuffer.DIR_S_S),A + ADD HL,BC ; Start DATA area + LD (FatBuffer.DAT_FRM),HL +;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer +//////////////////////////////////////////////////////////////////////// + IF COMPILE_UNUSED_CODE + ;LD HL,0 + + ;LD H,B ; тут в B ноль должен быть + ;LD L,B + ;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector + ;LD B,(IY+_sBOOT_SEC.B_P_S+1) + + //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector + //LD H,(IY+_sBOOT_SEC.B_P_S+1) + LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector + + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize +;NEXTAD3 +; .loop3: ADD HL,BC ; calc. cluster size +; DEC A +; JR NZ,.loop3 + ;!TODO проверить правильно ли считает + XOR 1 ; calc. cluster size + JR Z,.loop3.end + RRA +.loop3: ADD HL,HL + RRA + JP NC,.loop3 +.loop3.end: + ; + + LD (FatBuffer.CLU_LEN),HL + EX DE,HL + LD HL,#3FFF ;!TODO FATcacheSize + XOR A +;NEXTAD4 ;!FIXIT оптимизировать когда понадобится +.loop4: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,DE + JR NC,.loop4 + LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) + ENDIF +//////////////////////////////////////////////////////////////////////// + + LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага + LD DE,FatBuffer.MSG + LD B,3 +;R_BPBL1 +.loop5: LD A,(DE) + CP (HL) + JP NZ,.IBM_DOS + INC HL + INC DE + DJNZ .loop5 +;FID +.loop6: LD A,(HL) + INC HL + CP ' ' + JR Z,.loop6 + + CP '1' + JP NZ,DOS_X_Error.UnknownBPB + LD A,(HL) + CP '6' ; FAT16 + LD HL,#FFFF + JR Z,.BPB_FAT + CP '2' ; FAT12 + JP NZ,DOS_X_Error.UnknownBPB + LD HL,#0FFF +.BPB_FAT: + LD (FatBuffer.FAT_TYP),A + LD (FatBuffer.ENDCLUS),HL + +;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer +//////////////////////////////////////////////////////////////////////// + IF COMPILE_UNUSED_CODE + + LD HL,0 + + //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track + //LD B,(IY+_sBOOT_SEC.S_P_T+1) + LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track + + LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага +.BPB_L1: ; calc. sector per cylinder + ADD HL,BC + DEC A + JR NZ,.BPB_L1 + LD (FatBuffer.S_X_H),HL + ENDIF +//////////////////////////////////////////////////////////////////////// + + LD DE,(FatBuffer.DAT_FRM) +; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec +; LD D,(IY+_sBOOT_SEC.HIDDEN+1) +; AND A +; SBC HL,DE +; EX DE,HL + + //LD L,(IY+_sBOOT_SEC.S_P_D) + //LD H,(IY+_sBOOT_SEC.S_P_D+1) + LD HL,(CORE_BUFFERS.BootSector.S_P_D) + + LD A,H + OR L + JP NZ,.HDDSMAL + ; + //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) + //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) + LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS) + + //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) + //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) + LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2) + + AND A + SBC HL,DE + JP NC,.HDDBIG + DEC BC + JP .HDDBIG +.HDDSMAL: + ;AND A ;тут CF полюбас сброшен должен быть + SBC HL,DE + LD BC,0 +.HDDBIG: LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага + SCF +.S4C01: RRA + JR C,.S4C02 + RR B + RR C + RR H + RR L + JP .S4C01 +.S4C02: INC HL + LD (FAT_Max_Cluster),HL + + //POP IY + +; LD DE,FAT +; LD HL,0 +; LD IX,(FAT_FRM) +; LD B,3 +; LD A,(DRIVE) +; LD C,Dss.DRV.Read +; RST ToDSS.DRV +; JP C,RDERR1 + LD HL,0 + LD (FatCache),HL + + SET_PAGE_X FATPAGE + + PUSH AF + XOR A + CALL READ_FAT + POP AF + OUT (SLOT3),A + CALL R_CLUST + XOR A + RET + +.IBM_DOS: + LD A,(CORE_BUFFERS.BootSector.ID_FORM) + CP #F0 + JR C,DOS_X_Error.UnknownBPB +;????? надо ли изменить? +// OR 2 +// CP #FA ; ID ram-диска + CP #F8 ; а если не F8? +;????? + LD A,'6' + LD HL,#FFFF + JP Z,.BPB_FAT + + LD A,'2' + LD HL,#0FFF + JP .BPB_FAT + ; +DOS_X_Error: +.UnknownBPB: + //POP IY + LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET +.Not_ready: + LD A,DSS_Error.sys.NOT_READY + ; CF = 1 + RET +; +; +;!TODO к буферам! +FatBuffer: +.MSG: DB 'FAT' +.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +.BLOCK: DB #00 +.DIR_CLU: DW #0000 +.DRIVE: DB #FF +.FAT_FRM: +.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT +.FAT2_XX: DW #0000 +.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR +.DIR_FRL: +.DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR +.F_P_S: DB #00 ; число файловых записей в секторе +.DIR_S_S: DB #00 ; DIR_SEC_SIZE +.DAT_FRM: DW #0000 ; MSD_DAT_SEC +.CLU_LEN: +.B_P_C: DW #0000 ; CLUSTER_LEN +.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? +.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) +.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? +.ENDCLUS: DW #FFFF +; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +; + INCLUDE "FAT12_16.ASM" +; \ No newline at end of file diff --git a/DSS/FAT_X.ASM b/DSS/FS/FAT/FAT12_16.asm similarity index 86% rename from DSS/FAT_X.ASM rename to DSS/FS/FAT/FAT12_16.asm index 5c7e355..31cc955 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FS/FAT/FAT12_16.asm @@ -1,531 +1,538 @@ - -;[BEGIN] -;//MODULE: FAT_X -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R01 10-02-1999 DNS UPGRADE FAT CASH -;--------------------------------------------------------------- - -; Установить начальный кластер для чтения -R_CLUST LD HL,#0001 - LD (G_CLUST.num),HL - RET - -; найти первый свободный кластер -G_CLUST: -.num+1: LD HL,#0001 -.loop: INC HL ; номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера - CP DSS_Error.sys.DISK_FULL - SCF - RET Z ; ошибка ? - LD A,D - OR E - JR NZ,.loop - LD (G_CLUST.num),HL - XOR A - RET - -; HL - CLUSTER -INC_FAT PUSH HL - CALL G_CLUST - POP DE - RET C - PUSH HL - PUSH HL - EX DE,HL ; hl=номер кластера -.loop: CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера - EX DE,HL - JR NC,.loop ; не конец цепочки - EX DE,HL - POP DE ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - POP HL - LD DE,(FatBuffer.ENDCLUS) ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск - AND A - RET - -;R01 - -;----------------------------------------------------------- -; Прочитать из кеша FAT-а номер след. кластера -; вход: hl = номер кластера -; выход: hl = номер кластера -; de = номер след. кластера -; CF - конец цепочки -;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb -;----------------------------------------------------------- -;!FIXIT отдаёт разный CF при удачном завершении в зависимости от FAT16/FAT12 -R_F_FAT: - EX DE,HL - LD HL,(FAT_Max_Cluster) - AND A - SBC HL,DE - EX DE,HL - LD A,DSS_Error.sys.DISK_FULL - RET C - - SET_PAGE_X FATPAGE - - PUSH HL - PUSH AF - LD A,(FatBuffer.FAT_TYP) - CP "2" ; fat12 - JR Z,R_F_F12 - ; fat16, просто читать след. номер -R_F_F16: - LD A,H - LD B,H - ;AND #0F - AND FAT_CACHE.Mask - LD H,A - LD A,B - ; 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) - 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-а - ADD HL,DE ; на ячейку FAT - LD E,(HL) ; прочитать номер кластера - INC HL - LD D,(HL) - POP AF - OUT (SLOT3),A - LD HL,#FFEF ;!HARDCODE - XOR A ; DssErr.sys.NO_ERROR - SBC HL,DE ; проверка на служ. кластеры - POP HL - 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,RE_FAT ; прочитать в кеш 16 секторов FAT-а - ;ENDIF - ; - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT - POP AF ; восст. флаг - LD E,(HL) - INC HL - LD D,(HL) - JR C,R_F_F01 - LD A,D - AND #0F - LD D,A - JP R_F_F02 - -R_F_F01: - LD A,E - AND #F0 - RR D ; вправо на 4 битa - RRA - RR D - RRA - RR D - RRA - RR D - RRA - LD E,A -R_F_F02: - POP AF - OUT (SLOT3),A - LD HL,#0FEF - XOR A ; обнуляем CF и устанавливаем код ошибки = нулю - SBC HL,DE ; проверка на служ. кластеры - POP HL - RET - -;----------------------------------------------------------- -; Записать в кеш FAT-а номер кластера -; вход: de = номер кластера -; hl = ? номер первого кластера -; выход: hl = ? номер след. кластера -; de = номер кластера -; in: HL - CLUSTER -; out: DE - (CLUSTER) -;----------------------------------------------------------- -W_T_FAT PUSH DE - EX DE,HL - LD HL,(FAT_Max_Cluster) - AND A - SBC HL,DE - EX DE,HL - POP DE - LD A,DSS_Error.sys.DISK_FULL - RET C - EXX - SET_PAGE_X FATPAGE - EXX - PUSH HL - PUSH AF - LD A,1 - LD (FatCache.Update),A - LD A,(FatBuffer.FAT_TYP) - CP "2" ; fat12 - JR Z,W_T_F12 -W_T_F16: - PUSH DE - LD A,H - LD B,H - ;AND #0F - AND FAT_CACHE.Mask - LD H,A - LD A,B - ; 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 - ADD HL,DE ; на ячейку FAT - POP DE - LD (HL),E ; сохр. в кеше FAT-а - INC HL ; номер кластера - LD (HL),D - POP AF ; восст. порт - POP HL - OUT (SLOT3),A - XOR A - RET - ; - ; fat12 -W_T_F12: - PUSH 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 ; сдвиг вправо через 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,RE_FAT ; прочитать в кеш 16 секторов FAT-а - ;ENDIF - ; - LD DE,FATPAGE.cache - ADD HL,DE - POP AF - POP DE - JP C,W_T_F01 ; номер нечётный - LD (HL),E - INC HL - LD A,(HL) - AND #F0 - OR D - LD (HL),A - POP AF - POP HL - OUT (SLOT3),A - AND A - RET - - -W_T_F01:; влево на 4 битa - SLA E - LD A,E - RL D - RLA - RL D - RLA - RL D - RLA - RL D - LD E,A - ; - LD A,(HL) - AND #0F - OR E - LD (HL),A ; сохр. в кеше FAT-а - INC HL ; номер кластера - LD (HL),D - POP AF - POP HL - OUT (SLOT3),A - AND A - RET - -;R01 -; Прочитать в кеш 16 секторов FAT-а -; A - NEW FAT BLOCK -RE_FAT: PUSH HL - PUSH AF - LD A,(FatCache.Update) - OR A - CALL NZ,WR_FAT.Start - POP AF - LD L,A - LD H,0 - LD (FatCache),HL - ;FAT BLOCK * 16 = SECTOR OF FAT - DUP FAT_CACHE.Degree - ADD HL,HL ;x2 - EDUP - LD DE,(FatBuffer.FAT_FRM) - ADD HL,DE - EX DE,HL - ; - 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,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) - RST ToDSS.DRV - POP HL - RET - -; Подключить банку кеша FAT и записать его на диск -WR_FAT: SET_PAGE_X FATPAGE - PUSH AF - CALL .Start ;!TODO нет контроля ошибок - POP AF - OUT (SLOT3),A - RET - ; Запись кеша (всего?) FAT-а на диск -.Start: LD HL,(FatCache) - LD H,0 - ;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,FAT_CACHE.Sectors - ADD HL,DE ;+ SIZE CASH (16 SECTORS) - 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,FAT_CACHE.Sectors - ; CF = 0 - SBC HL,DE - JP C,.ERR - LD A,L -.WALLFAT: - LD H,B - LD L,C - LD DE,(FatBuffer.FAT_FRM) - ADD HL,DE - EX DE,HL - ; - 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 ; запись секторов - LD A,(FatBuffer.DRIVE) ; номер диска - PUSH BC - RST ToDSS.DRV - POP BC ; b=число секторов - POP HL - LD DE,(FatBuffer.FAT2_XX) - ADD HL,DE - EX DE,HL - ; - PUSH DE - POP IX - ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора - ; - LD DE,FATPAGE.cache - LD HL,0 - LD A,(FatBuffer.DRIVE) - LD C,Dss.DRV.Write - RST ToDSS.DRV - AND A ;!TODO нет контроля ошибок - ; -.ERR: LD A,0 - LD (FatCache.Update),A - RET NC - POP HL - ; CF = 1 - RET - - -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 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +; FAT 12-16 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +;[BEGIN] +;//MODULE: FAT_X +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;RX01 10-02-1999 DNS UPGRADE FAT CASH +;--------------------------------------------------------------- + +; Установить начальный кластер для чтения +R_CLUST LD HL,#0001 + LD (G_CLUST.num),HL + RET + +; найти первый свободный кластер +G_CLUST: +.num+1: LD HL,#0001 +.loop: INC HL ; номер кластера + CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + CP DSS_Error.sys.DISK_FULL + SCF + RET Z ; ошибка ? + LD A,D + OR E + JR NZ,.loop + LD (G_CLUST.num),HL + XOR A + RET + +; HL - CLUSTER +INC_FAT PUSH HL + CALL G_CLUST + POP DE + RET C + PUSH HL + PUSH HL + EX DE,HL ; hl=номер кластера +.loop: CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + EX DE,HL + JR NC,.loop ; не конец цепочки + EX DE,HL + POP DE ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера + POP HL + LD DE,(FatBuffer.ENDCLUS) ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера + CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + AND A + RET + +;RX01 + +;----------------------------------------------------------- +; Прочитать из кеша FAT-а номер след. кластера +; вход: hl = номер кластера +; выход: hl = номер кластера +; de = номер след. кластера +; CF - конец цепочки +;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb +;----------------------------------------------------------- +;!FIXIT отдаёт разный CF при удачном завершении в зависимости от FAT16/FAT12 +R_F_FAT: + EX DE,HL + LD HL,(FAT_Max_Cluster) + AND A + SBC HL,DE + EX DE,HL + LD A,DSS_Error.sys.DISK_FULL + RET C + + SET_PAGE_X FATPAGE + + PUSH HL + PUSH AF + LD A,(FatBuffer.FAT_TYP) + CP "2" ; fat12 + 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 E,(HL) ; прочитать номер кластера + INC HL + LD D,(HL) + POP AF + OUT (SLOT3),A + LD HL,#FFEF ;!HARDCODE + XOR A ; DssErr.sys.NO_ERROR + SBC HL,DE ; проверка на служ. кластеры + POP HL + 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 ; восст. флаг + LD E,(HL) + INC HL + LD D,(HL) + JR C,R_F_F01 + LD A,D + AND #0F + LD D,A + JP R_F_F02 + ; +R_F_F01: + LD A,E + AND #F0 + RR D ; вправо на 4 битa + RRA + RR D + RRA + RR D + RRA + RR D + RRA + LD E,A +R_F_F02: + POP AF + OUT (SLOT3),A + LD HL,#0FEF + XOR A ; обнуляем CF и устанавливаем код ошибки = нулю + SBC HL,DE ; проверка на служ. кластеры + POP HL + RET + +;----------------------------------------------------------- +; Записать в кеш FAT-а номер кластера +; вход: de = номер кластера +; hl = ? номер первого кластера +; выход: hl = ? номер след. кластера +; de = номер кластера +; in: HL - CLUSTER +; out: DE - (CLUSTER) +;----------------------------------------------------------- +W_T_FAT: + PUSH DE + EX DE,HL + LD HL,(FAT_Max_Cluster) + AND A + SBC HL,DE + EX DE,HL + POP DE + LD A,DSS_Error.sys.DISK_FULL + RET C + EXX + SET_PAGE_X FATPAGE + EXX + PUSH HL + PUSH AF + LD A,1 + LD (FatCache.Update),A + LD A,(FatBuffer.FAT_TYP) + CP "2" ; fat12 + 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 + POP DE + LD (HL),E ; сохр. в кеше FAT-а + INC HL ; номер кластера + LD (HL),D + POP AF ; восст. порт + POP HL + OUT (SLOT3),A + XOR A + RET + ; + ; fat12 +W_T_F12: ;!FIXIT переделать на переменные FAT_CACHE + PUSH 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 ; сдвиг вправо через 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 + POP DE + JP C,W_T_F01 ; номер нечётный + LD (HL),E + INC HL + LD A,(HL) + AND #F0 + OR D + LD (HL),A + POP AF + POP HL + OUT (SLOT3),A + AND A + RET + ; +W_T_F01:; влево на 4 битa + SLA E + LD A,E + RL D + RLA + RL D + RLA + RL D + RLA + RL D + LD E,A + ; + LD A,(HL) + AND #0F + OR E + LD (HL),A ; сохр. в кеше FAT-а + INC HL ; номер кластера + LD (HL),D + POP AF + POP HL + OUT (SLOT3),A + AND A + RET + +;RX01 +;RE_FAT: +; Прочитать в кеш 16 секторов FAT-а +; A - NEW FAT BLOCK +READ_FAT: + PUSH HL + PUSH AF + LD A,(FatCache.Update) + OR A + CALL NZ,WR_FAT.Start + POP AF + LD L,A + LD H,0 + LD (FatCache),HL + ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT + DUP FAT_CACHE.Degree_16 + ADD HL,HL ;x2 + EDUP + LD DE,(FatBuffer.FAT_FRM) + ADD HL,DE + EX DE,HL + ; + LD XH,D + LD XL,E + ;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,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE + RST ToDSS.DRV + POP HL + RET + +; Подключить банку кеша FAT и записать его на диск +WR_FAT: SET_PAGE_X FATPAGE + PUSH AF + CALL .Start ;!TODO нет контроля ошибок + POP AF + OUT (SLOT3),A + RET + ; Запись кеша (всего?) FAT-а на диск +.Start: LD HL,(FatCache) + LD H,0 + ;FAT BLOCK * 16 = SECTOR OF FAT + DUP FAT_CACHE.Degree_16 + ADD HL,HL ;x2 + EDUP + ; HL - номер лог. сектора + PUSH HL + LD B,H + LD C,L ;BC - BLOCK OF FAT + LD DE,FAT_CACHE.Sectors + ADD HL,DE ;+ SIZE CASH (16 SECTORS) + 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,FAT_CACHE.Sectors + ; CF = 0 + SBC HL,DE + JP C,.ERR + LD A,L +.WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? + LD H,B + LD L,C + LD DE,(FatBuffer.FAT_FRM) + ADD HL,DE + EX DE,HL + ; + LD XH,D + LD XL,E + ;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 ; запись секторов + LD A,(FatBuffer.DRIVE) ; номер диска + PUSH BC + RST ToDSS.DRV + POP BC ; b=число секторов + POP HL + LD DE,(FatBuffer.FAT2_XX) + ADD HL,DE + EX DE,HL + ; + LD XH,D + LD XL,E + ;LD IX,0 + ;ADD IX,DE ; номер лог. сектора + ; + LD DE,FATPAGE.cache + LD HL,0 + LD A,(FatBuffer.DRIVE) + LD C,Dss.DRV.Write + RST ToDSS.DRV + AND A ;!TODO нет контроля ошибок + ; +.ERR: LD A,0 + LD (FatCache.Update),A + RET NC + POP HL + ; CF = 1 + RET + + + +FatCache: WORD #0000 +.Block EQU FatCache +.Update EQU FatCache+1 +FAT_Max_Cluster: WORD #0FF0 ; макс. число кластеров FAT12 (без служ.) + +;//MODULE: FAT_X +;[END] + + +;RX01 + ;; 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,READ_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/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index ec9e206..b42a3cc 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -270,15 +270,15 @@ DRVCLC: ; INC A ;---------------------------------------------------------------------[^] ; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -; ;+01 LONG SECTOR OFFSET -; ;+05 LONG SIZE IN SECTORS +; ;+01 DWORD SECTOR OFFSET +; ;+05 DWORD SIZE IN SECTORS ; ;+09 FREE ; ;+15 ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV - + ;!TODO заменить PUSH на EXX? SELHDD: PUSH DE PUSH BC PUSH HL @@ -420,9 +420,8 @@ RESE_H: XOR A STAT_H: XOR A RET -CHEK_H: - LD A,#FF - ;XOR A +CHEK_H: ;LD A,#FF + XOR A ;AND A RET diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm new file mode 100644 index 0000000..dc14eb1 --- /dev/null +++ b/DSS/Procedures.asm @@ -0,0 +1,191 @@ +;!TODO Procedures +;----------------------------------------------------------------------; +; Закодировать время/дату +; вход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; выход: de - время +; bc - месяц/день +; ix - год +; +;INPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) +MK_TIME: + LD A,L + RLCA + RLCA + SLA A + RL H + SLA A + RL H + SLA A + RL H + SRL B + OR B + LD L,A + + LD BC,#F844 ;(-1980) + ADD IX,BC + LD A,E + RLCA + RLCA + RLCA + RLCA + AND #F0 + LD B,XL + SLA A + RL B + OR D + LD C,A + EX DE,HL + AND A + RET +;----------------------------------------------------------------------; + +;!TODO Procedures +;----------------------------------------------------------------------; +; Раскодировать время/дату +; вход: de - время +; bc - месяц/день +; ix - год +; выход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; +;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) +;OUTPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +RMKTIME: + EX DE,HL + LD A,C + AND #1F + LD D,A + SRL B + RR C + LD A,C + RRCA + RRCA + RRCA + RRCA + AND #0F + LD E,A + LD C,B + LD B,0 + LD IX,1980 + ADD IX,BC + LD A,L + AND #1F + ADD A,A + LD B,A + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL L + SRL L + AND A + RET +;----------------------------------------------------------------------; + + + +;----------------------------------------------------------------------; +; a..z -> A..Z +UPPER: CP 'a' + RET C + CP 'z' + 1 + JR NC,.MDUPPER + SUB #20 +.NOUPPER: + RET +.MDUPPER: + CP 'а' ; русская буква а, код #A0 + JR C,.NOUPPER + CP 'п' ; русская буква п, код #B0 + JR NC,.BGUPPER + SUB #20 + RET +.BGUPPER: + CP 'р' ; русская буква р, код #E0 + JR C,.NOUPPER + CP 'Ё' ; русская буква Ё, код #F0 + JR NC,.HGUPPER + SUB #50 + RET +.HGUPPER: CP 'ё' ; русская буква ё, код #F1 + RET NZ + DEC A + RET +;----------------------------------------------------------------------; + + + +;!TODO hardware +;----------------------------------------------------------------------; +; Чтение регистров CMOS +; вход: d=номер регистра +RCMOS: LD C,BIOS.CMOS_RD + RST ToBIOS + ;JP BCD2HEX +; INPUT : A - BCD +; OUTPUT: A - HEX +BCD2HEX: + LD E,A + RRCA + RRCA + RRCA + RRCA + AND #0F + LD D,A + ADD A,A + ADD A,A + ADD A,D + ADD A,A + LD D,A + LD A,E + AND #0F + ADD A,D + RET +;----------------------------------------------------------------------; + +;!TODO hardware +;----------------------------------------------------------------------; +;!FIXIT переделать по доке на Даллас и заись в ячейки часов +; Запись регистров CMOS +; вход: d=номер регистра +WCMOS: CALL HEX2BCD + LD C,BIOS.CMOS_WR + JP ToBIOS + +; INPUT : A - HEX +; OUTPUT: A - BCD +HEX2BCD: + LD BC,#0AFF +.loop: INC C + SUB B + JR NC,.loop + ADD A,B + LD B,A + LD A,C + RLCA + RLCA + RLCA + RLCA + AND #F0 + OR B + RET +;----------------------------------------------------------------------; +; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index e8cbd7d..e9769c1 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -734 \ No newline at end of file +759 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 33862cb..c074761 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,23 +15,30 @@ define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128)) ; FAT_CACHE: -.Size EQU #2000 ; bytes -.Sector_Size EQU 512 +.Size EQU #2000 +.Sector_Size EQU #200 .Sectors EQU .Size / .Sector_Size -.bytes_record EQU 2 -.Degree EQU _shift ;.Sectors >>> (.Sectors/8) -.Mask EQU high (.Size/.bytes_record - 1) ;#07 ;.Sectors - 1 -.Mask2 EQU ((1<<(.bytes_record*8)) / (.Size/2))-1 +; for FAT16 +.bytes_record_16 EQU 2 +.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 +.bytes_record_12 EQU 2 +.Degree_12 EQU _shift +.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1) +.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1 + DISPLAY "bytes_record_16 = ",/H,.bytes_record_16 + DISPLAY "Degree_16 = ",/H,.Degree_16 + DISPLAY "Size_Mask_16 = ",/H,.Size_Mask_16 + DISPLAY "Part_Mask_16 = ",/H,.Part_Mask_16 + DISPLAY "bytes_record_12 = ",/H,.bytes_record_12 + DISPLAY "Degree_12 = ",/H,.Degree_12 + DISPLAY "Size_Mask_12 = ",/H,.Size_Mask_12 + DISPLAY "Part_Mask_12 = ",/H,.Part_Mask_12 ; 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 Date: Sat, 2 Dec 2023 04:12:32 +1000 Subject: [PATCH 065/219] =?UTF-8?q?-=20bug:=20FAT=20=D0=BD=D0=B5=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D0=B3=D0=B4=D0=B0=20=D0=BC=D0=BE=D0=B3=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C=D1=81=D1=8F=20=D0=BD?= =?UTF-8?q?=D0=B0=20HDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Attribute.asm | 8 +++++--- DSS/API/Create.asm | 6 +++++- DSS/DSS-MAIN.ASM | 4 ++-- DSS/FS/FAT/FAT12_16.asm | 24 ++++++++++++++++++++---- DSS/build.txt | 2 +- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 18b2568..9a9a6e4 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -2,8 +2,8 @@ ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; A - ATTRIB ; B - MODE -; B = 0 GET ATTRIB -; B = 1 SET ATTRIB +; B = #00 GET ATTRIB +; B = #01 SET ATTRIB ; OUTPUT: A - ATTRIB //////////////////////////////////////////////////////////////////////// ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 @@ -21,7 +21,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 DEC B JP Z,.READ DEC B - JP Z,.WRITE + JP Z,.WRITE_FN LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET @@ -41,6 +41,8 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 ; RET ; +.WRITE_FN: + AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID .WRITE: PUSH AF XOR A ;!TEST ;[x] 16/11/23 optimize get attribute diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index d69d921..d0aa86e 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -2,6 +2,8 @@ ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// +CREATE_FN: + AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID CREATE: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK @@ -14,6 +16,8 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT JR .DO ; +.NEW_FN: + AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID .NEW: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK @@ -78,5 +82,5 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 JP MASK ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -CREAT_N EQU CREATE.NEW +CREAT_N EQU CREATE.NEW_FN ; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 4db215d..4a92460 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -378,7 +378,7 @@ ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 + DB low CREATE_FN, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 @@ -405,7 +405,7 @@ ADRST10: ;DS 512 ;,0 ENDIF ;...............................................[HIGH ADDRESS]: DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high CREATE_FN, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 31cc955..8ecd30d 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -37,6 +37,7 @@ INC_FAT PUSH HL CALL G_CLUST POP DE RET C + ; PUSH HL PUSH HL EX DE,HL ; hl=номер кластера @@ -46,13 +47,17 @@ INC_FAT PUSH HL EX DE,HL POP DE ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера + ;!FIXIT <нет контроля ошибки> + ; + ; POP HL LD DE,(FatBuffer.ENDCLUS) ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера - CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? + CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ; AND A RET - ;RX01 ;----------------------------------------------------------- @@ -106,6 +111,7 @@ R_F_F16: LD D,(HL) POP AF OUT (SLOT3),A + ;!TODO #FFF7 - кластер с косякчными секторами LD HL,#FFEF ;!HARDCODE XOR A ; DssErr.sys.NO_ERROR SBC HL,DE ; проверка на служ. кластеры @@ -193,8 +199,10 @@ W_T_FAT: EXX PUSH HL PUSH AF - LD A,1 - LD (FatCache.Update),A + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + ;LD A,1 + ;LD (FatCache.Update),A + ; LD A,(FatBuffer.FAT_TYP) CP "2" ; fat12 JR Z,W_T_F12 @@ -226,6 +234,10 @@ W_T_F16: POP AF ; восст. порт POP HL OUT (SLOT3),A + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + LD A,1 + LD (FatCache.Update),A + ; XOR A RET ; @@ -274,6 +286,10 @@ W_T_F12: ;!FIXIT POP AF POP HL OUT (SLOT3),A + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + LD A,1 + LD (FatCache.Update),A + ; AND A RET ; diff --git a/DSS/build.txt b/DSS/build.txt index e9769c1..c189136 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -759 \ No newline at end of file +769 \ No newline at end of file From a7da7376ec343638f9da28acb51778c6350dda71 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 10 Dec 2023 08:18:56 +1000 Subject: [PATCH 066/219] -bug with path --- DSS/API/Delete.asm | 2 +- DSS/DOS_FM.ASM | 54 +++++--- DSS/DOS_Proc.asm | 2 +- DSS/EXECUTE.ASM | 13 +- DSS/FS/FAT/FAT.asm | 2 + DSS/FS/FAT/FAT12_16.asm | 272 ++++++++++++++++++++++++++-------------- DSS/INTMOUSE.ASM | 39 +++--- DSS/build.txt | 2 +- DSS/defines.inc | 4 +- Shared_Includes | 2 +- 10 files changed, 251 insertions(+), 141 deletions(-) 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 From 29aa9d384847ea951aa76eb38af26ab4cbf7e94f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 10 Dec 2023 08:33:21 +1000 Subject: [PATCH 067/219] -bug with path))) --- DSS/FS/FAT/FAT.asm | 2 +- DSS/build.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 3c95275..d757d91 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -310,7 +310,7 @@ FINDDIR: LD (HL),A INC HL LD (HL),0 - INC HL + ;INC HL RET ;----------------------------------------------------------------------; diff --git a/DSS/build.txt b/DSS/build.txt index 83249da..bc93f94 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -784 \ No newline at end of file +786 \ No newline at end of file From f37cbd10774f3d7b22be65485a39d751132564a3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 12 Dec 2023 04:24:00 +1000 Subject: [PATCH 068/219] =?UTF-8?q?SHELL:=20***=20=D0=B2=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20BAT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Console/CONSOLE.ASM | 2584 ------------- Console/Errors.TXT | 66 - Console/HISTORY.TXT | 4 - Console/build.txt | 1 - Console/version.inc | 22 - DOS/CURSOR.ASM | 63 - DOS/DOS.ASM | 7527 -------------------------------------- DOS/DOS.INC | 91 - DOS/KEYB.ASM | 1003 ----- DOS/MOUSE.ASM | 874 ----- DOS/README.RUS | 22 - DOS/pr.bat | 12 - DOS/readme.! | 1 - DSS/DOS_FM.ASM | 1 - DSS/EXECUTE.ASM | 48 +- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 121 +- SHELL/Commands/BREAK.ASM | 8 + SHELL/Commands/EXIT.ASM | 2 +- SHELL/Commands/REM.ASM | 3 +- SHELL/EXEC.ASM | 6 +- SHELL/SHELL.ASM | 23 +- SHELL/build.txt | 2 +- 23 files changed, 161 insertions(+), 12325 deletions(-) delete mode 100644 Console/CONSOLE.ASM delete mode 100644 Console/Errors.TXT delete mode 100644 Console/HISTORY.TXT delete mode 100644 Console/build.txt delete mode 100644 Console/version.inc delete mode 100755 DOS/CURSOR.ASM delete mode 100755 DOS/DOS.ASM delete mode 100755 DOS/DOS.INC delete mode 100755 DOS/KEYB.ASM delete mode 100755 DOS/MOUSE.ASM delete mode 100755 DOS/README.RUS delete mode 100755 DOS/pr.bat delete mode 100755 DOS/readme.! create mode 100644 SHELL/Commands/BREAK.ASM diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM deleted file mode 100644 index 6fd72fc..0000000 --- a/Console/CONSOLE.ASM +++ /dev/null @@ -1,2584 +0,0 @@ - -;[BEGIN] -; -; SYSTEM.EXE /S /P -; -; /P Primary command processor -; /S Secondary command processor -; /C Execute batch file - -;=====================================================================[] -;Rev. Date Name Description -;---------------------------------------------------------------------[] -;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION -;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти -;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений -;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP -;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET -;R07 14-12-2002 DNS PARSING BATCH LINE -;R06 12-12-2002 DNS ADD %0, %1, %2 ... -;R05 11-12-2002 DNS IMPLEMENTED %VAR% -;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE -;R03 11-12-2002 DNS NEW VERSION -;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES -;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO -;=====================================================================[] - - includelua 'Shared_includes/lua/Functions.lua' - include 'shared_includes/constants/bios_equ.inc' - include 'shared_includes/constants/dss_equ.inc' - include 'console/version.inc' - -; -; Standart EQU section -;---------------------------------------------------------------------[] -org_addr EQU #8000 + CLP_Buffer -code_addr EQU START -stack_point EQU #BFFF -stack_buffer EQU 64 -program_start EQU START -Loader_length EQU 0 -;---------------------------------------------------------------------[] -; - -; -; Program EQU section -;---------------------------------------------------------------------[] -CR EQU 13 -LF EQU 10 -;---------------------------------------------------------------------[] -; - OUTPUT './Build/system.exe' - include 'Shared_includes/constants/EXE_Header.z80' - ORG org_addr - -START: - LD HL,WORK_BUFFERS - LD DE,WORK_BUFFERS+1 - LD BC,BUFFERS_STRUCT-1 - LD (HL),0 - LDIR - - ;INIT - LD A,(IX-1) - LD (TASKX),A - PUSH IX - ;CALL CRLF - CALL GETPATH - POP IX - ; - - CALL GET_CMD - EI - LD A,(RUNMODE) - AND #80 ;TEST PRIMARY - JP NZ,FPRIMAR - LD A,(RUNMODE) - AND #20 ;TEST SECONDARY - JP NZ,FSECOND - LD A,(RUNMODE) - AND #10 ;TEST BATCH FILE - JP NZ,FBATCHS - LD A,(RUNMODE) - AND #40 ;TEST PROCESS - JP NZ,FBATCH - JP QUIT - -FSECOND CALL VERS - JP CONSOLE - -FBATCHS - LD HL,CMDLINE - CALL BATCH - JP QUIT - -FBATCH - CALL CMDMODE - JP QUIT - -FPRIMAR LD C,Dss.CTRLKey - RST ToDSS - LD A,B - AND #C0 - JP NZ,CONSOLE - LD HL,BATNAME - CALL BATCH - JP CONSOLE - -;R07 -MAKE_BATCH_PRM_ARRAY: - DEC HL -B_SKIP_SPACE - INC HL - LD A,(HL) - OR A - RET Z - CP " " - JR Z,B_SKIP_SPACE - CP 9 - JR Z,B_SKIP_SPACE - EX DE,HL - LD (HL),E - INC HL - LD (HL),D - INC HL - EX DE,HL -B_FIND_SPACE: - INC HL - LD A,(HL) - CP " "+1 - JR NC,B_FIND_SPACE - LD (HL),0 - OR A - RET Z - DJNZ B_SKIP_SPACE - RET - - -BATCH: PUSH HL - LD DE,PRMLINE -BCHL1 LD A,(HL) - LDI - OR A - JR NZ,BCHL1 - LD HL,PRMLINE - LD DE,BAT_PRM_ARRAY - LD B,10 - CALL MAKE_BATCH_PRM_ARRAY - JR NZ,B_ALL_P - LD HL,NULL - EX DE,HL -B_CLR_P LD (HL),E - INC HL - LD (HL),D - INC HL - DJNZ B_CLR_P - EX DE,HL -B_ALL_P POP HL -;R07 - XOR A - LD C,Dss.Open - RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 - RET C - LD (BAT_FM),A - CALL NEWLINE - XOR A - RET - -Restore_Screen: - PUSH AF - LD C,Dss.GetVMod - RST ToDSS - AND #80 - JR Z,.exit - LD BC,1 * 256 + Dss.SetVMod - LD A,Dss.SetVMod.txt80x32 - RST ToDSS -.exit: POP AF - RET - -NEWLINE LD DE,CMDLINE -ADDBAT PUSH DE - CALL READBAT - POP DE - OR A - JR NZ,BATLINE - EX DE,HL - LD DE,CMDLINE - ;AND A - SBC HL,DE - JR Z,.exit - LD A,L - LD (CMDLINE-1),A - CALL CMDMODE -.exit: LD A,(BAT_FM) - LD C,Dss.Close - RST ToDSS - RET - -BATLINE LD HL,BATBUFF -NBLINE CALL MOVWORD - JP C,ADDBAT - LD A,B - LD (BAT_LEN),A - PUSH HL - EX DE,HL - LD DE,CMDLINE - AND A - SBC HL,DE - LD A,L - LD (CMDLINE-1),A - CALL CMDMODE - LD DE,CMDLINE - POP HL - JP NBLINE -MOVWORD: LD A,(BAT_LEN) - LD B,A -.loop: LD A,(HL) - LD (DE),A - CP ' ' - INC HL - JR C,.loop2 - INC DE - DJNZ .loop - SCF - RET -.loop2: LD A,(HL) - CP ' ' - RET NC - INC HL - DJNZ .loop2 - ;R08 - PUSH DE - CALL READBAT - POP DE - LD HL,BATBUFF - LD A,(BAT_LEN) - LD B,A - OR A - JR NZ,.loop2 - SCF - ;R08 - RET - -READBAT LD HL,BATBUFF - LD DE,128 - LD C,Dss.Read - LD A,(BAT_FM) - RST ToDSS - LD A,E - LD (BAT_LEN),A - RET - -CMDMODE: XOR A - LD (POSIT),A - CALL EVALCMD ;R05 - LD IX,CMDLINE-2 - LD HL,CMDLINE - LD A,(HL) - CP "@" - JR NZ,NOALPHA - DEC HL - DEC (HL) - JR Z,NOEC - LD C,(HL) - INC HL - LD B,0 - LD D,H - LD E,L - INC HL - LDIR - JR NOEC -NOALPHA LD A,(ECHOFLG) - OR A - JR NZ,NOEC - LD DE,CMDLINE - CALL PRINT_S - CALL CRLF - LD A,(CMDLINE-1) - OR A - RET Z - CALL CRLF - CALL COMPBAT - RET - -NOEC LD A,(CMDLINE-1) - OR A - RET Z - CALL COMPBAT - RET - -COMPBAT LD HL,CMDLINE - DEC HL - LD C,(HL) - LD B,0 - INC HL -COMP00B LD A,(HL) - CP " " - JR NZ,COMP01B - INC HL - DEC C - JR NZ,COMP00B - RET -COMP01B LD D,H - LD E,L - ADD HL,BC - LD (HL),0 - SBC HL,BC - LD A,C - EX AF,AF' - LD A,#20 - CPIR - JR NZ,COMPB05 - INC C -COMPB05 EX AF,AF' - SUB C - LD C,A - LD HL,BATLIST - JP COMP004 - -CONSOLE: - CALL CRLF -RE_: CALL GETXY - CALL GETPATH -; CALL VERS - ;!TEST - LD HL,CMDLINE-1 - LD DE,CMDLINE - - LD (HL),0 - LD BC,#7F ;!HARDCODE длина CMDLINE - LDIR - CALL INPUT - CALL CRLF - LD A,(CMDLINE-1) - OR A - JP Z,RE_ - CALL CRLF - CALL COMP - JP RE_ - -GETXY LD C,Dss.Cursor - RST ToDSS - JP LOCAT - -INPUT: XOR A - LD (POSIT),A - LD (PRINT_S.SHIFT),A - LD (LEN_NEW),A - LD IX,CMDLINE-2 - CALL CEDIT - CALL RES_CUR ;!FIXIT scroll починить, тут тоже влияет вроде - RET - -COMP: CALL EVALCMD ;R05 - LD HL,CMDLINE - DEC HL - LD C,(HL) - LD B,0 - INC HL -COMP00 LD A,(HL) - CP " " - JR NZ,COMP01 - INC HL - DEC C - JR NZ,COMP00 - RET -COMP01 LD D,H - LD E,L - ADD HL,BC - LD (HL),0 - SBC HL,BC - LD A,C - EX AF,AF' - LD A,#20 - CPIR - JR NZ,COMP005 - INC C -COMP005 EX AF,AF' - SUB C - LD C,A - LD HL,CMDLIST -COMP004 PUSH BC - PUSH DE -COMP000 LD A,(DE) - CP 'a' - JP C,COMP001 - CP '{' - JP NC,COMP001 - SUB #20 -COMP001 CP (HL) - JP NZ,COMP002 - INC HL - INC DE - DEC C - JP NZ,COMP000 - XOR A - CP (HL) - JP NZ,COMP002 - POP BC - POP BC - LD A,(DE) - CP " " - JR NZ,NOSPC - INC DE -NOSPC INC HL - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - JP (HL) - -COMP002 XOR A - ;!TEST - ;LD C,#FF - LD C,A - CPIR -;.loop: CPI - ;JP NZ,.loop - ; - - INC HL - INC HL - POP DE - POP BC - LD A,(HL) - OR A - JP NZ,COMP004 - LD H,D ;CMDLINE - LD L,E - LD B,(HL) - INC HL - LD C,(HL) - INC HL - LD A,(HL) - OR A - JR NZ,RUN_EXT - LD A,":" - CP C - JR NZ,RUN_EXT - LD A,B - CP "a" - JR C,NOUP - CP "{" - JR NC,NOUP - AND #5F -NOUP SUB "A" - LD C,Dss.ChDisk - RST ToDSS - JP C,ERROR - JP GETPATH - -SAVEHL DW 0 - -RUN_EXT EX DE,HL - LD (SAVEHL),HL - LD BC,Dss.EX_Path.GET_TYPE*256 + Dss.EX_Path - LD DE,EXTBF - RST ToDSS - LD HL,(SAVEHL) - JR C,RUN_EXE - BIT 1,A - JR Z,NON_EXT - LD DE,EXTBF - LD HL,BATBF - LD B,3 - CALL COMPARE - LD HL,(SAVEHL) - JR Z,RUN_BAT - JP RUN_EXE - -NON_EXT LD BC,0*256+Dss.Exec - RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 - RET NC - LD HL,(SAVEHL) - CP 3 - JP NZ,EXEERR - PUSH HL - LD A,(CMDLINE-1) - LD B,A -EXF000 LD A,(HL) - CP "!" - JR C,EXF001 - INC HL - DJNZ EXF000 - -EXF001 - LD E,B - LD D,0 - ADD HL,DE - PUSH HL - LD E,4 - ADD HL,DE - POP DE - EX DE,HL - LD C,B - LD B,0 - INC C - LDDR - INC HL - LD (HL),"." - INC HL - LD (HL),"B" - INC HL - LD (HL),"A" - INC HL - LD (HL),"T" -; LD HL,(SAVEHL) - POP HL - JP RUN_BAT - -RUN_EXE: - LD BC,0*256 + Dss.Exec - RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 - RET NC -EXEERR CP 5 - JP NC,ERROR - LD DE,0 ;BAD COMMAND OR FILENAME - JP ERR_MSG - -RUN_BAT CALL BATCH - JP C,EXEERR - RET - -; !! Не делать одну команду > 256 символов)) !! -BATLIST: DZ 'PAUSE' : DW CPAUSE - DZ 'REM' : DW CREM -CMDLIST: DZ 'CD' : DW CCHDIR - DZ 'DIR' : DW DIR - DZ 'ECHO' : DW CECHO - DZ 'PATH' : DW CPATH - DZ 'MD' : DW CMKDIR - DZ 'REN' : DW CRENAM - DZ 'DEL' : DW CDELET - DZ 'RD' : DW CRMDIR - DZ 'SET' : DW CSET - DZ 'TIME' : DW CTIME - DZ 'DATE' : DW CDATE - DZ 'VER' : DW VERS - DZ 'CLS' : DW CLS - DZ 'CHDIR' : DW CCHDIR - DZ 'MKDIR' : DW CMKDIR - DZ 'RENAME' : DW CRENAM - DZ 'ERASE' : DW CDELET - DZ 'RMDIR' : DW CRMDIR - DZ 'EXIT' : DW CEXIT - DZ 'HELP' : DW HELP - DZ 'VERSION' : DW VERS - DZ 'REBOOT' : DW REBOOT - DB #00 - -CLS LD DE,#0000 - LD HL,#2050 - LD BC,7*256+Dss.Clear - LD A," " - RST ToDSS - LD DE,#0000 - JP LOCAT - -CRLF LD A,#0D - CALL PRINTX - LD A,#0A - JP PRINTX - -CDATE EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD DE,DTA - LD A,(DE) - OR A - JR Z,NOSETD - CALL STR2DEC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,31 - CP L - JR C,ILLEG - LD B,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,12 - CP L - JR C,ILLEG - LD C,L - PUSH BC - CALL STR2DEC - PUSH HL - LD C,Dss.SysTime - RST ToDSS - POP IX - POP DE - LD C,Dss.SetTime - RST ToDSS -NOSETD LD C,Dss.SysTime - RST ToDSS - PUSH IX - PUSH DE - LD A,D - LD HL,PRM1 - CALL PUTB - LD A,"-" - LD (HL),A - INC HL - POP DE - LD A,E - CALL PUTB - LD A,"-" - LD (HL),A - INC HL - PUSH HL - POP IX - POP HL - CALL PDIGIT - LD DE,DATEMSG - JP MESSAGE - -ILLEG LD DE,ILLGMSG - CALL MESSAGE - RET - -CTIME EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD DE,DTA - LD A,(DE) - OR A - JR Z,NOSETT - CALL STR2DEC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,23 - CP L - JR C,ILLEG - LD B,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,59 - CP L - JR C,ILLEG - LD C,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,59 - CP L - JR C,ILLEG - PUSH BC - LD A,L - PUSH AF - LD C,Dss.SysTime - RST ToDSS - POP BC - POP HL - LD C,Dss.SetTime - RST ToDSS -NOSETT LD C,Dss.SysTime - RST ToDSS - PUSH BC - PUSH HL - LD A,H - LD HL,PRM1 - CALL PUTB - LD A,":" - LD (HL),A - INC HL - POP DE - LD A,E - CALL PUTB - LD A,":" - LD (HL),A - INC HL - POP AF - CALL PUTB - XOR A - LD (HL),A - LD DE,TIMEMSG - JP MESSAGE - -CPAUSE LD DE,PAUSMSG - CALL MESSAGE - LD C,Dss.WaitKey - RST ToDSS - RET - - - -PATHSTR DB "PATH=",0 - -CPATH LD A,(DE) - OR A - JP Z,PRNEPATH - INC DE - CP 9 ; Tab - JR Z,CPATH - CP "!" - JR C,CPATH - DEC DE - EX DE,HL - DEC HL - LD (HL),"=" - DEC HL - LD (HL),"H" - DEC HL - LD (HL),"T" - DEC HL - LD (HL),"A" - DEC HL - LD (HL),"P" - LD BC,2*256+Dss.Environ - RST ToDSS - CALL C,ERROR - RET -PRNEPATH - LD DE,DTA - LD HL,PATHSTR - LD BC,1*256+Dss.Environ - RST ToDSS - JP C,ERROR - LD HL,PATHSTR - LD C,Dss.PChars - RST ToDSS - LD HL,DTA - LD C,Dss.PChars - RST ToDSS - CALL CRLF - RET - - -CSET LD A,(DE) - OR A - JP Z,PRNENVIR - INC DE ;R08 - CP 9 ;R08 - JR Z,CSET ;R08 - CP "!" ;R08 - JR C,CSET ;R08 - DEC DE ;R08 - EX DE,HL - LD BC,2*256+Dss.Environ - RST ToDSS - CALL C,ERROR - RET - -PRNENVIR - LD HL,DTA - LD BC,0*256+Dss.Environ - RST ToDSS - LD HL,DTA -PRNENVX LD C,Dss.PChars - RST ToDSS - LD A,CR - LD C,Dss.PutChar - RST ToDSS - LD A,LF - LD C,Dss.PutChar - RST ToDSS - LD A,(HL) - OR A - JR NZ,PRNENVX - RET - - -CECHO EX DE,HL - LD A,(HL) - OR A - JR Z,ECHO_F - EX DE,HL - PUSH DE - LD B,3 - LD HL,ECHOON - CALL COMPARE - POP DE - JR Z,ECHO_FS - PUSH DE - LD B,4 - LD HL,ECHOOFF - CALL COMPARE - POP HL - JR Z,ECHO_FR - -;R03 REMOVE R01 - - LD C,Dss.PChars - RST ToDSS - JP CRLF - -ECHO_F LD A,(ECHOFLG) - OR A - LD DE,ON__MSG - JR Z,ECHON - LD DE,OFF_MSG -ECHON CALL FMESAGE - LD DE,PRM1 - CALL PUTPRM - LD DE,ECHOMSG - CALL MESSAGE - RET - -ECHO_FS XOR A - LD (ECHOFLG),A - RET - -ECHO_FR LD A,#FF - LD (ECHOFLG),A - RET - -;R04 - -EVALCMD: - XOR A - LD HL,CMDLINE-1 - LD C,(HL) - LD B,A - INC HL - ADD HL,BC - LD (HL),A - SBC HL,BC - LD DE,TMPLINE - CALL EVALSTR - LD HL,TMPLINE - LD DE,CMDLINE - LD BC,#00FF -MOVLBAK LD A,(HL) - LDI - INC B - OR A - JR NZ,MOVLBAK - DEC B - LD A,B - LD (CMDLINE-1),A - AND A - RET - -; HL - STRING WITH %VAR% -EVALSTR -;R04 LD DE,DTA -;VARLOOP - LD A,(HL) - CP "%" - JR Z,TVARIABLE -VARL1 LDI - OR A - JR NZ,EVALSTR - LD BC,0 - LD (TVAR_PNT),BC -;R04 LD HL,DTA -;R04 - RET - -IZERO DB "ZERO",0 -IONE DB "ONE",0 -ITWO DB "TWO",0 -ITHREE DB "THREE",0 -IFOUR DB "FOUR",0 -IFIVE DB "FIVE",0 -ISIX DB "SIX",0 -ISEVEN DB "SEVEN",0 -IEIGHT DB "EIGHT",0 -ININE DB "NINE",0 - -;R06 -BAT_PRM_ARRAY: - DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE - DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -;R06 -NULL DB 0 ;R07 - -;R01 -TVAR_PNT - DW 0 - -TVARIABLE - LD BC,(TVAR_PNT) - LD A,B - OR C - LD A,"%" - LD (TVAR_PNT),DE - JR NZ,TVAR1 ;R06 - INC HL ;R06 - LD A,(HL) ;R06 - CP "9"+1 ;R06 - JR C,TVAR0 ;R06 -TVAR2 LD A,"%" ;R06 > "9" - DEC HL ;R06 - JP VARL1 ;R06 -TVAR0 CP "0" ;R06 - JR C,TVAR2 ;R06 < "0" -; BATCH PARAM %0, %1, %2 ... - INC HL ;R06 - PUSH HL - LD (TVAR_PNT),BC - SUB "0" - ADD A,A - LD C,A - LD HL,BAT_PRM_ARRAY - ADD HL,BC - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - OR H - JR Z,NOBTP ;NO BATCH PARM -MVBTP LD A,(HL) - LDI - OR A - JR NZ,MVBTP - DEC DE -NOBTP POP HL - JP EVALSTR ;R06 -;R06 - -TVAR1 PUSH HL - LD H,D - LD L,E - DEC HL - AND A - SBC HL,BC - JR Z,TNOVAR - LD A,"=" - LD (DE),A - INC DE - XOR A - LD (DE),A - LD D,B - LD E,C - LD H,B - LD L,C - INC HL - LD BC,1*256+Dss.Environ - RST ToDSS -TNOVAR POP HL - INC HL - LD BC,0 - LD (TVAR_PNT),BC - JP EVALSTR -;R01 - -COMPARE LD A,(DE) - CP #61 - JP C,COM001 - CP #7B - JP NC,COM001 - SUB #20 -COM001 CP (HL) - RET NZ - INC HL - INC DE - DJNZ COMPARE - RET - -CREM RET - -CCHDIR: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - XOR A - LD HL,DTA - CP (HL) - JR NZ,YP - LD (HL),"." - INC HL - LD (HL),"." - INC HL - LD (HL),0 - DEC HL - DEC HL -YP: LD C,Dss.ChDir - RST ToDSS - CALL C,ERROR - CALL GETPATH - RET - -CMKDIR EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - LD C,Dss.MkDir - RST ToDSS - CALL C,ERROR - RET - -CRMDIR: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - LD C,Dss.RmDir - RST ToDSS - CALL C,ERROR - RET - -CDELET: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - LD C,Dss.Delete - RST ToDSS - CALL C,ERROR - RET - -CRENAM: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - ;LD DE,DTA+128 - LD DE,DTA_2 - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - ;LD DE,DTA+128 - LD DE,DTA_2 - LD C,Dss.Rename - RST ToDSS - CALL C,ERROR - RET - -ERROR: LD E,A - LD D,0 - JP ERR_MSG - -DIR: LD HL,0 - LD (DIRNEX.files),HL - LD (S_LOW),HL - LD (S_HIGH),HL - EX DE,HL - LD A,(HL) - OR A - JR NZ,YPS - LD HL,ALLFS -YPS: LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - - LD HL,DTA - LD DE,DTA - LD A,#37 - LD BC,0*256+Dss.F_First - RST ToDSS - JP C,ERROR - - LD A,(PATHF) - LD HL,PRM1 - LD (HL),A - INC HL - LD (HL),":" - INC HL - LD (HL),0 - - LD HL,SER_NUM - LD DE,PRM2 - CALL PUTPRM - CALL GETPATH - LD HL,PATHF - LD DE,PRM3 - CALL PUTPRM - //call copy_string ; скопир. строку (с нулем) - - LD DE,DIR1MSG - CALL MESSAGE -; CALL CRLF -; CALL CRLF -DIRNEX: LD HL,DTA - LD DE,33 - ADD HL,DE - CALL PNAME - LD IX,DTA - LD A,(IX+32) - AND #10 - JP NZ,NODADD - ;LD HL,(FILES) -.files+1: LD HL,0 ;!TODO протестить какая процедура использующая эту переменную чаще вызывается и воткнуть переменную туда - INC HL - LD (DIRNEX.files),HL - LD E,(IX+30) - LD D,(IX+31) - LD HL,(S_HIGH) - EXX - LD E,(IX+28) - LD D,(IX+29) - LD HL,(S_LOW) - - - CALL ADDXXX - LD (S_LOW),HL - EXX - LD (S_HIGH),HL -NODADD: LD DE,DTA - LD C,Dss.F_Next - RST ToDSS - JR NC,DIRNEX - ;CALL ORDERS - ;RET -ORDERS: LD HL,(DIRNEX.files) - LD IX,PRM1 - CALL PDIGIT - LD HL,(S_LOW) - EXX - LD HL,(S_HIGH) - EXX - CALL MAKE_LN - LD HL,L32BIT_+9 - LD A,(HL) - CP #20 - JR NZ,ALR2 - LD A,#30 - LD (HL),A -ALR2: LD DE,SIZEBFF - LD HL,L32BIT_;; +1 - LD A,(HL) - LDI - CP " " - JR Z,NOPO1 - LD A,"." -NOPO1: LD (DE),A - INC DE - LDI - LDI - LD A,(HL) - LDI - CP " " - JR Z,NOPO2 - LD A,"." -NOPO2: LD (DE),A - INC DE - LDI - LDI - LD A,(HL) - LDI - CP " " - JR Z,NOPO3 - LD A,"." -NOPO3: LD (DE),A - INC DE - LDI - LDI - LDI - LD HL,SIZEBFF - LD DE,PRM2 - CALL PUTPRM - LD DE,DIR2MSG - JP MESSAGE - -;HL':HL + DE':DE -ADDXXX: ADD HL,DE - EXX - ADC HL,DE - EXX - RET - -;FILES: DW 0 - -S_LOW: DW 0 ;!FIXIT в команду -S_HIGH: DW 0 ;!FIXIT в команду - - -;12345678 123 1 234 567 890 " -; SIZE - -PNAME: LD BC,8 - LD DE,PRM1 - LDIR - XOR A - LD (DE),A - LD DE,PRM2 - LDI - LDI - LDI - LD (DE),A - LD IX,DTA - CALL PRNSIZE - CALL PRNDATE - CALL PRNTIME - LD DE,DIR3MSG - JP MESSAGE - -;!TODO -PRINTB: - ; LD A,(HL) - ; PUSH BC - ; CALL PRINTX - ; POP BC - ; INC HL - ; DJNZ PRINTB - ; RET -;------------------ - -PUTB LD C,#2F -.PUTB1 INC C - SUB 10 - JP NC,.PUTB1 - ADD A,10 - ADD A,#30 - PUSH AF - LD A,C - LD (HL),A - INC HL - POP AF - LD (HL),A - INC HL - RET - -;!TODO -PRNB: -; LD C,#2F -; .PRNB1 INC C -; SUB 10 -; JP NC,.PRNB1 -; ADD A,10 -; ADD A,#30 -; PUSH AF -; LD A,C -; CALL PRINTX -; POP AF -; JP PRINTX - -STR2DEC: LD HL,0 -.LOOP: LD A,(DE) - INC DE - OR A - RET Z - CP "-" - RET Z - CP ":" - RET Z - LD B,H - LD C,L - ADD HL,HL - ADD HL,HL - ADD HL,BC - ADD HL,HL - CALL ATODEC - RET C - ADD A,L - LD L,A - JR NC,.LOOP - INC H - JR .LOOP - -ATODEC CP "0" - RET C - CP ":" - CCF - RET C - SUB "0" - RET - -PDIGIT LD DE,10000 - LD A,#C8 - LD (RET_Z),A - CALL DIG - LD DE,1000 - CALL DIG - LD DE,100 - CALL DIG - LD DE,10 - CALL DIG - LD A,L - ADD A,"0" ;#30 - - ;!TEST - ;LD (IX+0),A - ;INC IX - ;LD (IX+0),0 - LD (IX+0),A - LD (IX+1),0 - ; - RET - -DIG: XOR A -.DIG1: INC A - SBC HL,DE - JR NC,.DIG1 - ADD HL,DE - DEC A -RET_Z: RET Z - ADD A,#30 - LD (IX+0),A - INC IX - XOR A - LD (RET_Z),A - RET - -PRNSIZE: LD A,(IX+32) - LD HL,DIRIDD - AND #10 - JP NZ,.PRZ - LD L,(IX+28) - LD H,(IX+29) - EXX - LD L,(IX+30) - LD H,(IX+31) - EXX - PUSH IX - CALL MAKE_LN - LD HL,L32BIT_+9 - LD A,(HL) - CP ' ' - JR NZ,.ALR - LD A,'0' - LD (HL),A -.ALR: LD DE,SIZEBFF - LD HL,L32BIT_;; +1 - LDI - LD A," " - LD (DE),A - INC DE - LDI - LDI - LDI - LD (DE),A - INC DE - LDI - LDI - LDI - LD (DE),A - INC DE - LDI - LDI - LDI - LD HL,SIZEBFF - POP IX -.PRZ: LD DE,PRM3 - JP PUTPRM - -; Скопировать в буфер дату файла/папки -PRNDATE: LD B,(IX+25) - LD C,(IX+24) - LD HL,SIZEBFF - CALL DATE - LD (HL),0 - LD HL,SIZEBFF - LD DE,PRM4 - LD A,(HL) - CP "0" - JP NZ,PUTPRM - LD (HL),#20 - JP PUTPRM -; Скопировать в буфер время файла/папки -PRNTIME: LD B,(IX+22) - LD C,(IX+23) - LD HL,SIZEBFF - CALL TIME - LD (HL),0 - LD HL,SIZEBFF - LD DE,PRM5 - LD A,(HL) - CP "0" - JP NZ,PUTPRM - LD (HL),' ' - JP PUTPRM -; в буфер время файла/папки -TIME: SRL C - RR B - SRL C - RR B - SRL C - RR B - SRL B - SRL B - LD A,C - CALL NUMB - LD (HL),":" - INC HL - LD A,B - JP NUMB -; в буфер дату файла/папки -DATE: LD A,C - AND #1F - PUSH BC - CALL NUMB - LD (HL),"." - INC HL - POP BC - LD A,C - SRL B - RLA - RLA - RLA - RLA - AND #0F - CALL NUMB - LD (HL),"." - INC HL - LD A,B - ADD A,#50 - CP 100 - JP C,NUMB -SUB100 SUB 100 - CP 100 - JP C,NUMB - JR SUB100 - -NUMB LD C,#2F -NUMB1 INC C - SUB 10 - JP NC,NUMB1 - ADD A,10 - ADD A,'0' - LD (HL),C - INC HL - LD (HL),A - INC HL - RET -; Десятичный 32-х разрядный вывод -MAKE_LN LD IX,L32BIT_ - EXX - LD DE,#3B9A ; 1000000000 - EXX - LD DE,#CA00 - CALL GET_DIG - EXX - LD DE,#05F5 ; 100000000 - EXX - LD DE,#E100 - CALL GET_DIG - EXX - LD DE,#0098 ; 10000000 - EXX - LD DE,#9680 - CALL GET_DIG - EXX - LD DE,#000F ; 1000000 - EXX - LD DE,#4240 - CALL GET_DIG - EXX - LD DE,#0001 ; 100000 - EXX - LD DE,#86A0 - CALL GET_DIG - EXX - LD DE,#0000 ; 10000 - EXX - LD DE,#2710 - CALL GET_DIG - EXX - LD DE,#0000 ; 1000 - EXX - LD DE,#03E8 - CALL GET_DIG - EXX - LD DE,#0000 ; 100 - EXX - LD DE,#0064 - CALL GET_DIG - EXX - LD DE,#0000 ; 10 - EXX - LD DE,#000A - CALL GET_DIG - LD A,L ; 1 - ADD A,#30 - LD (IX+0),A - INC IX - LD HL,L32BIT_ - LD DE,#2030 -KILLZ LD A,(HL) - CP E - JR NZ,KILLZ2 - LD (HL),D - INC HL - JP KILLZ -KILLZ2 LD HL,L32BIT_+9 - LD A,(HL) - CP D - RET NZ - LD (HL),E - RET - -; HL:HL - DE:DE -GET_DIG XOR A -INC_DG INC A - SBC HL,DE - EXX - SBC HL,DE - EXX - JP NC,INC_DG - ADD HL,DE - EXX - ADC HL,DE - EXX - DEC A - ADD A,#30 - LD (IX+0),A - INC IX - RET - -L32BIT_ DB "0000000000" - -DIRIDD DB " ",0 - -SIZEBFF DB "0 000 000 000",0,0 - -;------------------- - -;!FIXIT лучше такую функцию в DSS пихнуть -; прочитать BPB диска -/* -read_disk_info: -.disk+1: ld a,0 ; сохр. номер диска - ld c,Dss.DRV.Open ; open device - rst ToDSS.DRV - jr c,get_inf_data_err - ld a,(read_disk_info.disk) - ld de,BPB ; буфер - ld c,Dss.DRV.GetBPB ; get BPB - rst ToDSS.DRV - ;push af - ld a,(read_disk_info.disk) ; номер диска - ld c,Dss.DRV.Close ; close device - rst ToDSS.DRV - ;pop af - ;jr c,get_inf_data_err -get_inf_data_err: - ; Серийный номер лог. диска - ld hl,(BPB+41) ; ст.часть - ld de,SER_NUM ; xxxx-xxxx - call hex16 - ld a,"-" - ld (de),a - inc de - ld hl,(BPB+39) ; мл.часть - call hex16 - ; - ; Метка диска - ld a,(read_disk_info.disk) ; номер диска - cp 2 ; меньше "C:" ? - jr nc,get_inf_data1 ; метка в BPB - ; floppy, метка - как запись файла - ld c,Dss.ChDisk ; уст. диск - rst ToDSS - ; уст. корень диска - ld hl,ROOT ; "\",0 - ld c,Dss.ChDir - rst ToDSS - ; поиск метки - ld hl,ALLFS ; "*.*" имя метки - ld de,DTA ; куда - ld a,8 ; атрибут метки тома - ld bc,0*256 + Dss.F_First ; f_first, формат 11 - rst ToDSS - push af - call restore_path ; восст. тек. путь - pop af - jr c,no_volume_label ; метки нет - ld hl,DTA+33 ; начало метки в буфере f_first - jr volume_label - ; -get_inf_data1: - ld hl,BPB+53 ; конец метки в BPB - ld a,(hl) - cp " " ; есть метка ? - ld hl,BPB+43 ; начало метки в BPB - jr nz,volume_label ; да -; нет метки -no_volume_label: - ld hl,volume_string1 ; "has no label " - ld de,volume_string ; куда - ld bc,14 - ldir - ret -; есть метка -volume_label: - ex de,hl - ld hl,volume_string ; куда - ld (hl),"i" - inc hl - ld (hl),"s" - inc hl - ld (hl)," " - inc hl - ex de,hl - ; скопир. имя метки - ld bc,11 ; макс. длина метки - ld a,(hl) - cp " "+1 - jr nc,$+6 - inc hl - dec c - jr $-7 - ld a,11 - sub c - ldir - ld b,a - or a ; длина метки 11 симв. ? - ret z ; да - ; дополнить хвост. пробелами - ld (de),a - inc de - djnz $-2 - ret -*/ -; Вывод HL в hex-формате -; de=буфер -; hl=число -hex16: ld a,h - call hex8 - ld a,l -; вывод "a" -hex8: push af - rrca - rrca - rrca - rrca - call $+4 - pop af - and 0Fh - add a,90h - daa - adc a,40h - daa - ld (de),a - inc de - ret -;------------------- - -VERS: LD C,Dss.Version - RST ToDSS - LD L,D - LD H,E - LD DE,PRM1 - CALL .Set_Ver_to_PRM ; set DSS version - ;R13 - LD HL,256*CONSOLE_MODF + CONSOLE_VERS - LD BC,CONSOLE_BUILD - LD DE,PRM2 - CALL .Set_Ver_to_PRM ; set Shell version - ;R13 - LD DE,VERSMSG - JP MESSAGE - - ; вход: hl=число, de=буфер -.num_ver: -.num_mod: - ld ix,.tmp1__ - res 7,(ix+0) - jr .decim - - ; вход: hl=число, de=буфер -.num_build: - ld ix,.tmp1__ - res 7,(ix+0) - ld bc,100 ; 100 - call .num16 - -.decim: ld bc,10 ; 10 - call .num16 - ld a,l - add a,"0" - jr .num16_exit - -.tmp1__: BYTE 0 - -.num16: ld a,'0'-1 - and a - inc a - sbc hl,bc - jr nc,$-3 - add hl,bc - cp "0" - jr z,$+6 - set 7,(ix+0) - bit 7,(ix+0) - ret z -.num16_exit: - ld (de),a ; сохр. в буфере - inc de - ret - ; -; Вход: -; L - номер версии (0..9) -; H - номер модификации (0..99) -; BC - номер билда (0..999) -; DE - номер параметра -.Set_Ver_to_PRM: - PUSH BC - PUSH HL - LD H,0 - CALL .num_ver ;decim2 номер версии (0..9) - LD A,'.' - LD (DE),A - INC DE - POP HL - LD L,H - LD H,0 - CALL .num_mod ;decim2 номер модификации (0..99) - POP HL - LD A,'.' - LD (DE),A - INC DE - CALL .num_build ;decim3 номер билда (0..999) - XOR A - LD (DE),A - RET -/* -VERS: - LD C,Dss.Version - RST ToDSS - PUSH BC - - LD A,D - LD HL,PRM1 - CALL GETnoZERO - LD A,"." - LD (HL),A - INC HL - - LD A,E - CALL GETnoZERO - LD A,"." - LD (HL),A - INC HL - - POP BC - LD A,C - CALL GETnoZERO - XOR A - LD (HL),A - - LD DE,VERSMSG - JP MESSAGE - -GETnoZERO: - LD B,#2F -.loop: INC B - SUB 10 - JR NC,.loop - ADD A,10+"0" - LD C,A - LD A,"0" - CP B - LD A,C - JR Z,.mdec - LD (HL),B - INC HL -.mdec: LD (HL),A - INC HL - SCF - RET - -GETyesZERO: - LD B,#2F -.loop: INC B - SUB 10 - JR NC,.loop - ADD A,10 - LD (HL),B - INC HL - RET Z - ADD A,"0" - LD (HL),A - INC HL - RET -*/ - -HELP: LD DE,HELPMSG - CALL MESSAGE - RET - -CEXIT: LD A,(TASKX) - DEC A - DEC A - RET Z - POP HL -QUIT: LD BC,Dss.Exit - RST ToDSS - RET - -;----------------------------------------------------------------------- -;R12 -REBOOT: DI - LD C,BIOS.FullInit - RST ToBIOS - LD BC,2*256 + BIOS.REINIT - RST ToBIOS - DI - HALT -;R12 -;----------------------------------------------------------------------- - -ERR_MSG: INC DE - LD HL,ERR0 - LD BC,ERR0.Size - CALL LCPIR - CALL PRINTZ - CALL CRLF - JP CRLF - -MESSAGE: CALL FMESAGE - CALL PRINTZ - ;CALL GETXY - RET - -FMESAGE: INC DE - LD HL,MSG0 - LD BC,MSG0.Size -LCPIR: XOR A - CPIR - RET PO - RET NZ - ;R11 - XOR A - CP (HL) - JR Z,.no_mess - ; - DEC DE - LD A,D - OR E - JP NZ,LCPIR - RET -.no_mess: INC HL - RET - - -PUTPRM: LD BC,15 -PUTPRMA: LD A,(HL) - LDI - RET PO - OR A - JR NZ,PUTPRMA - RET - -;!FIXIT заменить на PUTPRMA с выставлением перед вызовом BC = 255 например -; Скопир. строку (с нулем) -; (hl) -> (de) -//copy_string: -// ld a,(hl) -// ldi -// or a -// jr nz,copy_string -// ret - - - -PRINTZ: LD A,(HL) - INC HL - OR A - RET Z - CP "%" - JR NZ,.char - - LD A,(HL) - INC HL - SUB "1" - PUSH HL - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,PRM1 - ADD HL,BC - LD C,Dss.PChars - RST ToDSS - POP HL - JP PRINTZ -.char: LD C,Dss.PutChar - RST ToDSS - JP PRINTZ - -ROOT: DB '\',0 - -ALLFS: DB "*.*",0 - -SER_NUM: DB "C37F-73AB",0 -//SER_NUM DB "XXXX-XXXX",0 - -EXTBF: BLOCK 4,0 - -BATBF: DB "BAT" - -ECHOON: DB "ON",0 -ECHOOFF: DB "OFF",0 - - -DIR1MSG EQU 0 -VERSMSG EQU 1 -DATEMSG EQU 2 -TIMEMSG EQU 3 -PAUSMSG EQU 4 -ILLGMSG EQU 5 -ECHOMSG EQU 6 -ON__MSG EQU 7 -OFF_MSG EQU 8 -DIR2MSG EQU 9 -DIR3MSG EQU 10 -HELPMSG EQU 11 - -MSG0: DB 0 -; 0 - DB "Volume in drive %1 has no label",CR,LF ; !FIXIT - DB "Volume Serial number is %2",CR,LF - DB "Directory of %3",CR,LF,CR,LF,0 -; 1 - DB "Estex DSS: Version %1",CR,LF - DB "Console: Version %2",CR,LF,0 ;R13 -; 2 - DB "Current date: %1",CR,LF,0 -; 3 - DB "Current time: %1",CR,LF,0 -; 4 - DB "Press any key to continue . . .",CR,LF,0 -; 5 - DB "Invalid parametr",CR,LF,0 -; 6 - DB "Echo is %1",CR,LF,0 -; 7 - DB "on",0 -; 8 - DB "off",0 -; 9 - DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 -; 10 FILENAME EXT SIZE DATE TIME - DB "%1 %2 %3 %4 %5",CR,LF,0 -; 11 - DB "COMMANDS:",CR,LF,CR,LF - DB "DIR REN | RENAME PATH HELP ",CR,LF - DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - DB "MD | MKDIR TIME ECHO EXIT ",CR,LF - DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 - ;R11 - BYTE 0 - DZ "Unknown command" - ; -.Size EQU $-MSG0 -;----------------------------------------------------------------------- -;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются -ERR0: DB #00 - DZ "Bad command or file name" - DZ "Invalid function" ; 01 - неверный номер функции - DZ "Invalid drive number" ; 02 - неправильный номер устройства - DZ "File not found" ; 03 - файл не обнаружен - DZ "Path not found" ; 04 - неверный путь - DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "Too many open files" ; 06 - нет свободного файлового манипулятора - DZ "File already exist" ; 07 - файл существует - DZ "File read only" ; 08 - файл только для чтения - DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) - DZ "No free space" ; 10 - нет свободного места на диске - DZ "Directory not empty" ; 11 - каталог не пуст - DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог - DZ "Invalid media" ; 13 - неизвестный формат - DZ "Unknown operation" ;R02 ; 14 - невозможная операция - DZ "Directory exist" ; 15 - каталог уже есть - DZ "Invalid filename" ; 16 - неверное имя - DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл - DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен - DZ "Not ready" ; 20 - нет готовности - DZ "Seek error" ; 21 - ошибка позиционирования - DZ "Sector not found" ; 22 - сектор не найден - DZ "CRC error" ; 23 - ошибка CRC - DZ "Write protect" ; 24 - защита записи - DZ "Read error" ; 25 - ошибка чтения - DZ "Write error" ; 26 - ошибка записи - DZ "Drive failure" ; 27 - сбой диска - DZ "Extended error 28" - DZ "Extended error 29" - DZ "Not enough memory" ; 30 - недостаточно памяти - DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "Extended error 32" - DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной - DZ "Extended error 34" - DZ "Too many files in directory" ; 35 - слишком много файлов в директории - DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation aborted by user" ; 37 - операция прервана пользователем - DZ "Common error" ; 38 - общая ошибка - DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения - DZ "40" - DZ "41" - DZ "42" - DZ "43" - DZ "44" - DZ "45" - DZ "46" - DZ "Wrong video mode" ; 48 - неправильный видеорежим - DZ "48" - DZ "49" - DZ "50" - ;R11 - DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: - DZ "Unknown error" - ; -.Size EQU $-ERR0 -;----------------------------------------------------------------------- - -GETPATH: - LD C,Dss.CurDisk - RST ToDSS - LD HL,PATHF - ADD A,"A" - LD (HL),A - INC HL - LD (HL),":" - INC HL - LD C,Dss.CurDir - RST ToDSS - - LD HL,PATHF - LD DE,PATH - LDI - LDI - LDI - PUSH HL - XOR A - LD BC,34 ;!HARDCODE - CPIR - JP NZ,LONGP - LD A,34 ;!HARDCODE - SUB C - LD C,A - POP HL - LDIR - JR PHLEN - -LONGP CPIR - LD A,"." - LD (DE),A - INC DE - LD (DE),A - INC DE - LD (DE),A - INC DE - LD BC,31 - AND A - SBC HL,BC - LDIR - POP HL -PHLEN LD HL,PATH - LD BC,40 ;!HARDCODE path - XOR A - CPIR - LD A,39 ;!HARDCODE - SUB C - LD (PATHLEN),A - LD C,A - INC C - INC C - LD A,80 - SUB C - LD (WINDOW),A - RET -PRINT_B LD C,A -PRINTBB PUSH BC - CALL PRINTX - POP BC - LD A,C - DJNZ PRINTBB - RET - -TEMPXY DW 0 - -CR_ LD C,Dss.Cursor - RST ToDSS - LD E,0 - JP LOCAT - -LF_ LD C,Dss.Cursor - RST ToDSS - LD A,D - CP #1F - JP Z,LFF - INC D - JP LOCAT - -LFF PUSH HL - PUSH DE - LD BC,#018A - LD DE,#0020 - EI - HALT - DI - RST ToBIOS - LD DE,#1F00 - CALL LOCAT - LD A,#20 - LD BC,#5082 - RST ToBIOS - EI - POP DE - CALL LOCAT - POP HL - RET - -PRINTX: CP ' ' - JP NC,CHAR - CP #0D - JP Z,CR_ - CP #0A - JP Z,LF_ -CHAR: PUSH BC - LD BC,1*256 + BIOS.LP_PRINT_SYM - RST ToBIOS - POP BC - RET - -LOCAT LD (TEMPXY),DE - LD C,Dss.Locate - RST ToDSS - RET - -;PRINTX LD C,Dss.PutChar -; RST #10 -; RET - -CEDIT PUSH IX - POP HL - INC HL - INC HL - LD (ETXS),HL - XOR A - LD (POSIT),A - LD (PRINT_S.SHIFT),A -EDIT1 LD DE,(ETXS) - CALL PRINT_S - CALL KEY - CP 13 ; enter code - RET Z - LD HL,EDIT1 - PUSH HL - AND A - LD HL,#5400 - SBC HL,DE - JP Z,BACK - AND A - LD HL,#5600 - SBC HL,DE - JP Z,FORW - CP #08 - JP Z,DELET - CP #20 - RET C - EX AF,AF' - LD A,(IX+1) - CP (IX+0) - CCF - RET C - LD A,(IX+1) - LD E,A - LD D,0 - LD HL,(ETXS) - ADD HL,DE - LD A,(POSIT) - LD E,A - LD A,(IX+1) - SUB E - JR Z,ADD_SM - LD B,D - LD C,A - LD D,H - LD E,L - DEC HL - LDDR - EX DE,HL -ADD_SM EX AF,AF' - LD (HL),A - LD A,(POSIT) - INC A - LD (POSIT),A - LD (MAIN_X),A - INC (IX+1) - LD HL,(ETXE) - INC HL - LD (ETXE),HL - LD HL,PRINT_S.SHIFT - SUB (HL) - CP (IX-1) - RET C - LD A,(STEP) - ADD A,(HL) - LD (HL),A -; CALL PAGE - RET - -BACK: LD A,(POSIT) - OR A - RET Z ;JP Z,BCK - DEC A - LD (POSIT),A - LD (MAIN_X),A - INC A - LD HL,PRINT_S.SHIFT - SUB (HL) - RET NZ - LD A,(STEP) - LD E,A - LD A,(HL) - SUB E - LD (HL),A -; CALL PAGE - RET - -FORW LD A,(POSIT) - CP (IX+1) - RET Z ; JP Z,FRD - INC A - LD (POSIT),A - LD (MAIN_X),A - LD HL,PRINT_S.SHIFT - SUB (HL) - CP (IX-1) - RET C - LD A,(STEP) - ADD A,(HL) - LD (HL),A -; CALL PAGE - RET - -DELET LD A,(POSIT) - OR A - RET Z ; JP Z,LINKSTR - LD HL,(ETXS) - LD E,A - LD D,0 - ADD HL,DE - LD A,(IX+1) - SUB E - JR Z,SUB_SM - LD B,D - LD C,A - LD D,H - LD E,L - DEC DE - LDIR -SUB_SM XOR A - DEC HL - LD (HL),A - LD A,(POSIT) - DEC A - LD (POSIT),A - LD (MAIN_X),A - DEC (IX+1) - LD HL,(ETXE) - DEC HL - LD (ETXE),HL - LD HL,PRINT_S.SHIFT - INC A - SUB (HL) - RET NZ - LD A,(STEP) - LD E,A - LD A,(HL) - SUB E - LD (HL),A -; CALL PAGE - RET - -KEY ;RES 5,(IY+1) - LD A,(PRINT_S.SHIFT) - LD E,A - LD A,(POSIT) - SUB E - INC A - LD HL,PATHLEN - ADD A,(HL) - LD (_X+1),A - LD A,(POSIT) - CP (IX+1) - JP C,KEY0 - LD A,#20 - LD (_A+1),A - JP KEY1 -KEY0 LD E,A - LD D,0 - LD HL,(ETXS) - ADD HL,DE - LD A,(HL) - LD (_A+1),A -KEY1 CALL CURSORF - EI - HALT - LD C,Dss.ScanKey - RST ToDSS - JP Z,KEY1 - RET - -CURSORX DB #00 - -CURSORF LD A,05 - DEC A - LD (CURSORF+1),A - RET NZ - LD A,05 - LD (CURSORF+1),A - LD DE,(TEMPXY) -_X LD E,#00 - CALL LOCAT - LD A,(CURSORX) - XOR #FF - LD (CURSORX),A - LD A,"_" - JR NZ,YEPCUR -_A LD A,#20 -YEPCUR CALL PRINTX - EI - RET - -RES_CUR LD A,(CURSORX) - OR A - RET Z - XOR #FF - LD (CURSORX),A - LD DE,(TEMPXY) - LD A,(_X+1) - LD E,A - CALL LOCAT - LD A,(_A+1) - JP PRINTX - -PRINT_S: - PUSH DE - CALL GETXY ;;; - LD DE,(TEMPXY) - LD E,0 - CALL LOCAT - LD HL,PATH - CALL PRINTZ - LD A,">" - CALL PRINTX - POP DE - EX DE,HL -.SHIFT+1: LD BC,#0000 - ADD HL,BC - LD A,(.SHIFT) - LD C,A - LD A,(IX+1) - SUB C - JP Z,.EMT_STR - LD B,A - LD A,(IX-1) - SUB B - JR NC,.PR_S - LD B,(IX-1) -.PR_S: PUSH BC - LD C,BIOS.LP_PRINT_LINE2 - RST ToBIOS - POP BC -.EMT_STR: LD A,(IX-1) - SUB B - EI - RET Z - LD B,A - LD A,' ' - LD C,BIOS.LP_PRINT_SYM - RST ToBIOS - EI - RET - -GET_CMD: LD D,XH - LD E,XL - EX DE,HL - LD E,(HL) - INC HL - LD D,0 - EX DE,HL - ADD HL,DE - LD (HL),0 -NEXTPRM EX DE,HL -SKIPSP LD A,(HL) - INC HL - CP " " - RET C - JR Z,SKIPSP - DEC HL - CP "/" - JR NZ,PROCESS - LD DE,BUFFER - LD C,Dss.GSwitch - RST ToDSS - PUSH AF - EX DE,HL ;SAVE HL IN DE - LD HL,BUFFER - INC HL - CALL ISWITCH - POP AF - JP NC,NEXTPRM - XOR A - RET - -PROCESS LD DE,CMDLINE - LD BC,#00FF -NLDI LD A,(HL) - LDI - INC B - CP " " - JR NC,NLDI - DEC B - LD A,B - LD (CMDLINE-1),A - LD A,(RUNMODE) - OR #40 ;PROCESS - LD (RUNMODE),A - XOR A - RET - -ISWITCH LD A,(HL) - CP "a" - JR C,NUP - CP "{" - JR NC,NUP - SUB #20 -NUP -PR000 CP "P" - JR NZ,PR001 - LD A,(RUNMODE) - OR #80 ;PRIMARY CONSOLE - LD (RUNMODE),A - RET -PR001 CP "S" - JR NZ,PR002 - LD A,(RUNMODE) - OR #20 ;SECONDARY CONSOLE - LD (RUNMODE),A -PR002 CP "C" - JR NZ,PR003 - LD A,(RUNMODE) - OR #10 ;RUN BATCH FILE - LD (RUNMODE),A -PR003 RET - -TASKX DB 0 -RUNMODE DB 0 -STEP DB 8 -MAIN_X DB 0 - -LEN_OLD DB 0 -POSIT DB 0 - -ETXS DW 0 -ETXE DW 0 -; +0 - Size buffer -; +1 - Amount simbols -; -1 - Scroll Window -WINDOW DB #50 -BUFFERC DB #FF -LEN_NEW DB #00 - -BATNAME DB "system.bat",0 -BAT_BUFFER.size EQU 128 ;!FIXIT BAT_BUFFER LENGTH - - - -/* -; Структура строки ввода ~input line~ -struct_input_line: - db max_len_comline ;+0 254 макс. число ввод. символов - db 0 ;+1 флаг ReadyString - db 0 ;+2 X тек. полож. курсора в пределах строки - db 0 ;+3 X смещ. строки за левый край (в символах) - db 0 ;+4 число введенных символов - ds max_len_comline+1 ;+5 строка ввода -*/ - - STRUCT BUFFERS_STRUCT -CMDLINE BLOCK 256,0 ;!HARDCODE cmdline size -TMPLINE BLOCK 256,0 -PRMLINE BLOCK 256,0 -;BUFFER -;BATBUFF -SHARED_BUFFER BLOCK BAT_BUFFER.size+1,0 -; -PRM1 BLOCK 16,0 -PRM2 BLOCK 16,0 -PRM3 BLOCK 16,0 -PRM4 BLOCK 16,0 -PRM5 BLOCK 16,0 -PRM6 BLOCK 16,0 -PRM7 BLOCK 16,0 -PRM8 BLOCK 16,0 -PRM9 BLOCK 16,0 -DTA BLOCK 256,0 -DTA_2 BLOCK 256,0 -BPB BLOCK 512,0 -PATHF BLOCK 256,0 -BAT_FM DB 0 -BAT_LEN DB 0 -ECHOFLG DB 0 -PATHLEN DB 0 -PATH BLOCK 40,0 ;!HARDCODE PATH LENGTH - ENDS - - -WORK_BUFFERS BUFFERS_STRUCT = $ - -CMDLINE EQU WORK_BUFFERS.CMDLINE -TMPLINE EQU WORK_BUFFERS.TMPLINE -PRMLINE EQU WORK_BUFFERS.PRMLINE -BUFFER EQU WORK_BUFFERS.SHARED_BUFFER -BATBUFF EQU WORK_BUFFERS.SHARED_BUFFER -PRM1 EQU WORK_BUFFERS.PRM1 -PRM2 EQU WORK_BUFFERS.PRM2 -PRM3 EQU WORK_BUFFERS.PRM3 -PRM4 EQU WORK_BUFFERS.PRM4 -PRM5 EQU WORK_BUFFERS.PRM5 -PRM6 EQU WORK_BUFFERS.PRM6 -PRM7 EQU WORK_BUFFERS.PRM7 -PRM8 EQU WORK_BUFFERS.PRM8 -PRM9 EQU WORK_BUFFERS.PRM9 -DTA EQU WORK_BUFFERS.DTA -DTA_2 EQU WORK_BUFFERS.DTA_2 -BPB EQU WORK_BUFFERS.BPB ;!TEST -PATHF EQU WORK_BUFFERS.PATHF -BAT_FM EQU WORK_BUFFERS.BAT_FM -BAT_LEN EQU WORK_BUFFERS.BAT_LEN -ECHOFLG EQU WORK_BUFFERS.ECHOFLG -PATHLEN EQU WORK_BUFFERS.PATHLEN -PATH EQU WORK_BUFFERS.PATH - - - DISPLAY "BUFFERS_STRUCT = ",/D,BUFFERS_STRUCT - DISPLAY "WORK_BUFFERS start = ",/H,WORK_BUFFERS - DISPLAY "WORK_BUFFERS end = ",/H,WORK_BUFFERS+BUFFERS_STRUCT - -/* - -CMDLINE BLOCK 256,0 - -TMPLINE BLOCK 256,0 - - -PRMLINE BLOCK 256,0 - -BUFFER: - -BATBUFF: BLOCK BAT_BUFFER.size+1,0 -; - -PRM1 BLOCK 16,0 -PRM2 BLOCK 16,0 -PRM3 BLOCK 16,0 -PRM4 BLOCK 16,0 -PRM5 BLOCK 16,0 -PRM6 BLOCK 16,0 -PRM7 BLOCK 16,0 -PRM8 BLOCK 16,0 -PRM9 BLOCK 16,0 - -DTA: BLOCK 256,0 -PATHF: BLOCK 256,0 - -BAT_FM: DB 0 -BAT_LEN: DB 0 - -ECHOFLG: DB 0 - -PATHLEN: DB 0 -PATH: BLOCK 40,0 ;!FIXIT PATH LENGTH -*/ - - OUTEND -; -;[End] \ No newline at end of file diff --git a/Console/Errors.TXT b/Console/Errors.TXT deleted file mode 100644 index 45055c1..0000000 --- a/Console/Errors.TXT +++ /dev/null @@ -1,66 +0,0 @@ -No free file handles -Bad Command or file name -Access denied -Memory allocation error -Cannot load COMMAND, system halted -Cannot start COMMAND, exiting -Top level process aborted, cannot continue -Write protect error -Invalid unit -Not ready -Invalid device request -Data error -Invalid device request parameters -Seek error -Invalid media type -Sector not found -Printer out of paper error -Write fault error -Read fault error -General failure -Sharing violation -Lock violation -Invalid disk change -FCB unavailable -System resource exhausted -Code page mismatch -Out of input -Insufficient disk space -Too many parameters -Required parameter missing -Invalid switch -Invalid keyword -Parameter value not inallowed range -Parameter value not allowed -Parameter value not allowed -Parameter format not correct -Invalid parameter -Invalid parameter combination -Invalid function -File not found -Path not found -Too many open files -Access denied -Invalid handle -Memory control blocks destroyed -Insufficient memory -Invalid memory block address -Invalid Environment -Invalid format -Invalid function parameter -Invalid data -Invalid drive specification -Attempt to remove current directory -Not same device -No more files -File exists -Cannot make directory entry -Fail on INT 24 -Too many redirections -Duplicate redirection -Invalid password -Invalid parameter -Network data fault -Function not supported by network -Required system component not installed - diff --git a/Console/HISTORY.TXT b/Console/HISTORY.TXT deleted file mode 100644 index 1acb2dd..0000000 --- a/Console/HISTORY.TXT +++ /dev/null @@ -1,4 +0,0 @@ -21-02-2003 FIX BUG WITH LINE MERGE IN BAT-FILE -14-12-2002 ADD BAT-PARAMETERS %1 %2 -11-12-2002 ADD BAT-VARIABLES %VAR% -03-10-2002 FIX BUG WITH OUTPUT AT THE SCREEN IN BAT-MODE diff --git a/Console/build.txt b/Console/build.txt deleted file mode 100644 index 2e66562..0000000 --- a/Console/build.txt +++ /dev/null @@ -1 +0,0 @@ -49 \ No newline at end of file diff --git a/Console/version.inc b/Console/version.inc deleted file mode 100644 index 1d20a76..0000000 --- a/Console/version.inc +++ /dev/null @@ -1,22 +0,0 @@ -;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] - LUA PASS1 - Console_build = increase_build("./Console/build.txt") - if Console_build > 999 then - Console_build = 999 - print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a") - end - ENDLUA - LUA ALLPASS - sj.insert_label("lua_BUILD", Console_build) - ENDLUA -;---------------------------------------------------------------------[] - -; -; Shell full version -; номер версии (0..9) -CONSOLE_VERS EQU 1 -; номер модификации (0..99) -CONSOLE_MODF EQU 2 -; номер билда (0..999) -CONSOLE_BUILD EQU lua_BUILD -; \ No newline at end of file diff --git a/DOS/CURSOR.ASM b/DOS/CURSOR.ASM deleted file mode 100755 index d7261a7..0000000 --- a/DOS/CURSOR.ASM +++ /dev/null @@ -1,63 +0,0 @@ -delay_curs equ 11 ; частота мигания курсора - - - -cursor: db 3Eh ; ld a,.. -crFlag: db 0 ; флаг курсора 00-нет/01-есть - cpl - ld (crFlag),a -; Включить курсор -cursor_on: - ld c,8Eh ; узнать полож. курсора - rst 08h - ld (curs_posit+1),de - xor a - ld c,0B4h ; получить символ - rst 08h - ld bc,1BB5h ; b=знакоген., с=символ на экран - ld a,(crFlag) - or a - jr z,curs__ - ld b,1Ah ; черта - ld a,(D0642) ; флаги клавы - bit 1,a ; бит Ins - jr nz,$+4 - ld b,19h ; блок -curs__: xor a ; номер окна - rst 08h - ld a,1 - ld (curs_inv_flag),a - ld a,delay_curs - ret - -; Выключить курсор -cursor_off: - db 3Eh ; ld a,.. -curs_inv_flag: - db 0 ; флаг курсора: 00-выкл/01-вкл - or a - ret z - ld a,-1 - ld (crFlag),a - inc a - ld (curs_inv_flag),a - ld a,delay_curs - ld (curs_timer),a -curs_posit: - ld de,0 ; Y/X полож. - bit 7,e - ret nz - ld c,0B4h ; получить символ - xor a - rst 08h - xor a - ld bc,1BB5h ; символ на экран - rst 08h - ret - - -; Установить фокус на "Input Line" -focus_to_inpline: - call cursor_on ; вкл. курсор - ei - ret diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM deleted file mode 100755 index 0abef18..0000000 --- a/DOS/DOS.ASM +++ /dev/null @@ -1,7527 +0,0 @@ -; Последняя редакция: 9.03.2007 -; - - -; метки ## - не ясные места (закомментарино) -; метки @@ - замена ориг. кода -; - - -; буфер D2E7C или T0400 также исп. для ввода/вывода файловых операций ? - - - - -; Примечания по ДОС-у -; -; Выравнивание кода на границу происходит в двух местах: 0100h и 0900h -; (есть немного лишнего места). -; -; -; Добавления: -; ~~~~~~~~~~~ -; Появилась новая функция #08 DSS_RESCAN (Пересканировать девайсы системы). -; -; Функция #00 (версия ДОС) дополн. возвращает в BC номер билда (0..999). -; -; Добавлен код обслуживания курсора (на прерываниях) и регистрация в системе -; знакогенераторов курсора с номерами 1Ah/19h (черта/блок). Функция #32 дора- -; ботана под новый курсор, а также не выводит ascii-код #00 (от курс. клавиш -; и т.д.). Переключение формы курсора клавишей "Ins". -; -; В функции #5F (символ на принтер) добавлено отслеживание байта состояния -; принтера (7..3 биты). При ошибке, функция возвращает байт состояния, а не -; печатаемый символ, как в фирменной версии. -; -; ;Добавлена функция #0C (tmp_filename) -; -; -; - - - -; Исправления: -; ~~~~~~~~~~~~ -; 1) В отличии от оригинала, функции 0Ah/0Bh (Create file/New create file) -; перед созданием файла проверяют на переполнение таблицу свободных -; дескрипторов. - -; 2) Убрано фирменное ограничение макс. длины строки переменной окружения -; в 32 символа и некорректная отработка функции #46 (в командах "path", -; "set"). Теперь макс. длина строки 255 символов. -; -; 3) Исправлена фирменная ошибка, при которой происходило зависание -; системы (непредсказуемое поведение) при превышении макс. числа -; открытых дескрипторов (функции search_handle, release_handle). -; -; 4) Исправлена фирменная ошибка, из-за которой в операциях с файлами не -; отслеживался атрибут "системный". -; -; 5) Исправлено не отслеживание атрибута файла "r/o" в функции #0E (удаление -; файла). -; -; 6) Пофиксен глюк вывода списка файлов, если число файлов в списке -; превышало 509. Сейчас список выводится корректно и может содержать -; макс. 510 файлов. Если число файлов в каталоге превышает 510, то выдается -; код ошибки 35 "слишком много файлов" (для списка каталогов выдается -; код ошибки 7 "каталог не найден"). -; -; 7) Пофиксен глюк "PrintScreen", выдававший скен-код #C7 клавиши и -; устанавливавший бит LShift-a. Версия ДОС стала 1.61.9. -; -; -; - - - - -; ДОС выделяется блок из 3 банок (функ. Init_DOS), используемых в качестве -; банок расширения. -; Исп. лог. номеров банок: -; 0 - кэш списка каталога -; 1 - кэш FAT -; 2 - path-переменная (запуск файла) и др. переменные окружения, а также -; сохранение текст. экрана при переключении в граф. режим -; ;3 - страница структуры tsr-обработчиков (моя) -; -; -; -; -; - - - - - - include "dos.inc" - - - - org 0000h - - - -;RST 00h -L0000: jp Func_41 ; заглушка (завершить программу) -D0003: db -1 ; D0=сигнал переполн. буфера клавы, D1=сигнал перекл. на альт.раскладку - db -1 - db -1 - db -1 - db -1 - -;RST 08h, Вызов функций Биоса - push af - ld a,0 ; вкл. ПЗУ Биоса в 0-е окно - out (7Ch),a - pop af - ret - db -1 - -;RST 10h - jp A006C ; вектор ДОС-а - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 18h - jp drv_devices ; вектор дисковых устройств - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 20h, свободный - jp empty__ ; заглушка - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 28h, свободный - jp empty__ ; заглушка - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 30h - jp MOUSE_vector ; вектор мышки - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 38h - jp $+3 - push af - ex af,af' - push af - push bc - push de - push hl - exx - push bc - push de - push hl - push ix - push iy - call keyb_scan ; обработчик клавиатуры - ld c,80h ; обработчик аппаратн. прерыв. мышки - rst 30h - call cursor_interrupt ; вектор обслуж. курсора - pop iy - pop ix - pop hl - pop de - pop bc - exx - pop hl - pop de - pop bc - pop af - ex af,af' - pop af - ei - reti - - db -1 ;,-1,-1,-1 ; на границу 0064h - -;0064h - retn - db 0 ; 0066h (от немаск. прерывания в IM0) - db 0 - db 0 - jp $-5 - - -;------------------------------------------------- -; ДОС-овый вектор -;------------------------------------------------- -A006C: push hl - ld l,c ; номер команды - ld h,T0200 / 256 ; 0200h..02FFh массив мл.байтов адресов - ld c,(hl) ; загр. мл.байт адреса - inc h ; 0300h..03FFh массив ст.байтов адресов - ld h,(hl) ; загр. ст.байт адреса - ld l,c ; готовый адрес - ex (sp),hl ; в стек и - ret ; перейти на него - - - -; Вектор обслуживания курсора -cursor_interrupt: - ld a,(curs_inv_flag) - or a - ret z - ;di ;поставил - db 3Eh ; ld a,.. -curs_timer: - db 1 ; пауза мигания - dec a - call z,cursor - ld (curs_timer),a - ret - - - -; Начало boot-сектора -T0076: ds 3 ; 3 байта, код перехода на загрузчик -; 8 байт, OEM ID - db "DSS_" - db major_version + "0" - db "." - db (minor_version / 10) + "0" - db (minor_version % 10) + "0" -; BPB, 17 байт -D0081: dw 512 ;+11 ; байтов на сектор -D0083: db 2 ;+13 ; секторов на кластер - dw 1 ;+14 ; зарезерв. секторов -D0086: db 2 ;+16 ; число копий FAT-ов - dw 112 ;+17 ; записей в корне - dw 1440 ;+19 ; # всех секторов на диске - db 0F0h ;+21 ; байт формата -D008C: dw 2 ;+22 ; # секторов на FAT - dw 9 ;+24 ; секторов на сторону -D0090: dw 2 ;+26 ; кол-во сторон диска -; extended boot-record - dw 0,0 ;+28,+30 ; скрытых секторов - dw 0,0 ;+32,+34 ; всех секторов на диске - dw 80h ;+36 ; 0x00 физ. номер диска - db 29h ;+38 ; сигнатура расш. boot-записи - dw 0,0 ;+39,+41 ; серийный номер диска - db "NO NAME " -T00AC: db "FAT16 " - - - -;----------------------------------------------------------- -; Настройка знакогенератора курсора черточкой -;----------------------------------------------------------- -setup_znak: - in a,(0C2h) - push af ; сохр. порт - ld a,(list_dos_pages+2) ; 2-й лог. номер страницы расш. ДОС - out (0C2h),a - ; получить сист. знакоген. - ld de,8000h ; буфер для 2048 байт данных - push de - ld c,0B8h ; получить знакоген. - rst 08h - ; заполнить кодом 0FFh 2 нижние линии - ld hl,8000h+(2048-(2*256)) ; последние 512 байт - ld bc,511 - ld a,1Ah; ; номер знакоген. "черточка" - call fill_data_font - pop hl - ; заполнить остальные 6 линий (полный блок) - ld bc,2048-513 - ld a,19h; ; номер знакоген. "блок" - call fill_data_font - pop af - out (0C2h),a ; восст. порт - ret - -; Настройка знакоген. и его регистрация -; вход: a=номер знакоген. -; hl=данные -; bc=размер данных -fill_data_font: - ld e,l - ld d,h - ld (hl),-1 - inc de - ldir - ld de,8000h ; знакоген. - ld c,0B6h ; уст. знакоген. - rst 08h - ret - - - - ;ds 100h - $ ; выровнить на границу #0100 -L0100 equ $+100h AND 0FF00h - ds L0100 - $ - - - -;0100h. Массив списка выдел. страниц -list_pages: - ds 256 - - - -; Младшие разряды адресов функций -T0200: db Init_DOS%256, Func_01%256, Func_02%256, Func_03%256 ; 00..03 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 04..07 - db Func_08%256, Func_09%256, Func_0A%256, Func_0B%256 ; 08..0B - db Func_0C%256, empty__%256, Func_0E%256, empty__%256 ; 0C..0F - db Func_10%256, Func_11%256, Func_12%256, Func_13%256 ; 10..13 - db Func_14%256, Func_15%256, Func_16%256, Func_17%256 ; 14..17 - db Func_18%256, Func_19%256, Func_1A%256, Func_1B%256 ; 18..1B - db Func_1C%256, Func_1D%256, Func_1E%256, empty__%256 ; 1C..1F - db empty__%256, Func_21%256, Func_22%256, empty__%256 ; 20..23 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 24..27 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 28..2B - db empty__%256, empty__%256, empty__%256, empty__%256 ; 2C..2F - db Func_30%256, Func_31%256, Func_32%256, Func_33%256 ; 30..33 - db empty__%256, Func_35%256, Func_36%256, Func_37%256 ; 34..37 - db Func_38%256, Func_39%256, Func_3A%256, Func_3B%256 ; 38..3B - db Func_3C%256, Func_3D%256, Func_3E%256, Func_3F%256 ; 3C..3F - db Func_40%256, Func_41%256, Func_42%256, Func_43%256 ; 40..43 - db Func_44%256, Func_45%256, Func_46%256, Func_47%256 ; 44..47 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 48..4B - db empty__%256, empty__%256, empty__%256, empty__%256 ; 4C..4F - db Func_50%256, Func_51%256, Func_52%256, Func_53%256 ; 50..53 - db Func_54%256, Func_55%256, Func_56%256, Func_57%256 ; 54..57 - db Func_58%256, Func_59%256, Func_5A%256, Func_5B%256 ; 58..5B - db Func_5C%256, empty__%256, empty__%256, Func_5F%256 ; 5C..5F - db empty__%256, empty__%256, empty__%256, empty__%256 ; 60..63 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 64..67 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 68..6B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 6C..6F - db A0000%256, A0000%256, A0000%256, A0000%256 ; 70..73 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 74..77 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 78..7B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 7C..7F - db A0000%256, A0000%256, A0000%256, A0000%256 ; 80..83 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 84..87 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 88..8B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 8C..8F - db A0000%256, A0000%256, A0000%256, A0000%256 ; 90..93 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 94..97 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 98..9B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 9C..9F - db A0000%256, A0000%256, A0000%256, A0000%256 ; A0..A3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; A4..A7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; A8..AB - db A0000%256, A0000%256, A0000%256, A0000%256 ; AC..AF - db A0000%256, A0000%256, A0000%256, A0000%256 ; B0..B3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; B4..B7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; B8..BB - db A0000%256, A0000%256, A0000%256, A0000%256 ; BC..BF - db A0000%256, A0000%256, A0000%256, A0000%256 ; C0..C3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; C4..C7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; C8..CB - db A0000%256, A0000%256, A0000%256, A0000%256 ; CC..CF - db A0000%256, A0000%256, A0000%256, A0000%256 ; D0..D3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; D4..D7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; D8..DB - db A0000%256, A0000%256, A0000%256, A0000%256 ; DC..DF - db A0000%256, A0000%256, A0000%256, A0000%256 ; E0..E3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; E4..E7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; E8..EB - db A0000%256, A0000%256, A0000%256, A0000%256 ; EC..EF - db empty__%256, empty__%256, empty__%256, empty__%256 ; F0..F3 - db empty__%256, empty__%256, empty__%256, empty__%256 ; F4..F7 - db empty__%256, empty__%256, empty__%256, empty__%256 ; F8..FB - db empty__%256, empty__%256, empty__%256, empty__%256 ; FC..FF - -;0300h. Старшие разряды адресов функций - db Init_DOS/256, Func_01/256, Func_02/256, Func_03/256 ; 00..03 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 04..07 - db Func_08/256, Func_09/256, Func_0A/256, Func_0B/256 ; 08..0B - db Func_0C/256, empty__/256, Func_0E/256, empty__/256 ; 0C..0F - db Func_10/256, Func_11/256, Func_12/256, Func_13/256 ; 10..13 - db Func_14/256, Func_15/256, Func_16/256, Func_17/256 ; 14..17 - db Func_18/256, Func_19/256, Func_1A/256, Func_1B/256 ; 18..1B - db Func_1C/256, Func_1D/256, Func_1E/256, empty__/256 ; 1C..1F - db empty__/256, Func_21/256, Func_22/256, empty__/256 ; 20..23 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 24..27 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 28..2B - db empty__/256, empty__/256, empty__/256, empty__/256 ; 2C..2F - db Func_30/256, Func_31/256, Func_32/256, Func_33/256 ; 30..33 - db empty__/256, Func_35/256, Func_36/256, Func_37/256 ; 34..37 - db Func_38/256, Func_39/256, Func_3A/256, Func_3B/256 ; 38..3B - db Func_3C/256, Func_3D/256, Func_3E/256, Func_3F/256 ; 3C..3F - db Func_40/256, Func_41/256, Func_42/256, Func_43/256 ; 40..43 - db Func_44/256, Func_45/256, Func_46/256, Func_47/256 ; 44..47 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 48..4B - db empty__/256, empty__/256, empty__/256, empty__/256 ; 4C..4F - db Func_50/256, Func_51/256, Func_52/256, Func_53/256 ; 50..53 - db Func_54/256, Func_55/256, Func_56/256, Func_57/256 ; 54..57 - db Func_58/256, Func_59/256, Func_5A/256, Func_5B/256 ; 58..5B - db Func_5C/256, empty__/256, empty__/256, Func_5F/256 ; 5C..5F - db empty__/256, empty__/256, empty__/256, empty__/256 ; 60..63 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 64..67 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 68..6B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 6C..6F - db A0000/256, A0000/256, A0000/256, A0000/256 ; 70..73 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 74..77 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 78..7B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 7C..7F - db A0000/256, A0000/256, A0000/256, A0000/256 ; 80..83 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 84..87 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 88..8B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 8C..8F - db A0000/256, A0000/256, A0000/256, A0000/256 ; 90..93 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 94..97 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 98..9B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 9C..9F - db A0000/256, A0000/256, A0000/256, A0000/256 ; A0..A3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; A4..A7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; A8..AB - db A0000/256, A0000/256, A0000/256, A0000/256 ; AC..AF - db A0000/256, A0000/256, A0000/256, A0000/256 ; B0..B3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; B4..B7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; B8..BB - db A0000/256, A0000/256, A0000/256, A0000/256 ; BC..BF - db A0000/256, A0000/256, A0000/256, A0000/256 ; C0..C3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; C4..C7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; C8..CB - db A0000/256, A0000/256, A0000/256, A0000/256 ; CC..CF - db A0000/256, A0000/256, A0000/256, A0000/256 ; D0..D3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; D4..D7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; D8..DB - db A0000/256, A0000/256, A0000/256, A0000/256 ; DC..DF - db A0000/256, A0000/256, A0000/256, A0000/256 ; E0..E3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; E4..E7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; E8..EB - db A0000/256, A0000/256, A0000/256, A0000/256 ; EC..EF - db empty__/256, empty__/256, empty__/256, empty__/256 ; F0..F3 - db empty__/256, empty__/256, empty__/256, empty__/256 ; F4..F7 - db empty__/256, empty__/256, empty__/256, empty__/256 ; F8..FB - db empty__/256, empty__/256, empty__/256, empty__/256 ; FC..FF - - - - - -; буфер 512 байт -T0400: db ". ",10h,0,0,0,0 ; тек. каталог - ds 16 - db ".. ",10h,0,0,0,0 ; родит. каталог - ds 16 - ds 448 - - -;T0600. Выровнить на границу xx00h - - include "keyb.asm" ; включает "init_DOS" - - - -;///////////////////////////////////////////////////////////////////// -; Функция #56. Очистить окно. -; -; вход: D - строка левого верхнего угла окна -; E - столбец левого верхнего угла окна -; H - высота окна -; L - ширина окна -; A - символ заполнитель -; B - атрибут заполнитель -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_56:ld c,8Dh ; очистка экрана указ. символом - rst 08h - and a - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5C. Вывод строки на экран. -; -; вход: HL - указатель на строку символов -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_5C:ld a,(hl) - inc hl - or a - ret z - call Func_5B ; вывод "a" на экран - jr Func_5C - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5B. Вывод символа на экран в тек. позиции. -; -; вход: A - символ -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_5B: - cp " " - jr nc,A0DFC - cp 0Dh ; в начало строки - jr z,A0E20 - cp 0Ah ; на след. строку - jr z,A0E28 - cp 9 ; Tab - jr z,A0E0F - cp 8 ; Backspace - jr z,A0E03 -A0DFC: push hl - ld bc,0182h ; вывести один символ без атрибута - rst 08h - pop hl - ret - -; Backspace -A0E03: ld c,8Eh ; узнать полож. курсора - rst 08h - xor a - cp e - jp z,Func_52 ; уст. полож. курсора - dec e - jp Func_52 ; уст. полож. курсора - -; Tab -A0E0F: ld c,8Eh ; узнать полож. курсора - rst 08h - ld a,e - and 0F8h - add a,8 - ld e,a ; X полож. курсора - jp Func_52 ; уст. полож. курсора - -; 0Dh - в начало строки -A0E20: ld c,8Eh ; узнать полож. курсора - rst 08h - ld e,0 - jp Func_52 ; уст. полож. курсора - -; 0Ah - на след. строку -A0E28: ld c,8Eh ; узнать полож. курсора - rst 08h - ld a,d - cp 31 - jr nc,A0E35 - inc d - jp Func_52 ; уст. полож. курсора - ; -A0E35: push hl - push de - ld bc,018Ah ; скроллинг вверх - ld de,0020h ; нач./число строк - ei - halt - di - rst 08h - ld de,1F00h ; Y/X полож. нижней строки - call Func_52 ; уст. полож. курсора - ld a," " ; символ - ld bc,5082h ; вывести 80 симв. - rst 08h - ei - pop de - call Func_52 ; уст. полож. курсора - pop hl - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #52. Установить положение курсора. -; -; вход: D - строка курсора -; E - колонка курсора -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_52:ld c,84h ; уст. полож. курсора - rst 08h - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #53. Узнать положение курсора. -; -; вход: нет -; выход: D - строка курсора -; E - колонка курсора -;///////////////////////////////////////////////////////////////////// -Func_53:ld c,8Eh ; узнать полож. курсора - rst 08h - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #57. Прочитать символ с экрана. -; -; вход: D - строка -; E - колонка -; выход: A - символ -; B - атрибут -;///////////////////////////////////////////////////////////////////// -Func_57:xor a - ld c,0B4h - rst 08h - ld a,l - ld b,h - and a - ret - -;///////////////////////////////////////////////////////////////////// -; Функция #58. Вывести символ на экран. -; Управляющие символы выводятся как обычные символы. -; -; вход: D - строка -; E - колонка -; A - символ -; B - атрибут -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_58:ld c,a - push bc - push de - ld c,0B4h ; символ с экрана - xor a - rst 08h - pop de - pop hl - ld c,0B5h ; символ на экран - xor a - rst 08h - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #59. Сохранить окно экрана. -; -; вход: D - строка -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B - страница буфера -; IX - адрес буфера -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_59:ld a,r ; во флаг P/V сост. триггера разреш. прерываний - push af - xor a - di - ld c,0B2h - rst 08h - pop af ; восст. флаг - scf - ccf - ret po ; прерывания разрешены - ei - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5A. Восстановить окно экрана. -; -; вход: D - строка -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B - страница буфера -; IX - адрес буфера -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_5A:ld a,r ; во флаг P/V сост. триггера разреш. прерываний - push af - xor a - di - ld c,0B3h - rst 08h - pop af - scf - ccf - ret po ; прерывания разрешены - ei - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #55. Скроллинг экрана. -; -; вход: D - строка левого верхнего угла окна -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B = 1 - прокрутка вверх -; B = 2 - прокрутка вниз -; A = 0 - очищать строку -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_55: djnz A0EBA - ld b,a - ld c,h - push bc - push de - push hl - LD XH,D - LD XL,E - inc d - dec h - xor a - ld c,0B7h ; перемещ. окна - di - rst 08h - ei - pop hl - pop de - pop bc - xor a - cp b - ret nz ; не очищать строку - ld a,d - add a,h - dec a - ld d,a -A0EAA: push de - call Func_52 ; уст. полож. курсора - ld a," " - ld b,l - ld c,82h - rst 08h - pop de - call Func_52 ; уст. полож. курсора - and a - ret - ; -A0EBA: djnz A0EE0 - ld b,a - ld c,l - push de - push bc - db 0DDh - ld h,d - db 0DDh - ld l,e - db 0DDh - inc h - dec h - xor a - ld c,0B7h - di - rst 08h - ei - pop hl - pop de - xor a - cp b - jr z,A0EAA ; очистить строку - ret - ; -A0EE0: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #54. Выбрать активную страницу экрана. -; -; вход: B - страница экрана 0/1 -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_54:push bc - ld a,(mode_screen) ; тек. режим экрана - bit 7,a - jr nz,A0EF0 - ld c,a - call A0F04 -A0EF0: pop bc - ld a,b - and 1 - out (0C9h),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #51. Получить текущий режим экрана. -; -; вход: нет -; выход: A - текущий режим экрана -; B - страница экрана 0/1 -;///////////////////////////////////////////////////////////////////// -Func_51:in a,(0C9h) ; страница экрана 0/1 - ld b,a - ld a,(mode_screen) ; тек. режим экрана - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #50. Выбор режима экрана. -; -; вход: A - режим экрана -; 02h - текстовый 40x32x16 цветов -; 03h - текстовый 80x32x16 цветов -; 81h - графический 320x256x256 цветов -; 82h - графический 640x256x16 цветов -; B - страница экрана 0/1 -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_50:bit 7,a - ld c,a - jr nz,A0F27 ; уст. граф. режимы -A0F04: ld ix,A1080 ; точка выхода (восст. экран граф. режима) - push ix - ex af,af' - ld a,(mode_screen) ; тек. режим экрана - ld (A1081+1),a - ex af,af' - inc a ; a=0 - dec a - jr z,A0F21 - dec a ; a=1 - jr z,A0F21 - dec a ; a=2 - jr z,A0F3F - dec a ; a=3 - jr z,A0F67 -A0F21: pop ix ; восст. баланс стека (заодно ix) - ld a,EERR48 ; код "ошибка 48" - scf - ret - -; Установка граф. режимов -A0F27: call A1042 ; сохр. экран текст. режима - and 7Fh - jp z,A0F8F ; a=80h - dec a ; a=81h - jp z,A0F93 - dec a ; a=82h - jp z,A0FBA - dec a ; a=83h - jp z,A0FE1 - ld a,EERR48 ; код "ошибка 48" - scf - ret - -; Уст. текст. режим 40x32. -A0F3F: push bc - ; текстовое, 8 точек/знакоместо, #0B - номер знакоген. - ld hl,T101A ; описатель окна (8 байт) - ld a,b - rlca - rlca - rlca - rlca - or b - and 11h - xor 10h - ld e,a ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h - rst 30h - ld a,0C0h - out (89h),a - xor a - ret - -; Уст. текст. режим 80x32. -A0F67: push bc - ; текстовое, 16 точек/знакоместо, #0B - номер знакоген. - ld hl,T1012 ; описатель окна (8 байт) - ld a,b - rlca - rlca - rlca - rlca - or b - and 11h - xor 10h - ld e,a ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h ; режим экрана для мышки - rst 30h - ld a,0C0h ; закр. спек-экран - out (89h),a - xor a - ret - ; -A0F8F: ld a,EERR48 ; код "ошибка 48" - scf - ret - ; -A0F93: push bc - ; графическое, 8 точек/знакоместо, 0-й экран - ld hl,T102A ; описатель окна (8 байт) - ld e,11h ; флаги окна - call open_window - ; графическое, 8 точек/знакоместо, 1-й экран - ld hl,T103A ; описатель окна (8 байт) - ld e,0 ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h - rst 30h - ld a,0C0h - out (89h),a - xor a - ret - -A0FBA: push bc - ; графическое, 16 точек/знакоместо, 0-й экран - ld hl,T1022 ; описатель окна (8 байт) - ld e,11h ; флаги окна - call open_window - ; графическое, 16 точек/знакоместо, 1-й экран - ld hl,T1032 ; описатель окна (8 байт) - ld e,0 ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h - rst 30h - ld a,0C0h - out (89h),a - xor a - ret - -A0FE1: ld a,EERR48 ; код "ошибка 48" - scf - ret - - -; тек. режим экрана -mode_screen: - db 3 ; 80x32x16 текстовый - - - -;------------------------------------------------- -; Открыть окно -; вход: hl=описатель окна -; e=флаги окна -;------------------------------------------------- -open_window: - push de - ld de,LFEE0 ; куда - ld bc,32 ; размер описателя (8..31 зарез.) - call A1001 ; скопир. описатель в сист. страницу - pop de - ld ix,LFEE0 ; описатель окна (8 байт) - ld c,0B0h ; откр. окно - rst 08h - ld a,0C0h ; закр. спек-экран - out (89h),a - xor a - ret - - -;----------------------------------------------------- -; Скопировать описатель окна в сист. страницу Биоса -; вход: hl=откуда -; de=куда -; bc=сколько -;----------------------------------------------------- -A1001: ld a,r ; во флаг P/V сост. триггера разреш. прерываний - in a,(0E2h) - ex af,af' ; сохр. флаг - ld a,0FEh ; страница переменных Биоса - out (0E2h),a - ldir - ex af,af' ; восст. флаг - out (0E2h),a - ret po ; прерывания разрешены - ei - ret - - - -;----------------------------------------------------------- -; Массив описателей окон -; -; флаги окна: -; bit4 = 1/0 - text/graf режим -; bit5 = 1/0 - 8/16 точек в знакоместе -; graf_mode bit3..0 - не исп. -; bit7..6 - номер палитры (номер экрана) -; text_mode bit7..6, 3..0 - номер знакогенератора -; исключение: bit7..6="11" -> бордер -;----------------------------------------------------------- - -; 80x32. текстовое, 16 точек/знакоместо, #0B - номер знакоген. -T1012: db 40 ;+0 X размер окна в знакоместах - db 32 ;+1 Y размер окна в знакоместах - db 0 ;+2 X полож. окна на экране - db 0 ;+3 Y полож. окна на экране - db 00011011b ;+4 режим знакоместа - db 0 ;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) - db 0 ;+6 X полож. в поле графики (в знакоместах) - db 0 ;+7 Y полож. в поле графики (в знакоместах) - -; 40x32. текстовое, 8 точек/знакоместо, #0B - номер знакоген. -T101A: db 40,32 ; X/Y габариты - db 0,0 - db 00111011b ;+4 5,4, bit3..0 номер знакоген. - db 0,0,0 - -; графическое, 16 точек/знакоместо, 0-й экран -T1022: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 00000000b ;+4 - db 0,0,0 - -; графическое, 8 точек/знакоместо, 0-й экран -T102A: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 00100000b ;+4 5-й бит - db 0,0,0 - -; графическое, 16 точек/знакоместо, 1-й экран -T1032: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 01000000b ;+4 6-й бит - db 0 - db 40 ;+6 X полож. в поле графики (в знакоместах) - db 0 - -; графическое, 8 точек/знакоместо, 1-й экран -T103A: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 01100000b ;+4 6,5 биты - db 0 - db 40 ;+6 X полож. в поле графики (в знакоместах) - db 0 - - -;-------------------------------------------------- -; Сохранить экран текст. режима. -; Для буфера экрана исп. 2-я банка расширения ДОС. -;-------------------------------------------------- -A1042: push af - ld a,(mode_screen) ; тек. режим экрана - bit 7,a - jr nz,A107E ; граф. режим - sub 2 - jr c,A107E ; меньше 02h - push bc - push de - push hl - push ix - push af - ld c,8Eh ; узнать полож. курсора - rst 08h - ld (A10A0+1),de - pop af ; режим экрана - ld ix,LC000 ; буфер - ld de,0000h ; Y/X полож. - ld hl,2050h ; Y/X размер (32x80) - or a - jr nz,$+4 ; 80x32 текст. режим - ld l,40 ; X размер - ld (A1090+1),hl - ld a,(list_dos_pages+2) ; номер банки расширения ДОС - ld b,a - xor a - ld c,0B2h ; с экрана в буфер - di - rst 08h - ei - pop ix - pop hl - pop de - pop bc -A107E: pop af - ret - - -;------------------------------------------------- -; Восстановить экран граф. режима. -; Буфер экрана во 2-й банке расширения ДОС. -;------------------------------------------------- -A1080: push af -A1081: ld a,0 ; тек. режим экрана - rlca ; 4 такта - jr nc,A10AB ; текстовый - push bc - push de - push hl - push ix - ld ix,LC000 ; буфер - ld de,0000h ; Y/X полож. -A1090: ld hl,2050h ; Y/X размер (32x80 или 32x40) - ld a,(list_dos_pages+2) ; номер банки расширения ДОС - ld b,a - xor a - ld c,0B3h ; из буфера на экран - di - rst 08h - ei -A10A0: ld de,0 ; Y/X полож. - ld c,84h ; уст. курсор - rst 08h - pop ix - pop hl - pop de - pop bc -A10AB: pop af - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5F. Вывод символа на принтер без ожидания. -; -; Интерпретация байта состояния принтера: -; 0..2 - не используются, обычно уст. в "1" -; 3 - ошибка принтера - есть/нет (1/0) -; 4 - принтер подключен/не подключен (1/0) -; 5 - бумаги нет/есть (1/0) -; 6 - принтер готов/выводит очередной символ (1/0) -; 7 - принтер свободен/занят (1/0) -; -; вход: A - символ -; выход: B - символ -; CF - ошибка, A=байт состояния (биты 7..3) -;///////////////////////////////////////////////////////////////////// -Func_5F:ld b,a - ld a,r ; во флаг P/V сост. триггера разреш. прерываний - ld a,b - di - push af ; сохр. флаг - xor a - out (1Bh),a - ld a,10h - out (1Bh),a - xor a - out (1Bh),a - in a,(1Bh) ; порт состояния принтера - ld c,a; - bit 5,a ; 0/1 есть/нет бумага - jr nz,A10CC ; нет бумаги - and 11011000b; - jr z,A10CC; ; ошиб. ситуация - ld a,b - out (1Ch),a ; символ в принтер - pop af ; восст. флаг - scf - ccf ; сбр. CF - ret po ; прерывания разрешены - ei - ret - ; -A10CC: pop af - ld a,c; ; байт состояния - scf ; уст. CF - ret po ; прерывания разрешены - ei - ret - - - -; Иниц. портов -A10D1: di - ld a,0CFh - ld bc,001Fh ; порт - out (c),a - ld a,63h - out (c),a - ld a,0C0h - out (1Eh),a - ld a,0Fh - out (1Dh),a - ld a,0 - out (19h),a - ld a,0 - out (19h),a - ld a,5 - out (19h),a - ld a,62h - out (19h),a - ret - - -; Установить начальный кластер для чтения -A10F6: ld hl,1 - ld (A10FD+1),hl - ret - - -A10FD: ld hl,1 -A1100: inc hl ; номер кластера - call A1132 ; прочитать из кеша FAT-а номер след. кластера - cp 0Ah - scf - ret z ; ошибка ? - ld a,d - or e - jr nz,A1100 - ld (A10FD+1),hl - xor a - ret - - -A1111: push hl - call A10FD - pop de - ret c - push hl - push hl - ex de,hl ; hl=номер кластера -A111A: call A1132 ; прочитать из кеша FAT-а номер след. кластера - ex de,hl - jr nc,A111A ; не конец цепочки - ex de,hl - pop de ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - pop hl - ld de,(D150E) ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - call A128B ; подкл. банку кеша FAT и записать его на диск - and a - ret - - -;----------------------------------------------------------- -; Прочитать из кеша FAT-а номер след. кластера -; вход: hl=номер кластера -; выход: hl=номер кластера -; de=номер след. кластера -; CF - конец цепочки -;----------------------------------------------------------- -A1132: ex de,hl - ld hl,(D12FF) - and a - sbc hl,de - ex de,hl - ld a,0Ah - ret c - exx - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - exx - push hl - push af ; старая банка порта - ld a,(D150B) - cp "2" ; fat12 - jr z,A1177 - ; fat16, просто читать след. номер - ld a,h - ld b,a - and 0Fh - ld h,a - ld a,b - rrca - rrca - rrca - rrca - and 0Fh - add hl,hl - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; начало кеша FAT-а - add hl,de ; на ячейку FAT - ld e,(hl) ; прочитать номер кластера - inc hl - ld d,(hl) - pop af - out (0E2h),a ; восст. порт - ld hl,0FFEFh - ;and a ;@@ - xor a; - sbc hl,de ; проверка на служ. кластеры - pop hl - ;ld a,0 - ret -; fat12 -A1177: ld d,h - ld e,l - add hl,hl - add hl,de - rr h ; сдвиг вправо через CF - rr l - push af ; сохр. флаг - ld a,h - ld b,a - and 1Fh - ld h,a - ld a,b - rlca - rlca - rlca - and 7 - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; начало кеша FAT-а - add hl,de ; на ячейку FAT - pop af ; восст. флаг - ld e,(hl) - inc hl - ld d,(hl) - jr c,A11A3 ; номер не четный - ld a,d - and 0Fh - ld d,a - jr A11B7 - ; -A11A3: ld a,e - and 0F0h - ld e,a - rr d ; вправо на 4 битa - rr e - rr d - rr e - rr d - rr e - rr d - rr e -A11B7: pop af ; восст. порт - out (0E2h),a - ld hl,0FEFh - ;and a - xor a; - sbc hl,de ; проверка на служ. кластеры - pop hl - ;ld a,0 - ret - - -;----------------------------------------------------------- -; Записать в кеш FAT-а номер кластера -; вход: de=номер кластера -; hl=номер первого кластера ? -; выход: ;hl=номер след. кластера ? -; de=номер кластера -;----------------------------------------------------------- -A11C4: push de - ex de,hl - ld hl,(D12FF) - and a - sbc hl,de - ex de,hl - pop de - ld a,0Ah - ret c - exx - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - exx - push hl - push af ; старая банка порта - ld a,1 - ld (D12FE),a - ld a,(D150B) - cp "2" ; fat12 - jr z,A120B - ; fat16, просто сохр. номер - push de - ld a,h - ld b,a - and 0Fh - ld h,a - ld a,b - rrca - rrca - rrca - rrca - and 0Fh - add hl,hl - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; кеш FAT - add hl,de ; на ячейку FAT - pop de - ld (hl),e ; сохр. в кеше FAT-а - inc hl ; номер кластера - ld (hl),d ; - pop af ; восст. порт - pop hl - out (0E2h),a - xor a - ret -; fat12 -A120B: push de - ld d,h - ld e,l - add hl,hl - add hl,de - rr h - rr l - push af ; сохр. флаг - ld a,h - ld b,a - and 1Fh - ld h,a - ld a,b - rlca - rlca - rlca - and 7 - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; кеш FAT - add hl,de - pop af - pop de - jr c,A123E ; номер не четный - ld (hl),e - inc hl - ld a,(hl) - and 0F0h - or d - ld (hl),a - pop af ; восст. порт - pop hl - out (0E2h),a - and a - ret - ; -A123E: sla e ; влево на 4 битa - rl d - rl e - rl d - rl e - rl d - rl e - rl d - ld a,(hl) - and 0Fh - or e - ld (hl),a ; сохр. в кеше FAT-а - inc hl ; номер кластера - ld (hl),d ; - pop af ; восст. порт - pop hl - out (0E2h),a - and a - ret - - -; Прочитать в кеш 16 секторов FAT-а -; вход: a=.. ? -A125B: push hl - push af - ld a,(D12FE) - or a - call nz,A129A ; запись кеша (всего ?) FAT-а на диск - pop af - ld l,a - ld h,0 - ld (D12FD),hl - add hl,hl ;1+1=2 - add hl,hl ;2+2=4 - add hl,hl ;4+4=8 - add hl,hl ;8+8=16 - ld de,(D14FC) - add hl,de - ex de,hl - ld ix,0 - add ix,de ; номер лог. сектора - ld hl,0 ; ст. разряд - ld de,LC000 ; куда (кеш FAT) - ld a,(disk) ; номер диска - ld b,16 ; число секторов - ld c,5 ; чтение секторов - rst 18h - pop hl - ret - - - -; Подключить банку кеша FAT и записать его на диск -A128B: exx - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - exx - push af ; старая банка порта - call A129A ; запись кеша (всего ?) FAT-а на диск - pop af - out (0E2h),a ; восст. порт - ret - -; Запись кеша (всего ?) FAT-а на диск -A129A: ld hl,(D12FD) - ld h,0 - ld (D12FD),hl - add hl,hl ;1+1=2 - add hl,hl ;2+2=4 - add hl,hl ;4+4=8 - add hl,hl ;8+8=16 - push hl - ld b,h - ld c,l - ld de,16 - add hl,de - ld de,(D008C) ; секторов на FAT - ld a,16 ; число секторов - and a - sbc hl,de - jr c,A12C3 - ex de,hl - ld hl,16 - sbc hl,de - jr c,A12FA - ld a,l -A12C3: ld h,b - ld l,c - ld de,(D14FC) - add hl,de - ex de,hl - ld ix,0 - add ix,de ; номер лог. сектора - ld hl,0 ; ст. разряд - ld de,LC000 ; откуда (кеш FAT) - ld b,a ; число секторов - ld c,6 ; запись секторов - ld a,(disk) ; номер диска - push bc - rst 18h - pop bc ; b=число секторов - pop hl - ld de,(D14FE) - add hl,de - ex de,hl - ld ix,0 - add ix,de ; номер лог. сектора - ld de,LC000 ; откуда (кеш FAT) - ld hl,0 ; ст. разряд - ld a,(disk) ; номер диска - ld c,6 ; запись секторов - rst 18h - ret - ; -A12FA: pop hl - scf - ret - - -D12FD: db 0 -D12FE: db 0 -D12FF: dw 0FF0h ; макс. число кластеров FAT12 (без служ.) - - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #00. Версия ДОС. -; Возвращает номер версии дисковой системы. -; вход: нет -; выход: DE=номер версии/модификации -; BC=номер билда (0..999) -;///////////////////////////////////////////////////////////////////// - -Func_00:xor a - ld de,(major_version SHL 8) + minor_version ; 1.61 версия ДОС - ld bc,build_version ; номер билда - ld h,a - ld l,a - ret - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #01. Смена текущего диска. -; -; вход: A - номер диска (0=A,1=B,..) -; выход: A - макс. номер диска, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_01:push af ; номер девайса - ld c,1 ; открыть девайс - rst 18h - pop bc - jr c,A1323 ; ошибка - ld a,b - ld (disk),a ; номер тек. диска - call A1370 - ret c - ld a,(last_drive) ; номер послед. диска - and a - ret - ; -A1323: cp EINVDRV ; код "неверный номер устройства" - scf - ret z - ld a,ENORDY ; код "нет готовности" - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #02. Номер текущего диска. -; -; вход: нет -; выход: A - номер диска (0=A,1=B,..) -;///////////////////////////////////////////////////////////////////// -Func_02:ld a,(disk) - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #03. Информация о диске. -; Возвращает информацию об общем и свободном пространстве дискового -; устройства. -; -; вход: A - номер диска (0=A,1=B,..0FFh-текущий) -; выход: A - размер кластера в секторах, если CF=0 -; HL - общее кол-во кластеров -; DE - свободных кластеров -; BC - размер сектора в байтах -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_03:inc a - jr z,A1338 - dec a - call Func_01 ; смена текущего диска - ret c -A1338: ld hl,2 ; номер кластера - ld bc,0 -A133E: push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - pop bc - cp 0Ah - jr z,A1353 ; ошибка ? - xor a - cp e - jr nz,A134F - cp d - jr nz,A134F - inc bc -A134F: inc hl - jr A133E - ; -A1353: ld d,b ; свободных кластеров - ld e,c - ld hl,(D12FF) ; общее кол-во кластеров - dec hl - ld bc,(D0081) ; байтов на сектор (512) - ld a,(D0083) ; секторов на кластер - and a - ret - - -; Номер последнего диска в системе -last_drive: - db 2 ; "B" диск - ; список дисковых устройств ? - ds 5 - - - -; нет обращения -L1368: ld a,(disk) ; номер диска - ld c,3 ; проверка смены носителя в девайсе - rst 18h ; всегда выдает "менялся" - or a - ret z ; не менялся - ; -A1370: ld c,0E2h - in b,(c) - push bc - in a,(82h) - out (0E2h),a - ld de,LC400 ; буфер - ld a,(disk) ; номер диска - ld c,4 ; прочитать BPB - rst 18h - pop bc - out (c),b ; восст. порт - jp c,A14F0 ; ошибка (нет готовности) - push iy - ld de,0AA55h ; сигнатура - ld hl,(T0400+510) - and a - sbc hl,de - jp nz,A14EA ; ошибка "не известный формат" - ld hl,T0400 ; откуда - ld de,T0076 ; куда - ld bc,62 - ldir - ld iy,T0076 ; структура boot-сектора - ld a,(iy+21) - cp 0F0h ; байт формата - jp c,A14EA - ld hl,0 - ld e,(iy+14) ; de=зарезерв. секторов - ld d,(iy+15) - add hl,de - ld (D14FC),hl - ld (D14FC),hl - ld (D14FE),hl - ld e,(iy+22) ; de=число секторов на FAT - ld d,(iy+23) - ld a,(D0086) ; число копий FAT-ов - cp 1 - jr z,A13D2 - dec a - add hl,de - ld (D14FE),hl -A13D2: add hl,de - dec a - jr nz,A13D2 - ld (D1502),hl - ld c,(iy+11) ; bc=байтов на сектор - ld b,(iy+12) - rl c - rl b - rl c - rl b - rl c - rl b - ld c,b - ld b,0 - ld a,c - ld (D1504),a - ld e,(iy+17) ; de=записей в корне - ld d,(iy+18) - ex de,hl - dec hl - xor a -A13FB: inc a - jp z,A14EA - sbc hl,bc - jr nc,A13FB - ex de,hl - ld c,a - ld b,0 - ld (D1505),a - add hl,bc - ld (D1506),hl - ld c,(iy+11) ; bc=байтов на сектор - ld b,(iy+12) - ld hl,0 - ld a,(D0083) ; число секторов на кластер -A141A: add hl,bc - dec a - jr nz,A141A - ld (D1508),hl ; размер блока "секторов на кластер" - ex de,hl - ld hl,4000h-1 ; константа - xor a -A1426: inc a - jp z,A14EA - sbc hl,de - jr nc,A1426 - ld (D150A),a - ld hl,T00AC ; "FAT16 " - ld de,T14F4 ; "FAT" - ld b,3 -A1439: ld a,(de) - cp (hl) - jp nz,A14D1 - inc hl - inc de - djnz A1439 -A1442: ld a,(hl) - inc hl - cp " " - jr z,A1442 - cp "1" - jp nz,A14EA - ld a,(hl) - cp "6" - ld hl,0FFFFh ; ячейка FAT16 - jr z,A145D - cp "2" - jp nz,A14EA - ld hl,0FFFh ; ячейка FAT12 -A145D: ld (D150B),a ; "2"/"6" fat12/fat13 - ld (D150E),hl - ld hl,0 - ld c,(iy+24) ; bc=секторов на сторону - ld b,(iy+25) - ld a,(D0090) ; кол-во сторон диска -A146F: add hl,bc - dec a - jr nz,A146F - ld (D150C),hl - ld de,(D1506) - ld l,(iy+19) ; hl=всех секторов на диске - ld h,(iy+20) - ld a,h - or l - jr nz,A149B - ; extended boot-record - ld l,(iy+32) ; hl=мл.разряд всех секторов на диске - ld h,(iy+33) ; - ld c,(iy+34) ; bc=ст.разряд - ld b,(iy+35) ; - sbc hl,de - jr nc,A14A1 - dec bc - jr A14A1 - ; -A149B: sbc hl,de - ld bc,0 -A14A1: ld a,(D0083) ; секторов на кластер - scf -A14A5: rra - jr c,A14B3 - rr b - rr c - rr h - rr l - jr A14A5 - ; -A14B3: inc hl - ld (D12FF),hl - pop iy ; iy=структура дескр. - ld hl,0 - ld (D12FD),hl - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - xor a - call A125B ; прочитать в кеш 16 секторов FAT-а - pop af - out (0E2h),a - call A10F6 ; уст. начальный кластер для чтения - xor a - ret - ; -A14D1: ld a,(iy+15h) - cp 0F0h ; формат 720kB дискеты - jr c,A14EA - cp 0F8h ; байт-дескриптор винта - ld a,"6" - ld hl,0FFFFh ; ячейка FAT16 - jr z,A145D - ld a,"2" - ld hl,0FFFh ; ячейка FAT12 - jp A145D - ; -A14EA: pop iy - ld a,EINVMED ; код "не известный формат" - scf - ret - ; -A14F0: ld a,ENORDY ; код "нет готовности" - scf - ret - - -T14F4: db "FAT" - ; - db 0 - db 0 - db 0 - db 0 - -disk: db 1 ; номер диска ДОС - -D14FC: dw 0 -D14FE: dw 0 -D1500: dw 0 -D1502: dw 0 -D1504: db 0 -D1505: db 0 -D1506: dw 0 -D1508: dw 0 ; размер блока "секторов на кластер" -D150A: db 0 -D150B: db 0 ; "6"/"2" fat16/fat12 -D150C: dw 0 -D150E: dw 0FFFFh ; 0FFFFh/0FFFh fat16/fat12 - - -; Буфер текущего пути (каталога) системы -T1510: db '\' - ds 256 - - - -; <<< Массив структур дескрипторов, 44*10=440 байт >>> -; -; Структура дескриптора тек. каталога -handle: db ". " ;+0 имя файла (+0=0 - дескр. свободен) - db " " ;+8 расш. файла - db 10h ;+11 атрибут - ds 10 ;+12 резерв - dw 0 ;+22 время - dw 0 ;+24 дата - dw 0 ;+26 номер первого кластера - dw 0,0 ;+28 размер файла - dw 0 ;+32 мл.разряд указателя файла - dw 0 ;+34 ст.разряд - dw 0 ;+36 номер первого кластера каталога (из +26) - dw 0 ;+38 индекс записи в списке каталога (исп. #11 функ.) - db 0 ;+40 номер диска (drive or current) - db 0 ;+41 режим доступа к файлу (r,w,r/w). 7-й бит - признак изменения файла - db 0 ;+42 уровень тек. программы (задача (владелец)) - db 0 ;+43 резерв - -size_struc_handle equ $-handle ; размер структуры (44 байта) - - ; 9 файловых структур - ds size_struc_handle * max_handles ; 44*9=396 - - - - - -;------------------------------------------------- -; Поиск дескриптора файла. -; вход: a=номер дескр. -; выход: iy=адрес структуры дескр. -; CF - нет дескриптора -;------------------------------------------------- -search_handle: - inc a - cp max_handles+1 ; запред. число дескрипторов - jr nc,A17E3 - push de - ld iy,handle - size_struc_handle ; массив дескр. - 44 - ld de,size_struc_handle ; 44 размер структуры дескриптора - add iy,de - dec a - jr nz,$-3 ; ищем нужный дескр. - pop de - ld a,(iy+0) ; номер тек. дескр. - or a - ld a,EZERO ; код "Ok" - ret nz ; дескр. занят -A17E3: ld a,EINVHND ; код "не существующий дескриптор" - scf - ret - - -;----------------------------------------------------------- -; Освобождение дескриптора файла. -; вход: a=номер дескриптора -; выход: CF - при ошибке "не существующий дескриптор" -;----------------------------------------------------------- -release_handle: - inc a - cp max_handles+1 ; запред. число дескрипторов - jr nc,A17E3 - push de - ld iy,handle - size_struc_handle ; массив дескр. - 44 - ld de,size_struc_handle ; 44 размер структуры дескриптора - add iy,de - dec a - jr nz,$-3 ; ищем нужный дескриптор - pop de - ld a,(iy+0) ; имя файла в дескрипторе - or a ; структура свободна ? - ld a,EINVHND ; код "не существующий дескриптор" - exx - scf - ret z ; да - xor a - ld (iy+0),a ; освоб. тек. дескриптор - ret - - -;------------------------------------------------- -; Поиск свободного дескриптора. -; вход: нет -; выход: c=номер дескриптора -; CF - нет своб. дескриптора -;------------------------------------------------- -search_free_handle: - ld b,max_handles+1 ; 10 макс.число дескрипторов+1 - ld c,-1 ; счетчик номера дескр. - ld iy,handle - size_struc_handle ; массив дескр. - 44 - ld de,size_struc_handle ; 44 размер структуры дескриптора -A1815: add iy,de - inc c ; 0..9 - ld a,(iy+0) - or a ; тек. структура дескриптора свободна ? - ret z ; да - djnz A1815 ; на след. структуру - ld a,EMFILE ; код "слишком много откр. файлов" - scf - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #15. Перемещение указателя в файле. -; -; вход: A - дескриптор файла -; HL:IX - смещение указателя в файле -; B - способ перемещения -; B=0 от начала файла -; B=1 от текущего значения указателя -; B=2 от конца файла -; выход: HL:IX - новое значение указателя -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_15:call search_handle ; поиск дескр. файла - ret c ; не найден - inc b - dec b - jr z,A1835 ; от начала - dec b - jr z,A184B ; от тек. полож. - dec b - jr z,A183D ; от конца -empty__:ld a,EINVFNC ; код "не верный номер функции" - scf - ret - -; От начала файла -A1835: ld bc,0 ; для мл. разряда - ld e,c ; для ст. разряда - ld d,c - jr A1857 - -; От конца файла -A183D: ld c,(iy+1Ch) ; iy=дескр. файла - ld b,(iy+1Dh) - ld e,(iy+1Eh) - ld d,(iy+1Fh) - jr A1857 - -; От тек. положения -A184B: ld c,(iy+20h) - ld b,(iy+21h) - ld e,(iy+22h) - ld d,(iy+23h) -A1857: add ix,bc ; мл. разряд - adc hl,de ; ст. разряд - db 0DDh - ld d,h - db 0DDh - ld e,l - ld (iy+20h),e - ld (iy+21h),d - ld (iy+22h),l - ld (iy+23h),h - xor a - ret - - -A186D: ld l,(iy+1Ch) - ld h,(iy+1Dh) - ld e,(iy+20h) - ld d,(iy+21h) - and a - sbc hl,de - ld l,(iy+1Eh) - ld h,(iy+1Fh) - ld e,(iy+22h) - ld d,(iy+23h) - sbc hl,de - ret - - - -A188B: pop bc - pop de - and a - ret - ; -A188F: pop bc - pop de - scf ; ошибка - ret - ; -A1893: push bc - ld (D1CFB),ix - ld a,(D0083) ; секторов на кластер - ld c,a - ld b,0 - call A1CD9 - db 0DDh - ld b,h - db 0DDh - ld c,l - push hl - ld l,(iy+26) ; номер первого кластера (из дескр.) - ld h,(iy+27) ; - ld a,h - or l - jr nz,A18BB - jr A188B ; файл нулевой длины - ; -A18B2: push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - pop bc - jr c,A188B ; конец цепочки - ex de,hl ; hl=номер след. кластера - dec bc -A18BB: ld a,b - or c - jr nz,A18B2 ; прочитать след. сектор (кластер) - pop de - pop bc - ld a,(D0083) ; секторов на кластер - sub e - ld c,a - cp b - jr c,A18CA - ld c,b -A18CA: ld a,b - sub c - ld b,a - push hl - push bc - push de - call A1CB8 - pop de - add ix,de - jr nc,$+3 - inc hl - ld de,(D1CFB) ; буфер - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,5 ; чтение секторов - rst 18h - jr c,A188F ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) -A18EF: add hl,de - dec c - jr nz,A18EF - ld (D1CFB),hl - pop de - ld a,b - or a - ret z -A18FA: ld hl,D0083 ; секторов на кластер - ld a,b - sub (hl) - ld b,a - ld c,(hl) - jr nc,A1909 - ld b,0 - add a,(hl) - ld c,a - or a - ret z -A1909: ex de,hl ; hl=номер кластера - push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - pop bc - jr c,A1938 ; конец цепочки - ex de,hl ; hl=номер след. кластера - push hl - push bc - call A1CB8 - ld de,(D1CFB) ; куда - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,5 ; чтение секторов - rst 18h - jp c,A188F ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) -A192E: add hl,de - dec c - jr nz,A192E - ld (D1CFB),hl - pop de - jr A18FA - ; -A1938: and a - ret - - - -A193A: pop bc -A193B: pop bc - pop de - scf - ret - ; -A193F: push bc - ld (D1CFB),ix - ld a,(D0083) ; секторов на кластер - ld c,a - ld b,0 - call A1CD9 - db 0DDh - ld b,h - db 0DDh - ld c,l - push hl - ld l,(iy+1Ah) ; hl=номер первого кластера - ld h,(iy+1Bh) ; - ld a,h - or l - jr nz,A198A - push bc - call A10FD - jr c,A193A - ld (iy+1Ah),l ; hl=номер первого кластера - ld (iy+1Bh),h ; - ld de,(D150E) ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - push hl - call A128B ; подкл. банку кеша FAT и записать его на диск - pop hl - pop bc - jr A198A - ; -A1977: push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - jr nc,A1987 ; не конец цепочки - push hl ; номер кластера (не следующего) - call A1111 - pop hl - jr c,A193A - call A1132 ; прочитать из кеша FAT-а номер след. кластера -A1987: pop bc - ex de,hl ; hl=номер след. кластера - dec bc -A198A: ld a,b - or c - jr nz,A1977 - pop de - pop bc - ld a,(D0083) ; секторов на кластер - sub e - ld c,a - cp b - jr c,$+3 - ld c,b - ld a,b - sub c - ld b,a - push hl - push bc - push de - call A1CB8 - pop de - add ix,de - jr nc,$+3 - inc hl - ld de,(D1CFB) ; буфер - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,6 ; запись секторов - rst 18h - jp c,A193B ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) - add hl,de - dec c - jr nz,$-2 - ld (D1CFB),hl - pop de - ld a,b - or a - ret z -A19C9: ld hl,D0083 ; секторов на кластер - ld a,b - sub (hl) - ld b,a - ld c,(hl) - jr nc,A19D8 - ld b,0 - add a,(hl) - ld c,a - or a - ret z -A19D8: ex de,hl - push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - jr nc,A19E9 ; не конец цепочки - push hl ; номер кластера (не следующего) - call A1111 - pop hl - jr c,A1A10 ; нет места на диске - call A1132 ; прочитать из кеша FAT-а номер след. кластера -A19E9: pop bc - ex de,hl ; hl=номер след. кластера - push hl - push bc - call A1CB8 - ld de,(D1CFB) ; буфер - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,6 ; запись секторов - rst 18h - jp c,A193B ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) - add hl,de - dec c - jr nz,$-2 - ld (D1CFB),hl - pop de - jr A19C9 - ; -A1A10: pop bc - ld a,ENOSPACE ; код "нет места на диске" - scf - ret - - -A1A15: xor a - ld (D1CFA),a - ld l,(iy+20h) - ld h,(iy+21h) - add hl,de - exx - ld e,a - ld d,a - ld l,(iy+22h) - ld h,(iy+23h) - adc hl,de - exx - ld c,(iy+1Ch) - ld b,(iy+1Dh) - and a - sbc hl,bc - exx - ld c,(iy+1Eh) - ld b,(iy+1Fh) - sbc hl,bc - exx - ret c - ex de,hl - sbc hl,de - ex de,hl - ld a,-1 - ld (D1CFA),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #13. Чтение из файла. -; -; вход: A - дескриптор файла (0-й = чтение списка диска) -; HL - буфер -; DE - кол-во читаемых байт -; выход: DE - реальное кол-во прочитанных байт -; если CF=0: -; A=0 прочитаны все байты -; A=0FFh прочитано меньшее число байт -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_13:ld (D1D01),hl - ld (D1D03),hl - call search_handle ; поиск дескр. файла - ret c ; не найден - call A1A15 - ld a,d - or e - jp z,A1B02 - push de - ld a,(iy+40) ; номер диска из дескр. - call A2147 - jp c,A1B57 - ld c,(iy+32) ; мл.разряд указателя файла - ld a,(iy+33) ; - ld e,a - and 1 - ld b,a - ld d,(iy+34) ; ст.разряд - ld l,(iy+35) ; - ld h,0 - or a - rr l - rr d - rr e - ld a,b - or c - jp nz,A1B07 -A1A85: pop bc - push bc - srl b - jr z,A1ABA - ld (D1CFD),hl - ld (D1CFF),de - ld ix,(D1D01) - call A1893 - jp c,A1B57 - ld de,(D1D01) - ld hl,(D1CFB) - and a - sbc hl,de - ld c,h - ld b,0 - add hl,de - ld (D1D01),hl - srl c - ld hl,(D1CFF) - add hl,bc - ex de,hl - ld hl,(D1CFD) - ld c,b - adc hl,bc -A1ABA: pop bc - ld a,b - and 1 - ld b,a - or c - jr z,A1AEA - push bc - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h ; порт - out (c),b ; восст. порт - jp c,A1B57 - ld hl,T0400 ; откуда - ld de,(D1D01) - pop bc - ldir - ld (D1D01),de -A1AEA: ld hl,(D1D03) - ld de,(D1D01) - ex de,hl - and a - sbc hl,de - push hl - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,0 - call A184B - pop de -A1B02: ld a,(D1CFA) - or a - ret - ; -A1B07: push bc - push hl - push de - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h - out (c),b ; восст. порт - pop hl - jr c,A1B55 - ld bc,1 ;T0001 - add hl,bc - ex de,hl - pop hl - ld c,b - adc hl,bc - exx - pop de - ld hl,512 ;T0200 ? - and a - sbc hl,de - ld b,h - ld c,l - pop hl - and a - sbc hl,bc - jr nc,A1B42 - add hl,bc - ld b,h - ld c,l - ld hl,0 -A1B42: push hl - ld hl,T0400 ; откуда - add hl,de - ld de,(D1D01) ; куда - ldir - ld (D1D01),de - exx - jp A1A85 - ; -A1B55: pop hl - pop hl -A1B57: pop bc - scf - ret - ; -A1B5A: pop hl -A1B5B: pop hl -A1B5C: pop bc - scf - ret - ; -A1B5F: pop de - ld a,EROFILE ; код "файл r/o" - scf - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #14. Запись в файл. -; -; вход: A - дескриптор файла (0-й = запись списка диска) -; HL - буфер данных -; DE - кол-во записываемых байт -; выход: DE - реальное кол-во записанных байт -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_14:ld (D1D01),hl - ld (D1D03),hl - push de - call search_handle ; поиск дескр. файла - jr c,A1B5C ; не найден - ld a,(iy+41) ; режим доступа к файлу (r,w,r/w) - and 1 ; на чтение - jr nz,A1B5F ; запись не возможна (файл r/o) - set 7,(iy+41) ; уст. признак изменения файла - set 5,(iy+11) ; бит "архивный" в ячейке атрибута - ld a,(iy+40) ; номер диска - call A2147 - jr c,A1B5C - ld c,(iy+32) - ld a,(iy+33) - ld e,a - and 1 - ld b,a - ld d,(iy+34) - ld l,(iy+35) - ld h,0 - or a - rr l - rr d - rr e - ld a,b - or c - jp nz,A1C4E -A1BA7: pop bc - push bc - srl b - jr z,A1BD1 - push hl - push de - push bc - ld ix,(D1D01) - call A193F - pop bc - jp c,A1B5A - ld c,b - ld hl,(D1D01) - ld de,512 ; размер сектора - add hl,de - djnz $-1 - ld (D1D01),hl - pop hl - add hl,bc - ex de,hl - pop hl - ld c,b - adc hl,bc -A1BD1: pop bc - ld a,b - and 1 - ld b,a - or c - jr z,A1C19 - push hl - push de - push bc - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h - out (c),b ; восст. порт - ld de,T0400 ; куда - ld hl,(D1D01) ; откуда - pop bc - jp c,A1B5B - ldir - ld (D1D01),hl - pop de - pop hl - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A193F - pop bc - ld c,0E2h - out (c),b ; восст. порт - ret c -A1C19: ld de,(D1D03) - ld hl,(D1D01) - and a - sbc hl,de - push hl - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,0 - call A184B - call A186D - pop de - ret nc - ld l,(iy+20h) - ld h,(iy+21h) - ld c,(iy+22h) - ld b,(iy+23h) - ld (iy+1Ch),l - ld (iy+1Dh),h - ld (iy+1Eh),c - ld (iy+1Fh),b - and a - ret - ; -A1C4E: push bc - push hl - push de - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h - out (c),b ; восст. порт - pop de - pop hl - exx - pop de - jp c,A1B5C - ld hl,512 ;T0200 - and a - sbc hl,de - ld b,h - ld c,l - pop hl - and a - sbc hl,bc - jr nc,A1C81 - add hl,bc - ld b,h - ld c,l - ld hl,0 -A1C81: push hl - ld hl,T0400 ; куда - add hl,de - ld de,(D1D01) ; откуда - ex de,hl - ldir - ld (D1D01),hl - exx - push hl - push de - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A193F - pop bc - ld c,0E2h - out (c),b ; восст. порт - pop hl - jp c,A1B5B - ld bc,1 ;T0001 - add hl,bc - ex de,hl - pop hl - ld c,b - adc hl,bc - jp A1BA7 - - -A1CB8: dec hl - dec hl - ex de,hl - ld a,(D0083) ; секторов на кластер - ld b,a - ld hl,0 - ld ix,0 -A1CC6: add ix,de - jr nc,$+3 - inc hl - djnz A1CC6 - ld de,(D1506) - add ix,de - ld e,b - ld d,b - adc hl,de - ret - - -A1CD9: db 0DDh - ld h,d - db 0DDh - ld l,e - ex de,hl - ld hl,0 - ld a,32 -A1CE3: add ix,ix - ex de,hl - adc hl,hl - ex de,hl - adc hl,hl - sbc hl,bc - jr nc,A1CF4 - add hl,bc - dec a - jr nz,A1CE3 - ret - ; -A1CF4: inc ix - dec a - jr nz,A1CE3 - ret - - - -D1CFA: db 0 -D1CFB: dw 0 -D1CFD: dw 0 -D1CFF: dw 0 -D1D01: dw 0 -D1D03: dw 0 - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #16. Получение/изменение атрибута файла. -; -; вход: HL - указатель на имя файла -; B - режим доступа: -; B=0 получить атрибут -; B=1 установить атрибут -; A - атрибут файла -; выход: A - атрибут файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_16:inc b - dec b - jr z,A1D12 ; b=0 - dec b - jr z,A1D24 ; b=1 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -; Получить атрибут файла -A1D12: xor a ; атрибут записи - call A1E5F - ret c - ld b,(iy+11) ; атрибут записи из дескр. - push bc - call Func_12 ; закрыть файл - pop bc - ret c - ld a,b - and a - ret - -; Изменить атрибут файла -A1D24: push af - xor a ; атрибут записи - call A1E5F - pop bc - ret c - set 7,(iy+41) ; уст. признак изменения файла - res 3,b ; бит "метка тома" - ld (iy+11),b ; ячейка атрибутов записи - push bc - call Func_12 ; закрыть файл - pop bc - ret c - ld a,b - and a - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #0A. Создание файла. -; -; вход: HL - указатель на имя файла -; A - атрибут файла -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0A:and 11100111b ; маска, скрыть биты dir/label - ld (D1F3A),a ; раб. ячейка - ld (file_name+1),hl ; имя файла - push hl - call search_free_handle ; поиск своб. дескриптора - pop hl - ret c ; не найден - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c ; недоп. имя - call search_rec_file ; поиск записи файла в списке диска - call nc,mark_delete ; найден, пометить запись как "удаленная" - jr A1D7B - - -;///////////////////////////////////////////////////////////////////// -; Функция #0B. Создание нового файла. -; Проверяет, существует ли файл с таким же именем. -; -; вход: HL - указатель на имя файла -; A - атрибут файла -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0B:and 11100111b ; маска, скрыть биты dir/label - ld (D1F3A),a ; раб. ячейка - ld (file_name+1),hl ; имя файла - push hl - call search_free_handle ; поиск своб. дескриптора - pop hl - ret c ; не найден - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c ; недоп. имя - call search_rec_file ; поиск записи файла в списке диска - ld a,EEXIST ; код "файл существует" - ccf - ret c ; найден - ; создать в буфере новую запись -A1D7B: ld hl,T2364 - ld de,T1F3B - ld bc,11 - ldir - ex de,hl - ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) - ld (hl),a ;+11 в записи - inc hl - ld bc,0A00h ; b=10 байт резерва - ld (hl),c - inc hl - djnz $-2 - push hl - call Func_21 ; узнать тек. дату и время - call A2599 ; закодировать время/дату - pop hl - ld (hl),e ;+22 время - inc hl - ld (hl),d - inc hl - ld (hl),c ;+24 дата - inc hl - ld (hl),b - inc hl - ld bc,0600h ; 6 ячеек, № кластера и размер файла - ld (hl),c - inc hl - djnz $-2 - call A1F5B ; скопир. новую запись в список диска (каталога) - call flush_cash_dir ; сбросить кеш каталога на диск - ; открыть созданный файл -file_name: - ld hl,0 ; адрес имени файла - xor a ; на чтение/запись - jp Func_11 ; открыть файл - - - -;///////////////////////////////////////////////////////////////////// -; Функция #0C. Создание файла с уникальным именем. -; В конце строки пути должно быть как минимум 12 байт, -; на размещение созданного имени файла. Сама строка должна -; заканчиваться нулем. -; Если созданный файл уже существует, он обнуляется и откры- -; вается на чтение/запись. -; -; вход: HL - указатель на строку пути (и/или с диском). -; A - атрибут файла -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0C:jp empty__ ; код "не верный номер функции" - ;push af - ;push hl - ; создать уник. имя - ;call Func_21 ; узнать тек. дату и время - ;call A2599 ; закодировать время/дату - ;; bc=дата, de=время - ;ld hl,T2364 ; буфер имени 11 симв. формата - ;ld a,b - ;call byte2dec - ;ld a,c - ;call byte2dec - ;ld a,d - ;call byte2dec - ;ld a,e - ;call byte2dec - ;pop hl - ;push hl - ;; перейти на конец строки - ;xor a - ;ld bc,256 - ;cpir - ;dec hl - ;ex de,hl - ;; добавить имя файла в конец строки - ;ld hl,T2364 ; буфер имени 11 симв. формата - ;ld bc,8 ; имя - ;ldir - ;ex de,hl - ;ld (hl),"." - ;inc hl - ;ld a,"$" ; расш. файла - ;ld (hl),a - ;inc hl - ;ld (hl),a - ;inc hl - ;ld (hl),a - ;inc hl - ;ld (hl),0 - ;pop hl ; имя файла - ;pop af ; атрибут - ;; создать файл - ;jp Func_0A - - -; Цифру в hex-формате в буфер. -; вход: hl=буфер -; a=цифра -;byte2dec: - ;push af - ;rra - ;rra - ;rra - ;rra - ;call $+4 - ;pop af - ;and 0Fh - ;add a,90h - ;daa - ;adc a,40h - ;daa - ;ld (hl),a - ;inc hl - ;ret - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #0E. Удаление файла. -; Файлы "r/o" нельзя стереть данной функцией. -; -; вход: HL - указатель на имя файла -; A - атрибут файла -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0E:bit 0,a - scf - ld a,EROFILE ; код "файл r/o" - ret nz - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - call A228F ; прочитать список каталога - call search_rec_file ; поиск записи файла в списке диска - ret c ; не найден -; пометить запись как "удаленная" -mark_delete: - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - ld (ix+0),0E5h ; признак удаления файла - ld e,(ix+26) ; № первого кластера - ld d,(ix+27) - out (0E2h),a ; восст. порт - ld a,e - or d - jp z,flush_cash_dir ; сбросить кеш каталога на диск -A1DEA: ex de,hl ; hl=номер кластера - call A1132 ; прочитать из кеша FAT-а номер след. кластера - push de ; номер след. кластера - push af - ld de,0 ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - pop af - pop de - jr nc,A1DEA ; не конец цепочки - call A128B ; подкл. банку кеша FAT и записать его на диск - jp flush_cash_dir ; сбросить кеш каталога на диск - - - -;///////////////////////////////////////////////////////////////////// -; Функция #10. Переименование файла. -; Глобальные символы * и ? в именах файлов не допускаются. -; -; вход: HL - указатель на старое имя файла -; DE - указатель на новое имя файла -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_10:push de - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - pop de - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - push de - call A228F ; прочитать список каталога - ld a,33h ; атрибут "arch + dir + r/o + hidden" - call search_record ; поиск записи в списке диска - pop hl ; 8.3 имя - ret c - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - push ix ; адр. записи переимен. файла - ld a,33h ; атрибут "arch + dir + r/o + hidden" - call search_record ; поиск записи в списке диска - pop ix - ld a,EEXIST ; код "файл существует" - ccf - ret c - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - ld hl,T2364 - db 0DDh - ld d,h - db 0DDh - ld e,l - ld bc,11 - ldir - out (0E2h),a ; восст. порт - jp flush_cash_dir ; сбросить кеш каталога на диск - - -A1E5F: ld (D1F3A),a ; раб. ячейка (здесь атрибут записи) - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld a,37h ; атрибут "все, кроме метки тома" - call search_record ; поиск записи в кэше списка каталога - jr nc,A1E8D ; на поиск своб. дескриптора - ; запись не найдена - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #11. Открытие файла. -; -; вход: HL - указатель на имя файла -; A - режим доступа: -; A=0 чтение/запись -; A=1 чтение -; A=2 запись -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_11:ld (D1F3A),a ; раб. ячейка - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c -A1E89: call search_rec_file ; поиск записи файла в списке диска - ret c ; не найден -A1E8D: call search_free_handle ; поиск своб. дескриптора - ret c ; не найден - ; заполнить структуру дескриптора - ld a,c ; номер своб. дескриптора - ex af,af' - exx - ld (iy+38),e ; de=индекс записи в списке каталога (исп. #11 функ.) - ld (iy+39),d - exx - db 0FDh ; ld de,iy - ld d,h - db 0FDh - ld e,l - ld hl,T1F3B ; 32 байта - ld bc,32 - ldir ; заполнить дескриптор - ld a,(D1F3A) ; режим доступа к файлу (раб. ячейка) - ld (iy+41),a - ld a,(D2E70) ; уровень текущей программы (владелец) - ld (iy+42),a - xor a - ld (iy+32),a - ld (iy+33),a - ld (iy+34),a - ld (iy+35),a - ld a,(disk) ; номер диска - ld (iy+40),a - ld hl,handle+26 ; ячейка № первого кластера - ld e,(hl) - inc hl - ld d,(hl) - ld (iy+36),e ; № первого кластера - ld (iy+37),d - ex af,af' - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #12. Закрытие файла. -; -; вход: A - дескриптор файла -; выход: A - код ошибки, если CF=1 -; -;///////////////////////////////////////////////////////////////////// -Func_12:ld (D1F3A),a ; дескр. (раб. ячейка) - call search_handle ; поиск дескр. файла - ret c ; не найден - ld a,(D2E70) ; уровень текущей программы - cp (iy+42) ; уровень из дескриптора - ld a,EACCES ; код "ресурс не доступен" - scf - ret nz - bit 7,(iy+41) ; флаг изменения файла - jr z,A1F31 ; освоб. дескр. файла - ; файл изменялся - ld d,(iy+36) - ld e,(iy+37) - push de - xor a ; номер дескр. - call search_handle ; поиск дескр. файла - pop de - ld (iy+36),d - ld (iy+37),e - call A228F ; прочитать список каталога - ld a,(D1F3A) ; дескриптор (раб. ячейка) - call search_handle ; поиск дескр. файла - ld hl,LC000 - ld de,32 - ld c,(iy+38) ; bc=индекс записи в списке каталога - ld b,(iy+39) - jr A1F17 - ; -A1F15: add hl,de - dec bc -A1F17: ld a,b - or c - jr nz,A1F15 - db 0FDh - ld d,h - db 0FDh - ld e,l - ex de,hl - push hl - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - pop hl - ld bc,32 - ldir - out (0E2h),a ; восст. порт - call flush_cash_dir ; сбросить кеш каталога на диск -A1F31: ld a,(D1F3A) ; дескр. (раб. ячейка) - jp release_handle ; освоб. дескр. файла - - - -D1F3A: db 0 ; раб. ячейка (режим поиска/доступа/..) - - -; 32 байта. Буфер записи файла/каталога -T1F3B: ds 11 -D1F46: db 0 ;+11 ячейка атрибутов файла - ds 14 -D1F55: dw 0 - ds 4 - - - -;----------------------------------------------------------- -; Скопировать новую запись в кэш списка каталога -;----------------------------------------------------------- -A1F5B: xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld ix,LC000 ; начало списка диска - exx - ld de,0 ; сбр. индекс записи (исп. #11 функ.) - exx -A1F6A: ld a,(ix+0) - or a ; конец списка - jr z,A1F82 - cp 0E5h ; признак удал. записи - jr z,A1F82 - ld bc,32 - add ix,bc ; на след. запись - jr nc,A1F6A - ; за границей 0FFFFh - pop af - out (0E2h),a ; восст. порт - ld a,EROOT ; код "переполнение root-каталога" - scf - ret -; скопир. новую запись в список диска -A1F82: db 0DDh - ld d,h ; de=куда - db 0DDh - ld e,l - ld hl,T1F3B ; откуда 32 байта (новая запись) - ld bc,32 - ldir ; скопир. новую запись в список диска - pop af - out (0E2h),a ; восст. порт - ld hl,LC000 ; начало списка диска - ld bc,(size_cash_directory) - dec bc - add hl,bc - and a - sbc hl,de - ret nc - ld hl,(size_cash_directory) - ld bc,(D1508) ; размер блока "секторов на кластер" - add hl,bc - ld (size_cash_directory),hl - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #44. Преобразовать имя файла (11 -> 8.3 и обратно). -; -; вход: B=0, преобразовать из 11 символьного формата в формат ДОС -; HL - 11 символов имени файла -; DE - буфер для имени в формате ДОС (13 байт) -; B=1, преобразовать из формата ДОС в 11 символьный формат -; HL - имя файла в формате ДОС -; DE - 11 символов имени файла -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_44:inc b - dec b ; b=0 - jr z,A1FB8 ; преобр. имя 11 -> 8.3 формат - dec b ; b=1 - jp z,A2384 ; преобр. имя 8.3 -> 11 формат - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -;------------------------------------------------- -; Преобразовать имя 11 -> 8.3 формат -; -; вход: hl=откуда -; de=куда -;------------------------------------------------- -A1FB8: ld bc,08FFh ; b=счетчик -A1FBB: ld a,(hl) - cp " " - jr nz,A1FC5 - inc hl - djnz $-1 - jr A1FC9 - ; -A1FC5: ldi - djnz A1FBB -A1FC9: ld a,(hl) - cp " " - ld a,"." - jr nz,A1FD2 - ld a,0 -A1FD2: ld (de),a - inc de - ret z - ld b,3 -A1FD7: ld a,(hl) - cp " " - ret z - ldi - xor a - ld (de),a - djnz A1FD7 - ret - - - -D1FE2: dw 0 ; адрес раб. буфера (f_first, f_next) -D1FE4: dw 0 ; адрес след. записи (f_first, f_next) -D1FE6: db false ; флаг отработки "f_first" -D1FE7: db false ; флаг 8.3 или 11 формата имени (f_first, f_next) - - -;///////////////////////////////////////////////////////////////////// -; Функция #19. Поиск первого совпадающего файла. -; -; вход: HL - указатель на имя файла -; DE - рабочий буфер 44 байта, если B=0, иначе 46 байт ;256 байт -; A - атрибуты, используемые при поиске -; B=0 - имя найденного файла в формате 11 байт "FilenameExt" -; B=1 - имя найденного файла в формате DOS "filename.ext",0 -; выход: de'= индекс записи в списке каталога (исп. #11 функ.) -; A - код ошибки, если CF=1 -; -; формат раб. буфера: -; +00 8 db "FILE????" ; шаблон имени -; +08 3 db "???" ; шаблон расширения -; +11 1 db 20h ; атрибуты для поиска -; +12 10 ds 10 ; зарезервировано -; +22 2 dw 0000h ; время создания файла -; +24 2 dw 0000h ; дата создания файла -; +26 2 dw 0000h ; номер первого кластера -; +28 4 dw 0000h ; мл.разряд размер файла в байтах -; dw 0000h ; ст.разряд -; +32 1 db 20h ; атрибут найденного файла -; +33 11 db "FILENAMEEXT" ; имя найденного файла (копия из каталога) -;///////////////////////////////////////////////////////////////////// -Func_19:ld (D1F3A),a ; атрибут поиска - ld (D1FE2),de ; адрес раб. буфера - ld a,b - ld (D1FE7),a ; флаг 8.3 или 11 формата имени - push hl ; имя файла - call A228F ; прочитать список каталога (также указ. в строке) - pop hl - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) - call search_record ; поиск записи в списке диска - ret c ; запись не найдена/слишком много файлов - ld hl,T2364 ; буфер имени 11 симв. формата - ld de,(D1FE2) ; адрес раб. буфера - ld bc,11 - ldir ; перекачать "???????.." - ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) - ld (de),a ;+11 раб. буфер функции -A201D: inc de - ld bc,32 - add ix,bc - ld (D1FE4),ix ;; след. запись - ld hl,T1F3B+12 ; смещ. в записи - ld bc,20 - ldir - ld a,(T1F3B+11) ; ячейка атрибутов файла - ld (de),a ;+32 в раб. буфере функции - inc de - ld hl,T1F3B ; найденная запись файла/каталога - ld a,(D1FE7) ; флаг 8.3 или 11 формата имени - or a - jr nz,A2049 ; 11 -> 8.3 - ; скопир. имя найд. файла (формат 11) - ld bc,11 - ldir -A2042: ld a,true - ld (D1FE6),a ; флаг отработки "F_FIRST" - xor a - ret - ; преобр. 11 -> 8.3 формат -A2049: call A1FB8 - jr A2042 - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1A. Поиск следующего совпадающего файла. -; -; вход: de = указатель на рабочий буфер -; выход: de'= индекс записи в списке каталога (исп. #11 функ.) -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1A:ld a,(D1FE6) ; флаг отработки "F_FIRST" - or a - ld a,EUNOPER ; код "невозможная операция" - scf - ret z - ld (D1FE2),de ; адрес раб. буфера - ld hl,T2364 ; буфер имени 11 симв. формата - ex de,hl - ld bc,11 - ldir - xor a - ld (D1FE6),a ; сбр. флаг отработки "f_first" - ld a,(hl) ; ячейка атрибутов записи - push hl - call A207B ; найти след. запись - pop de - ret c ; не найдена или слишком много файлов - jr A201D ; скопир. остальные 20 байт записи - - - -; поиск след. записи -A207B: ex af,af' ; сохр. атрибуты записи - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ex af,af' ; восст. атрибуты записи - cpl - ld c,a - exx - ld de,0 ; сбр. индекс записи (исп. #11 функ.) - exx - ld ix,(D1FE4) ;; адрес след. записи - db 0DDh - ld a,h - db 0DDh - or l - jr z,search_record_too_many ; вышли за границу 0FFFFh - jr search_record_loop ; на цикл поиска записи - - - - -;------------------------------------------------- -; Поиск записи каталога в списке каталога -; -; вход: a=атрибут записи -; выход: de'=индекс записи в списке каталога -; CF - каталог не найден -;------------------------------------------------- -search_rec_dir: - ld a,10h ; атрибут "dir" - call search_record - ret nc - ld a,ENOPATH ; код "неверный путь" - ret - - -;------------------------------------------------- -; Поиск записи файла в списке каталога. -; -; вход: a=атрибут записи -; выход: ix=адрес найденной записи -; de'=индекс записи в списке каталога (для #11 функ.) -; CF - при ошибке, A=код ошибки -;------------------------------------------------- -search_rec_file: - ld a,27h ; атрибут "все, кроме папки и метки тома" -search_record: - ex af,af' ; сохр. атрибут записи - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ex af,af' ; восст. атрибут записи - cpl - ld c,a - ld ix,LC000 ; кэш списка каталога диска - exx - ld de,0 ; сбр. индекс записи (исп. #11 функ.) - exx - ; цикл поиска записи -search_record_loop: - ld a,(ix+0) - or a - jr z,search_record_not_found - cp 0E5h ; код удал. записи - jp z,search_record_next - ld a,(ix+11) ; атрибут записи - and c ; искомый атрибут ? - jp nz,search_record_next ; нет - ld hl,T2364 ; готовое имя файла (11 симв. формат) - db 0DDh - ld d,h - db 0DDh - ld e,l - ld b,11 - ex de,hl -A20C9: ld a,(de) - cp "?" - jr z,A20D1 - cp (hl) - jp nz,search_record_next -A20D1: inc hl - inc de - djnz A20C9 - db 0DDh - ld d,h - db 0DDh - ld e,l - ld hl,T1F3B ; 32 буфер записи - ex de,hl - ld bc,32 - ldir ; скопир. найденную запись в буфер - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -search_record_next: - exx - inc de ; ++индекс записи (исп. #11 функ.) - exx - ld de,32 - add ix,de ; на след. запись - jp nc,search_record_loop - ; выход за границу 0FFFFh -search_record_too_many: - ld e,ETMFILE ; код "слишком много файлов" - jr $+4 -search_record_not_found: - ld e,ENOFILE ; код "файл не обнаружен" - pop af - out (0E2h),a ; восст. порт - ld a,e ; код ошибки - scf - ret - - -;------------------------------------------------- -; Тест на допустимое имя и настроиться на диск. -; вход: hl=строка имени -;------------------------------------------------- -A20F8: ld de,D213A ; куда - ld bc,0DFFh ; b=счетчик -A20FE: ld a,(hl) - inc hl - cp '\' - jr z,A2114 - cp ":" - jr z,A2122 - ld (de),a - inc de - cp " "+1 - ccf - ret nc - djnz A20FE - ld a,EINVFNAM ; код "неверное имя" - scf - ret - ; -A2114: ld a,0 - ld (de),a - push hl - ld hl,D213A - call A2164 - pop hl - jr nc,A20F8 - ret - ; -A2122: ld a,(D213A) ; буква диска - cp "a" - jr c,A212F - cp "z"+1 - jr nc,A212F - sub 20h -A212F: sub "A" - push hl - call A2147 - pop hl - jr nc,A20F8 - ret - - -; Буфер имени 8.3 формата -D213A: db " ",0 ; 12 пробелов - - - -A2147: push af ; номер девайса - ld c,1 ; открыть девайс - rst 18h - pop bc - jr c,A215C ; ошибка - ld a,b - ld (disk),a ; номер диска - call A1370 - ret c - ld a,(last_drive) ; номер посл. диска - and a - ret - ; -A215C: cp EINVDRV ; код "bad drive number" - scf - ret z - ld a,ENORDY ; код "нет готовности" - scf - ret - - -A2164: xor a ; номер дескр. - call search_handle ; поиск дескр. файла - ld a,(hl) ; 8.3 имя - or a - jr nz,A2183 -A216D: ld de,0 - ld (iy+26),e - ld (iy+27),d - call A228F ; прочитать список каталога - ld hl,T1510 ; буфер тек. пути (каталога) системы - ld (hl),'\' - inc hl - ld (hl),0 - and a - ret - ; -A2183: cp "." - jr nz,A21AF - ld a,(iy+26) - or (iy+27) - jr nz,A2195 - inc hl - ld a,(hl) - or a - dec hl - jr z,A216D -A2195: exx - ld hl,T2364 - ld de,T2364+1 - ld bc,10 - ld (hl)," " - ldir - exx - ld de,T2364 -A21A7: ldi - ld a,(hl) - or a - jr nz,A21A7 - jr A21B6 - ; -A21AF: ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c -A21B6: call A21DC - ret c - ld (iy+26),e - ld (iy+27),d - ld de,L4000 - ld (iy+28),e - ld (iy+29),d - call A228F ; прочитать список каталога - and a - ret - - - -A21CE: ld bc,32 - add ix,bc ; на след. запись - jr nc,A21E6 - ; превышение границы #FFFF -A21D5: pop af - out (0E2h),a ; восст. порт - ld a,ENOPATH ; код "неверный путь" - scf - ret - ; -A21DC: xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld ix,LC000 ; кеш списка каталога -A21E6: ld a,(ix+0) - or a - jr z,A21D5 ; список пустой - cp 0E5h - jr z,A21CE ; файл удален - ld a,(ix+11) ; ячейка атрибутов - and 10h ; каталог ? - jr z,A21CE ; нет, на след. запись - ; каталог - ld hl,T2364 - db 0DDh - ld d,h - db 0DDh - ld e,l - ex de,hl - ld b,11 -A2201: ld a,(de) - cp "?" - jr z,A2209 - cp (hl) - jr nz,A21CE ; на след. запись -A2209: inc hl - inc de - djnz A2201 - ld a,(ix+0) - cp "." - jr nz,A2245 - ld a,(ix+1) - cp "." - jr nz,A223A - ; родит. каталог - ld hl,T1510 ; буфер тек. пути (каталога) системы - ld d,h - ld e,l - ld bc,256 - xor a - cpir - ld bc,256 - ld a,'\' - cpdr - inc hl - and a - ex de,hl - sbc hl,de - ex de,hl - jr nz,A2238 - inc hl -A2238: ld (hl),0 -A223A: ld e,(ix+26) - ld d,(ix+27) - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -A2245: db 0DDh - ld e,l - db 0DDh - ld d,h - ld hl,T1510 ; буфер тек. пути (каталога) системы - ld bc,255 - xor a - cpir - dec hl - dec hl - ld a,'\' - cp (hl) - inc hl - jr z,$+4 - ld (hl),a - inc hl - ld bc,0820h ; b=счетчик, c=пробел -A225F: ld a,(de) - inc de - cp c - jr z,A2266 - ld (hl),a - inc hl -A2266: djnz A225F - ld a,(de) - inc de - cp c - jr z,A227F - ld (hl),"." - inc hl - ld (hl),a - inc hl - ld a,(de) - inc de - cp c - jr z,A227F - ld (hl),a - inc hl - ld a,(de) - cp c - jr z,A227F - ld (hl),a - inc hl -A227F: ;ld (hl),'\' ; ; концовка пути - ;inc hl; - ld (hl),0 - jr A223A - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1E. Информация о текущем каталоге. -; -; вход: HL - буфер в памяти 256 байт -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1E:ex de,hl ; de=куда - ld hl,T1510 ; откуда ; CurrentDirectory - ld a,(hl) - or a - ldi - jr nz,$-4 - ret - - - -;------------------------------------------------- -; Прочитать список каталога -;------------------------------------------------- -A228F: xor a - ld l,a - ld h,a - push hl - pop ix - ld b,a ; от начала файла - call Func_15 ; перемещение указателя в файле - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ; очистить кеш каталога -/* ld hl,LC000 ;@@ - ld de,LC000+1 - ld bc,4000h-1 - ld (hl),l - ldir ; 21 * #3FFF = 344.043 -*/ ld (.stack),sp ; сохр. стек - ld de,0 ; байты заполнения - ld bc,400h / 2 - ld sp,0000h ; откуда (вниз) -.loop: push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - dec bc - ld a,c - or b - jp nz,.loop - db 31h ; ld sp,.. -.stack: dw 0 - ; - ld a,(disk) ; номер диска - ld (iy+40),a ; сохр. в дескриптор - ld d,(iy+26) ; de=номер первого кластера - ld e,(iy+27) - ld a,d - or e - jr z,A22D2 ; root ?? - ld hl,LC000 ; куда - ld de,4000h ; сколько - xor a ; дескриптор - call Func_13 ; чтение из файла - ld (size_cash_directory),de ; число прочит. байтов - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -A22D2: ld hl,(D1500) ; ст. разряд - ld ix,(D1502) ; номер лог. сектора - ld a,(D1505) - ld b,32 ; размер root-каталога - sub b - jr nc,A22E3 - add a,b - ld b,a ; число секторов -A22E3: ld a,(disk) ; номер диска - ld c,5 ; чтение секторов - ld de,LC000 ; буфер - rst 18h - pop af - out (0E2h),a ; восст. порт - and a - ret - - - -;------------------------------------------------- -; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -;------------------------------------------------- -flush_cash_dir: - xor a - ld l,a - ld h,a - push hl ; ст. разряд - pop ix ; мл. разряд - ld b,a ; от начала файла - call Func_15 ; перемещение указателя в файле - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld a,(disk) ; номер диска - ld (iy+40),a ; сохр. в дескрипторе - ld d,(iy+26) ; de=номер первого кластера - ld e,(iy+27) - ld a,d - or e - jr z,A2325 ; root ?? - ld hl,LC000 ; откуда - ld de,(size_cash_directory) ; сколько - xor a ; дескр. - call Func_14 ; запись в файл - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -A2325: ld hl,(D1500) ; ст. разряд - ld ix,(D1502) ; лог. номер сектора - ld a,(D1505) - ld b,32 ; макс. число секторов ? - sub b - jr nc,$+4 - add a,b - ld b,a ; число секторов - ld a,(disk) ; номер диска - ld c,6 ; запись секторов - ld de,LC000 ; буфер - rst 18h - pop af - out (0E2h),a ; восст. порт - and a - ret - - -size_cash_directory: - dw 0 ; размер списка каталога - - - - -;----------------------------------------------------------- -; Подключить банку расширения ДОС в 3-е окно -; -; вход: a=лог. номер банки (0..2, в данной версии ДОС) -; выход: a=старая банка порта -;----------------------------------------------------------- -set_dos_page: - ld c,a - ld b,0 - ld hl,list_dos_pages ; 16 байт, номера банок расширения ДОС - add hl,bc - in a,(0E2h) ; сохр. порт - ld c,0E2h ; порт - outi ; один байт (hl) -> порт (bc) - ret - - -; Массив лог. номеров банок расширения ДОС. 16 байт. -list_dos_pages: - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - - - -; Буфер 11 симв. имени (первые 11 байт) -T2364: ds 8 ; имя файла -T236C: ds 3 ; расш. - ; - ds 21 ; 11+21=32 - - -;------------------------------------------------- -; Преобразовать имя 8.3 -> 11 формат -; вход: hl = 8.3 имя -; de = буфер имени 11 симв. формата -; при ошибке CF - недоп. имя -;------------------------------------------------- -A2384: push hl - push de - ld h,d - ld l,e - inc de - ld (hl)," " - ld bc,10 - ldir - pop de - pop hl - ld a,(hl) - cp "." - scf - jr z,A239A - cp " "+1 -A239A: ld a,EINVFNAM ; код "неверное имя" - ret c - ld bc,0902h ; b=счетчик -A23A0: ld a,(hl) - cp " "+1 - ccf - ret nc - cp '"' - jr z,A23E9 ; ошибка - cp "*" - jr z,A23ED - cp "+" - jr z,A23E9 ; ошибка - cp "," - jr z,A23E9 ; ошибка - cp "." - jr z,A23FE - cp "/" - jr z,A23E9 ; ошибка - cp ":" - jr z,A23E9 ; ошибка - cp ";" - jr z,A23E9 ; ошибка - cp "<" - jr z,A23E9 - cp "=" - jr z,A23E9 - cp ">" - jr z,A23E9 - cp "[" - jr z,A23E9 - cp '\' - jr z,A23E9 - cp "]" - jr z,A23E9 - cp "|" - jr z,A23E9 - call upper ; a..z -> A..Z - ld (de),a - inc hl - inc de - djnz A23A0 -A23E9: ld a,EINVFNAM ; код "неверное имя" - scf - ret - ; -A23ED: ld a,"?" - inc hl - djnz A23F6 - jr A23E9 - ; -A23F6: ld (de),a - inc de - djnz A23F6 - ld b,1 - jr A23A0 - -A23FE: ld a," " - inc hl - djnz A240D -A2403: ld b,4 - dec c - jr nz,A23A0 - jr A23E9 ; код "неверное имя" - ; -A240D: ld (de),a - inc de - djnz A240D - jr A2403 - - - -; a..z -> A..Z -upper: cp "a" - ret c - cp "z"+1 - jr nc,A2425 - sub 20h - ret - ; -A2425: cp "а" ; русская - ret c - cp "п"+1 - jr nc,A2430 - sub 20h - ret - ; -A2430: cp "р" ; русская - ret c - cp "Ё" - jr nc,A243B - sub 50h - ret - ; -A243B: cp "ё" - ret nz - dec a ; ё -> Ё - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #21. Текущая дата и время. -; -; вход: нет -; выход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; C - день недели -;///////////////////////////////////////////////////////////////////// -Func_21:ld c,0F5h - rst 08h - jp c,A24D0 - ld d,7 ; номер регистра - call A24BB ; чтение регистров CMOS - push af - ld d,8 - call A24BB - pop de - ld e,a - push de - ld d,4 - call A24BB - push af - ld d,2 - call A24BB - pop de - ld e,a - push de - ld d,0 - call A24BB - push af - ld d,6 - ld c,0F6h - rst 08h - pop de - ld e,a - push de - ld d,9 - call A24BB - push af - ld d,32h - ld c,0F6h - rst 08h - db 0DDh - ld h,a - pop af - cp 80 ;50h - push af - jr c,A248B - ld a,19h - db 0DDh - cp h - jr z,A249A - jr A2491 - ; -A248B: ld a,20h - db 0DDh - cp h - jr z,A249A -A2491: push af - ld d,32h - ld c,0F7h - rst 08h - pop af - db 0DDh - ld h,a -A249A: pop af - db 0DDh - ld l,a - db 0DDh - ld a,h - call A24BE - ld l,a - ld h,0 - ld c,l - ld b,h - db 0DDh - ld h,b - add hl,hl - add hl,hl - add hl,bc - add hl,hl - ld b,h - ld c,l - add hl,hl - add hl,hl - add hl,bc - add hl,hl - ex de,hl - add ix,de - pop bc - pop hl - pop de - and a - ret - - -; Чтение регистров CMOS -; вход: d=номер регистра -A24BB: ld c,0F6h - rst 08h -A24BE: ld e,a - rrca - rrca - rrca - rrca - and 0Fh - ld d,a - add a,a - add a,a - add a,d - add a,a - ld d,a - ld a,e - and 0Fh - add a,d - ret - - -A24D0: ld de,(D255D) - ld hl,(D255F) - ld bc,(D2561) - ld ix,(D2563) - and a - ret - - -A24E1: ld c,0 - ld (D255D),de - ld (D255F),hl - ld (D2561),bc - ld (D2563),ix - and a - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #22. Установить текущую дату и время. -; -; вход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_22:push ix - push bc - push hl - push de - ld c,0F5h - rst 08h - jr c,A24E1 - pop af - push af - ld d,7 ; номер регистра - call A2544 ; запись регистров CMOS - pop bc - ld a,c - ld d,8 - call A2544 - pop af - push af - ld d,4 - call A2544 - pop bc - ld a,c - ld d,2 - call A2544 - pop af - push af - ld d,0 - call A2544 - pop bc - ld a,c - ld d,6 - ld c,0F7h - rst 08h - pop hl - xor a - ld de,100 -A252E: inc a - sbc hl,de - jr nc,A252E - add hl,de - dec a - push hl - ld d,32h - call A2544 - pop bc - ld a,c - ld d,9 - call A2544 - and a - ret - - -; Запись регистров CMOS -; вход: d=номер регистра -A2544: call A254B - ld c,0F7h - rst 08h - ret - ; -A254B: ld bc,0AFFh ; константа -A254E: inc c - sub b - jr nc,A254E - add a,b - ld b,a - ld a,c - rlca - rlca - rlca - rlca - and 0F0h - or b - ret - - -; Дата по-умолчанию -D255D: dw 0101h ; день:месяц -D255F: dw 0000h ; часы:минуты -D2561: dw 0001h ; 00h=секунды -D2563: dw 2005 ; год - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #17. Информация о дате и времени файла. -; -; вход: A - дескриптор файла -; выход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_17:call search_handle ; поиск дескр. файла - ret c ; не найден - ; время/дату из структуры дескр. - ld e,(iy+22) ; время - ld d,(iy+23) ; - ld c,(iy+24) ; дата - ld b,(iy+25) ; - call A25C3 ; раскодировать время/дату - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #18. Изменение даты и времени файла. -; -; вход: A - дескриптор файла -; D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_18:push af - call A2599 ; закодировать время/дату - pop af ; дескриптор - push de - push bc - call search_handle ; поиск дескр. файла - pop bc - pop de - ret c ; не найден - ; время/дату в структуру дескр. - ld (iy+22),e ; время - ld (iy+23),d ; - ld (iy+24),c ; дата - ld (iy+25),b ; - set 7,(iy+41) ; уст. признак изменения файла - and a - ret - -;------------------------------------------------- -; Закодировать время/дату -; вход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; выход: de - время -; bc - месяц/день -; ix - год -;------------------------------------------------- -A2599: ld a,l - rlca - rlca - sla a - rl h - sla a - rl h - sla a - rl h - srl b - or b - ld l,a - ld bc,-1980 - add ix,bc - ld a,e - rlca - rlca - rlca - rlca - and 0F0h - db 0DDh - ld b,l - sla a - rl b - or d - ld c,a - ex de,hl - and a - ret - - -;------------------------------------------------- -; Раскодировать время/дату -; вход: de - время -; bc - месяц/день -; ix - год -; выход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -;------------------------------------------------- -A25C3: ex de,hl - ld a,c - and 1Fh - ld d,a - srl b - rr c - ld a,c - rrca - rrca - rrca - rrca - and 0Fh - ld e,a - ld c,b - ld b,0 - ld ix,1980 - add ix,bc - ld a,l - and 1Fh - add a,a - ld b,a - srl h - rr l - srl h - rr l - srl h - rr l - srl l - srl l - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1D. Смена текущего каталога. -; Меняет текущий каталог и текущий диск, если он указан в файловой -; спецификации. Если путь начинается с "\" - это означает путь от -; корневого каталога, иначе от текущего. -; -; вход: HL - указатель на имя каталога -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_1D:call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A - ld a,(hl) - or a - call nz,A2164 - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1B. Создание каталога. -; -; вход: HL - указатель на имя каталога -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1B:call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - call A228F ; прочитать список каталога - call search_rec_dir ; поиск записи каталога в списке диска - ld a,EEXISDIR ; код "каталог существует" - ccf - ret c ; каталог найден - call A10FD - ret c - push hl - ld de,(D150E) ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - call A128B ; подкл. банку кеша FAT и записать его на диск - ld hl,T2364 - ld de,T1F3B - ld bc,11 - ldir - ex de,hl - ld a,10h ; атрибут записи каталога - ld (hl),a - inc hl - ld bc,0A00h ; b=счетчик - ld (hl),c - inc hl - djnz $-2 - push hl - call Func_21 ; узнать тек. дату и время - call A2599 ; закодировать время/дату - pop hl - ld (hl),e ; de=время - inc hl - ld (hl),d - inc hl - ld (hl),c ; день - inc hl - ld (hl),b ; месяц - inc hl - pop de - push de - ld (hl),e - inc hl - ld (hl),d - inc hl - ld bc,0400h ; b=счетчик - ld (hl),c - inc hl - djnz $-2 - call A1F5B ; скопир. новую запись в список диска (каталога) - call flush_cash_dir ; сбросить кеш каталога на диск - ld hl,T0400 ; буфер - ld (hl),"." ; запись тек. каталога - ld bc,0A20h ; b=счетчик, c=пробел - inc hl - ld (hl),c - djnz $-2 - inc hl - ld de,T1F3B+11 ; ячейка атрибутов файла - ex de,hl - ld bc,21 - ldir - ex de,hl - ld (hl),"." ; запись родит. каталога - inc hl - ld (hl),"." - ld bc,0920h ; b=счетчик, c=пробел - inc hl - ld (hl),c - djnz $-2 - inc hl - push hl - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - pop hl - push af ; старая банка порта - ld a,(LC000) - cp "." - ld de,LC000+11 ; атрибуты записи - jr z,A26A9 - ld ix,T1F3B - xor a - ld (ix+26),a - ld (ix+27),a - ld de,T1F3B+11 ; ячейка атрибутов файла -A26A9: ex de,hl - ld bc,21 - ldir - pop af - out (0E2h),a ; восст. порт - ex de,hl - ld d,h - ld e,l - inc de - ld (hl),0 - ld bc,447 - ldir - pop hl - call A1CB8 - ld a,(D0083) ; секторов на кластер -A26C4: push af - push hl ; ст. разряд - push ix ; номер лог. сектора - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - ld de,LC400 ; буфер - ld b,1 ; число секторов - ld a,(disk) ; номер диска - ld c,6 ; запись секторов - rst 18h - pop af - out (0E2h),a - ld hl,T0400 ; откуда - ld de,T0400+1 ; куда - ld bc,512-1 - ld (hl),0 - ldir - pop ix - pop hl - inc ix - db 0DDh - ld a,h - db 0DDh - or l - jr nz,$+3 - inc hl - pop af - dec a - jr nz,A26C4 - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1C. Удаление каталога. -; Можно удалить только пустой каталог. -; -; вход: HL - указатель на имя каталога -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1C:call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - call A228F ; прочитать список каталога - call search_rec_dir ; поиск записи каталога в списке диска - ret c ; не найден - ld hl,(D1F55) - push ix -A2724: push hl - call A1CB8 - ld a,(D0083) ; секторов на кластер -A272B: push af - push hl ; ст. разряд - push ix ; номер лог. сектора - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - ld de,LC400 ; буфер - ld bc,0105h ; чтение одного сектора - ld a,(disk) ; номер диска - rst 18h - pop af - out (0E2h),a - ld b,16 - ld hl,T0400 -A2748: ld a,(hl) - or a - jr z,A2783 - cp "." - jr z,A2761 - cp 0E5h ; байт удаления файла - jr z,A2761 - ld de,11 ; смещ. до байта атрибутов - add hl,de - ld a,(hl) - sbc hl,de - ;bit 3,a ;@@ бит "метка тома" - and 00001000b ; 7 тактов - jr z,A278A -A2761: ld de,32 - add hl,de - djnz A2748 - pop ix - pop hl - inc ix - db 0DDh - ld a,h - db 0DDh - or l - jr nz,$+3 - inc hl - pop af - dec a - jr nz,A272B - pop hl ; номер кластера - call A1132 ; прочитать из кеша FAT-а номер след. кластера - ex de,hl ; hl=номер след. кластера - jr nc,A2724 ; не конец цепочки -A277E: pop ix - jp mark_delete ; пометить запись как "удаленная" - ; -A2783: pop ix - pop hl - pop af - pop hl - jr A277E - ; -A278A: pop ix - pop hl - pop af - pop hl - pop ix - ld a,ENOEMPTY ; код "каталог не пуст" - scf - ret - - - - -D2795: dw 0 - - -;///////////////////////////////////////////////////////////////////// -; Функция #47. Получение информации приложения. -; -; вход: HL - буфер данных -; B - номер подфункции: -; B=0 - получение параметров командной строки -; B=1 - получение полного пути к каталогу программы -; B=2 - получение полного пути и имени файла программы -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_47: inc b - djnz A27A8 - ex de,hl - xor a - ld (de),a - ld hl,(D2795) - ld c,(hl) - inc c - ret z - inc hl - ldir - and a - ret - -; Получение параметров командной строки -A27A8: djnz A27CF - ex de,hl - ld hl,(D2795) - ld c,(hl) - inc hl - add hl,bc - inc hl - inc hl - push hl - ld bc,256 - xor a - cpir - ld a,'\' - cpdr - inc hl - inc hl - pop bc - and a - sbc hl,bc - ld a,b - ld b,h - ld h,a - ld a,c - ld c,l - ld l,a - ldir - xor a - ld (de),a - ret - -; Получение полного пути к каталогу программы -A27CF: djnz A27E1 - ex de,hl - ld hl,(D2795) - ld c,(hl) - inc hl - add hl,bc - inc hl - inc hl -A27DA: ld a,(hl) - ldi - or a - jr nz,A27DA - ret - ; -A27E1: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #45. Разбор командной строки. -; -; вход: HL - указатель командной строки -; DE - указатель на буфер пользователя -; B - номер подфункции: -; 0 - Разобрать строку -; 1 - Выделить имя диска -; 2 - Выделить директорию -; 3 - Выделить имя файла -; 4 - Выделить расширение файла -; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла -; 6 - Зарезервировано -; 7 - Выделить параметр командной строки -; 8 - Преобразовать из 11 символьного формата в формат ДОС -; 9 - Преобразовать из формата ДОС в 11 символьный формат -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_45:exx - ld hl,T0400 - ld (D2947),hl - ld hl,T2952 - ld (D2943),hl - ld hl,T295F - ld (D2945),hl - ld hl,T2949 - ld (D2941),hl - exx - inc b - dec b - jr z,A2857 ; разобрать строку - dec b - jr z,A2825 ; выделить имя диска - dec b - jr z,A2845 ; выделить директорию - dec b - jr z,A284B ; выделить имя файла - dec b - jr z,A2851 ; выделить расширение файла - dec b - jr z,A2859 ; выделить диск, путь, файл и расш. - dec b ; зарезервировано - jr z,A2821 - dec b - jp z,Func_43 ; выделить параметр ком-строки - dec b - jp z,A1FB8 ; преобр. имя 11 -> 8.3 формат - dec b - jp z,A2384 ; преобр. имя 8.3 -> 11 формат -A2821: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -; Выделить имя диска -A2825: ld (D2941),de - call A287C - ret c - ld de,(D2941) - ld a,(de) - dec a - cp -1 - ret z - cp "@" - jr c,A2841 - cp "Z" - jr nc,A2841 - sub "A"-1 - ret - ; -A2841: ld a,EINVDRV ; код "не верный номер устройства" - scf - ret - -; Выделить директорию -A2845: ld (D2947),de - jr A287C - -; Выделить имя файла -A284B: ld (D2943),de ; куда - jr A287C - -; Выделить расширение файла -A2851: ld (D2945),de - jr A287C - -; Разобрать строку -A2857: jr A287C - -; Выделить диск, путь, файл и расш. -A2859: ex de,hl - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (D2941),bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (D2947),bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (D2943),bc - ld c,(hl) - inc hl - ld b,(hl) - ld (D2945),bc - ex de,hl - jr A287C - - -A287C: ex af,af' - exx - xor a - ld hl,(D2947) - ld (hl),a - ld hl,(D2943) ; адрес буфера под имя файла - ld (hl),a - ld hl,(D2945) - ld (hl),a - ld hl,(D2941) - ld (hl),a - exx - ex af,af' -A2891: ld de,T2934 - ld bc,0D01h ; счетчики -A2897: ld a,(hl) - call upper ; a..z -> A..Z - ld (de),a - inc hl - inc de - inc c ; ++счетчик - cp '\' - jr z,A2916 - cp ":" - jr z,A2900 - cp " "+1 - jr c,A28BF - cp "?" - jr z,A28B9 - cp "*" - jr z,A28B9 -A28B3: djnz A2897 - ld a,EINVFNAM ; код "неверное имя" - scf - ret - ; -A28B9: ex af,af' - set 7,a - ex af,af' - jr A28B3 - ; -A28BF: ld a,2 - cp c - jr z,A28FD - push hl - ld hl,T2934 - ld de,(D2943) ; адрес буфера под имя файла - ld b,0 - dec c - dec c - ld a,c - ldir - ld c,a - xor a - ld (de),a - ld hl,(D2943) ; адрес буфера под имя файла - ld a,"." - cpir - jr nz,A28F8 - ld c,3 - ld de,(D2945) -A28E5: ld a,(hl) - or a - jr nz,A28EC - ld a," " - dec hl -A28EC: ld (de),a - inc hl - inc de - dec c - jr nz,A28E5 - xor a - ld (de),a - ex af,af' - set 1,a ; указано расш. файла - ex af,af' -A28F8: ex af,af' - set 0,a ; указано имя файла - ex af,af' - pop hl -A28FD: ex af,af' - and a - ret - - -A2900: xor a - ld (de),a - push hl - ld hl,T2934 - ld de,(D2941) - ld b,0 - ldir - pop hl - ex af,af' - set 3,a ; указано имя диска - ex af,af' - jp A2891 - - -A2916: xor a - ld (de),a - push hl - push bc - ld hl,(D2947) - ld bc,255 - cpir - dec hl - ex de,hl - ld hl,T2934 ; 12 пробелов - pop bc - ld b,0 - ldir - pop hl - ex af,af' - set 2,a ; указан путь файла - ex af,af' - jp A2891 - - - -T2934: db " ",0 ; 12 пробелов - - -D2941: dw T2949 -D2943: dw T2952 -D2945: dw T295F -D2947: dw T0400 ; 512 байт, ".", ".." записи - - -T2949: ds 9 - -T2952: db " ",0 ; 9 пробелов - -T295F: db " ",0 - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #43. Выделить параметр командной строки. -; -; вход: HL - указатель командной строки -; DE - буфер для выдел. параметра -; выход: HL - указатель на след. параметр ком-строки -; CF=0 - конец строки не достигнут (есть другие параметры) -; CF=1 - конец строки (в буфер перенесён последний параметр или ноль) -;///////////////////////////////////////////////////////////////////// -Func_43:xor a - ld (de),a -A2965: ld a,(hl) - inc hl - cp " " - ret c - jr z,A2965 -A296C: ld (de),a - ld a,(hl) - inc hl - inc de - cp " "+1 - jr nc,A296C - cp " " - ld a,0 - ld (de),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3C. Информация о памяти. -; -; вход: нет -; выход: HL - общее кол-во страниц -; BC - кол-во своб. страниц -;///////////////////////////////////////////////////////////////////// -Func_3C:ld c,0C0h - rst 08h - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3D. Выделение блока памяти. -; -; вход: B - размер блока в страницах по 16kB -; выход: A - идентификатор блока памяти, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3D:ld c,0C2h - rst 08h - ld e,a - ld a,ENOMEM ; код "не хватает памяти" - ret c - ld d,0 - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - ld a,(D2E70) ; уровень текущей программы - ld (hl),a - ld a,e - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3E. Освобождение блока памяти. -; -; вход: A - идентификатор блока памяти -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3E:ld e,a - ld d,0 - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - ld a,(D2E70) ; уровень текущей программы - cp (hl) - ld a,EINVMEM ; код "не существующий блок памяти" - scf - ret nz - push de - ld a,e - ld c,0C3h - rst 08h - pop de - ld a,EINVMEM ; код "не существующий блок памяти" - ret c - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - xor a - ld (hl),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3F. Изменение блока памяти. -; -; вход: A - идентификатор блока памяти -; B - новый размер блока -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3F:ld e,a - ld d,0 - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - ld a,(D2E70) ; уровень текущей программы - cp (hl) - ld a,EINVMEM ; код "не существующий блок памяти" - scf - ret nz - ld d,b - push de - ld a,e - call A29EE - pop de - ld a,EINVMEM ; код "не существующий блок памяти" - ret c - ld a,b - cp d - ret z - jr c,A29DB - ld b,d - ld a,e - ld c,9Dh - rst 08h - ld a,b - ld c,0C3h - rst 08h - xor a - ret - ; -A29DB: ld a,d - sub b - ld b,a - ld c,e - push bc - ld c,0C2h - rst 08h - pop bc - ld b,a - ld a,ENOMEM ; код "недостаточно памяти" - ret c - ld a,c - ld c,9Eh - rst 08h - xor a - ret - -A29EE: ld b,-1 - ld c,a -A29F1: inc b - push bc - ld a,c - ld c,0C4h - rst 08h - pop bc - jr nc,A29F1 - or a - scf - ret z - xor a - ret - -A29FF: ld hl,list_pages ; массив списка выдел. страниц - ld bc,256 -A2A05: ld a,(D2E70) ; уровень текущей программы - cpir - ret nz - push hl - push bc - dec hl - and a - ld de,256 - sbc hl,de - ld a,l - call Func_3E ; освоб. блок памяти - pop bc - pop hl - jr A2A05 - - - -;///////////////////////////////////////////////////////////////////// -; Функция #38. Подключение страницы памяти. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_38:bit 7,h - jr z,Func_39 ; в 1-е - bit 6,h - jr z,Func_3A ; во 2-е - jr Func_3B ; в 3-е - - -;///////////////////////////////////////////////////////////////////// -; Функция #39. Подключение страницы памяти в первое окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_39:ld c,0C4h - ex de,hl - rst 08h - ex de,hl - ret c - ld c,0A2h - in b,(c) - out (c),a - ld a,b - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #3A. Подключение страницы памяти во второе окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3A:ld c,0C4h - ex de,hl - rst 08h - ex de,hl - ret c - ld c,0C2h ; порт - in b,(c) - out (c),a - ld a,b - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #3B. Подключение страницы памяти в третье окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3B:ld c,0C4h - ex de,hl - rst 08h - ex de,hl - ret c - ld c,0E2h - in b,(c) - out (c),a - ld a,b - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #40. Выполнить файл. -; -; вход: HL - указатель на имя файла -; B=0 - загрузить и выполнить программу -; выход: A - код завершения, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_40: inc b - dec b - jp z,A2AFE - dec b - jp z,A2B09 - ld a,EINVFNC ; код "не верный номер функции" - scf - ret - - - -A2A5D: ld a,(hl) - inc hl - cp '\' - ret z - cp "/" - ret z - cp " "+1 - jr nc,A2A5D - ret - - -A2A6A: ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - call Func_02 ; получить номер тек. диска - add a,"A" - ld hl,LFD00 - ld (hl),a - inc hl - ld a,":" - ld (hl),a - inc hl - call Func_1E ; инфа о тек. каталоге - call A2AC1 - ld hl,LFC80 -A2A87: ld e,(hl) - inc hl - ld d,(hl) - inc hl - bit 1,(hl) - inc hl - push hl - push bc - ex de,hl - call z,A2AB8 - call Func_1D ; смена текущего каталога - jr c,A2AAC - ld hl,D2E7C ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - jr c,A2AAC - call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) - jr c,A2AAC ; не совпадает - call search_rec_file ; поиск записи файла в списке диска -A2AAC: pop bc - pop hl - jr nc,A2AB3 ; запись найдена - djnz A2A87 - scf -A2AB3: pop bc - ld a,b - out (0E2h),a ; восст. порт - ret - -A2AB8: push hl - ld hl,LFD00 - call Func_1D ; смена текущего каталога - pop hl - ret - -A2AC1: ld hl,LFC7F - ld de,LFDFF - ld b,0 -A2AC9: ld (hl),c - inc hl - xor a - ld (de),a - ld c,a - inc de - ld (hl),e - inc hl - ld (hl),d - inc hl - inc b -A2AD4: ld a,(de) - cp '\' - jr nz,A2ADB - set 1,c -A2ADB: ld a,(de) - cp ";" - jr z,A2AC9 - inc de - cp ":" - jr z,A2AD4 - or a - jr nz,A2ADB - ld (hl),c - inc hl - ld (hl),a - inc hl - ld (hl),a - ret - - -T2AEE: db "PATH=",0 ; имя перем. окружения - - -; ++уровня текущей программы -A2AF4: ld hl,D2E70 - inc (hl) - ret - -; --уровня текущей программы -A2AF9: ld hl,D2E70 - dec (hl) - ret - - - -;------------------------------------------------------------------------ -; Загрузить и выполнить программу. -; функ. 40h, B=0. -; -; 1) Открывает exe-файл на чтение; -; 2) Считывает в рабочую область префикс exe-файла; -; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного -; загрузчика, если его размер не равен нулю; -; 4) Сохраняет стек; -; 5) Подключает страницы из выделенного блока; -; 6) Строит префикс запуска программы и устанавливает на него регистр IX; -; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения -; кода в памяти); -; 8) Закрывает exe-файл, если это не первичный загрузчик; -; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека); -; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); -; -; Префикс запуска файла: -; -; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком -; -02 1 db ? ; Идентификатор блока памяти -; -01 1 db ? ; Уровень текущей программы -; +00 1 db ? ; Длина ком-строки -; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем -;------------------------------------------------------------------------ -A2AFE: ld (D2E78),hl - call A2A5D - ld hl,(D2E78) - jr c,A2B32 -; B=1. -A2B09: ld (D2E78),hl - ld a,1 - ld (D1F3A),a ; раб. ячейка - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) - ld a,ENOFILE ; код "файл не найден" - ret c - call A2AF4 - call A1E89 - jr nc,A2B75 - jr A2AF9 - ; -A2B32: ld a,1 - ld (D1F3A),a ; раб. ячейка - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) - ld a,ENOFILE ; код "файл не найден" - ret c - call A2AF4 - call A1E89 - jr nc,A2B75 - call A2AF9 - ld hl,T2AEE ; имя перем. окружения "PATH=" - ld de,LFE00 ; куда - ld b,1 ; получить перем. окружения - call Func_46 ; функция сист. окружения - ld hl,(D2E78) - ld de,D2E7C -A2B67: ld a,(hl) - ldi - or a - jr nz,A2B67 - call A2A6A - ld hl,(D2E78) - jr A2B09 - ; -A2B75: ld (D2E76),a ; сохр. дескр. файла - ld hl,D2E7C ; буфер - ld de,128 ; число чит. байт - ld a,(D2E76) ; дескр. файла - call Func_13 ; чтение из файла - jp c,A2CD7 - ld ix,D2E7C - ld hl,(D2E7C) - ld de,"XE" ; сигнатура - sbc hl,de - ld a,EINVEXE ; код "неправильный EXE-файл" - scf - jp nz,A2CD7 - ld a,(ix+3) - or a - ld a,ENSUPEXE ; код "не поддерж. версия EXE-файла" - scf - jp nz,A2CD7 - - - ld de,(D2E84) - ld a,e - or d - jp nz,A2CE4 - ld l,a - ld h,a - push hl - pop ix - ld b,2 ; от конца файла - ld a,(D2E76) ; дескр. файла - call Func_15 ; перемещение указателя в файле - ld de,(D2E8C) - ld a,d - and 3Fh - ld d,a - add ix,de - ld de,0 - adc hl,de - ld a,xh - sla a - rl l - rl h - sla a - rl l - rl h - or xl - jr z,1F - inc hl -1: ld a,h - or a - jp nz,A2CD5 - ld b,l - call Func_3D ; выделить блок памяти - jp c,A2CD5 - ld (D2E77),a ; идентиф. блока памяти - exx - pop de - ld hl,0 - add hl,sp - ld sp,(D2E7A) - push hl - push de - in a,(0E2h) - ld d,a - in a,(0C2h) - ld e,a - in a,(0A2h) - push de - push af - ld (D2E7A),sp - ld sp,hl - exx - ld a,(D2E77) ; идентиф. блока памяти - ld de,T2E71 - ld bc,00C4h - rst 08h - ld (de),a - inc de - ld a,(D2E77) ; идентиф. блока памяти - ld bc,01C4h - rst 08h - ld (de),a - inc de - ld a,(D2E77) ; идентиф. блока памяти - ld bc,02C4h - rst 08h - ld (de),a - inc de - ld a,(D2E77) ; идентиф. блока памяти - ld bc,03C4h - rst 08h - ld (de),a - ld hl,(D2E78) - ld de,T0400+1 - call A2E52 - ld a,128 ;80h - sub b - ld (T0400),a - ld sp,T307A - ld a,0FFh ; номер стр. - out (0A2h),a - out (0C2h),a - out (0E2h),a - ld hl,(D2E8C) - ld de,T2E71 - ld a,h - and 0C0h - cp 40h ; 40(00)h - jr z,A2C5E - cp 80h ; 80(00)h - jr z,A2C62 - cp 0C0h ; 0C0(00)h - jr z,A2C66 -A2C5E: ld a,(de) - out (0A2h),a - inc de -A2C62: ld a,(de) - out (0C2h),a - inc de -A2C66: ld a,(de) - out (0E2h),a - call A2DE9 - ld hl,(D2E82) - ld ix,(D2E80) - ld b,0 ; от начала файла - ld a,(D2E76) ; дескр. файла - call Func_15 ; перемещение указателя в файле - ld sp,L403F - ld de,(D2E8C) - xor a - ld l,a - ld h,a - sbc hl,de - ex de,hl ; de=число чит. байт - ld hl,(D2E8C) ; буфер - ld a,(D2E76) ; дескр. файла - call Func_13 ; чтение из файла - ld a,(D2E76) ; дескр. файла - call Func_12 ; закрыть файл - ld sp,(D2E90) - ld hl,(D2E8C) - ld de,128 ;T0080 - and a - sbc hl,de - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,(D2E8E) - ld de,A2CB3 ; адрес п/п "завершить процесс" - push de - push hl - ret - ; -A2CB3: jp Func_41 ; завершить программу (процесс) - - - -;------------------------------------------------- -; Если расш. файла не задано, задать "exe". -; Если расш. файла задано, сравнить его с "exe". -;------------------------------------------------- -A2CB6: ld hl,T2E6D ; "EXE" - ld de,T236C - ld b,3 - ld a,(de) - cp " " - jr nz,A2CCB ; задано расш. - ldi - ldi - ldi - xor a - ret - ; -; сравнить расш. с "EXE" -A2CCB: ld a,(de) - cp (hl) - scf - ret nz ; не совпадает - inc hl - inc de - djnz A2CCB - xor a ; Ok - ret - - -A2CD5: ld a,1Eh -A2CD7: push af - ld a,(D2E76) ; дескр. файла - call Func_12 ; закрыть файл - ld hl,D2E70 - dec (hl) ; --уровня текущей программы - pop af - ret - -A2CE4: ex de,hl - ld de,(D2E8C) - ld a,d - and 3Fh - ld d,a - adc hl,de - xor a - sla h - rla - sla h - rla - ld b,a - ld a,h - or l - jr z,A2CFC - inc b -A2CFC: call Func_3D ; выделить блок памяти - jr c,A2CD5 - ld (D2E77),a ; идентификатор блока памяти - exx - pop de - ld hl,0 - add hl,sp - ld sp,(D2E7A) - push hl - push de - in a,(0E2h) - ld d,a - in a,(0C2h) - ld e,a - in a,(0A2h) - push de - push af - ld (D2E7A),sp - ld sp,hl - exx - ld de,T2E71 - ld bc,00C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - inc de - ld bc,01C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - inc de - ld bc,02C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - inc de - ld bc,03C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - ld hl,(D2E78) - ld de,T0400+1 - call A2E52 - ld a,80h - sub b - ld (T0400),a - ld sp,T307A - ld a,0FFh ; номер стр. - out (0A2h),a - out (0C2h),a - out (0E2h),a - ld hl,(D2E8C) - ld de,T2E71 - ld a,h - and 0C0h - cp 40h ; 40(00)h - jr z,A2D76 - cp 80h - jr z,A2D7A - cp 0C0h - jr z,A2D7E -A2D76: ld a,(de) - out (0A2h),a - inc de -A2D7A: ld a,(de) - out (0C2h),a - inc de -A2D7E: ld a,(de) - out (0E2h),a - call A2DE9 - ld hl,(D2E82) - ld ix,(D2E80) - ld b,0 ; от начала файла - ld a,(D2E76) ; дескр. файла - call Func_15 ; перемещение указателя в файле - ld sp,L403F - ld hl,(D2E8C) ; буфер - ld de,(D2E84) ; число чит. байт - ld a,(D2E76) ; дескр. файла - call Func_13 ; чтение из файла - ld sp,(D2E90) - ld hl,(D2E8C) - ld de,128 - and a - sbc hl,de - ex de,hl - ld xh,d - ld xl,e - ld hl,(D2E8E) - ld de,A2CB3 ; дос-заглушка - push de - push hl - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #41. Завершить программу (процесс). -; -; вход: B - код завершения -; выход: A - код ошибки, если CF=1 -; -; Выход из EXE-файла: -; -; 1) Освобождаются все блоки памяти которые выделялась данному приложению. -; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. -; 3) Вспоминается стек. -; 4) В регистр A помещается код возврата и выполняется RET. -; -;///////////////////////////////////////////////////////////////////// -Func_41: ld a,b - ld (return_code),a ; код завершения программы - call A29FF - ld hl,D2E70 - dec (hl) ; --уровня текущей программы - ld sp,(D2E7A) - pop af - pop hl - out (0A2h),a - ld a,l - out (0C2h),a - ld a,h - out (0E2h),a - pop de - pop hl - ld (D2E7A),sp - ld sp,hl - ex de,hl - ld a,(return_code) ; код завершения программы - and a - jp (hl) - - - -;///////////////////////////////////////////////////////////////////// -; Функция #42. Получить код завершения программы. -; -; вход: нет -; выход: A - код завершения -;///////////////////////////////////////////////////////////////////// -Func_42:ld a,(return_code) - and a - ret - -A2DE9: ld hl,(D2E8C) - dec h - ld d,h - ld e,l - inc de - ld bc,00FFh - ld (hl),b - ldir - ex de,hl - dec h - ld de,128 ;T0080 - add hl,de - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,T0400 ; откуда - ld c,(hl) - inc c - ldir - ex de,hl - ld (hl),b - ld a,(D2E70) ; уровень текущей программы - ld (ix-1),a ; в префикс exe-файла - ld a,(D2E77) ; идентификатор блока памяти - ld (ix-2),a ; в префикс exe-файла - ld a,(D2E76) ; дескр. файла - ld (ix-3),a ; в префикс exe-файла - inc hl - ld (hl),b - inc hl - call Func_02 ; получить номер тек. диска - add a,"A" - ld (hl),a - inc hl - ld a,":" - ld (hl),a - inc hl - push hl - call Func_1E ; инфа о тек. каталоге - pop hl - xor a - ld bc,256 - cpir - dec hl - dec hl - ld a,'\' - cp (hl) - inc hl - jr z,A2E3F - ld (hl),a - inc hl -A2E3F: ex de,hl - ld hl,D213A -A2E43: ld a,(hl) - ldi - cp " "+1 - jr nc,A2E43 - dec de - xor a - ld (de),a - ld (D2795),ix - ret - - -A2E52: ld bc,8021h -A2E55: ld a,(hl) - cp c - jr c,A2E61 - inc hl - djnz A2E55 - xor a - ld (de),a - ld b,80h - ret -A2E61: ld bc,8020h -A2E64: ld a,(hl) - ld (de),a - inc hl - inc de - cp c - ret c - djnz A2E64 - ret - - -T2E6D: db "EXE" - -D2E70: db 1 ; уровень текущей программы -T2E71: db 0 - db 0 - db 0 - db 0 - -return_code: - db 0 ; код завершения программы (процесса) - -D2E76: db 0 ; дескр. файла -D2E77: db 0 ; идентификатор блока памяти - -D2E78: dw 0 - - - -D2E7A: dw L317B ; адрес стека - - -; 512 байт. exe-заголовок, после раб. буфер -D2E7C: db "EXE" - db 0 ; exe версия -D2E80: dw 0 ; 512, мл. смещ. кода -D2E82: dw 0 ; ст. смещ. кода -D2E84: dw 0 ; end-beg, первичный загрузчик - dw 0,0,0 ; резерв -D2E8C: dw 0 ; адрес загрузки кода -D2E8E: dw L0000 ; адрес передачи управления -D2E90: ds 490 - - - -T307A: ds 257 -L317B: db 0 ; начало стека - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #46. Системное окружение. -; -; вход: B - номер подфункции: -; B=0, получение системного окружения -; HL - буфер -; B=1, получить переменную окружения -; HL - имя переменной -; DE - буфер для значения переменной -; B=2, установить/удалить переменную окружения -; HL - имя переменной и значение, разделенные символом "=" -; т.е. ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ -; В конце строки должен стоять нуль. -; выход: A - состояние, если CF=0 -; DE - указывает на конец буфера (только для B=1) -; A=0FFh - переменная обнаружена -; A=0 - переменная не обнаружена -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_46: inc b - jr z,A318E ; B=#FF - dec b - jr z,A31B2 ; B=0. получить сист. окружение - dec b - jr z,A31DB ; B=1. получить перем. окружения - dec b - jr z,A31FD ; B=2. установить/удалить перем. окружения - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -;------------------------------------------------- -; Инициализация буфера переменных окружения -;------------------------------------------------- -A318E: ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld de,LE400 ; начало буфера переменных окружения - xor a - ld (de),a - inc de - ld hl,DEFAULT_ENV - ld bc,1 - ldir - ld (de),a - ex de,hl - ld de,LE400 ; начало буфера переменных окружения - and a - sbc hl,de - ld (D3296),hl - pop af - out (0E2h),a ; восст. порт - and a - ret - -;------------------------------------------------- -; Получить сист. окружение -;------------------------------------------------- -A31B2: push hl - ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - ld h,a ; старая банка порта - ld c,0E2h - in l,(c) - exx - ld hl,LE400 ; начало буфера переменных окружения - inc hl - pop de - ld bc,(D3296) - exx -A31C8: out (c),l - exx - ld a,(hl) - exx - out (c),h ; восст. порт - exx - ld (de),a - inc hl - inc de - dec bc - ld a,b - or c - exx - jr nz,A31C8 - xor a - ret - -;------------------------------------------------- -; Получить переменную окружения -;------------------------------------------------- -A31DB: push de - call A325F ; скопир. строку перем. окруж. в буферы - ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - ex af,af' ; старая банка порта - call A323D ; найти конец всех переменных ? - pop de - ld a,0 - ld (de),a - jr nc,A31F7 -A31EE: ld a,(hl) - ldi - or a - jr nz,A31EE - dec de - ld a,-1 -A31F7: ex af,af' - out (0E2h),a ; восст. порт - ex af,af' - and a - ret - - -;------------------------------------------------- -; Установить/Удалить переменную окружения -; -; вход: hl=имя перем. и значение, раздел. символом "=" -;------------------------------------------------- -A31FD: ; в D2E7C "EXE" - ; в T0400 содержимое system.bat - call A325F ; скопир. строку перем. окруж. в буферы - ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - call A323D ; найти конец всех переменных ? - jr nc,A3214 - xor a - cpir - ld a,b - or c - jr z,A3214 - ldir -A3214: ld a,(T0400) - or a - jr z,A322D - ld hl,D2E7C ; 512 байт, буфер -A321D: ld a,(hl) - ldi - cp "=" ; символ разделения - jr nz,A321D - ld hl,T0400 ; откуда -A3227: ld a,(hl) - ldi - or a - jr nz,A3227 -A322D: xor a - ld (de),a - ld hl,LE400 ; начало буфера переменных окружения - ex de,hl - sbc hl,de - ld (D3296),hl - pop af - out (0E2h),a ; восст. порт - and a - ret - -; найти конец всех переменных ? -A323D: ld hl,LE400 ; начало буфера переменных окружения - ld bc,(D3296) - push hl -A3245: pop de - ld de,D2E7C ; 512 байт буфер - xor a - cpir - push hl -A324D: ld a,(hl) - or a - jr z,A325D - ld a,(de) - cp (hl) - inc hl - inc de - dec bc - jr nz,A3245 - cp "=" ; символ разделения - jr nz,A324D - scf -A325D: pop de - ret - -;----------------------------------------------------------- -; Скопировать строку переменной окружения в буферы -; (имя и значение в разные буферы) -; вход: hl=имя перем. и значение, раздел. символом "=" -;----------------------------------------------------------- -A325F: ld b,maxlen_env_string ; 255 макс. длина строки (имя+знач.) - ld de,D2E7C ; куда - xor a - ld (de),a - ld (T0400),a - ; скопир. в "D2E7C" имя переменной -A3269: ld a,(hl) - inc hl - cp "=" ; символ разделения - jr z,A3283 ; конец имени - or a - jr z,A327B ; конец строки - call upper ; a..z -> A..Z - ld (de),a - inc de - djnz A3269 - jr A3294 ; слишком длинная строка - -; значение не задано -A327B: ld a,"=" ; символ разделения - ld (de),a - inc de - xor a - ld (de),a - inc de - ret - - -A3283: ld (de),a ; сохр. "=" - inc de - xor a - ld (de),a ; в конец имени перем. - ; скопир. в "T0400" значение переменной (строку путей) - ld de,T0400 ; 512 байт, буфер - ld (de),a - ld c,255 ; чтобы "ldi" не портила "b" -A328D: ld a,(hl) - ldi - or a - ret z ; конец строки знач. переменной - djnz A328D -A3294: ld a,b - ld (de),a ; обрезать слишком длинную строку - inc de - scf - ret - - -D3296: dw 1 -DEFAULT_ENV: db 0 - - - - include "mouse.asm" ; код мышки - - - - db " " ; 12 - ds 20 - - db "FILENAME.EXT",0 - - - - -;------------------------------------------------- -; RST 18h. Вектор дисковых устройств -; вход: a=номер устройства (0-25) -;------------------------------------------------- -drv_devices: - push hl - push bc ; сохр. bc - ld c,a - add a,a ;1+1=2 - add a,c ;2+1=3 - ld c,a - ld b,0 - ld hl,A38FC ; таблица переходов - add hl,bc - ld a,(hl) - inc a - jr z,A38F4 ; было a=0FFh - dec a - inc hl - ld c,(hl) ; загр. адрес обработчика - inc hl ; - ld h,(hl) ; - ld l,c - pop bc ; восст. bc - ex (sp),hl ; адрес в стек - ret ; перейти на него - ; -A38F4: pop bc - pop hl - ld a,EINVDRV ; код "неверный номер устройства" - scf - ret - - - -A38FA: dw A38FC - - -; Таблица адресов обработчиков девайсов. 26 элементов (диски A..Z ?). -A38FC: db -1 ;00 - dw -1 - db -1 ;01 - dw -1 - db -1 ;02 - dw -1 - db -1 ;03 - dw -1 - db -1 ;04 - dw -1 - db -1 ;05 - dw -1 - db -1 ;06 - dw -1 - db -1 ;07 - dw -1 - db -1 ;08 - dw -1 - db -1 ;09 - dw -1 - db -1 ;10 - dw -1 - db -1 ;11 - dw -1 - db -1 ;12 - dw -1 - db -1 ;13 - dw -1 - db -1 ;14 - dw -1 - db -1 ;15 - dw -1 - db -1 ;16 - dw -1 - db -1 ;17 - dw -1 - db -1 ;18 - dw -1 - db -1 ;19 - dw -1 - db -1 ;20 - dw -1 - db -1 ;21 - dw -1 - db -1 ;22 - dw -1 - db -1 ;23 - dw -1 - db -1 ;24 - dw -1 - db -1 ;25 - dw -1 - db -1 ; конец - - - - -;----------------------------------------------------------- -; Просканировать систему на FDD/HDD девайсы и RAM-диски -;----------------------------------------------------------- -scan_all_devices: - xor a - ld (last_drive),a ; сбр. ячейку - ld hl,A38FC - ld (A38FA),hl ; восст. ячейку - ; FDD девайсы - ld c,a ; c="open device" - call A3D7A ; узнать число FDD-девайсов - ld de,A3D7A ; адрес обработчика тек. девайса - call A397B ; иниц. таблицу переходов - ; HDD девайсы - xor a - ld c,a ; c="open device" - call A39CC ; узнать число HDD-девайсов - ld de,A39CC ; адрес обработчика тек. девайса - call A397B ; иниц. таблицу переходов - ; RAM-диски - xor a - ld c,a ; c="open device" - call A3E5E ; узнать число RAM-дисков - ld de,A3E5E ; адрес обработчика тек. девайса - call A397B ; иниц. таблицу переходов - xor a - ret - - - -; Инициировать таблицу переходов девайса. -; вход: de=адрес обработчика девайса -; a=число девайсов (0=нет) -A397B: ld c,a - ld hl,last_drive ; ячейка номера посл. диска - add a,(hl) - ld (hl),a - ld a,c - ld c,0 ; сбр. - or a - ret z ; нет девайсов - ld hl,(A38FA) ; тек. полож. в таблице -A3989: ld (hl),c ; индекс ? - inc hl - ld (hl),e ; de=адрес обработчика - inc hl - ld (hl),d - inc hl - inc c ; ++индекс ? - dec a - jr nz,A3989 - ld (A38FA),hl ; сохр. новое полож. в таблице - dec a - ld (hl),a ; a=0FFh - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. -; -; вход: нет -; выход: A - номер последнего лог. диска в системе -;///////////////////////////////////////////////////////////////////// -Func_08:di - call scan_all_devices ; перескан. все девайсы - ld a,(last_drive) - ei - ret - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #09. Номер системного диска. -; Возвращает номер диска, c которого загружена система. -; -; вход: B = 0 (01h - исп. boot-загрузчик системы) -; выход: A - номер системного диска (0=A,1=B,..) -;///////////////////////////////////////////////////////////////////// -Func_09: inc b - dec b - jr z,A39A5 - dec b - jr z,A39AA ; с какого диска загр. система (для загрузчика) - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A39A5: db 3Eh ; ld a,.. -boot_disk: - db -1 ; номер диска, с которого загружалась система - and a - ret - -; Сообщить DSS с какого диска загружается система. -; Исп. загрузчик системы для иниц. ячейки "boot_disk". -A39AA: ld b,a - ld c,0 -A39AD: push bc - ld a,c - ld bc,0008h ; получить геометрию диска - ld de,55AAh ; сигнатура - rst 18h - pop bc - jr c,A39C3 ; ошибка - ex af,af' - cp b - jr nz,A39C3 - ld a,c - ld (boot_disk),a ; иниц. ячейку - and a - ret - ; -A39C3: inc c ; ++номер boot-диска - ld a,(last_drive) ; номер посл. диска системы - cp c - jr nz,A39AD - scf - ret - - -;------------------------------------------------- -; Обработчик HDD (rst 18h) -;------------------------------------------------- -A39CC: inc c - dec c ; c=0 - jr z,A3A01 - dec c ; c=1 open - jp z,A3BD1 - dec c ; c=2 close - jp z,A3BD3 - dec c ; c=3 media check (смена носителя) - jp z,A3BD5 - dec c ; c=4 get BPB - jp z,A3BD9 - dec c ; c=5 input (чтение секторов) - jp z,A3C27 - dec c ; c=6 output (запись секторов) - jp z,A3C1C - dec c ; c=7 - jp z,A3BCD - dec c ; c=8 узнать геометрию диска - jp z,A3B34 - dec c ; c=9 - jr z,A39FD - dec c ; c=10 - jp z,A3C06 - dec c ; c=11 - jp z,A3C11 -A39FD: ld a,1 ; код "bad command" - scf - ret - -; c=0 -A3A01: push iy - ld hl,T3A4C ; таблица лог.дисков (16*12) - ld (D3D78),hl ; адрес структуры тек. лог. диска - ld ix,L4000 ; буфер под список (5 байт) - ld c,5Fh ; список дисковых устройств - rst 08h - xor a - ld b,(ix+2) ; кол-во HDD устройств - cp b - jr z,A3A25 ; нет винтов - ; - ld c,80h ; мастер на первом канале -A3A19: push bc - ld a,c - ld (D3D6F),a ; номер девайса (80h/81h мастер/слейв) - call A3C9A ; узнать лог. диски винта и создать их таблицы - pop bc - inc c ; слейв на первом канале - djnz A3A19 - ; -A3A25: pop iy - ld hl,(D3D78) ; адрес структуры тек. лог. диска - ld de,T3A4C ; таблица лог.дисков (16*12) - xor a ; счетчик лог. дисков - sbc hl,de - ret z ; структура первого лог. диска - ld de,16 ; размер структуры лог. диска - inc a - sbc hl,de - jr nz,$-3 ; перейти на структуру первого лог. диска - and a ; a=кол-во лог.дисков - ret - - -; нет обращения -;L3A3B: ld a,0FFh - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret - - -; Таблица лог. дисков ДОС-а -; -; +0 - номер девайса (80h,...) -; +1,+2,+3,+4 - абс. номер нач. сектора лог. диска -; +5,+6,+7,+8 - размер лог. диска (число секторов) -; -; -T3A4C: ds 16*12 ; 192 C..N - - -; вход: a=0..11 (индекс) -; выход: ix,hl - абс. номер нач. сектора -; a - номер девайса (80h,...) -A3B0C: push de - push bc - push hl - ld l,a - ld h,0 - add hl,hl ;1+1=2 - add hl,hl ;2+2=4 - add hl,hl ;4+4=8 - add hl,hl ;8+8=16 - ex de,hl - ld iy,T3A4C ; таблица лог.дисков (16*12) - add iy,de - ld c,(iy+1) ; абсолютный номер - ld b,(iy+2) ; начального сектора - ld e,(iy+3) ; раздела - ld d,(iy+4) ; - pop hl - add ix,bc - adc hl,de - ld a,(iy+0) ; тип девайса (80h,...) - pop bc - pop de - ret - -;c=8. Узнать геометрию диска (CHS) -A3B34: bit 7,b - jr nz,A3B49 - inc b - dec b ; b=0 - jr z,A3B6F - dec b ; b=1 - jr z,A3B5C - dec b ; b=2 - jr z,A3B60 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A3B49: res 7,b - inc b - dec b - jr z,A3B65 - dec b - jr z,A3B67 - dec b - jr z,A3B6B - ld a,1 ; код "bad command" - scf - ret - ; -A3B5C: ld a,0Bh ; код "failure" - scf - ret - ; -A3B60: ld b,l - jp A3C32 - ; -A3B65: and a - ret - ; -A3B67: ld a,0Bh ; код "failure" - scf - ret - ; -A3B6B: ld a,0Bh ; код "failure" - scf - ret - -;c=8. Узнать геометрию диска (CHS) -;b=0. -; вход: a - индекс (0..11) -A3B6F: ex de,hl - ld bc,55AAh ; сигнатура раздела - and a - sbc hl,bc - ld l,a ; индекс раздела - ld a,0Bh ; код "failure" - scf - ret nz - push iy - ld h,0 - add hl,hl ; *16 - add hl,hl - add hl,hl - add hl,hl - ld b,h - ld c,l - ld iy,T3A4C ; таблица лог.дисков (16*12) - add iy,bc - ld e,(iy+5) ; размер раздела (число секторов) - ld d,(iy+6) ; - ld l,(iy+7) ; ст. разряд - ld h,(iy+8) ; - ld a,(iy+0) ; тип девайса (80h,...) - ld c,a - ld iy,LC1C0 ; LC000+01BEh+2 ?? - and 0Fh - jr z,A3BA7 ; - ld iy,LC1C8 ; LC000+01BEh+0Ah ?? -A3BA7: in a,(0E2h) - push af - ld a,0FEh ; номер стр. - out (0E2h),a - ld a,(iy+0) - exx - ld l,(iy+3) ; - ld h,(iy+4) ; - ld e,(iy+2) ; - ld d,0 - ld b,d - ld c,(iy+1) ; - exx - ex af,af' - pop af - out (0E2h),a - ld a,c - ex af,af' - pop iy - and a - ret - - -A3BCD: ld a,1 ; код "bad command" - and a - ret - -A3BD1: xor a - ret - -A3BD3: xor a - ret - -A3BD5: ld a,-1 - and a - ret - - - -A3BD9: push iy - push de - ld l,a - ld h,0 - add hl,hl ; *16 - add hl,hl - add hl,hl - add hl,hl - ld b,h - ld c,l - ld iy,T3A4C ; таблица лог.дисков (16*12) - add iy,bc - ld e,(iy+1) ; мл. разряд номера сектора - ld d,(iy+2) - ld l,(iy+3) ; ст. разряд - ld h,(iy+4) - db 0DDh - ld l,e - db 0DDh - ld h,d - ld a,(iy+0) ; тип девайса (80h,...) - pop de ; буфер - pop iy - ld bc,0155h ; прочитать один сектор - rst 08h - ret - -A3C06: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,52h ; чтение секторов в зад. блок памяти - rst 08h - pop iy - ret - -A3C11: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,53h ; ? - rst 08h - pop iy - ret - -A3C1C: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,56h ; записать "b" секторов - rst 08h - pop iy - ret - -A3C27: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,55h ; прочитать "b" секторов - rst 08h - pop iy - ret - -A3C32: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,54h ; проверка секторов (не работает?) - rst 08h - pop iy - ret - - -; на лог. диск раздела -A3C3D: ld e,(iy+8) ; абсолютный (лог.) номер - ld d,(iy+9) ; начального сектора - ld l,(iy+10) ; раздела - ld h,(iy+11) ; - ld ix,(D3D70) ; мл.разряд - add ix,de - ld de,(D3D72) ; ст.разряд - adc hl,de - db 0DDh - ld d,h - db 0DDh - ld e,l - ld ix,(D3D78) ; адрес структуры тек. лог. диска - ld (ix+1),e - ld (ix+2),d - ld (ix+3),l - ld (ix+4),h - ; - ld e,(iy+12) ; размер раздела (число секторов) - ld d,(iy+13) ; - ld l,(iy+14) ; ст. разряд - ld h,(iy+15) ; - ld (ix+5),e - ld (ix+6),d - ld (ix+7),l - ld (ix+8),h - ld a,(D3D6F) ; номер девайса (80h/81h мастер/слейв) - ld (ix+0),a - ld de,16 ; размер таблицы лог.диска ? - add ix,de - ld (D3D78),ix ; адрес структуры след. лог. диска -A3C90: ld de,16 ; размер раздела - add iy,de - pop bc - djnz A3CD3 ; проверить след. раздел - and a ; конец разделов в MBR - ret - - -;---------------------------------------------------- -; Узнать лог. диски винта и создать их таблицы -;---------------------------------------------------- -A3C9A: in a,(0E2h) ; сохр. стр. - push af - ld a,0FFh ; номер стр. - out (0E2h),a - call A3CA8 - pop af - out (0E2h),a ; восст. стр. - ret - -A3CA8: ld ix,0 - ld de,0 - ld (D3D74),de - ld (D3D76),ix - ; цикл -A3CB7: ld (D3D70),de ; мл.разряд номера сектора - ld (D3D72),ix ; ст.разряд - call read_one_sector ; прочитать один сектор (MBR, 0-й сектор) - ld hl,(LC000+510) ; конец сектора - ld de,0AA55h ; сигнатура таблицы разделов - and a - sbc hl,de - jr nz,A3D1A ; не знакомый раздел, выйти - ld iy,LC000+01BEh ; на описатель 1-го раздела - ld b,4 ; макс. число разделов винта -A3CD3: push bc - ; тест на расш. раздел - ld a,(iy+4) ; байт-идентиф. раздела - cp 5 ; "Расширенный" 0-2Гб (MS-DOS 3.3) - jr nz,A3CFE - ; на след. раздел -A3CDB: push iy - ld de,(D3D70) ; мл.разряд номера сектора - ld ix,(D3D72) ; ст.разряд - push de - push ix - call next_partition ; на след. раздел - pop ix - pop de - ld (D3D70),de ; мл.разряд номера сектора - ld (D3D72),ix ; ст.разряд - call read_one_sector ; прочитать один сектор - pop iy - jr A3C90 - ; - ; тест на расш. раздел -A3CFE: cp 0Fh ; "Расширенный" 0-2Гб (Win95) - jr z,A3CDB ; на след. раздел - ; тест на осн. раздел - cp 0Eh ; "Основной" 32Мб-2Гб FAT16 (Win95) - jp z,A3C3D ; на лог. диск раздела - cp 6 ; "Основной" 32Мб-2Гб FAT16 (MS-DOS 4.0) - jp z,A3C3D - cp 4 ; "Основной" 16Мб-32Мб FAT16 (MS-DOS 3.0) - jp z,A3C3D - cp 1 ; "Основной" 0Мб-15Мб FAT12 (MS-DOS 2.0) - jp z,A3C3D - call test_others; ; поставил - jr z,A3CDB; ; на след. раздел - pop bc - or a - ret z ; конец разделов -A3D1A: scf ; не знакомый раздел - ret - -; перейти на след. раздел -next_partition: - ld hl,(D3D74) - ld de,(D3D76) - ld a,l - or h - or e - or d - ld e,(iy+8) ; абсолютный (лог.) номер - ld d,(iy+9) ; начального сектора - ld l,(iy+10) ; раздела - ld h,(iy+11) ; - jr nz,A3D44 - ld (D3D74),de - ld (D3D76),hl - ld ix,(D3D76) - jp A3CB7 - ; -A3D44: ld ix,(D3D74) ; мл. разряд - add ix,de - push ix - ld de,(D3D76) ; ст. разряд - adc hl,de - push hl - pop ix - pop de - jp A3CB7 - -; тест на другие типы разделов -; вход: a - тип раздела -; выход: Z - на след. раздел -test_others: - cp 0Bh ; "Основной" 512Мб-2Тб FAT32 (OSR2) - ret z - cp 7 ; NTFS - ret z - cp 82h ; Linux swap - ret z - cp 83h ; Linux - ret z - cp 0EBh ; BeOS - ret - - -;------------------------------------------------- -; Чтение одного сектора в буфер 0C000h -;------------------------------------------------- -read_one_sector: - push iy - ld ix,(D3D70) ; мл.разряд номера сектора - ld hl,(D3D72) ; ст.разряд - ld de,LC000 ; буфер - ld bc,0155h ; прочитать один сектор - ld a,(D3D6F) ; номер девайса (80h/81h мастер/слейв) - rst 08h - pop iy - ret - - -D3D6F: db 0 ; номер девайса (80h/81h мастер/слейв) - ; -D3D70: dw 0 ; мл.разряд номера сектора -D3D72: dw 0 ; ст.разряд -D3D74: dw 0 -D3D76: dw 0 - ; -D3D78: dw T3A4C ; адрес структуры тек. лог. диска - - - - -;------------------------------------------------- -; Обработчик FDD (rst 18h) -;------------------------------------------------- -A3D7A: inc c - dec c ; c=0 - jr z,A3DA7 - dec c ; c=1 - jr z,A3DAB - dec c ; c=2 - jr z,A3DAF - dec c ; c=3 - jr z,A3DB1 - dec c ; c=4 - jr z,A3DB5 - dec c ; c=5 - jr z,A3DDB - dec c ; c=6 - jr z,A3DDF - dec c ; c=7 - jp z,A3E5A - dec c ; c=8 - jr z,A3DE3 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret -; c=0 -A3DA7: ld a,2 - and a - ret -; c=1 -A3DAB: ld c,51h ; сбр. контроллер и настр. на диск - rst 08h - ret -; c=2 -A3DAF: xor a - ret -; c=3 -A3DB1: ld a,-1 - and a - ret -; c=4 -A3DB5: ld ix,0 ; мл. разряд номера сектора - ld hl,0 ; ст. разряд - push de - push af - ld bc,0155h ; прочитать один сектор - rst 08h - pop de - pop hl - ret c - ld bc,24 - add hl,bc - ld e,(hl) - push de - ld a,d - ld c,58h ; получить парам. носителя - rst 08h - ld a,h - pop hl - push hl - ld h,a - pop af - ld c,59h ; уст. парам. носителя - rst 08h - xor a - ret - -; c=5 -A3DDB: ld c,55h ; чтение с девайса - rst 08h - ret -; c=6 -A3DDF: ld c,56h ; запись на девайс - rst 08h - ret -; c=8 -A3DE3: bit 7,b - jr nz,A3DF0 - inc b - dec b - jr z,A3DFB - ld a,1 ; код "bad command" - scf - ret - ; -A3DF0: res 7,b - inc b - dec b - jr z,A3E41 - ld a,1 ; код "bad command" - scf - ret - ; -A3DFB: ex de,hl - ld bc,55AAh ; сигнатура - and a - sbc hl,bc - ld l,a - ld a,0Bh ; код "failur" - scf - ret nz - ld a,l - and 0Fh - push af - ld c,58h ; получить парам. носителя - rst 08h - jr c,A3E3C - push hl - push de - ld a,h - ld h,0 - add hl,hl - dec a - jr nz,$-2 - ld b,h - ld c,l - ex af,af' - xor a - ld l,a - ld h,a -A3E20: ex af,af' - add hl,bc - adc a,0 - dec de - ex af,af' - ld a,d - or e - jr nz,A3E20 - ex af,af' - ld e,a - ex de,hl - exx - pop de - pop hl - pop af - ex af,af' - ld a,b - ld c,l - ld b,0 - ld l,h - ld h,b - ex de,hl - exx - and a - ret - ; -A3E3C: pop af - ld a,2 ; код "bad drive number" - scf - ret - ; -A3E41: push af - exx - ex de,hl - ld h,l - ld l,c - pop af - and 0Fh - push af - push hl - push de - ld c,58h ; получить парам. носителя - rst 08h - pop de - pop hl - jr c,A3E3C - pop af - ld c,59h ; уст. парам. носителя - rst 08h - ret c - and a - ret -; c=7 -A3E5A: ld a,1 - and a - ret - - -;------------------------------------------------- -; Обработчик RAM-дисков -;------------------------------------------------- -A3E5E: inc c - dec c ; c=0 - jp z,A3EF5 - dec c ; c=1 - jr z,A3E7F - dec c ; c=2 - jr z,A3E81 - dec c ; c=3 - jr z,A3E83 - dec c ; c=4 - jr z,A3E87 - dec c ; c=5 - jr z,A3E93 - dec c ; c=6 - jr z,A3EC4 - ld a,1 ; код "bad command" - scf - ret -; c=1 -A3E7F: xor a - ret -; c=2 -A3E81: xor a - ret -; c=3 -A3E83: ld a,-1 - and a - ret -; c=4 -A3E87: ld ix,0 - ld hl,0 - ld b,1 -; c=5 -A3E93: push bc - push ix - push hl - push bc - call A3F35 - pop bc - ld ix,512 ; размер сектора ? -A3EA0: push bc - push ix - call A3F71 - pop ix - pop bc - djnz A3EA0 - pop hl - pop ix - pop bc - xor a - cp b - ld c,b - ld b,a - jr z,A3EBC - add ix,bc - ld c,b - adc hl,bc - xor a - ret - ; -A3EBC: inc b - add ix,bc - ld b,c - adc hl,bc - xor a - ret -; c=6 -A3EC4: push bc - push ix - push hl - push bc - call A3F35 - pop bc - ld ix,512 ; размер сектора ? -A3ED1: push bc - push ix - call A3FAD - pop ix - pop bc - djnz A3ED1 - pop hl - pop ix - pop bc - xor a - cp b - ld c,b - ld b,a - jr z,A3EED - add ix,bc - ld c,b - adc hl,bc - xor a - ret - ; -A3EED: inc b - add ix,bc - ld b,c - adc hl,bc - xor a - ret - -; c=0. Просканировать число RAM-дисков. -A3EF5: ;ld hl,0200h ; ## -; ld a,80h -;A3EFA: srl a ; / 2 (мл.бит в CF) -; rr h ; цикл. сдвиг вправо через CF -; jr nc,A3EFA - ; выход: h=0, a=20h - ld a,20h ; поставил - ld (D3F70),a - ld de,T3F25 ; таблица номеров (0..15) RAM-дисков - ld bc,00CEh ; получить id блока, назнач. на RAM-диск -A3F09: push bc - ld a,b ; номер RAM-диска 0..15 - rst 08h - or a - jr z,A3F11 ; блок не назначен - ld (de),a ; id блока в таблицу - inc de -A3F11: pop bc - inc b ; ++номер ram-диска - ld a,15+1 ; макс. номер + 1 - cp b - jr nz,A3F09 - ; выход за пределы 0..15 диапазона (нет своб. ram-дисков) - ld hl,T3F25 ; таблица номеров (0..15) RAM-дисков - ex de,hl - and a - sbc hl,de - ld a,l ; число RAM-дисков (0=нет) - ;ld hl,T3FEB; ; нужен ? - and a - ret - - -; Таблица номеров (0..15) RAM-дисков -T3F25: db -1,-1,-1,-1,-1,-1,-1,-1 - db -1,-1,-1,-1,-1,-1,-1,-1 - - - -A3F35: ld bc,T3F25 - add a,c - ld c,a - ld a,0 - adc a,b - ld b,a - ld a,(bc) - ex af,af' - db 0DDh - ld b,h - db 0DDh - ld c,l - ld a,(D3F70) -A3F47: rrca ; цикл. сдвиг вправо (мл.разряд в CF) - jr c,A3F54 - rr h - rr l - rr b - rr c - jr A3F47 - ; -A3F54: ld b,c ; лог. номер страницы - ld c,0C4h ; получить физ. номер страницы блока - ex af,af' - rst 08h - ex af,af' - ld a,(D3F70) - ld c,a - dec c - db 0DDh - ld a,l - and c - inc a - ld hl,LC000 - ld bc,512 - sbc hl,bc - add hl,bc - dec a - jr nz,$-2 - ret - -D3F70: db 0 - - -A3F71: ld a,d - cp 0A0h - ld c,0E2h - set 6,h - jr c,A3F7E - ld c,0A2h - res 7,h -A3F7E: in a,(c) - ex af,af' - di - out (c),a - db 0DDh - ld b,h - db 0DDh - ld h,c - db 0DDh - ld c,l - ldir - ex af,af' - db 0DDh - ld c,h - out (c),a - ld a,h - and 7Fh - ei - ret nz - ld c,0E2h - in b,(c) - ld a,0FEh - out (c),a - ex af,af' - db 0DDh - ld h,0C2h - db 0DDh - ld l,a - ld a,(ix+0) - ex af,af' - out (c),b - ld h,0C0h - ret - - -A3FAD: ld a,d - cp 0A0h - ld c,0E2h - set 6,h ; 00->40h - jr c,A3FBA - ld c,0A2h - res 7,h -A3FBA: in a,(c) - ex af,af' - di - out (c),a - db 0DDh - ld b,h - db 0DDh - ld h,c - db 0DDh - ld c,l - ex de,hl - ldir - ex de,hl - ex af,af' - db 0DDh - ld c,h - out (c),a - ld a,h - and 7Fh - ei - ret nz - ld c,0E2h - in b,(c) ; сохр. порт - ld a,0FEh ; номер стр. - out (c),a - ex af,af' - db 0DDh - ld h,0C2h - db 0DDh - ld l,a - ld a,(ix+0) - ex af,af' - out (c),b ; восст. порт - ld h,0C0h - ret - - - include "cursor.asm" - - - - - - -; вход: de=скен-код/ascii-код (d - сбр. 7-й бит) -; -;TSR: ld a,b -; and 00110000b ; биты Ctrl+Alt -; cp 00110000b ; 30h -; jp nz,A06DD ; сохр. de,bc в кольц. буфере клавы -; ; de=скен-код/ascii-код -; ; очистить буфер клавиатуры -; ld a,(D0641) -; ld (D0640),a -; ret; -; ; -; res 7,d -; ld a,d -; ld e,a -; ld d,0 ; de=индекс скен-кода (hot-клавиши) -; ; вкл. стр. с таблицей -; ld a,3 ; лог. номер дос-банки -; call set_dos_page ; подкл. дос-банку в 0C000h -; ld (tsr2+1),a ; старая банка 0E2h порта -; ; -; ld hl,0C000h -; add hl,de ; адрес элемента обраб. hot-клавиши -; ld a,(hl) -; or a -; jr z,tsr1 ; обраб. не определен -; ld (tsr2+1),a ; стр. обработчика -; inc hl -; ld a,(hl) ; адрес обработчика hot-клавиши -; inc hl -; ld h,(hl) -; ld l,a -; ld (tsr4+1),hl ; адрес обработчика -; jr tsr3 -; ; -;tsr1: -;tsr2: ld a,-1 -; out (0E2h),a ; восст. порт -; ret -; ; -;tsr3: call tsr1 ; вкл. страницу обработчика -;tsr4: jp 0 ; перейти на обработчик - - - - -; раб. буфер, исп. 16 байт (п/п рам-дисков) -;T3FEB: db 0 diff --git a/DOS/DOS.INC b/DOS/DOS.INC deleted file mode 100755 index 16445ae..0000000 --- a/DOS/DOS.INC +++ /dev/null @@ -1,91 +0,0 @@ -true equ 1 -false equ 0 - -; номер версии ДОС -major_version equ 1 ; версия (0..9) -minor_version equ 61 ; модификация (0..99) -build_version equ 10 ; билд (0..999) - -; макс. число дескрипторов файлов в системе -max_handles equ 9 - -; макс. длина строки переменной окружения (имя + значение) -maxlen_env_string equ 255 - - - - -A0000 equ 0 -;A0101 equ 0101h ; 257 ? -L4000 equ 4000h -L403F equ 403Fh ; стек -LC000 equ 0C000h -LC1C0 equ 0C1C0h -LC1C8 equ 0C1C8h -LC400 equ 0C400h -LE400 equ 0E400h ; начало буфера переменных окружения -LFC7F equ 0FC7Fh -LFC80 equ 0FC80h -LFD00 equ 0FD00h -LFDFF equ 0FDFFh -LFE00 equ 0FE00h - ; -LFEE0 equ 0FEE0h ; 32 байта описателя окна (8..31 зарез.) - - - - - -; Коды ошибок ДОС -; -EZERO equ 0 ; No error -EINVFNC equ 1 ; Invalid function -EINVDRV equ 2 ; Invalid drive number -ENOFILE equ 3 ; File not found -ENOPATH equ 4 ; Path not found -EINVHND equ 5 ; Invalid handle -EMFILE equ 6 ; Too many open files -EEXIST equ 7 ; File already exists -EROFILE equ 8 ; File read only -EROOT equ 9 ; Root overflow -ENOSPACE equ 10 ; No free space -ENOEMPTY equ 11 ; Directory not empty -ECURDIR equ 12 ; Can't delete current directory -EINVMED equ 13 ; Invalid media -EUNOPER equ 14 ; Unknown operation (невозм. операция) -EEXISDIR equ 15 ; Directory exist -EINVFNAM equ 16 ; Invalid filename -EINVEXE equ 17 ; Invalid EXE-file -ENSUPEXE equ 18 ; Not supported EXE-file -EACCES equ 19 ; Access denied -ENORDY equ 20 ; Not ready -ESEEK equ 21 ; Seek error -ENOSECT equ 22 ; Sector not found -ECRC equ 23 ; CRC error -EWRTPRT equ 24 ; Write protect -EREAD equ 25 ; Read error -EWRITE equ 26 ; Write error -EDRVFAIL equ 27 ; Drive failure -EEXTND28 equ 28 ; Extended error: 28 -EEXTND29 equ 29 ; Extended error: 29 -ENOMEM equ 30 ; Not enough memory -EINVMEM equ 31 ; Invalid memory block -EEXTND32 equ 32 ; Extended error: 32 -EEXTND33 equ 33 ; Extended error: 33 -EEXTND34 equ 34 ; Extended error: 34 -ETMFILE equ 35 ; Too many files in directory (список файлов) -EDEPTH equ 36 ; (слишком большая влож. папок или >= 1024 папок) -EUABORT equ 37 ; User abort (операция прервана пользователем) -EERR38 equ 38 ; 38 -EERR39 equ 39 ; 39 -EERR40 equ 40 ; 40 -EERR41 equ 41 ; 41 -EERR42 equ 42 ; 42 -EERR43 equ 43 ; 43 -EERR44 equ 44 ; 44 -EERR45 equ 45 ; 45 -EERR46 equ 46 ; 46 -EERR47 equ 47 ; 47 -EERR48 equ 48 ; 48 -EERR49 equ 49 ; 49 -EERR50 equ 50 ; 50 diff --git a/DOS/KEYB.ASM b/DOS/KEYB.ASM deleted file mode 100755 index 6525e79..0000000 --- a/DOS/KEYB.ASM +++ /dev/null @@ -1,1003 +0,0 @@ -; Начинается с 0600h. Внутри идет выравнивание на границу 0900h. -; -; Также включает код "Init_DOS". -; - - - - -; раб. ячейки клавы - -T0600: ds 64 ; 40h (не менять размер, идет AND 3Fh) - ; -D0640: db 0 ; тек. адрес конца кольц. буфера? -D0641: db 0 ; адрес начала кольц. буфера? -; флаги клавы -D0642: db 2 - db 0 - db 0 - db 3 - ; -D0646: dw 0 - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #30. Ожидание нажатия клавиатуры (без эха). -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -;///////////////////////////////////////////////////////////////////// -Func_30:ld hl,D0641 - ld a,(D0640) - cp (hl) - jr z,Func_30 ; нет клавиши - call A06FC - ld a,e - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #31. Опрос клавиатуры без ожидания. -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -; "Z" - нет клавиш -;///////////////////////////////////////////////////////////////////// -Func_31:ld hl,D0641 - ld a,(D0640) - cp (hl) - ret z ; нет клавиши - call A06FC - ld a,e - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #32. Ожидание нажатия клавиатуры (с эхом). -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -;///////////////////////////////////////////////////////////////////// -Func_32: - call focus_to_inpline ; вкл. курсор - call Func_31 ; опрос клавы без ожидания - jr z,$-3 - push de - push bc - push af - call cursor_off ; выкл. курсор - pop af - or a ; добавил - call nz,Func_5B ; вывод "a" на экран - pop bc - pop de - ld a,e - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #33. Получить состояние клавиатуры. -; Возвращает состояние клавиатуры на данный момент. -; Данные берутся не из буфера клавиатуры (как в остальных функциях), -; а непосредственно из результатов последнего сканирования клавиатуры. -; -; вход: нет -; выход: A=0 - нет символов в буфере -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -;///////////////////////////////////////////////////////////////////// -Func_33:ld hl,D0641 - ld a,(D0640) - cp (hl) - ld bc,(D0642) ; флаги клавы - ld a,0 - ret z ; нет клавиши - dec a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #37. Опрос буфера клавиатуры. -; Возвращаемые регистры, как и в функции 30h (WAITKEY). -; Информация о нажатии остается в буфере. -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -; "Z" - нет символов в буфере -;///////////////////////////////////////////////////////////////////// -Func_37:ld hl,D0641 - ld a,(D0640) - cp (hl) - ret z ; нет клавиши - ld l,(hl) - ld h,T0600 / 256 ; 06h ст. байт адреса - ld e,(hl) - inc l - ld d,(hl) - inc l - ld b,(hl) - inc l - ld c,(hl) - ld a,e - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #35. Очистить буфер клавиатуры и выполнить функцию. -; -; вход: B=номер функции 30h, 31h, 32h, 33h -; выход: В зависимости от указанной функции в регистре B. -;///////////////////////////////////////////////////////////////////// -Func_35:ld a,(D0641) ; адрес начала кольц.буфера - ld (D0640),a ; тек. адрес в кольц. буфере - ; - ld a,30h-1 - cp b - jr c,A06D1 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A06D1: ld a,35h ; номер функции - cp b - jr nc,A06DA - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A06DA: ld c,b - rst 10h - ret - - - - -A06DD: ld hl,D0640 - ld a,(D0641) - sub 4 - and 3Fh ; ограничить адрес конца кольц. буфера - cp (hl) - jr z,A0716 ; бип, конец кольц. буфера - ld a,(hl) - inc (hl) ; ячейка D0640 - inc (hl) - inc (hl) - inc (hl) - res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) - ld l,a - ld h,T0600 / 256 ; 06h ст. байт адреса - ld (hl),e - inc l - ld (hl),d - inc l - ld (hl),b - inc l - ld (hl),c - ret - -A06FC: ld hl,D0641 - ld a,(D0640) - cp (hl) - ret z ; нет клавиши - ld a,(hl) - inc (hl) - inc (hl) - inc (hl) - inc (hl) - res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) - ld l,a - ld h,T0600 / 256 ; 06h ст. байт адреса - ld e,(hl) - inc l - ld d,(hl) - inc l - ld b,(hl) - inc l - ld c,(hl) - ret - -; бип -A0716: ex af,af' - bit 0,(ix+3) - jr z,A0728 - exx - ld de,230 ; задержка внутр. цикла - ld hl,50 ; задержка внеш. цикла - call beep ; звук - exx -A0728: ex af,af' - ret - - - - -A072A: set 7,(ix+2) - jr A0740 - -A0730: set 6,(ix+2) ; уст. бит "отжата" - jr A0740 - -A0736: set 5,(ix+2) - jr A0740 - -; сканирование клавы -keyb_scan: - ld ix,D0642 ; флаги клавы -A0740: in a,(19h) ; порт статуса - rra ; 0-bit, очередной байт пришел ? - ret nc ; нет - in a,(18h) - cp 0F0h ; клавиша отжата ? - jr z,A0730 ; да, уст. 6 bit - cp 0E0h ; признак "Upgrade Code" у Антона - jr z,A072A ; уст. 7 bit (расш. скен-код) - cp 0E1h ; Pause - jr z,A0736 ; уст. 5 bit - ; - ld l,a - bit 6,(ix+2) ; отжата клавиша ? - jr nz,A07B3 ; да, на сброс битов регистра "B" (ix+1) - call A0990 - call A0892 ; уст. биты регистра "B" (ix+1) - res 7,(ix+2) ; сбр. бит "расш. скен-код" ? - res 5,(ix+2) ; сбр. бит паузы - ret z ; не сохранять код, биты устанавливались - call A09B4 - ; - ld hl,1C00h ; Caps Lock - and a - sbc hl,de - call z,A07C8 - ld hl,0B800h ; Space + Ctrl, Alt - and a - sbc hl,de - call z,A07D1 ; перекл. бита Rus/Lat - ld hl,5000h ; Ins - and a - sbc hl,de - call z,A07EF - ld hl,4900h ; Num Lock - and a - sbc hl,de - call z,A07F8 ; инв. 3-й бит (бит Num Lock) - ld hl,0C900h ; Pause или Num Lock+80h (Num Lock+Ctrl/Atl/Shift) - and a - sbc hl,de - call z,A0801 - ld hl,4800h ; Scroll Lock - and a - sbc hl,de - call z,A081E ; инв. 2-й бит (бит Scroll Lock) - ld hl,0CF00h ; Del+80h (с Shift) - and a - sbc hl,de - call z,reboot_system ; тест на Ctrl+Alt - ld bc,(D0642) ; флаги клавы - jp A06DD ;## сохр. de,bc в кольц. буфере клавы - ;jp TSR; - ;ret ; не оптимизить - - -A07B3: res 6,(ix+2) ; сбр. бит "клавиша отжата" - call A0990 - call A0837 ; сбр. биты регистра "B" (ix+1) - res 7,(ix+2) ; сбр. бит "расш. скен-код" ? - ld h,0 - ld (D0646),hl - ret - -A07C8: ld a,(ix+0) - xor 1 - ld (ix+0),a - ret - -A07D1: bit 5,(ix+1) ; бит Ctrl ? - ret z ; нет - ld a,(ix+0) - xor 80h ; 7-й бит (1=Rus,0=Lat) - ld (ix+0),a - bit 1,(ix+3) - ret z - exx - ld de,190 ; задержка внутр. цикла - ld hl,20 ; задержка внеш. цикла - call beep ; звук - exx - ret - -A07EF: ld a,(ix+0) - xor 2 ; 1-й бит - ld (ix+0),a - ret - -A07F8: ld a,(ix+0) - xor 8 ; 3-й бит - ld (ix+0),a - ret - -; Pause или Num Lock + Ctrl, Atl, Shift -A0801: bit 5,(ix+1) ; бит Ctrl ? - ret z ; нет -; pop hl ; ?? - ld a,(ix+0) - xor 40h ; 6-й бит - ld (ix+0),a - bit 6,(ix+0) - ret z - ei -A0815: halt - bit 6,(ix+0) - jr nz,A0815 - di - ret - -A081E: ld a,(ix+0) - xor 4 - ld (ix+0),a - ret - - -; клавиша Del -reboot_system: - ;bit 5,(ix+1) ; бит Ctrl - ;ret z - ;bit 4,(ix+1) ; бит Alt - ;ret z - ld c,00110000b ; биты Ctrl+Alt - ld a,(ix+1) - and c - cp c - ret nz - ; софтовый ребут - xor a - ld bc,01FDh - rst 08h - ret - - - -;------------------------------------------------- -; Сбросить биты регистра "B" (ix+1) -;------------------------------------------------- -A0837: ld a,l - cp 37h - jr nz,A084A - res 2,(ix+1) - bit 0,(ix+1) - ret nz - res 4,(ix+1) - ret - ; -A084A: cp 39h - jr nz,A085C - res 0,(ix+1) - bit 2,(ix+1) - ret nz - res 4,(ix+1) - ret - ; -A085C: cp 36h - jr nz,A086E - res 3,(ix+1) - bit 1,(ix+1) - ret nz - res 5,(ix+1) - ret - ; -A086E: cp 3Ah - jr nz,A0880 - res 1,(ix+1) - bit 3,(ix+1) - ret nz - res 5,(ix+1) - ret - ; -A0880: cp 29h - jr nz,A0889 - res 7,(ix+1) ; сбр. бит LShift - ret - ; -A0889: cp 34h - ret nz - res 6,(ix+1) ; сбр. бит RShift - ret - - -;------------------------------------------------- -; Установить биты регистра "B" (ix+1) -;------------------------------------------------- -A0892: ld a,l - cp 37h - jr nz,A08A0 - set 2,(ix+1) - set 4,(ix+1) - ret - ; -A08A0: cp 39h - jr nz,A08AD - set 0,(ix+1) - set 4,(ix+1) - ret - ; -A08AD: cp 36h - jr nz,A08BA - set 3,(ix+1) - set 5,(ix+1) - ret - ; -A08BA: cp 3Ah - jr nz,A08C7 - set 1,(ix+1) - set 5,(ix+1) - ret - ; -A08C7: cp 29h - jr nz,A08D0 - ;-- поставил (фикс глюка PrintScreen) - ; при нажатии PrnScrn, клава выдает двойной код: LShift и PrnScrn - bit 7,(ix+2) ; был расш. скен-код (#E0) ? - jr z,$+4 ; нет (Ctrl,Alt,Shift не нажаты) - xor a ; флаг "Z" (не сохр. код #29 LShift) - ret - ;-- - set 7,(ix+1) ; уст. бит LShift - ret - ; -A08D0: cp 34h - ret nz - set 6,(ix+1) ; уст. бит RShift - ret - - - - -;///////////////////////////////////////////////////////////////////// -; -; Начальная инициализация ДОС -; -;///////////////////////////////////////////////////////////////////// -Init_DOS: - di - call init_keyb_ports ; иниц. LPT-портов для клавы - call A10D1 ; иниц. ?? портов + lpt-портов клавы - ld c,0 ; иниц. мышки - rst 30h - ld a,(mode_screen) ; тек. режим экрана - ld c,81h ; инфа о смене режима (для мышки) - rst 30h - call scan_all_devices ; определить все девайсы в системе - ei - ; уст. вектор на функцию #00 - ld de,Func_00 ; адрес функции "номер версии ДОС" - ld hl,T0200 ; таблица мл. разрядов адресов - ld (hl),e ; сохр. мл.разряд - inc h ; 0300h - ld (hl),d ; сохр. ст.разряд - ; - ld bc,03C2h ; выделить 3 банки памяти - ;ld bc,04C2h ; выделить 4 банки памяти - rst 08h - ld hl,list_dos_pages ; 16 байт, номера банок расширения ДОС - ld c,a ; дескр. блока - ld b,-1 -A00DF: inc b - push bc ; b=номер страницы в блоке - push hl - ld a,c ; дескр. блока - ld c,0C4h ; получить физ. номер стр. блока - rst 08h - pop hl - pop bc - ld (hl),a ; сохр. номер банки - inc hl - jr nc,A00DF - ; - call setup_znak ; настр. знакоген. курсора - ld b,-1 ; иниц. буфера окружения ? - call Func_46 ; системная окружения - jp Func_00 ; функция "номер версии ДОС" - - - - - - ;ds 0900h - $ ; выровнить на границу xx00h -L0900 equ $+100h AND 0FF00h - ds L0900 - $ - - - -; Должно начинаться точно с xx00h! (не стал фиксить (для скорости)). -; Скен-коды клавиш, 144 байта. -A0900: db 0,43h,0,3Fh,3Dh,3Bh,3Ch,46h - db 0,44h,42h,40h,3Eh,0Fh,0,0 - db 0 - db 37h,29h,0 - db 36h,10h,2,0 - db 0,0,2Ah,1Eh,1Dh,11h,3,0 - db 0,2Ch,2Bh,1Fh,12h,5,4,0 - db 0,38h,2Dh,20h,14h,13h,6,0 - db 0,2Fh,2Eh,22h,21h,15h,7,0 - db 0 -;A0939: - db 0 -;A093A: - db 30h,23h,16h,8,9,0,0,31h - db 24h,17h,18h,0Bh,0Ah -;A0947: - db 0,0,32h -;A094A: - db 33h,25h,26h,19h -;A094E: - db 0Ch,0,0,0,27h,0,1Ah,0Dh - db 0,0,1Ch,34h - db 28h,1Bh,0,35h - db 0,0,0,0,0,0,0,0 - db 0Eh,0,0,51h,0,54h,57h,0 - db 0,0,50h,4Fh,52h,55h,56h,58h - db 1,49h,45h,4Dh,53h,4Ch - db 4Bh,59h - db 48h,0,0,0,0,41h,0,0 - db 0,0,0,0,0,0,0,0 - db 0,0 - - - -A0990: bit 7,(ix+2) ; бит "расш. скен-код" ? - jr z,A09B0 - cp 11h ; Alt (левый/правый) - ld l,39h ; RAlt - ret z - cp 14h ; Ctrl (левый/правый) - ld l,3Ah ; RCtrl - ret z - cp 5Ah ; Enter - ld l,4Eh ; enter - ret z - cp 4Ah ; / - ld l,a;4Ah ; / - ret z - cp 7Ch ; "*" в доп.поле, PrintScreen - ld l,47h ; PrintScreen - ret z - ld l,a -A09B0: ld h,A0900 / 256 ; 09h ст. байт адреса - ld l,(hl) ; загрузить скен-код - ret - - -A09B4: ld d,l - ld e,0 - bit 7,(ix+0) - jp nz,A09F6 - ld a,(ix+1) - and 0C0h - jr nz,A09E3 - set 7,d - bit 4,(ix+1) - ret nz - bit 5,(ix+1) - ret nz - ld d,l - ld bc,T0B75 ; Lat-раскладка с вкл. CapsLock - bit 0,(ix+0) - jr nz,A09DE - ld bc,T0AC1 ; нормальная Lat-раскладка -A09DE: ld h,0 - add hl,bc - ld e,(hl) - ret - ; -A09E3: ld bc,T0B1B ; Lat-раскладка с Shift - bit 0,(ix+0) - jr z,A09EF - ld bc,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift -A09EF: ld h,0 - add hl,bc - ld e,(hl) - set 7,d - ret - ; - ; -A09F6: ld a,(ix+1) - and 0C0h - jr nz,A0A1B - set 7,d - bit 4,(ix+1) - ret nz - bit 5,(ix+1) - ret nz - ld d,l - bit 0,(ix+0) - ld bc,T0CDD ; Rus-раскладка с вкл. CapsLock - jr nz,A0A16 - ld bc,T0C29 ; нормальная Rus-раскладка -A0A16: ld h,0 - add hl,bc - ld e,(hl) - ret - ; -A0A1B: ld bc,T0C83 ; Rus-раскладка с Shift - bit 0,(ix+0) - jr z,A0A27 - ld bc,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift -A0A27: ld h,0 - add hl,bc - ld e,(hl) - set 7,d - ret - - - - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #36. Управление настройками клавиатуры. -; -; вход: B=номер подфункции (0,1,2) -; выход: В зависимости от указанной функции в регистре B. -;///////////////////////////////////////////////////////////////////// -Func_36:inc b - dec b - jr z,A0A49 ; уст. раскладку клавиатуры - dec b - jr z,A0A3F ; получить состояние звуковых переменных - dec b - jr z,A0A44 ; уст. состояние звуковых переменных - ld a,EUNOPER ; код "невозможная операция" - scf - ret - -;B=1. Получить состояние звуковых переменных -A0A3F: ld a,(D0003) - and a - ret - -;B=2. Установить состояние звуковых переменных -; A=значение переменной -; D0 - сигнал переполнения буфера клавиатуры -; D1 - сигнал переключения на альтернативную раскладку клавиатуры -A0A44: ld (D0003),a - and a - ret - -;B=0. Установить раскладку клавиатуры -; A=номер раскладки -; 0 - normal -; 1 - shift -; 2 - caps lock -; 3 - caps lock + shift -; 4 - normal (альтернативная клав.) -; 5 - shift (альтернативная клав.) -; 6 - caps lock (альтернативная клав.) -; 7 - caps lock + shift (альтернативная клав.) -A0A49: ld bc,T0B1B - T0AC1 ; 90 размер раскладки в Таблице кодов клавиш - bit 7,a - jr nz,A0A87 - ld de,T0AC1 ; нормальная Lat-раскладка - or a - jr z,A0A83 - ld de,T0B1B ; Lat-раскладка с Shift - dec a - jr z,A0A83 - ld de,T0B75 ; Lat-раскладка с вкл. CapsLock - dec a - jr z,A0A83 - ld de,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0A83 - ld de,T0C29 ; нормальная Rus-раскладка - dec a - jr z,A0A83 - ld de,T0C83 ; Rus-раскладка с Shift - dec a - jr z,A0A83 - ld de,T0CDD ; Rus-раскладка с вкл. CapsLock - dec a - jr z,A0A83 - ld de,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0A83 - xor a ; код - scf - ret - ; -A0A83: ldir - xor a - ret - ; -A0A87: res 7,a - ld de,T0AC1 ; нормальная Lat-раскладка - or a - jr z,A0ABC - ld de,T0B1B ; Lat-раскладка с Shift - dec a - jr z,A0ABC - ld de,T0B75 ; Lat-раскладка с вкл. CapsLock - dec a - jr z,A0ABC - ld de,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0ABC - ld de,T0C29 ; нормальная Rus-раскладка - dec a - jr z,A0ABC - ld de,T0C83 ; Rus-раскладка с Shift - dec a - jr z,A0ABC - ld de,T0CDD ; Rus-раскладка с вкл. CapsLock - dec a - jr z,A0ABC - ld de,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0ABC - xor a - scf - ret - ; -A0ABC: ex de,hl - ldir - xor a - ret - - -; Таблица кодов клавиш (8 раскладок по 90 байт) -; Нормальная раскладка -T0AC1: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"q","w","e","r","t","y","u","i","o","p","[","]" - db 0 ; CapsLock - db "a","s","d","f","g","h","j","k","l",";","'",0Dh - db 0 ; Left Shift - db "z","x","c","v","b","n","m",",",".","/" - db 0 ; Right Shift - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с Shift -T0B1B: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 - db 9,"Q","W","E","R","T","Y","U","I","O","P","{","}" - db 0 ; CapsLock - db "A","S","D","F","G","H","J","K","L",":",'"',0Dh - db 0 ; Left Shift - db "Z","X","C","V","B","N","M","<",">","?" - db 0 ; Right Shift - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock -T0B75: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"Q","W","E","R","T","Y","U","I","O","P","[","]",0 - db "A","S","D","F","G","H","J","K","L",";","'",0Dh,0 - db "Z","X","C","V","B","N","M",",",".","/",0 - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock + Shift -T0BCF: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 - db 9,"q","w","e","r","t","y","u","i","o","p","{","}",0 - db "a","s","d","f","g","h","j","k","l",":",'"',0Dh,0 - db "z","x","c","v","b","n","m","<",">","?",0 - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Нормальная раскладка -T0C29: db "ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 - db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 - db "я","ч","с","м","и","т","ь","б","ю",".",0 - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с Shift -T0C83: db "Ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 - db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 - db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 - db "Я","Ч","С","М","И","Т","Ь","Б","Ю",",",0 - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock -T0CDD: db "Ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 - db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 - db "Я","Ч","С","М","И","Т","Ь","Б","Ю",".",0 - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock + Shift -T0D37: db "ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 - db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 - db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 - db "я","ч","с","м","и","т","ь","б","ю",",",0 - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - - - - -; Звук. -; вход: hl=задержка внеш. цикла -; de=задержка внутр. цикла -beep: ld a,10h - out (0FEh),a ; порт - ld b,d - ld c,e - dec bc - ld a,b - or c - jr nz,$-3 - ld a,0 - out (0FEh),a ; порт - ld b,d - ld c,e - dec bc - ld a,b - or c - jr nz,$-3 - dec hl - ld a,h - or l - jr nz,beep - ret - - - -;------------------------------------------------- -; Иниц. LPT-портов для клавы -;------------------------------------------------- -init_keyb_ports: - ld a,0 - out (19h),a - ld a,1 - out (19h),a - ld a,0 - out (19h),a - ld a,3 - out (19h),a - ld a,0C1h - out (19h),a - ld a,4 - out (19h),a - ld a,7 - out (19h),a - ld a,5 - out (19h),a - ld a,62h - out (19h),a - ret - - - -;PR: push ix -; push hl -; push de -; push af -; push hl; -; ld c,8Eh -; rst 08h -; ld (_pr+1),de -; ld de,1500h -; ld c,84h -; rst 08h -; pop hl; -; ;ld a,l -; call HEX1 -;_pr: ld de,0 -; ld c,84h -; rst 08h -; call newline -; pop af -; pop de -; pop hl -; pop ix -; ret - -;HEXHL: ld a,h -; push hl -; call HEX1 -; pop hl -; ld a,l -;HEX1: push af -; rra -; rra -; rra -; rra -; call HEX2 -; pop af -;HEX2: and 0Fh -; add a,90h -; daa -; adc a,40h -; daa -;symb: jp Func_5B ; вывод символа на экран - -;newline:ld a,0Ah -; call Func_5B -; ld a,0Dh -; jp Func_5B diff --git a/DOS/MOUSE.ASM b/DOS/MOUSE.ASM deleted file mode 100755 index a3b180e..0000000 --- a/DOS/MOUSE.ASM +++ /dev/null @@ -1,874 +0,0 @@ -;=========================================================== -; Вектор мышки -;=========================================================== -MOUSE_vector: - bit 7,c - jr nz,A32E3 ; c >=80h - inc c - dec c ; c=0 иниц. мышки - jr z,init_mouse - dec c ; c=1 показать мышку - jr z,show_mouse - dec c ; c=2 скрыть мышку - jp z,hide_mouse - dec c ; c=3 узнать сост. мышки - jp z,get_mouse_status - dec c ; c=4 уст. координаты мышки - jp z,set_mouse_coords - dec c ; c=5 заглушка - jp z,A32DF - dec c ; c=6 заглушка - jr z,A32DF - dec c ; c=7 уст. Y границы перем. мышки - jp z,set_y_limit - dec c ; c=8 уст. X границы перем. мышки - jp z,set_x_limit - dec c ; c=9 загрузить курсор мышки - jp z,A3385 - dec c ; c=0Ah уст. символ/атрибут мышки для текст. режима - jp z,A341F - dec c ; c=0Bh получить курсор мышки - jp z,A33CC - dec c ; c=0Ch заглушка - jr z,A32DF - dec c ; c=0Dh заглушка - jr z,A32DF - dec c ; c=0Eh получить чувствит. мышки - jp z,A342D - dec c ; c=0Fh уст. чувств. мышки - jp z,A3428 -A32DF: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -; c >= 80h -A32E3: res 7,c - inc c - dec c ; c=80h Обработчик аппаратн. прерывания от мыши - jp z,A374B - dec c ; c=81h инфа для мышки о смене режима экрана - jp z,A3700 - dec c ; c=82h заглушка - jr z,A32F5 - dec c ; c=83h принуд. перерисовка мышки - jp z,A3760 -A32F5: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - - -;----------------------------------------------------------- -; Функция #00. Инициализация драйвера мышки -;----------------------------------------------------------- -init_mouse: - di - ld a,55h - out (10h),a - ld a,2Dh - out (10h),a - ld a,0 - out (1Bh),a - ld a,1 - out (1Bh),a - ld a,0 - out (1Bh),a - ld a,3 - out (1Bh),a - ld a,41h - out (1Bh),a - ld a,4 - out (1Bh),a - ld a,47h - out (1Bh),a - ld a,5 - out (1Bh),a - ld a,0E0h - out (1Bh),a - ei - xor a - ret - - -;----------------------------------------------------------- -; Функция #01. Показать указатель мышки -;----------------------------------------------------------- -show_mouse: - push ix - push hl - push de - ex af,af' - push af - ld hl,(D378C) ; X координата мышки - ld de,(D378E) ; Y координата мышки - di - call A3524 - ld a,true - ld (enable_mouse_cursor),a ; флаг вывода указателя мышки - ei - pop af - ex af,af' - pop de - pop hl - pop ix - xor a - ret - - - -;----------------------------------------------------------- -; Функция #02. Скрыть указатель мышки -;----------------------------------------------------------- -hide_mouse: - push ix - push hl - push de - ex af,af' - push af - di - xor a ; false - ld (enable_mouse_cursor),a ; флаг вывода указателя мышки - call A34D7 - ei - pop af - ex af,af' - pop de - pop hl - pop ix - xor a - ret - - -;----------------------------------------------------------- -; Функция #03. Узнать сотояние мышки -; Возвращает координаты мышки и состояние кнопок -;----------------------------------------------------------- -get_mouse_status: - ld hl,(D378C) ; X координата - ld de,(D378E) ; Y координата - ld a,(D3792) ; 0 bit - левая, 1 bit - правая - and a - ret - - -;----------------------------------------------------------- -; Функция #04. Установить координаты указателя мышки -; Функция перемещает курсор в заданные координаты -; -; вход: hl/de = X/Y координаты -; выход: a = код ошибки, если CF=1 -;----------------------------------------------------------- -set_mouse_coords: - push ix - push hl - push de - ld (D378C),hl ; X координата мышки - ld (D378E),de ; Y координата мышки - ex af,af' - push af - di - call A3772 - ei - pop af - ex af,af' - pop de - pop hl - pop ix - xor a ;? - ret - - - -A3385: push bc - push de - push hl - push ix - ;ld a,l - ;ld (D37A6),a - ;ld a,h - ;ld (D37A7),a - ld (D37A6),hl; ; ширина/высота стрелки мышки - ld c,e - ld b,0 - ld (D379E),bc - ld c,d - ld (D37A0),bc - exx - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld a,(D37A7) ; 14 высота стрелки мышки - ld l,b - ld h,b - add hl,bc - dec a - jr nz,$-2 - push hl - ld bc,257 ;A0101 ; 257 ? - and a - sbc hl,bc - ccf - exx - pop bc - pop hl - ld a,EINVHND ; код "несуществ. дескр. файла" - jr c,A33C7 - ld de,mouse_pointer ; 10x14 массив стрелки мышки - di - ldir - xor a ; код "Ok" -A33C7: pop hl - pop de - pop bc - ei - ret - - -A33CC: push ix - exx - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld a,(D37A7) ; 14 высота стрелки мышки - ld l,b - ld h,b - add hl,bc - dec a - jr nz,$-2 - push hl - ld bc,257 ;A0101 ; 257 ? - and a - sbc hl,bc - ccf - exx - pop bc - pop hl - ld a,EINVHND ; код "несуществ. дескр. файла" - jr c,A340B - ld de,mouse_pointer ; 10x14 массив стрелки мышки - ex de,hl - di - ldir - ;ld a,(D37A6) ;@@ - ;ld l,a - ;ld a,(D37A7) - ;ld h,a - ld hl,(D37A6); ; ширина/высота стрелки мышки - ;ld bc,(D379E) - ;ld e,c - ;ld bc,(D37A0) - ;ld d,c - ld a,(D379E); - ld e,a; - ld a,(D37A0); - ld d,a; - xor a - ;ld c,a - ;ld b,a -A340B: ei - ret - - - -;----------------------------------------------------------- -; Функция #08. Установка гориз. границ перемещения мышки -; -; вход: hl = минимальная -; de = максимальная -;----------------------------------------------------------- -set_x_limit: - ld (D3794),hl - ld (D3796),de - xor a - ret - - - -;----------------------------------------------------------- -; Функция #07. Установка верт. границ перемещения мышки -; -; вход: hl = минимальная -; de = максимальная -;----------------------------------------------------------- -set_y_limit: - ld (D3798),hl - ld (D379A),de - xor a - ret - - - -A341F: ld (D37A2),hl - ld (D37A4),de - xor a - ret - - -A3428: ld (D379C),hl - xor a - ret - - -A342D: ld hl,(D379C) - xor a - ret - - -A3432: ld (A348B+1),hl - ld (A348E+1),de - srl d - rr e - srl d - rr e - srl d - rr e - ld d,e - srl h - rr l - srl h - rr l - srl h - rr l - ld e,l - in a,(89h) - db 0DDh - ld h,a - in a,(0A2h) - db 0DDh - ld l,a - di - ld a,54h ; номер стр. - out (0A2h),a - ld a,d - add a,a - add a,a - ld l,a - ld h,43h ; ст. разряд ? - in a,(0C9h) - rrca - and 80h - or 1 - add a,e - out (89h),a - inc l - ld a,(hl) - ld bc,(D37A2) - and b - xor c - ld (hl),a - inc l - ld a,(hl) - ld bc,(D37A4) - and b - xor c - ld (hl),a - db 0DDh - ld a,l - out (0A2h),a - db 0DDh - ld a,h - out (89h),a - ret - - -A348B: ld hl,0 -A348E: ld de,0 - srl d - rr e - srl d - rr e - srl d - rr e - ld d,e - srl h - rr l - srl h - rr l - srl h - rr l - ld e,l - in a,(89h) - db 0DDh - ld h,a - in a,(0A2h) - db 0DDh - ld l,a - di - ld a,50h - out (0A2h),a - ld a,d - add a,a - add a,a - ld l,a - ld h,43h ; ст. разряд ? - in a,(0C9h) - rrca - and 80h - or 1 - add a,e - out (89h),a - inc l - ld a,(hl) - ld (hl),a - inc l - ld a,(hl) - ld (hl),a - db 0DDh - ld a,l - out (0A2h),a - db 0DDh - ld a,h - out (89h),a - ret - -A34D7: ld a,0 - bit 7,a - jr z,A348B - in a,(0E2h) - ld b,a - in a,(89h) - ld c,a - push bc - ld a,50h - out (0E2h),a -A34E9: ld hl,0 -A34EC: ld de,0 - ld a,e - ex af,af' -A34F1: ld a,0 - and 1 - ld de,LC000 - jr z,A34FD - ld de,LC000+320 -A34FD: add hl,de -A34FE: ld a,0 ; 14 сохр. высота стрелки мышки - db 0DDh - ld h,a - ex af,af' -A3503: ld bc,10 - out (89h),a - ex af,af' - ld (A3510+1),hl - ld d,h - ld e,l - ldir -A3510: ld hl,0 - ex af,af' - inc a - jr z,A351B - db 0DDh - dec h - jr nz,A3503 -A351B: pop bc - ld a,b - out (0E2h),a - ld a,c - out (89h),a - xor a - ret - - -A3524: ld a,(D378B) - ld (A34D7+1),a - bit 7,a - jp z,A3432 - cp 82h ; 130 - jr nz,A3537 - srl h - rr l -A3537: ld ix,mouse_pointer ; 10x14 массив стрелки мышки - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld (D37AA),bc - ld (A3503+1),bc - ld c,b - ld (D37A8),bc - ld a,(D37A7) ; 14 высота стрелки мышки - ld (A34FE+1),a - ld c,a - ld b,0 - ld (D37AC),bc - ld bc,(D37A0) - ld a,e - sub c - ld e,a - jr nc,A357B - neg - ld e,a - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld a,(D37A7) ; 14 высота стрелки мышки - sub e -A3571: add ix,bc - dec e - jr nz,A3571 - ld c,a - ld (D37AC),bc -A357B: ld bc,(D379E) - and a - sbc hl,bc - jr nc,A359A - ld b,h - ld c,l - ld hl,0 - and a - sbc hl,bc - ld (D37A8),hl - ld a,(D37A6) ; 10 ширина стрелки мышки - sub l - ld l,a - ld (D37AA),hl - ld hl,0 -A359A: ld (A34E9+1),hl - ld (A34EC+1),de - push hl - in a,(0E2h) - ld h,a - in a,(89h) - ld l,a - ex (sp),hl - ld a,5Ch ; видео-страница - out (0E2h),a - ld a,e - ex af,af' - in a,(0C9h) - ld (A34F1+1),a - and 1 - ld de,LC000 - jr z,A35BE - ld de,LC000+320 ; начало 2-го экрана ? -A35BE: add hl,de - db 0DDh - ld d,h - db 0DDh - ld e,l - ex de,hl - ld bc,(D37AC) - db 0DDh - ld h,c - ex af,af' -A35CB: ld bc,(D37A8) - add hl,bc - ld bc,(D37AA) - out (89h),a - ex af,af' - ld (A35DD+1),de - ldir -A35DD: ld de,0 - ex af,af' - inc a - jr z,A35E8 - db 0DDh - dec h - jr nz,A35CB -A35E8: pop bc - ld a,b - out (0E2h),a - ld a,c - out (89h),a - xor a - ret - - -A35F1: in a,(1Bh) - rrca - ret nc - in a,(1Ah) - ld l,a - bit 6,a - ccf - ret z - in a,(1Bh) - rrca - jr nc,$-3 - in a,(1Ah) - ld e,a - bit 6,a - ccf - ret nz - in a,(1Bh) - rrca - jr nc,$-3 - in a,(1Ah) - ld d,a - bit 6,a - ccf - ret nz - ld a,e - and 3Fh - ld e,a - ld a,l - and 3 - rrca - rrca - or e - ld e,a - ld a,d - and 3Fh - ld d,a - ld a,l - and 0Ch - rrca - rrca - rrca - rrca - or d - ld d,a - ld a,l - rlca - rlca - rlca - res 6,a - jr nc,$+4 - set 6,a - rlca - rlca - and 3 - ld (D3792),a ; сост. кнопок: 0/1 bits - левая/правая - call A36C3 - ;ld a,e ;@@ - ;ld (D3790),a - ;ld a,d - ;ld (D3791),a - ld (D3790),de - scf - ret - - -A364B: ld hl,(D378C) ; X координата мышки - ld de,(D3790) - ld d,0 - bit 7,e - jr nz,A366F - add hl,de - ld (D378C),hl ; X координата мышки - ex de,hl - ld hl,(D3796) - and a - sbc hl,de - jr nc,A3689 - ld hl,(D3796) - ld (D378C),hl ; X координата мышки - jr A3689 - ; -A366F: ld a,e - neg - ld e,a - and a - sbc hl,de - ld (D378C),hl ; X координата мышки - jr c,A3683 - ld de,(D3794) - sbc hl,de - jr nc,A3689 -A3683: ld hl,(D3794) - ld (D378C),hl ; X координата мышки -A3689: ld hl,(D378E) ; Y координата мышки - ld de,(D3791) - ld d,0 - bit 7,e - jr nz,A36A9 - add hl,de - ld (D378E),hl ; Y координата мышки - ex de,hl - ld hl,(D379A) ; макс. Y граница для указателя - and a - sbc hl,de - ret nc - ld hl,(D379A) ; макс. Y граница для указателя - ld (D378E),hl ; Y координата мышки - ret - ; -A36A9: ld a,e - neg - ld e,a - and a - sbc hl,de - ld (D378E),hl ; Y координата мышки - jr c,A36BC - ld de,(D3798) ; мин. Y граница для указателя - sbc hl,de - ret nc -A36BC: ld hl,(D3798) ; мин. Y граница для указателя - ld (D378E),hl ; Y координата мышки - ret - - -A36C3: ld hl,(D379C) - ld a,l - or l - ret z - dec a - ret z - ld a,e - bit 7,a - ld b,0FFh - jr z,A36D6 - ld b,7Fh - neg -A36D6: inc b - sub l - jr nc,A36D6 - bit 7,b - jr z,A36E4 - ld a,b - res 7,a - neg - ld b,a -A36E4: ld e,b - ld a,d - bit 7,a - ld b,0FFh - jr z,A36F0 - ld b,7Fh - neg -A36F0: inc b - sub h - jr nc,A36F0 - bit 7,b - jr z,A36FE - ld a,b - res 7,a - neg - ld b,a -A36FE: ld d,b - ret - - -A3700: ld (D378B),a - or a - jr z,A3720 - cp 1 - jr z,A3720 - cp 2 ; 40x32x16 текстовый - jr z,A3723 - cp 3 ; 80x32x16 текстовый - jr z,A3737 - bit 7,a - jr z,A3720 - ; граф. режимы экрана - ;res 7,a ;@@ - cp 81h ; 320x256x256 - jr z,A3723 - cp 82h ; 640x256x16 - jr z,A3737 -A3720: xor a - scf - ret - -; 320x256x256 режим -A3723: ld de,319 ; макс. X граница -A3726: ld hl,0 ; мин. X/Y границы - call set_x_limit ; уст. X границу перем. указателя - ld de,255 ; макс. Y граница - jp set_y_limit ; уст. Y границу перем. указателя - -; 640x256x16 режим -A3737: ld de,639 ; макс. X граница - jr A3726 - - - - -;----------------------------------------------------------- -; Функция #80. Обработчик аппаратн. прерывания от мыши -; -; По приходу прерывания от мыши вызывается данная функция -; драйвера. В случае, когда требуется работа подпрограммы -; при запрещенных прерываниях, используйте данную функцию, -; чтобы избежать потери пакетов данных от мыши. -;----------------------------------------------------------- -A374B: in a,(0E2h) - ld b,a - in a,(89h) - ld c,a - push bc - call A3772 - call A3765 - pop bc - ld a,b - out (0E2h),a - ld a,c - out (89h),a - ret - - -A3760: call A3765 - and a - ret - - -A3765: call A35F1 - ret nc - call A364B - ld a,0 - ld (A3776+1),a - ret - - -A3772: db 3Eh ; ld a,.. -enable_mouse_cursor: - db false ; флаг вывода указателя мышки - or a - ret z ; не выводить указатель -A3776: ld a,0 - call A34D7 - ld hl,(D378C) ; X координата мышки - ld de,(D378E) ; Y координата мышки - call A3524 - ld a,-1 - ld (A3776+1),a - ret - - - - - -D378B: db 3 -D378C: dw 160 ; X координата мышки -D378E: dw 128 ; Y координата мышки -D3790: db 0 -D3791: db 0 -D3792: db 0 ; сост. кнопок: 0/1 bits - левая/правая - db 0; ; нужен ? - ; -D3794: dw 0 -D3796: dw 319 -D3798: dw 0 ; мин. Y граница для указателя -D379A: dw 255 ; макс. Y граница для указателя - -D379C: dw 0 -D379E: dw 0 -D37A0: dw 0 - ; -D37A2: dw 0FF00h -D37A4: dw 0FF77h - ; -D37A6: db 10 ; ширина стрелки мышки -D37A7: db 14 ; высота стрелки мышки - ; -D37A8: dw 0 -D37AA: dw 0 -D37AC: dw 0 - - - -; Стрелка мышки. Массив 10x14 байтов + 116 = 256 -mouse_pointer: - db 0,0,-1,-1,-1,-1,-1,-1,-1,-1 ; 1 - db 0,-2,0,-1,-1,-1,-1,-1,-1,-1 ; 2 - db 0,-2,-2,0,-1,-1,-1,-1,-1,-1 ; 3 - db 0,-2,-2,-2,0,-1,-1,-1,-1,-1 ; 4 - db 0,-2,-2,-2,-2,0,-1,-1,-1,-1 ; 5 - db 0,-2,-2,-2,-2,-2,0,-1,-1,-1 ; 6 - db 0,-2,-2,-2,-2,-2,-2,0,-1,-1 ; 7 - db 0,-2,-2,-2,-2,0,0,0,0,-1 ; 8 - db 0,-2,-2,0,-2,0,-1,-1,-1,-1 ; 9 - db 0,-2,0,0,-2,-2,0,-1,-1,-1 ; 10 - db 0,0,-1,-1,0,-2,0,-1,-1,-1 ; 11 - db 0,-1,-1,-1,0,-2,-2,0,-1,-1 ; 12 - db -1,-1,-1,-1,-1,0,0,-1,-1,-1 ; 13 - db -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ; 14 - ; - ds 256-140 ; 116 diff --git a/DOS/README.RUS b/DOS/README.RUS deleted file mode 100755 index b873111..0000000 --- a/DOS/README.RUS +++ /dev/null @@ -1,22 +0,0 @@ -Версию ДОС обозвал как 1.61. -Установка: заменить оригинальный файл "system.dos". - - -1. Исправлена фирменная ошибка, при которой происходило зависание -системы (непредсказуемое поведение) при превышении макс. числа -открытых дескрипторов. Однажды, во времена портирования M80.EXE, -из-за данного бага и конечно неудачного расположения звезд на небе, -был снесен весь логический диск "C". - -2. Появилась новая функция: - - Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. - вход: нет - выход: A - номер последнего лог. диска в системе - -Предназначена для создателей RAM-дисков. Для доступа к созданному -RAM-диску не нужно перезагружать компьютер. - -3. В отличии от оригинала, функции 0Ah/0Bh (Create file/New create file) -перед созданием файла проверяют на переполнение таблицу свободных -дескрипторов. diff --git a/DOS/pr.bat b/DOS/pr.bat deleted file mode 100755 index ab47e4d..0000000 --- a/DOS/pr.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -..\asmplus.exe dos.asm SYSTEM.DOS -if errorlevel 1 goto ERR -echo Ok! -goto END - -:ERR -del system.dos -echo ошибки компиляции... - -:END -del dos.lst diff --git a/DOS/readme.! b/DOS/readme.! deleted file mode 100755 index 15647ee..0000000 --- a/DOS/readme.! +++ /dev/null @@ -1 +0,0 @@ -При создании файла, папки и др. операций с путем (диском) - ДОС меняет текущий путь !!!. diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index b8c12cd..e4a72e6 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -61,7 +61,6 @@ FM_BUF: _sFM ENDM //////////////////////////////////////////////////////////////////////// - SET_FM: _mFM_FIND LD A,DSS_Error.sys.NO_ERROR RET NZ diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index a9bd714..f566f87 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -545,7 +545,9 @@ SIZEBLK: LD B,#FF XOR A RET -LEAVMEM: LD HL,MEMTAB +//////////////////////////////////////////////////////////////////////// +FREE_PROCESS_MEMORY: + LD HL,MEMTAB LD BC,256 ;!HARDCODE размер блока страниц ОЗУ .loop: LD A,(TASK) CPIR @@ -561,7 +563,31 @@ LEAVMEM: LD HL,MEMTAB POP BC POP HL JP .loop +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +FREE_PROCESS_FMs: + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size + LD B,FMCOUNT+1 + LD A,(TASK) +.loop: ADD IY,DE + CP (IY+_sFM.TASK_NUM) + CALL Z,.CLOSE + DJNZ .loop + RET + ; +.CLOSE: PUSH IY + PUSH DE + PUSH AF + LD A,FMCOUNT+1 + SUB B + CALL CLOSE_FN + POP AF + POP DE + POP IY + RET +//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ; Функция #38. Подключение страницы памяти. ; @@ -1055,10 +1081,6 @@ _TST_PROC: IN A,(SLOT1) PUSH DE PUSH AF - ;[x] 25/10/23 close EXE FM - LD A,(EXE_FM) - PUSH AF - ; LD (EXSTACK),SP LD SP,HL EXX @@ -1165,13 +1187,11 @@ _TST_PROC_2: ; ;///////////////////////////////////////////////////////////////////// LEAVE: LD A,B - LD (ERLEVEL),A - CALL LEAVMEM + LD (ErrorLevel),A + CALL FREE_PROCESS_MEMORY LD SP,(EXSTACK) - ;[x] 25/10/23 close EXE FM - POP AF - ;CALL RES_FM - CALL CLOSE_FN + ;[x] 10/12/23 close EXE FMs + CALL FREE_PROCESS_FMs _mDECTASK ; POP AF @@ -1186,7 +1206,7 @@ LEAVE: LD A,B LD (EXSTACK),SP LD SP,HL EX DE,HL - LD A,(ERLEVEL) + LD A,(ErrorLevel) ;R12 CP DSS_Error.sys.UNEXPECTED_APP_TRMN JR NZ,.exit @@ -1202,7 +1222,7 @@ LEAVE: LD A,B ; вход: нет ; выход: A - код завершения ;///////////////////////////////////////////////////////////////////// -WAIT: LD A,(ERLEVEL) +WAIT: LD A,(ErrorLevel) AND A RET ;///////////////////////////////////////////////////////////////////// @@ -1302,7 +1322,7 @@ TASK: DB #01 ; RAMMAP: DB #00,#00,#00,#00 -ERLEVEL: DB #00 ; код завершения программы (процесса) +ErrorLevel: DB #00 ; код завершения программы (процесса) EXE_FM: DB #00 ; дескр. файла EXE_MEM: DB #00 ; идентификатор блока памяти diff --git a/DSS/build.txt b/DSS/build.txt index bc93f94..be2fb0a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -786 \ No newline at end of file +789 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index a00c92c..959344c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -19,11 +19,17 @@ echo_mode: ; Запуск bat-файла ; вход: hl=имя файла ;------------------------------------------------- -A83E8: call BATCH +RUN_BAT: + ; [ ] 11/12/23 вложенные bat +;.level+1: + ; LD A,(BAT_FM) + ; OR A + ; jr nz,.new_process + ; ; + call BATCH jp c,A83DD ; ошибка откр. файла (cpp.asm) ret - - +;------------------------------------------------- ; вход: b=число слов "ZERO".."NINE" MAKE_BATCH_PRM_ARRAY: @@ -78,6 +84,14 @@ BATCH: push hl ; ex de,hl .B_ALL_P: pop hl ; восст. имя bat-файла + ; [ ] 11/12/23 вложенные bat + ld a,(BAT_FM) + or a + jr z,1F + CALL .new_process + xor a + ret +1: ; ld a,Dss.Open.R ; на чтение ld c,Dss.Open ; открыть файл RST ToDSS @@ -91,9 +105,47 @@ BATCH: push hl ; ld (BAT_FM),a ; дескр. bat-файла ; выполн. команд bat-файла call NEWLINE + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat xor a ret + ; [ ] 11/12/23 вложенные bat +.new_process: + ld de,work_buffer + call copy_string + ; + ld hl,.shell + ld de,struct_input_line+5 + call copy_string + ; + ld hl,work_buffer + ld de,struct_input_line+5 + .shell.size - 1 + call copy_string + ; + ; ld c,Dss.CurDisk + ; rst ToDSS + ; add a,'A' + ; ld (.shell),a + ; + ld hl,struct_input_line+5 + ld bc,Dss.Exec;.Here + rst ToDSS + ; + ; PUSH AF + ; LD A + ret nc + CP DSS_Error.sys.FILE_NOT_FOUND + jp z,A83DD ; ошибка откр. файла (cpp.asm) + ret +;.shell: DB '?:\SYSTEM.EXE /C ',0 + +.shell: DB 'SYSTEM.EXE /C ',0 +.shell.size EQU $ - .shell +; +.ErrorEnv: DB 'ERRORLEVEL=' +.ErrorEnv.Code: DB 'xxx',0 +.ErrorEnv.Size EQU $ - .ErrorEnv + ; ;--------------------------------------------------- ; Выполнение команд BAT-файла @@ -106,20 +158,27 @@ NEWLINE: or a ; a=число прочит. байт jr nz,.BATLINE ex de,hl - ;ld de,T96AE ;;256 буфер (inline.asm) ld de,struct_input_line+5 sbc hl,de - jr z,.exit; ;[x] Vasil, убран баг с незакрытым BAT-файлом + jr z,.exit; ;[x] убран баг с незакрытым BAT-файлом ld a,l ld (struct_input_line+4),a ; длина строки + PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break + ; [ ] 11/12/23 вложенные bat + ; ld a,#FF + ; ld (RUN_BAT.level),a + ; call CMDMODE ; тест на bat-команды "rem","pause" + POP HL ; [ ] 11/12/23 для баланса стека в cmd_break .exit: ld a,(BAT_FM) ; дескр. bat-файла ld c,Dss.Close ; закрыть файл + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat RST ToDSS + xor a + ld (BAT_FM),a ret ; .BATLINE: - ;ld hl,T99B9 ; откуда, 128 буфер (ccp.asm) "work_buffer1" ld hl,work_buffer1 .loop: call MOVWORD ; скопир. work_buffer1 -> struct_input_line+5 jr c,.ADDBAT @@ -127,17 +186,16 @@ NEWLINE: ld (MOVWORD.count),a ; осталось пропарсить прочитанных байтов push hl ex de,hl - ;ld de,T96AE ;;256 буфер (inline.asm) ld de,struct_input_line+5 - ;ld de,work_buffer+256;; sbc hl,de ld a,l - ;ld (D96AD),a ;; длина строки (inline.asm) ld (struct_input_line+4),a ; длина строки + ; [ ] 11/12/23 вложенные bat + ; ld a,#FF + ; ld (RUN_BAT.level),a + ; call CMDMODE ; тест на bat-команды "rem","pause" - ;ld de,T96AE ;;256 буфер (inline.asm) ld de,struct_input_line+5 - ;ld de,work_buffer+256;; pop hl jr .loop @@ -155,7 +213,7 @@ MOVWORD: .loop: ld a,(hl) ld (de),a cp " " - jr c,.loop2 + jr c,.loop_ inc hl inc de djnz .loop @@ -165,7 +223,7 @@ MOVWORD: .loop2: ld a,(hl) cp " " ret nc - inc hl +.loop_: inc hl djnz .loop2 push de call READBAT ; прочитать 128 байт из файла @@ -196,6 +254,7 @@ READBAT: ; Тест на bat-команды "rem","pause" +; должен соблюдаться баланс стека для cmd_break CMDMODE: ;xor a ;ld (D96A6),a ; (inline.asm) @@ -203,14 +262,13 @@ CMDMODE: ;ld ix,T96AC ; нужно?? закоментарил (inline.asm) ;ld hl,T96AE ;;256 буфер (inline.asm) ld hl,struct_input_line+5 - ;ld hl,work_buffer+256;; ld a,(hl) cp "@" ; 40h - jr nz,A8240 + jr nz,.A8240 dec hl ;ld hl,struct_input_line+4;; dec (hl) - jr z,A825B + jr z,.A825B ld c,(hl) ; длина строки inc hl ld b,0 @@ -219,11 +277,11 @@ CMDMODE: ld e,l inc hl ldir - jr A825B + jr .A825B ; -A8240: ld a,(echo_mode) ; флаг echo-режима +.A8240: ld a,(echo_mode) ; флаг echo-режима or a - jr z,A825B ; off + jr z,.A825B ; off ; вывести сист. путь и строку содержимого bat-файла ;ld de,T96AE ;;256 буфер (inline.asm) ;ld de,struct_input_line+5 @@ -250,7 +308,7 @@ A8240: ld a,(echo_mode) ; фла sub b ei ret z ; правый край экрана - jr c,A8250; ; строка больше ширины экрана + jr c,.A8250; ; строка больше ширины экрана ; заполнить строку до конца экрана dec a ; чтобы не сработал скроллинг экрана ;!FIXIT scroll ld b,a ; число вывод. символов @@ -259,7 +317,7 @@ A8240: ld a,(echo_mode) ; фла RST ToBIOS ei ;!TEST -A8250: call newline +.A8250: call newline ; ; ;ld a,(D96AD) ;; длина строки (inline.asm) @@ -269,7 +327,7 @@ A8250: call newline ;call newline ;jr A8264 ; -A825B: ;ld a,(D96AD) ;; длина строки (inline.asm) +.A825B: ;ld a,(D96AD) ;; длина строки (inline.asm) ld a,(struct_input_line+4) or a ret z @@ -282,15 +340,15 @@ A825B: ;ld a,(D96AD) ;; ld b,0 inc hl ;ld hl,work_buffer+256;; -A826C: ld a,(hl) +.A826C: ld a,(hl) cp " " - jr nz,A8276 + jr nz,.A8276 inc hl dec c - jr nz,A826C + jr nz,.A826C ret ; -A8276: ld d,h +.A8276: ld d,h ld e,l add hl,bc ld (hl),b ; 0 в конец строки (первого конц. пробела) @@ -299,15 +357,19 @@ A8276: ld d,h ex af,af' ld a," " cpir - jr nz,A8286 + jr nz,.A8286 inc c -A8286: ex af,af' +.A8286: ex af,af' sub c ld c,a ; длина слова или строки ? ld hl,BATLIST ; команды "pause","rem" + dos-команды ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - jp COMP005.start + ; [ ] 11/12/23 вложенные bat + ; ld a,#FF + ; ld (RUN_BAT.level),a + ; + jp COMP005.start @@ -418,6 +480,7 @@ EVALSTR: ld a,(hl) ; BAT-команды (не отделять от дос-команд) BATLIST: DZ 'PAUSE' : DW cmd_pause ;CPAUSE DZ 'REM' : DW cmd_rem ;CREM + DZ 'EXIT' : DW cmd_break ;break ; ; DSS-команды CMDLIST: DZ 'CD' : DW cmd_chdir ;CCHDIR diff --git a/SHELL/Commands/BREAK.ASM b/SHELL/Commands/BREAK.ASM new file mode 100644 index 0000000..3753220 --- /dev/null +++ b/SHELL/Commands/BREAK.ASM @@ -0,0 +1,8 @@ +; [ ] 11/12/23 +cmd_break: + pop hl ; восстановление баланса стека + pop hl ; восстановление баланса стека + XOR A + ld (MOVWORD.count),a + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat + JP NEWLINE.exit \ No newline at end of file diff --git a/SHELL/Commands/EXIT.ASM b/SHELL/Commands/EXIT.ASM index 2e20b9d..78f5b9c 100644 --- a/SHELL/Commands/EXIT.ASM +++ b/SHELL/Commands/EXIT.ASM @@ -8,5 +8,5 @@ cmd_exit: dec a dec a ret z ; a=2 (primary шелл) - pop hl ; восст. баланс стека (убрать вызов A82E7 в гл. цикле оболочки) + ;pop hl ; восст. баланс стека (убрать вызов COMP в гл. цикле оболочки) jp back_to_parent_process ; вернуться в родит. процесс diff --git a/SHELL/Commands/REM.ASM b/SHELL/Commands/REM.ASM index 77fa229..5dbfaad 100644 --- a/SHELL/Commands/REM.ASM +++ b/SHELL/Commands/REM.ASM @@ -3,4 +3,5 @@ ; REM. Комментарий (в bat-файле) ; ;/////////////////////////////////////////////////// -cmd_rem:ret +cmd_rem: ret +; diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 31f4e8e..260672b 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -102,10 +102,10 @@ RUN_EXT: ex de,hl ; ; есть расш. файла ld de,T8C1A ; буфер расш. файла ld hl,T8C1E ; "BAT" - ld b,3 ; длина сравнения + ld b,3 ; длина сравнения ;!HARDCODE call A874E ; сравнить строки ld hl,(D8374) - jp z,A83E8 ; выполнить bat-файл (batch.asm) + jp z,RUN_BAT ; выполнить bat-файл (batch.asm) jr A83D7 ; выполнить exe-файл A839D: ld bc,0*256 + Dss.Exec ; загр. и выполнить программу @@ -153,7 +153,7 @@ A83B7: ld e,b inc hl ld (hl),"T" pop hl - jp A83E8 ; выполнить bat-файл (batch.asm) + jp RUN_BAT ; выполнить bat-файл (batch.asm) ; Выполнить exe-файл diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 1a36d36..9eb0307 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -117,14 +117,26 @@ shell: bit 6,a ; 6-й бит (вводились дополн. параметры) jr z,back_to_parent_process ; вводились дополн. параметры + PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break + ; [ ] 11/12/23 вложенные bat + ; xor a + ; ld (RUN_BAT.level),a + ; call CMDMODE ; (batch.asm) выполн. команду или запустить файл + POP HL ; [ ] 11/12/23 для баланса стека в cmd_break call save_disk_path ; узнать и сохр. тек. диск и путь ; ; Вернуться в родит. процесс back_to_parent_process: - ld bc,0*256 + Dss.Exit - RST ToDSS - ret + ; [ ] 11/12/23 вложенные bat + LD B,0 + JR NC,1F + LD B,A +1: ld c,Dss.Exit + ;ld bc,0*256 + Dss.Exit + ; + JP ToDSS + ;ret @@ -148,7 +160,9 @@ option_c: ;ld hl,work_buffer+256;; ld hl,struct_input_line+5 ; имя bat-файла call BATCH ; обработка bat-файла (batch.asm) + PUSH AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата call save_disk_path ; узнать и сохр. тек. диск и путь + POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата jr back_to_parent_process ; вернуться в родит. процесс @@ -289,7 +303,7 @@ setopt2: cp "S" ; set 5,c jr setopt4 ; -setopt3:cp "C" ; выполн. bat-файл и вернуться в родит. процесс +setopt3: cp "C" ; выполн. bat-файл и вернуться в родит. процесс ret nz set 4,c setopt4: ld a,c @@ -532,6 +546,7 @@ T8C24: db "OFF",0 ; include 'Commands/exit.asm' ; выход в родит. процесс + include 'Commands/break.asm' ; выход из парсера bat include 'Commands/pause.asm' ; пауза include 'Commands/rem.asm' ; комментарий include 'Commands/ver.asm' ; вывод версии ДОС diff --git a/SHELL/build.txt b/SHELL/build.txt index 9754915..f3a5e81 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -259 \ No newline at end of file +281 \ No newline at end of file From 6ef97092adedd781210f1f0c1876f867a2e8a52f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 12 Dec 2023 04:24:32 +1000 Subject: [PATCH 069/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 21c7eb6..3bc92f2 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 21c7eb690adb62e35c41fdcda76dc3bf97f369b4 +Subproject commit 3bc92f2ea2e0080f243fdeda4e46db545e657ba1 From 76825603e176588be689e01e5eac3847fe3a0c7e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 13 Dec 2023 04:32:38 +1000 Subject: [PATCH 070/219] + bat in bat in bat... --- DSS/KEYINTER.ASM | 6 +-- DSS/VIDEO.ASM | 24 +++++---- SHELL/BATCH.ASM | 101 ++++++++++++++++++++---------------- SHELL/Commands/CHDIR.ASM | 2 +- SHELL/EXEC.ASM | 8 +-- SHELL/Messages/main_txt.asm | 8 +-- SHELL/SHELL.ASM | 47 +++++++++-------- SHELL/build.txt | 2 +- 8 files changed, 109 insertions(+), 89 deletions(-) diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 4673c3d..83a24a0 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -126,7 +126,7 @@ ECHOKEY: ;R01 LD A," " JR Z,.CURSKI LD A,"_" -.CURSKI: CALL PUTCHAR.NO_SCROLL ;R03 +.CURSKI: CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor POP DE CALL LOCATE @@ -142,7 +142,7 @@ ECHOKEY: ;R01 PUSH DE LD A," " - CALL PUTCHAR.NO_SCROLL ;R03 + CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor ;LD A,8 ; BACKSPACE ;CALL PUTCHAR @@ -150,7 +150,7 @@ ECHOKEY: ;R01 POP AF PUSH DE ;R01 [v] - CALL PUTCHAR.NO_SCROLL + CALL PUTCHAR.NO_SCROLL ; [x] -bug with Vasil's version of cursor POP DE CALL LOCATE diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index ca42338..ac510dd 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -29,8 +29,8 @@ CLEAR: LD C,BIOS.LP_CLS_WIN2 ;///////////////////////////////////////////////////////////////////// ; Функция #5C. Вывод строки на экран. ; -; вход: HL - указатель на строку символов -; выход: нет +; вход: HL - указатель на строку символов +; выход: HL - указатель на следующую строку символов ; PRINT NULL-TERMINATED CHARS STRING ;///////////////////////////////////////////////////////////////////// PCHARS: LD A,(HL) @@ -56,7 +56,7 @@ PUTCHAR: CP #08 JR Z,.BK_ CP #07 - JR Z,.BELL + JR Z,.BELL ; [x] Beep in PChars/PUTCHAR ; .CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM ;[x] CR+LF+SCROLL @@ -67,7 +67,7 @@ PUTCHAR: OR E RET NZ ; -.LFF: PUSH HL ;!FIXIT сохранять текущие прерывания +.LFF: PUSH HL LD BC,1*256 + BIOS.LP_SCROLL_UD LD DE,#0020 RST ToBIOS @@ -110,7 +110,7 @@ PUTCHAR: RST ToBIOS LD A,D CP #1F - JR NC,.LFF ;!FIXIT срабатывает как CRLF надо скроллить с сохранением Y + JR NC,.LFF INC D IFN EnoughtOnly_LF JP LOCATE @@ -122,9 +122,15 @@ PUTCHAR: RST ToBIOS LD E,0 JP LOCATE -.BELL: LD DE,1200 - LD HL,4 - JP BEEP + ; [x] Beep in PChars/PUTCHAR +.BELL: LD DE,1200 + PUSH HL + LD HL,4 + CALL BEEP + POP HL + RET + ; +; [x] -bug with Vasil's version of cursor .NO_SCROLL: CP #0D JR Z,.CR_ @@ -135,7 +141,7 @@ PUTCHAR: CP #08 JR Z,.BK_ CP #07 - JR Z,.BELL + JR Z,.BELL ; [x] Beep in PChars/PUTCHAR ._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM JP ToBIOS ;-----[] diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 959344c..c77fed2 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -13,7 +13,15 @@ echo_mode: ;T98B9: ds 256 - + IF 0 + CALL RUN_BAT + CALL BATCH + CALL MAKE_BATCH_PRM_ARRAY + CALL NEWLINE + CALL CMDMODE + CALL EVALCMD + CALL RUN_BAT + ENDIF ;------------------------------------------------- ; Запуск bat-файла @@ -65,7 +73,14 @@ MAKE_BATCH_PRM_ARRAY: ; вход: hl=имя файла ; выход: "CF" - ошибка откр. файла ;------------------------------------------------- -BATCH: push hl ; сохр. имя bat-файла +BATCH: + ; [ ] 11/12/23 вложенные bat + ld a,(BAT_FM) + or a + jr nz,.new_process + ; + + push hl ; сохр. имя bat-файла ld de,work_buffer ; 512 местный буфер call copy_string ; скопир. строку (с нулем) ld hl,work_buffer ; 512 местный буфер @@ -82,42 +97,40 @@ BATCH: push hl ; inc hl djnz .B_CLR_P ex de,hl -.B_ALL_P: +.B_ALL_P:;- pop hl ; восст. имя bat-файла - ; [ ] 11/12/23 вложенные bat - ld a,(BAT_FM) - or a - jr z,1F - CALL .new_process - xor a - ret -1: ; + ld a,Dss.Open.R ; на чтение ld c,Dss.Open ; открыть файл RST ToDSS - push af ; сохр. код ошибки - call c,restore_disk_path ; восст. тек. диск и путь + ;push af ; сохр. код ошибки + ;call c,restore_disk_path ; восст. тек. диск и путь ;R10 - CALL Restore_Screen + ;CALL Restore_Screen ;R10 - pop af + ;pop af ret c ld (BAT_FM),a ; дескр. bat-файла ; выполн. команд bat-файла call NEWLINE ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - xor a + ;R10 + push af + CALL Restore_Screen + pop af + ;R10 + xor a ;!FIXIT ret ; [ ] 11/12/23 вложенные bat .new_process: - ld de,work_buffer + ld de,work_buffer2 call copy_string ; ld hl,.shell ld de,struct_input_line+5 call copy_string ; - ld hl,work_buffer + ld hl,work_buffer2 ld de,struct_input_line+5 + .shell.size - 1 call copy_string ; @@ -127,21 +140,27 @@ BATCH: push hl ; ; ld (.shell),a ; ld hl,struct_input_line+5 - ld bc,Dss.Exec;.Here - rst ToDSS + ld bc,Dss.Exec + RST ToDSS + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat + xor a + ret ; - ; PUSH AF - ; LD A - ret nc - CP DSS_Error.sys.FILE_NOT_FOUND - jp z,A83DD ; ошибка откр. файла (cpp.asm) - ret + ;rst ToDSS + ; + ; ret nc + ; CP DSS_Error.sys.FILE_NOT_FOUND + ; ret nz + + ; jp z,A83DD ; ошибка откр. файла (cpp.asm) + ; ret ;.shell: DB '?:\SYSTEM.EXE /C ',0 .shell: DB 'SYSTEM.EXE /C ',0 .shell.size EQU $ - .shell -; + +;!TODO .ErrorEnv: DB 'ERRORLEVEL=' .ErrorEnv.Code: DB 'xxx',0 .ErrorEnv.Size EQU $ - .ErrorEnv @@ -164,11 +183,9 @@ NEWLINE: ld a,l ld (struct_input_line+4),a ; длина строки PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break - ; [ ] 11/12/23 вложенные bat - ; ld a,#FF - ; ld (RUN_BAT.level),a - ; call CMDMODE ; тест на bat-команды "rem","pause" + ; ^^^^^^^ + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat POP HL ; [ ] 11/12/23 для баланса стека в cmd_break .exit: ld a,(BAT_FM) ; дескр. bat-файла ld c,Dss.Close ; закрыть файл @@ -190,11 +207,9 @@ NEWLINE: sbc hl,de ld a,l ld (struct_input_line+4),a ; длина строки - ; [ ] 11/12/23 вложенные bat - ; ld a,#FF - ; ld (RUN_BAT.level),a - ; call CMDMODE ; тест на bat-команды "rem","pause" + ; ^^^^^^^ + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat ld de,struct_input_line+5 pop hl jr .loop @@ -306,7 +321,7 @@ CMDMODE: pop bc ; b=длина строки ld a,(width_inpline) ; ширина поля ввода (76..48) sub b - ei + ;ei ret z ; правый край экрана jr c,.A8250; ; строка больше ширины экрана ; заполнить строку до конца экрана @@ -315,7 +330,7 @@ CMDMODE: ld a," " ; символ ld c,BIOS.LP_PRINT_SYM ; вывод символа без атрибута RST ToBIOS - ei + ;ei ;!TEST .A8250: call newline ; @@ -365,17 +380,9 @@ CMDMODE: ld hl,BATLIST ; команды "pause","rem" + dos-команды ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - ; [ ] 11/12/23 вложенные bat - ; ld a,#FF - ; ld (RUN_BAT.level),a - ; jp COMP005.start - - - - ; должна убрать конц. пробелы и уст. длину строки, если урезалась EVALCMD: xor a ld hl,struct_input_line+4 ;!HARDCODE @@ -408,7 +415,9 @@ EVALSTR: ld a,(hl) .VARL1: ldi or a jr nz,EVALSTR - ld bc,0 + ; A=0 + ld b,a + ld c,a ld (.TVAR_PNT),bc ret ; diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index 8fc7750..2c8fee3 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -26,7 +26,7 @@ A877B: ld c,Dss.ChDir ; сме ;call c,print_err_message jp c,print_err_message ; вывод сообщения ; call newline - jp save_disk_path ; сохр. тек. диск и путь + jp Get_Path ; сохр. тек. диск и путь ; ; вывод сист. пути на экран ; ld c,8Eh ; узнать полож. курсора ; RST ToBIOS diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 260672b..eba849b 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -58,19 +58,19 @@ COMP005: ex af,af' cp "z"+1 jr nc,NOUP and #5F ; a..z -> A..Z -;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; вывод сообщения +;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) ; тест на существование папки на целевом диске IFDEF MANY_SYS_PATHES ld hl,system_path ; буфер сист. пути ld c,Dss.ChDir ; уст. тек. путь RST ToDSS - jp nc,save_disk_path ; Ok + jp nc,Get_Path ; Ok ENDIF ; @@ -87,7 +87,7 @@ NOUP: sub "A" ; jp c,print_err_message ; вывод сообщения ENDIF ; - jp save_disk_path ; Ok + jp Get_Path ; Ok ; задан не диск RUN_EXT: ex de,hl ; восст. адрес начала строки @@ -185,7 +185,7 @@ Ret_New_Line: RESTORE_ALL: ;[x] 01/11/23 ;!TEST - CALL save_disk_path + CALL Get_Path ; LD A,(screen_path) SUB 'A' diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index e330bea..cea673c 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -23,8 +23,11 @@ MAIN_MSG: .CRLF EQU .CRLF_ ; !txtCounter DEFL 0 -; -.TABLE: : db 0 +; ; не сдвигать____ +.TABLE: : db 0; | + stN .CRLF_ : db CR,LF,0; | + ;________________/ + ; stN .DIR_1_ : db "Volume in drive %1 %4 %5",CR,LF db "Volume Serial Number is %2",CR,LF db CR,LF,"Directory of %3",CR,LF,LF,0 @@ -48,7 +51,6 @@ MAIN_MSG: db "MD | MKDIR TIME ECHO EXIT ",CR,LF db "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 stN .CALC_ : db "Calculating free space...",CR,0 - stN .CRLF_ : db CR,LF,0 ; ;R11 db 0 DZ "Unknown command" diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 9eb0307..2a83c3f 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -101,7 +101,7 @@ shell: ld a,(ix-1) ld (cmd_exit.TASKX),a push ix - call save_disk_path ; сохр. тек. диск и путь + call Get_Path ; сохр. тек. диск и путь pop hl ; hl=ix ; ; Тест на опции запуска самого шелла @@ -118,13 +118,11 @@ shell: jr z,back_to_parent_process ; вводились дополн. параметры PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break - ; [ ] 11/12/23 вложенные bat - ; xor a - ; ld (RUN_BAT.level),a - ; call CMDMODE ; (batch.asm) выполн. команду или запустить файл + ; ^^^^^^^ + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat POP HL ; [ ] 11/12/23 для баланса стека в cmd_break - call save_disk_path ; узнать и сохр. тек. диск и путь + call Get_Path ; узнать и сохр. тек. диск и путь ; ; Вернуться в родит. процесс back_to_parent_process: @@ -160,9 +158,12 @@ option_c: ;ld hl,work_buffer+256;; ld hl,struct_input_line+5 ; имя bat-файла call BATCH ; обработка bat-файла (batch.asm) - PUSH AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата - call save_disk_path ; узнать и сохр. тек. диск и путь - POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата + + ;PUSH AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата + ;call save_disk_path ; узнать и сохр. тек. диск и путь + ;POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата + + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat jr back_to_parent_process ; вернуться в родит. процесс @@ -187,7 +188,7 @@ run_shell: run_shell_loop: ;call A82CC ; узнать и уст. полож. курсора ; вывести тек.сист. путь и войти в строку редактирования - call save_disk_path ; узнать и сохр. тек. диск и путь + call Get_Path ; узнать и сохр. тек. диск и путь run_shell_loop1: call input_line call newline ; на новую строку @@ -317,13 +318,12 @@ setopt4: ld a,c ;!TODO проверить 4 нижеидущие процедуры когда в DSS будут нормально пути запоминаться ; Сохранить тек. диск и путь ;GETPATH: -save_disk_path: +Get_Path: ; узнать тек. каталог ld hl,system_path ; 256 буфер сист. пути ld c,Dss.CurDir RST ToDSS -save_disk: - ; узнать тек. диск +.disk: ; узнать тек. диск ld c,Dss.CurDisk RST ToDSS add a,"A" @@ -336,7 +336,7 @@ restore_disk_path: ; уст. тек. диск ld a,(screen_path) ; 33 строка экранного пути sub "A" - ld c,Dss.ChDir + ld c,Dss.ChDisk RST ToDSS ;!FIXIT убрать лишние вызовы @@ -348,16 +348,19 @@ restore_path: ret - - ; на новую строку ;!FIXIT сделать через .PChars -newline: ld a,_cc.cr - ld c,Dss.PutChar +; newline: ld a,_cc.cr +; ld c,Dss.PutChar +; rst ToDSS +; ld a,_cc.lf +; ld c,Dss.PutChar +; jp ToDSS +newline: push hl + ld hl,MAIN_MSG.TABLE+1 ; "CR,LF,0" + ld c,Dss.PChars rst ToDSS - ld a,_cc.lf - ld c,Dss.PutChar - jp ToDSS - + pop hl + ret ; Сравнение строк ; in: de=string1 diff --git a/SHELL/build.txt b/SHELL/build.txt index f3a5e81..9e6181a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -281 \ No newline at end of file +285 \ No newline at end of file From a4fd704a5c3936ea91380cd4ab3459e033f024dd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 13 Dec 2023 05:11:56 +1000 Subject: [PATCH 071/219] update to CURDISK_FN --- DSS/API/curDisk.asm | 8 +++++++- DSS/build.txt | 2 +- SHELL/build.txt | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index 7bc73e1..5c61c19 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -3,14 +3,20 @@ ; ; вход: нет ; выход: A - номер диска (0=A,1=B,..) +; C - номер последнего диска в системе ;///////////////////////////////////////////////////////////////////// CURDISK_FN: + LD A,(LDRIVE) + LD C,A LD A,(CurrentPath) SUB 'A' RET NC LD A,DSS_Error.sys.INVALID_DRIVE RET -CURDISK: LD A,(FatBuffer.DRIVE) +CURDISK: + LD A,(LDRIVE) + LD C,A + LD A,(FatBuffer.DRIVE) AND A RET ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index be2fb0a..c04091d 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -789 \ No newline at end of file +790 \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 9e6181a..53c7311 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -285 \ No newline at end of file +286 \ No newline at end of file From 81595cbb58969a57136346a5190707b060b73f07 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 15 Dec 2023 03:23:09 +1000 Subject: [PATCH 072/219] =?UTF-8?q?=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB=D0=BA?= =?UTF-8?q?=D0=B0=20cmd=5Fbreak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 54 ++++++++++++++--------------- DSS/CHANGES.LOG | 4 +-- DSS/KEYINTER.ASM | 35 +++++++++++-------- DSS/KNOWN.BUG | 4 +-- SHELL/BATCH.ASM | 74 ++++++++++++++++++++++------------------ SHELL/Commands/BREAK.ASM | 17 ++++++--- SHELL/Commands/REM.ASM | 5 ++- SHELL/EXEC.ASM | 19 ++++++----- SHELL/SHELL.ASM | 17 ++++----- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 11 files changed, 127 insertions(+), 106 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index bd19f1c..761617c 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -61,8 +61,8 @@ BEGIN: in a,(SLOT3) ld (port+1),a ; сохр. порт push ix call save_path ; сохр. тек. диск и путь - ld c,0 ; узнать версию ДОС - rst 10h + ld c,Dss.Version ; узнать версию ДОС + RST ToDSS ex de,hl ; hl=тек. версия ld de,#013C ; 1.60 d=версия, e=модификация, bc - номер сборки. de = #013E, bc = #0064 dos ver 1.62.100 and a @@ -83,7 +83,7 @@ version_ok: xor a ; ld (disk),a ; заданный номер диска ; узнать номер boot-диска системы ld bc,0009h - rst 10h + RST ToDSS ld (boot_disk),a ; диск (A=0,B=1,..) ; проверить на совпадение дисков ld hl,disk @@ -99,7 +99,7 @@ version_ok: xor a ; add a,'A' ld (hl),a ld c,1Dh ; смена каталога - rst 10h + RST ToDSS ;-------------------------------------------- ; Чтение файла system.exe ;-------------------------------------------- @@ -109,7 +109,7 @@ version_ok: xor a ; ; освоб. блок памяти read_file_err: ld a,(id_blck) ; идентиф. блока памяти ld c,3Eh - rst 10h + RST ToDSS ld a,-1 ; код ошибки jp exit @@ -127,7 +127,7 @@ read_file1_ok: ld hl,file_handle ; ; освоб. блок памяти system.exe file_err1: ld a,(id_mem) ; идентиф. блока памяти ld c,3Eh - rst 10h + RST ToDSS jr read_file_err ; освоб. блок памяти system.dos read_file2_ok: @@ -144,7 +144,7 @@ confirm_flag+*: ld a,0 ld a,5 ; индекс строки "Insert destination disk..." call print_string ld bc,3035h ; ждем нажатия клавиши - rst 10h + RST ToDSS no_confirm: ld a,2 ; индекс строки "Installing boot loader..." call print_string ; Уст. целевой диск/путь @@ -153,7 +153,7 @@ no_confirm: ld a,2 ; add a,'A' ld (hl),a ld c,1Dh ; смена тек. каталога - rst 10h + RST ToDSS ;-------------------------------------------- ; Записать boot-загрузчик call write_boot_loader @@ -170,7 +170,7 @@ no_confirm: ld a,2 ; ok_write1: ; освободить память ld a,(id_blck) ; блок system.dos ld c,3Eh - rst 10h + RST ToDSS ; ; загр. раб. ячейки ld hl,hFile1 ; откуда @@ -184,7 +184,7 @@ ok_write1: ; push af ld a,(id_blck) ; блок system.exe ld c,3Eh - rst 10h + RST ToDSS pop af jr c,exit ; ошибка ; @@ -205,7 +205,7 @@ ok_write1: ; ld a,6 ; индекс строки "Insert system disk..." call print_string ld bc,3035h ; ждем нажатия клавиши - rst 10h + RST ToDSS xor a ; код "Ok" exit: push af call restore_path ; восст. тек. диск и путь @@ -214,7 +214,7 @@ port: ld a,-1 ; pop af ld c,41h ; выход в ДОС ld b,a - rst 10h + RST ToDSS jr $ @@ -356,7 +356,7 @@ get_drive_letter: inc hl ; буфер строки ld de,buffer ; буфер для выдел. параметра ld c,43h ; выделить параметр ком. строки - rst 10h + RST ToDSS ld de,buffer ld a,(de) inc de @@ -390,11 +390,11 @@ get_drive_err: scf ; ; сохр. тек. системный диск и путь ;---------------------------------------------------- save_path: ld c,2 ; узнать диск - rst 10h + RST ToDSS ld (sys_disk),a ld hl,sys_path ld c,1Eh ; узнать путь - rst 10h + RST ToDSS ret @@ -403,10 +403,10 @@ save_path: ld c,2 ; узн ;---------------------------------------------------- restore_path: ld a,(sys_disk) ld c,1 ; смена диска - rst 10h + RST ToDSS ld hl,sys_path ld c,1Dh ; смена пути - rst 10h + RST ToDSS ret @@ -483,7 +483,7 @@ endmess: db 0 ; вход: a=индекс строки print_string: call get_string ; поиск строки по ее индексу в 'a' ld c,5Ch ; вывод строки - rst 10h + RST ToDSS ret @@ -514,7 +514,7 @@ get_loop: ex af,af' ;==================================================== read_file: ld a,1 ; на чтение ld c,11h ; открыть файл - rst 10h + RST ToDSS jr nc,ok ; без ошибок ld a,9 ; индекс "Can't open file" call print_string @@ -524,7 +524,7 @@ ok: ld (file_handle),a ; ld hl,0 ld ix,0 ld bc,0215h ; указатель на конец файла - rst 10h + RST ToDSS ld (hsize),hl ; ст.разряд размера файла ld (lsize),ix ; мл.разряд call get_memory ; расч. и выдел. страницы под файл @@ -532,7 +532,7 @@ ok: ld (file_handle),a ; call file_to_bank ; загр. файл в страницы close_file: ld a,(file_handle) ; дескр. файла ld c,12h ; закрыть файл - rst 10h + RST ToDSS ret ; not_enough: call close_file @@ -574,7 +574,7 @@ malloc2: or a ; выделить блок памяти ld b,c ; b=число страниц ld c,3Dh - rst 10h + RST ToDSS ld (id_blck),a ; идентиф. блока ret @@ -586,7 +586,7 @@ file_to_bank: ld hl,0 ld ix,0 ld a,(file_handle) ; дескр. файла ld bc,0015h ; указатель на начало файла - rst 10h + RST ToDSS ld a,(id_blck) ; идентиф. блока памяти ld b,0 ; лог. номер страницы в блоке ld c,0C4h ; получить физ. номер страницы в блоке @@ -598,7 +598,7 @@ loop_to_bank: push af ld de,4000h ; сколько ld a,(file_handle) ; дескр. файла ld c,13h ; читать файл - rst 10h + RST ToDSS pop bc jr nc,ok_to_bank ld a,12 ; индекс "Reading error" @@ -626,7 +626,7 @@ ok_to_bank: cp -1 ; ;==================================================== write_file: ld a,20h ; атрибут "архивный" ld c,0Ah ; создать файл - rst 10h + RST ToDSS jr nc,create_ok ; без ошибок ld a,13 ; индекс "Can't create file" call print_string @@ -662,7 +662,7 @@ write_loop: push af ld de,4000h ; сколько ld a,(file_handle) ; дескр. файла ld c,14h ; запись файла - rst 10h + RST ToDSS pop bc jr nc,write_ok ld a,14 ; индекс "Writing error" @@ -689,7 +689,7 @@ write_end: pop af ; ld hl,page_buffer ; #C000 откуда ld a,(file_handle) ; дескр. файла ld c,14h ; запись файла - rst 10h + RST ToDSS ret diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index a87e1be..4ea1f7b 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -13,7 +13,7 @@ [ ] перед началом работы любой процедуры записи/чтения драйва устанавливать флаг, чтоб не было повторного вызова (из прерывания, например) [ ] блокировка файлов в файловых манипуляторах (чтоб не открывать на запись уже открытый на запись файл, например) Среднее: -[x] ;!TEST перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле +[x] перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле [ ] начать работать с функциями REMOVABLE и MEDIA CHECK rst #18. Возвращать значение #FF, если порядок букв изменился Вообще не важное: @@ -23,7 +23,7 @@ DSS 1.70.2 Изменения после версии 1.70 CORE: - [+] при чтении/записи файла не происходит "холостое" перечитывание кластеров от начала файла + [+] при чтении/записи файла не происходит "холостое" перечитывание FAT от начала файла [+] перечитывание BPB теперь делается не на каждый чих, а когда надо (и бага при загрузке с диска "B:" нет :-P ) [+] изменена работа с RAM DISK, теперь он может быть загрузочным [+] исправлены баги в функциях: WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 83a24a0..c6a7716 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -816,20 +816,27 @@ RTAB EX DE,HL ; ` ; 0 -; Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Back -; 1 2 3 4 5 6 7 8 9 A B C D E -; Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" -; F 10 11 12 13 14 15 16 17 18 19 1A 1B -; Cps,"A","S","D","F","G","H","J","K","L",";","'",Enter -; 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 -; LSh,"Z","X","C","V","B","N","M",",",".","/",RSh,#5C -; 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 -; LCl,LAt,SPC,Rat,RCl,F01,F02,F03,F04,F05,F06,F07,F08 -; 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 -; F09,F10,F11,F12,prn,scr,num,"/","*","-","+",ent,Del -; 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F -; Ins,End,Dwn,PgD,Lft,"5",Rgh,Hom,Upp,PgU -; 50 51 52 53 54 55 56 57 58 59 +; Esc, "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", Back +; 1 2 3 4 5 6 7 8 9 A B C D E + +; Tab, "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]" +; F 10 11 12 13 14 15 16 17 18 19 1A 1B + +; Cps, "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'", Enter +; 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 + +; LSh, "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/", RSh, #5C +; 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 + +; LCl, LAt, SPC, Rat, RCl, F01, F02, F03, F04, F05, F06, F07, F08 +; 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 + +; F09, F10, F11, F12, prn, scr, num, "/", "*", "-", "+", ent, Del +; 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + +; Ins, End, Dwn, PgD, Lft, "5", Rgh, Hom, Upp, PgU +; 50 51 52 53 54 55 56 57 58 59 +; ; ;================================ Esc EQU #1B diff --git a/DSS/KNOWN.BUG b/DSS/KNOWN.BUG index 1356b17..5f96bcc 100644 --- a/DSS/KNOWN.BUG +++ b/DSS/KNOWN.BUG @@ -1,9 +1,9 @@ FIXED: + function WINCOPY & WINREST не запрещают прерывания перед вызовом BIOS (используется вывод стеком!). -- при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции! + + при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции! -+ ошибка в функции SCROLL A=0. +? ошибка в функции SCROLL A=0. + ошибка при просмотре каталога в функциях установки атрибутов пропускаются системные файлы. п/п SEARCH MASK=#23 diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index c77fed2..919a011 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -13,27 +13,21 @@ echo_mode: ;T98B9: ds 256 - IF 0 - CALL RUN_BAT - CALL BATCH - CALL MAKE_BATCH_PRM_ARRAY - CALL NEWLINE - CALL CMDMODE - CALL EVALCMD - CALL RUN_BAT - ENDIF + ; IF 0 + ; CALL RUN_BAT + ; CALL BATCH + ; CALL MAKE_BATCH_PRM_ARRAY + ; CALL NEWLINE + ; CALL CMDMODE + ; CALL EVALCMD + ; CALL RUN_BAT + ; ENDIF ;------------------------------------------------- ; Запуск bat-файла ; вход: hl=имя файла ;------------------------------------------------- RUN_BAT: - ; [ ] 11/12/23 вложенные bat -;.level+1: - ; LD A,(BAT_FM) - ; OR A - ; jr nz,.new_process - ; ; call BATCH jp c,A83DD ; ошибка откр. файла (cpp.asm) ret @@ -170,30 +164,34 @@ BATCH: ; Выполнение команд BAT-файла ;--------------------------------------------------- NEWLINE: + LD (cmd_break.sp),SP ; [ ] 11/12/23 cmd_break + ; ld de,struct_input_line+5 ;!HARDCODE .ADDBAT: push de call READBAT ; прочитать 128 байт из файла в "work_buffer1" pop de + ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку + jp c,cmd_break.exit or a ; a=число прочит. байт jr nz,.BATLINE + ; ex de,hl ld de,struct_input_line+5 sbc hl,de - jr z,.exit; ;[x] убран баг с незакрытым BAT-файлом + jp z,cmd_break.exit; ;[x] убран баг с незакрытым BAT-файлом ld a,l ld (struct_input_line+4),a ; длина строки - PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break - call CMDMODE ; тест на bat-команды "rem","pause" + call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - POP HL ; [ ] 11/12/23 для баланса стека в cmd_break -.exit: ld a,(BAT_FM) ; дескр. bat-файла - ld c,Dss.Close ; закрыть файл - ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - RST ToDSS - xor a - ld (BAT_FM),a - ret + JP cmd_break.exit +; .exit: ld a,(BAT_FM) ; дескр. bat-файла +; ld c,Dss.Close ; закрыть файл +; ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat +; RST ToDSS +; xor a +; ld (BAT_FM),a +; ret ; .BATLINE: ld hl,work_buffer1 @@ -207,7 +205,7 @@ NEWLINE: sbc hl,de ld a,l ld (struct_input_line+4),a ; длина строки - call CMDMODE ; тест на bat-команды "rem","pause" + call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat ld de,struct_input_line+5 @@ -223,7 +221,12 @@ NEWLINE: ; de=куда ;------------------------------------------------- MOVWORD: -.count+1: ld a,0 ; (число прочит. байт из файла)/128 +.count+1: ld a,0 ; число прочит. байт из файла + ; [ ] 15/12/23 exit if 0 + OR A + SCF + RET Z + ; ld b,a .loop: ld a,(hl) ld (de),a @@ -243,6 +246,8 @@ MOVWORD: push de call READBAT ; прочитать 128 байт из файла pop de + ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку + RET C ;ld hl,BATBUFF ; 128 буфер (ccp.asm) "work_buffer1" ld hl,work_buffer1 ld b,a ; число прочит. байт @@ -262,13 +267,14 @@ READBAT: ld a,e ; [x] 28/09/23 JR NC,1F - XOR A + ;!TODO доделать тут нормальную проверку на облом с чтением файла, сохранять ошибку + LD A,0 ; сохраняем флаг CF ; -1: ld (MOVWORD.count),a ; (число прочит. байт из файла)/128 +1: ld (MOVWORD.count),a ; число прочит. байт из файла ret -; Тест на bat-команды "rem","pause" +; Тест на bat-команды ; должен соблюдаться баланс стека для cmd_break CMDMODE: ;xor a @@ -377,11 +383,11 @@ CMDMODE: .A8286: ex af,af' sub c ld c,a ; длина слова или строки ? - ld hl,BATLIST ; команды "pause","rem" + dos-команды + ld hl,BATLIST ; команды bat + dos-команды + ; ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - jp COMP005.start - + jp COMP.start ; должна убрать конц. пробелы и уст. длину строки, если урезалась EVALCMD: xor a diff --git a/SHELL/Commands/BREAK.ASM b/SHELL/Commands/BREAK.ASM index 3753220..147454d 100644 --- a/SHELL/Commands/BREAK.ASM +++ b/SHELL/Commands/BREAK.ASM @@ -1,8 +1,15 @@ ; [ ] 11/12/23 cmd_break: - pop hl ; восстановление баланса стека - pop hl ; восстановление баланса стека - XOR A - ld (MOVWORD.count),a + ; pop hl ; восстановление баланса стека + ; pop hl ; восстановление баланса стека + ; XOR A + ; ld (MOVWORD.count),a +.sp+1: LD SP,0 ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - JP NEWLINE.exit \ No newline at end of file +.exit: ld a,(BAT_FM) ; дескр. bat-файла + ld c,Dss.Close ; закрыть файл + RST ToDSS + xor a + ld (BAT_FM),a + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat + ret \ No newline at end of file diff --git a/SHELL/Commands/REM.ASM b/SHELL/Commands/REM.ASM index 5dbfaad..4e20788 100644 --- a/SHELL/Commands/REM.ASM +++ b/SHELL/Commands/REM.ASM @@ -3,5 +3,8 @@ ; REM. Комментарий (в bat-файле) ; ;/////////////////////////////////////////////////// -cmd_rem: ret +cmd_rem:; [ ] 15/12/23 может и не понадобится + AND A + ; + ret ; diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index eba849b..a51ebaa 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -14,13 +14,13 @@ COMP: call EVALCMD ; (batch.asm) inc hl ; struct_input_line+5 .loop: ld a,(hl) cp " " - jr nz,COMP01 + jr nz,.COMP01 inc hl dec c jr nz,.loop ret - ; -COMP01: ld d,h +.COMP01: + ld d,h ld e,l add hl,bc ld (hl),0 @@ -29,16 +29,17 @@ COMP01: ld d,h ex af,af' ld a," " cpir - jr nz,COMP005 + jr nz,.COMP005 inc c -COMP005: ex af,af' +.COMP005: + ex af,af' sub c ld c,a ld hl,CMDLIST ; список команд ДОС-а .start: call RUN_COMMAND jr nc,.skip ; NC если не найдена команда jp (hl) -.skip: ; Не дос-команды. Тест на зад`ание диска и запуск файла +.skip: ; Не дос-команды. Тест на задание диска и запуск файла ld h,d ld l,e ; hl=struct_input_line+5 @@ -54,11 +55,11 @@ COMP005: ex af,af' jr nz,RUN_EXT ; задан не диск ld a,b ; 1-й символ cp "a" - jr c,NOUP + jr c,.NOUP cp "z"+1 - jr nc,NOUP + jr nc,.NOUP and #5F ; a..z -> A..Z -NOUP: sub "A" ; номер диска +.NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; вывод сообщения diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 2a83c3f..7ad3fb7 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -117,25 +117,22 @@ shell: bit 6,a ; 6-й бит (вводились дополн. параметры) jr z,back_to_parent_process ; вводились дополн. параметры - PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break call CMDMODE ; (batch.asm) выполн. команду или запустить файл ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - POP HL ; [ ] 11/12/23 для баланса стека в cmd_break call Get_Path ; узнать и сохр. тек. диск и путь ; ; Вернуться в родит. процесс back_to_parent_process: ; [ ] 11/12/23 вложенные bat - LD B,0 - JR NC,1F + and a +.saveA: LD B,0 + JR NC,.exit LD B,A -1: ld c,Dss.Exit +.exit: ld c,Dss.Exit ;ld bc,0*256 + Dss.Exit ; JP ToDSS - ;ret - @@ -164,7 +161,7 @@ option_c: ;POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - jr back_to_parent_process ; вернуться в родит. процесс + jr back_to_parent_process.saveA ; вернуться в родит. процесс @@ -213,10 +210,10 @@ GET_CMD: ex de,hl ; hl=длина строки, de=строка add hl,de ; убрать концевые пробелы - dec hl +.loop1: dec hl ld a,(hl) cp " " - jr z,$-4 + jr z,.loop1 inc hl ld (hl),0 ; в конец ком-строки .NEXTPRM: diff --git a/SHELL/build.txt b/SHELL/build.txt index 53c7311..022e7e6 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -286 \ No newline at end of file +288 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 3bc92f2..066f9ee 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3bc92f2ea2e0080f243fdeda4e46db545e657ba1 +Subproject commit 066f9ee8b6aa8cc9d4ca5a03c8778fe5a075e304 From 2a6d817a9dfcc9925b19bb164ee51f6f59dd0d21 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 16 Dec 2023 04:22:49 +1000 Subject: [PATCH 073/219] ... --- DSS/API.asm | 3 + DSS/API/Read.asm | 199 ++++++++++ DSS/API/Write.asm | 208 ++++++++++ DSS/DOS_FM.ASM | 834 ---------------------------------------- DSS/DOS_Proc.asm | 3 +- DSS/FS/FAT/FAT.asm | 2 +- DSS/FS/FAT/FAT12_16.asm | 491 +++++++++++++++++++++-- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/build.txt | 2 +- 10 files changed, 868 insertions(+), 878 deletions(-) create mode 100644 DSS/API/Read.asm create mode 100644 DSS/API/Write.asm diff --git a/DSS/API.asm b/DSS/API.asm index b0c0c0d..4d4695e 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -55,6 +55,9 @@ include 'API/MkDir.asm' include 'API/RmDir.asm' include 'API/DosName.asm' + include 'API/Read.asm' + include 'API/Write.asm' + ;R09 ;Дубль - CHNDISK = OPENDSK diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm new file mode 100644 index 0000000..e5b1a00 --- /dev/null +++ b/DSS/API/Read.asm @@ -0,0 +1,199 @@ +; HL - ADDRESS +; DE - SIZE +; A - FM +READ: LD (.R_POINT),HL + LD (.S_POINT),HL + CALL SET_FM + RET C + CALL TSTSIZE + ; + LD A,D + OR E + JP Z,.NOREAD + ; + PUSH DE + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JP C,.ERR_1 + ;Расчёт смещения в секторах + ; LD C,(IY+_sFM.F_POSITION) + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD H,0 + ; OR A + ; RR L + ; RR D + ; RR E + LD H,0 + LD L,(IY+_sFM.F_POSITION+3) + LD D,(IY+_sFM.F_POSITION+2) + LD E,(IY+_sFM.F_POSITION+1) + LD A,E + AND #01 + LD B,A + LD C,(IY+_sFM.F_POSITION) + ;OR A + RR L + RR D + RR E + ;HL:DE FP (in sectors) + ;BC FP residue (in bytes) + ; + ;LD A,B + OR C + JP NZ,.ROV1 +.ROV4: POP BC + PUSH BC + SRL B + JR Z,.ROV2 + LD (.SECTORH),HL + LD (.SECTORL),DE +.R_POINT+2: LD IX,0 + CALL BLOK_RD + JP C,.ERR_1 + LD DE,(.R_POINT) +.PointerOnBuffer+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 + SRL C +.SECTORL+1: LD HL,0 // LD HL,(SECTORL) + ADD HL,BC + EX DE,HL +.SECTORH+1: LD HL,0 // LD HL,(SECTORH) + LD C,B + ADC HL,BC +.ROV2: POP BC + LD A,B + AND #01 + LD B,A + OR C + JP Z,.ROV6 + PUSH BC + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + JP C,.ERR_1 + LD HL,CORE_BUFFERS.BUFFER + LD DE,(.R_POINT) + POP BC + LDIR + 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 + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + POP DE +.NOREAD: +.COD+1: LD A,0 + OR A + RET +.ROV1: PUSH BC + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR_3 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + EXX + POP DE + LD HL,512 ;!HARDCODE + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.ROV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? +.ROV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + LDIR + LD (.R_POINT),DE + EXX + JP .ROV4 +.ERR_3: POP HL +.ERR_2: POP HL +.ERR_1: POP BC + SCF + RET + + + +TSTSIZE: + XOR A + LD (READ.COD),A + LD L,(IY+_sFM.F_POSITION) ;FP LOW + LD H,(IY+_sFM.F_POSITION+1) + ADD HL,DE + ; + EXX + ;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 + SBC HL,BC + EXX + 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 + EX DE,HL + SBC HL,DE ;VERY BIG + EX DE,HL + LD A,#FF + LD (READ.COD),A + RET \ No newline at end of file diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm new file mode 100644 index 0000000..c8eb8db --- /dev/null +++ b/DSS/API/Write.asm @@ -0,0 +1,208 @@ +WRITE.ERR3: + POP HL +WRITE.ERR2: + POP HL +WRITE.ERR1: + POP BC + SCF + RET +WRITE.RD_ONLY: + POP DE + LD A,DSS_Error.sys.READONLY + SCF + RET + +; HL - ADDRESS +; DE - SIZE +; A - FM +WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WR_FAT + CALL .Start + PUSH AF + LD A,(FatCache.Update) + OR A + CALL NZ,WR_FAT ; подкл. банку кеша FAT и записать его на диск + POP AF + RET + ; +.Start: LD (.R_POINT),HL + LD (.S_POINT),HL + PUSH DE + CALL SET_FM + JR C,.ERR1 + LD A,(IY+_sFM.ACCESS_MODE) + AND FAT_ATTR.READ_ONLY + JR NZ,.RD_ONLY + SET 7,(IY+_sFM.ACCESS_MODE) + SET 5,(IY+_sFM.ATTRIBUT) + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JR C,.ERR1 + ; + LD C,(IY+_sFM.F_POSITION) + LD A,(IY+_sFM.F_POSITION+1) + LD E,A + AND #01 + LD B,A + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD H,0 + OR A + RR L + RR D + RR E + ; HL:DE - FP (in sectors) + ; BC - FP residue (in bytes) + LD A,B + OR C + JP NZ,.WOV1 +.WOV4: POP BC + PUSH BC + SRL B + JR Z,.WOV2 + PUSH HL + PUSH DE + PUSH BC +.R_POINT+2: + LD IX,0 + CALL BLOK_WR + POP BC + JR C,.ERR3 + LD C,B + 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 + LD A,B + AND #01 + LD B,A + OR C + JR Z,.WOV6 + PUSH HL + PUSH DE + PUSH BC + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + LD DE,CORE_BUFFERS.BUFFER + LD HL,(.R_POINT) + POP BC + JP C,.ERR2 + LDIR + LD (.R_POINT),HL + POP DE + POP HL + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WR + POP BC + LD C,SLOT3 + OUT (C),B + RET C +.WOV6: LD HL,(.R_POINT) +.S_POINT+1: LD DE,0 + ; CF=0 + ;AND A + SBC HL,DE + PUSH HL + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + CALL MOVE_CP + POP DE + 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 + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + POP DE + POP HL + EXX + POP DE + JP C,.ERR1 + LD HL,512 ;!HARDCODE + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.WOV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +.WOV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + EX DE,HL + LDIR + LD (.R_POINT),HL + EXX + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WR + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR2 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + JP .WOV4 +; \ No newline at end of file diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e4a72e6..b6e4855 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -177,840 +177,6 @@ MOVE_CP: SBC HL,DE RET -;-------------------- -ECL2: - ;[x] SAVE CLUSTER AFTER READ ;!TEST - POP BC - ; - POP BC - POP DE - AND A - RET - -BLOKRD0 POP BC - POP DE - SCF - RET - -;READ SECTORS OF FILE -;HL:DE - FP (in sectors) -; B - Amount sectors -BLOK_RD: PUSH BC - LD (READ.MEM),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER - LD C,A - LD B,0 ;!FIXIT - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb - LD B,XH - LD C,XL - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) - LD A,H - OR L - ;[x] SAVE CLUSTER AFTER READ ;!TEST - ;JR NZ,BLOKRD2 - PUSH BC - JR NZ,.saveClustersOffset - ; - JP ECL2 ;R01 JR BLOKRD0 - -.saveClustersOffset: - ;[x] SAVE CLUSTER AFTER READ ;!TEST - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_H) - LD A,D - OR E - JR Z,BLOKRD2 - - PUSH DE - PUSH HL - PUSH BC - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_H) - LD A,D - OR E - JR Z,.noOptimization_1 - - POP HL - AND A - SBC HL,DE - JR C,.noOptimization_2 - - LD C,L - LD B,H - POP HL - POP DE - - - EX DE,HL - JP BLOKRD2 -.noOptimization_1: - POP BC -.noOptimization_2: - POP HL - POP DE - JP BLOKRD2 - ; -BLOKRD1: - PUSH BC - CALL R_F_FAT - POP BC - JR C,ECL2 ;R01 - EX DE,HL - DEC BC -BLOKRD2: - LD A,B ; ВС - смещение внутри файла в кластерах - OR C - JR NZ,BLOKRD1 - - ;[x] SAVE CLUSTER AFTER READ ;!TEST - LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_H),H - POP BC - LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_H),B - ; - - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) - SUB E - LD C,A ;\ - CP B ; \ - JR C,BLOKRD3 ;SIZE > RESIDUE CLUSTER ; \ - LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться -BLOKRD3 LD A,B ; / - SUB C ; / - LD B,A ;/ - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,BLOKRD4 - INC HL -BLOKRD4 LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JP C,BLOKRD0 - POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) -BLOKRD5 ADD HL,DE - DEC C - JR NZ,BLOKRD5 - LD (READ.MEM),HL - POP DE - LD A,B - OR A - RET Z -BLOKRD6 LD HL,CORE_BUFFERS.BootSector.S_P_C - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,BLOKRD7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -BLOKRD7 EX DE,HL - PUSH BC - CALL R_F_FAT - POP BC - JP C,ECL1 ;R01? - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JP C,BLOKRD0 - POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) -BLOKRD8 ADD HL,DE - DEC C - JR NZ,BLOKRD8 - LD (READ.MEM),HL - POP DE - JR BLOKRD6 - -ECL1 AND A - RET - -;----------------------------------------------------------------------- -BLOK_WR.Error: - POP BC - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - 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), IX - data in RAM -; B - Amount sectors -BLOK_WR: - PUSH BC - LD (READ.MEM),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER - LD C,A - LD B,0 - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - LD B,XH - LD C,XL - - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) - LD A,H - OR L - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - ;JR NZ,BLOKWR2 - PUSH BC - JR NZ,.saveClustersOffset - ; - PUSH BC - CALL G_CLUST - 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 - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? - ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск - ; - POP HL - POP BC - JP .WR2 - -.saveClustersOffset: - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_H) - LD A,D - OR E - JR Z,.WR2 - ; - PUSH DE - PUSH HL - PUSH BC - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_H) - LD A,D - OR E - JR Z,.noOptimization_1 - ; - POP HL - AND A - SBC HL,DE - JR C,.noOptimization_2 - ; - LD C,L - LD B,H - POP HL - POP DE - ; - EX DE,HL - JP .WR2 -.noOptimization_1: - POP BC -.noOptimization_2: - POP HL - POP DE - JP .WR2 - ; - -.loop: PUSH BC - CALL R_F_FAT - JR NC,.WRB - PUSH HL - CALL INC_FAT - POP HL - JR C,.Error - CALL R_F_FAT -.WRB: POP BC - EX DE,HL - DEC BC -.WR2: LD A,B - OR C - JR NZ,.loop - - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_H),H - POP BC - LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_H),B - ; - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) - SUB E - LD C,A - CP B - JR C,.WR3 ;SIZE > RESIDUE CLUSTER - LD C,B ;SIZE < CLUSTER -.WR3: LD A,B - SUB C - LD B,A - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,.WR4 - INC HL - ; 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 - ; -.big_loop: - LD HL,CORE_BUFFERS.BootSector.S_P_C - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,.WR7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -.WR7: EX DE,HL - PUSH BC - CALL R_F_FAT - JR NC,.WR9 - PUSH HL - CALL INC_FAT - POP HL - JR C,.ErrorFull - CALL R_F_FAT -.WR9: POP BC - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - ; 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 .big_loop - ; -.ErrorFull: - POP BC - LD A,DSS_Error.sys.DISK_FULL - SCF - RET - -TSTSIZE: - XOR A - LD (READ.COD),A - LD L,(IY+_sFM.F_POSITION) ;FP LOW - LD H,(IY+_sFM.F_POSITION+1) - ADD HL,DE - ; - EXX - ;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 - SBC HL,BC - EXX - 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 - EX DE,HL - SBC HL,DE ;VERY BIG - EX DE,HL - LD A,#FF - LD (READ.COD),A - RET - -; HL - ADDRESS -; DE - SIZE -; A - FM -;READ_FN: -; _mSavePath 1 -; HL - ADDRESS -; DE - SIZE -; A - FM -READ: LD (.R_POINT),HL - LD (.S_POINT),HL - CALL SET_FM - RET C - CALL TSTSIZE - ; - LD A,D - OR E - JP Z,.NOREAD - ; - PUSH DE - LD A,(IY+_sFM.DRIVE) - CALL OPENDSK - JP C,.ERR_1 - ;Расчёт смещения в секторах - ; LD C,(IY+_sFM.F_POSITION) - ; LD E,(IY+_sFM.F_POSITION+1) - ; LD A,E - ; AND #01 - ; LD B,A - ; LD D,(IY+_sFM.F_POSITION+2) - ; LD L,(IY+_sFM.F_POSITION+3) - ; LD H,0 - ; OR A - ; RR L - ; RR D - ; RR E - LD H,0 - LD L,(IY+_sFM.F_POSITION+3) - LD D,(IY+_sFM.F_POSITION+2) - LD E,(IY+_sFM.F_POSITION+1) - LD A,E - AND #01 - LD B,A - LD C,(IY+_sFM.F_POSITION) - ;OR A - RR L - RR D - RR E - ;HL:DE FP (in sectors) - ;BC FP residue (in bytes) - ; - ;LD A,B - OR C - JP NZ,.ROV1 -.ROV4: POP BC - PUSH BC - SRL B - JR Z,.ROV2 - LD (.SECTORH),HL - LD (.SECTORL),DE -.R_POINT+2: LD IX,0 - CALL BLOK_RD - JP C,.ERR_1 - 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 - SRL C -.SECTORL+1: LD HL,0 // LD HL,(SECTORL) - ADD HL,BC - EX DE,HL -.SECTORH+1: LD HL,0 // LD HL,(SECTORH) - LD C,B - ADC HL,BC -.ROV2: POP BC - LD A,B - AND #01 - LD B,A - OR C - JP Z,.ROV6 - PUSH BC - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_RD - POP BC - LD C,SLOT3 - OUT (C),B - JP C,.ERR_1 - LD HL,CORE_BUFFERS.BUFFER - LD DE,(.R_POINT) - POP BC - LDIR - 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 - EX DE,HL - LD XH,D - LD XL,E - LD HL,0 - CALL MOVE_FP.F_current - POP DE -.NOREAD: -.COD+1: LD A,0 - OR A - RET -.ROV1: PUSH BC - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_RD - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,.ERR_3 - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - EXX - POP DE - LD HL,512 ;!HARDCODE - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.ROV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? -.ROV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - LDIR - LD (.R_POINT),DE - EXX - JP .ROV4 -.ERR_3: POP HL -.ERR_2: POP HL -.ERR_1: POP BC - SCF - RET - -PWERR3: POP HL -PWERR2: POP HL -PWERR1: POP BC - SCF - RET - -RD_ONLY: POP DE - LD A,DSS_Error.sys.READONLY - SCF - RET - -; HL - ADDRESS -; DE - SIZE -; A - FM -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 - JR C,PWERR1 - LD A,(IY+_sFM.ACCESS_MODE) - AND FAT_ATTR.READ_ONLY - JR NZ,RD_ONLY - SET 7,(IY+_sFM.ACCESS_MODE) - SET 5,(IY+_sFM.ATTRIBUT) - LD A,(IY+_sFM.DRIVE) - CALL OPENDSK - JR C,PWERR1 - ; - LD C,(IY+_sFM.F_POSITION) - LD A,(IY+_sFM.F_POSITION+1) - LD E,A - AND #01 - LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A - RR L - RR D - RR E - ; HL:DE - FP (in sectors) - ; BC - FP residue (in bytes) - LD A,B - OR C - JP NZ,.WOV1 -.WOV4: POP BC - PUSH BC - SRL B - JR Z,.WOV2 - PUSH HL - PUSH DE - PUSH BC -.R_POINT+2: - LD IX,0 - CALL BLOK_WR - POP BC - JR C,PWERR3 - LD C,B - 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 - LD A,B - AND #01 - LD B,A - OR C - JR Z,.WOV6 - PUSH HL - PUSH DE - PUSH BC - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_RD - POP BC - LD C,SLOT3 - OUT (C),B - LD DE,CORE_BUFFERS.BUFFER - LD HL,(.R_POINT) - POP BC - JP C,PWERR2 - LDIR - LD (.R_POINT),HL - POP DE - POP HL - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_WR - POP BC - LD C,SLOT3 - OUT (C),B - RET C -.WOV6: LD HL,(.R_POINT) -.S_POINT+1: LD DE,0 - ; CF=0 - ;AND A - SBC HL,DE - PUSH HL - EX DE,HL - LD XH,D - LD XL,E - LD HL,0 - CALL MOVE_FP.F_current - CALL MOVE_CP - POP DE - 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 - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_RD - POP BC - LD C,SLOT3 - OUT (C),B - POP DE - POP HL - EXX - POP DE - JP C,PWERR1 - LD HL,512 ;!HARDCODE - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.WOV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 -.WOV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - EX DE,HL - LDIR - LD (.R_POINT),HL - EXX - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_WR - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,PWERR2 - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - JP .WOV4 - -////////////// OLD //////////////// -; HL - CLUSTER -; HL:IX - SECTOR -; NSECTOR: DEC HL -; DEC HL -; EX DE,HL -; LD A,(CORE_BUFFERS.BootSector.S_P_C) -; LD B,A -; LD HL,0 -; LD IX,0 -; ADD_DE1: ADD IX,DE -; JR NC,ADD_DE2 -; INC HL -; ADD_DE2: DJNZ ADD_DE1 -; LD DE,(FatBuffer.DAT_FRM) ;first data sector -; ADD IX,DE -; LD DE,#0000 -; ADC HL,DE -; RET -////////////// NEW ////////////////// -; in: HL - CLUSTER -; out: HL:IX - SECTOR -NSECTOR: - LD DE,0 - DEC HL - DEC HL - LD A,(CORE_BUFFERS.BootSector.S_P_C) - 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.DAT_FRM) ;first data sector - XOR A - ADD IX,DE - LD D,A - LD E,A - ADC HL,DE - ;!TODO а надо ли проверять переполнение HL:IX? - RET -///////////////////////////////////// - ; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A DIV_for_SPC: diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index c3040f3..07c1f41 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -196,8 +196,7 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; ; IN: A - drive number ; -OPENDSK: - ;!TEST DRV.Open обход R10 +OPENDSK:;!TEST DRV.Open обход R10 LD C,A LD A,(FatBuffer.DRIVE) CP C diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index d757d91..378fe4d 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -485,7 +485,7 @@ SAVEDIR: ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; !FIXIT чёт не используется IF COMPILE_UNUSED_CODE -TESTDSK: +TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.MediaCheck RST ToDSS.DRV diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index a8b3a82..1ce58f4 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -33,7 +33,8 @@ G_CLUST: RET ; HL - CLUSTER -INC_FAT PUSH HL +INC_FAT: + PUSH HL CALL G_CLUST POP DE RET C @@ -53,7 +54,7 @@ INC_FAT PUSH HL POP HL LD DE,(FatBuffer.ENDCLUS) ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WR_FAT? ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск ; AND A @@ -281,7 +282,7 @@ W_T_F12: ;!FIXIT CALL GET_FAT12_CELL POP DE - JP C,W_T_F01 ; номер нечётный + JR C,W_T_F01 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -299,16 +300,23 @@ W_T_F12: ;!FIXIT RET ; W_T_F01:; влево на 4 битa - SLA E - LD A,E - RL D - RLA - RL D - RLA - RL D - RLA - RL D - LD E,A + ;SLA E + ;LD A,E + ;RL D + ;RLA + ;RL D + ;RLA + ;RL D + ;RLA + ;RL D + ;LD E,A + ; + ex de,hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl + ex de,hl ; LD A,(HL) AND #0F @@ -390,7 +398,7 @@ WR_FAT: SET_PAGE_X FATPAGE LD HL,FAT_CACHE.Sectors ; CF = 0 SBC HL,DE - JP C,.ERR + JR C,.ERR LD A,L .WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? LD H,B @@ -473,33 +481,33 @@ GET_FAT12_CELL: 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 - ; + ;!FIXIT оптимизировать + LD A,H + LD B,H + + ; + AND #1F + ;AND FAT_CACHE.Size_Mask_16 + ; - LD H,A - LD A,B + 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-а + ; + 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 @@ -508,6 +516,392 @@ GET_FAT12_CELL: RET +; in: HL - CLUSTER +; out: HL:IX - SECTOR +NSECTOR: + LD DE,0 + DEC HL + DEC HL + LD A,(CORE_BUFFERS.BootSector.S_P_C) + 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.DAT_FRM) ;first data sector + XOR A + ADD IX,DE + LD D,A + LD E,A + ADC HL,DE + ;!TODO а надо ли проверять переполнение HL:IX? + RET + +//////////////////////////////////////////////////////////////////////// +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + MACRO _GetSavedCluster exit_to + LD E,(IY+_sFM.KnownCluster_L) + LD D,(IY+_sFM.KnownCluster_H) + LD A,D + OR E + JR Z,exit_to + ; + PUSH DE + PUSH HL + PUSH BC + LD E,(IY+_sFM.KnownOffset_L) + LD D,(IY+_sFM.KnownOffset_H) + LD A,D + OR E + JR Z,.noOptimization_1 + ; + POP HL + AND A + SBC HL,DE + JR C,.noOptimization_2 + ; + LD C,L + LD B,H + POP HL + POP DE + ; + EX DE,HL + JP exit_to +.noOptimization_1: + POP BC +.noOptimization_2: + POP HL + POP DE + JP exit_to + ENDM +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + MACRO _SaveGetedCluster + LD (IY+_sFM.KnownCluster_L),L + LD (IY+_sFM.KnownCluster_H),H + POP BC + LD (IY+_sFM.KnownOffset_L),C + LD (IY+_sFM.KnownOffset_H),B + ENDM +;; + +BLOK_RD.ECL2: + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP BC + ; + POP BC + POP DE + AND A + RET + ; +;READ SECTORS OF FILE +;HL:DE - FP (in sectors) +; B - Amount sectors +BLOK_RD: PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD C,A + LD B,0 ;!FIXIT + ;HL:DE / BC => DE:IX HL-OSTATOK + CALL DIV_for_SPC + ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb + LD B,XH + LD C,XL + PUSH HL ;RESIDUE + LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER + LD H,(IY+_sFM.ST_CLUSTER+1) + LD A,H + OR L + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + ;JR NZ,BLOKRD2 + PUSH BC + JR Z,.ECL2 + ;JP ECL2 ;R01 JR BLOKRD0 + _GetSavedCluster .enter_loop1 + ; +.loop1: PUSH BC + CALL R_F_FAT + POP BC + JR C,.ECL2 ;R01 + EX DE,HL + DEC BC +.enter_loop1: + LD A,B ; ВС - смещение внутри файла в кластерах + OR C + JR NZ,.loop1 + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + _SaveGetedCluster + ; + POP DE + POP BC + LD A,(CORE_BUFFERS.BootSector.S_P_C) + SUB E + LD C,A ;\ + CP B ; \ + JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ + LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться +.skip1: LD A,B ; / + SUB C ; / + LD B,A ;/ + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.skip2 + INC HL +.skip2: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) + ;!TEST + LD A,B + LD B,C +.loop2: ADD HL,DE + ;DEC C + ;JR NZ,.loop2 + DJNZ .loop2 + LD (READ.PointerOnBuffer),HL + POP DE + ;LD A,B + OR A + RET Z + LD B,A + ; +.loop4: LD HL,CORE_BUFFERS.BootSector.S_P_C + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.BLOKRD7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +.BLOKRD7: + EX DE,HL + PUSH BC + CALL R_F_FAT + POP BC + JR C,.ECL1 ;R01? + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + JP .loop4 + ; +.Error: POP BC + POP DE + ;SCF + RET + ; +.ECL1: AND A + RET + +;----------------------------------------------------------------------- +; BLOK_WR.Error: +; POP BC +; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; 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), IX - data in RAM +; B - Amount sectors +BLOK_WR: + PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD C,A + LD B,0 + ;HL:DE / BC => DE:IX HL-OSTATOK + CALL DIV_for_SPC + LD B,XH + LD C,XL + + PUSH HL ;RESIDUE + LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER + LD H,(IY+_sFM.ST_CLUSTER+1) + LD A,H + OR L + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + ;JR NZ,BLOKWR2 + PUSH BC + JR NZ,.GetSavedCluster + ; + PUSH BC + CALL G_CLUST + JP 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 + ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? + ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ; + POP HL + POP BC + JP .WR2 + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.GetSavedCluster: + _GetSavedCluster .WR2 + ; +.loop: PUSH BC + CALL R_F_FAT + JR NC,.WRB + PUSH HL + CALL INC_FAT + POP HL + JP C,.Error + CALL R_F_FAT +.WRB: POP BC + EX DE,HL + DEC BC +.WR2: LD A,B + OR C + JR NZ,.loop + + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + _SaveGetedCluster + ; + POP DE + POP BC + LD A,(CORE_BUFFERS.BootSector.S_P_C) + SUB E + LD C,A + CP B + JR C,.WR3 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +.WR3: LD A,B + SUB C + LD B,A + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.WR4 + INC HL + ; DOUBLE 1 +.WR4: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JR C,.ErrorWrite + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) + ; +.loop2: ADD HL,DE + DEC C + JR NZ,.loop2 + ; + LD (READ.PointerOnBuffer),HL + POP DE + ; + LD A,B + OR A + RET Z + ; +.big_loop: + LD HL,CORE_BUFFERS.BootSector.S_P_C + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.WR7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +.WR7: EX DE,HL + PUSH BC + CALL R_F_FAT + JR NC,.WR9 + PUSH HL + CALL INC_FAT + POP HL + JR C,.ErrorFull + CALL R_F_FAT +.WR9: POP BC + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + ; DOUBLE 1 + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JR C,.ErrorWrite + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + ; + JP .big_loop + ; +.Error: POP BC + POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.ErrorWrite: + POP BC + POP DE + LD A,DSS_Error.sys.WRITE_ERROR + ;SCF + RET + ; +.ErrorFull: + POP BC + LD A,DSS_Error.sys.DISK_FULL + ;SCF + RET +//////////////////////////////////////////////////////////////////////// + + FatCache: WORD #0000 .Block EQU FatCache .Update EQU FatCache+1 @@ -629,4 +1023,25 @@ FAT_Max_Cluster: WORD #0FF0 ; ; LD C,6 ; RST #18 ; RET + + +////////////// OLD //////////////// +; HL - CLUSTER +; HL:IX - SECTOR +; NSECTOR: DEC HL +; DEC HL +; EX DE,HL +; LD A,(CORE_BUFFERS.BootSector.S_P_C) +; LD B,A +; LD HL,0 +; LD IX,0 +; ADD_DE1: ADD IX,DE +; JR NC,ADD_DE2 +; INC HL +; ADD_DE2: DJNZ ADD_DE1 +; LD DE,(FatBuffer.DAT_FRM) ;first data sector +; ADD IX,DE +; LD DE,#0000 +; ADC HL,DE +; RET //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index c04091d..4c88dcf 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -790 \ No newline at end of file +805 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 0611879..1590968 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 #1000 +.Size EQU #2000 .Sector_Size EQU #200 .Sectors EQU .Size / .Sector_Size ; for FAT16 diff --git a/SHELL/build.txt b/SHELL/build.txt index 022e7e6..2d82846 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -288 \ No newline at end of file +289 \ No newline at end of file From c0f126a95cb39f52b478025b03058373e2b44fe1 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 16 Dec 2023 04:33:15 +1000 Subject: [PATCH 074/219] ... --- DSS/API.asm | 3 + DSS/{ENVIRON.ASM => API/Environ.asm} | 0 DSS/DOS_FM.ASM | 145 +------------------------- DSS/DSS-MAIN.ASM | 1 - DSS/FS/FAT/FAT12_16.asm | 7 +- DSS/Procedures.asm | 146 +++++++++++++++++++++++++++ DSS/build.txt | 2 +- 7 files changed, 155 insertions(+), 149 deletions(-) rename DSS/{ENVIRON.ASM => API/Environ.asm} (100%) diff --git a/DSS/API.asm b/DSS/API.asm index 4d4695e..e30b22f 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -57,6 +57,9 @@ include 'API/DosName.asm' include 'API/Read.asm' include 'API/Write.asm' + include 'API/Environ.ASM' + + ;R09 diff --git a/DSS/ENVIRON.ASM b/DSS/API/Environ.asm similarity index 100% rename from DSS/ENVIRON.ASM rename to DSS/API/Environ.asm diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index b6e4855..82d57b4 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -6,7 +6,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R01 16-11-1999 DNS ERROR READING FAT CHAIN +; ;--------------------------------------------------------------- ;FMS DB FMCOUNT @@ -176,147 +176,4 @@ MOVE_CP: LD D,(IY+_sFM.F_POSITION+3) SBC HL,DE RET - - -; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A -DIV_for_SPC: - LD A,C - 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 XH,D - LD XL,E - EX DE,HL - LD H,0 - LD L,A - RET -; DIV32: LD A,#FF -; LD B,E -; .loop: SRL C -; JR C,.exitLoop -; SRL H : RR L : RR D : RR E : SLA A -; JP .loop -; .exitLoop: -; CPL -; AND B -; LD XH,D -; LD XL,E -; EX DE,HL -; LD H,0 -; LD L,A -; RET -/* - DEFINE NEW_DIV 1 - -DIV32: LD XH,D - LD XL,E - - IFN NEW_DIV - EX DE,HL - LD HL,0 - LD A,#20 -DIV001: ADD IX,IX - EX DE,HL - ADC HL,HL - EX DE,HL - ADC HL,HL - SBC HL,BC - JR NC,DIV002 - ADD HL,BC - DEC A - JR NZ,DIV001 - RET -DIV002: INC IX - DEC A - JR NZ,DIV001 - RET - ELSE - - -div32_16: -;HLIX/BC -> HLIX remainder DE -;174+4*div32_16_sub8 -;min: 2186cc -;max: 2794cc -;avg: 2466cc -;61 bytes - ex de,hl ; 4 - -; Negate BC to allow add instead of sbc - xor a ; 4 -; Need to set HL to 0 anyways, so save 2cc and a byte - ld h,a ; 4 - ld l,a ; 4 - sub c ; 4 - ld c,a ; 4 - sbc a,a ; 4 - sub b ; 4 - ld b,a ; 4 - - - ld a,d ; 4 - call div32_16_sub8 ; 17 - rla ; 4 - ld d,a ; 4 - - ld a,e ; 4 - call div32_16_sub8 ; 17 - rla ; 4 - ld e,a ; 4 - - ld a,ixh ; 8 - call div32_16_sub8 ; 17 - rla ; 4 - ld ixh,a ; 8 - - ld a,ixl ; 8 - call div32_16_sub8 ; 17 - rla ; 4 - ld ixl,a ; 8 - - ;ex de,hl ; 4 - ret ; 10 - -div32_16_sub8: -;119+8*div32_16_sub -;min: 503cc -;max: 655cc -;avg: 573cc - call 1F -1: -;17+2(17+2(div32_16_sub))) - call 1F -1: -;17+2(div32_16_sub) - call div32_16_sub -div32_16_sub: -;48+{8,0+{0,19}} -;min: 48cc -;max: 67cc -;avg: 56.75cc - rla ; 4 - adc hl,hl ; 15 - jr c,1F ;12/7 - add hl,bc ; 11 - ret c ;11/5 - sbc hl,bc ; 15 - ret ; 10 -1: - add hl,bc ; 11 - scf ; 4 - ret ; 10 - - ENDIF -*/ ; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 4a92460..896d862 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -443,7 +443,6 @@ ADRST10: ;DS 512 ;,0 INCLUDE "DOS_FM.ASM" INCLUDE "EXECUTE.ASM" - INCLUDE "ENVIRON.ASM" INCLUDE "INTMOUSE.ASM" INCLUDE "Procedures.asm" diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 1ce58f4..2541602 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -9,6 +9,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;RY01 16-11-1999 DNS ERROR READING FAT CHAIN ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- @@ -624,13 +625,13 @@ BLOK_RD: PUSH BC ;JR NZ,BLOKRD2 PUSH BC JR Z,.ECL2 - ;JP ECL2 ;R01 JR BLOKRD0 + ;JP ECL2 ;RY01 JR BLOKRD0 _GetSavedCluster .enter_loop1 ; .loop1: PUSH BC CALL R_F_FAT POP BC - JR C,.ECL2 ;R01 + JR C,.ECL2 ;RY01 EX DE,HL DEC BC .enter_loop1: @@ -698,7 +699,7 @@ BLOK_RD: PUSH BC PUSH BC CALL R_F_FAT POP BC - JR C,.ECL1 ;R01? + JR C,.ECL1 ;RY01 EX DE,HL PUSH HL PUSH BC diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index dc14eb1..0760807 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -188,4 +188,150 @@ HEX2BCD: OR B RET ;----------------------------------------------------------------------; +; + +; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A +;----------------------------------------------------------------------; +DIV_for_SPC: + LD A,C + 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 XH,D + LD XL,E + EX DE,HL + LD H,0 + LD L,A + RET +;----------------------------------------------------------------------; + +; DIV32: LD A,#FF +; LD B,E +; .loop: SRL C +; JR C,.exitLoop +; SRL H : RR L : RR D : RR E : SLA A +; JP .loop +; .exitLoop: +; CPL +; AND B +; LD XH,D +; LD XL,E +; EX DE,HL +; LD H,0 +; LD L,A +; RET +/* + DEFINE NEW_DIV 1 + +DIV32: LD XH,D + LD XL,E + + IFN NEW_DIV + EX DE,HL + LD HL,0 + LD A,#20 +DIV001: ADD IX,IX + EX DE,HL + ADC HL,HL + EX DE,HL + ADC HL,HL + SBC HL,BC + JR NC,DIV002 + ADD HL,BC + DEC A + JR NZ,DIV001 + RET +DIV002: INC IX + DEC A + JR NZ,DIV001 + RET + ELSE + + +div32_16: +;HLIX/BC -> HLIX remainder DE +;174+4*div32_16_sub8 +;min: 2186cc +;max: 2794cc +;avg: 2466cc +;61 bytes + ex de,hl ; 4 + +; Negate BC to allow add instead of sbc + xor a ; 4 +; Need to set HL to 0 anyways, so save 2cc and a byte + ld h,a ; 4 + ld l,a ; 4 + sub c ; 4 + ld c,a ; 4 + sbc a,a ; 4 + sub b ; 4 + ld b,a ; 4 + + + ld a,d ; 4 + call div32_16_sub8 ; 17 + rla ; 4 + ld d,a ; 4 + + ld a,e ; 4 + call div32_16_sub8 ; 17 + rla ; 4 + ld e,a ; 4 + + ld a,ixh ; 8 + call div32_16_sub8 ; 17 + rla ; 4 + ld ixh,a ; 8 + + ld a,ixl ; 8 + call div32_16_sub8 ; 17 + rla ; 4 + ld ixl,a ; 8 + + ;ex de,hl ; 4 + ret ; 10 + +div32_16_sub8: +;119+8*div32_16_sub +;min: 503cc +;max: 655cc +;avg: 573cc + call 1F +1: +;17+2(17+2(div32_16_sub))) + call 1F +1: +;17+2(div32_16_sub) + call div32_16_sub +div32_16_sub: +;48+{8,0+{0,19}} +;min: 48cc +;max: 67cc +;avg: 56.75cc + rla ; 4 + adc hl,hl ; 15 + jr c,1F ;12/7 + add hl,bc ; 11 + ret c ;11/5 + sbc hl,bc ; 15 + ret ; 10 +1: + add hl,bc ; 11 + scf ; 4 + ret ; 10 + + ENDIF +*/ ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 4c88dcf..7a4ca1f 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -805 \ No newline at end of file +806 \ No newline at end of file From f58a3d681b99c11aadfae5a26f5078d71e2c6f29 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 17 Dec 2023 02:00:52 +1000 Subject: [PATCH 075/219] =?UTF-8?q?[x]=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=81=20=D0=BD=D0=B5=D0=B8=D0=B7=D0=B2=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BD=D1=8B=D0=BC=D0=B8=20=D0=A4=D0=A1,=20=D0=BE=D0=BF=D1=82?= =?UTF-8?q?=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=B5?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/diskINF.asm | 10 ++------- DSS/DSS-MAIN.ASM | 8 ++++---- DSS/Media_drivers/ide-drv.asm | 38 ++++++++++++++++++++--------------- DSS/build.txt | 2 +- Shared_Includes | 2 +- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 0f33db5..305c78e 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -35,12 +35,6 @@ LD (DE),A INC DE LDIR -; .loop: -; LD (HL),A -; INC DE -; INC HL -; LD A,(DE) -; DJNZ .loop ENDM ; DISKINF:; [ ] 22/11/23 подфункция с доп.инфой @@ -132,8 +126,8 @@ DISKINF:; [ ] 22/11/23 LD A,E OR D - JR NZ,.SKIC + JR NZ,.skip INC BC -.SKIC: INC HL +.skip: INC HL JP .FRESP ; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 896d862..4b18527 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -467,14 +467,14 @@ CurrentPath: DB 'X' CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце - +; IF SAVE_PATH_CODE -WorkDirectory: DB '\' +WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце ELSE -WorkDirectory EQU CurrentDirectory -.DEPTH EQU CurrentDirectory.DEPTH +WorkDirectory EQU CurrentDirectory +.DEPTH EQU CurrentDirectory.DEPTH ENDIF ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index b42a3cc..fac1df9 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -560,22 +560,27 @@ NXTPART: ; NOEXTDS: - CP #0F - JR Z,SUBLEV - CP #0E + CP PartitionSysTypes.FAT16 JR Z,HIGHDOS - CP 6 + CP PartitionSysTypes.FAT16_LBA JR Z,HIGHDOS - CP 4 + CP PartitionSysTypes.FAT16_32M JR Z,MEDIDOS - CP 1 + CP PartitionSysTypes.FAT12 JR Z,EASYDOS - POP BC - OR A - RET Z -NODEFIN: - SCF - RET + CP PartitionSysTypes.Win_Ext_LBA + JR Z,SUBLEV + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта + OR A ;PartitionSysTypes.Empty + JR NZ,NXTPART + POP BC ; баланс стека + RET + ;POP BC + ;OR A + ;RET Z +;NODEFIN: + ;SCF + ;RET ; @@ -597,20 +602,21 @@ PARTIT2: LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC - ;!TEST - ;RET C ; for absent drive ; LD HL,(PART+510) ;!HARDCODE Signature word LD DE,#AA55 AND A SBC HL,DE - JR NZ,NODEFIN + ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + ;JR NZ,NODEFIN + SCF + RET NZ ; LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR LD B,4 ;!HARDCODE MBR: Number of entries in the partition table DOSAGA: PUSH BC LD A,(IY+4) - CP 5 + CP PartitionSysTypes.Extended JR NZ,NOEXTDS SUBLEV: PUSH IY LD DE,(CURSECL) diff --git a/DSS/build.txt b/DSS/build.txt index 7a4ca1f..773855c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -806 \ No newline at end of file +810 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 066f9ee..b9ca4f4 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 066f9ee8b6aa8cc9d4ca5a03c8778fe5a075e304 +Subproject commit b9ca4f484d074cc80c221ad37a2a40e7ee670a16 From 22efbb84c752c0db3d6ab979ec48681b4bdf86bc Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 18 Dec 2023 04:14:12 +1000 Subject: [PATCH 076/219] =?UTF-8?q?+=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D0=BA=D0=B0=20=D1=81=20=D0=BB=D1=8E=D0=B1=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20Primary=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 55 +++++++++----- BOOT/boot.asm | 111 ++++++++++++++++++++++------- DSS/API/bootDsk.asm | 19 ++++- DSS/DRV-MAIN.ASM | 16 +++-- DSS/DSS-MAIN.ASM | 16 +++-- DSS/INTMOUSE.ASM | 9 ++- DSS/Media_drivers/ReScanDRV.ASM | 28 +++++--- DSS/Media_drivers/fdd-drv.asm | 4 +- DSS/Media_drivers/ide-drv.asm | 96 +++++++++++++++++-------- DSS/Media_drivers/ram_disk-drv.asm | 2 + DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 11 ++- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 14 files changed, 268 insertions(+), 105 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 88062d5..a647bdf 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -35,12 +35,12 @@ DRIVE: _mSYSID BIT 7,A JR Z,GOOD_DRIVE EX DE,HL - LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка + LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка SBC HL,DE LD A,INCORR JR C,FAIL GOOD_DRIVE: - LD DE,#8200 + LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 LD BC,2*256 + BIOS.DRV_READ @@ -174,8 +174,11 @@ CONTINUE: ;DOS LOADED IF UNIVERSAL_BOOT - - LD A,(DRIVE) + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,(DRIVE+1) ; номер раздела + LD L,A + ; + LD A,(DRIVE) ; номер устройства LD C,Dss.Version RST ToDSS jp c,XFAIL.fail @@ -187,7 +190,8 @@ CONTINUE: LD BC,Dss.BootDSK.Set RST ToDSS - LD B,high Dss.BootDSK.Get + ;LD B,high Dss.BootDSK.Get + LD BC,Dss.BootDSK.Get ELSE IF ORIGINAL_DSS @@ -198,6 +202,7 @@ CONTINUE: LD C,Dss.Version RST ToDSS jp c,XFAIL.fail + LD C,Dss.BootDSK ENDIF LD A,STARTDO @@ -208,15 +213,17 @@ CONTINUE: LD BC,Dss.BootDSK.Set RST ToDSS - LD B,high Dss.BootDSK.Get + ;LD B,high Dss.BootDSK.Get + LD BС,Dss.BootDSK.Get ENDIF ENDIF - LD C,Dss.BootDSK + ;LD C,Dss.BootDSK RST ToDSS ADD A,"A" + LD HL,ROOT LD (HL),A LD C,Dss.ChDir @@ -250,23 +257,31 @@ PART_TB: PUSH BC SBC HL,DE JR NZ,ERRP LD IX,BOOT+#01BE - LD B,4 + LD B,4 ;!HARDCODE счетчик записей партиций в MBR DOSAGA: LD A,(IX+4) - CP #0E + CP PartitionSysTypes.FAT16_LBA JR Z,YEPDOS - CP 6 + CP PartitionSysTypes.FAT16 JR Z,YEPDOS - CP 4 + CP PartitionSysTypes.FAT16_32Mb JR Z,YEPDOS - CP 1 + CP PartitionSysTypes.FAT12 JR Z,YEPDOS - LD DE,#10 +.next: LD DE,#10 ADD IX,DE DJNZ DOSAGA ERRP: LD A,ERRPART JP FAIL -YEPDOS: LD E,(IX+08) +YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,#80 + CP (IX+0) + JR NZ,DOSAGA.next + LD A,4 ;!HARDCODE счетчик записей партиций в MBR + SUB B + PUSH AF ; номер загрузочного раздела + ; + LD E,(IX+08) LD D,(IX+09) LD L,(IX+10) LD H,(IX+11) @@ -278,8 +293,13 @@ YEPDOS: LD E,(IX+08) LD DE,BOOT LD BC,1*256 + BIOS.DRV_READ RST ToBIOS_18 - POP BC - LD A,C + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + POP AF + POP BC + LD L,A ; номер загрузочного раздела + LD A,C + ;LD A,C + ; RET SET_PRM: PUSH BC @@ -311,6 +331,9 @@ GET_BPB: LD IX,#0000 JR NZ,NX1 CALL PART_TB ;HDD RET C + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD (DRIVE+1),HL + ; NX1: CP #00 JR NZ,NX2 CALL SET_PRM ;FDD diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 761617c..ef2ace2 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -64,16 +64,24 @@ BEGIN: in a,(SLOT3) ld c,Dss.Version ; узнать версию ДОС RST ToDSS ex de,hl ; hl=тек. версия - ld de,#013C ; 1.60 d=версия, e=модификация, bc - номер сборки. de = #013E, bc = #0064 dos ver 1.62.100 + ld de,#0146 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 and a sbc hl,de - jr nc,version_ok - pop hl - ld a,11 ; индекс строки "Error: Need DSS version 1.60..." + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;jr nc,version_ok + jr z,.check_build ; если номер версии 1.70 + jr nc,version_ok ; если номер версии больше 1.70 + ; +.old_ver: pop hl + ld a,11 ; индекс строки "Error: Need DSS version 1.70..." call print_string ld a,-1 jp exit - + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого +.check_build: ld hl,810 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 + sbc hl,bc + jr nc,BEGIN.old_ver + ; version_ok: xor a ; индекс строки титла call print_string pop hl ; ком-строка @@ -82,7 +90,7 @@ version_ok: xor a ; jp c,help ; нет параметров ld (disk),a ; заданный номер диска ; узнать номер boot-диска системы - ld bc,0009h + ld bc,Dss.BootDSK.Get RST ToDSS ld (boot_disk),a ; диск (A=0,B=1,..) ; проверить на совпадение дисков @@ -258,16 +266,16 @@ write_boot_loader: rst 18h ret c ; ошибка чтения ld a,(buffer+21) ; байт формата - cp 0F0h ; 1.44Mb + cp #F0 ; 1.44Mb ret c ; незнакомый формат jr z,write_to_floppy - cp 0F9h ; 720kB + cp #F9 ; 720kB jr z,write_to_floppy - cp 0FAh ; RAM disk + cp #FA ; RAM disk jr z,write_to_ram_disk ; pop hl ; восст. баланс стека ; call close_device - cp 0F8h ; винт + cp #F8 ; винт jr z,write_to_hard_disk scf ; незнакомый формат ret @@ -329,22 +337,77 @@ overwrite_floppy: ; вход: нет ; выход: CF-ошибка записи ;------------------------------------------------- - write_to_ram_disk: -write_to_hard_disk: - ld a,(disk) ; номер заданного диска +write_to_: ld a,(disk) ; номер заданного диска ld de,#55AA ld bc,0 * 256 + 8 rst #18 ex af,af' - + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ld b,a + inc c + scf + ret z ; !TODO загрузка с расширенного раздела не поддерживается + dec c + push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + ; ld hl,0 ; ст. разряд лог. сектора ld ix,1 ; мл. разряд ld de,code_loader ; откуда (код загрузчика) ld bc,3*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) - rst 08h + rst ToBIOS + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + pop bc + ; ret - +write_to_hard_disk: + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + CALL write_to_ + RET C + ; + PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + LD A,B + LD HL,0 + LD IX,0 + LD DE,buffer + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + ; check signature + LD HL,(buffer+510) ;!HARDCODE Signature word + LD DE,#AA55 + AND A + SBC HL,DE + POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + SCF + RET NZ + PUSH BC + ; set active in buffer + INC C + LD HL,buffer + #01BE + #30 ;!HARDCODE MBR: Offset of last record of partition table in the MBR + LD DE,#10 ; размер одной записи MBR + LD B,4 ;!HARDCODE MBR: Number of entries in the partition table +.loop: XOR A + LD (HL),A + ; + LD A,C + CP B + JR NZ,.next + ; + LD A,#80 + LD (HL),A + ; +.next: AND A + SBC HL,DE + DJNZ .loop + ; save buffer to disk + POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + ld a,b + ld hl,0 ; ст. разряд лог. сектора + ld ix,0 ; мл. разряд + ld de,buffer ; откуда (код загрузчика) + ld bc,1*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) + JP ToBIOS + ; ;------------------------------------------------- ; Выделить заданный диск из ком-строки ; @@ -467,14 +530,14 @@ lett2: db "X:",0Dh,0Ah lett3: db "X:",0Dh,0Ah db "and strike any key when ready ...",0Dh,0Ah,0Ah,0 ; - db "Can't install boot on this disk",0Dh,0Ah,0Ah,0 ;7 - db "Invalid drive specification",0Dh,0Ah,0Ah,0 ;8 - db " Error: Can't open file",0Dh,0Ah,0Ah,0 ;9 - db " Error: Can't allocate memory",0Dh,0Ah,0Ah,0 ;10 - db " Error: Need DOS version 1.60 or higher",0Dh,0Ah,0Ah,0;11 - db " Error: Reading error",0Dh,0Ah,0Ah,0 ;12 - db " Error: Can't create file",0Dh,0Ah,0Ah,0 ;13 - db " Error: Writing error",0Dh,0Ah,0Ah,0 ;14 + db "Can't install boot on this disk",0Dh,0Ah,0Ah,0 ;7 + db "Invalid drive specification",0Dh,0Ah,0Ah,0 ;8 + db " Error: Can't open file",0Dh,0Ah,0Ah,0 ;9 + db " Error: Can't allocate memory",0Dh,0Ah,0Ah,0 ;10 + db " Error: Need DOS version 1.70.811 or higher",0Dh,0Ah,0Ah,0 ;11 + db " Error: Reading error",0Dh,0Ah,0Ah,0 ;12 + db " Error: Can't create file",0Dh,0Ah,0Ah,0 ;13 + db " Error: Writing error",0Dh,0Ah,0Ah,0 ;14 endmess: db 0 diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index b2c5934..2459c5f 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -20,18 +20,33 @@ BOOTDSK: RET ; Сообщить DSS с какого диска загружается система. ; Исп. загрузчик системы для иниц. ячейки "boot_disk". -.SET: LD B,A ;SET BOOT DISK - LD C,0 + +.SET: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;LD B,A ;SET BOOT DISK + ;LD C,0 + LD B,A + LD C,0 + LD (.part),HL + ; .loop: PUSH BC LD A,C LD DE,#55AA LD BC,256*0 + Dss.DRV.GenIOCTL RST ToDSS.DRV + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,C ; номер партиции в MBR диска + ; POP BC JR C,.NoSupport EX AF,AF' ;PHISICAL DRIVE NUMBER CP B JR NZ,.NoSupport + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + EX AF,AF' ; номер партиции в MBR диска +.part+1: LD HL,0 + CP L + JR NZ,.NoSupport + ; ;R13 LD A,#38 ; opcode for JR C,addr LD (BOOTDSK.chg),A diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index d851905..90c2501 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -200,7 +200,7 @@ PORTAL.out_DRV: PUSH BC ; LD (.RETBANK),A ; POP BC ; POP AF ; -ADCALL+1: CALL DISPATCH ; патчится на INTDISK +.ADCALL+1: CALL DISPATCH ; патчится на INTDISK JP PORTAL.out_DRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -224,7 +224,7 @@ DRV_PAGE.LDRIVE: DB #00 DISPATCH: LD HL,INTDISK - LD (ADCALL),HL + LD (PORTAL.out_DRV.ADCALL),HL INITDVC_RET_DRIVE: CALL INITDVC LD A,(DRV_PAGE.LDRIVE) @@ -251,11 +251,17 @@ DEVICE EQU $ ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS +;+09 BYTE PARTITION RECORD NUMBER (in drive MBR) ;+09 FREE ;+15 -LOGDRV EQU DEVICE + DEVICE.End -.TBL_Entry EQU 16 -.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +LOGDRV EQU DEVICE + DEVICE.End +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +;!TODO сделать структурой +.PHISICAL_DRV_NUMBER EQU 0 +.SECTOR_OFFSET EQU 1 +.SIZE_IN_SECTORS EQU 5 +.PARTITION_RECORD_NUM EQU 9 ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи ; ПОРТИТ: HL, IY. HL<-->DE diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 4b18527..b70ede6 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -265,7 +265,11 @@ PORTAL.out_MAIN: ; ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION F_START: DI - LD (.saveDRV),A + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;LD (.saveDRV),A + LD H,A + LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве + ; ;R12 LD C,BIOS.DRV_VERSION @@ -297,10 +301,12 @@ F_START: DI RST ToDSS.DRV LD (LDRIVE),A ;R05 - -.saveDRV+1: LD A,0 - ;LD BC,1*256 + Dss.BootDSK - ;RST ToDSS +.saveDRV+1: + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD HL,0 ; H - номер устройства, L - номер раздела на устройстве + LD A,H + ;LD A,0 + ; LD B,1 CALL BOOTDSK diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 61cd369..62f1244 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -649,18 +649,17 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) CCF RET Z - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz LD BC,#2000 ; TST_01: IN A,(PORT_MOUSE.Ctrl) RRCA - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz JR C,.NXT DEC BC LD A,B OR C JR NZ,TST_01 - SCF RET ;JR NC,TST_01 ; @@ -671,12 +670,12 @@ TST_01: IN A,(PORT_MOUSE.Ctrl) CCF RET NZ - ;[x] mouse freeeeezzzz !TEST + ;[x] mouse freeeeezzzz LD BC,#2000 ; TST_02: IN A,(PORT_MOUSE.Ctrl) RRCA - ;[x] mouse freeeeezzzz !TEST + ;[x] mouse freeeeezzzz JR C,.NXT DEC BC LD A,B diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index b62d351..21f7f2b 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -41,7 +41,6 @@ ReScanDRV: INC HL LD H,(HL) LD L,A - ; [ищем что за драйв] EX DE,HL ; FDD? @@ -276,6 +275,7 @@ Find_Record: ;-----------------------[] ERROR_BOOTDRV_DIES: + DI LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default LD E,1 RST ToBIOS @@ -370,25 +370,31 @@ HARD_DRV: LD DE,LOGDRV.TBL_Entry LD B,DSS_MAX_DRIVES_AMOUNT ; -.loop: LD A,(IY+0) +.loop: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;CP #FF ;JR Z,.skip - CP (IX+0) + CP (IX+LOGDRV.PHISICAL_DRV_NUMBER) JR NZ,.skip - ; - LD A,(IY+1) - CP (IX+1) + ; + LD A,(IY+LOGDRV.SECTOR_OFFSET) + CP (IX+LOGDRV.SECTOR_OFFSET) JR NZ,.skip - LD A,(IY+2) - CP (IX+2) + LD A,(IY+LOGDRV.SECTOR_OFFSET+1) + CP (IX+LOGDRV.SECTOR_OFFSET+1) + JR NZ,.skip + LD A,(IY+LOGDRV.SECTOR_OFFSET+2) + CP (IX+LOGDRV.SECTOR_OFFSET+2) + JR NZ,.skip + LD A,(IY+LOGDRV.SECTOR_OFFSET+3) + CP (IX+LOGDRV.SECTOR_OFFSET+3) JR Z,.found - ; + ; .skip: ADD IX,DE DJNZ .loop ; ЗАПИСЬ НЕ НАЙДЕНА ; Грохаем старую запись в OLD_TABLES.LOGDRV LD A,#FF - LD (IY+0),A + LD (IY+LOGDRV.PHISICAL_DRV_NUMBER),A ; Достаём положение в OLD_TABLES.DEVICE POP HL ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM @@ -400,7 +406,7 @@ HARD_DRV: JP ReScanDRV.nextN2 ; .found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (IX+0),#FF + LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),#FF JP ReScanDRV.nextN ; ; CD_ROM: diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index f7b8813..a1cff9b 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -250,6 +250,7 @@ FDDRIVE: RET +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK @@ -311,7 +312,8 @@ FDDRIVE: LD L,H LD H,B EX DE,HL - EXX + EXX + LD C,0 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого AND A RET diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index fac1df9..9124cd3 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -210,9 +210,10 @@ RESR_H LD A,DSS_Error.drv.INVALID_COMMAND ;--------------------------------------------------------------------[v] ; c=0 Initialization INIT_H: PUSH IY - ;!TEST ;[ ] + ;!TEST ;[ ] для rescanDRV XOR A LD (DRVCLC.count),A + ; LD HL,LOGDRV LD (OFFSECT),HL @@ -348,6 +349,7 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET +; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK @@ -377,7 +379,7 @@ HGETPRM: ; LOGDRV_ENTRY_FIND LOGDRV ; - LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... PUSH IY LD C,BIOS.DRV_GET_PAR RST ToBIOS @@ -393,13 +395,16 @@ HGETPRM: LD B,D EXX ; SECTORS ON LOGICAL DISK - LD E,(IY+5) - LD D,(IY+6) - LD L,(IY+7) - LD H,(IY+8) + LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) + LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) + ; + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; EX AF,AF' - LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; AND A @@ -525,18 +530,32 @@ HIGHDOS: LD D,XH LD E,XL LD IX,(OFFSECT) - LD (IX+1),E ;BPB SECTOR - LD (IX+2),D - LD (IX+3),L - LD (IX+4),H + LD (IX+LOGDRV.SECTOR_OFFSET+0),E ;BPB SECTOR + LD (IX+LOGDRV.SECTOR_OFFSET+1),D + LD (IX+LOGDRV.SECTOR_OFFSET+2),L + LD (IX+LOGDRV.SECTOR_OFFSET+3),H LD E,(IY+12) LD D,(IY+13) LD L,(IY+14) LD H,(IY+15) - LD (IX+5),E ;SIZE DISK - LD (IX+6),D - LD (IX+7),L - LD (IX+8),H + LD (IX+LOGDRV.SIZE_IN_SECTORS+0),E ;SIZE DISK + LD (IX+LOGDRV.SIZE_IN_SECTORS+1),D + LD (IX+LOGDRV.SIZE_IN_SECTORS+2),L + LD (IX+LOGDRV.SIZE_IN_SECTORS+3),H + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого +ExtendedPartitionFlag+1: + LD A,0 + OR A ; !TODO загрузка с расширенного раздела не поддерживается + LD A,#FF + JR NZ,.not_supported ; если расширенный раздел, то облом + ; + POP BC + PUSH BC + LD A,4 ;!HARDCODE MBR: Number of entries in the partition table + SUB B +.not_supported: + LD (IX+LOGDRV.PARTITION_RECORD_NUM),A + ; ;!TEST Подстраховка от переполнения таблицы LOGDRV LD A,(DRVCLC.count) INC A @@ -545,17 +564,18 @@ HIGHDOS: LD (DRVCLC.count),A ; LD A,(DRV_NUM) - LD (IX+0),A + LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),A LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE LD (OFFSECT),IX -NXTPART: - LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry - ADD IY,DE - POP BC - DJNZ DOSAGA - AND A - RET + JP NXTPART +; NXTPART: +; LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry +; ADD IY,DE +; POP BC +; DJNZ DOSAGA +; AND A +; RET ; @@ -564,17 +584,18 @@ NOEXTDS: JR Z,HIGHDOS CP PartitionSysTypes.FAT16_LBA JR Z,HIGHDOS - CP PartitionSysTypes.FAT16_32M + CP PartitionSysTypes.FAT16_32Mb JR Z,MEDIDOS CP PartitionSysTypes.FAT12 JR Z,EASYDOS CP PartitionSysTypes.Win_Ext_LBA JR Z,SUBLEV ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - OR A ;PartitionSysTypes.Empty - JR NZ,NXTPART - POP BC ; баланс стека - RET + ;OR A ;PartitionSysTypes.Empty + ;JR NZ,NXTPART + JR NXTPART ; раздел не поддерживается + ;POP BC ; баланс стека + ;RET ;POP BC ;OR A ;RET Z @@ -583,7 +604,6 @@ NOEXTDS: ;RET ; - PARTIT: IN A,(SLOT3) PUSH AF LD A,SHARED_PAGE @@ -623,14 +643,30 @@ SUBLEV: PUSH IY LD IX,(CURSECH) PUSH DE PUSH IX + ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(ExtendedPartitionFlag) + INC A + LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; CALL EXTDOS + ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(ExtendedPartitionFlag) + DEC A + LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; POP IX POP DE LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC POP IY - JP NXTPART +NXTPART: + LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry + ADD IY,DE + POP BC + DJNZ DOSAGA + AND A + RET ; EXTDOS: LD HL,(EXTDOSL) LD DE,(EXTDOSH) diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 4596085..a43a897 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -455,6 +455,7 @@ IOCTL_RD: SCF RET +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK @@ -515,6 +516,7 @@ IOCTL_RD: XOR A LD L,A LD H,L + LD C,A ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,%10100000 RET diff --git a/DSS/build.txt b/DSS/build.txt index 773855c..189296e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -810 \ No newline at end of file +825 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index f295c1e..cff6327 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -70,6 +70,11 @@ cmd_dir: call MESSAGE ; вывести строку ld c,Dss.WaitKey rst ToDSS + dec d + jr nz,.skip_esc + xor a + ld (.key_p),a ; отменяем ESC +.skip_esc: ld a,32-1 .skip_wait: PUSH AF @@ -135,9 +140,9 @@ cmd_dir: .next: ld de,work_buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS - jr nc,.loop ; назад в цикл, если не конец списка - pop af ; лишнее - + jp nc,.loop ; назад в цикл, если не конец списка + ; + pop af ; баланс стека ; Десятичный вывод .print: ld hl,(D88DC) ld ix,PRM1 ; буфер diff --git a/SHELL/build.txt b/SHELL/build.txt index 2d82846..3d9983a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -289 \ No newline at end of file +295 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b9ca4f4..f112b13 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b9ca4f484d074cc80c221ad37a2a40e7ee670a16 +Subproject commit f112b1359045d7fe7aa47f843011fddc5e03eba2 From 44e1e2e6f607093f67e066ea24025d457528e2f7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 18 Dec 2023 04:52:36 +1000 Subject: [PATCH 077/219] =?UTF-8?q?-=20bugs=20in=20rescan=20and=20"17.12.2?= =?UTF-8?q?023=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D1=81?= =?UTF-8?q?=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0,=20=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=81=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 4 ++++ DSS/Media_drivers/ReScanDRV.ASM | 8 ++++---- DSS/build.txt | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index a647bdf..bc775d5 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -27,6 +27,10 @@ CDRIVE EQU #02 DRIVE: _mSYSID DI LD (DRIVE),A + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + XOR A + LD (DRIVE+1),A + ; LD C,BIOS.DRV_VERSION RST ToBIOS_18 LD A,INCORR diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index 21f7f2b..73610bb 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -276,13 +276,13 @@ Find_Record: ;-----------------------[] ERROR_BOOTDRV_DIES: DI - LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default LD E,1 + LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default RST ToBIOS ; - LD BC,256*COLORS.CGA.INC.BLUE + BIOS.LP_CLS_WIN - LD DE,0 LD HL,#2050 + LD DE,0 + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN RST ToBIOS ; LD A,1 @@ -294,7 +294,7 @@ ERROR_BOOTDRV_DIES: LD A,C LDIR ; - LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 LD C,BIOS.LP_SET_PLACE RST ToBIOS ; diff --git a/DSS/build.txt b/DSS/build.txt index 189296e..779a873 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -825 \ No newline at end of file +826 \ No newline at end of file From 708f6826fdeba1a4b874b1cf1cca31354925c362 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 19 Dec 2023 02:59:39 +1000 Subject: [PATCH 078/219] ... --- BOOT/DSSBOOT.ASM | 2 +- DSS/FS/FAT/FAT.asm | 6 +++--- SHELL/Commands/DIR.ASM | 9 +++++++-- SHELL/SHELL.ASM | 5 ----- SHELL/build.txt | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index bc775d5..609748c 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -139,7 +139,7 @@ MSG0: DB 0 DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0 DB "Invalid partition table.",13,10,0 DB "Invalid BOOT sector.",13,10,0 - DB "Can't open file SYSTEM.DOS ...",13,10,0 + DB "Can't open file SYSTEM.DOS...",13,10,0 DB 13,10,"Starting DSS... ",13,10,13,10,0 MSGE DB 0 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 378fe4d..be8f6b8 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -35,7 +35,7 @@ SEARCH: CPL LD C,A LD IX,DIRPAGE.buffer - ;!TEST 9/11/23 + ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) ; EXX ; LD DE,0 ; EXX @@ -63,7 +63,7 @@ SEARCH: INC HL INC DE DJNZ .loop_compare - ;!TEST 9/11/23 ;[x] some optimize + ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) ; LD D,XH ; LD E,XL LD D,XH @@ -84,7 +84,7 @@ SEARCH: AND A RET .next_record: - ;!TEST 9/11/23 ;[x] some optimize + ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) ; EXX ; INC DE ; EXX diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index cff6327..3cdaabc 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -243,12 +243,17 @@ cmd_dir: .Print_Header: ; %1 - ld a,(screen_path) ; диск ld hl,PRM1 + ld a,'"' ld (hl),a inc hl - ld (hl),":" + ld a,(screen_path) ; диск + ld (hl),a inc hl + ld a,'"' + ld (hl),a + inc hl + ;ld (hl),":" ld (hl),0 ; %2 ld hl,serial_string ; строка серийного номера диска diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 7ad3fb7..90d5ca5 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -155,11 +155,6 @@ option_c: ;ld hl,work_buffer+256;; ld hl,struct_input_line+5 ; имя bat-файла call BATCH ; обработка bat-файла (batch.asm) - - ;PUSH AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата - ;call save_disk_path ; узнать и сохр. тек. диск и путь - ;POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата - ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat jr back_to_parent_process.saveA ; вернуться в родит. процесс diff --git a/SHELL/build.txt b/SHELL/build.txt index 3d9983a..fb32aea 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -295 \ No newline at end of file +296 \ No newline at end of file From cc6ab20c6c2574b0f1c9423dca2070f36acb6332 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 30 Dec 2023 02:49:31 +1000 Subject: [PATCH 079/219] ... --- DSS/API/bootDsk.asm | 16 +-- DSS/FS/FAT/FAT12_16.asm | 4 +- DSS/VIDEO.ASM | 207 +++++++++++++++++----------------- DSS/build.txt | 2 +- SHELL/Messages/errors_txt.asm | 60 ---------- SHELL/SHELL.ASM | 54 ++++----- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 8 files changed, 143 insertions(+), 204 deletions(-) delete mode 100644 SHELL/Messages/errors_txt.asm diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index 2459c5f..1db9326 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -2,8 +2,12 @@ ; Функция #09. Номер системного диска. ; Возвращает номер диска, c которого загружена система. ; -; вход: B = 0 (01h - исп. boot-загрузчик системы) -; выход: A - номер системного диска (0=A,1=B,..) +; При B = 0 (GET) +; вход: B = 0 (01h - исп. boot-загрузчик системы) +; выход: A - номер системного диска (0=A,1=B,..) +; При B = 1 (SET - исп. boot-загрузчик системы, после чего функция недоступна) +; вход: A - номер устройства, L - номер раздела на устройстве +; выход: ;///////////////////////////////////////////////////////////////////// BOOTDSK: INC B @@ -21,11 +25,9 @@ BOOTDSK: ; Сообщить DSS с какого диска загружается система. ; Исп. загрузчик системы для иниц. ячейки "boot_disk". -.SET: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - ;LD B,A ;SET BOOT DISK - ;LD C,0 - LD B,A - LD C,0 +.SET: LD B,A ;SET BOOT DISK + LD C,0 + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD (.part),HL ; .loop: PUSH BC diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 2541602..338612a 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -362,8 +362,8 @@ READ_FAT: ;LD IX,0 ;ADD IX,DE ; номер лог. сектора ; - LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING - LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS + LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32 + LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE RST ToDSS.DRV diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index ac510dd..33e0530 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -22,9 +22,9 @@ ; выход: нет ;///////////////////////////////////////////////////////////////////// CLEAR: LD C,BIOS.LP_CLS_WIN2 - RST ToBIOS - AND A - RET + JP ToBIOS + ;AND A + ;RET ; ;///////////////////////////////////////////////////////////////////// ; Функция #5C. Вывод строки на экран. @@ -181,7 +181,7 @@ RDCHAR: XOR A RST ToBIOS LD A,L LD B,H - AND A + ;AND A RET ;///////////////////////////////////////////////////////////////////// @@ -205,9 +205,9 @@ WRCHAR: LD C,A POP HL XOR A LD C,BIOS.WIN_PUT_SYM - RST ToBIOS - AND A - RET + JP ToBIOS + ;AND A + ;RET ;///////////////////////////////////////////////////////////////////// ; Функция #59. Сохранить окно экрана. @@ -266,7 +266,7 @@ WINREST: AND A ; A = 0 - очищать строку ; выход: нет ;///////////////////////////////////////////////////////////////////// -SCROLL: DJNZ SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее +SCROLL: DJNZ .SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее ;[x] 04/04/23 ;LD B,A ;LD C,H @@ -289,9 +289,9 @@ SCROLL: DJNZ SCR_DW ;!TODO RST ToBIOS ;[x] 29/9/23 POP AF - JP PO,1F + JP PO,.skip_EI EI -1: ; +.skip_EI: POP HL POP DE ;[x] 04/04/23 @@ -313,11 +313,11 @@ SCROLL: DJNZ SCR_DW ;!TODO LD C,BIOS.LP_PRINT_SYM RST ToBIOS POP DE ;R01 - CALL LOCATE ;R01 - AND A - RET - -SCR_DW: DJNZ SCR_ERR + JP LOCATE ;R01 + ;AND A + ;RET +.SCR_DW: + DJNZ .SCR_ERR ;[x] 04/04/23 ;LD B,A ;LD C,H @@ -340,9 +340,9 @@ SCR_DW: DJNZ SCR_ERR RST ToBIOS ; [x] 29/9/23 POP AF - JP PO,1F + JP PO,.skip2_EI: EI -1: ; +.skip2_EI: POP HL POP DE ;[x] 29/9/23 @@ -354,8 +354,7 @@ SCR_DW: DJNZ SCR_ERR ; RET NZ JP SCROLL.print - -SCR_ERR: +.SCR_ERR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET @@ -387,7 +386,8 @@ SELPAGE: ; выход: A - текущий режим экрана ; B - страница экрана 0/1 ;///////////////////////////////////////////////////////////////////// -GETVMOD IN A,(SCREEN_SWITCH) +GETVMOD: + IN A,(SCREEN_SWITCH) LD B,A LD A,(VMODE) AND A @@ -610,93 +610,90 @@ ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 ;---------------------------------------------------------------------- ; Сохранить экран текст. режима. ; Для буфера экрана исп. 2-я банка расширения ДОС. -SAVETXT PUSH AF - LD A,(VMODE) - ;BIT 7,A - CP %1000'0000 - JR NC,NOSAVET - SUB #02 - JR C,NOSAVET - - PUSH BC - PUSH DE - PUSH HL - PUSH IX - - PUSH AF - LD C,BIOS.LP_GET_PLACE - RST ToBIOS - LD (TCURS),DE - POP AF - LD IX,#C000 - LD HL,#2050 - OR A - JR NZ,SVTEXT1 - LD L,#28 -SVTEXT1 LD (SVHL1),HL - LD DE,#0000 - LD A,(BANKTBL+TXTPAGE) - LD B,A - LD C,BIOS.WIN_COPY - ;[x] 29/9/23 - LD A,R - PUSH AF - ; - XOR A - DI - RST ToBIOS - ;[x] 29/9/23 - POP AF - JP PO,1F - EI -1: ; - POP IX - POP HL - POP DE - POP BC -NOSAVET: POP AF - RET +SAVETXT: PUSH AF + LD A,(VMODE) + ;BIT 7,A + CP %1000'0000 + JR NC,.NOSAVET + SUB #02 + JR C,.NOSAVET + ; + PUSH BC + PUSH DE + PUSH HL + PUSH IX + ; + PUSH AF + LD C,BIOS.LP_GET_PLACE + RST ToBIOS + LD (TCURS),DE + POP AF + LD IX,#C000 + LD HL,#2050 + OR A + JR NZ,.SVTEXT1 + LD L,#28 +.SVTEXT1: LD (SVHL1),HL + LD DE,#0000 + LD A,(BANKTBL+TXTPAGE) + LD B,A + LD C,BIOS.WIN_COPY + ;[x] 29/9/23 + LD A,R + PUSH AF + ; + XOR A + DI + RST ToBIOS + ;[x] 29/9/23 + POP AF + JP PO,.skip_EI + EI +.skip_EI: ; + POP IX + POP HL + POP DE + POP BC +.NOSAVET: POP AF + RET ;---------------------------------------------------------------------- -BACKTXT PUSH AF -VVMODE+1: - LD A,#00 - ;BIT 7,A - CP %1000'0000 - JR C,NOBACKT - - PUSH BC - PUSH DE - PUSH HL - PUSH IX - LD IX,#C000 -SVHL1+1: - LD HL,#2050 - LD DE,#0000 - LD A,(BANKTBL+TXTPAGE) - LD B,A - LD C,BIOS.WIN_RESTORE - ;[x] 29/9/23 - LD A,R - PUSH AF - ; - XOR A - DI - RST ToBIOS - ;[x] 29/9/23 - POP AF - JP PO,1F - EI -1: ; -TCURS+1: - LD DE,#0000 - CALL LOCATE - POP IX - POP HL - POP DE - POP BC -NOBACKT: POP AF - RET +BACKTXT: PUSH AF +VVMODE+1: LD A,#00 + ;BIT 7,A + CP %1000'0000 + JR C,NOBACKT + ; + PUSH BC + PUSH DE + PUSH HL + PUSH IX + LD IX,#C000 +SVHL1+1: LD HL,#2050 + LD DE,#0000 + LD A,(BANKTBL+TXTPAGE) + LD B,A + LD C,BIOS.WIN_RESTORE + ;[x] 29/9/23 + LD A,R + PUSH AF + ; + XOR A + DI + RST ToBIOS + ;[x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; +TCURS+1: LD DE,#0000 + CALL LOCATE + POP IX + POP HL + POP DE + POP BC +NOBACKT: POP AF + RET ;///////////////////////////////////////////////////////////////////// ; Функция #5F. Вывод символа на принтер без ожидания. diff --git a/DSS/build.txt b/DSS/build.txt index 779a873..cb22560 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -826 \ No newline at end of file +827 \ No newline at end of file diff --git a/SHELL/Messages/errors_txt.asm b/SHELL/Messages/errors_txt.asm deleted file mode 100644 index da24021..0000000 --- a/SHELL/Messages/errors_txt.asm +++ /dev/null @@ -1,60 +0,0 @@ -;----------------------------------------------------------------------- -;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются -ERR0: DB #00 - DZ "Bad command or file name" - DZ "Invalid function" ; 01 - неверный номер функции - DZ "Invalid drive number" ; 02 - неправильный номер устройства - DZ "File not found" ; 03 - файл не обнаружен - DZ "Path not found" ; 04 - неверный путь - DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "Too many open files" ; 06 - нет свободного файлового манипулятора - DZ "File already exist" ; 07 - файл существует - DZ "File read only" ; 08 - файл только для чтения - DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) - DZ "No free space" ; 10 - нет свободного места на диске - DZ "Directory not empty" ; 11 - каталог не пуст - DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог - DZ "Invalid media" ; 13 - неизвестный формат - DZ "Unknown operation" ;R02 ; 14 - невозможная операция - DZ "Directory exist" ; 15 - каталог уже есть - DZ "Invalid filename" ; 16 - неверное имя - DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл - DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен - DZ "Not ready" ; 20 - нет готовности - DZ "Seek error" ; 21 - ошибка позиционирования - DZ "Sector not found" ; 22 - сектор не найден - DZ "CRC error" ; 23 - ошибка CRC - DZ "Write protect" ; 24 - защита записи - DZ "Read error" ; 25 - ошибка чтения - DZ "Write error" ; 26 - ошибка записи - DZ "Drive failure" ; 27 - сбой диска - DZ "Extended error 28" - DZ "Extended error 29" - DZ "Not enough memory" ; 30 - недостаточно памяти - DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "Extended error 32" - DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной - DZ "Extended error 34" - DZ "Too many files in directory" ; 35 - слишком много файлов в директории - DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation aborted by user" ; 37 - операция прервана пользователем - DZ "Common error" ; 38 - общая ошибка - DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения - DZ "40" - DZ "41" - DZ "42" - DZ "43" - DZ "44" - DZ "45" - DZ "46" - DZ "Wrong video mode" ; 48 - неправильный видеорежим - DZ "48" - DZ "49" - DZ "50" - ;R11 - DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: - DZ "Unknown error" - ; -.Size EQU $-ERR0 -;----------------------------------------------------------------------- \ No newline at end of file diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 90d5ca5..ca68d38 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -35,6 +35,7 @@ ;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES ;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO ;=====================================================================[] + DEFINE SHELL_COMPILATION 1 includelua 'Shared_includes/lua/Functions.lua' include 'shared_includes/constants/bios_equ.inc' @@ -530,34 +531,33 @@ T8C21: db "ON",0 T8C24: db "OFF",0 - include 'edline.asm' ; строка редактирования - include 'batch.asm' ; парсинг bat-файлов - include 'exec.asm' ; выполн. введ. команд с консоли - include 'procedures/print.asm' ; функции вывода сообщений - include 'messages/errors_txt.asm' ; сообщения об ошибках - include 'messages/main_txt.asm' ; сообщения - include 'procedures/parsers.asm' ; функции прочесывания и выбора - include 'procedures/math.asm' ; функции математические - + include 'edline.asm' ; строка редактирования + include 'batch.asm' ; парсинг bat-файлов + include 'exec.asm' ; выполн. введ. команд с консоли + include 'procedures/print.asm' ; функции вывода сообщений + include '../Shared_includes/constants/dss_errors.z80' ; сообщения об ошибках + include 'messages/main_txt.asm' ; сообщения + include 'procedures/parsers.asm' ; функции прочесывания и выбора + include 'procedures/math.asm' ; функции математические ; - include 'Commands/exit.asm' ; выход в родит. процесс - include 'Commands/break.asm' ; выход из парсера bat - include 'Commands/pause.asm' ; пауза - include 'Commands/rem.asm' ; комментарий - include 'Commands/ver.asm' ; вывод версии ДОС - include 'Commands/cls.asm' ; очистка экрана - include 'Commands/date.asm' ; вывод или установка даты/времени - include 'Commands/dir.asm' ; вывод списка директории - include 'Commands/chdir.asm' ; смена тек. каталога - include 'Commands/mkdir.asm' ; создание каталога - include 'Commands/rmdir.asm' ; удаление каталога - include 'Commands/del.asm' ; удаление файла - include 'Commands/ren.asm' ; переименование файла или каталога - include 'Commands/echo.asm' ; эхо-режим - include 'Commands/help.asm' ; вывод экрана помощи - include 'Commands/path.asm' ; задать сист. путь - include 'Commands/set.asm' ; задать переменную окружения - include 'Commands/reboot.asm' ; софт ресет + include 'Commands/exit.asm' ; выход в родит. процесс + include 'Commands/break.asm' ; выход из парсера bat + include 'Commands/pause.asm' ; пауза + include 'Commands/rem.asm' ; комментарий + include 'Commands/ver.asm' ; вывод версии ДОС + include 'Commands/cls.asm' ; очистка экрана + include 'Commands/date.asm' ; вывод или установка даты/времени + include 'Commands/dir.asm' ; вывод списка директории + include 'Commands/chdir.asm' ; смена тек. каталога + include 'Commands/mkdir.asm' ; создание каталога + include 'Commands/rmdir.asm' ; удаление каталога + include 'Commands/del.asm' ; удаление файла + include 'Commands/ren.asm' ; переименование файла или каталога + include 'Commands/echo.asm' ; эхо-режим + include 'Commands/help.asm' ; вывод экрана помощи + include 'Commands/path.asm' ; задать сист. путь + include 'Commands/set.asm' ; задать переменную окружения + include 'Commands/reboot.asm' ; софт ресет ; DISPLAY "Empty space for buffers from ",/H,$ work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes diff --git a/SHELL/build.txt b/SHELL/build.txt index fb32aea..da4c6e9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -296 \ No newline at end of file +297 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index f112b13..54298bf 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit f112b1359045d7fe7aa47f843011fddc5e03eba2 +Subproject commit 54298bfb52826572bda5ccd0609320a9418d08c9 From ec7682cf21d4fb3c2c7eb379aaa3a445969218ba Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 9 Jan 2024 00:06:14 +1000 Subject: [PATCH 080/219] -fixed 2 bugs with attributes and directories --- DSS/API/Create.asm | 9 +++++ DSS/API/Open.asm | 4 +-- DSS/DSS-MAIN.ASM | 7 +--- DSS/FS/FAT/FAT.asm | 24 +++++++------ DSS/FS/FAT/FAT12_16.asm | 78 ----------------------------------------- DSS/INTMOUSE.ASM | 46 ++++++++++++------------ DSS/Procedures.asm | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 1 - Shared_Includes | 2 +- 10 files changed, 52 insertions(+), 123 deletions(-) diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index d0aa86e..4e234b9 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -1,14 +1,19 @@ //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; A - File attribute ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// CREATE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID CREATE: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL + LD C,A + PUSH BC CALL DIR_PATH_CHECK + POP BC POP HL RET C + LD A,C ; CALL .Prepare RET C @@ -20,9 +25,13 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID .NEW: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL + LD C,A + PUSH BC CALL DIR_PATH_CHECK + POP BC POP HL RET C + LD A,C ; CALL .Prepare RET C diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 3bcf788..cb344cd 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -15,11 +15,11 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 CALL DIR_PATH_CHECK.forceCheck POP HL RET C - JR .start + ;JR .start ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; ;OPEN: ; - LD (.TMP),A ; enter point from CREATE + ;LD (.TMP),A ; enter point from CREATE .start: CALL GETWORD RET C CALL MASK ; enter point from OPEN_FN diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index b70ede6..b0c8375 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -441,7 +441,7 @@ ADRST10: ;DS 512 ;,0 ;---------------------------------------------------------------------------------------------------------------------------------------------------------------; ;[INCLUDE] ;!TODO заменить по-максимому всё в KEYINTER.ASM на вызовы биоса - INCLUDE "KEYINTER.ASM" ;!FIXIT из-за буфера с выравниванием align 256 в начале приходится ADRST10 добивать нулями в конце + INCLUDE "KEYINTER.ASM" INCLUDE "VIDEO.ASM" INCLUDE "API.ASM" INCLUDE "DOS_Proc.asm" @@ -474,14 +474,9 @@ CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце ; - IF SAVE_PATH_CODE WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце - ELSE -WorkDirectory EQU CurrentDirectory -.DEPTH EQU CurrentDirectory.DEPTH - ENDIF ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index be8f6b8..3778428 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -388,19 +388,22 @@ LOADDIR: WRT_HND: SET_PAGE_X DIRPAGE EX AF,AF' ; - LD IX,DIRPAGE.buffer + ;LD IX,DIRPAGE.buffer + LD HL,DIRPAGE.buffer ;TEST 9/11/23 ; EXX ; LD DE,0 ; EXX ; -.loop: LD A,(IX+00) + LD BC,#0020 +.loop: ;LD A,(IX+00) + LD A,(HL) OR A JR Z,.WRT_HN2 CP #E5 JR Z,.WRT_HN2 - LD BC,#0020 - ADD IX,BC + ;ADD IX,BC + ADD HL,BC JR NC,.loop ; EX AF,AF' @@ -409,8 +412,9 @@ WRT_HND: SET_PAGE_X DIRPAGE SCF RET .WRT_HN2: - LD D,XH - LD E,XL + ;LD D,XH + ;LD E,XL + EX DE,HL LD HL,HANDBUF LD BC,HANDBUF.SIZE LDIR @@ -617,7 +621,7 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.DAT_FRM),HL ;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer //////////////////////////////////////////////////////////////////////// - IF COMPILE_UNUSED_CODE + ;IF COMPILE_UNUSED_CODE ;LD HL,0 ;LD H,B ; тут в B ноль должен быть @@ -654,7 +658,7 @@ RD_BPB: LD C,SLOT3 SBC HL,DE JR NC,.loop4 LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) - ENDIF + ;ENDIF //////////////////////////////////////////////////////////////////////// LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага @@ -688,7 +692,7 @@ RD_BPB: LD C,SLOT3 ;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer //////////////////////////////////////////////////////////////////////// - IF COMPILE_UNUSED_CODE + ;IF COMPILE_UNUSED_CODE LD HL,0 @@ -702,7 +706,7 @@ RD_BPB: LD C,SLOT3 DEC A JR NZ,.BPB_L1 LD (FatBuffer.S_X_H),HL - ENDIF + ;ENDIF //////////////////////////////////////////////////////////////////////// LD DE,(FatBuffer.DAT_FRM) diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 338612a..6ea9706 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -88,25 +88,6 @@ 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 CALL GET_FAT16_CELL LD E,(HL) ; прочитать номер кластера INC HL @@ -122,33 +103,6 @@ R_F_F16: ; R_F_F12: 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) @@ -249,38 +203,6 @@ W_T_F16: ; fat12 W_T_F12: ;!FIXIT переделать на переменные FAT_CACHE PUSH 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 ; сдвиг вправо через 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 JR C,W_T_F01 ; номер нечётный diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 62f1244..835a3cf 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -909,34 +909,34 @@ REDY+1: LD A,#00 LD (REDY),A RET -MODE_M DB #03 +MODE_M: DB #03 -PIX_X DW 160 -PIX_Y DW 128 +PIX_X: DW 160 +PIX_Y: DW 128 -MX DB #00 -MY DB #00 -MB DB #00 -MB_OLD DB #00 ; !FIXIT - не нужно? -MIN_X DW 0 -MAX_X DW 319 -MIN_Y DW 0 -MAX_Y DW 255 -SENSEXY -SENSE_X DB 0 -SENSE_Y DB 0 +MX: DB #00 +MY: DB #00 +MB: DB #00 +;MB_OLD DB #00 ; !FIXIT - не нужно? +MIN_X: DW 0 +MAX_X: DW 319 +MIN_Y: DW 0 +MAX_Y: DW 255 +SENSEXY: +.X: DB 0 +.Y: DB 0 -XHOT_SP DW 0 -YHOT_SP DW 0 +XHOT_SP: DW 0 +YHOT_SP: DW 0 -ANDXORS DW #FF00 -ANDXORA DW #FF77 +ANDXORS: DW #FF00 +ANDXORA: DW #FF77 -M_XSIZE DB 10 -M_YSIZE DB 14 -SKIPXF DW 0 -REALXS DW 0 -REALYS DW 0 +M_XSIZE: DB 10 +M_YSIZE: DB 14 +SKIPXF: DW 0 +REALXS: DW 0 +REALYS: DW 0 ; Xx EQU #00 ; Ww EQU #FE diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index 0760807..92310fd 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -163,7 +163,7 @@ BCD2HEX: ;!TODO hardware ;----------------------------------------------------------------------; -;!FIXIT переделать по доке на Даллас и заись в ячейки часов +;!FIXIT переделать по доке на Даллас и запись в ячейки часов ; Запись регистров CMOS ; вход: d=номер регистра WCMOS: CALL HEX2BCD diff --git a/DSS/build.txt b/DSS/build.txt index cb22560..8f5f232 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -827 \ No newline at end of file +831 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 1590968..a9ce9c7 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -47,7 +47,6 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 - DEFINE SAVE_PATH_CODE 1 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - тормознее, но безопаснее ; diff --git a/Shared_Includes b/Shared_Includes index 54298bf..a6dee8e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 54298bfb52826572bda5ccd0609320a9418d08c9 +Subproject commit a6dee8e17ae12b251f306290793a56a6b0dd5ae3 From 43b8683575879d245e0045529954210221a6e814 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 26 Jan 2024 00:44:27 +1000 Subject: [PATCH 081/219] Core: fixed error in EXEC, SYSTIME. Shell: CMD_DATE - printing day of week --- DSS/API/Time.asm | 67 +++++--- DSS/DOS_Proc.asm | 4 +- DSS/EXECUTE.ASM | 4 +- DSS/FS/FAT/FAT.asm | 7 +- DSS/Procedures.asm | 310 +++++++++++++++++++++++++----------- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 2 +- SHELL/Commands/DATE.ASM | 59 ++++--- SHELL/Commands/DIR.ASM | 4 +- SHELL/Commands/ECHO.ASM | 4 +- SHELL/EXEC.ASM | 45 +++--- SHELL/Messages/main_txt.asm | 2 +- SHELL/Procedures/math.asm | 2 +- SHELL/SHELL.ASM | 63 ++++---- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 16 files changed, 373 insertions(+), 206 deletions(-) diff --git a/DSS/API/Time.asm b/DSS/API/Time.asm index 0d0813a..d5ca9b6 100644 --- a/DSS/API/Time.asm +++ b/DSS/API/Time.asm @@ -14,35 +14,35 @@ SYSTIME: LD C,BIOS.CMOS_TEST RST ToBIOS JP C,.NOCMOS - LD D,7 ;DAY + LD D,CMOS.Register.date CALL RCMOS PUSH AF - LD D,8 ;MONTH + LD D,CMOS.Register.month CALL RCMOS POP DE LD E,A PUSH DE - LD D,4 ;HOUR + LD D,CMOS.Register.hours CALL RCMOS PUSH AF - LD D,2 ;MINUTE + LD D,CMOS.Register.minutes CALL RCMOS POP DE LD E,A PUSH DE - LD D,0 ;SECOND + LD D,CMOS.Register.seconds CALL RCMOS PUSH AF - LD D,6 ;WEEK DAY + LD D,CMOS.Register.dayOfWeek LD C,BIOS.CMOS_RD RST ToBIOS POP DE LD E,A PUSH DE - LD D,9 ;YEAR + LD D,CMOS.Register.year CALL RCMOS ;READ AND CONVERT TO DECIMAL PUSH AF - LD D,#32 ;CENTURY + LD D,CMOS.Register.century LD C,BIOS.CMOS_RD RST ToBIOS LD XH,A @@ -61,7 +61,7 @@ SYSTIME: JR Z,.GOODAGE .BADAGE: PUSH AF - LD D,#32 ;CENTURY + LD D,CMOS.Register.century LD C,BIOS.CMOS_WR RST ToBIOS POP AF @@ -122,34 +122,47 @@ SETTIME: PUSH BC PUSH HL PUSH DE + ; + ; [ ] 25/01/2024 + CALL CalcDayOfWeek + PUSH HL + ; LD C,BIOS.CMOS_TEST RST ToBIOS - JP C,.NOCMOS2 + JR C,.NOCMOS2 + ; + ; [ ] 25/01/2024 + POP AF + LD D,CMOS.Register.dayOfWeek + LD C,BIOS.CMOS_WR + RST ToBIOS + ; POP AF PUSH AF - LD D,7 ;DAY + LD D,CMOS.Register.date CALL WCMOS POP BC LD A,C - LD D,8 ;MONTH + LD D,CMOS.Register.month CALL WCMOS POP AF PUSH AF - LD D,4 ;HOUR + LD D,CMOS.Register.hours CALL WCMOS POP BC LD A,C - LD D,2 ;MINUTE + LD D,CMOS.Register.minutes CALL WCMOS POP AF - PUSH AF - LD D,0 ;SECOND + ;PUSH AF ; [ ] баг с установкой дня недели из регистра C. Нашел Hard + LD D,CMOS.Register.seconds CALL WCMOS - POP BC - LD A,C - LD D,6 ;WEEK DAY - LD C,BIOS.CMOS_WR - RST ToBIOS + ; [ ] баг с установкой дня недели из регистра C. Нашел Hard + ;POP BC + ;LD A,C + ;LD D,CMOS.Register.dayOfWeek + ;LD C,BIOS.CMOS_WR + ;RST ToBIOS ; POP HL XOR A @@ -160,17 +173,23 @@ SETTIME: ADD HL,DE DEC A PUSH HL - LD D,#32 ;CENTURY + LD D,CMOS.Register.century CALL WCMOS POP BC LD A,C - LD D,9 ;YEAR + LD D,CMOS.Register.year CALL WCMOS AND A RET ; !FIXIT новый биос выставляет время, если с ним что-то не так. .NOCMOS2: - LD C,0 + POP AF + POP DE + POP HL + POP BC + POP IX + LD C,A + ; LD (SYSTIME.NC_DAY),DE ;DAY/MONTH LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 07c1f41..a3185ca 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -303,10 +303,10 @@ OPENDIR:;!TEST ;[x] some optimize LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL EX DE,HL ; - CALL LOADDIR + JP LOADDIR ; CF=0 ;AND A - RET + ;RET ;----------------------------------------------------------------------; diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index f566f87..618662b 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -858,6 +858,7 @@ EXEC: LD (CMDLINE),HL ;LD HL,(CMDLINE) JR C,EXEC0_SHORT .VAR_2: CALL EXEC_1 + ;LD A,DSS_Error.sys.FILE_NOT_FOUND SCF RET ; File not found - exit @@ -873,7 +874,7 @@ EXEC_1: ;LD (CMDLINE),HL CALL MASK RET C CALL TST_EXT - LD A,DSS_Error.sys.FILE_NOT_FOUND + ;LD A,DSS_Error.sys.FILE_NOT_FOUND RET C _mINCTASK ;R08 CALL OPEN_FN.FILE @@ -914,6 +915,7 @@ COPYEXN: LD A,(HL) CALL FINDPATH ;[x] 1/10/2023 + LD A,DSS_Error.sys.FILE_NOT_FOUND RET C ; LD HL,(CMDLINE) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 3778428..fe65b7c 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -327,7 +327,7 @@ LOADDIR: CALL MOVE_FP SET_PAGE_X DIRPAGE - + AND A PUSH AF ;!TEST no ldir ; очистить кеш каталога @@ -349,11 +349,9 @@ LOADDIR: LD DE,#4000 ; сколько XOR A ; дескриптор CALL READ ; чтение из файла - ;!FIXIT проверка на ошибку LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов POP AF OUT (SLOT3),A - AND A RET .LROTDIR: LD HL,(FatBuffer.DIR_FRH) ; ст. разряд @@ -376,7 +374,6 @@ LOADDIR: RST ToDSS.DRV POP AF OUT (SLOT3),A - AND A RET ;----------------------------------------------------------------------; @@ -650,7 +647,7 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.CLU_LEN),HL EX DE,HL - LD HL,#3FFF ;!TODO FATcacheSize + LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize XOR A ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится .loop4: INC A diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index 92310fd..e12fa42 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -101,6 +101,110 @@ RMKTIME: ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; [ ] 25/01/2024 +; вход: D - день +; E - месяц +; IX - год +; выход: H - день недели (1 - воскресенье) +CalcDayOfWeek: ;!FIXIT вычислять день недели + ; x = (14 ? месяц) / 12 + ; y = год ? x + ; m = месяц + 12 * x ? 2 + ; ДеньНедели = (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 + ; Все деления целочисленные (остаток отбрасывается). + ; + LD A,D + LD (.day),A + ; x = (14 ? месяц) / 12 + ; y = год ? x + LD A,E + CP 3 + LD A,0 + JR NC,1F + DEC IX + LD A,12 +1: ; y = IX + ; m = месяц + 12 * x ? 2 + ADD E + SUB 2 + ; m = A + ; HL = (31 * m) + LD D,0 + LD E,A + RLA + RLA + RLA + LD H,D + LD L,A + ADD HL,HL + ADD HL,HL + SBC HL,DE + ; (31 * m) = HL + ; BC = (31 * m) / 12 + LD B,H + LD C,L + ; D=0 + LD E,12 + CALL BC_Div_DE + ; (31 * m) / 12 = BC + LD (.m31_12),BC + ; y / 4 + PUSH IX + POP BC + ; D=0 + LD E,4 + CALL BC_Div_DE + ; y / 4 = BC + PUSH BC + ; y / 100 + PUSH IX + POP BC + ; D=0 + LD E,100 + CALL BC_Div_DE + ; y / 100 = BC + PUSH BC + ; y / 400 + PUSH IX + POP BC + LD DE,400 + CALL BC_Div_DE + ; y / 400 = BC + ; y/400 - y/100 + AND A + LD H,B + LD L,C + POP DE + SBC HL,DE + ; y/400 - y/100 = HL + ; y/4 ? y/100 + y/400 + POP DE + ADD HL,DE + ; y/4 ? y/100 + y/400 + (31 * m)/12 +.m31_12+1: LD DE,0 + ADD HL,DE + ; y + y/4 ? y/100 + y/400 + (31 * m)/12 + EX DE,HL + ADD IX,DE + ; день + y + y/4 ? y/100 + y/400 + (31 * m)/12 + LD D,0 +.day+1: LD E,0 + ADD IX,DE + ; 7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12) + LD DE,7000 + ADD IX,DE + ; (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 + LD B,XH + LD C,XL + LD DE,7 + CALL BC_Div_DE + ; ДеньНедели = L + LD H,L + INC H + RET +;----------------------------------------------------------------------; + ;----------------------------------------------------------------------; ; a..z -> A..Z @@ -190,6 +294,33 @@ HEX2BCD: ;----------------------------------------------------------------------; ; + +; +;----------------------------------------------------------------------; +;BC/DE ==> BC, remainder in HL +; не портит DE +BC_Div_DE: + ld hl,0 + ld a,b + ld b,16 + ;shift the bits from BC into HL +.div_loop: + sla c + rla + adc hl,hl + sbc hl,de + jr nc,.div_inc_acc + add hl,de + db $FE ;this begins the instruction `cp *`, so it eats the next byte. +.div_inc_acc: + inc c + djnz .div_loop + ld b,a + ret +;----------------------------------------------------------------------; +; + + ; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A ;----------------------------------------------------------------------; DIV_for_SPC: @@ -231,107 +362,106 @@ DIV_for_SPC: ; LD H,0 ; LD L,A ; RET -/* - DEFINE NEW_DIV 1 -DIV32: LD XH,D - LD XL,E +; DEFINE NEW_DIV 1 - IFN NEW_DIV - EX DE,HL - LD HL,0 - LD A,#20 -DIV001: ADD IX,IX - EX DE,HL - ADC HL,HL - EX DE,HL - ADC HL,HL - SBC HL,BC - JR NC,DIV002 - ADD HL,BC - DEC A - JR NZ,DIV001 - RET -DIV002: INC IX - DEC A - JR NZ,DIV001 - RET - ELSE +; DIV32: LD XH,D +; LD XL,E + +; IFN NEW_DIV +; EX DE,HL +; LD HL,0 +; LD A,#20 +; DIV001: ADD IX,IX +; EX DE,HL +; ADC HL,HL +; EX DE,HL +; ADC HL,HL +; SBC HL,BC +; JR NC,DIV002 +; ADD HL,BC +; DEC A +; JR NZ,DIV001 +; RET +; DIV002: INC IX +; DEC A +; JR NZ,DIV001 +; RET +; ELSE -div32_16: -;HLIX/BC -> HLIX remainder DE -;174+4*div32_16_sub8 -;min: 2186cc -;max: 2794cc -;avg: 2466cc -;61 bytes - ex de,hl ; 4 +; div32_16: +; ;HLIX/BC -> HLIX remainder DE +; ;174+4*div32_16_sub8 +; ;min: 2186cc +; ;max: 2794cc +; ;avg: 2466cc +; ;61 bytes +; ex de,hl ; 4 -; Negate BC to allow add instead of sbc - xor a ; 4 -; Need to set HL to 0 anyways, so save 2cc and a byte - ld h,a ; 4 - ld l,a ; 4 - sub c ; 4 - ld c,a ; 4 - sbc a,a ; 4 - sub b ; 4 - ld b,a ; 4 +; ; Negate BC to allow add instead of sbc +; xor a ; 4 +; ; Need to set HL to 0 anyways, so save 2cc and a byte +; ld h,a ; 4 +; ld l,a ; 4 +; sub c ; 4 +; ld c,a ; 4 +; sbc a,a ; 4 +; sub b ; 4 +; ld b,a ; 4 - ld a,d ; 4 - call div32_16_sub8 ; 17 - rla ; 4 - ld d,a ; 4 +; ld a,d ; 4 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld d,a ; 4 - ld a,e ; 4 - call div32_16_sub8 ; 17 - rla ; 4 - ld e,a ; 4 +; ld a,e ; 4 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld e,a ; 4 - ld a,ixh ; 8 - call div32_16_sub8 ; 17 - rla ; 4 - ld ixh,a ; 8 +; ld a,ixh ; 8 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld ixh,a ; 8 - ld a,ixl ; 8 - call div32_16_sub8 ; 17 - rla ; 4 - ld ixl,a ; 8 +; ld a,ixl ; 8 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld ixl,a ; 8 - ;ex de,hl ; 4 - ret ; 10 +; ;ex de,hl ; 4 +; ret ; 10 -div32_16_sub8: -;119+8*div32_16_sub -;min: 503cc -;max: 655cc -;avg: 573cc - call 1F -1: -;17+2(17+2(div32_16_sub))) - call 1F -1: -;17+2(div32_16_sub) - call div32_16_sub -div32_16_sub: -;48+{8,0+{0,19}} -;min: 48cc -;max: 67cc -;avg: 56.75cc - rla ; 4 - adc hl,hl ; 15 - jr c,1F ;12/7 - add hl,bc ; 11 - ret c ;11/5 - sbc hl,bc ; 15 - ret ; 10 -1: - add hl,bc ; 11 - scf ; 4 - ret ; 10 +; div32_16_sub8: +; ;119+8*div32_16_sub +; ;min: 503cc +; ;max: 655cc +; ;avg: 573cc +; call 1F +; 1: +; ;17+2(17+2(div32_16_sub))) +; call 1F +; 1: +; ;17+2(div32_16_sub) +; call div32_16_sub +; div32_16_sub: +; ;48+{8,0+{0,19}} +; ;min: 48cc +; ;max: 67cc +; ;avg: 56.75cc +; rla ; 4 +; adc hl,hl ; 15 +; jr c,1F ;12/7 +; add hl,bc ; 11 +; ret c ;11/5 +; sbc hl,bc ; 15 +; ret ; 10 +; 1: +; add hl,bc ; 11 +; scf ; 4 +; ret ; 10 - ENDIF -*/ +; ENDIF ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 8f5f232..6a34de5 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -831 \ No newline at end of file +843 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 919a011..9140f36 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -29,7 +29,7 @@ echo_mode: ;------------------------------------------------- RUN_BAT: call BATCH - jp c,A83DD ; ошибка откр. файла (cpp.asm) + jp c,EXEERR ; ошибка откр. файла (cpp.asm) ret ;------------------------------------------------- diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index b6f4b53..ffc4680 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -9,16 +9,14 @@ ;/////////////////////////////////////////////////// cmd_date: ex de,hl ; hl=ком-строка - ;ld de,T9186 ; буфер ld de,work_buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ;ld de,T9186 ld de,work_buffer1; ld a,(de) or a - jr z,cmd_dt1 - call A893C + jr z,.cmd_dt1 + call STR2DEC jp c,invalid_param ; "Invalid parametr" xor a cp h @@ -28,7 +26,7 @@ cmd_date: jp c,invalid_param ; "Invalid parametr" ld b,l push bc - call A893C + call STR2DEC pop bc jp c,invalid_param ; "Invalid parametr" xor a @@ -39,7 +37,7 @@ cmd_date: jp c,invalid_param ; "Invalid parametr" ld c,l push bc - call A893C + call STR2DEC push hl ld c,Dss.SysTime RST ToDSS @@ -47,30 +45,55 @@ cmd_date: pop de ld c,Dss.SetTime RST ToDSS -cmd_dt1:ld c,Dss.SysTime +.cmd_dt1: + ld c,Dss.SysTime RST ToDSS + PUSH BC ; [ ] вывод дня недели 26/01/2023 push ix push de ld a,d ; число ld hl,PRM1 ; куда - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,"." ld (hl),a inc hl pop de ld a,e ; число - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,"." ld (hl),a inc hl push hl pop ix pop hl - call A8964 + call PDIGIT + ; [ ] вывод дня недели 26/01/2023 + POP DE + LD D,0 + LD A,E + CP 8 + JR C,.skip + LD E,8 +.skip: LD HL,.days + LD BC,.days.size + CALL LCPIR + ; + LD DE,PRM2 + CALL ncopy_string + ; ld de,MAIN_MSG.DATE ; индекс "Current date: %1" jp MESSAGE ; вывести строку - - + ; +.days: DB 0 + DZ "Sunday" + DZ "Monday" + DZ "Tuesday" + DZ "Wednesday" + DZ "Thursday" + DZ "Friday" + DZ "Saturday" + DZ "check CMOS!" +.days.size EQU $ - .days ;/////////////////////////////////////////////////// @@ -89,7 +112,7 @@ cmd_time: ld a,(de) or a jr z,cmd_tm1 - call A893C + call STR2DEC jp c,invalid_param ; "Invalid parametr" xor a cp h @@ -99,7 +122,7 @@ cmd_time: jp c,invalid_param ; "Invalid parametr" ld b,l push bc - call A893C + call STR2DEC pop bc jp c,invalid_param ; "Invalid parametr" xor a @@ -110,7 +133,7 @@ cmd_time: jp c,invalid_param ; "Invalid parametr" ld c,l push bc - call A893C + call STR2DEC pop bc jp c,invalid_param ; "Invalid parametr" xor a @@ -134,18 +157,18 @@ cmd_tm1:ld c,Dss.SysTime push hl ld a,h ; число ld hl,PRM1 ; куда - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,":" ld (hl),a inc hl pop de ld a,e ; число - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,":" ld (hl),a inc hl pop af ; число - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер xor a ld (hl),a ; в конец строки ld de,MAIN_MSG.TIME ; индекс "Current time: %1" diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 3cdaabc..40c908f 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -146,7 +146,7 @@ cmd_dir: ; Десятичный вывод .print: ld hl,(D88DC) ld ix,PRM1 ; буфер - call A8964 + call PDIGIT ; ld hl,(D88DE) ; мл. разряд exx @@ -209,7 +209,7 @@ cmd_dir: ; Десятичный вывод ld hl,(dir_number) ld ix,PRM3 ; буфер - call A8964 + call PDIGIT ;xor a ;ld (de),a ; diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 9e030b2..5828524 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -13,14 +13,14 @@ cmd_echo: push de ld b,3 ; длина сравнения ld hl,T8C21 ; "ON",0 - call A874E ; сравнить строки + call COMPARE ; сравнить строки pop de ld a,true ; режим "on" jr z,A864B push de ld b,4 ; длина сравнения ld hl,T8C24 ; "OFF",0 - call A874E ; сравнить строки + call COMPARE ; сравнить строки pop hl ld a,false ; режим "off" jr z,A864B diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index a51ebaa..513fef9 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -1,5 +1,5 @@ ; раб. ячейка -D8374: dw 0 +SAVEHL: dw 0 @@ -92,26 +92,25 @@ COMP: call EVALCMD ; (batch.asm) ; задан не диск RUN_EXT: ex de,hl ; восст. адрес начала строки - ld (D8374),hl ; struct_input_line+5 - ld de,T8C1A ; буфер + ld (SAVEHL),hl ; struct_input_line+5 + ld de,EXTBF ; буфер ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS - ld hl,(D8374) ; имя файла - jr c,A83D7 ; выполнить exe-файл + ld hl,(SAVEHL) ; имя файла + jr c,RUN_EXE ; выполнить exe-файл bit 1,a ; есть расш. ? - jr z,A839D ; нет + jr z,.NON_EXT ; нет ; есть расш. файла - ld de,T8C1A ; буфер расш. файла - ld hl,T8C1E ; "BAT" + ld de,EXTBF ; буфер расш. файла + ld hl,BATBF ; "BAT" ld b,3 ; длина сравнения ;!HARDCODE - call A874E ; сравнить строки - ld hl,(D8374) + call COMPARE ; сравнить строки + ld hl,(SAVEHL) jp z,RUN_BAT ; выполнить bat-файл (batch.asm) - jr A83D7 ; выполнить exe-файл - -A839D: ld bc,0*256 + Dss.Exec ; загр. и выполнить программу + jr RUN_EXE ; выполнить exe-файл +.NON_EXT: + ld bc,0*256 + Dss.Exec ; загр. и выполнить программу RST ToDSS - ;[x] 01/11/23 ;!TEST PUSH AF CALL RESTORE_ALL @@ -120,20 +119,19 @@ A839D: ld bc,0*256 + Dss.Exec ; ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; - - ld hl,(D8374) + ld hl,(SAVEHL) cp DSS_Error.sys.FILE_NOT_FOUND - jr nz,A83DD + jr nz,EXEERR push hl ;ld a,(D96AD) ; длина строки (inline.asm) ld a,(struct_input_line+4) ; длина строки ld b,a -A83AF: ld a,(hl) +.loop: ld a,(hl) cp " "+1 - jr c,A83B7 + jr c,.next inc hl - djnz A83AF -A83B7: ld e,b + djnz .loop +.next: ld e,b ld d,0 add hl,de push hl @@ -159,7 +157,8 @@ A83B7: ld e,b ; Выполнить exe-файл ; hl=имя файла -A83D7: ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл +RUN_EXE: + ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл RST ToDSS ;[x] 01/11/23 ;!TEST @@ -171,7 +170,7 @@ A83D7: ld bc,0*256 + Dss.Exec ; ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; -A83DD: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" +EXEERR: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" jp nc,print_err_message ; вывод сообщения xor a ; индекс "Bad command or file name" jp print_err_message diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index cea673c..ce7440c 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -32,7 +32,7 @@ MAIN_MSG: db "Volume Serial Number is %2",CR,LF db CR,LF,"Directory of %3",CR,LF,LF,0 stN .VERS_ : db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 - stN .DATE_ : db "Current date: %1",CR,LF,0 + stN .DATE_ : db "Current date: %1, %2",CR,LF,0 ; [ ] вывод дня недели 26/01/2023 stN .TIME_ : db "Current time: %1",CR,LF,0 stN .PAUSE_ : db "Press any key to continue . . .",CR,0 stN .INV_ : db "Invalid parametr",CR,LF,0 diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm index 9e3ac42..1809cf1 100644 --- a/SHELL/Procedures/math.asm +++ b/SHELL/Procedures/math.asm @@ -26,7 +26,7 @@ hex8: push af ;----------------------------------------------------------------------; -;!FIXIT есть дубль hex2dec_ascii_16bit +;!FIXIT есть дубль PDIGIT ; вход: hl=число, de=буфер hex2dec_ascii_16bit: .n10: ld ix,.tmp1 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index ca68d38..4a5593e 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -359,17 +359,18 @@ newline: push hl ; in: de=string1 ; hl=string2 ; b=длина строки -A874E: ld a,(de) +COMPARE: + ld a,(de) cp "a" - jr c,$+8 + jr c,.next cp "z"+1 - jr nc,$+4 + jr nc,.next and 5Fh ; a..z -> A..Z - cp (hl) +.next: cp (hl) ret nz inc hl inc de - djnz A874E + djnz COMPARE ret @@ -401,10 +402,10 @@ copy_string: ; Десятичный вывод в буфер ; вход: a=число ; hl=буфер -A8913: ld c,2Fh - inc c +PUTB: ld c,2Fh +.loop: inc c sub 10 - jr nc,$-3 + jr nc,.loop add a,10 add a,"0" push af @@ -418,8 +419,9 @@ A8913: ld c,2Fh -A893C: ld hl,0 -A893F: ld a,(de) +STR2DEC: + ld hl,0 +.loop: ld a,(de) inc de or a ret z @@ -435,17 +437,15 @@ A893F: ld a,(de) add hl,hl add hl,bc add hl,hl - call A895A + call .ATODEC ret c add a,l ld l,a - jr nc,A893F + jr nc,.loop inc h - jr A893F - - -; char -> int -A895A: cp "0" + jr .loop +.ATODEC:; char -> int + cp "0" ret c cp "9"+1 ccf @@ -453,17 +453,17 @@ A895A: cp "0" sub "0" ret -;!FIXIT есть дубл -A8964: ld de,10000 +;!FIXIT есть дубл hex2dec_ascii_16bit +PDIGIT: ld de,10000 ld a,#C8 ; ret z - ld (D8996),a - call A898E + ld (.patch),a + call .DIG ld de,1000 - call A898E + call .DIG ld de,100 - call A898E + call .DIG ld de,10 - call A898E + call .DIG ld a,l add a,"0" ;!TEST @@ -474,20 +474,18 @@ A8964: ld de,10000 LD (IX+1),0 ; ret - - -A898E: xor a +.DIG: xor a inc a sbc hl,de jr nc,$-3 add hl,de dec a -D8996: ret z +.patch: ret z add a,"0" ld (ix+0),a inc ix xor a ; nop - ld (D8996),a + ld (.patch),a ret @@ -522,11 +520,10 @@ RUNMODE: db 0 -; буфер расш. файла -T8C1A: ds 3 - db 0 +; буфер расш. файла с ограничителем 0 +EXTBF: BLOCK 4,0 -T8C1E: db "BAT" ; расш. bat-файла +BATBF: db "BAT" ; расш. bat-файла T8C21: db "ON",0 T8C24: db "OFF",0 diff --git a/SHELL/build.txt b/SHELL/build.txt index da4c6e9..58dc5af 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -297 \ No newline at end of file +303 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index a6dee8e..e7e58e7 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a6dee8e17ae12b251f306290793a56a6b0dd5ae3 +Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e From 1c2f824e480e5ccd802622409aa7bedf5505dbff Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 2 Feb 2024 01:18:47 +1000 Subject: [PATCH 082/219] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B3=D0=B8=20=D0=B2=20rescandrv,=20sys.exe,=20dis?= =?UTF-8?q?kINF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 16 +++++- DSS/API/ScanDRV.asm | 18 +++++- DSS/API/bootDsk.asm | 1 - DSS/API/diskINF.asm | 88 +++++++++++++++++++----------- DSS/DRV-MAIN.ASM | 2 +- DSS/Media_drivers/ReScanDRV.ASM | 15 ++++- DSS/Media_drivers/fdd-drv.asm | 2 +- DSS/Media_drivers/ide-drv.asm | 4 +- DSS/Media_drivers/ram_disk-drv.asm | 5 +- DSS/build.txt | 2 +- Shared_Includes | 2 +- 11 files changed, 108 insertions(+), 47 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index ef2ace2..ddab7f7 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -276,7 +276,7 @@ write_boot_loader: ; pop hl ; восст. баланс стека ; call close_device cp #F8 ; винт - jr z,write_to_hard_disk + jp z,write_to_hard_disk scf ; незнакомый формат ret @@ -350,7 +350,21 @@ write_to_: ld a,(disk) ; ret z ; !TODO загрузка с расширенного раздела не поддерживается dec c push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + ; [ ] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) + LD HL,0 + LD IX,0 + LD DE,buffer + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP BC + LD HL,(buffer + _sBOOT_SEC.RESERVE) + LD DE,04 ;!HARDCODE минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) + AND A + SBC HL,DE + RET C ; + push bc + ld a,b ld hl,0 ; ст. разряд лог. сектора ld ix,1 ; мл. разряд ld de,code_loader ; откуда (код загрузчика) diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index 38da595..bc0b42e 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -27,9 +27,23 @@ SCANDRV: RST ToDSS.DRV LD (LDRIVE),A ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 4. выход +; 4. на всякий случай перечитываем дирректорию ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - POP AF + LD A,(CurrentPath) + SUB 'A' + CALL CHNDISK + ; + LD HL,CurrentDirectory + CALL CHDIR + JR NC,.exit + LD HL,CurrentDirectory + LD (HL),0 + ; LD HL,CurrentPath + ; CALL CHDIR +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 5. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +.exit: POP AF RET PO EI RET diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index 1db9326..2bfaca7 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -3,7 +3,6 @@ ; Возвращает номер диска, c которого загружена система. ; ; При B = 0 (GET) -; вход: B = 0 (01h - исп. boot-загрузчик системы) ; выход: A - номер системного диска (0=A,1=B,..) ; При B = 1 (SET - исп. boot-загрузчик системы, после чего функция недоступна) ; вход: A - номер устройства, L - номер раздела на устройстве diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 305c78e..ea36f1c 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -7,20 +7,24 @@ ; При A bit7 = 1: ; HL - буфер (256 байтов) для расширенных данных: ; B != 0 - считать свободное место -; ; -; размер поля - 1 байт -; Файловая система -; ; -; размер поля - 1 байт -; Серийный номер диска -; ; -; размер поля - 1 байт -; Метка диска -; ; -; размер поля - 1 байт -; Зарезервировано... -; ; -; A xor #80 - номер диска +; ; +; размер поля - 1 байт +; Файловая система +; ; +; размер поля - 1 байт +; Серийный номер диска +; ; +; размер поля - 1 байт +; Метка диска +; ; +; размер поля - 1 байт +; физический номер диска, номер раздела +; ; +; размер поля - 1 байт +; зарезервировано +; ; + +; A and #7F - номер диска ; ; выход: A - размер кластера в секторах, если CF=0 ; HL - общее кол-во кластеров @@ -28,15 +32,6 @@ ; BC - размер сектора в байтах ; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// - ; [ ] 22/11/23 подфункция с доп.инфой - MACRO _mCOPY_LOOP - LD C,A - LD B,0 - LD (DE),A - INC DE - LDIR - ENDM - ; DISKINF:; [ ] 22/11/23 подфункция с доп.инфой LD C,B LD B,1 @@ -47,37 +42,56 @@ DISKINF:; [ ] 22/11/23 JR Z,.CurrentDisk ; more info LD B,C - PUSH HL AND %0111'1111 + PUSH HL + PUSH AF CALL .CustomDisk + POP IX JR C,.error ; EX (SP),HL - PUSH AF PUSH DE + PUSH AF PUSH BC ;;;; ; EX DE,HL LD HL,CORE_BUFFERS.BootSector.ID_FAT LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length - _mCOPY_LOOP + CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER - _mCOPY_LOOP + CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_LABEL LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL - _mCOPY_LOOP + CALL .mCOPY_LOOP ; - + PUSH DE + LD A,XH + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + POP DE + JR C,.error_drv + LD A,2 ;!HARDCODE длина поля №4 2 байта: физ номер диска, номер раздела диска + LD (DE),A + INC DE + EX AF,AF' + LD (DE),A ;физ номер диска + INC DE + LD A,C + LD (DE),A ;номер раздела диска + INC DE + ; +.error_drv: XOR A LD (DE),A ;;;; POP BC - POP DE POP AF + POP DE .error: POP HL RET ; @@ -96,7 +110,7 @@ DISKINF:; [ ] 22/11/23 PUSH BC CALL CHNDISK ;R06 POP BC - RET C ;R06 + RET C ; .CheckFreeSpace: ; @@ -130,4 +144,14 @@ DISKINF:; [ ] 22/11/23 INC BC .skip: INC HL JP .FRESP -; \ No newline at end of file + ; + ; [ ] 22/11/23 подфункция с доп.инфой +.mCOPY_LOOP: + LD C,A + LD B,0 + LD (DE),A + INC DE + LDIR + RET + ; +; diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 90c2501..1f9355b 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -191,7 +191,7 @@ A0066: JP DRV_PAGE.NMI ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE PAGE SWITCH]> ; - _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 + BLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: PUSH BC ; .RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV использует это значение .switch: OUT (C),B ; diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index 73610bb..e5a5258 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -387,6 +387,18 @@ HARD_DRV: JR NZ,.skip LD A,(IY+LOGDRV.SECTOR_OFFSET+3) CP (IX+LOGDRV.SECTOR_OFFSET+3) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS) + CP (IX+LOGDRV.SIZE_IN_SECTORS) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+1) + CP (IX+LOGDRV.SIZE_IN_SECTORS+1) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+2) + CP (IX+LOGDRV.SIZE_IN_SECTORS+2) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+3) + CP (IX+LOGDRV.SIZE_IN_SECTORS+3) JR Z,.found ; .skip: ADD IX,DE @@ -414,8 +426,7 @@ HARD_DRV: ;-----[] ; ВХОД: HL - текущая запись в таблице DEVICE ; B - шаг общего цикла -KILL_FM: - ; +KILL_FM:; LD A,DSS_MAX_DRIVES_AMOUNT SUB B LD C,A diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index a1cff9b..a3cd2c3 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -250,8 +250,8 @@ FDDRIVE: RET -; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK ; BC' - SECTORS PER TRACK ON PHISICAL DISK diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 9124cd3..7e7e049 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -275,7 +275,7 @@ DRVCLC: ; INC A ; ;+05 DWORD SIZE IN SECTORS ; ;+09 FREE ; ;+15 -; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы +; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV @@ -349,8 +349,8 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET -; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK ; BC' - SECTORS PER TRACK ON PHISICAL DISK diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index a43a897..13c811b 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -508,9 +508,8 @@ IOCTL_RD: RL D RRA JR NC,.loopShift - -.end: - EX AF,AF' + ; +.end: EX AF,AF' POP AF EX AF,AF' XOR A diff --git a/DSS/build.txt b/DSS/build.txt index 6a34de5..0dd217a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -843 \ No newline at end of file +880 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index e7e58e7..b5606d6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e +Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569 From 1d24621a2823170125b85f1ff3333b0f6ab44e84 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 3 Feb 2024 02:33:20 +1000 Subject: [PATCH 083/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index b5606d6..4d37c33 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569 +Subproject commit 4d37c338c31c060e7a42f1e47fad93b69af34a5b From 66e5661218096935c4c7a7994bed9be9ee2914c2 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 14 Feb 2024 01:50:08 +1000 Subject: [PATCH 084/219] =?UTF-8?q?=D1=87=D1=83=D1=82=D0=BA=D0=B0=20=D0=BE?= =?UTF-8?q?=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=BF=D0=BE=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D1=83=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=20?= =?UTF-8?q?=D0=BC=D1=8B=D1=88=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 2 +- DSS/API.asm | 1 + DSS/API/Find.asm | 2 +- DSS/API/Lib_Sub.asm | 14 + DSS/API/Read.asm | 2 +- DSS/DSS-MAIN.ASM | 4 +- DSS/FS/FAT/FAT.asm | 57 ++-- DSS/FS/FAT/FAT12_16.asm | 6 +- DSS/INTMOUSE.ASM | 519 ++++++++++++++--------------- DSS/KEYINTER.ASM | 21 +- DSS/Media_drivers/ReScanDRV.ASM | 2 +- DSS/Media_drivers/fdd-drv.asm | 2 +- DSS/Media_drivers/ram_disk-drv.asm | 2 +- DSS/VIDEO.ASM | 66 ++-- DSS/build.txt | 2 +- DSS/defines.inc | 18 + SHELL/Commands/CHDIR.ASM | 4 - SHELL/Commands/DIR.ASM | 2 +- Shared_Includes | 2 +- 19 files changed, 367 insertions(+), 361 deletions(-) create mode 100644 DSS/API/Lib_Sub.asm diff --git a/BOOT/boot.asm b/BOOT/boot.asm index ddab7f7..aee1f22 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -350,7 +350,7 @@ write_to_: ld a,(disk) ; ret z ; !TODO загрузка с расширенного раздела не поддерживается dec c push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR - ; [ ] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) + ; [x] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) LD HL,0 LD IX,0 LD DE,buffer diff --git a/DSS/API.asm b/DSS/API.asm index e30b22f..10c7d9d 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -58,6 +58,7 @@ include 'API/Read.asm' include 'API/Write.asm' include 'API/Environ.ASM' + include 'API/Lib_Sub.asm' diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index c3c3972..e6875b5 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -3,7 +3,7 @@ ; C - #19 ; HL - указатель на файловую спецификацию ; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт -; ;!!!!! на самом деле сейчас если B=1, рабочий буфер 46 байт +; ;!!!!! на самом деле пока что если B=1, рабочий буфер 46 байт ; A - атрибуты, используемые при поиске ; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" ; B = 1 - имя найденного файла в формате DOS "filename.ext",0 diff --git a/DSS/API/Lib_Sub.asm b/DSS/API/Lib_Sub.asm new file mode 100644 index 0000000..faaeac5 --- /dev/null +++ b/DSS/API/Lib_Sub.asm @@ -0,0 +1,14 @@ +;[ ] 11/02/2024 - Функция с пополняемыми подфункциями))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; B = 1 Вызов функции SETUP_CURSORS для восстановления системных шрифтов DSS ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +LIB_SUB: + DJNZ 1F + ; func B = 1 + JP SETUP_CURSORS + ; +1: ; func B > 1 or 0 + SCF + RET + ; +; \ No newline at end of file diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index e5b1a00..c314c4e 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -28,7 +28,7 @@ READ: LD (.R_POINT),HL ; RR L ; RR D ; RR E - LD H,0 + LD H,0 ; LD L,(IY+_sFM.F_POSITION+3) LD D,(IY+_sFM.F_POSITION+2) LD E,(IY+_sFM.F_POSITION+1) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index b0c8375..68f82ab 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -392,7 +392,7 @@ ADRST10: ;DS 512 ;,0 DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low WAIT, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 - DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT ; 9 5A..5F + DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F IFN SHORT_RSTx10_TABLE ;[ ] R09 @@ -419,7 +419,7 @@ ADRST10: ;DS 512 ;,0 DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high WAIT, high GSWITCH,high DOSNAME, high EX_PATH DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY - DB high WINREST, high PUTCHAR, high PCHARS, high NOPS, high NOPS, high PRINT + DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT IFN SHORT_RSTx10_TABLE ;[ ] R09 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index fe65b7c..a473c61 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -340,10 +340,15 @@ LOADDIR: ; LD A,(FatBuffer.DRIVE) ; номер диска LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор - LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера - LD E,(IY+_sFM.ST_CLUSTER+1) - LD A,D - OR E + ; + ;LD D,(IY+_sFM.ST_CLUSTER+1) ; de=номер первого кластера + ;LD E,(IY+_sFM.ST_CLUSTER) + ;LD A,D + ;OR E + ; номер первого кластера + LD A,(IY+_sFM.ST_CLUSTER) + OR (IY+_sFM.ST_CLUSTER+1) + ; JP Z,.LROTDIR ; root ?? LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько @@ -567,7 +572,7 @@ RD_BPB: LD C,SLOT3 .loop1: ADD HL,DE DEC A JR NZ,.loop1 - LD (FatBuffer.DIR_FRM),HL ; first sector DIR + LD (FatBuffer.DIR_FRL),HL ; first sector DIR ; CF = ? мало ли AND A ; CF = 0 @@ -615,7 +620,7 @@ RD_BPB: LD C,SLOT3 LD B,0 LD (FatBuffer.DIR_S_S),A ADD HL,BC ; Start DATA area - LD (FatBuffer.DAT_FRM),HL + LD (FatBuffer.DAT_FRL),HL ;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer //////////////////////////////////////////////////////////////////////// ;IF COMPILE_UNUSED_CODE @@ -706,7 +711,7 @@ RD_BPB: LD C,SLOT3 ;ENDIF //////////////////////////////////////////////////////////////////////// - LD DE,(FatBuffer.DAT_FRM) + LD DE,(FatBuffer.DAT_FRL) ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec ; LD D,(IY+_sBOOT_SEC.HIDDEN+1) ; AND A @@ -805,26 +810,26 @@ DOS_X_Error: ; ;!TODO к буферам! FatBuffer: -.MSG: DB 'FAT' -.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) -.BLOCK: DB #00 -.DIR_CLU: DW #0000 -.DRIVE: DB #FF -.FAT_FRM: -.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT -.FAT2_XX: DW #0000 -.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR -.DIR_FRL: -.DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR -.F_P_S: DB #00 ; число файловых записей в секторе -.DIR_S_S: DB #00 ; DIR_SEC_SIZE -.DAT_FRM: DW #0000 ; MSD_DAT_SEC +.MSG: DB 'FAT' +.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +.BLOCK: DB #00 +.DIR_CLU: DW #0000 +.DRIVE: DB #FF +.FAT_FRM: +.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT +.FAT2_XX: DW #0000 +.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.DIR_FRL: DW #0000 ; MSD_CAT_SEC first sector DIR +.F_P_S: DB #00 ; число файловых записей в секторе +.DIR_S_S: DB #00 ; DIR_SEC_SIZE +.DAT_FRL: DW #0000 ; MSD_DAT_SEC low +;.DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ;!FIXIT не используется .CLU_LEN: -.B_P_C: DW #0000 ; CLUSTER_LEN -.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) -.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? -.ENDCLUS: DW #FFFF +.B_P_C: DW #0000 ; CLUSTER_LEN +.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? +.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) +.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? +.ENDCLUS: DW #FFFF ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 6ea9706..0443740 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -442,7 +442,7 @@ GET_FAT12_CELL: ; in: HL - CLUSTER ; out: HL:IX - SECTOR NSECTOR: - LD DE,0 + LD DE,0 ;!FIXIT for FAT32 DEC HL DEC HL LD A,(CORE_BUFFERS.BootSector.S_P_C) @@ -460,7 +460,7 @@ NSECTOR: .skip: EX DE,HL LD XL,E LD XH,D - LD DE,(FatBuffer.DAT_FRM) ;first data sector + LD DE,(FatBuffer.DAT_FRL) ;first data sector XOR A ADD IX,DE LD D,A @@ -962,7 +962,7 @@ FAT_Max_Cluster: WORD #0FF0 ; ; JR NC,ADD_DE2 ; INC HL ; ADD_DE2: DJNZ ADD_DE1 -; LD DE,(FatBuffer.DAT_FRM) ;first data sector +; LD DE,(FatBuffer.DAT_FRL) ;first data sector ; ADD IX,DE ; LD DE,#0000 ; ADC HL,DE diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 835a3cf..6002636 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -158,9 +158,9 @@ M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND ;!TODO на биос. MS_INIT DI ;!TEST mouse - ;LD A,85 + ;LD A,#55 ;OUT (#10),A - ;LD A,45 + ;LD A,#2D ;OUT (#10),A ; XOR A ;LD A,0 @@ -176,9 +176,7 @@ MS_INIT DI LD A,4 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 + LD A,MOUSE_BAUD.multiplier_1 ; первый множитель OUT (PORT_MOUSE.Ctrl),A ; LD A,5 @@ -192,8 +190,7 @@ MS_INIT DI ;!TEST mouse LD A,#55 OUT (Z84.CTC.Ch_0),A - LD A,#2D ; второй множитель = 45 875000/Мн1*Мн2=1215 - ;LD A,#B6 ; второй множитель = 182 875000/Мн1*Мн2=4807 + LD A,MOUSE_BAUD.multiplier_2 ; второй множитель OUT (Z84.CTC.Ch_0),A ; @@ -211,7 +208,7 @@ MS_SHOW PUSH IX DI CALL MOUSE XOR A - LD (REFRESH+1),A + LD (REFRESH.hide),A EI POP AF EX AF,AF' @@ -228,7 +225,7 @@ MS_HIDD PUSH IX PUSH AF DI LD A,1 - LD (REFRESH+1),A + LD (REFRESH.hide),A CALL RESTORE EI POP AF @@ -373,272 +370,253 @@ MS_GSEN LD HL,(SENSEXY) XOR A RET +;----------------------------------------------------------------------; -MOUSET LD (REST_XT+1),HL - LD (REST_YT+1),DE -;Y - SRL D - RR E - SRL D - RR E - SRL D - RR E - LD D,E -;X - SRL H - RR L - SRL H - RR L - SRL H - RR L - LD E,L - - IN A,(PORT_Y) - LD XH,A - IN A,(SLOT1) - LD XL,A -; - DI -; - LD A,#54 ;!HARDCODE video page - OUT (SLOT1),A -; - LD A,D - ADD A,A - ADD A,A ;Y * 4 - LD L,A - LD H,#43 ;+ #4300 -; - IN A,(RGMOD) - RRCA - AND #80 - OR #01 - ADD A,E - OUT (PORT_Y),A - INC L - LD A,(HL) ;SIMBOL - LD BC,(ANDXORS) - AND B - XOR C - LD (HL),A - INC L - LD A,(HL) ;ATTRIBUT - LD BC,(ANDXORA) - AND B - XOR C - LD (HL),A -; - LD A,XL - OUT (SLOT1),A - LD A,XH - OUT (PORT_Y),A - RET - -RESTORT: -REST_XT: LD HL,#0000 -REST_YT: LD DE,#0000 -;Y - SRL D - RR E - SRL D - RR E - SRL D - RR E - LD D,E -;X - SRL H - RR L - SRL H - RR L - SRL H - RR L - LD E,L - - IN A,(PORT_Y) - LD XH,A - IN A,(SLOT1) - LD XL,A -; - DI -; - LD A,#50 - OUT (SLOT1),A -; - LD A,D - ADD A,A - ADD A,A ;Y * 4 - LD L,A - LD H,#43 ;+ #4300 -; - IN A,(RGMOD) - RRCA - AND #80 - OR #01 - ADD A,E - OUT (PORT_Y),A - INC L - LD A,(HL) ;SIMBOL - LD (HL),A - INC L - LD A,(HL) ;ATTRIBUT - LD (HL),A -; - LD A,XL - OUT (SLOT1),A - LD A,XH - OUT (PORT_Y),A - RET +;----------------------------------------------------------------------; RESTORE: -.sw+1: LD A,#00 - BIT 7,A - JP Z,RESTORT -RESTORG IN A,(SLOT3) - LD B,A - IN A,(PORT_Y) - LD C,A - PUSH BC - LD A,#50 ;!HARDCODE videopage - OUT (SLOT3),A -REST_X LD HL,0 -REST_Y LD DE,0 - LD A,E - EX AF,AF' -REST_V LD A,#00 - AND 1 - LD DE,#C000 ;screen 0 - JR Z,AA2 - LD DE,#C000+320 ;screen 1 -AA2 ADD HL,DE -REST_A LD A,0 - LD XH,A - EX AF,AF' -REST_H -RS002 LD BC,10 - OUT (PORT_Y),A - EX AF,AF' - LD (PUSH_HL),HL - LD D,H - LD E,L - LDIR -PUSH_HL+1: LD HL,#0000 -; POP HL - EX AF,AF' - INC A - JR Z,RS003 - DEC XH - JR NZ,RS002 -RS003 POP BC - LD A,B - OUT (SLOT3),A - LD A,C - OUT (PORT_Y),A - XOR A - RET - +.sw+1: LD A,#00 + BIT 7,A + JP Z,.TXT + ; restore gfx-mode + IN A,(SLOT3) + LD B,A + IN A,(PORT_Y) + LD C,A + PUSH BC + LD A,#50 ;!HARDCODE videopage + OUT (SLOT3),A +.X+1: LD HL,0 +.Y+1: LD DE,0 + LD A,E + EX AF,AF' +.SCR+1: LD A,0 + AND 1 + LD DE,SLOT3.MEM_ADDR ;screen 0 + JR Z,.adr + LD DE,SLOT3.MEM_ADDR+320 ;screen 1 +.adr: ADD HL,DE +.YSize+1: LD A,0 + LD XH,A + EX AF,AF' +.loop: ; +.Xsize+1: LD BC,10 + OUT (PORT_Y),A + EX AF,AF' + LD (.PUSH_HL),HL + LD D,H + LD E,L + LDIR +.PUSH_HL+1: LD HL,#0000 + EX AF,AF' + INC A + JR Z,.no_dec + DEC XH + JR NZ,.loop +.no_dec: POP BC + LD A,B + OUT (SLOT3),A + LD A,C + OUT (PORT_Y),A + XOR A + RET +.TXT: ; restore txt-mode +.TXT_X+1: LD HL,#0000 +.TXT_Y+1: LD DE,#0000 + ; + IN A,(PORT_Y) + LD XH,A + IN A,(SLOT3) + LD XL,A + ; + LD A,#50 + ; + CALL GET_SYMBOL_ADDR + ; + LD (HL),A + INC L + LD A,(HL) ;ATTRIBUT + ;JR SET_RESTORE_EXIT +;---------------------------------------------------------------; +SET_RESTORE_EXIT: + LD (HL),A + ; + LD A,XL + OUT (SLOT3),A + LD A,XH + OUT (PORT_Y),A + RET +;---------------------------------------------------------------; +GET_SYMBOL_ADDR:;Y + SRL D + RR E + SRL D + RR E + SRL D + RR E + LD D,E + ;X + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD E,L + ; + DI + OUT (SLOT3),A + ; + LD A,D + ADD A,A + ADD A,A ;Y * 4 + LD L,A + LD H,high (SLOT3.MEM_ADDR + #300) ;#300 - описатели экрана + ; + IN A,(SCREEN_SWITCH) + RRCA + AND #80 + OR #01 + ADD A,E + OUT (PORT_Y),A + INC L + LD A,(HL) ;SIMBOL + ; + RET +;---------------------------------------------------------------; +;----------------------------------------------------------------------; ;HL/DE - X/Y +MOUSE: LD A,(MODE_M) + LD (RESTORE.sw),A + BIT 7,A + JP NZ,.GFX + ; + ; set txt-mode +.TXT: LD (RESTORE.TXT_X),HL + LD (RESTORE.TXT_Y),DE + ; + IN A,(PORT_Y) + LD XH,A + IN A,(SLOT3) + LD XL,A + ; + LD A,#54 + ; + CALL GET_SYMBOL_ADDR + ; + LD BC,(ANDXORS) + AND B + XOR C + LD (HL),A + INC L + LD A,(HL) ;ATTRIBUT + LD BC,(ANDXORA) + AND B + XOR C + JR SET_RESTORE_EXIT + ; + ;set gfx-mode +.GFX: CP #82 ;640x256x16 + JR NZ,.NOFIX_640 + SRL H + RR L +.NOFIX_640: LD IX,M_IMAGE + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD (REALXS),BC + LD (RESTORE.Xsize),BC + LD C,B + LD (SKIPXF),BC + LD A,(M_YSIZE) + LD (RESTORE.YSize),A + LD C,A + LD B,0 + LD (REALYS),BC + LD BC,(YHOT_SP) + LD A,E + SUB C + LD E,A + JR NC,.GOOD_Y + NEG + LD E,A + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + SUB E +.SKIPMY: ADD IX,BC + DEC E + JR NZ,.SKIPMY + LD C,A + LD (REALYS),BC +.GOOD_Y: LD BC,(XHOT_SP) + AND A + SBC HL,BC + JR NC,.GOOD_X + LD B,H + LD C,L + LD HL,0 + AND A + SBC HL,BC + LD (SKIPXF),HL + LD A,(M_XSIZE) + SUB L + LD L,A + LD (REALXS),HL + LD HL,0 +.GOOD_X: LD (RESTORE.X),HL + LD (RESTORE.Y),DE + ; + PUSH HL + IN A,(SLOT3) + LD H,A + IN A,(PORT_Y) + LD L,A + EX (SP),HL + LD A,#5C ;!HARDCODE videopage + OUT (SLOT3),A + LD A,E + EX AF,AF' + IN A,(SCREEN_SWITCH) + LD (RESTORE.SCR),A + AND 1 + LD DE,SLOT3.MEM_ADDR ;Screen 0 + JR Z,.adr + LD DE,SLOT3.MEM_ADDR+320 ;Screen 1 +.adr: ADD HL,DE + LD D,XH + LD E,XL + EX DE,HL ;HL - BITMAP + LD BC,(REALYS) + LD XH,C + EX AF,AF' + ; +.loop: LD BC,(SKIPXF) + ADD HL,BC + LD BC,(REALXS) + OUT (PORT_Y),A + EX AF,AF' + LD (.PUSH_DE),DE + LDIR +.PUSH_DE+1: LD DE,#0000 + EX AF,AF' + INC A + JR Z,.exit_loop + DEC XH + JR NZ,.loop + ; +.exit_loop: POP BC + LD A,B + OUT (SLOT3),A + LD A,C + OUT (PORT_Y),A + XOR A + RET +;----------------------------------------------------------------------; -MOUSE: LD A,(MODE_M) - LD (RESTORE.sw),A - BIT 7,A - JP Z,MOUSET -MOUSEG: CP #82 ;640x256x16 - JR NZ,NOFX - SRL H - RR L -NOFX: LD IX,M_IMAGE - LD A,(M_XSIZE) - LD C,A - LD B,0 - LD (REALXS),BC - LD (REST_H+1),BC - LD C,B - LD (SKIPXF),BC - LD A,(M_YSIZE) - LD (REST_A+1),A - LD C,A - LD B,0 - LD (REALYS),BC - LD BC,(YHOT_SP) - LD A,E - SUB C - LD E,A - JR NC,GOODY - NEG - LD E,A - LD A,(M_XSIZE) - LD C,A - LD B,0 - LD A,(M_YSIZE) - SUB E -SKIPMY: ADD IX,BC - DEC E - JR NZ,SKIPMY - LD C,A - LD (REALYS),BC -GOODY: LD BC,(XHOT_SP) - AND A - SBC HL,BC - JR NC,GOODX - LD B,H - LD C,L - LD HL,0 - AND A - SBC HL,BC - LD (SKIPXF),HL - LD A,(M_XSIZE) - SUB L - LD L,A - LD (REALXS),HL - LD HL,0 -GOODX: LD (REST_X+1),HL - LD (REST_Y+1),DE - PUSH HL - IN A,(SLOT3) - LD H,A - IN A,(PORT_Y) - LD L,A - EX (SP),HL - LD A,#5C ;!HARDCODE videopage - OUT (SLOT3),A - LD A,E - EX AF,AF' - IN A,(RGMOD) - LD (REST_V+1),A - AND 1 - LD DE,#C000 ;PAGE 0 - JR Z,AA1 - LD DE,#C000+320 ;PAGE 1 -AA1 ADD HL,DE - LD D,XH - LD E,XL - EX DE,HL ;HL - BITMAP - LD BC,(REALYS) - LD XH,C - EX AF,AF' -MS002 LD BC,(SKIPXF) - ADD HL,BC - LD BC,(REALXS) - OUT (PORT_Y),A - EX AF,AF' - ;PUSH DE - LD (PUSH_DE+1),DE - LDIR -PUSH_DE LD DE,#0000 -; POP DE - EX AF,AF' - INC A - JR Z,MS003 - DEC XH - JR NZ,MS002 -MS003 POP BC - LD A,B - OUT (SLOT3),A - LD A,C - OUT (PORT_Y),A - XOR A - RET +;----------------------------------------------------------------------; READ_M: IN A,(PORT_MOUSE.Ctrl) RRCA @@ -893,7 +871,8 @@ CONTROL CALL READ_M LD (REDY),A RET -REFRESH LD A,#01 +REFRESH: +.hide+1: LD A,#01 OR A RET NZ REDY+1: LD A,#00 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index c6a7716..f95f3ab 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -179,11 +179,8 @@ ECHOKEY: CALL Cursor_On ; CALL Cursor_Off ; выкл. курсор POP AF OR A - ;!FIXIT scroll заменить на вывод символа биосом или WRCHAR - ; LD BC,1*256 + BIOS.LP_PRINT_SYM - ; RST ToBIOS - CALL NZ,PUTCHAR.NO_SCROLL ; добавил вывод "a" на экран - ; + ; [x] -bug with Vasil's version of cursor + CALL NZ,PUTCHAR.NO_SCROLL ; добавил вывод "a" на экран POP BC POP DE LD A,E @@ -261,17 +258,19 @@ cursor_interrupt: ; Настройка знакогенератора курсора черточкой SETUP_CURSORS: - in a,(SLOT2) +.buffer EQU #C000 + ; + in a,(SLOT3) push af ; сохр. порт ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС - out (SLOT2),a + out (SLOT3),a ; получить сист. знакоген. - ld de,#8000 ;!HARDCODE буфер для 2048 байт данных + ld de,.buffer ;!HARDCODE буфер для 2048 байт данных push de ld c,BIOS.WIN_GET_ZG ; получить знакоген. rst ToBIOS ; заполнить кодом #FF 2 нижние линии - ld hl,#8000+(2048-(2*256)) ;!HARDCODE последние 512 байт + ld hl,.buffer+(2048-(2*256)) ;!HARDCODE последние 512 байт ld bc,511 ld a,CURSOR_ZG; ; номер знакоген. "черточка" call .fill_data_font @@ -281,7 +280,7 @@ SETUP_CURSORS: ld a,INS_CUR_ZG ; номер знакоген. "блок" call .fill_data_font pop af - out (SLOT2),a ; восст. порт + out (SLOT3),a ; восст. порт ret ; Настройка знакоген. и его регистрация ; вход: a=номер знакоген. @@ -293,7 +292,7 @@ SETUP_CURSORS: ld (hl),#FF inc de ldir - ld de,#8000 ; знакоген. + ld de,.buffer ; знакоген. ld c,BIOS.WIN_SET_ZG ; уст. знакоген. rst ToBIOS ret diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index e5a5258..df9d2a6 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -286,7 +286,7 @@ ERROR_BOOTDRV_DIES: RST ToBIOS ; LD A,1 - OUT (RGMOD),A ; set scr-2 + OUT (SCREEN_SWITCH),A ; set scr-2 ; LD HL,.ERROR_MSG LD DE,#A000 diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index a3cd2c3..ba62c50 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -313,7 +313,7 @@ FDDRIVE: LD H,B EX DE,HL EXX - LD C,0 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD C,0 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого AND A RET diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 13c811b..bf072fc 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -455,7 +455,7 @@ IOCTL_RD: SCF RET -; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 33e0530..ca7354a 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -47,20 +47,14 @@ PCHARS: LD A,(HL) ; выход: нет ;///////////////////////////////////////////////////////////////////// PUTCHAR: - CP #0D - JR Z,.CR_ - CP #0A - JR Z,.LF_ - CP #09 - JR Z,.TB_ - CP #08 - JR Z,.BK_ - CP #07 - JR Z,.BELL ; [x] Beep in PChars/PUTCHAR + ;CALL .NO_SCROLL + CP #0E + JR C,.control_characters ; -.CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM + LD BC,1*256 + BIOS.LP_PRINT_SYM ;[x] CR+LF+SCROLL RST ToBIOS + ; ; проверка на переход курсора в самое начало (X:Y == 0:0) CALL CURSOR LD A,D @@ -80,8 +74,7 @@ PUTCHAR: CALL LOCATE POP HL RET -.TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS +.TB_: CALL CURSOR IF TABisSPACES LD B,E LD A,E @@ -99,15 +92,13 @@ PUTCHAR: LD E,A JP LOCATE ENDIF -.BK_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS +.BK_: CALL CURSOR XOR A CP E RET Z DEC E JP LOCATE -.LF_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS +.LF_: CALL CURSOR LD A,D CP #1F JR NC,.LFF @@ -118,8 +109,7 @@ PUTCHAR: CALL LOCATE ; !!!! НЕ разрывать LF_ и CR_ !!!! ENDIF -.CR_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR - RST ToBIOS +.CR_: CALL CURSOR LD E,0 JP LOCATE ; [x] Beep in PChars/PUTCHAR @@ -132,6 +122,12 @@ PUTCHAR: ; ; [x] -bug with Vasil's version of cursor .NO_SCROLL: + CP #0E + JR C,.control_characters +._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM + JP ToBIOS + ; +.control_characters: CP #0D JR Z,.CR_ CP #0A @@ -142,8 +138,7 @@ PUTCHAR: JR Z,.BK_ CP #07 JR Z,.BELL ; [x] Beep in PChars/PUTCHAR -._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - JP ToBIOS + RET ;-----[] ; ; @@ -397,14 +392,14 @@ GETVMOD: ; Функция #50. Выбор режима экрана. ; ; вход: A - режим экрана -; 02h - текстовый 40x32x16 цветов -; 03h - текстовый 80x32x16 цветов -; 81h - графический 320x256x256 цветов -; 82h - графический 640x256x16 цветов +; #02 - текстовый 40x32x16 цветов +; #03 - текстовый 80x32x16 цветов +; #81 - графический 320x256x256 цветов +; #82 - графический 640x256x16 цветов ; B - страница экрана 0/1 ; выход: A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// -SETVMOD:;BIT 7,A +SETVMOD:; CP %1000'0000 LD C,A JR NC,GRAPH @@ -412,10 +407,8 @@ SETVMOD:;BIT 7,A PUSH IX EX AF,AF' LD A,(VMODE) - LD (VVMODE),A + LD (BACKTXT.VMODE),A EX AF,AF' - //INC A - //DEC A OR A JR Z,.NOMODE DEC A @@ -626,17 +619,18 @@ SAVETXT: PUSH AF PUSH AF LD C,BIOS.LP_GET_PLACE RST ToBIOS - LD (TCURS),DE + LD (BACKTXT.CURS),DE POP AF LD IX,#C000 LD HL,#2050 OR A JR NZ,.SVTEXT1 LD L,#28 -.SVTEXT1: LD (SVHL1),HL +.SVTEXT1: LD (BACKTXT.WinMax),HL LD DE,#0000 LD A,(BANKTBL+TXTPAGE) LD B,A + LD C,BIOS.WIN_COPY ;[x] 29/9/23 LD A,R @@ -659,7 +653,7 @@ SAVETXT: PUSH AF ;---------------------------------------------------------------------- BACKTXT: PUSH AF -VVMODE+1: LD A,#00 +.VMODE+1: LD A,#00 ;BIT 7,A CP %1000'0000 JR C,NOBACKT @@ -669,7 +663,7 @@ VVMODE+1: LD A,#00 PUSH HL PUSH IX LD IX,#C000 -SVHL1+1: LD HL,#2050 +.WinMax+1: LD HL,#2050 LD DE,#0000 LD A,(BANKTBL+TXTPAGE) LD B,A @@ -683,10 +677,10 @@ SVHL1+1: LD HL,#2050 RST ToBIOS ;[x] 29/9/23 POP AF - JP PO,1F + JP PO,.no_ei EI -1: ; -TCURS+1: LD DE,#0000 +.no_ei: ; +.CURS+1: LD DE,#0000 CALL LOCATE POP IX POP HL diff --git a/DSS/build.txt b/DSS/build.txt index 0dd217a..7bfae05 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -880 \ No newline at end of file +905 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index a9ce9c7..f5fd687 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -7,6 +7,10 @@ DEFINE COMPILE_UNUSED_CODE 0 ; +; + DEFINE MOUSE_COM_BAUD_4800 0 +; + ; ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе @@ -85,3 +89,17 @@ FMCOUNT EQU 10 ; HANDBUF.SIZE EQU 32 ;----------------------------------------------------; ; + +; +;----------------------------------------------------; + IF MOUSE_COM_BAUD_4800 +MOUSE_BAUD: +.multiplier_1 EQU #04 ; первый множитель = 1. 875000/Мн1*Мн2=4807 +.multiplier_2 EQU #B6 ; второй множитель = 182. 875000/Мн1*Мн2=4807 + ELSE +MOUSE_BAUD: +.multiplier_1 EQU #47 ; первый множитель = 16. 875000/Мн1*Мн2=1215 +.multiplier_2 EQU #2D ; второй множитель = 45. 875000/Мн1*Мн2=1215 + ENDIF +;----------------------------------------------------; +; \ No newline at end of file diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index 2c8fee3..0fda843 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -5,12 +5,10 @@ ;/////////////////////////////////////////////////// cmd_chdir: ex de,hl - ;ld de,T9186 ; буфер ld de,work_buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS xor a - ;ld hl,T9186 ld hl,work_buffer1; cp (hl) jr nz,A877B @@ -23,9 +21,7 @@ cmd_chdir: dec hl A877B: ld c,Dss.ChDir ; сменить тек. каталог RST ToDSS - ;call c,print_err_message jp c,print_err_message ; вывод сообщения -; call newline jp Get_Path ; сохр. тек. диск и путь ; ; вывод сист. пути на экран ; ld c,8Eh ; узнать полож. курсора diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 40c908f..cbf3019 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -520,7 +520,7 @@ T8B46: db "0 000 000 000",0 db 0 ; -; [ ] теперь не лезет напрямую, делает через новый параметр функции DskInfo +; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo ; иная логика получения метки тома - сначала ищется в корневой директории, ; если там нет, то берётся из BPB read_disk_info: diff --git a/Shared_Includes b/Shared_Includes index 4d37c33..795ad6a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4d37c338c31c060e7a42f1e47fad93b69af34a5b +Subproject commit 795ad6ac57585133e1ffb8f0baafb3751dda576c From 1d38b8ae10c7e3351c7e4a05e2d72ff9ee0e32f0 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 14 Feb 2024 01:51:23 +1000 Subject: [PATCH 085/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 795ad6a..9b22b7b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 795ad6ac57585133e1ffb8f0baafb3751dda576c +Subproject commit 9b22b7b05ab2b344b1778419d28da83ee74fb297 From 336436ee769624214e8d63acccff6c7638f1cfdd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 17 Feb 2024 03:45:17 +1000 Subject: [PATCH 086/219] ... --- DSS/DSS-MAIN.ASM | 81 ++++++++++++++++++++-------------------- DSS/INTMOUSE.ASM | 51 +++++++++++++------------ DSS/KEYINTER.ASM | 29 +++++++------- DSS/VIDEO.ASM | 10 ++--- DSS/build.txt | 2 +- DSS/defines.inc | 10 ++++- SHELL/Commands/CLS.ASM | 85 +++++++++++++++++++++--------------------- SHELL/EDLINE.ASM | 4 +- SHELL/SHELL.ASM | 16 ++++---- Shared_Includes | 2 +- 10 files changed, 147 insertions(+), 143 deletions(-) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 68f82ab..f7e7440 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -132,47 +132,46 @@ RST_0x30: JP INTMOUS ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[MAIN INT]> ; - _mInfoBLOCK #38-$,#FF ; -RST_38: ; - JP RST_0x38 ; Этот джамп нужен, чтоб софты могли легко менять обработчик на свой. Костыльно. -RST_0x38: ; -INT_: PUSH AF ; - EX AF,AF' ; - PUSH AF ; - PUSH BC ; - PUSH DE ; - PUSH HL ; - EXX ; - PUSH BC ; - PUSH DE ; - PUSH HL ; - PUSH IX ; - PUSH IY ; - CALL KEYSCAN ; - LD C,#80 ; - RST ToDSS.Mouse ; - IFN CLASSIC_CURSOR ; - CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL - ENDIF ; - POP IY ; - POP IX ; - POP HL ; - POP DE ; - POP BC ; - EXX ; - POP HL ; - POP DE ; - POP BC ; - POP AF ; - EX AF,AF' ; - POP AF ; - EI ; - RETI ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// +; <[MAIN INT]> + _mInfoBLOCK #38-$,#FF +RST_38: ;для того, чтоб софты могли менять обработчик на свой. + JP RST_0x38 +RST_0x38: +INT_: PUSH AF + EX AF,AF' + PUSH AF + PUSH BC + PUSH DE + PUSH HL + EXX + PUSH BC + PUSH DE + PUSH HL + PUSH IX + PUSH IY + CALL KEYSCAN + ; LD C,Dss.Mouse.GetPackets + ; RST ToDSS.Mouse + CALL M_INT + IFN CLASSIC_CURSOR + CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL + ENDIF + POP IY + POP IX + POP HL + POP DE + POP BC + EXX + POP HL + POP DE + POP BC + POP AF + EX AF,AF' + POP AF + EI + RETI +//////////////////////////////////////////////////////////////////////// ; NMI: RETN diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 6002636..ba6bc48 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -628,16 +628,17 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) RET Z ;[x] mouse freeeeezzzz - LD BC,#2000 + LD BC,MOUSE_READ_PORT_TIMEOUT ; -TST_01: IN A,(PORT_MOUSE.Ctrl) +.TST_01: + IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz JR C,.NXT DEC BC LD A,B OR C - JR NZ,TST_01 + JR NZ,.TST_01 RET ;JR NC,TST_01 ; @@ -649,17 +650,17 @@ TST_01: IN A,(PORT_MOUSE.Ctrl) RET NZ ;[x] mouse freeeeezzzz - LD BC,#2000 + LD BC,MOUSE_READ_PORT_TIMEOUT ; TST_02: IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz - JR C,.NXT - DEC BC - LD A,B - OR C - JR NZ,TST_02 - RET + JR C,.NXT + DEC BC + LD A,B + OR C + JR NZ,TST_02 + RET ;JR NC,TST_02 ; .NXT: IN A,(PORT_MOUSE.Data) @@ -692,9 +693,9 @@ TST_02: IN A,(PORT_MOUSE.Ctrl) RLCA RLCA RES 6,A - JR NC,STBU + JR NC,.STBU SET 6,A -STBU RLCA +.STBU: RLCA RLCA AND #03 LD (MB),A @@ -821,11 +822,12 @@ M_MODE LD (MODE_M),A JR Z,S320256 CP 2 JR Z,S640256 -UNKMODE XOR A ; ????? может тут надо .INVALID_COMMAND ? +UNKMODE: + XOR A ; ????? может тут надо .INVALID_COMMAND ? SCF RET -S320256 +S320256: LD HL,0 ;MIN X LD DE,319 ;MAX X CALL MS_HORZ @@ -835,7 +837,7 @@ S320256 XOR A RET -S640256 +S640256: LD HL,0 ;MIN X LD DE,639 ;MAX X CALL MS_HORZ @@ -846,7 +848,7 @@ S640256 RET ;Mouse Interrupt -M_INT IN A,(SLOT3) +M_INT: IN A,(SLOT3) LD B,A IN A,(PORT_Y) LD C,A @@ -867,25 +869,26 @@ M_REFR CALL CONTROL CONTROL CALL READ_M RET NC CALL MCORECT - LD A,#00 - LD (REDY),A + ;LD A,#00 + ; XOR A + ; LD (REDY),A RET REFRESH: .hide+1: LD A,#01 OR A RET NZ -REDY+1: LD A,#00 - ;????? почему закомментированно в оригинале? - ;OR A - ;RET NZ + ; +; REDY+1: LD A,#01 +; OR A +; RET NZ ; CALL RESTORE LD HL,(PIX_X) LD DE,(PIX_Y) CALL MOUSE - LD A,#FF - LD (REDY),A + ; LD A,#FF + ; LD (REDY),A RET MODE_M: DB #03 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index f95f3ab..b502e82 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -352,10 +352,10 @@ TESTKEY: K_CLEAR: LD A,(HOST) LD (HEAD),A - LD A,#2F + LD A,Dss.WaitKey - 1 CP B JR NC,.error - LD A,#34 ;R02 + LD A,Dss.EDIT ;R02 CP B JR C,.error LD C,B @@ -434,10 +434,10 @@ FULL_BF: KEYSCAN: LD IX,KEYFLAG .RESCAN: - IN A,(COM_A) + IN A,(Z84.SIO.Ch_A.Ctrl) BIT 0,A RET Z - IN A,(DAT_A) + IN A,(Z84.SIO.Ch_A.Data) CP #F0 JR Z,FULL_BF.F0_KEY CP #E0 @@ -944,27 +944,24 @@ BPP2 DEC BC JR NZ,BEEP RET -COM_A EQU #19 ;!FIXIT sp2000.inc -DAT_A EQU #18 ;!FIXIT sp2000.inc - KINIT XOR A ;LD A,0 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A INC A ;LD A,1 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A XOR A ;LD A,0 ;#18 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,3 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#C1 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,4 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#07 ;#05 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,5 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#62 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A RET ;//MODULE: KEYINTER diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index ca7354a..5ff6b09 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -764,18 +764,18 @@ PRINT_INIT: ; клава XOR A ;LD A,0 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A ;[x] 29/9/23 INC A - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A DEC A ; - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,5 - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#62 ; bit 7 - Direction for Bufer (0), Bit 1 - Bufer Enable (1) - OUT (COM_A),A + OUT (Z84.SIO.Ch_A.Ctrl),A RET ;//MODULE: VIDEO ;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 7bfae05..da77ca6 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -905 \ No newline at end of file +912 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f5fd687..a74de48 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -8,7 +8,8 @@ ; ; - DEFINE MOUSE_COM_BAUD_4800 0 + DEFINE MOUSE_COM_BAUD 0 ; 1 - 2404, 2 - 4807, else - 1215 (default) + DEFINE MOUSE_READ_PORT_TIMEOUT 1280 ; ; @@ -92,7 +93,12 @@ HANDBUF.SIZE EQU 32 ; ;----------------------------------------------------; - IF MOUSE_COM_BAUD_4800 + + IF MOUSE_COM_BAUD = 1 +MOUSE_BAUD: +.multiplier_1 EQU #02 ; первый множитель = 2. 875000/Мн1*Мн2=2404 +.multiplier_2 EQU #B6 ; второй множитель = 182. 875000/Мн1*Мн2=2404 + ELSEIF MOUSE_COM_BAUD = 2 MOUSE_BAUD: .multiplier_1 EQU #04 ; первый множитель = 1. 875000/Мн1*Мн2=4807 .multiplier_2 EQU #B6 ; второй множитель = 182. 875000/Мн1*Мн2=4807 diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 9888897..66acef9 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -5,49 +5,48 @@ ; Можно задать один аргумент - цвет экрана. ; Если аргумент не задан, исп. по-умолчанию #07. ;/////////////////////////////////////////////////// -cmd_cls:ex de,hl ; hl=ком-строка - ;ld de,T9186 ; буфер под параметр - ld de,work_buffer1; - push de - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - pop hl - jp nc,invalid_param ; "Invalid parametr" (>1 парам.) - ld b,7 ; атрибут очистки по-умолчанию - ld a,(hl) - or a - jr z,cls_clear - call ascii2byte - jp c,invalid_param ; "Invalid parametr" - and 7 - ld b,a - inc hl - ld a,(hl) - or a - jr z,cls_clear - ld a,b - rlca - rlca - rlca - rlca - ld b,a - ld a,(hl) - call ascii2byte - jp c,invalid_param ; "Invalid parametr" - or b - ld b,a -cls_clear: - ld a,b - ld (color_screen),a ; атрибут - ld de,0 ; Y/X полож. - ld hl,#2050 ; Y/X размер - ld c,BIOS.LP_CLS_WIN ; очистить окно (выводом пробелов) - RST ToBIOS - ; уст. курсор в Home - ld de,0 ; Y/X полож. - ld c,Dss.Locate - RST ToDSS - ret +cmd_cls: ex de,hl ; hl=ком-строка + ;ld de,T9186 ; буфер под параметр + ld de,work_buffer1; + push de + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + pop hl + jp nc,invalid_param ; "Invalid parametr" (>1 парам.) + ld b,7 ; атрибут очистки по-умолчанию + ld a,(hl) + or a + jr z,cls_clear + call ascii2byte + jp c,invalid_param ; "Invalid parametr" + and 7 + ld b,a + inc hl + ld a,(hl) + or a + jr z,cls_clear + ld a,b + rlca + rlca + rlca + rlca + ld b,a + ld a,(hl) + call ascii2byte + jp c,invalid_param ; "Invalid parametr" + or b + ld b,a +cls_clear: ld a,b + ld (color_screen),a ; атрибут + ld de,0 ; Y/X полож. + ld hl,#2050 ; Y/X размер + ld c,BIOS.LP_CLS_WIN ; очистить окно (выводом пробелов) + RST ToBIOS + ; уст. курсор в Home + ld de,0 ; Y/X полож. + ld c,Dss.Locate + RST ToDSS + ret ; ascii -> int diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index 7b8087f..60bfa00 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -471,10 +471,10 @@ EvComComb: cp #50 ; Ins, смена режима ввода jr z,change_insert_mode bit 5,b ; Ctrl бит - jr z,$+7 + jr z,.exit cp #4F+#80 ; Ctrl+Del, очистить историю команд jp z,clear_history - pop de +.exit: pop de ret ; Смена режима ввода diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 4a5593e..8a37ce2 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -492,14 +492,14 @@ PDIGIT: ld de,10000 Restore_Screen: - PUSH AF - LD C,Dss.GetVMod - RST ToDSS - AND #80 - JR Z,.exit - LD BC,1 * 256 + Dss.SetVMod - LD A,Dss.SetVMod.txt80x32 - RST ToDSS + PUSH AF + LD C,Dss.GetVMod + RST ToDSS + CP #80 + JR C,.exit + LD BC,1 * 256 + Dss.SetVMod + LD A,Dss.SetVMod.txt80x32 + RST ToDSS .exit: POP AF RET diff --git a/Shared_Includes b/Shared_Includes index 9b22b7b..9a8cc2f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9b22b7b05ab2b344b1778419d28da83ee74fb297 +Subproject commit 9a8cc2fa8438c6e27c72b60a7cfd3a2e3470b314 From a18f38247013b82763e0301b0745a64403dba47a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 20 Feb 2024 00:51:08 +1000 Subject: [PATCH 087/219] ... --- DSS/API/ScanDRV.asm | 2 +- DSS/DSS-MAIN.ASM | 2 +- DSS/INTMOUSE.ASM | 44 ++++++++++++------------- DSS/KEYINTER.ASM | 78 +++++++++++++++++++++++++++++++++------------ DSS/build.txt | 2 +- DSS/defines.inc | 21 ++++++------ Shared_Includes | 2 +- 7 files changed, 93 insertions(+), 58 deletions(-) diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index bc0b42e..3f2fca4 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -49,4 +49,4 @@ SCANDRV: RET ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ;/////////////////////////////////////////////////////////////////////// -; +; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f7e7440..0a21c52 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -287,7 +287,7 @@ F_START: DI .good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения RET C ;R10 - CALL KINIT + CALL KEYBOARD_INIT CALL PRINT_INIT LD C,Dss.Mouse.Init RST ToDSS.Mouse diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index ba6bc48..c53eeb1 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -156,44 +156,42 @@ M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND RET ;!TODO на биос. -MS_INIT DI - ;!TEST mouse - ;LD A,#55 - ;OUT (#10),A - ;LD A,#2D - ;OUT (#10),A - ; - XOR A ;LD A,0 +MS_INIT: + DI + ; reg 0 + XOR A ;LD A,0 OUT (PORT_MOUSE.Ctrl),A - INC A ;LD A,1 + ; reg 4 + LD A,4 OUT (PORT_MOUSE.Ctrl),A - DEC A ;LD A,0 + LD A,+(7 | MOUSE_BAUD.multiplier_1) ; первый множитель OUT (PORT_MOUSE.Ctrl),A + ; reg 3 LD A,3 OUT (PORT_MOUSE.Ctrl),A LD A,#41 OUT (PORT_MOUSE.Ctrl),A - LD A,4 - OUT (PORT_MOUSE.Ctrl),A - ;!TEST mouse - LD A,MOUSE_BAUD.multiplier_1 ; первый множитель - OUT (PORT_MOUSE.Ctrl),A - ; + ; reg 5 LD A,5 OUT (PORT_MOUSE.Ctrl),A - ; [ ] для корректного инита Sega джойстика в порту кемпстон джойстика - LD A,%1110'0000 - ;LD A,%0110'0000 - ; + LD A,%1110'0000 ; bit7 для корректного инита Sega джойстика в порту кемпстон джойстика + OUT (PORT_MOUSE.Ctrl),A + ; + ; reg 1 + LD A,1 + OUT (PORT_MOUSE.Ctrl),A + IF MOUSE_INT_ENABLED + LD A,%0001'1001 + ELSE + XOR A + ENDIF OUT (PORT_MOUSE.Ctrl),A - ;!TEST mouse LD A,#55 OUT (Z84.CTC.Ch_0),A LD A,MOUSE_BAUD.multiplier_2 ; второй множитель OUT (Z84.CTC.Ch_0),A ; - EI XOR A RET @@ -516,7 +514,7 @@ MOUSE: LD A,(MODE_M) JR SET_RESTORE_EXIT ; ;set gfx-mode -.GFX: CP #82 ;640x256x16 +.GFX: CP Dss.SetVMod.grf640x256 JR NZ,.NOFIX_640 SRL H RR L diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index b502e82..e9553bb 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -435,8 +435,16 @@ KEYSCAN: LD IX,KEYFLAG .RESCAN: IN A,(Z84.SIO.Ch_A.Ctrl) - BIT 0,A + AND 1 RET Z + ;[ ] 18/02/2024 проверка на переполнение буфера + ; A = 1 + ; reg 1 + OUT (Z84.SIO.Ch_A.Ctrl),A + IN A,(Z84.SIO.Ch_A.Ctrl) + AND %0010'0000 ; check receiver overrun error + JP NZ,Receiver_Overrun + ; IN A,(Z84.SIO.Ch_A.Data) CP #F0 JR Z,FULL_BF.F0_KEY @@ -451,10 +459,10 @@ KEYSCAN: CALL SHIFTS RES FLAG_E0,(IX+KEYFLG) RES FLAG_E1,(IX+KEYFLG) - RET Z ;IT'S SHIFT KEY - + ;RET Z ;IT'S SHIFT KEY + ; CALL INPCODE ;L - AT POS. CODE -PUTCODE: + ;PUTCODE LD HL,#1C00 ;Caps Lock AND A SBC HL,DE @@ -479,16 +487,24 @@ PUTCODE: AND A SBC HL,DE CALL Z,SCL_X - -;small optimization - ; LD HL,#CF00 ;Ctrl + Alt + Del - ; AND A - ; SBC HL,DE - ; CALL Z,RST_X -;;; + ;[x] small optimization))) + ; LD HL,#CF00 ;Ctrl + Alt + Del + ; AND A + ; SBC HL,DE + ; CALL Z,RST_X + ; LD BC,(KEYFLAG) CALL PUTSYM RET + ;[ ] 18/02/2024 проверка на переполнение буфера +; .Receiver_Overrun: +; LD (IX+K_SHIFT),0 +; LD (IX+KEYFLG),0 +; ; reg 0 - reset errors +; LD A,%0011'0000 +; OUT (Z84.SIO.Ch_A.Ctrl),A +; RET + UN_KEY RES FLAG_F0,(IX+KEYFLG) LD L,A @@ -922,29 +938,30 @@ SHF2RUS DB #F1,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs ;================================ -BEEP LD A,#10 - OUT (#FE),A +BEEP: LD A,#10 + OUT (ZX_Beeper),A LD B,D LD C,E -BPP DEC BC +.loop1: DEC BC LD A,B OR C - JR NZ,BPP - LD A,#00 - OUT (#FE),A + JR NZ,.loop1 + XOR A ;LD A,#00 + OUT (ZX_Beeper),A LD B,D LD C,E -BPP2 DEC BC +.loop2: DEC BC LD A,B OR C - JR NZ,BPP2 + JR NZ,.loop2 DEC HL LD A,H OR L JR NZ,BEEP RET - -KINIT XOR A ;LD A,0 + +KEYBOARD_INIT: + XOR A ;LD A,0 OUT (Z84.SIO.Ch_A.Ctrl),A INC A ;LD A,1 OUT (Z84.SIO.Ch_A.Ctrl),A @@ -964,5 +981,24 @@ KINIT XOR A ;LD A,0 OUT (Z84.SIO.Ch_A.Ctrl),A RET +;[ ] 18/02/2024 проверка на переполнение буфера +Receiver_Overrun: + ; empty the buffer + IN A,(Z84.SIO.Ch_A.Data) + IN A,(Z84.SIO.Ch_A.Ctrl) + RRCA + JR C,Receiver_Overrun + ; reg 0 - reset errors + LD A,%0011'0000 + OUT (Z84.SIO.Ch_A.Ctrl),A + ; + LD (IX+K_SHIFT),0 + LD (IX+KEYFLG),0 + ; + ; LD A,(HOST) + ; LD (HEAD),A + ; + AND A + RET ;//MODULE: KEYINTER ;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index da77ca6..2b15d82 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -912 \ No newline at end of file +926 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index a74de48..3ad3a3f 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -3,17 +3,18 @@ ; ; - DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. + DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. DEFINE COMPILE_UNUSED_CODE 0 ; ; - DEFINE MOUSE_COM_BAUD 0 ; 1 - 2404, 2 - 4807, else - 1215 (default) + DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) + DEFINE MOUSE_INT_ENABLED 0 DEFINE MOUSE_READ_PORT_TIMEOUT 1280 ; ; -;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе +;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// define _bit (1 Date: Tue, 20 Feb 2024 19:03:19 +1000 Subject: [PATCH 088/219] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=A1=D0=B0=D0=B2=D0=B5=D0=BB=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/defines.inc | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/DSS/defines.inc b/DSS/defines.inc index 3ad3a3f..b74c3a8 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -9,8 +9,8 @@ ; DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) - DEFINE MOUSE_INT_ENABLED 0 - DEFINE MOUSE_READ_PORT_TIMEOUT 1280 + DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B + DEFINE MOUSE_READ_PORT_TIMEOUT 1280 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники ; ; @@ -42,7 +42,6 @@ FAT_CACHE: DISPLAY "Degree_12 = ",/H,.Degree_12 DISPLAY "Size_Mask_12 = ",/H,.Size_Mask_12 DISPLAY "Part_Mask_12 = ",/H,.Part_Mask_12 -; undefine _bit undefine _shift ///////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -65,16 +64,12 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 ; кэш списка каталога DIRPAGE EQU 0 .buffer EQU #C000 -; FATPAGE EQU 1 .cache EQU #C000 -; TXTPAGE EQU 2 -; ENVPAGE EQU TXTPAGE .PATH_PNT_ARRAY EQU #FC80 .ENVTEMP EQU #FE00 -; DRVPAGE EQU 3 ; COREPAGE EQU 4 ; она отдельно и не с блоком выше. @@ -94,7 +89,6 @@ HANDBUF.SIZE EQU 32 ; ;----------------------------------------------------; - IF MOUSE_COM_BAUD = 1 MOUSE_BAUD: .multiplier_1 EQU %0100'0000 ; первый множитель = 16. From cf91610bbf3ca84a366f4331d027b48df9131347 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 21 Feb 2024 01:55:59 +1000 Subject: [PATCH 089/219] -bug in BOOTDSK --- DSS/API/bootDsk.asm | 4 ++-- DSS/DSS-MAIN.ASM | 7 ++++--- DSS/build.txt | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index 2bfaca7..5f33cbc 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -5,7 +5,7 @@ ; При B = 0 (GET) ; выход: A - номер системного диска (0=A,1=B,..) ; При B = 1 (SET - исп. boot-загрузчик системы, после чего функция недоступна) -; вход: A - номер устройства, L - номер раздела на устройстве +; вход: H - номер устройства, L - номер раздела на устройстве ; выход: ;///////////////////////////////////////////////////////////////////// BOOTDSK: @@ -24,7 +24,7 @@ BOOTDSK: ; Сообщить DSS с какого диска загружается система. ; Исп. загрузчик системы для иниц. ячейки "boot_disk". -.SET: LD B,A ;SET BOOT DISK +.SET: LD B,H ;SET BOOT DISK LD C,0 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD (.part),HL diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 0a21c52..a0337ac 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -278,7 +278,7 @@ F_START: DI LD DE,MINIMUM_BIOS_VERSION SBC HL,DE JR NC,.good - LD A,(.saveDRV) + LD A,(.saveDRV+1) CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 JR NC,.err_oldBIOS LD HL,#C9AF ; XOR A : RET opcodes @@ -303,12 +303,13 @@ F_START: DI .saveDRV+1: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD HL,0 ; H - номер устройства, L - номер раздела на устройстве - LD A,H + ;LD A,H ;LD A,0 ; LD B,1 CALL BOOTDSK - + RET C + ; EI ;Set new address fn. VERSION LD HL,ADRST10 diff --git a/DSS/build.txt b/DSS/build.txt index 2b15d82..36699e7 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -926 \ No newline at end of file +933 \ No newline at end of file From 62ea6e23dd9ab8dd9893ec30ea18031f7b81ccb2 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Feb 2024 04:12:00 +1000 Subject: [PATCH 090/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index dbf3e86..5a5dcf0 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit dbf3e86b6290d71e5789cabf7af6981a5a42db0e +Subproject commit 5a5dcf0bd035d2adaaa27d28bb8ed1bd86260d59 From 34bb44539e713abd78b6bae2e9f7b0315b6059c1 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 29 Feb 2024 02:32:02 +1000 Subject: [PATCH 091/219] fix "open drive error" --- DSS/DOS_Proc.asm | 27 +++++++++++++++++++++++++-- DSS/FS/FAT/FAT.asm | 4 ++-- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- Shared_Includes | 2 +- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index a3185ca..f0620a1 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -195,7 +195,6 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; ; IN: A - drive number -; OPENDSK:;!TEST DRV.Open обход R10 LD C,A LD A,(FatBuffer.DRIVE) @@ -216,10 +215,26 @@ OPENDSK:;!TEST DRV.Open RST ToDSS.DRV POP BC JP C,.error + ;[ ] 29/02/2024 fix "open drive error" + IF TEST_FEATURE + LD A,(FatBuffer.DRIVE) + LD D,A + PUSH DE + ENDIF + ; LD A,B LD (FatBuffer.DRIVE),A + ; CALL RD_BPB - RET C + ;[ ] 29/02/2024 fix "open drive error" + IF TEST_FEATURE + POP DE + LD A,D + JR C,.error_disk + ELSE + RET C + ENDIF + ; .exit: LD A,(LDRIVE) AND A RET @@ -228,6 +243,14 @@ OPENDSK:;!TEST DRV.Open RET Z LD A,DSS_Error.sys.NOT_READY RET + ;[ ] 29/02/2024 fix "open drive error" + IF TEST_FEATURE +.error_disk: + CALL OPENDSK.force + LD A,DSS_Error.sys.NOT_READY + SCF + RET + ENDIF ;----------------------------------------------------------------------; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index a473c61..26dd741 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -498,18 +498,18 @@ TESTDSK: ;????? OR A RET Z ENDIF +; рег. D - номер диска RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC IN A,(SLOT0) OUT (SLOT3),A + LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE ;R08 ;LD DE,BOOT+#C000 LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 - LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE - LD C,Dss.DRV.GetBPB RST ToDSS.DRV POP BC diff --git a/DSS/build.txt b/DSS/build.txt index 36699e7..bb18bf4 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -933 \ No newline at end of file +939 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index b74c3a8..f3d2ca2 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -1,5 +1,5 @@ ; - DEFINE TEST_FEATURE 0 + DEFINE TEST_FEATURE 1 ; ; diff --git a/Shared_Includes b/Shared_Includes index 5a5dcf0..cbc1fd5 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5a5dcf0bd035d2adaaa27d28bb8ed1bd86260d59 +Subproject commit cbc1fd596a5a56298407c13a529a574e968235c7 From ac928f6fc0a896de2f1d75317825ba906e54ccdf Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 29 Feb 2024 02:42:08 +1000 Subject: [PATCH 092/219] -fix KEYSCAN with SIO buffer and Shift --- DSS/KEYINTER.ASM | 5 ++++- DSS/build.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index e9553bb..3b0d263 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -459,7 +459,9 @@ KEYSCAN: CALL SHIFTS RES FLAG_E0,(IX+KEYFLG) RES FLAG_E1,(IX+KEYFLG) - ;RET Z ;IT'S SHIFT KEY + ;[ ] 29/02/2024 выгребсти весь буфер + JR Z,.RESCAN ;IT'S SHIFT KEY + ; RET Z ;IT'S SHIFT KEY ; CALL INPCODE ;L - AT POS. CODE ;PUTCODE @@ -991,6 +993,7 @@ Receiver_Overrun: ; reg 0 - reset errors LD A,%0011'0000 OUT (Z84.SIO.Ch_A.Ctrl),A + ;!TODO при детекте переполнения буфера проца снять клавиши из порта #FE спектрума ; LD (IX+K_SHIFT),0 LD (IX+KEYFLG),0 diff --git a/DSS/build.txt b/DSS/build.txt index bb18bf4..c353035 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -939 \ No newline at end of file +943 \ No newline at end of file From 031277921780825c6fef84cf29b08a8d4076be26 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 12 Mar 2024 03:50:25 +1000 Subject: [PATCH 093/219] Preparing for FAT32 --- BOOT/DSSBOOT.ASM | 22 +- BOOT/boot.asm | 2 +- DSS/API/Attribute.asm | 4 +- DSS/API/Close.asm | 4 +- DSS/API/Create.asm | 34 ++- DSS/API/Delete.asm | 17 +- DSS/API/GetDateTime.asm | 10 +- DSS/API/MkDir.asm | 36 +++- DSS/API/Open.asm | 31 +-- DSS/API/Read.asm | 90 ++++---- DSS/API/RmDir.asm | 54 +++-- DSS/API/ScanDRV.asm | 10 + DSS/API/SetDateTime.asm | 10 +- DSS/API/Write.asm | 74 +++---- DSS/API/diskINF.asm | 14 +- DSS/DOS_FM.ASM | 30 +-- DSS/DOS_Proc.asm | 51 +++-- DSS/DSS-MAIN.ASM | 46 +--- DSS/EXECUTE.ASM | 74 +++---- DSS/FS/FAT/FAT.asm | 253 +++++++++++----------- DSS/FS/FAT/FAT12_16.asm | 370 +++++++++++++++++--------------- DSS/FS/FAT/FAT32.asm | 138 ++++++++++++ DSS/INTMOUSE.ASM | 52 ++--- DSS/KEYINTER.ASM | 26 +-- DSS/Kernel_Panic.asm | 75 +++++++ DSS/Media_drivers/ReScanDRV.ASM | 79 +++---- DSS/Media_drivers/ide-drv.asm | 209 +++++++++--------- DSS/Structures.inc | 76 +++---- DSS/build.txt | 2 +- DSS/defines.inc | 6 +- SHELL/Commands/DIR.ASM | 4 +- Shared_Includes | 2 +- 32 files changed, 1088 insertions(+), 817 deletions(-) create mode 100644 DSS/FS/FAT/FAT32.asm create mode 100644 DSS/Kernel_Panic.asm diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 609748c..5cd2865 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -348,26 +348,26 @@ NX2: LD HL,(BOOT+510) SCF RET NZ LD IY,BOOT ;Analysing Block Parametr BIOS - LD A,(IY+_sBOOT_SEC.ID_FORM) + LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) CP #F0 RET C LD HL,0 ;calc. first sector FAT LD (DIR_FRH),HL - LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - LD D,(IY+_sBOOT_SEC.RESERVE+1) + LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) ADD HL,DE LD (FAT_FRM),HL ;first sector FAT - LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT - LD D,(IY+_sBOOT_SEC.S_P_F+1) + LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ;sectors in FAT + LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) LD A,(BOOT.FAT_NUM) ;amount FATs C_DATA1: ADD HL,DE DEC A JR NZ,C_DATA1 LD (DIR_FRM),HL ;first sector DIR EX DE,HL - LD L,(IY+_sBOOT_SEC.F_P_DIR) ;Number file handel - LD H,(IY+_sBOOT_SEC.F_P_DIR+1) + LD L,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ;Number file handel + LD H,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1) ADD HL,HL ADD HL,HL ADD HL,HL @@ -381,8 +381,8 @@ C_DATA1: ADD HL,DE ADD HL,DE LD (DAT_FRM),HL ;First sector data - LD C,(IY+_sBOOT_SEC.B_P_S) ;Size sector - LD B,(IY+_sBOOT_SEC.B_P_S+1) + LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ;Size sector + LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) LD HL,0 LD A,(BOOT.S_P_C) NEXTAD3: @@ -437,7 +437,7 @@ BPB_FAT XOR A RET -IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) +IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) CP #F0 RET C CP #F8 @@ -724,7 +724,7 @@ MASKARE DB "SYSTEM DOS" FATMSG DB "FAT" ; Area for boot sector [512Bytes] -BOOT _sBOOT_SEC = $ +BOOT _sBOOT_SECTOR_PARAMS = $ ; BOOT EQU $ ; ID_NAME EQU BOOT+#03 ; +03 DOS NAME diff --git a/BOOT/boot.asm b/BOOT/boot.asm index aee1f22..ce9672d 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -357,7 +357,7 @@ write_to_: ld a,(disk) ; LD BC,1*256 + BIOS.DRV_READ RST ToBIOS POP BC - LD HL,(buffer + _sBOOT_SEC.RESERVE) + LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) LD DE,04 ;!HARDCODE минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) AND A SBC HL,DE diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 9a9a6e4..2ecbc1b 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -31,7 +31,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 CALL .OPENATR ;R002 RET C ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF+_sFM.ATTRIBUT) + LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT) ;PUSH BC ;CALL CLOSE @@ -56,7 +56,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET C SET 7,(IY+_sFM.ACCESS_MODE) RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit - LD (IY+_sFM.ATTRIBUT),B + LD (IY+_sFM.FS_REC.ATTRIBUT),B PUSH BC CALL CLOSE_FN .error: POP BC diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 256e18e..fe945ee 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -31,8 +31,8 @@ CLOSE_FN: LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER+1),D ; [x] 15/11/2023 -bug with bad clusters ;!TEST - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D ; CALL LOADDIR .TMP+1: LD A,0 diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 4e234b9..1b23edc 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -13,13 +13,22 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 POP BC POP HL RET C - LD A,C + LD A,C ; ; CALL .Prepare RET C CALL SEARCH.File - CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT - JR .DO + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT + CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT + CP DSS_Error.sys.FILE_NOT_FOUND + JR Z,.DO + SCF + RET +.FILE_EXISTS_DEL: + CALL DEL_FN.DELETE + LD A,DSS_Error.sys.FILE_NOT_FOUND + RET ; .NEW_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID @@ -36,10 +45,17 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 CALL .Prepare RET C CALL SEARCH.File - LD A,DSS_Error.sys.FILE_EXISTS - CCF - RET C + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.FILE_EXISTS + ; CCF + ; RET C + JR NC,.FILE_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ ; + ; + ;no_file_found .DO: LD HL,MASKARE LD DE,HANDBUF LD BC,11 @@ -89,6 +105,12 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; LD HL,TMPNAME ; LD DE,MASKARE JP MASK + ; +; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 +.FILE_EXISTS: + LD A,DSS_Error.sys.FILE_EXISTS + CCF + RET ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM CREAT_N EQU CREATE.NEW_FN diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 4cfb9d2..a749150 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -26,26 +26,27 @@ DEL_FN: ;!TEST CALL LOADDIR CALL SEARCH.File RET C - ;JP .DELETE ; пометить запись как "удаленная" -.DELETE: SET_PAGE_X DIRPAGE - LD (IX+_sFM.NAME),#E5 ; признак удаления файла - LD E,(IX+_sFM.ST_CLUSTER) ; № первого кластера - LD D,(IX+_sFM.ST_CLUSTER+1) +.DELETE: + SET_PAGE_X DIRPAGE + LD (IX + _sFAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла + ; [ ] fat32 + LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) ; OUT (SLOT3),A LD A,E OR D JP Z,SAVEDIR ; сбросить кеш каталога на диск .loop: EX DE,HL ; hl=номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера PUSH DE ; номер след. кластера PUSH AF LD DE,#0000 ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера POP AF POP DE JP NC,.loop - CALL WR_FAT ;!FIXIT может не нужна тут? Там дальше будет + CALL WRITE_FAT_TABLE ;!FIXIT может не нужна тут? Там дальше будет JP SAVEDIR ; сбросить кеш каталога на диск ; \ No newline at end of file diff --git a/DSS/API/GetDateTime.asm b/DSS/API/GetDateTime.asm index ed8ba32..6cdec69 100644 --- a/DSS/API/GetDateTime.asm +++ b/DSS/API/GetDateTime.asm @@ -14,11 +14,11 @@ GET_D_T: CALL SET_FM RET C ; время/дату из структуры дескр. - LD E,(IY+_sFM.TIME) ; время - LD D,(IY+_sFM.TIME+1) ; - LD C,(IY+_sFM.DATE) ; дата - LD B,(IY+_sFM.DATE+1) ; - CALL RMKTIME ; раскодировать время/дату + LD E,(IY+_sFM.FS_REC.TIME) ; время + LD D,(IY+_sFM.FS_REC.TIME+1) ; + LD C,(IY+_sFM.FS_REC.DATE) ; дата + LD B,(IY+_sFM.FS_REC.DATE+1) ; + CALL RMKTIME ; раскодировать время/дату AND A RET ; \ No newline at end of file diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 7173502..bfde2c5 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -6,6 +6,13 @@ ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// +;error +MKDIR.DIR_EXISTS: + LD A,DSS_Error.sys.DIR_EXISTS + CCF + RET + + MKDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK @@ -28,16 +35,22 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ;CALL LOADDIR ; прочитать список каталога ; CALL SEARCH.Dir ; поиск записи каталога в списке диска - LD A,DSS_Error.sys.DIR_EXISTS - CCF - RET C ; каталог найден + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.DIR_EXISTS + ; CCF + ; RET C ; каталог найден + JR NC,.DIR_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ ; CALL G_CLUST RET C PUSH HL - LD DE,(FatBuffer.ENDCLUS) ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ; [ ] fat32 + LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 @@ -80,7 +93,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ;CALL SAVEDIR ; и сбросить кеш каталога на диск LD HL,CORE_BUFFERS.SECBUF ; буфер LD (HL),"." ; запись тек. каталога - LD BC,10*256 + ' ' ; b=счетчик, c=пробел + LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел ; .loop3: INC HL LD (HL),C @@ -110,11 +123,12 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 JP Z,.MKD04 LD IX,HANDBUF XOR A - LD (IX+_sFM.ST_CLUSTER),A - LD (IX+_sFM.ST_CLUSTER+1),A - LD DE,HANDBUF+11 ; ячейка атрибутов файла + ; [ ] fat32 + LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A + LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A + LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .MKD04: EX DE,HL - LD BC,HANDBUF.SIZE-11 + LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT LDIR POP AF OUT (SLOT3),A diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index cb344cd..d290ad3 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -6,6 +6,8 @@ ; A=0 чтение/запись ; A=1 чтение ; A=2 запись +; ;!TODO A=3 запись без лишних сохранений кэша FAT +; ;!TODO A=4 записать кэш FAT ; выход: CF=0, A - дескриптор файла. ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// @@ -18,23 +20,26 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 ;JR .start ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; -;OPEN: ; - ;LD (.TMP),A ; enter point from CREATE .start: CALL GETWORD RET C - CALL MASK ; enter point from OPEN_FN + CALL MASK RET C -.FILE: CALL SEARCH.File ; enter point from EXEC +.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C + ;!TEST указатель на запись в каталоге FS + PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) ;R002 ; .FM: CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' - EXX - LD (IY+_sFM.HANDLE),E - LD (IY+_sFM.HANDLE+1),D - EXX + ;!TEST указатель на запись в каталоге FS + POP DE + ; EXX + LD (IY+_sFM.HANDLE),E + LD (IY+_sFM.HANDLE+1),D + ; EXX + ; LD D,YH LD E,YL LD HL,HANDBUF @@ -45,11 +50,11 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD A,(TASK) LD (IY+_sFM.TASK_NUM),A XOR A - ; + ; [ ] fat32 LD (IY+_sFM.KnownCluster_L),A - LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownCluster_L+1),A LD (IY+_sFM.KnownOffset_L),A - LD (IY+_sFM.KnownOffset_H),A + LD (IY+_sFM.KnownOffset_L+1),A ; LD (IY+_sFM.F_POSITION),A LD (IY+_sFM.F_POSITION+1),A @@ -57,10 +62,12 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.F_POSITION+3),A LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A - LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER + ; [ ] fat32 + LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L LD E,(HL) INC HL LD D,(HL) + ; [ ] fat32 LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER+1),D EX AF,AF' diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index c314c4e..5218696 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -16,19 +16,7 @@ READ: LD (.R_POINT),HL CALL OPENDSK JP C,.ERR_1 ;Расчёт смещения в секторах - ; LD C,(IY+_sFM.F_POSITION) - ; LD E,(IY+_sFM.F_POSITION+1) - ; LD A,E - ; AND #01 - ; LD B,A - ; LD D,(IY+_sFM.F_POSITION+2) - ; LD L,(IY+_sFM.F_POSITION+3) - ; LD H,0 - ; OR A - ; RR L - ; RR D - ; RR E - LD H,0 ; + LD H,0 ;!HARDCODE max file size = 8 gb LD L,(IY+_sFM.F_POSITION+3) LD D,(IY+_sFM.F_POSITION+2) LD E,(IY+_sFM.F_POSITION+1) @@ -43,7 +31,6 @@ READ: LD (.R_POINT),HL ;HL:DE FP (in sectors) ;BC FP residue (in bytes) ; - ;LD A,B OR C JP NZ,.ROV1 .ROV4: POP BC @@ -53,7 +40,7 @@ READ: LD (.R_POINT),HL LD (.SECTORH),HL LD (.SECTORL),DE .R_POINT+2: LD IX,0 - CALL BLOK_RD + CALL BLOCK_READ JP C,.ERR_1 LD DE,(.R_POINT) .PointerOnBuffer+1: @@ -84,7 +71,7 @@ READ: LD (.R_POINT),HL PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B @@ -109,7 +96,8 @@ READ: LD (.R_POINT),HL .NOREAD: .COD+1: LD A,0 OR A - RET + RET + ; .ROV1: PUSH BC PUSH HL PUSH DE @@ -119,39 +107,41 @@ READ: LD (.R_POINT),HL PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B POP HL JP C,.ERR_3 + ; inc HL:DE LD BC,1 ADD HL,BC EX DE,HL POP HL LD C,B ADC HL,BC + ; EXX - POP DE - LD HL,512 ;!HARDCODE - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.ROV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? -.ROV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - LDIR - LD (.R_POINT),DE + POP DE + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.ROV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? +.ROV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + LDIR + LD (.R_POINT),DE EXX JP .ROV4 .ERR_3: POP HL @@ -170,24 +160,24 @@ TSTSIZE: ADD HL,DE ; EXX - ;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 - ; + ;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 + LD C,(IY+_sFM.FS_REC.F_SIZE) + LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW AND A SBC HL,BC EXX - LD C,(IY+_sFM.F_SIZE+2) ;SIZE HIGH - LD B,(IY+_sFM.F_SIZE+3) + LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH + LD B,(IY+_sFM.FS_REC.F_SIZE+3) SBC HL,BC EXX RET C ;OK READ ALL diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index d3ee43a..09dd1f5 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -37,68 +37,76 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 CALL LOADDIR CALL SEARCH.Dir RET C - LD HL,(HANDBUF+_sFM.ST_CLUSTER) + ; [ ] fat32 + LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX .RMD17: PUSH HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) -.RMD12: PUSH AF + ; начинаем вычитывать содержимое каталога посекторно +.read_dir_loop: + PUSH AF PUSH HL PUSH IX + ; IN A,(SLOT3) PUSH AF IN A,(SLOT0) OUT (SLOT3),A - LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Read LD A,(FatBuffer.DRIVE) RST ToDSS.DRV - POP AF OUT (SLOT3),A - - LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + ; + ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + LD B,16 LD HL,CORE_BUFFERS.SECBUF -.RMD10: LD A,(HL) +.check_dir_loop: + LD A,(HL) OR A - JP Z,.RMD15 ;DIR EMPTY + JP Z,.RMD15 ;DIR EMPTY CP "." - JR Z,.RMD14 - CP #E5 ;!HARDCODE байт удаления файла - JR Z,.RMD14 - LD DE,11 ;!HARDCODE смещ. до байта атрибутов + JR Z,.next_record + CP #E5 ;!HARDCODE байт удаления файла + JR Z,.next_record + LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE - ;BIT 3,A - AND %0000'1000 + AND FAT_ATTR.VOLUME_ID JP Z,.error ;DIR NOT EMPTY -.RMD14: LD DE,#0020 +.next_record: + LD DE,#0020 ADD HL,DE - DJNZ .RMD10 - + DJNZ .check_dir_loop + ; POP IX POP HL INC IX LD A,XH OR XL - JR NZ,.RMD11 + JR NZ,.no_inc_hl INC HL -.RMD11: POP AF +.no_inc_hl: + POP AF DEC A - JR NZ,.RMD12 + JR NZ,.read_dir_loop + ; POP HL ; номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера JR NC,.RMD17 ; не конец цепочки -.RMD18: POP IX +.delete: + POP IX JP DEL_FN.DELETE ; пометить запись как "удаленная" .RMD15: POP IX POP HL POP AF POP HL - JR .RMD18 + JR .delete + ; .error: POP IX POP HL POP AF diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index 3f2fca4..39b4371 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -25,6 +25,12 @@ SCANDRV: LD A,Dss.DRV.RescanDRV LD C,Dss.DRV.RescanDRV RST ToDSS.DRV + ; проверка на ошибку boot disk lost + LD HL,.BOOT_DSK_LOST + LD E, +(80-.BOOT_DSK_LOST.size)/2 ; coord X + LD BC,.BOOT_DSK_LOST.size + JP C,KERNEL_PANIC + ; LD (LDRIVE),A ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 4. на всякий случай перечитываем дирректорию @@ -47,6 +53,10 @@ SCANDRV: RET PO EI RET + ; +.BOOT_DSK_LOST: + DZ "Boot drive lost o_O" +.BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ;/////////////////////////////////////////////////////////////////////// ; \ No newline at end of file diff --git a/DSS/API/SetDateTime.asm b/DSS/API/SetDateTime.asm index c95ae82..4da4a74 100644 --- a/DSS/API/SetDateTime.asm +++ b/DSS/API/SetDateTime.asm @@ -20,11 +20,11 @@ PUT_D_T: POP BC POP DE RET C - LD (IY+_sFM.TIME),E - LD (IY+_sFM.TIME+1),D - LD (IY+_sFM.DATE),C - LD (IY+_sFM.DATE+1),B - SET 7,(IY+_sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла + LD (IY + _sFM.FS_REC.TIME),E + LD (IY + _sFM.FS_REC.TIME+1),D + LD (IY + _sFM.FS_REC.DATE),C + LD (IY + _sFM.FS_REC.DATE+1),B + SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла AND A RET ; \ No newline at end of file diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index c8eb8db..05e4434 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -15,12 +15,12 @@ WRITE.RD_ONLY: ; HL - ADDRESS ; DE - SIZE ; A - FM -WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WR_FAT +WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF LD A,(FatCache.Update) OR A - CALL NZ,WR_FAT ; подкл. банку кеша FAT и записать его на диск + CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF RET ; @@ -32,9 +32,9 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] LD A,(IY+_sFM.ACCESS_MODE) AND FAT_ATTR.READ_ONLY JR NZ,.RD_ONLY - SET 7,(IY+_sFM.ACCESS_MODE) - SET 5,(IY+_sFM.ATTRIBUT) - LD A,(IY+_sFM.DRIVE) + SET 7,(IY + _sFM.ACCESS_MODE) + SET 5,(IY + _sFM.FS_REC.ATTRIBUT) + LD A,(IY + _sFM.DRIVE) CALL OPENDSK JR C,.ERR1 ; @@ -96,7 +96,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B @@ -134,14 +134,14 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] POP DE 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 + 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.FS_REC.F_SIZE+0),L + LD (IY + _sFM.FS_REC.F_SIZE+1),H + LD (IY + _sFM.FS_REC.F_SIZE+2),C + LD (IY + _sFM.FS_REC.F_SIZE+3),B AND A RET ; @@ -154,35 +154,35 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B POP DE POP HL EXX - POP DE - JP C,.ERR1 - LD HL,512 ;!HARDCODE - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.WOV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 -.WOV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - EX DE,HL - LDIR - LD (.R_POINT),HL + POP DE + JP C,.ERR1 + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.WOV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +.WOV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + EX DE,HL + LDIR + LD (.R_POINT),HL EXX PUSH HL PUSH DE diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index ea36f1c..aa61bc3 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -57,15 +57,15 @@ DISKINF:; [ ] 22/11/23 ; EX DE,HL LD HL,CORE_BUFFERS.BootSector.ID_FAT - LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length + LD A,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER - LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER + LD A,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_LABEL - LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL + LD A,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; PUSH DE @@ -113,16 +113,14 @@ DISKINF:; [ ] 22/11/23 RET C ; .CheckFreeSpace: - ; XOR A OR B CALL NZ,.CURRDS ; - ; -.FRESP2: + ;.FRESP2: LD D,B LD E,C - LD HL,(FAT_Max_Cluster) + LD HL,(FAT_Max_Cluster_L) DEC HL LD BC,(CORE_BUFFERS.BootSector.B_P_S) LD A,(CORE_BUFFERS.BootSector.S_P_C) @@ -133,7 +131,7 @@ DISKINF:; [ ] 22/11/23 LD HL,2 LD BC,0 .FRESP: PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT POP BC CP DSS_Error.sys.DISK_FULL RET Z diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 82d57b4..cc12620 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -43,7 +43,7 @@ FM_BUF: _sFM ; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND - CP FMCOUNT + CP FMCOUNT+1 JR NC,ABS_FM PUSH DE @@ -75,7 +75,7 @@ RES_FM: _mFM_FIND SCF RET Z XOR A - LD (IY+0),A + LD (IY + _sFM.FS_REC.NAME),A RET ; GET_FM: LD B,FMCOUNT @@ -84,7 +84,7 @@ GET_FM: LD B,FMCOUNT LD DE,CORE_BUFFERS.FM_BUF.Size .loop: ADD IY,DE INC C - LD A,(IY+0) + LD A,(IY + _sFM.FS_REC.NAME) OR A RET Z DJNZ .loop @@ -138,10 +138,10 @@ MOVE_FP: LD E,B JP .DO ;from End File -.B_end: LD C,(IY+_sFM.F_SIZE) - LD B,(IY+_sFM.F_SIZE+1) - LD E,(IY+_sFM.F_SIZE+2) - LD D,(IY+_sFM.F_SIZE+3) +.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) + LD B,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.FS_REC.F_SIZE+2) + LD D,(IY + _sFM.FS_REC.F_SIZE+3) JP .DO ;from Current Position .F_current: @@ -164,16 +164,16 @@ MOVE_FP: ; CY - FILE POINTER > SIZE ; NC - FILE POINTER < SIZE MOVE_CP: - LD L,(IY+_sFM.F_SIZE) - LD H,(IY+_sFM.F_SIZE+1) - LD E,(IY+_sFM.F_POSITION) - LD D,(IY+_sFM.F_POSITION+1) + LD L,(IY + _sFM.FS_REC.F_SIZE) + LD H,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.F_POSITION) + LD D,(IY + _sFM.F_POSITION+1) AND A SBC HL,DE - LD L,(IY+_sFM.F_SIZE+2) - LD H,(IY+_sFM.F_SIZE+3) - LD E,(IY+_sFM.F_POSITION+2) - LD D,(IY+_sFM.F_POSITION+3) + LD L,(IY + _sFM.FS_REC.F_SIZE+2) + LD H,(IY + _sFM.FS_REC.F_SIZE+3) + LD E,(IY + _sFM.F_POSITION+2) + LD D,(IY + _sFM.F_POSITION+3) SBC HL,DE RET ; \ No newline at end of file diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index f0620a1..ddabfbe 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -216,24 +216,19 @@ OPENDSK:;!TEST DRV.Open POP BC JP C,.error ;[ ] 29/02/2024 fix "open drive error" - IF TEST_FEATURE LD A,(FatBuffer.DRIVE) LD D,A PUSH DE - ENDIF ; LD A,B LD (FatBuffer.DRIVE),A ; CALL RD_BPB ;[ ] 29/02/2024 fix "open drive error" - IF TEST_FEATURE POP DE LD A,D JR C,.error_disk - ELSE - RET C - ENDIF + ; RET C ; .exit: LD A,(LDRIVE) AND A @@ -244,19 +239,28 @@ OPENDSK:;!TEST DRV.Open LD A,DSS_Error.sys.NOT_READY RET ;[ ] 29/02/2024 fix "open drive error" - IF TEST_FEATURE .error_disk: CALL OPENDSK.force + LD A,(BOOTDSK.NUM) + CALL C,OPENDSK.force + ; проверка на ошибку + LD HL,.NOT_READY + LD E, +(80-.NOT_READY.size)/2 ; coord X + LD BC,.NOT_READY.size + JP C,KERNEL_PANIC + ; LD A,DSS_Error.sys.NOT_READY SCF RET - ENDIF + ; +.NOT_READY: DZ "Boot drive not ready..." +.NOT_READY.size EQU $-.NOT_READY ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; -OPENDIR:;!TEST ;[x] some optimize +OPENDIR:;[x] some optimizations ;XOR A ;CALL SET_FM LD IY,CORE_BUFFERS.FM_BUF @@ -266,11 +270,12 @@ OPENDIR:;!TEST ;[x] some optimize JR NZ,.SUBDIR .REROOT1: LD DE,0 - ;!TEST ;[x] some optimize - ;LD (IY+_sFM.ST_CLUSTER),E - ;LD (IY+_sFM.ST_CLUSTER+1),D + ;[x] some optimizations + ;LD (IY+_sFM.FIRST_CLUSTER_L),E + ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D + ; [ ] fat32 EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL EX DE,HL ; CALL LOADDIR @@ -284,11 +289,12 @@ OPENDIR:;!TEST ;[x] some optimize .SUBDIR: CP "." JR NZ,.SUBDIR2 - ;!TEST ;[x] some optimize - ;LD A,(IY+_sFM.ST_CLUSTER) ;R005 - LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R005 + ;!TEST ;[x] some optimizations + ;LD A,(IY+_sFM.FIRST_CLUSTER_L) ;R005 + ; [ ] fat32 + LD A,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 ; - OR (IY+_sFM.ST_CLUSTER+1) ;R005 + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) ;R005 JR NZ,.SUDI1 ;R005 INC HL ;R005 LD A,(HL) ;R005 @@ -314,16 +320,16 @@ OPENDIR:;!TEST ;[x] some optimize .SUBDIR3: CALL FINDDIR RET C - ;!TEST ;[x] some optimize - ;LD (IY+_sFM.ST_CLUSTER),E - ;LD (IY+_sFM.ST_CLUSTER+1),D + ;!TEST ;[x] some optimizations + ;LD (IY+_sFM.FIRST_CLUSTER_L),E + ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D ;LD DE,#4000 ;!HARDCODE ;LD (IY+_sFM.F_SIZE),E ;LD (IY+_sFM.F_SIZE+1),D EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32 LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL EX DE,HL ; JP LOADDIR @@ -335,7 +341,6 @@ OPENDIR:;!TEST ;[x] some optimize ;----------------------------------------------------------------------; -; .custom: ; Преобразовать имя 8.3 -> 11 формат ; вход: hl = 8.3 имя ; de = буфер имени 11 симв. формата diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index a0337ac..fdef6fc 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -232,33 +232,9 @@ PORTAL.out_MAIN: ; ; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; ; -/* - STRUCT _sBOOT_SEC -.JMP: BLOCK 3,0 ; +#00 "JMP" -.ID_NAME: TEXT 8,{"DSS_1.7","0"} ; +#03 DOS NAME - DB "DSS_1.70" -; Block Parameters BIOS -.B_P_S: WORD #200 ; +#0B BYTE PER SECTOR -.S_P_C: BYTE 2 ; +#0D SECTORS PER CLUSTER -.RESERVE: WORD 1 ; +#0E RESERVE SECTORS -.FAT_NUM: BYTE 2 ; +#10 AMOUNT FATS -.F_P_DIR: WORD 112 ; +#11 FILES IN DIRECTORY -.S_P_D: WORD 1440 ; +#13 ALL SECTORS ON DISK -.ID_FORM: BYTE #F0 ; +#15 ID FORMAT -.S_P_F: WORD 2 ; +#16 SIZE FAT IN SECTORS -.S_P_T: WORD 9 ; +#18 SECTOR PER TRACK -.HEADS: WORD 2 ; +#1A AMOUNT SIDES -.HIDDEN: DWORD 0 ; +#1C HIDDEN SECTORS -.BPB_BIG_TOTAL_SECTORS: DWORD 0 ; +#20 BIG TOTAL SECTOR -.BPB_PHISICAL_DRIVE_NUMBER: WORD #80 ; +#24 PHISICAL DRIVE NUMBER -.BPB_EXT_BOOT_RECORD_SIGNATURE: BYTE #29 ; +#26 EXTENDED BOOT RECORD SIGNATURE -.BPB_SERIAL_NUMBER: DWORD 0 ; +#27 VOLUME SERIAL NUMBER -.BPB_LABEL: TEXT 11,{"NO NAME"," "} ; +#2B DISK LABEL -.ID_FAT: TEXT 8,{"FAT16"," "} ; +#36 FILE SYSTEM ID ( BPB_FS_ID ) - ENDS -*/ ;R01 ; Area for boot sector BootSector. -;BootSector _sBOOT_SEC ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" } +;BootSector _sBOOT_SECTOR_PARAMS ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" } ; end boot sector ;R01 @@ -451,7 +427,7 @@ ADRST10: ;DS 512 ;,0 INCLUDE "EXECUTE.ASM" INCLUDE "INTMOUSE.ASM" INCLUDE "Procedures.asm" - + INCLUDE "Kernel_Panic.asm" ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS @@ -486,15 +462,15 @@ WorkDirectory: DB '\' CLEAR_ZONE.start EQU $ MODULE CORE_BUFFERS -BUFFERSplace _sBuffers=$ -FM_BUF _sFM = BUFFERSplace.FileManipulator -.Size EQU _sFM -.FullSize EQU FMCOUNT*FM_BUF.Size -BootSector _sBOOT_SEC = BUFFERSplace.BootSector -EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header -XSTACK EQU BUFFERSplace.Stack.SPoint -BUFFER EQU BUFFERSplace.Buffer -SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER +BUFFERSplace _sBuffers=$ +FM_BUF _sFM = BUFFERSplace.FileManipulator +.Size EQU _sFM +.FullSize EQU FMCOUNT*FM_BUF.Size +BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector +EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header +XSTACK EQU BUFFERSplace.Stack.SPoint +BUFFER EQU BUFFERSplace.Buffer +SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER ENDMODULE CLEAR_ZONE.size EQU _sBuffers diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 618662b..61320d6 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -151,20 +151,20 @@ PATH_PR EQU 2 ;%00000100 EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 -EX_PATH: EXX - LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер - LD (NM_PATH),HL - LD HL,NM_NAME_A - LD (NM_NAME),HL - LD HL,NM_EXTN_A - LD (NM_EXTN),HL - LD HL,NM_DRIVE_A - LD (NM_DRIVE),HL +EX_PATH: + EXX + LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер + LD (NM_PATH),HL + LD HL,NM_NAME_A + LD (NM_NAME),HL + LD HL,NM_EXTN_A + LD (NM_EXTN),HL + LD HL,NM_DRIVE_A + LD (NM_DRIVE),HL EXX INC B DEC B - ;JR Z,EX_GET_ALL - JR Z,EX_FULL ;0 ; разобрать строку + JR Z,EX_FULL ;0 ; разобрать строку DEC B JR Z,EX_GET_DRIVE ;1 ; выделить имя диска DEC B @@ -222,10 +222,6 @@ EX_GET_TYPE LD (NM_EXTN),DE JR EX_FULL -; Разобрать строку -; EX_GET_ALL -; JR EX_FULL - ; Выделить диск, путь, файл и расш. EX_GET_ALL_EX: EX DE,HL @@ -253,15 +249,15 @@ EX_GET_ALL_EX: ; Разобрать строку EX_FULL: EX AF,AF' EXX - XOR A - LD HL,(NM_PATH) - LD (HL),A - LD HL,(NM_NAME) ; адрес буфера под имя файла - LD (HL),A - LD HL,(NM_EXTN) - LD (HL),A - LD HL,(NM_DRIVE) - LD (HL),A + XOR A + LD HL,(NM_PATH) + LD (HL),A + LD HL,(NM_NAME) ; адрес буфера под имя файла + LD (HL),A + LD HL,(NM_EXTN) + LD (HL),A + LD HL,(NM_DRIVE) + LD (HL),A EXX EX AF,AF' EX_PAT0: LD DE,TMPBUF @@ -1070,21 +1066,21 @@ _TST_PROC: JP C,ERREXE0 LD (EXE_MEM),A EXX - POP DE ;снимаем со стека адрес возврата - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL + POP DE ;снимаем со стека адрес возврата + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL EXX ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит LD A,(EXE_MEM) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 26dd741..6671bd4 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -11,8 +11,8 @@ ;----------------------------------------------------------------------; ; Поиск записи каталога в списке каталога ; -; вход: a=атрибут записи -; выход: de'=индекс записи в списке каталога +; вход: a = атрибут записи +; выход: de = индекс записи в списке каталога ; (HANDBUF) = file's direcory record ; CF - каталог не найден SEARCH: @@ -63,21 +63,23 @@ SEARCH: INC HL INC DE DJNZ .loop_compare + ; + LD D,XH + LD E,XL ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) + EXX ; LD D,XH ; LD E,XL - LD D,XH - LD E,XL - EXX - LD D,XH - LD E,XL + PUSH IX EXX ; LD HL,HANDBUF EX DE,HL LD BC,HANDBUF.SIZE LDIR - ;POP AF + ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится удалить) + POP DE + ; EX AF,AF' OUT (SLOT3),A EX AF,AF' @@ -174,13 +176,13 @@ FINDDIR: PUSH AF LD IX,DIRPAGE.buffer .big_loop: - LD A,(IX+00) + LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error CP #E5 JR Z,.next_step - LD A,(IX+11) ;!HARDCODE - AND #10 ;!HARDCODE + LD A,(IX + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + AND FAT_ATTR.DIRECTORY JR Z,.next_step LD HL,MASKARE LD D,XH @@ -197,10 +199,10 @@ FINDDIR: INC DE DJNZ .loop ; - LD A,(IX+0) + LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) CP "." JP NZ,.ADDSPEC - LD A,(IX+1) ;!HARDCODE + LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME + 1) CP "." JP NZ,.IT_DIR LD HL,WorkDirectory @@ -287,9 +289,9 @@ FINDDIR: ; .MM3: LD (HL),0 ; ; JP IT_DIR ; -.IT_DIR: - LD E,(IX+_sFM.ST_CLUSTER) - LD D,(IX+_sFM.ST_CLUSTER+1) +.IT_DIR: ; [ ] fat32 + LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) POP AF OUT (SLOT3),A AND A @@ -331,25 +333,20 @@ 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 ; сохр. в дескриптор - ; - ;LD D,(IY+_sFM.ST_CLUSTER+1) ; de=номер первого кластера - ;LD E,(IY+_sFM.ST_CLUSTER) - ;LD A,D - ;OR E - ; номер первого кластера - LD A,(IY+_sFM.ST_CLUSTER) - OR (IY+_sFM.ST_CLUSTER+1) - ; + ; номер первого кластера + ; [ ] fat32 + LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) JP Z,.LROTDIR ; root ?? + ; LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько XOR A ; дескриптор @@ -362,17 +359,10 @@ LOADDIR: LD HL,(FatBuffer.DIR_FRH) ; ст. разряд LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора LD A,(FatBuffer.DIR_S_S) - ;!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 ; число секторов - ; + LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога + CP B + JR NC,.RTD1 + LD B,A ; число секторов .RTD1: LD A,(FatBuffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов @@ -453,13 +443,15 @@ SAVEDIR: ; LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A - LD D,(IY+_sFM.ST_CLUSTER) - LD E,(IY+_sFM.ST_CLUSTER+1) + ;[ ] fat32 + LD D,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + LD E,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,D OR E JP Z,.SROTDIR LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory +;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) .DIRSIZE+1: LD DE,0 XOR A @@ -489,23 +481,21 @@ SAVEDIR: ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ; !FIXIT чёт не используется - IF COMPILE_UNUSED_CODE -TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open - LD A,(FatBuffer.DRIVE) - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - OR A - RET Z - ENDIF + ; не используется +; TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open +; LD A,(FatBuffer.DRIVE) +; LD C,Dss.DRV.MediaCheck +; RST ToDSS.DRV +; OR A +; RET Z + ; рег. D - номер диска RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC - IN A,(SLOT0) OUT (SLOT3),A - LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE + LD A,(FatBuffer.DRIVE) ;R08 ;LD DE,BOOT+#C000 LD DE,CORE_BUFFERS.SECBUF+#C000 @@ -519,7 +509,7 @@ RD_BPB: LD C,SLOT3 //PUSH IY ; пока без индексного, но может пригодиться LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07 + LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 ;R05 AND A SBC HL,DE @@ -527,38 +517,38 @@ RD_BPB: LD C,SLOT3 ;R08 LD HL,CORE_BUFFERS.SECBUF LD DE,CORE_BUFFERS.BootSector - LD BC,_sBOOT_SEC ; size + LD BC,_sBOOT_SECTOR_PARAMS ; size LDIR ; //LD IY,BootSector ; пока без индексного, но может пригодиться - //LD A,(IY+_sBOOT_SEC.ID_FORM) - LD A,(CORE_BUFFERS.BootSector.ID_FORM) + //LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) CP #F0 JP C,DOS_X_Error.UnknownBPB ;!TEST ;LD HL,0 ; calc. first sector FAT - ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - ;LD D,(IY+_sBOOT_SEC.RESERVE+1) + ;LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + ;LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) ;ADD HL,DE - //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - //LD H,(IY+_sBOOT_SEC.RESERVE+1) - LD HL,(CORE_BUFFERS.BootSector.RESERVE) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + //LD H,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) + LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS) ; - ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec - ; LD D,(IY+_sBOOT_SEC.HIDDEN+1) + ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec + ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; ADD HL,DE ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 LD (FatBuffer.FAT2_XX),HL - //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT - //LD D,(IY+_sBOOT_SEC.S_P_F+1) + //LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ; sectors in FAT + //LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) LD DE,(CORE_BUFFERS.BootSector.S_P_F) @@ -577,8 +567,8 @@ RD_BPB: LD C,SLOT3 AND A ; CF = 0 - //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors - //LD B,(IY+_sBOOT_SEC.B_P_S+1) + //LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sectors + //LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) LD BC,(CORE_BUFFERS.BootSector.B_P_S) ; RL C ; RL B @@ -591,19 +581,23 @@ RD_BPB: LD C,SLOT3 ; LD A,C ;;;; LD A,B + ; RL C RLA + ; RL C RLA + ; RL C RLA + ; LD C,A LD B,0 ; BC - File handels in sectors ;;;; LD (FatBuffer.F_P_S),A - //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel - //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + //LD E,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ; Number file handel + //LD D,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1) LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) EX DE,HL @@ -628,19 +622,19 @@ RD_BPB: LD C,SLOT3 ;LD H,B ; тут в B ноль должен быть ;LD L,B - ;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector - ;LD B,(IY+_sBOOT_SEC.B_P_S+1) + ;LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector + ;LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) - //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector - //LD H,(IY+_sBOOT_SEC.B_P_S+1) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector + //LD H,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize + LD A,(CORE_BUFFERS.BootSector.S_P_C) + ;!TODO FATcacheSize ;NEXTAD3 ; .loop3: ADD HL,BC ; calc. cluster size ; DEC A ; JR NZ,.loop3 - ;!TODO проверить правильно ли считает XOR 1 ; calc. cluster size JR Z,.loop3.end RRA @@ -649,7 +643,6 @@ RD_BPB: LD C,SLOT3 JP NC,.loop3 .loop3.end: ; - LD (FatBuffer.CLU_LEN),HL EX DE,HL LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize @@ -663,6 +656,12 @@ RD_BPB: LD C,SLOT3 ;ENDIF //////////////////////////////////////////////////////////////////////// +;!TODO detect fat type by clusters! + ;[ ] fat32 reset fat32 variables + LD HL,0 + LD (FatBuffer.ENDCLUS_HIGH),HL + LD (FAT_Max_Cluster_H),HL + ; LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG LD B,3 @@ -678,10 +677,25 @@ RD_BPB: LD C,SLOT3 INC HL CP ' ' JR Z,.loop6 - + ; CP '1' - JP NZ,DOS_X_Error.UnknownBPB - LD A,(HL) + IF _FAT32_ENABLE + JP Z,.fat1x + ;[ ] fat32 + CP '2' + JP NZ,DOS_X_Error.UnknownBPB + LD A,#46 ; #46-#26 = 32 fat type + LD HL,#0FFF + LD (FatBuffer.ENDCLUS_HIGH),HL + LD (FAT_Max_Cluster_H),HL + LD H,#FF + JR .BPB_FAT + ; + ELSE + JP NZ,DOS_X_Error.UnknownBPB + ENDIF + ; +.fat1x: LD A,(HL) CP '6' ; FAT16 LD HL,#FFFF JR Z,.BPB_FAT @@ -689,8 +703,9 @@ RD_BPB: LD C,SLOT3 JP NZ,DOS_X_Error.UnknownBPB LD HL,#0FFF .BPB_FAT: - LD (FatBuffer.FAT_TYP),A - LD (FatBuffer.ENDCLUS),HL + SUB #26 ; A-#26 = fat type (12, 16, 32) + LD (FatBuffer.FAT_TYPE),A + LD (FatBuffer.ENDCLUS_LOW),HL ;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer //////////////////////////////////////////////////////////////////////// @@ -698,8 +713,8 @@ RD_BPB: LD C,SLOT3 LD HL,0 - //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track - //LD B,(IY+_sBOOT_SEC.S_P_T+1) + //LD C,(IY+_sBOOT_SECTOR_PARAMS.S_P_T) ; Sector per track + //LD B,(IY+_sBOOT_SECTOR_PARAMS.S_P_T+1) LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага @@ -712,28 +727,27 @@ RD_BPB: LD C,SLOT3 //////////////////////////////////////////////////////////////////////// LD DE,(FatBuffer.DAT_FRL) -; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec -; LD D,(IY+_sBOOT_SEC.HIDDEN+1) +; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec +; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; AND A ; SBC HL,DE ; EX DE,HL - //LD L,(IY+_sBOOT_SEC.S_P_D) - //LD H,(IY+_sBOOT_SEC.S_P_D+1) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.S_P_D) + //LD H,(IY+_sBOOT_SECTOR_PARAMS.S_P_D+1) LD HL,(CORE_BUFFERS.BootSector.S_P_D) LD A,H OR L JP NZ,.HDDSMAL ; - //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) - //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) - LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS) - - //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) - //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) - LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS) + //LD H,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+1) + LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_L) + //LD C,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+2) + //LD B,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+3) + LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_H) AND A SBC HL,DE JP NC,.HDDBIG @@ -753,45 +767,37 @@ RD_BPB: LD C,SLOT3 RR L JP .S4C01 .S4C02: INC HL - LD (FAT_Max_Cluster),HL + LD (FAT_Max_Cluster_L),HL //POP IY -; LD DE,FAT -; LD HL,0 -; LD IX,(FAT_FRM) -; LD B,3 -; LD A,(DRIVE) -; LD C,Dss.DRV.Read -; RST ToDSS.DRV -; JP C,RDERR1 - LD HL,0 - LD (FatCache),HL + XOR A + LD H,A + LD L,A + LD (FatCache.Block),HL + LD (FatCache.Update),A SET_PAGE_X FATPAGE PUSH AF XOR A - CALL READ_FAT + CALL READ_FAT_TABLE POP AF OUT (SLOT3),A CALL R_CLUST XOR A RET - +;!TODO detect fat type by clusters! .IBM_DOS: - LD A,(CORE_BUFFERS.BootSector.ID_FORM) + LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) CP #F0 JR C,DOS_X_Error.UnknownBPB -;????? надо ли изменить? -// OR 2 -// CP #FA ; ID ram-диска - CP #F8 ; а если не F8? -;????? + ; ID ram-диска - #FA + CP #F8 ; !FIXIT не обязательно если винт, то не FAT12 LD A,'6' LD HL,#FFFF JP Z,.BPB_FAT - + ; LD A,'2' LD HL,#0FFF JP .BPB_FAT @@ -813,7 +819,8 @@ FatBuffer: .MSG: DB 'FAT' .READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) .BLOCK: DB #00 -.DIR_CLU: DW #0000 +.DIR_CLU_L: DW #0000 +.DIR_CLU_H: DW #0000 ; fat32 .DRIVE: DB #FF .FAT_FRM: .FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT @@ -823,15 +830,19 @@ FatBuffer: .F_P_S: DB #00 ; число файловых записей в секторе .DIR_S_S: DB #00 ; DIR_SEC_SIZE .DAT_FRL: DW #0000 ; MSD_DAT_SEC low -;.DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ;!FIXIT не используется .CLU_LEN: .B_P_C: DW #0000 ; CLUSTER_LEN .C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ;!TODO fat32 .S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? -.ENDCLUS: DW #FFFF +.ENDCLUS_LOW: DW #FFFF +.ENDCLUS_HIGH: DW #FFFF ; !TODO for fat32 ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; INCLUDE "FAT12_16.ASM" + IF _FAT32_ENABLE + INCLUDE "FAT32.ASM" + ENDIF ; \ No newline at end of file diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 0443740..e060a3c 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -14,15 +14,26 @@ ;--------------------------------------------------------------- ; Установить начальный кластер для чтения -R_CLUST LD HL,#0001 +; [ ] fat32 +R_CLUST: + LD HL,#0001 LD (G_CLUST.num),HL RET +.FAT32: WORD 0 ; найти первый свободный кластер +; [ ] fat32 G_CLUST: .num+1: LD HL,#0001 .loop: INC HL ; номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + ; [x] fat32 + IF _FAT32_ENABLE + LD A,(FatBuffer.FAT_TYPE) + XOR 32 + CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER + ENDIF + ; + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF RET Z ; ошибка ? @@ -30,10 +41,11 @@ G_CLUST: OR E JR NZ,.loop LD (G_CLUST.num),HL - XOR A + ; XOR A RET ; HL - CLUSTER +; [ ] fat32 INC_FAT: PUSH HL CALL G_CLUST @@ -41,22 +53,21 @@ INC_FAT: RET C ; PUSH HL - PUSH HL - EX DE,HL ; hl=номер кластера -.loop: CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера +; PUSH HL +; EX DE,HL ; hl=номер кластера +; .loop: CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера +; EX DE,HL +; JR NC,.loop ; не конец цепочки EX DE,HL - JR NC,.loop ; не конец цепочки - EX DE,HL - POP DE ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера +; POP DE ; номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера ;!FIXIT <нет контроля ошибки> ; - ; POP HL - LD DE,(FatBuffer.ENDCLUS) ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WR_FAT? - ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ; AND A RET @@ -65,66 +76,74 @@ INC_FAT: ;----------------------------------------------------------- ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl = номер кластера +; de = СТАРШЕЕ слово номера кластера (только для FAT32) ; выход: hl = номер кластера -; de = номер след. кластера +; de = номер след. кластера (если 0, то кластер hl свободен) ; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb ;----------------------------------------------------------- -R_F_FAT: - EX DE,HL - LD HL,(FAT_Max_Cluster) - AND A +;[ ] fat32 +READ_FROM_FAT: + ;[x] fat32 + PUSH DE + LD A,(FatBuffer.FAT_TYPE) + XOR 32 + JR NZ,.low ; Z=0 проверяем младшее слово номера кластера + LD HL,(FAT_Max_Cluster_H) ; проверяем старшее слово номера кластера + JP .high + ; +.low: EX DE,HL + LD HL,(FAT_Max_Cluster_L) +.high: ; CF = 0 SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL + ;[x] fat32 + POP DE + ; RET C SET_PAGE_X FATPAGE PUSH HL PUSH AF - LD A,(FatBuffer.FAT_TYP) - CP "2" ; fat12 - JR Z,R_F_F12 + LD A,(FatBuffer.FAT_TYPE) + CP 16 ; fat16 + JR C,.FAT12 + JR NZ,.FAT32 ; fat16, просто читать след. номер -R_F_F16: - CALL GET_FAT16_CELL +.FAT16: CALL GET_FAT16_CELL LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) POP AF OUT (SLOT3),A - ;!TODO #FFF7 - кластер с косякчными секторами + ;!TODO #FFF7 - кластер с косячными секторами LD HL,#FFEF ;!HARDCODE XOR A ; DssErr.sys.NO_ERROR SBC HL,DE ; проверка на служ. кластеры POP HL RET ; -R_F_F12: - CALL GET_FAT12_CELL +.FAT12: CALL GET_FAT12_CELL LD E,(HL) INC HL LD D,(HL) - JR C,R_F_F01 + JR C,.Correct_1 LD A,D AND #0F LD D,A - JP R_F_F02 + JR .Correct_2 ; -R_F_F01: +.Correct_1: LD A,E AND #F0 - RR D ; вправо на 4 битa - RRA - RR D - RRA - RR D - RRA - RR D - RRA + DUP 4 ; вправо на 4 битa + RR D + RRA + EDUP LD E,A -R_F_F02: +.Correct_2: POP AF OUT (SLOT3),A LD HL,#0FEF @@ -132,20 +151,21 @@ R_F_F02: SBC HL,DE ; проверка на служ. кластеры POP HL RET - +.FAT32: ; [ ] fat32 + CALL GET_FAT32_CELL + DI + HALT ;----------------------------------------------------------- ; Записать в кеш FAT-а номер кластера -; вход: de = номер кластера -; hl = ? номер первого кластера -; выход: hl = ? номер след. кластера -; de = номер кластера -; in: HL - CLUSTER -; out: DE - (CLUSTER) +; вход: hl = номер кластера в который записать +; de = номер кластера который вписать +; выход: такой же как и вход ;----------------------------------------------------------- -W_T_FAT: +; [ ] fat32 +WRITE_TO_FAT: PUSH DE EX DE,HL - LD HL,(FAT_Max_Cluster) + LD HL,(FAT_Max_Cluster_L) AND A SBC HL,DE EX DE,HL @@ -161,30 +181,12 @@ W_T_FAT: ;LD A,1 ;LD (FatCache.Update),A ; - LD A,(FatBuffer.FAT_TYP) - CP "2" ; fat12 - 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,(FatBuffer.FAT_TYPE) + CP 16 ; fat16 + JR C,.FAT12 + JR NZ,.FAT32 + ; +.FAT16: PUSH DE CALL GET_FAT16_CELL POP DE LD (HL),E ; сохр. в кеше FAT-а @@ -194,18 +196,17 @@ W_T_F16: POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,1 + XOR A + INC A LD (FatCache.Update),A - ; - XOR A + ; CF = 0 RET ; - ; fat12 -W_T_F12: ;!FIXIT переделать на переменные FAT_CACHE +.FAT12: ;!FIXIT переделать на переменные FAT_CACHE PUSH DE CALL GET_FAT12_CELL POP DE - JR C,W_T_F01 ; номер нечётный + JR C,.Correct_1 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -216,30 +217,19 @@ W_T_F12: ;!FIXIT POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,1 + XOR A + INC A LD (FatCache.Update),A - ; - AND A + ; CF = 0 RET - ; -W_T_F01:; влево на 4 битa - ;SLA E - ;LD A,E - ;RL D - ;RLA - ;RL D - ;RLA - ;RL D - ;RLA - ;RL D - ;LD E,A - ; - ex de,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl - ex de,hl +.Correct_1: + ; влево на 4 битa + EX DE,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL ; LD A,(HL) AND #0F @@ -251,26 +241,34 @@ W_T_F01:; POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,1 + XOR A + INC A LD (FatCache.Update),A - ; - AND A - RET + ; LD A,1 + ; LD (FatCache.Update),A + ; AND A + ; CF = 0 + RET +.FAT32: ; [ ] fat32 + DI + HALT ;RX01 ;RE_FAT: ; Прочитать в кеш 16 секторов FAT-а ; A - NEW FAT BLOCK -READ_FAT: +READ_FAT_TABLE: PUSH HL PUSH AF LD A,(FatCache.Update) OR A - CALL NZ,WR_FAT.Start + CALL NZ,WRITE_FAT_TABLE.Start POP AF LD L,A - LD H,0 - LD (FatCache),HL + XOR A + LD H,A ;!FIXIT fat32 - у фат32 блоков может быть валом + LD (FatCache.Block),HL + LD (FatCache.Update),A ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 @@ -284,7 +282,7 @@ READ_FAT: ;LD IX,0 ;ADD IX,DE ; номер лог. сектора ; - LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32 + LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE @@ -293,15 +291,17 @@ READ_FAT: RET ; Подключить банку кеша FAT и записать его на диск -WR_FAT: SET_PAGE_X FATPAGE +WRITE_FAT_TABLE: + SET_PAGE_X FATPAGE PUSH AF CALL .Start ;!TODO нет контроля ошибок POP AF OUT (SLOT3),A RET - ; Запись кеша (всего?) FAT-а на диск -.Start: LD HL,(FatCache) - LD H,0 + ; Запись кеша FAT-а на диск +.Start: LD HL,(FatCache.Block) + ; + ;LD H,0 ;FAT BLOCK * 16 = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 @@ -348,14 +348,17 @@ WR_FAT: SET_PAGE_X FATPAGE LD DE,(FatBuffer.FAT2_XX) ADD HL,DE EX DE,HL + LD XH,D + LD XL,E ; - LD XH,D - LD XL,E - ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора + LD HL,0 + ; CF = ADD HL,DE + ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? + IF _FAT32_ENABLE + RL L + ENDIF ; LD DE,FATPAGE.cache - LD HL,0 LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write RST ToDSS.DRV @@ -386,9 +389,9 @@ GET_FAT16_CELL: AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FatCache) ; C - BLOCK FAT IN CASH + LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH CP C - CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET @@ -399,24 +402,21 @@ GET_FAT16_CELL: GET_FAT12_CELL: LD D,H LD E,L - RR H + SRL H RR L ; сдвиг вправо через CF PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; - ;IF COMPILE_UNUSED_CODE + IF FAT_CACHE.Size < #2000 ;!FIXIT оптимизировать LD A,H LD B,H - ; AND #1F ;AND FAT_CACHE.Size_Mask_16 ; - LD H,A LD A,B - ; RLCA RLCA @@ -427,11 +427,10 @@ GET_FAT12_CELL: AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - - LD BC,(FatCache) ; C - BLOCK FAT IN CASH + LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH CP C - CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а - ;ENDIF + CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а + ENDIF ; LD DE,FATPAGE.cache ADD HL,DE @@ -441,8 +440,8 @@ GET_FAT12_CELL: ; in: HL - CLUSTER ; out: HL:IX - SECTOR -NSECTOR: - LD DE,0 ;!FIXIT for FAT32 +NSECTOR:;[x] fat32 + LD DE,(FAT_Max_Cluster_H) DEC HL DEC HL LD A,(CORE_BUFFERS.BootSector.S_P_C) @@ -470,53 +469,58 @@ NSECTOR: RET //////////////////////////////////////////////////////////////////////// +;[ ] fat32 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE MACRO _GetSavedCluster exit_to LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_H) + LD D,(IY+_sFM.KnownCluster_L+1) LD A,D + INC B OR E JR Z,exit_to + DEC B ; PUSH DE PUSH HL PUSH BC LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_H) + LD D,(IY+_sFM.KnownOffset_L+1) LD A,D OR E JR Z,.noOptimization_1 ; POP HL - AND A SBC HL,DE JR C,.noOptimization_2 ; LD C,L LD B,H - POP HL POP DE + POP HL ; - EX DE,HL + INC B JP exit_to .noOptimization_1: POP BC .noOptimization_2: POP HL POP DE + INC B JP exit_to ENDM + ; +;[ ] fat32 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE MACRO _SaveGetedCluster LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_H),H + LD (IY+_sFM.KnownCluster_L+1),H POP BC LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_H),B + LD (IY+_sFM.KnownOffset_L+1),B ENDM ;; -BLOK_RD.ECL2: +BLOCK_READ.ECL2: ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP BC ; @@ -528,38 +532,42 @@ BLOK_RD.ECL2: ;READ SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors -BLOK_RD: PUSH BC +BLOCK_READ: + PUSH BC LD (READ.PointerOnBuffer),IX LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A - LD B,0 ;!FIXIT + LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC - ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb + ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb LD B,XH LD C,XL - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) + PUSH HL ;RESIDUE + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,H OR L ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;JR NZ,BLOKRD2 PUSH BC JR Z,.ECL2 - ;JP ECL2 ;RY01 JR BLOKRD0 + ;JP ECL2 ;RY01 JR BLOKRD0 _GetSavedCluster .enter_loop1 ; .loop1: PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT POP BC - JR C,.ECL2 ;RY01 + JR C,.ECL2 ;RY01 EX DE,HL - DEC BC + ; DEC BC .enter_loop1: - LD A,B ; ВС - смещение внутри файла в кластерах - OR C - JR NZ,.loop1 + ; LD A,B ; ВС - смещение внутри файла в кластерах + ; OR C + ; JR NZ,.loop1 + INC B + DEC BC + DJNZ .loop1 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster ; @@ -619,7 +627,7 @@ BLOK_RD: PUSH BC .BLOKRD7: EX DE,HL PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT POP BC JR C,.ECL1 ;RY01 EX DE,HL @@ -674,12 +682,12 @@ BLOK_WR: LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC + ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb LD B,XH LD C,XL - - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) + PUSH HL ;RESIDUE + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,H OR L ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE @@ -690,35 +698,40 @@ BLOK_WR: PUSH BC CALL G_CLUST JP C,.Error - LD (IY+_sFM.ST_CLUSTER),L - LD (IY+_sFM.ST_CLUSTER+1),H - LD DE,(FatBuffer.ENDCLUS) - CALL W_T_FAT + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H + LD DE,(FatBuffer.ENDCLUS_LOW) + CALL WRITE_TO_FAT PUSH HL - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? - ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ; POP HL POP BC + INC B JP .WR2 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE .GetSavedCluster: _GetSavedCluster .WR2 ; .loop: PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT JR NC,.WRB PUSH HL CALL INC_FAT POP HL JP C,.Error - CALL R_F_FAT + CALL READ_FROM_FAT .WRB: POP BC EX DE,HL + ; DEC BC +.WR2: + ; LD A,B + ; OR C + ; JR NZ,.loop + INC B DEC BC -.WR2: LD A,B - OR C - JR NZ,.loop + DJNZ .loop ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster @@ -778,13 +791,13 @@ BLOK_WR: RET Z .WR7: EX DE,HL PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT JR NC,.WR9 PUSH HL CALL INC_FAT POP HL JR C,.ErrorFull - CALL R_F_FAT + CALL READ_FROM_FAT .WR9: POP BC EX DE,HL PUSH HL @@ -825,10 +838,11 @@ BLOK_WR: //////////////////////////////////////////////////////////////////////// -FatCache: WORD #0000 -.Block EQU FatCache -.Update EQU FatCache+1 -FAT_Max_Cluster: WORD #0FF0 ; макс. число кластеров (без служ.) +FatCache: ;WORD #0000 +.Block WORD #0000 ;EQU FatCache +.Update BYTE 0 ;EQU FatCache+1 +FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) +FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) ;//MODULE: FAT_X ;[END] @@ -838,7 +852,7 @@ FAT_Max_Cluster: WORD #0FF0 ; ;; HL - CLUSTER ;; DE - (CLUSTER) ; - ;R_F_FAT EX DE,HL + ;READ_FROM_FAT EX DE,HL ; LD HL,(FAT_Max_Cluster) ; AND A ; SBC HL,DE @@ -859,7 +873,7 @@ FAT_Max_Cluster: WORD #0FF0 ; ; DEC A ; LD BC,(FatCache) ; A - ELEMENT OF CASH ; CP C - ; CALL NZ,READ_FAT + ; CALL NZ,READ_FAT_TABLE ; LD DE,FAT ; ADD HL,DE ; LD E,(HL) @@ -895,7 +909,7 @@ FAT_Max_Cluster: WORD #0FF0 ; ; ; - ;WR_FAT LD HL,(FatCache) + ;WRITE_FAT_TABLE LD HL,(FatCache) ; LD H,0 ; LD (FatCache),HL ; LD E,L diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm new file mode 100644 index 0000000..fb744b6 --- /dev/null +++ b/DSS/FS/FAT/FAT32.asm @@ -0,0 +1,138 @@ +;!TODO fat32 +;======================================================================= +;BPB + ;LD (FatBuffer.FAT2_XX),HL + ;LD (FatBuffer.DIR_FRL),HL ; first sector DIR +;BPB32 + ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта +;FAT Max Cluster + ;LD (FAT_Max_Cluster_L),HL +;======================================================================= + + +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +; костыли + MODULE SET_FAT32 + +; ВХОД: HL - младшее слово номера кластера после инкремента +; ВЫХОД: HL - как и вход +; DE - старшее слово номера кластера после инкремента +CHECK_INC_HIGH_CLUSTER: + LD DE,(R_CLUST.FAT32) + ; + LD A,H + OR L + RET NZ + ; + INC DE + ; !FIXIT проверять переполнение? + RET + + ENDMODULE +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +;вход: DE:HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +GET_FAT32_CELL: + ;[ ] fat32 + DI + HALT + + 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.Block) ; BC - BLOCK FAT IN CASH + CP C + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + RET + +/* +; Прочитать в кеш 16 секторов FAT-а +; A - NEW FAT BLOCK +READ_FAT32: + PUSH HL + PUSH AF + LD A,(FatCache.Update) + OR A + CALL NZ,WRITE_FAT_TABLE.Start + POP AF + LD L,A + XOR A + LD H,A ;!FIXIT fat32 + LD (FatCache.Block),HL + LD (FatCache.Update),A + ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT + DUP FAT_CACHE.Degree_16 + ADD HL,HL ;x2 + EDUP + LD DE,(FatBuffer.FAT_FRM) + ADD HL,DE + EX DE,HL + ; + LD XH,D + LD XL,E + ;LD IX,0 + ;ADD IX,DE ; номер лог. сектора + ; + LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32 + LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS + LD A,(FatBuffer.DRIVE) ; номер диска + LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE + RST ToDSS.DRV + POP HL + RET + +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +GET_FAT32_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.Block) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + RET + + +R_F_F16: + CALL GET_FAT16_CELL + LD E,(HL) ; прочитать номер кластера + INC HL + LD D,(HL) + POP AF + OUT (SLOT3),A + ;!TODO #FFF7 - кластер с косякчными секторами + LD HL,#FFEF ;!HARDCODE + XOR A ; DssErr.sys.NO_ERROR + SBC HL,DE ; проверка на служ. кластеры + POP HL + RET +*/ +; \ No newline at end of file diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index c53eeb1..7b4978c 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -273,19 +273,19 @@ MS_CURS PUSH BC LD B,0 LD (YHOT_SP),BC EXX - LD A,(M_XSIZE) - LD C,A - LD B,0 - LD A,(M_YSIZE) - LD HL,0 -MSCURS1 ADD HL,BC - DEC A - JR NZ,MSCURS1 - PUSH HL - LD BC,M_IMAGE.Size+1 - AND A - SBC HL,BC - CCF + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSCURS1 ADD HL,BC + DEC A + JR NZ,MSCURS1 + PUSH HL + LD BC,M_IMAGE.Size+1 + AND A + SBC HL,BC + CCF EXX POP BC POP HL @@ -303,19 +303,19 @@ NOLOADM POP HL MS_BCUR PUSH IX EXX - LD A,(M_XSIZE) - LD C,A - LD B,0 - LD A,(M_YSIZE) - LD HL,0 -MSBCUR1 ADD HL,BC - DEC A - JR NZ,MSBCUR1 - PUSH HL - LD BC,M_IMAGE.Size+1 - AND A - SBC HL,BC - CCF + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSBCUR1 ADD HL,BC + DEC A + JR NZ,MSBCUR1 + PUSH HL + LD BC,M_IMAGE.Size+1 + AND A + SBC HL,BC + CCF EXX POP BC POP HL diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 3b0d263..802e4c8 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -247,14 +247,14 @@ Cursor_Off: ; Вектор обслуживания курсора cursor_interrupt: - LD A,(Cursor_Off.Flag) - OR A - RET Z + LD A,(Cursor_Off.Flag) + OR A + RET Z .timer+1: LD A,1 ; пауза мигания - DEC A - CALL Z,Cursor - LD (.timer),A - RET + DEC A + CALL Z,Cursor + LD (.timer),A + RET ; Настройка знакогенератора курсора черточкой SETUP_CURSORS: @@ -414,9 +414,9 @@ FULL_BF: BIT SF_BUFF,(IX+SOUND_K) JR Z,.FBF EXX - LD DE,230 - LD HL,50 - CALL BEEP + LD DE,230 + LD HL,50 + CALL BEEP EXX .FBF: EX AF,AF' RET @@ -530,9 +530,9 @@ RUS_X BIT X_CTRL,(IX+K_SHIFT) BIT SF_ALT,(IX+SOUND_K) RET Z EXX - LD DE,190 - LD HL,20 - CALL BEEP + LD DE,190 + LD HL,20 + CALL BEEP EXX RET diff --git a/DSS/Kernel_Panic.asm b/DSS/Kernel_Panic.asm new file mode 100644 index 0000000..19535d5 --- /dev/null +++ b/DSS/Kernel_Panic.asm @@ -0,0 +1,75 @@ + MACRO PRINT_LINE_KERNEL_PANIC txtString, txtStringSize, txtColor, coordY + LD HL,txtString + LD DE,#A000 + LD BC,txtStringSize + LD A,C + LDIR + ; + LD DE,coordY*256 + (80-txtStringSize)/2 ;X=0, Y=15 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + LD HL,#A000 + LD DE,0*256 + txtColor + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + ENDM + + +;-----------------------[] +; HL - сообщение +; E - координата X на текстовом экране +; BC - длина сообщения +KERNEL_PANIC: + DI + ; + PUSH DE + PUSH HL + PUSH BC + ; + LD E,1 + LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default + RST ToBIOS + ; + LD HL,#2050 + LD DE,0 + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + RST ToBIOS + ; + LD A,1 + OUT (SCREEN_SWITCH),A ; set scr-2 + ; + PRINT_LINE_KERNEL_PANIC .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.RED), 13 + PRINT_LINE_KERNEL_PANIC .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE), 18 + ; + POP BC + POP HL + LD DE,#A000 + LD A,C + LDIR + ; + POP DE + LD D,15 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + ; +.loop: DI + HALT + JR .loop + +.print_line: + RET + ; +.kernel_panic: DZ "KERNEL PANIC!" +.kernel_panic.size EQU $-.kernel_panic +; +.press_CAD: DZ "Press Ctrl+Alt+Del or RESET." +.press_CAD.size EQU $-.press_CAD +;-----------------------[] \ No newline at end of file diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index df9d2a6..cb278eb 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -112,7 +112,9 @@ ReScanDRV: _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE LD A,(HL) INC A - JP Z,ERROR_BOOTDRV_DIES + SCF + ;JP Z,ERROR_BOOTDRV_DIES + RET Z ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 6. заменяем новые таблицы на модифицированные старые @@ -127,6 +129,7 @@ ReScanDRV: ;7. выход ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; LD A,(DRV_PAGE.LDRIVE) + AND A RET ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; @@ -274,42 +277,42 @@ Find_Record: ;-----------------------[] ;-----------------------[] -ERROR_BOOTDRV_DIES: - DI - LD E,1 - LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default - RST ToBIOS - ; - LD HL,#2050 - LD DE,0 - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - RST ToBIOS - ; - LD A,1 - OUT (SCREEN_SWITCH),A ; set scr-2 - ; - LD HL,.ERROR_MSG - LD DE,#A000 - LD BC,.ERROR_MSG.size - LD A,C - LDIR - ; - LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - ; - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - ; -.loop: DI - HALT - JR .loop - ; -.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -.ERROR_MSG.size EQU $-.ERROR_MSG +; ERROR_BOOTDRV_DIES: +; DI +; LD E,1 +; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default +; RST ToBIOS +; ; +; LD HL,#2050 +; LD DE,0 +; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN +; RST ToBIOS +; ; +; LD A,1 +; OUT (SCREEN_SWITCH),A ; set scr-2 +; ; +; LD HL,.ERROR_MSG +; LD DE,#A000 +; LD BC,.ERROR_MSG.size +; LD A,C +; LDIR +; ; +; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 +; LD C,BIOS.LP_SET_PLACE +; RST ToBIOS +; ; +; LD HL,#A000 +; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE +; LD B,A +; LD C,BIOS.LP_PRINT_LINE3 +; RST ToBIOS +; ; +; .loop: DI +; HALT +; JR .loop +; ; +; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +; .ERROR_MSG.size EQU $-.ERROR_MSG ;-----------------------[] @@ -449,7 +452,7 @@ KILL_FM:; CP C JR NZ,.skip XOR A - LD (IY+_sFM.NAME),A ; грохаем манипулятор + LD (IY+_sFM.FS_REC.NAME),A ; грохаем манипулятор .skip: DJNZ .loop_fm ; POP AF diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 7e7e049..b1f5015 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -171,7 +171,7 @@ ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 -PART EQU #C000 +PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR HDDRIVE INC C DEC C @@ -245,7 +245,7 @@ NX_DVCI: PUSH BC LD C,BIOS.DRV_DETECT RST ToBIOS ;JR C,.NO_DRIVE - CALL NC,PARTIT + CALL NC,DEFINE_PARTITIONS.BEGIN POP BC INC C JR C,NX_DVCI @@ -515,35 +515,39 @@ CHECKH: PUSH IY POP IY RET -;----------------- -EASYDOS: -MEDIDOS: -HIGHDOS: - LD E,(IY+08) - LD D,(IY+09) - LD L,(IY+10) - LD H,(IY+11) - LD IX,(CURSECL) +;------------------------------[ PARTIT ]------------------------------; +DEFINE_PARTITIONS: +.FAT32_DOS: +.EASYDOS: +.MEDIDOS: +.HIGHDOS: + LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) + LD IX,(CURRENT_SECTOR_L) ADD IX,DE - LD DE,(CURSECH) + LD DE,(CURRENT_SECTOR_H) ADC HL,DE LD D,XH LD E,XL + ;BPB SECTOR LD IX,(OFFSECT) - LD (IX+LOGDRV.SECTOR_OFFSET+0),E ;BPB SECTOR - LD (IX+LOGDRV.SECTOR_OFFSET+1),D - LD (IX+LOGDRV.SECTOR_OFFSET+2),L - LD (IX+LOGDRV.SECTOR_OFFSET+3),H - LD E,(IY+12) - LD D,(IY+13) - LD L,(IY+14) - LD H,(IY+15) - LD (IX+LOGDRV.SIZE_IN_SECTORS+0),E ;SIZE DISK - LD (IX+LOGDRV.SIZE_IN_SECTORS+1),D - LD (IX+LOGDRV.SIZE_IN_SECTORS+2),L - LD (IX+LOGDRV.SIZE_IN_SECTORS+3),H + LD (IX + LOGDRV.SECTOR_OFFSET + 0),E + LD (IX + LOGDRV.SECTOR_OFFSET + 1),D + LD (IX + LOGDRV.SECTOR_OFFSET + 2),L + LD (IX + LOGDRV.SECTOR_OFFSET + 3),H + LD E,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 3) + ;SIZE DISK + LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E + LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D + LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L + LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого -ExtendedPartitionFlag+1: +.ExtendedPartitionFlag+1: LD A,0 OR A ; !TODO загрузка с расширенного раздела не поддерживается LD A,#FF @@ -551,10 +555,10 @@ ExtendedPartitionFlag+1: ; POP BC PUSH BC - LD A,4 ;!HARDCODE MBR: Number of entries in the partition table + LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table SUB B .not_supported: - LD (IX+LOGDRV.PARTITION_RECORD_NUM),A + LD (IX + LOGDRV.PARTITION_RECORD_NUM),A ; ;!TEST Подстраховка от переполнения таблицы LOGDRV LD A,(DRVCLC.count) @@ -564,66 +568,60 @@ ExtendedPartitionFlag+1: LD (DRVCLC.count),A ; LD A,(DRV_NUM) - LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),A + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE LD (OFFSECT),IX - JP NXTPART -; NXTPART: -; LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry -; ADD IY,DE -; POP BC -; DJNZ DOSAGA -; AND A -; RET - - + JP .NextPartition ; -NOEXTDS: +.NotExtended: CP PartitionSysTypes.FAT16 - JR Z,HIGHDOS + JR Z,.HIGHDOS CP PartitionSysTypes.FAT16_LBA - JR Z,HIGHDOS + JR Z,.HIGHDOS CP PartitionSysTypes.FAT16_32Mb - JR Z,MEDIDOS + JR Z,.MEDIDOS CP PartitionSysTypes.FAT12 - JR Z,EASYDOS + JR Z,.EASYDOS + ;[ ] fat32 + CP PartitionSysTypes.FAT32 + JP Z,.FAT32_DOS + CP PartitionSysTypes.FAT32_LBA + JP Z,.FAT32_DOS + ; CP PartitionSysTypes.Win_Ext_LBA - JR Z,SUBLEV + JR Z,.SubLevel ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - ;OR A ;PartitionSysTypes.Empty + ;OR A ;PartitionSysTypes.Empty ;JR NZ,NXTPART - JR NXTPART ; раздел не поддерживается - ;POP BC ; баланс стека + JR .NextPartition ; раздел не поддерживается + ;POP BC ; баланс стека ;RET ;POP BC ;OR A ;RET Z ;NODEFIN: ;SCF - ;RET + ;RET ; - -PARTIT: IN A,(SLOT3) +.BEGIN: IN A,(SLOT3) PUSH AF LD A,SHARED_PAGE OUT (SLOT3),A - CALL PARTIT1 + CALL .Start POP AF OUT (SLOT3),A RET - -PARTIT1: - LD IX,0 +.Start: LD IX,0 LD DE,0 LD (EXTDOSL),DE ;R01 LD (EXTDOSH),IX ;R01 -PARTIT2: - LD (CURSECL),DE - LD (CURSECH),IX - CALL LOADSEC ; - LD HL,(PART+510) ;!HARDCODE Signature word +.LOOP: LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + ; + LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) LD DE,#AA55 AND A SBC HL,DE @@ -632,59 +630,59 @@ PARTIT2: SCF RET NZ ; - LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR - LD B,4 ;!HARDCODE MBR: Number of entries in the partition table -DOSAGA: PUSH BC - LD A,(IY+4) + LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR + LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table +.DOSAGA: + PUSH BC + LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) CP PartitionSysTypes.Extended - JR NZ,NOEXTDS -SUBLEV: PUSH IY - LD DE,(CURSECL) - LD IX,(CURSECH) + JR NZ,.NotExtended +.SubLevel: + PUSH IY + LD DE,(CURRENT_SECTOR_L) + LD IX,(CURRENT_SECTOR_H) PUSH DE PUSH IX ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(ExtendedPartitionFlag) + LD A,(.ExtendedPartitionFlag) INC A - LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается ; - CALL EXTDOS + CALL .ParseExtended ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(ExtendedPartitionFlag) + LD A,(.ExtendedPartitionFlag) DEC A - LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается ; POP IX POP DE - LD (CURSECL),DE - LD (CURSECH),IX - CALL LOADSEC + LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR POP IY -NXTPART: - LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry +.NextPartition: + LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry ADD IY,DE POP BC - DJNZ DOSAGA + DJNZ .DOSAGA AND A RET - ; -EXTDOS: LD HL,(EXTDOSL) +.ParseExtended: + LD HL,(EXTDOSL) LD DE,(EXTDOSH) LD A,L OR H OR E OR D - LD E,(IY+08) - LD D,(IY+09) - LD L,(IY+10) - LD H,(IY+11) - JP NZ,EXTDOS2 + LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) + JP NZ,.EXTDOS2 LD (EXTDOSL),DE LD (EXTDOSH),HL LD IX,(EXTDOSH) - JP PARTIT2 - ; -EXTDOS2: +.EXTDOS2: LD IX,(EXTDOSL) ADD IX,DE PUSH IX @@ -693,27 +691,28 @@ EXTDOS2: PUSH HL POP IX POP DE - JP PARTIT2 - -LOADSEC: + JP .LOOP + ; +.LOAD_SECTOR: PUSH IY - LD IX,(CURSECL) - LD HL,(CURSECH) - LD DE,PART + LD IX,(CURRENT_SECTOR_L) + LD HL,(CURRENT_SECTOR_H) + LD DE,PARTITION_BUFFER LD A,(DRV_NUM) LD BC,1*256 + BIOS.DRV_READ RST ToBIOS POP IY RET +;----------------------------------------------------------------------; +; -DRV_NUM DB #00 ;PHISICAL DRIVE NUMBER. номер девайса (#80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв) - -CURSECL DW #0000 ;CURRENT SECTOR LOADED -CURSECH DW #0000 - -EXTDOSL DW #0000 ;CURRENT PARTITION TABLE -EXTDOSH DW #0000 - -OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD - -;======================================================= \ No newline at end of file +;======================================================================= +; PHISICAL DRIVE NUMBER +; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв +DRV_NUM: DB #00 +CURRENT_SECTOR_L: DW #0000 +CURRENT_SECTOR_H: DW #0000 +EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE +EXTDOSH: DW #0000 +OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD +;======================================================================= \ No newline at end of file diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 2798e6b..403ee1d 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -1,41 +1,43 @@ ; STRUCT _sStack ; 256 bytes -buffer BLOCK 256,0 -SPoint BYTE 0 +.buffer BLOCK 256,0 +.SPoint BYTE 0 ENDS ; ; STRUCT _sEXE_HEADER ; 512 bytes -EXE_EXT TEXT 3,{"EX","E"} -VERSION BYTE 0 -OFFCOD1 WORD 0 -OFFCOD2 WORD 0 -LOADER WORD 0 -RESERVED BLOCK 6,0 -LD_ADDR WORD 0 -PC_REG WORD 0 -SP_REG WORD 0 -RESERVED2 BLOCK 490,0 +.EXE_EXT TEXT 3,{"EX","E"} +.VERSION BYTE 0 +.OFFCOD1 WORD 0 +.OFFCOD2 WORD 0 +.LOADER WORD 0 +.RESERVED BLOCK 6,0 +.LD_ADDR WORD 0 +.PC_REG WORD 0 +.SP_REG WORD 0 +.RESERVED2 BLOCK 490,0 ENDS ; ;File Manipulator (FM) - STRUCT _sFM ; 47 bytes +;[ ] fat32 + STRUCT _sFM ; 51 bytes ; from FAT -.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 +; .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 +; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED +; .TIME: WORD #0000 ;+ #16 +22 TIME +; .DATE: WORD #0000 ;+ #18 +24 DATE +; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ;!TODO fat32 +; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE +.FS_REC: _sFAT_DIRECTORY_RECORD ; from Core .F_POSITION: DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .DIR_CLUSTER: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER @@ -44,10 +46,10 @@ RESERVED2 BLOCK 490,0 .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 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownCluster_L: WORD #0000 ;+ #2B +43 Младшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: WORD #0000 ;+ #2C +44 Старшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: WORD #0000 ;+ #2D +45 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: WORD #0000 ;+ #2E +46 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS ; @@ -67,12 +69,12 @@ RESERVED2 BLOCK 490,0 ; STRUCT _sBuffers -FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) -FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; -BootSector _sBOOT_SEC ; 62 bytes ;!TODO перенести в область буферов -EXE_Header _sEXE_HEADER ; 512 bytes -Stack _sStack ; 256 bytes -Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF -MemoryTable BLOCK 256,0 ; 256 bytes +.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) +.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; +.BootSector _sBOOT_SECTOR_PARAMS ; 62 bytes ;!TODO перенести в область буферов +.EXE_Header _sEXE_HEADER ; 512 bytes +.Stack _sStack ; 256 bytes +.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF +.MemoryTable BLOCK 256,0 ; 256 bytes ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index c353035..dcdf7f5 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -943 \ No newline at end of file +942 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f3d2ca2..f0ea1b5 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -1,5 +1,5 @@ ; - DEFINE TEST_FEATURE 1 + DEFINE TEST_FEATURE 0 ; ; @@ -17,6 +17,8 @@ ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// + DEFINE _FAT32_ENABLE 1 ;!TODO пока недоделано + define _bit (1 Date: Wed, 13 Mar 2024 03:21:17 +1000 Subject: [PATCH 094/219] =?UTF-8?q?CORE:=20=D0=B2=D1=80=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=20=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20=D0=BD=D0=B0=20=D0=B4=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=B5=D1=82=D1=8B.=20SHELL:=20=D1=83=D0=BA=D1=80?= =?UTF-8?q?=D0=B0=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B=20DIR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/FS/FAT/FAT.asm | 25 ++++--- DSS/FS/FAT/FAT12_16.asm | 132 +++++++++++++++++++++++++++++------- DSS/FS/FAT/FAT32.asm | 34 ++++++++-- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 85 ++++++++++------------- SHELL/Messages/main_txt.asm | 2 + SHELL/build.txt | 2 +- 7 files changed, 190 insertions(+), 92 deletions(-) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 6671bd4..ac6e380 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -544,8 +544,8 @@ RD_BPB: LD C,SLOT3 ; ADD HL,DE ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT - LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 - LD (FatBuffer.FAT2_XX),HL + LD (FatBuffer.FAT1_SEC_L),HL ; first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL //LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ; sectors in FAT //LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) @@ -557,7 +557,7 @@ RD_BPB: LD C,SLOT3 JR Z,.loop1 DEC A ADD HL,DE - LD (FatBuffer.FAT2_XX),HL + LD (FatBuffer.FAT2_SEC_L),HL ;C_DATA1 .loop1: ADD HL,DE DEC A @@ -780,7 +780,11 @@ RD_BPB: LD C,SLOT3 SET_PAGE_X FATPAGE PUSH AF - XOR A + ; [ ] fat32 + ; XOR A + ; HL = 0 + EX DE,HL + ; CALL READ_FAT_TABLE POP AF OUT (SLOT3),A @@ -820,11 +824,12 @@ FatBuffer: .READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) .BLOCK: DB #00 .DIR_CLU_L: DW #0000 -.DIR_CLU_H: DW #0000 ; fat32 +.DIR_CLU_H: DW #0000 ; [ ] fat32 .DRIVE: DB #FF -.FAT_FRM: -.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT -.FAT2_XX: DW #0000 +.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) +.FAT1_SEC_H: DW #0000 ; [ ] fat32 +.FAT2_SEC_L: DW #0000 +.FAT2_SEC_H: DW #0000 ; [ ] fat32 .DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .DIR_FRL: DW #0000 ; MSD_CAT_SEC first sector DIR .F_P_S: DB #00 ; число файловых записей в секторе @@ -834,10 +839,10 @@ FatBuffer: .CLU_LEN: .B_P_C: DW #0000 ; CLUSTER_LEN .C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ;!TODO fat32 +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? .ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #FFFF ; !TODO for fat32 +.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index e060a3c..fd418c6 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -155,6 +155,7 @@ READ_FROM_FAT: CALL GET_FAT32_CELL DI HALT + RET ;----------------------------------------------------------- ; Записать в кеш FAT-а номер кластера ; вход: hl = номер кластера в который записать @@ -253,27 +254,40 @@ WRITE_TO_FAT: .FAT32: ; [ ] fat32 DI HALT -;RX01 ;RE_FAT: -; Прочитать в кеш 16 секторов FAT-а -; A - NEW FAT BLOCK +;RX01 +; Прочитать в кеш ХХ секторов FAT-а +; [ ] fat32 + //; A - NEW FAT BLOCK +; DE - NEW FAT BLOCK +; READ_FAT_TABLE: PUSH HL - PUSH AF + ; [x] fat32 + ; PUSH AF + PUSH DE + ; LD A,(FatCache.Update) OR A CALL NZ,WRITE_FAT_TABLE.Start - POP AF - LD L,A - XOR A - LD H,A ;!FIXIT fat32 - у фат32 блоков может быть валом + ; [x] fat32 + ; POP AF + POP DE + ; + + ;[ ] fat32 + ; LD L,A + ; XOR A + ; LD H,A + EX DE,HL + ; LD (FatCache.Block),HL LD (FatCache.Update),A ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 EDUP - LD DE,(FatBuffer.FAT_FRM) + LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE EX DE,HL ; @@ -291,6 +305,7 @@ READ_FAT_TABLE: RET ; Подключить банку кеша FAT и записать его на диск +; [ ] fat32 WRITE_FAT_TABLE: SET_PAGE_X FATPAGE PUSH AF @@ -307,7 +322,6 @@ WRITE_FAT_TABLE: ADD HL,HL ;x2 EDUP ; HL - номер лог. сектора - PUSH HL LD B,H LD C,L ;BC - BLOCK OF FAT LD DE,FAT_CACHE.Sectors @@ -326,14 +340,64 @@ WRITE_FAT_TABLE: .WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? LD H,B LD L,C - LD DE,(FatBuffer.FAT_FRM) + PUSH HL ; HL - номер лог. сектора + ; + LD DE,(FatBuffer.FAT1_SEC_L) + LD B,A ; число секторов + LD C,Dss.DRV.Write ; запись секторов + PUSH BC + ; сохраняем первую копию FAT + CALL .SAVE_FAT_XX + ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 + LD DE,(FatBuffer.FAT2_SEC_L) + LD HL,(FatBuffer.FAT1_SEC_L) + AND A + SBC HL,DE + POP BC ; b=число секторов + POP HL + JR Z,.only_one_FAT + ; + ; сохраняем вторую копию FAT + CALL .SAVE_FAT_XX + AND A ;!TODO нет контроля ошибок +.only_one_FAT: +.ERR: LD A,0 + LD (FatCache.Update),A + RET + ; +.SAVE_FAT_XX: ADD HL,DE EX DE,HL - ; + ; номер лог. сектора + ;LD IX,0 + ;ADD IX,DE LD XH,D LD XL,E + ; + LD HL,0 ; ст. разряд + ; CF = ADD HL,DE + ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? + IF _FAT32_ENABLE + RL L + ENDIF + ;HL:IX - SECTOR OF FAT FOR SAVE + LD DE,FATPAGE.cache ; откуда + LD A,(FatBuffer.DRIVE) ; номер диска + JP ToDSS.DRV +/* +.WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? + LD H,B + LD L,C + PUSH HL ; HL - номер лог. сектора + ; + LD DE,(FatBuffer.FAT1_SEC_L) + ADD HL,DE + EX DE,HL + ; номер лог. сектора ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора + ;ADD IX,DE + LD XH,D + LD XL,E ; LD HL,0 ; ст. разряд ;HL:IX - SECTOR OF FAT FOR SAVE @@ -343,9 +407,18 @@ WRITE_FAT_TABLE: LD A,(FatBuffer.DRIVE) ; номер диска PUSH BC RST ToDSS.DRV - POP BC ; b=число секторов - POP HL - LD DE,(FatBuffer.FAT2_XX) + ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 + LD DE,(FatBuffer.FAT2_SEC_L) + LD HL,(FatBuffer.FAT1_SEC_L) + AND A + SBC HL,DE + POP BC ; b=число секторов + POP HL + JR Z,.only_one_FAT + ; POP BC ; b=число секторов + ; POP HL + ; LD DE,(FatBuffer.FAT2_SEC_L) + ; ADD HL,DE EX DE,HL LD XH,D @@ -363,13 +436,12 @@ WRITE_FAT_TABLE: LD C,Dss.DRV.Write RST ToDSS.DRV AND A ;!TODO нет контроля ошибок +.only_one_FAT: ; .ERR: LD A,0 LD (FatCache.Update),A - RET NC - POP HL - ; CF = 1 - RET + RET +*/ ;вход: HL - номер кластера @@ -389,8 +461,13 @@ GET_FAT16_CELL: AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH - CP C + ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; CP C + LD DE,(FatCache.Block) ; 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 @@ -427,8 +504,13 @@ GET_FAT12_CELL: AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH - CP C + ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; CP C + LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH + CP E + LD E,A + ; CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а ENDIF ; @@ -949,7 +1031,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ; RST #18 ; POP BC ; POP HL - ; LD DE,(FAT2_XX) + ; LD DE,(FAT2_SEC_L) ; ADD HL,DE ; EX DE,HL ; LD IX,0 diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm index fb744b6..fa44220 100644 --- a/DSS/FS/FAT/FAT32.asm +++ b/DSS/FS/FAT/FAT32.asm @@ -1,7 +1,7 @@ ;!TODO fat32 ;======================================================================= ;BPB - ;LD (FatBuffer.FAT2_XX),HL + ;LD (FatBuffer.FAT2_SEC_L),HL ;LD (FatBuffer.DIR_FRL),HL ; first sector DIR ;BPB32 ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта @@ -39,18 +39,38 @@ GET_FAT32_CELL: DI HALT +; FOR 8192 bytes cache +; 1 073 741 824 bytes max fat32 size +; 1073741824/8192=131072 +; 0x40000000 / 0x2000 = 0x20000 + +; FOR 16384 bytes cache +; 1 073 741 824 bytes max fat32 size +; 1073741824/16384=65536 +; 0x40000000 / 0x4000 = 0x10000 + +/* + D E H L +0xEAB1022 - block 0x1D562 + D E H +0xEAB10 >>> 0x1D562 +*/ + LD A,H LD B,H - ;AND #0F - AND FAT_CACHE.Size_Mask_16 + AND #0F + ;AND FAT_CACHE.Size_Mask_16 ; #0F LD H,A LD A,B ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) - DUP FAT_CACHE.Degree_16 + ;DUP FAT_CACHE.Degree_16 RRCA - EDUP - ;AND #0F - AND FAT_CACHE.Part_Mask_16 + RRCA + RRCA + RRCA + ;EDUP + AND #0F + ;AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH diff --git a/DSS/build.txt b/DSS/build.txt index dcdf7f5..c353035 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -942 \ No newline at end of file +943 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 6c25698..bf1dc75 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -53,7 +53,7 @@ cmd_dir: ; [ ] 1/10/23 1: ld hl,work_buffer1 ; имя файла ld de,work_buffer1 ; 80 буфер - ld a,#37 ; атрибут (все, кроме метки тома) + ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) ld bc,Dss.F_First.FATname ; f_first (формат 11) RST ToDSS JR C,.dir_empty ;R14 @@ -71,9 +71,11 @@ cmd_dir: ld c,Dss.WaitKey rst ToDSS dec d - jr nz,.skip_esc - xor a - ld (.key_p),a ; отменяем ESC + ld de,MAIN_MSG.DIR_ESCAPE + jp z,MESSAGE ; закончить по ESC + ;jr nz,.skip_esc + ;xor a + ;ld (.key_p),a ; отменяем ESC .skip_esc: ld a,32-1 .skip_wait: @@ -153,46 +155,6 @@ cmd_dir: ld hl,(D88E0) ; ст. разряд exx ; - ;;;;;;;;;;;;; -; call A8A8F ; десятичный 32-х разрядный вывод -; ld hl,T8B37 ; "0" -; ld a,(hl) -; cp " " -; jr nz,.not_zero -; ld a,"0" -; ld (hl),a -; .not_zero: -; ld de,T8B46 ; "0 000 000 000" -; ld hl,T8B2E ; "0000000000" -; ld a,(hl) -; ldi -; cp " " -; jr z,1F -; ld a,"," ; разд. разрядов -; 1: ld (de),a -; inc de -; ldi -; ldi -; ld a,(hl) -; ldi -; cp " " -; jr z,1F -; ld a,"," ; разд. разрядов -; 1: ld (de),a -; inc de -; ldi -; ldi -; ld a,(hl) -; ldi -; cp " " -; jr z,1F -; ld a,"," ; разд. разрядов -; 1: ld (de),a -; inc de -; ldi -; ldi -; ldi -; ret CALL Size2Char ;;;;;;;;;;;;; ; @@ -270,7 +232,14 @@ cmd_dir: ; ; Подготовить строку списка файлов/папок -A88E2: ld bc,8 +A88E2: + dec hl + ld a,(hl) + and FAT_ATTR.DIRECTORY + call z,.set_small + inc hl + ; + ld bc,8 ld de,PRM1 ; буфер ldir xor a @@ -286,13 +255,33 @@ A88E2: ld bc,8 call A8A19 ; вывести в буфер время файла/папки ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" jp MESSAGE ; вывод строки - - + ; +.set_small: + ld d,h + ld e,l + ld b,11 ;!HARDCODE длина имени DOS +.loop: inc hl + ld a,(hl) + cp 'A' + jr c,.next + cp 'Z'+1 + jr c,.letter + ; + cp 'А' ;#80 + jr c,.next + cp 'Я'+1 ;#9F + 1 + jr nc,.next +.letter: + or %0010'0000 + ld (hl),a +.next: djnz .loop + ex de,hl + ret ; Вывести в буфер имя файла и его размер (у папки ) A89A4: ld a,(ix+32) ld hl,T8B38 ; " " - and 10h ; папка ? + and FAT_ATTR.DIRECTORY ; папка ? jr nz,A89F4 ; да ld l,(ix+28) ; мл. разряд ld h,(ix+29) diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index ce7440c..6e8aa73 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -11,6 +11,7 @@ MAIN_MSG: .DATE EQU .DATE_ .TIME EQU .TIME_ .PAUSE EQU .PAUSE_ +.DIR_ESCAPE EQU .DIR_ESC_ .INVALID EQU .INV_ .ECHO EQU .ECHO_ .ON EQU .ON_ @@ -35,6 +36,7 @@ MAIN_MSG: stN .DATE_ : db "Current date: %1, %2",CR,LF,0 ; [ ] вывод дня недели 26/01/2023 stN .TIME_ : db "Current time: %1",CR,LF,0 stN .PAUSE_ : db "Press any key to continue . . .",CR,0 + stN .DIR_ESC_ : db 'Command "DIR" aborted by user ',CR,LF,CR,LF,0 stN .INV_ : db "Invalid parametr",CR,LF,0 stN .ECHO_ : db "Echo is %1",CR,LF,0 stN .ON_ : db "on",0 diff --git a/SHELL/build.txt b/SHELL/build.txt index 58dc5af..815f89d 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -303 \ No newline at end of file +311 \ No newline at end of file From 63c527ace86d110eddc81d643d562654dfa83427 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 15 Mar 2024 00:38:21 +1000 Subject: [PATCH 095/219] =?UTF-8?q?-bug:=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=87=D1=83=D0=B2=D1=81=D1=82=D0=B2=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BC=D1=8B=D1=88=D0=BA?= =?UTF-8?q?=D0=B8=20MS=5FSENT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DRV-MAIN.ASM | 32 ++++++ DSS/DSS-MAIN.ASM | 2 - DSS/INTMOUSE.ASM | 253 ++++++++++++++++++++++++++++++----------------- DSS/KEYINTER.ASM | 57 ++++++++--- DSS/build.txt | 2 +- DSS/defines.inc | 4 +- 6 files changed, 239 insertions(+), 111 deletions(-) diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 1f9355b..54a491d 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -154,6 +154,38 @@ A0038: ; ; POP AF ; ; EX AF,AF' ; ; POP AF ; + ;!TEST SIO INT + ; reg 0 - error reset + IF KEYBOARD_INT_ENABLED && MOUSE_INT_ENABLED == 0 + PUSH AF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 0 - return from int + LD A,%0011'1000 + OUT (Z84.SIO.Ch_A.Ctrl),A + POP AF + ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED == 0 + PUSH AF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A + ; reg 0 - return from int + LD A,%0011'1000 + OUT (Z84.SIO.Ch_B.Ctrl),A + POP AF + ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED + PUSH AF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_A.Ctrl),A + OUT (Z84.SIO.Ch_B.Ctrl),A + ; reg 0 - return from int + LD A,%0011'1000 + OUT (Z84.SIO.Ch_A.Ctrl),A + OUT (Z84.SIO.Ch_B.Ctrl),A + POP AF + ENDIF EI ; RETI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index fdef6fc..19841df 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -151,8 +151,6 @@ INT_: PUSH AF PUSH IX PUSH IY CALL KEYSCAN - ; LD C,Dss.Mouse.GetPackets - ; RST ToDSS.Mouse CALL M_INT IFN CLASSIC_CURSOR CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 7b4978c..2568a00 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -102,7 +102,8 @@ PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data ; 4 - CURSOR OFF (UZHE) ; 5 - CURSOR IMAGE VERY BIG -INTMOUS BIT 7,C +INTMOUS: + BIT 7,C JR NZ,EMOUSE INC C DEC C @@ -116,9 +117,9 @@ INTMOUS BIT 7,C DEC C JP Z,MS_GOTO ; 4 DEC C - JR Z,MS_RESR ; 5 + JR Z,.RESERVED ; 5 DEC C - JR Z,MS_RESR ; 6 + JR Z,.RESERVED ; 6 DEC C JP Z,MS_VERT ; 7 DEC C @@ -130,28 +131,30 @@ INTMOUS BIT 7,C DEC C JP Z,MS_BCUR ; 11 DEC C - JR Z,MS_RESR ; 12 + JR Z,.RESERVED ; 12 DEC C - JR Z,MS_RESR ; 13 + JR Z,.RESERVED ; 13 DEC C JP Z,MS_GSEN ; 14 DEC C JP Z,MS_SENT ; 15 -MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND +.RESERVED: + LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET -EMOUSE RES 7,C +EMOUSE: RES 7,C INC C DEC C JP Z,M_INT DEC C JP Z,M_MODE DEC C - JR Z,M_RESR + JR Z,.RESERVED DEC C JP Z,M_REFR -M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND +.RESERVED: + LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET @@ -159,12 +162,12 @@ M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND MS_INIT: DI ; reg 0 - XOR A ;LD A,0 + XOR A OUT (PORT_MOUSE.Ctrl),A - ; reg 4 + ; reg 4 - скорость порта первый множитель LD A,4 OUT (PORT_MOUSE.Ctrl),A - LD A,+(7 | MOUSE_BAUD.multiplier_1) ; первый множитель + LD A,+(7 | MOUSE_BAUD.multiplier_1) OUT (PORT_MOUSE.Ctrl),A ; reg 3 LD A,3 @@ -176,7 +179,6 @@ MS_INIT: OUT (PORT_MOUSE.Ctrl),A LD A,%1110'0000 ; bit7 для корректного инита Sega джойстика в порту кемпстон джойстика OUT (PORT_MOUSE.Ctrl),A - ; ; reg 1 LD A,1 OUT (PORT_MOUSE.Ctrl),A @@ -186,17 +188,18 @@ MS_INIT: XOR A ENDIF OUT (PORT_MOUSE.Ctrl),A - ;!TEST mouse - LD A,#55 - OUT (Z84.CTC.Ch_0),A - LD A,MOUSE_BAUD.multiplier_2 ; второй множитель - OUT (Z84.CTC.Ch_0),A + ; скорость порта - второй множитель + LD A,#55 + OUT (Z84.CTC.Ch_0),A + LD A,MOUSE_BAUD.multiplier_2 + OUT (Z84.CTC.Ch_0),A ; EI XOR A RET -MS_SHOW PUSH IX +MS_SHOW: + PUSH IX PUSH HL PUSH DE EX AF,AF' @@ -216,7 +219,8 @@ MS_SHOW PUSH IX XOR A RET -MS_HIDD PUSH IX +MS_HIDD: + PUSH IX PUSH HL PUSH DE EX AF,AF' @@ -234,13 +238,15 @@ MS_HIDD PUSH IX XOR A RET -MS_READ LD HL,(PIX_X) +MS_READ: + LD HL,(PIX_X) LD DE,(PIX_Y) - LD A,(MB) + LD A,(MOUSE_BUTTONS) AND A RET -MS_GOTO PUSH IX +MS_GOTO: + PUSH IX PUSH HL PUSH DE LD (PIX_X),HL @@ -258,7 +264,8 @@ MS_GOTO PUSH IX XOR A RET -MS_CURS PUSH BC +MS_CURS: + PUSH BC PUSH DE PUSH HL PUSH IX @@ -278,9 +285,9 @@ MS_CURS PUSH BC LD B,0 LD A,(M_YSIZE) LD HL,0 -MSCURS1 ADD HL,BC +.loop: ADD HL,BC DEC A - JR NZ,MSCURS1 + JR NZ,.loop PUSH HL LD BC,M_IMAGE.Size+1 AND A @@ -290,27 +297,29 @@ MSCURS1 ADD HL,BC POP BC POP HL LD A,5 - JR C,NOLOADM + JR C,.NOLOADM LD DE,M_IMAGE DI LDIR XOR A -NOLOADM POP HL +.NOLOADM: + POP HL POP DE POP BC EI RET -MS_BCUR PUSH IX +MS_BCUR: + PUSH IX EXX LD A,(M_XSIZE) LD C,A LD B,0 LD A,(M_YSIZE) LD HL,0 -MSBCUR1 ADD HL,BC +.loop: ADD HL,BC DEC A - JR NZ,MSBCUR1 + JR NZ,.loop PUSH HL LD BC,M_IMAGE.Size+1 AND A @@ -335,22 +344,23 @@ MSBCUR1 ADD HL,BC LD D,C LD BC,0 XOR A -NOSAVEM EI +NOSAVEM: + EI RET -MS_HORZ +MS_HORZ: LD (MIN_X),HL LD (MAX_X),DE XOR A RET -MS_VERT +MS_VERT: LD (MIN_Y),HL LD (MAX_Y),DE XOR A RET -MS_MASK +MS_MASK: LD (ANDXORS),HL LD (ANDXORA),DE XOR A @@ -358,13 +368,12 @@ MS_MASK ; H - VERTICAL SENSITIVE ; L - HORIZONTAL SENSITIVE - -MS_SENT +MS_SENT: LD (SENSEXY),HL XOR A RET -MS_GSEN +MS_GSEN: LD HL,(SENSEXY) XOR A RET @@ -616,13 +625,30 @@ MOUSE: LD A,(MODE_M) ;----------------------------------------------------------------------; -READ_M: IN A,(PORT_MOUSE.Ctrl) +READ_M: + ;[ ] 18/02/2024 проверка на переполнение буфера + ; reg 1 + LD A,1 + OUT (PORT_MOUSE.Ctrl),A + IN A,(PORT_MOUSE.Ctrl) + AND %0010'0000 ; check receiver overrun error + ; JP NZ,.Receiver_Overrun + JR Z,.NEXT + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A +.NEXT: ; + IN A,(PORT_MOUSE.Ctrl) RRCA RET NC + ; AND 1 + ; RET Z + IN A,(PORT_MOUSE.Data) LD L,A - BIT 6,A - CCF + AND %0100'0000 + ;BIT 6,A + ;CCF RET Z ;[x] mouse freeeeezzzz @@ -632,7 +658,7 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz - JR C,.NXT + JR C,.NXT_1 DEC BC LD A,B OR C @@ -641,7 +667,7 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) ;JR NC,TST_01 ; -.NXT: IN A,(PORT_MOUSE.Data) +.NXT_1: IN A,(PORT_MOUSE.Data) LD E,A BIT 6,A CCF @@ -650,18 +676,19 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) ;[x] mouse freeeeezzzz LD BC,MOUSE_READ_PORT_TIMEOUT ; -TST_02: IN A,(PORT_MOUSE.Ctrl) +.TST_02: + IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz - JR C,.NXT + JR C,.NXT_2 DEC BC LD A,B OR C - JR NZ,TST_02 + JR NZ,.TST_02 RET ;JR NC,TST_02 ; -.NXT: IN A,(PORT_MOUSE.Data) +.NXT_2: IN A,(PORT_MOUSE.Data) LD D,A BIT 6,A CCF @@ -696,45 +723,66 @@ TST_02: IN A,(PORT_MOUSE.Ctrl) .STBU: RLCA RLCA AND #03 - LD (MB),A + LD (MOUSE_BUTTONS),A CALL SENSE - LD A,E - LD (MX),A - LD A,D - LD (MY),A + LD (MOUSE_COORDINATES),DE + ; LD A,E + ; LD (MX),A + ; LD A,D + ; LD (MY),A SCF RET +;[ ] 14/03/2024 проверка на переполнение буфера +/* +.Receiver_Overrun: + ; empty the buffer + IN A,(Z84.SIO.Ch_B.Data) + IN A,(Z84.SIO.Ch_B.Ctrl) + RRCA + JR C,.Receiver_Overrun + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A + ;!TEST + ; reg 0 - return from int + ; LD A,%0011'1000 + ; OUT (Z84.SIO.Ch_B.Ctrl),A + ; + RET +*/ -MCORECT LD HL,(PIX_X) - LD DE,(MX) + +MCORECT: + LD HL,(PIX_X) + LD DE,(MOUSE_COORDINATES) LD D,0 BIT 7,E - JR NZ,DECX + JR NZ,.DECX ADD HL,DE LD (PIX_X),HL EX DE,HL LD HL,(MAX_X) AND A SBC HL,DE - JR NC,YCOO + JR NC,.YCOO LD HL,(MAX_X) LD (PIX_X),HL - JP YCOO -DECX LD A,E + JP .YCOO +.DECX: LD A,E NEG LD E,A AND A SBC HL,DE LD (PIX_X),HL - JR C,YCOO2 + JR C,.YCOO2 LD DE,(MIN_X) SBC HL,DE - JR NC,YCOO -YCOO2 LD HL,(MIN_X) + JR NC,.YCOO +.YCOO2: LD HL,(MIN_X) LD (PIX_X),HL -YCOO LD HL,(PIX_Y) - LD DE,(MY) +.YCOO: LD HL,(PIX_Y) + LD DE,(MOUSE_COORDINATES.Y) LD D,0 BIT 7,E JR NZ,DECY @@ -750,77 +798,90 @@ YCOO LD HL,(PIX_Y) LD (PIX_Y),HL RET -DECY LD A,E +DECY: LD A,E NEG LD E,A AND A SBC HL,DE LD (PIX_Y),HL - JR C,XCOO + JR C,.XCOO LD DE,(MIN_Y) SBC HL,DE RET NC -XCOO LD HL,(MIN_Y) +.XCOO: LD HL,(MIN_Y) LD (PIX_Y),HL RET -SENSE LD HL,(SENSEXY) +SENSE: LD HL,(SENSEXY) LD A,L - OR L - RET Z - DEC A - RET Z + ;!TEST + ;OR L + ;RET Z + ;DEC A + ;RET Z + CP 2 + CCF + JR NC,.check_Y + ; LD A,E BIT 7,A LD B,#FF - JR Z,SEN1 + JR Z,.loop LD B,#7F NEG -SEN1 INC B +.loop: INC B SUB L - JR NC,SEN1 + JR NC,.loop BIT 7,B - JR Z,SEN2 + JR Z,.next LD A,B RES 7,A NEG LD B,A -SEN2 LD E,B + ; +.next: LD E,B + ; !TEST +.check_Y: + LD A,H + CP 2 + CCF + RET NC + ; LD A,D BIT 7,A LD B,#FF - JR Z,SEN3 + JR Z,.loop2 LD B,#7F NEG -SEN3 INC B +.loop2: INC B SUB H - JR NC,SEN3 + JR NC,.loop2 BIT 7,B - JR Z,SEN4 + JR Z,.skip2 LD A,B RES 7,A NEG LD B,A -SEN4 LD D,B +.skip2: LD D,B RET -M_MODE LD (MODE_M),A +M_MODE: LD (MODE_M),A OR A - JR Z,UNKMODE + JR Z,.UNKMODE CP 1 - JR Z,UNKMODE + JR Z,.UNKMODE CP 2 JR Z,S320256 CP 3 JR Z,S640256 BIT 7,A - JR Z,UNKMODE + JR Z,.UNKMODE RES 7,A CP 1 JR Z,S320256 CP 2 JR Z,S640256 -UNKMODE: +.UNKMODE: XOR A ; ????? может тут надо .INVALID_COMMAND ? SCF RET @@ -858,13 +919,19 @@ M_INT: IN A,(SLOT3) OUT (SLOT3),A LD A,C OUT (PORT_Y),A + ;!TEST SIO INT + IF MOUSE_INT_ENABLED + LD A,%0011'1000 ; return from int + OUT (Z84.SIO.Ch_B.Ctrl),A + ENDIF RET -M_REFR CALL CONTROL +M_REFR: CALL CONTROL AND A RET -CONTROL CALL READ_M +CONTROL: + CALL READ_M RET NC CALL MCORECT ;LD A,#00 @@ -894,9 +961,11 @@ MODE_M: DB #03 PIX_X: DW 160 PIX_Y: DW 128 -MX: DB #00 -MY: DB #00 -MB: DB #00 +MOUSE_COORDINATES: +.X: DB #00 +.Y: DB #00 +MOUSE_BUTTONS: DB #00 + ;MB_OLD DB #00 ; !FIXIT - не нужно? MIN_X: DW 0 MAX_X: DW 319 @@ -904,7 +973,7 @@ MIN_Y: DW 0 MAX_Y: DW 255 SENSEXY: .X: DB 0 -.Y: DB 0 +.Y: DB 2 XHOT_SP: DW 0 YHOT_SP: DW 0 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 802e4c8..fdaf57b 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -433,6 +433,14 @@ FULL_BF: KEYSCAN: LD IX,KEYFLAG + ;!TEST SIO INT + IF KEYBOARD_INT_ENABLED + CALL .RESCAN + LD A,%0011'1000 ; return from int + OUT (Z84.SIO.Ch_A.Ctrl),A + RET + ENDIF + ; .RESCAN: IN A,(Z84.SIO.Ch_A.Ctrl) AND 1 @@ -443,7 +451,7 @@ KEYSCAN: OUT (Z84.SIO.Ch_A.Ctrl),A IN A,(Z84.SIO.Ch_A.Ctrl) AND %0010'0000 ; check receiver overrun error - JP NZ,Receiver_Overrun + JP NZ,KBD_Receiver_Overrun ; IN A,(Z84.SIO.Ch_A.Data) CP #F0 @@ -963,36 +971,55 @@ BEEP: LD A,#10 RET KEYBOARD_INIT: - XOR A ;LD A,0 - OUT (Z84.SIO.Ch_A.Ctrl),A - INC A ;LD A,1 - OUT (Z84.SIO.Ch_A.Ctrl),A - XOR A ;LD A,0 ;#18 - OUT (Z84.SIO.Ch_A.Ctrl),A - LD A,3 - OUT (Z84.SIO.Ch_A.Ctrl),A - LD A,#C1 + DI + ; reg 0 + XOR A OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 4 LD A,4 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#07 ;#05 OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 3 + LD A,3 + OUT (Z84.SIO.Ch_A.Ctrl),A + LD A,#C1 + OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 5 LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#62 OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 1 + LD A,1 + OUT (Z84.SIO.Ch_A.Ctrl),A + IF KEYBOARD_INT_ENABLED + LD A,%0001'1001 + ELSE + XOR A ;#18 + ENDIF + OUT (Z84.SIO.Ch_A.Ctrl),A + ; + EI RET -;[ ] 18/02/2024 проверка на переполнение буфера -Receiver_Overrun: +;[x] 18/02/2024 проверка на переполнение буфера +KBD_Receiver_Overrun: ; empty the buffer IN A,(Z84.SIO.Ch_A.Data) IN A,(Z84.SIO.Ch_A.Ctrl) RRCA - JR C,Receiver_Overrun - ; reg 0 - reset errors + JR C,KBD_Receiver_Overrun + ; reg 0 - error reset LD A,%0011'0000 OUT (Z84.SIO.Ch_A.Ctrl),A + ;!TEST SIO INT + ; reg 0 - return from int + IF KEYBOARD_INT_ENABLED + LD A,%0011'1000 + OUT (Z84.SIO.Ch_A.Ctrl),A + ENDIF + ; ;!TODO при детекте переполнения буфера проца снять клавиши из порта #FE спектрума ; LD (IX+K_SHIFT),0 @@ -1001,7 +1028,7 @@ Receiver_Overrun: ; LD A,(HOST) ; LD (HEAD),A ; - AND A + ;AND A RET ;//MODULE: KEYINTER ;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index c353035..5f97bf2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -943 \ No newline at end of file +944 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f0ea1b5..a948e8d 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -10,7 +10,9 @@ ; DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B - DEFINE MOUSE_READ_PORT_TIMEOUT 1280 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники + DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники +; + DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A ; ; From 54b1e804ba937dd36e441d618e348ba710fc51d3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 16 Mar 2024 22:55:49 +1000 Subject: [PATCH 096/219] =?UTF-8?q?=20=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D0=BD=D1=82=D1=8B=20=D1=81=20SIO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/INTMOUSE.ASM | 97 ++++++++++++++++++++++++++++++------------------ DSS/KEYINTER.ASM | 7 +--- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- 4 files changed, 64 insertions(+), 44 deletions(-) diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 2568a00..017c9a0 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -167,27 +167,38 @@ MS_INIT: ; reg 4 - скорость порта первый множитель LD A,4 OUT (PORT_MOUSE.Ctrl),A - LD A,+(7 | MOUSE_BAUD.multiplier_1) + ;LD A,+(5 | MOUSE_BAUD.multiplier_1) ; parity + LD A,+(4 | MOUSE_BAUD.multiplier_1) ; no parity OUT (PORT_MOUSE.Ctrl),A ; reg 3 LD A,3 OUT (PORT_MOUSE.Ctrl),A LD A,#41 + ;LD A,#C1 OUT (PORT_MOUSE.Ctrl),A ; reg 5 LD A,5 OUT (PORT_MOUSE.Ctrl),A LD A,%1110'0000 ; bit7 для корректного инита Sega джойстика в порту кемпстон джойстика OUT (PORT_MOUSE.Ctrl),A - ; reg 1 - LD A,1 - OUT (PORT_MOUSE.Ctrl),A IF MOUSE_INT_ENABLED + ; reg 1 + LD A,1 + OUT (PORT_MOUSE.Ctrl),A LD A,%0001'1001 + OUT (PORT_MOUSE.Ctrl),A + ; reg 2 + LD A,2 + OUT (PORT_MOUSE.Ctrl),A + LD A,#FF ; вектор прерывания #FF + OUT (PORT_MOUSE.Ctrl),A ELSE + ; reg 1 + LD A,1 + OUT (PORT_MOUSE.Ctrl),A XOR A + OUT (PORT_MOUSE.Ctrl),A ENDIF - OUT (PORT_MOUSE.Ctrl),A ; скорость порта - второй множитель LD A,#55 OUT (Z84.CTC.Ch_0),A @@ -622,22 +633,29 @@ MOUSE: LD A,(MODE_M) RET ;----------------------------------------------------------------------; +CLEAR_MOUSE_BUFFER: + IN A,(Z84.SIO.Ch_B.Data) + IN A,(Z84.SIO.Ch_B.Ctrl) + RRCA + JR C,CLEAR_MOUSE_BUFFER + SCF + RET ;----------------------------------------------------------------------; -READ_M: - ;[ ] 18/02/2024 проверка на переполнение буфера +READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера ; reg 1 LD A,1 OUT (PORT_MOUSE.Ctrl),A IN A,(PORT_MOUSE.Ctrl) AND %0010'0000 ; check receiver overrun error ; JP NZ,.Receiver_Overrun - JR Z,.NEXT + JR Z,.READ_FIRST_BYTE ; reg 0 - error reset LD A,%0011'0000 OUT (Z84.SIO.Ch_B.Ctrl),A -.NEXT: ; + JP CLEAR_MOUSE_BUFFER +.READ_FIRST_BYTE: IN A,(PORT_MOUSE.Ctrl) RRCA RET NC @@ -652,47 +670,52 @@ READ_M: RET Z ;[x] mouse freeeeezzzz - LD BC,MOUSE_READ_PORT_TIMEOUT + ;LD BC,MOUSE_READ_PORT_TIMEOUT ; -.TST_01: +.READ_SECOND_BYTE: IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz - JR C,.NXT_1 - DEC BC - LD A,B - OR C - JR NZ,.TST_01 - RET - ;JR NC,TST_01 + ;JR C,.NXT_1 + ;DEC BC + ;LD A,B + ;OR C + ;JR NZ,.TST_01 + ;RET + JR NC,.READ_SECOND_BYTE ; -.NXT_1: IN A,(PORT_MOUSE.Data) +;.NXT_1: + IN A,(PORT_MOUSE.Data) LD E,A - BIT 6,A - CCF + AND %0100'0000 + ;CCF RET NZ ;[x] mouse freeeeezzzz - LD BC,MOUSE_READ_PORT_TIMEOUT + ;LD BC,MOUSE_READ_PORT_TIMEOUT ; -.TST_02: +.READ_LAST_BYTE: IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz - JR C,.NXT_2 - DEC BC - LD A,B - OR C - JR NZ,.TST_02 - RET - ;JR NC,TST_02 + ;JR C,.NXT_2 + ;DEC BC + ;LD A,B + ;OR C + ;JR NZ,.READ_LAST_BYTE + ;RET + JR NC,.READ_LAST_BYTE ; -.NXT_2: IN A,(PORT_MOUSE.Data) +;.NXT_2: + IN A,(PORT_MOUSE.Data) LD D,A - BIT 6,A - CCF + ;BIT 6,A + AND %0100'0000 + ;CCF RET NZ + ; все три байта пакета прочитаны + ; LD A,E AND #3F LD E,A @@ -814,7 +837,7 @@ DECY: LD A,E SENSE: LD HL,(SENSEXY) LD A,L - ;!TEST + ; [ ] 15/03/2024 теперь поправки чувствительности по координатам работают корректно ;OR L ;RET Z ;DEC A @@ -840,7 +863,7 @@ SENSE: LD HL,(SENSEXY) LD B,A ; .next: LD E,B - ; !TEST + ; [ ] 15/03/2024 теперь поправки чувствительности по координатам работают корректно .check_Y: LD A,H CP 2 @@ -928,7 +951,7 @@ M_INT: IN A,(SLOT3) M_REFR: CALL CONTROL AND A - RET + RET CONTROL: CALL READ_M @@ -971,7 +994,7 @@ MIN_X: DW 0 MAX_X: DW 319 MIN_Y: DW 0 MAX_Y: DW 255 -SENSEXY: +SENSEXY: ; Сэн Сэкси .X: DB 0 .Y: DB 2 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index fdaf57b..9806bb3 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -978,7 +978,7 @@ KEYBOARD_INIT: ; reg 4 LD A,4 OUT (Z84.SIO.Ch_A.Ctrl),A - LD A,#07 ;#05 + ;LD A,5 ; parity OUT (Z84.SIO.Ch_A.Ctrl),A ; reg 3 LD A,3 @@ -996,7 +996,7 @@ KEYBOARD_INIT: IF KEYBOARD_INT_ENABLED LD A,%0001'1001 ELSE - XOR A ;#18 + XOR A ENDIF OUT (Z84.SIO.Ch_A.Ctrl),A ; @@ -1025,9 +1025,6 @@ KBD_Receiver_Overrun: LD (IX+K_SHIFT),0 LD (IX+KEYFLG),0 ; - ; LD A,(HOST) - ; LD (HEAD),A - ; ;AND A RET ;//MODULE: KEYINTER diff --git a/DSS/build.txt b/DSS/build.txt index 5f97bf2..972fd77 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -944 \ No newline at end of file +958 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index a948e8d..4484ee0 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -10,7 +10,7 @@ ; DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B - DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники +;DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники ; DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A ; From f13fdf4eab7cd98506e45e3c09c9714f20dc32c8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 20 Mar 2024 22:08:52 +1000 Subject: [PATCH 097/219] -bug in GETWORD: fixed "cd x:" incorrect behavior --- BOOT/DSSBOOT.ASM | 26 ++--- DSS/API/ChDir.asm | 4 +- DSS/API/Create.asm | 16 +-- DSS/API/MkDir.asm | 2 +- DSS/API/RmDir.asm | 4 +- DSS/API/diskINF.asm | 4 +- DSS/DOS_Proc.asm | 15 ++- DSS/DSS-MAIN.ASM | 4 +- DSS/FS/FAT/FAT.asm | 252 ++++++++++++++-------------------------- DSS/FS/FAT/FAT12_16.asm | 70 ++++++----- DSS/FS/FAT/FAT32.asm | 9 +- DSS/INTMOUSE.ASM | 10 +- DSS/build.txt | 2 +- 13 files changed, 174 insertions(+), 244 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 5cd2865..535b497 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -310,7 +310,7 @@ SET_PRM: PUSH BC LD A,B LD C,BIOS.DRV_GET_PAR RST ToBIOS_18 - LD A,(BOOT.S_P_T) + LD A,(BOOT.SectorsPerTrack) LD L,A POP AF PUSH AF @@ -358,16 +358,16 @@ NX2: LD HL,(BOOT+510) LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) ADD HL,DE LD (FAT_FRM),HL ;first sector FAT - LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ;sectors in FAT - LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) - LD A,(BOOT.FAT_NUM) ;amount FATs + LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT + LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) + LD A,(BOOT.Number_of_FATs) ;amount FATs C_DATA1: ADD HL,DE DEC A JR NZ,C_DATA1 LD (DIR_FRM),HL ;first sector DIR EX DE,HL - LD L,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ;Number file handel - LD H,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1) + LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel + LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) ADD HL,HL ADD HL,HL ADD HL,HL @@ -381,10 +381,10 @@ C_DATA1: ADD HL,DE ADD HL,DE LD (DAT_FRM),HL ;First sector data - LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ;Size sector - LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) + LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector + LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) LD HL,0 - LD A,(BOOT.S_P_C) + LD A,(BOOT.SectorsPerCluster) NEXTAD3: ADD HL,BC ;calc. cluster size DEC A @@ -518,7 +518,7 @@ FLOAD: LD (READMEM),DE LD_FILE: PUSH HL CALL NSECTOR LD DE,(READMEM) - LD A,(BOOT.S_P_C) + LD A,(BOOT.SectorsPerCluster) CP #20 JR C,SMALL_CLUSTER LD BC,#20*256 + BIOS.DRV_READ_LONG @@ -554,7 +554,7 @@ SMALL_CLUSTER: ; DEC HL ; DEC HL ; EX DE,HL -; LD A,(BOOT.S_P_C) +; LD A,(BOOT.SectorsPerCluster) ; LD B,A ; LD HL,0 ; LD IX,0 @@ -578,7 +578,7 @@ NSECTOR: LD DE,0 DEC HL DEC HL - LD A,(BOOT.S_P_C) + LD A,(BOOT.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -643,7 +643,7 @@ R_F_F12 LD D,H RR L PUSH AF EX DE,HL - LD HL,(BOOT.B_P_S) + LD HL,(BOOT.BytesPerSector) LD B,H LD C,L ADD HL,HL diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index 2f82fa0..9b20e37 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -30,6 +30,6 @@ CHDIR: CALL GETWORD ; LD HL,TMPNAME LD A,(HL) OR A - CALL NZ,OPENDIR - RET + RET Z + JP OPENDIR ; \ No newline at end of file diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 1b23edc..2bdefac 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -3,8 +3,6 @@ ; A - File attribute ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE_FN: - AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID CREATE: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL LD C,A @@ -13,7 +11,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 POP BC POP HL RET C - LD A,C ; + LD A,C ; CALL .Prepare RET C @@ -30,8 +28,8 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 LD A,DSS_Error.sys.FILE_NOT_FOUND RET ; -.NEW_FN: - AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID + ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 + ; OUTPUT: A - FM .NEW: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL LD C,A @@ -69,7 +67,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 .loop1: LD (HL),C INC HL DJNZ .loop1 - ; + ;AaRR PUSH HL CALL SYSTIME CALL MK_TIME @@ -97,7 +95,8 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 LD (OPEN_FN.TMP),A JP OPEN_FN.FILE ;R008 .Prepare: - AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE + ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE + AND FAT_ATTR.NoDIRnoVolID LD (.TMP),A LD (.PATH0),HL CALL GETWORD @@ -111,7 +110,4 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 LD A,DSS_Error.sys.FILE_EXISTS CCF RET -; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 -; OUTPUT: A - FM -CREAT_N EQU CREATE.NEW_FN ; \ No newline at end of file diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index bfde2c5..227c22f 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -143,7 +143,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; POP HL CALL NSECTOR - LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 09dd1f5..4463af8 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -42,7 +42,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH IX .RMD17: PUSH HL CALL NSECTOR - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: PUSH AF @@ -93,7 +93,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 POP AF DEC A JR NZ,.read_dir_loop - ; + ; [ ] fat32 POP HL ; номер кластера CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index aa61bc3..aa511ab 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -122,8 +122,8 @@ DISKINF:; [ ] 22/11/23 LD E,C LD HL,(FAT_Max_Cluster_L) DEC HL - LD BC,(CORE_BUFFERS.BootSector.B_P_S) - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) AND A RET ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index ddabfbe..9830796 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -116,7 +116,7 @@ GETWORD: LD A,(HL) CP 'a' JR C,.next - CP '{' + CP 'z'+1 JR NC,.next SUB #20 .next: SUB 'A' @@ -129,13 +129,13 @@ GETWORD: RET C LD A,(HL) OR A - RET Z + JR Z,.done CP ' ' ; - RET Z + JR Z,.done CP '\' ; SCF LD A,DSS_Error.sys.PATH_NOT_FOUND - RET NZ + RET NZ INC HL ; .dir_loop: @@ -158,7 +158,11 @@ GETWORD: DJNZ .loop LD A,DSS_Error.sys.INVALID_NAME SCF - RET + RET + ; +.done: XOR A + LD (TMPNAME),A + RET ; .DIR_NAME: XOR A @@ -260,6 +264,7 @@ OPENDSK:;!TEST DRV.Open ;----------------------------------------------------------------------; +; вход: HL - имя директории OPENDIR:;[x] some optimizations ;XOR A ;CALL SET_FM diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 19841df..92ba73d 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -358,7 +358,7 @@ ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE_FN, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 + DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 @@ -385,7 +385,7 @@ ADRST10: ;DS 512 ;,0 ENDIF ;...............................................[HIGH ADDRESS]: DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE_FN, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index ac6e380..e882438 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -16,7 +16,8 @@ ; (HANDBUF) = file's direcory record ; CF - каталог не найден SEARCH: -.Dir: LD A,FAT_ATTR.DIRECTORY +.Dir: ;LD A,FAT_ATTR.DIRECTORY + LD A,FAT_ATTR.HiddenSysDir CALL SEARCH.Custom RET NC CP DSS_Error.sys.PATH_NOT_FOUND + 1 @@ -40,12 +41,12 @@ SEARCH: ; LD DE,0 ; EXX ; -.loop: LD A,(IX+00) +.loop: LD A,(IX+_sFAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены JR Z,.next_record - LD A,(IX+11) + LD A,(IX+_sFAT_DIRECTORY_RECORD.ATTRIBUT) AND C JR NZ,.next_record LD HL,MASKARE @@ -345,7 +346,7 @@ LOADDIR: ; [ ] fat32 LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - JP Z,.LROTDIR ; root ?? + JP Z,.LoadRootDir ; LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько @@ -355,11 +356,11 @@ LOADDIR: POP AF OUT (SLOT3),A RET -.LROTDIR: - LD HL,(FatBuffer.DIR_FRH) ; ст. разряд - LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора - LD A,(FatBuffer.DIR_S_S) - LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога +.LoadRootDir: + LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд + LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(FatBuffer.DirSizeInSectros) + LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 LD B,A ; число секторов @@ -420,7 +421,7 @@ WRT_HND: SET_PAGE_X DIRPAGE SBC HL,DE JR NC,SAVEDIR LD HL,(SAVEDIR.DIRSIZE) - LD BC,(FatBuffer.B_P_C) + LD BC,(FatBuffer.BytesPerCluster) ADD HL,BC LD (SAVEDIR.DIRSIZE),HL AND A @@ -448,7 +449,7 @@ SAVEDIR: LD E,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,D OR E - JP Z,.SROTDIR + JP Z,.SaveRootDir LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) @@ -460,11 +461,11 @@ SAVEDIR: OUT (SLOT3),A AND A RET -.SROTDIR: - LD HL,(FatBuffer.DIR_FRH) - LD IX,(FatBuffer.DIR_FRL) - LD A,(FatBuffer.DIR_S_S) - LD B,32 ;!HARDCODE +.SaveRootDir: + LD HL,(FatBuffer.RootDirFirstSector_H) + LD IX,(FatBuffer.RootDirFirstSector_L) + LD A,(FatBuffer.DirSizeInSectros) + LD B,32 ;!HARDCODE sector size 512 SUB B JR NC,.RTD1S ADD A,B @@ -496,18 +497,13 @@ RD_BPB: LD C,SLOT3 IN A,(SLOT0) OUT (SLOT3),A LD A,(FatBuffer.DRIVE) - ;R08 - ;LD DE,BOOT+#C000 - LD DE,CORE_BUFFERS.SECBUF+#C000 - ;R08 + LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD C,Dss.DRV.GetBPB RST ToDSS.DRV POP BC OUT (C),B JP C,DOS_X_Error.Not_ready - //PUSH IY ; пока без индексного, но может пригодиться - LD DE,#AA55 ; сигнатура ;R05 LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 ;R05 @@ -520,39 +516,21 @@ RD_BPB: LD C,SLOT3 LD BC,_sBOOT_SECTOR_PARAMS ; size LDIR ; - - //LD IY,BootSector ; пока без индексного, но может пригодиться - //LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) - CP #F0 JP C,DOS_X_Error.UnknownBPB - - ;!TEST - ;LD HL,0 ; calc. first sector FAT - ;LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec - ;LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) - ;ADD HL,DE - - //LD L,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec - //LD H,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) - LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS) + ; calc. first sector FAT + LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS) ; - ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; ADD HL,DE - - ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT - LD (FatBuffer.FAT1_SEC_L),HL ; first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL - - //LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ; sectors in FAT - //LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) - LD DE,(CORE_BUFFERS.BootSector.S_P_F) - - - LD A,(CORE_BUFFERS.BootSector.FAT_NUM) ; amount FATs + ; + LD (FatBuffer.FAT1_SEC_L),HL ; first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL ; first sector FAT #2 + ; + LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) + LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs CP 1 JR Z,.loop1 DEC A @@ -562,80 +540,47 @@ RD_BPB: LD C,SLOT3 .loop1: ADD HL,DE DEC A JR NZ,.loop1 - LD (FatBuffer.DIR_FRL),HL ; first sector DIR - ; CF = ? мало ли - AND A - ; CF = 0 - - //LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sectors - //LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) - LD BC,(CORE_BUFFERS.BootSector.B_P_S) - ; RL C - ; RL B - ; RL C - ; RL B - ; RL C - ; RL B - ; LD C,B - ; LD B,0 ; BC - File handels in sectors - ; LD A,C - ;;;; + ; + LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) LD A,B + AND A ; RL C RLA - ; RL C RLA - ; RL C RLA ; LD C,A LD B,0 ; BC - File handels in sectors ;;;; - LD (FatBuffer.F_P_S),A - - //LD E,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ; Number file handel - //LD D,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1) - LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) - + LD (FatBuffer.FilesPerSector),A + ; EX DE,HL - DEC HL + LD HL,(CORE_BUFFERS.BootSector.FilesInRootDIR) ; 0 for fat32 + DEC HL ; [ ]fat32 XOR A ;NEXTAD2 .loop2: INC A JP Z,DOS_X_Error.UnknownBPB SBC HL,BC JR NC,.loop2 - + ; EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (FatBuffer.DIR_S_S),A + LD (FatBuffer.DirSizeInSectros),A ADD HL,BC ; Start DATA area - LD (FatBuffer.DAT_FRL),HL -;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer -//////////////////////////////////////////////////////////////////////// - ;IF COMPILE_UNUSED_CODE - ;LD HL,0 - - ;LD H,B ; тут в B ноль должен быть - ;LD L,B - ;LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector - ;LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) - - //LD L,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector - //LD H,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) - LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector - - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD (FatBuffer.FirstDataSector_L),HL + ; B = 0 + ; + LD HL,(CORE_BUFFERS.BootSector.BytesPerSector) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;!TODO FATcacheSize -;NEXTAD3 -; .loop3: ADD HL,BC ; calc. cluster size -; DEC A -; JR NZ,.loop3 - XOR 1 ; calc. cluster size + ; calc. cluster size + XOR 1 JR Z,.loop3.end RRA .loop3: ADD HL,HL @@ -643,7 +588,7 @@ RD_BPB: LD C,SLOT3 JP NC,.loop3 .loop3.end: ; - LD (FatBuffer.CLU_LEN),HL + LD (FatBuffer.BytesPerCluster),HL EX DE,HL LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize XOR A @@ -652,11 +597,9 @@ RD_BPB: LD C,SLOT3 JP Z,DOS_X_Error.UnknownBPB SBC HL,DE JR NC,.loop4 - LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) - ;ENDIF -//////////////////////////////////////////////////////////////////////// - -;!TODO detect fat type by clusters! + LD (FatBuffer.ClusterPerBank),A ; A - Clusters per bank (16k) + ; + ;!TODO detect fat type by clusters! ;[ ] fat32 reset fat32 variables LD HL,0 LD (FatBuffer.ENDCLUS_HIGH),HL @@ -707,57 +650,36 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.FAT_TYPE),A LD (FatBuffer.ENDCLUS_LOW),HL -;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer +;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// - ;IF COMPILE_UNUSED_CODE - - LD HL,0 - - //LD C,(IY+_sBOOT_SECTOR_PARAMS.S_P_T) ; Sector per track - //LD B,(IY+_sBOOT_SECTOR_PARAMS.S_P_T+1) - LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track - - LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага -.BPB_L1: ; calc. sector per cylinder - ADD HL,BC - DEC A - JR NZ,.BPB_L1 - LD (FatBuffer.S_X_H),HL - ;ENDIF +; LD HL,0 +; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.BootSector.HEADS) +; .BPB_L1:; calc. sector per cylinder +; ADD HL,BC +; DEC A +; JR NZ,.BPB_L1 +; LD (FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// - - LD DE,(FatBuffer.DAT_FRL) -; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec -; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) -; AND A -; SBC HL,DE -; EX DE,HL - - //LD L,(IY+_sBOOT_SECTOR_PARAMS.S_P_D) - //LD H,(IY+_sBOOT_SECTOR_PARAMS.S_P_D+1) - LD HL,(CORE_BUFFERS.BootSector.S_P_D) - + ; [ ] fat32 + LD HL,(CORE_BUFFERS.BootSector.SectorsPerDrive) + LD DE,(FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; - //LD L,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS) - //LD H,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+1) LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_L) - - //LD C,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+2) - //LD B,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+3) LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_H) AND A SBC HL,DE JP NC,.HDDBIG DEC BC JP .HDDBIG -.HDDSMAL: - ;AND A ;тут CF полюбас сброшен должен быть + ; +.HDDSMAL:; CF = 0 SBC HL,DE LD BC,0 -.HDDBIG: LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага +.HDDBIG: LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) SCF .S4C01: RRA JR C,.S4C02 @@ -768,9 +690,7 @@ RD_BPB: LD C,SLOT3 JP .S4C01 .S4C02: INC HL LD (FAT_Max_Cluster_L),HL - - //POP IY - + ; XOR A LD H,A LD L,A @@ -808,7 +728,6 @@ RD_BPB: LD C,SLOT3 ; DOS_X_Error: .UnknownBPB: - //POP IY LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF RET @@ -820,29 +739,28 @@ DOS_X_Error: ; ;!TODO к буферам! FatBuffer: -.MSG: DB 'FAT' -.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) -.BLOCK: DB #00 -.DIR_CLU_L: DW #0000 -.DIR_CLU_H: DW #0000 ; [ ] fat32 -.DRIVE: DB #FF -.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) -.FAT1_SEC_H: DW #0000 ; [ ] fat32 -.FAT2_SEC_L: DW #0000 -.FAT2_SEC_H: DW #0000 ; [ ] fat32 -.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется -.DIR_FRL: DW #0000 ; MSD_CAT_SEC first sector DIR -.F_P_S: DB #00 ; число файловых записей в секторе -.DIR_S_S: DB #00 ; DIR_SEC_SIZE -.DAT_FRL: DW #0000 ; MSD_DAT_SEC low -.DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ;!FIXIT не используется -.CLU_LEN: -.B_P_C: DW #0000 ; CLUSTER_LEN -.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 -.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? -.ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 +.MSG: DB 'FAT' +.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +.BLOCK: DB #00 +.RootDirStartCluster_L: DW #0000 +.RootDirStartCluster_H: DW #0000 ; [ ] fat32 +.DRIVE: DB #FF +.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) +.FAT1_SEC_H: DW #0000 ; [ ] fat32 +.FAT2_SEC_L: DW #0000 +.FAT2_SEC_H: DW #0000 ; [ ] fat32 +.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR +.FilesPerSector: DB #00 ; число файловых записей в секторе +.DirSizeInSectros: DB #00 ; DIR_SEC_SIZE +.FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low +.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ; [ ] fat32 +.BytesPerCluster: DW #0000 ; CLUSTER_LEN +.ClusterPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 +.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? +.ENDCLUS_LOW: DW #FFFF +.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index fd418c6..3865e2f 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -327,7 +327,7 @@ WRITE_FAT_TABLE: LD DE,FAT_CACHE.Sectors ADD HL,DE ;+ SIZE CASH (16 SECTORS) LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш - LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT + LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT AND A SBC HL,DE JR C,.WALLFAT @@ -520,13 +520,13 @@ GET_FAT12_CELL: RET -; in: HL - CLUSTER +; in: DE:HL - CLUSTER ; out: HL:IX - SECTOR -NSECTOR:;[x] fat32 - LD DE,(FAT_Max_Cluster_H) +NSECTOR:;[ ] fat32 + LD DE,(FAT_Max_Cluster_H) ; [ ] fat32 - заменить другой переменной DEC HL DEC HL - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -541,11 +541,16 @@ NSECTOR:;[x] fat32 .skip: EX DE,HL LD XL,E LD XH,D - LD DE,(FatBuffer.DAT_FRL) ;first data sector - XOR A + LD DE,(FatBuffer.FirstDataSector_L) + ; [x] fat32 + ;XOR A + ; ADD IX,DE - LD D,A - LD E,A + ; [x] fat32 + LD DE,(FatBuffer.FirstDataSector_H) + ;LD D,A + ;LD E,A + ; ADC HL,DE ;!TODO а надо ли проверять переполнение HL:IX? RET @@ -603,9 +608,8 @@ NSECTOR:;[x] fat32 ;; BLOCK_READ.ECL2: - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - POP BC - ; + ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) + POP BC ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP BC POP DE AND A @@ -614,25 +618,30 @@ BLOCK_READ.ECL2: ;READ SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors +; IX - buffer in RAM +; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 BLOCK_READ: PUSH BC LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC - ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb + ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb. Использовать DE LD B,XH LD C,XL - PUSH HL ;RESIDUE + PUSH HL ; остаток DIV_for_SPC + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - LD A,H - OR L + LD A,L + OR H + ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;JR NZ,BLOKRD2 PUSH BC + ;PUSH DE ; [ ] старшее слово номера кластера (раньше игнорировалось) JR Z,.ECL2 ;JP ECL2 ;RY01 JR BLOKRD0 _GetSavedCluster .enter_loop1 @@ -650,12 +659,13 @@ BLOCK_READ: INC B DEC BC DJNZ .loop1 + ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster ; - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) + POP DE ; остаток DIV_for_SPC + POP BC ; HL:DE - FP (in sectors) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) SUB E LD C,A ;\ CP B ; \ @@ -680,7 +690,7 @@ BLOCK_READ: JR C,.Error POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) ;!TEST LD A,B LD B,C @@ -695,7 +705,7 @@ BLOCK_READ: RET Z LD B,A ; -.loop4: LD HL,CORE_BUFFERS.BootSector.S_P_C +.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -724,7 +734,7 @@ BLOCK_READ: JR C,.Error POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -759,7 +769,7 @@ BLOCK_READ: BLOK_WR: PUSH BC LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK @@ -820,7 +830,7 @@ BLOK_WR: ; POP DE POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) SUB E LD C,A CP B @@ -846,7 +856,7 @@ BLOK_WR: JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) ; .loop2: ADD HL,DE DEC C @@ -860,7 +870,7 @@ BLOK_WR: RET Z ; .big_loop: - LD HL,CORE_BUFFERS.BootSector.S_P_C + LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -894,7 +904,7 @@ BLOK_WR: JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -1050,7 +1060,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ; NSECTOR: DEC HL ; DEC HL ; EX DE,HL -; LD A,(CORE_BUFFERS.BootSector.S_P_C) +; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; LD B,A ; LD HL,0 ; LD IX,0 @@ -1058,7 +1068,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ; JR NC,ADD_DE2 ; INC HL ; ADD_DE2: DJNZ ADD_DE1 -; LD DE,(FatBuffer.DAT_FRL) ;first data sector +; LD DE,(FatBuffer.FirstDataSector_L) ;first data sector ; ADD IX,DE ; LD DE,#0000 ; ADC HL,DE diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm index fa44220..054fcbd 100644 --- a/DSS/FS/FAT/FAT32.asm +++ b/DSS/FS/FAT/FAT32.asm @@ -2,7 +2,7 @@ ;======================================================================= ;BPB ;LD (FatBuffer.FAT2_SEC_L),HL - ;LD (FatBuffer.DIR_FRL),HL ; first sector DIR + ;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR ;BPB32 ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта ;FAT Max Cluster @@ -31,7 +31,7 @@ CHECK_INC_HIGH_CLUSTER: ENDMODULE ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - +;----------------------------------------------------------------------- ;вход: DE:HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_CELL: @@ -54,8 +54,7 @@ GET_FAT32_CELL: 0xEAB1022 - block 0x1D562 D E H 0xEAB10 >>> 0x1D562 -*/ - + [ ] fat32 доделать тут LD A,H LD B,H AND #0F @@ -79,6 +78,8 @@ GET_FAT32_CELL: LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET +*/ +;----------------------------------------------------------------------- /* ; Прочитать в кеш 16 секторов FAT-а diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 017c9a0..59575af 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -161,6 +161,11 @@ EMOUSE: RES 7,C ;!TODO на биос. MS_INIT: DI + ; скорость порта - второй множитель + LD A,#55 + OUT (Z84.CTC.Ch_0),A + LD A,MOUSE_BAUD.multiplier_2 + OUT (Z84.CTC.Ch_0),A ; reg 0 XOR A OUT (PORT_MOUSE.Ctrl),A @@ -199,11 +204,6 @@ MS_INIT: XOR A OUT (PORT_MOUSE.Ctrl),A ENDIF - ; скорость порта - второй множитель - LD A,#55 - OUT (Z84.CTC.Ch_0),A - LD A,MOUSE_BAUD.multiplier_2 - OUT (Z84.CTC.Ch_0),A ; EI XOR A diff --git a/DSS/build.txt b/DSS/build.txt index 972fd77..cebfe35 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -958 \ No newline at end of file +946 \ No newline at end of file From 87c74c1ee7b6eaa6a049e9827bfbc38ccc70c31a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 22 Mar 2024 04:06:17 +1000 Subject: [PATCH 098/219] fixed BLOCK_READ, BLOCK_WR --- DSS/API/Open.asm | 7 +- DSS/FS/FAT/FAT12_16.asm | 900 ++++++++++++++++++++++++---------------- DSS/Procedures.asm | 141 +------ DSS/Structures.inc | 12 +- Shared_Includes | 2 +- 5 files changed, 555 insertions(+), 507 deletions(-) diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index d290ad3..645f568 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -50,11 +50,16 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD A,(TASK) LD (IY+_sFM.TASK_NUM),A XOR A - ; [ ] fat32 LD (IY+_sFM.KnownCluster_L),A LD (IY+_sFM.KnownCluster_L+1),A LD (IY+_sFM.KnownOffset_L),A LD (IY+_sFM.KnownOffset_L+1),A + LD (IY+_sFM.OptimizedClusters),A + ; [x] fat32 + LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownCluster_H+1),A + LD (IY+_sFM.KnownOffset_H),A + LD (IY+_sFM.KnownOffset_H+1),A ; LD (IY+_sFM.F_POSITION),A LD (IY+_sFM.F_POSITION+1),A diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 3865e2f..6b3f4a0 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -75,36 +75,46 @@ INC_FAT: ;----------------------------------------------------------- ; Прочитать из кеша FAT-а номер след. кластера -; вход: hl = номер кластера -; de = СТАРШЕЕ слово номера кластера (только для FAT32) -; выход: hl = номер кластера -; de = номер след. кластера (если 0, то кластер hl свободен) -; CF - конец цепочки -;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb +; вход: hl - номер кластера (младшее слово) +; hl' - номера кластера (старшее слово. только для FAT32) +; выход: hl - номер кластера (младшее слово) +; hl' - номера кластера (старшее слово) +; de - номер след. кластера (младшее слово. если 0, то кластер hl свободен) +; de' - номер след. кластера (старшее слово. если 0, то кластер hl' свободен) +; CF - конец цепочки +;!FIXIT далее заточка на то, что в DE всегда 0 - файл не больше 2Gb ;----------------------------------------------------------- ;[ ] fat32 READ_FROM_FAT: ;[x] fat32 - PUSH DE LD A,(FatBuffer.FAT_TYPE) XOR 32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера - LD HL,(FAT_Max_Cluster_H) ; проверяем старшее слово номера кластера - JP .high + ; проверяем старшее слово номера кластера + ; !FIXIT fat32 проверять оба слова FAT_Max_Cluster + EXX + EX DE,HL + LD HL,(FAT_Max_Cluster_H) + ; CF = 0 + SBC HL,DE + EX DE,HL + EXX + LD A,DSS_Error.sys.DISK_FULL + RET C + JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - IX != 0, то кластер корректный ; + ; проверяем младше слово номера кластера .low: EX DE,HL LD HL,(FAT_Max_Cluster_L) -.high: ; CF = 0 + ; CF = 0 SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL - ;[x] fat32 - POP DE - ; RET C - - SET_PAGE_X FATPAGE - + ; +.correct_cluster: + SET_PAGE_X FATPAGE + ; PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYPE) @@ -116,13 +126,20 @@ READ_FROM_FAT: LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) + ; POP AF OUT (SLOT3),A - ;!TODO #FFF7 - кластер с косячными секторами LD HL,#FFEF ;!HARDCODE - XOR A ; DssErr.sys.NO_ERROR +.exit: XOR A ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR SBC HL,DE ; проверка на служ. кластеры POP HL + ; [x] fat32 + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX RET ; .FAT12: CALL GET_FAT12_CELL @@ -147,10 +164,8 @@ READ_FROM_FAT: POP AF OUT (SLOT3),A LD HL,#0FEF - XOR A ; обнуляем CF и устанавливаем код ошибки = нулю - SBC HL,DE ; проверка на служ. кластеры - POP HL - RET + JR .exit + ; .FAT32: ; [ ] fat32 CALL GET_FAT32_CELL DI @@ -556,199 +571,165 @@ NSECTOR:;[ ] fat32 RET //////////////////////////////////////////////////////////////////////// -;[ ] fat32 -;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - MACRO _GetSavedCluster exit_to - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_L+1) - LD A,D - INC B - OR E - JR Z,exit_to - DEC B - ; - PUSH DE - PUSH HL - PUSH BC - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_L+1) - LD A,D - OR E - JR Z,.noOptimization_1 - ; - POP HL - SBC HL,DE - JR C,.noOptimization_2 - ; - LD C,L - LD B,H - POP DE - POP HL - ; - INC B - JP exit_to -.noOptimization_1: - POP BC -.noOptimization_2: - POP HL - POP DE - INC B - JP exit_to - ENDM - ; -;[ ] fat32 -;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - MACRO _SaveGetedCluster - LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_L+1),H - POP BC - LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_L+1),B - ENDM -;; -BLOCK_READ.ECL2: - ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) - POP BC ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - POP BC - POP DE - AND A - RET - ; + +; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 +; ;READ SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors ; IX - buffer in RAM -; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 -BLOCK_READ: - PUSH BC - LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER - LD C,A - LD B,0 - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb. Использовать DE - LD B,XH - LD C,XL - PUSH HL ; остаток DIV_for_SPC - - LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER - LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - LD A,L - OR H - ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - ;JR NZ,BLOKRD2 - PUSH BC - ;PUSH DE ; [ ] старшее слово номера кластера (раньше игнорировалось) - JR Z,.ECL2 - ;JP ECL2 ;RY01 JR BLOKRD0 - _GetSavedCluster .enter_loop1 - ; -.loop1: PUSH BC - CALL READ_FROM_FAT - POP BC - JR C,.ECL2 ;RY01 - EX DE,HL - ; DEC BC -.enter_loop1: - ; LD A,B ; ВС - смещение внутри файла в кластерах - ; OR C - ; JR NZ,.loop1 - INC B - DEC BC - DJNZ .loop1 - ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - _SaveGetedCluster - ; - POP DE ; остаток DIV_for_SPC - POP BC ; HL:DE - FP (in sectors) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - SUB E - LD C,A ;\ - CP B ; \ - JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ - LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться -.skip1: LD A,B ; / - SUB C ; / - LD B,A ;/ - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,.skip2 - INC HL -.skip2: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JR C,.Error - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) - ;!TEST - LD A,B - LD B,C -.loop2: ADD HL,DE - ;DEC C - ;JR NZ,.loop2 - DJNZ .loop2 - LD (READ.PointerOnBuffer),HL - POP DE - ;LD A,B - OR A - RET Z - LD B,A - ; -.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,.BLOKRD7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -.BLOKRD7: - EX DE,HL - PUSH BC - CALL READ_FROM_FAT - POP BC - JR C,.ECL1 ;RY01 - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JR C,.Error - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) -.loop3: ADD HL,DE - DEC C - JR NZ,.loop3 - LD (READ.PointerOnBuffer),HL - POP DE - JP .loop4 - ; -.Error: POP BC - POP DE - ;SCF - RET - ; -.ECL1: AND A - RET +; [ ] fat32 +BLOCK_READ: PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + PUSH HL ; остаток DIV_for_SPC + ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + PUSH BC ; младшее слово номера кластера + PUSH DE ; [x] fat32 старшее слово номера кластера + ; + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + LD A,L + OR H + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER Low + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + OR L + OR H + JR Z,.fast_exit_4 + CALL GetSavedCluster + ;HL': HL - известный кластер файла для отсчёта + ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1) + ; + PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово) + JP .enter_loop1 + ; +.fast_exit_5: POP DE +.fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP DE ; [x] fat32 старшее слово номера кластера + POP BC + ; + POP BC + POP DE + AND A + RET + ; [x] fat32 +.loop1_big: PUSH BC + LD BC,0 +.loop1_small: PUSH BC + CALL READ_FROM_FAT + POP BC + JR C,.fast_exit_5 ;RY01 + EX DE,HL + EXX + EX DE,HL + EXX +.enter_loop1: INC B + DEC BC ; ВС - смещение внутри файла в кластерах (младшее слово) + DJNZ .loop1_small + POP BC ; [x] оставшееся смещение в файле в кластерах (старшее слово) + INC B + DEC BC + DJNZ .loop1_big + ;;;; + ; + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP DE + POP BC + CALL SaveGotCluster + ; + POP DE ; остаток DIV_for_SPC + POP BC ; HL:DE - FP (in sectors) + ; (SP) = (RET) + ; + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + SUB E + LD C,A ;\ + CP B ; \ + JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ + LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться +.skip1: LD A,B ; / + SUB C ; / + LD B,A ;/ + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.skip2 + INC HL +.skip2: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + ;!TEST + LD A,B + LD B,C +.loop2: ADD HL,DE + ;DEC C + ;JR NZ,.loop2 + DJNZ .loop2 + LD (READ.PointerOnBuffer),HL + POP DE + ;LD A,B + OR A + RET Z + LD B,A + ; +.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.BLOKRD7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z + ; +.BLOKRD7: EX DE,HL + PUSH BC + CALL READ_FROM_FAT + POP BC + JR C,.ECL1 ;RY01 + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + JP .loop4 + ; +.Error: POP BC + POP DE + ;SCF + RET + ; +.ECL1: AND A + RET ;----------------------------------------------------------------------- ; BLOK_WR.Error: @@ -763,170 +744,351 @@ BLOCK_READ: ; SCF ; RET ; + + ;WRITE SECTORS OF FILE ;HL:DE - FP (in sectors), IX - data in RAM ; B - Amount sectors -BLOK_WR: - PUSH BC - LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER - LD C,A - LD B,0 - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb - LD B,XH - LD C,XL - PUSH HL ;RESIDUE - LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER - LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - LD A,H - OR L - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - ;JR NZ,BLOKWR2 - PUSH BC - JR NZ,.GetSavedCluster - ; - PUSH BC - CALL G_CLUST - JP C,.Error - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H - LD DE,(FatBuffer.ENDCLUS_LOW) - CALL WRITE_TO_FAT - PUSH HL - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WRITE_FAT_TABLE? - ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - ; - POP HL - POP BC - INC B - JP .WR2 - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -.GetSavedCluster: - _GetSavedCluster .WR2 - ; -.loop: PUSH BC - CALL READ_FROM_FAT - JR NC,.WRB - PUSH HL - CALL INC_FAT - POP HL - JP C,.Error - CALL READ_FROM_FAT -.WRB: POP BC - EX DE,HL - ; DEC BC -.WR2: - ; LD A,B - ; OR C - ; JR NZ,.loop - INC B - DEC BC - DJNZ .loop - - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - _SaveGetedCluster - ; - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - SUB E - LD C,A - CP B - JR C,.WR3 ;SIZE > RESIDUE CLUSTER - LD C,B ;SIZE < CLUSTER -.WR3: LD A,B - SUB C - LD B,A - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,.WR4 - INC HL - ; DOUBLE 1 -.WR4: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV - JR C,.ErrorWrite - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) - ; -.loop2: ADD HL,DE - DEC C - JR NZ,.loop2 - ; - LD (READ.PointerOnBuffer),HL - POP DE - ; - LD A,B - OR A - RET Z - ; -.big_loop: - LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,.WR7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -.WR7: EX DE,HL - PUSH BC - CALL READ_FROM_FAT - JR NC,.WR9 - PUSH HL - CALL INC_FAT - POP HL +; [ ] fat32 +BLOK_WR: PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + PUSH HL ; остаток DIV_for_SPC + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + PUSH BC ; младшее слово номера кластера + PUSH DE ; [x] fat32 старшее слово номера кластера + ; + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + LD A,L + OR H + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + OR L + OR H + JR NZ,.FindCluster + ; + PUSH BC ; младшее слово номера кластера + PUSH DE ; [x] fat32 старшее слово номера кластера + ; [ ] fat32 + CALL G_CLUST + JP C,.Error_6 + ; + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H + ; [ ] fat32 + EXX + LD HL,0 ;!FIXIT + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),L ; START CLUSTER High + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H + EXX + ; + LD DE,(FatBuffer.ENDCLUS_LOW) + CALL WRITE_TO_FAT + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;PUSH HL + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + ;POP HL + ; + POP DE ; младшее слово номера кластера + POP BC ; [x] fat32 старшее слово номера кластера + ; + INC B + INC D ; [x] fat32 + PUSH DE + JP .enter_loop + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.FindCluster: CALL GetSavedCluster + ;HL': HL - известный кластер файла для отсчёта + ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1) + ; + PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово) + JP .enter_loop + ; + ; [x] fat32 +.loop_big: PUSH BC + LD BC,0 +.loop: PUSH BC + CALL READ_FROM_FAT + JR NC,.next + ; end of chain - get new cluster + ; [ ] fat32 + PUSH HL + EXX + PUSH HL + EXX + CALL INC_FAT + EXX + POP HL + EXX + POP HL + JP C,.Error_6 + ; + CALL READ_FROM_FAT +.next: POP BC + EX DE,HL + EXX + EX DE,HL + EXX +.enter_loop: INC B + DEC BC + DJNZ .loop + POP BC ; [x] оставшееся смещение в файле в кластерах (старшее слово) + INC B + DEC BC + DJNZ .loop_big + ;;;; + ; + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP DE + POP BC + CALL SaveGotCluster + ; + POP DE + POP BC + ; (SP) = (RET) + ; + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + SUB E + LD C,A + CP B + JR C,.WR3 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +.WR3: LD A,B + SUB C + LD B,A + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.WR4 + INC HL + ; DOUBLE 1 +.WR4: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JR C,.ErrorWrite + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + ; +.loop2: ADD HL,DE + DEC C + JR NZ,.loop2 + ; + LD (READ.PointerOnBuffer),HL + POP DE + ; + LD A,B + OR A + RET Z + ; +.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.WR7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +.WR7: EX DE,HL + PUSH BC + CALL READ_FROM_FAT + JR NC,.WR9 + PUSH HL + CALL INC_FAT + POP HL JR C,.ErrorFull - CALL READ_FROM_FAT -.WR9: POP BC - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - ; DOUBLE 1 - LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV + CALL READ_FROM_FAT +.WR9: POP BC + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + ; DOUBLE 1 + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV JR C,.ErrorWrite - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) -.loop3: ADD HL,DE - DEC C - JR NZ,.loop3 - LD (READ.PointerOnBuffer),HL - POP DE - ; - JP .big_loop - ; -.Error: POP BC - POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -.ErrorWrite: - POP BC - POP DE - LD A,DSS_Error.sys.WRITE_ERROR - ;SCF - RET - ; -.ErrorFull: - POP BC - LD A,DSS_Error.sys.DISK_FULL - ;SCF - RET + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + ; + JP .big_loop + ; +.Error_6: POP BC + POP BC +.Error_4: POP BC + POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.ErrorWrite: POP BC + POP DE + LD A,DSS_Error.sys.WRITE_ERROR + ;SCF + RET + ; +.ErrorFull: POP BC + LD A,DSS_Error.sys.DISK_FULL + ;SCF + RET + +/* +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; Вход: HL - первый кластер файла (младшее слово) +; BC - смещение в файле в кластерах (младшее слово) +; Выход: HL - известный кластер файла для отсчёта (младшее слово) +; BC - оставшееся смещение в файле в кластерах (младшее слово) +GetSavedCluster: + INC B + ;PUSH DE ; первый кластер файла (старшее слово) + LD E,(IY+_sFM.KnownCluster_L) + LD D,(IY+_sFM.KnownCluster_L+1) + LD A,E + OR D + RET Z + ; + DEC B + PUSH DE ; KnownCluster_H + PUSH HL ; первый кластер файла (младшее слово) + PUSH BC ; смещение в файле в кластерах + LD E,(IY+_sFM.KnownOffset_L) + LD D,(IY+_sFM.KnownOffset_L+1) + LD A,D + OR E + JR Z,.noOptimization_3 + ; + POP HL ; смещение в файле в кластерах + SBC HL,DE + JR C,.noOptimization_2 + LD C,L + LD B,H + POP DE ; баланс стека + POP HL + ; оптимизация: HL - не первый кластер файла, а KnownCluster + ; BC - расстояние до требуемого смещения от KnownCluster + ; + INC B + RET + ; +.noOptimization_3: + POP BC +.noOptimization_2: + POP HL +.noOptimization_1: + POP DE + INC B + RET +*/ + +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; Вход: DE - смещение в файле в кластерах (старшее слово) +; BC - смещение в файле в кластерах (младшее слово) +; HL - первый кластер файла (младшее слово) +; HL' - первый кластер файла (старшее слово) +; Выход: HL - известный кластер файла для отсчёта (младшее слово) +; HL' - известный кластер файла для отсчёта (старшее слово) +; DE - оставшееся смещение в файле в кластерах (старшее слово, D=D+1) +; BC - оставшееся смещение в файле в кластерах (младшее слово, B=B+1) +; не портит HL, HL' и DE:BC если оптимизация не сработала +GetSavedCluster: + XOR A + CP (IY+_sFM.OptimizedClusters) + JR Z,.noOptimization_0 + ; + PUSH DE + PUSH HL ; первый кластер файла (младшее слово) + ; смещение в файле в кластерах + EX DE,HL + LD E,(IY+_sFM.KnownOffset_H) + LD D,(IY+_sFM.KnownOffset_H+1) + ; проверка старшего слова + AND A + SBC HL,DE + JR C,.noOptimization_2 + ; + PUSH BC + EX DE,HL + LD H,B + LD L,C + LD C,(IY+_sFM.KnownOffset_L) + LD B,(IY+_sFM.KnownOffset_L+1) + ; проверка младшего слова + SBC HL,BC + LD BC,0 + EX DE,HL + SBC HL,BC + JR C,.noOptimization_3 + EX DE,HL + LD B,H + LD C,L + ; DE:BC новое смещение от известного кластера файла (в кластерах) + ; + LD L,(IY+_sFM.KnownCluster_L) + LD H,(IY+_sFM.KnownCluster_L+1) + EXX + LD L,(IY+_sFM.KnownCluster_H) + LD H,(IY+_sFM.KnownCluster_H+1) + EXX + ; баланс стека + POP AF + POP AF + POP AF + ; для цикла DJNZ + INC B + INC D + RET + ; +.noOptimization_3: + POP BC +.noOptimization_2: + POP HL +.noOptimization_1: + POP DE +.noOptimization_0: + INC B + INC D + RET + +;[x] fat32 +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +SaveGotCluster: LD A,C + OR B + OR E + OR D + RET Z + ; + LD (IY+_sFM.KnownOffset_L),C + LD (IY+_sFM.KnownOffset_L+1),B + LD (IY+_sFM.KnownOffset_H),E + LD (IY+_sFM.KnownOffset_H+1),D + ; + LD (IY+_sFM.KnownCluster_L),L + LD (IY+_sFM.KnownCluster_L+1),H + EXX + LD (IY+_sFM.KnownCluster_H),L + LD (IY+_sFM.KnownCluster_H+1),H + EXX + ; + LD A,1 + LD (IY+_sFM.OptimizedClusters),A + RET //////////////////////////////////////////////////////////////////////// diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index e12fa42..2225fac 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -320,148 +320,29 @@ BC_Div_DE: ;----------------------------------------------------------------------; ; - -; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A ;----------------------------------------------------------------------; +; HL:DE / A => DE:BC, H=0, L - остаток DIV_for_SPC: - LD A,C + 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 + ; +.loop: SRL H + RR L + RR D + RR E RRCA JP NC,.loop LD A,B -; -.exit: LD XH,D - LD XL,E +.exit: LD B,D + LD C,E EX DE,HL LD H,0 LD L,A RET -;----------------------------------------------------------------------; - -; DIV32: LD A,#FF -; LD B,E -; .loop: SRL C -; JR C,.exitLoop -; SRL H : RR L : RR D : RR E : SLA A -; JP .loop -; .exitLoop: -; CPL -; AND B -; LD XH,D -; LD XL,E -; EX DE,HL -; LD H,0 -; LD L,A -; RET - -; DEFINE NEW_DIV 1 - -; DIV32: LD XH,D -; LD XL,E - -; IFN NEW_DIV -; EX DE,HL -; LD HL,0 -; LD A,#20 -; DIV001: ADD IX,IX -; EX DE,HL -; ADC HL,HL -; EX DE,HL -; ADC HL,HL -; SBC HL,BC -; JR NC,DIV002 -; ADD HL,BC -; DEC A -; JR NZ,DIV001 -; RET -; DIV002: INC IX -; DEC A -; JR NZ,DIV001 -; RET -; ELSE - - -; div32_16: -; ;HLIX/BC -> HLIX remainder DE -; ;174+4*div32_16_sub8 -; ;min: 2186cc -; ;max: 2794cc -; ;avg: 2466cc -; ;61 bytes -; ex de,hl ; 4 - -; ; Negate BC to allow add instead of sbc -; xor a ; 4 -; ; Need to set HL to 0 anyways, so save 2cc and a byte -; ld h,a ; 4 -; ld l,a ; 4 -; sub c ; 4 -; ld c,a ; 4 -; sbc a,a ; 4 -; sub b ; 4 -; ld b,a ; 4 - - -; ld a,d ; 4 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld d,a ; 4 - -; ld a,e ; 4 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld e,a ; 4 - -; ld a,ixh ; 8 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld ixh,a ; 8 - -; ld a,ixl ; 8 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld ixl,a ; 8 - -; ;ex de,hl ; 4 -; ret ; 10 - -; div32_16_sub8: -; ;119+8*div32_16_sub -; ;min: 503cc -; ;max: 655cc -; ;avg: 573cc -; call 1F -; 1: -; ;17+2(17+2(div32_16_sub))) -; call 1F -; 1: -; ;17+2(div32_16_sub) -; call div32_16_sub -; div32_16_sub: -; ;48+{8,0+{0,19}} -; ;min: 48cc -; ;max: 67cc -; ;avg: 56.75cc -; rla ; 4 -; adc hl,hl ; 15 -; jr c,1F ;12/7 -; add hl,bc ; 11 -; ret c ;11/5 -; sbc hl,bc ; 15 -; ret ; 10 -; 1: -; add hl,bc ; 11 -; scf ; 4 -; ret ; 10 - -; ENDIF -; \ No newline at end of file +;----------------------------------------------------------------------; \ No newline at end of file diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 403ee1d..3934e8c 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -45,12 +45,12 @@ .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: WORD #0000 ;+ #2B +43 Младшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: WORD #0000 ;+ #2C +44 Старшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: WORD #0000 ;+ #2D +45 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: WORD #0000 ;+ #2E +46 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. - ENDS +.OptimizedClusters BYTE #00 ;+ #2B +43 +.KnownCluster_L: WORD #0000 ;+ #2C +44 Младшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: WORD #0000 ;+ #2E +46 Старшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: WORD #0000 ;+ #30 +48 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: WORD #0000 ;+ #32 +50 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. + ENDS ; ; diff --git a/Shared_Includes b/Shared_Includes index 42dfec0..68681fb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 42dfec072030351eb386205ead32983bbc1c4909 +Subproject commit 68681fbc50da463f1debae860e6db64603886d39 From 1f66e8af2407753bc74f3c493c4b238028101f3a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 23 Mar 2024 04:07:31 +1000 Subject: [PATCH 099/219] READ_FAT_TABLE, GET_FAT32_CELL --- DSS/DSS-MAIN.ASM | 142 +++++++++++++++++---------------- DSS/FS/FAT/FAT.asm | 9 ++- DSS/FS/FAT/FAT12_16.asm | 173 ++++++++++++++++++++++++---------------- DSS/FS/FAT/FAT32.asm | 43 +++++++++- DSS/build.txt | 2 +- DSS/defines.inc | 35 ++++++++ 6 files changed, 261 insertions(+), 143 deletions(-) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 92ba73d..e251750 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -227,8 +227,6 @@ PORTAL.out_MAIN: ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; -; ;R01 ; Area for boot sector BootSector. @@ -236,61 +234,12 @@ PORTAL.out_MAIN: ; ; end boot sector ;R01 -; Первый старт системы, после инициализации адрес в таблице меняется на VERSION -F_START: DI - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - ;LD (.saveDRV),A - LD H,A - LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве - ; +; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; +; - ;R12 - LD C,BIOS.DRV_VERSION - RST ToBIOS - JR C,.err_oldBIOS - EX DE,HL - LD DE,MINIMUM_BIOS_VERSION - SBC HL,DE - JR NC,.good - LD A,(.saveDRV+1) - CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 - JR NC,.err_oldBIOS - LD HL,#C9AF ; XOR A : RET opcodes - LD (DRV_CONTENT + INITDVC.if_old),HL ;!!!!!! - ; - -.good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения - RET C ;R10 - CALL KEYBOARD_INIT - CALL PRINT_INIT - LD C,Dss.Mouse.Init - RST ToDSS.Mouse - LD A,(VMODE) - LD C,Dss.Mouse.SetVideoMode - RST ToDSS.Mouse - ;CALL INITDVC ;R05 - ;R05 - LD C,Dss.DRV.Init - RST ToDSS.DRV - LD (LDRIVE),A - ;R05 -.saveDRV+1: - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD HL,0 ; H - номер устройства, L - номер раздела на устройстве - ;LD A,H - ;LD A,0 - ; - LD B,1 - CALL BOOTDSK - RET C - ; - EI - ;Set new address fn. VERSION - LD HL,ADRST10 - LD (HL),low VERSION ;R03 - INC H - LD (HL),high VERSION ;R03 +; +CLEAR_BUFFER_AND_INIT_PROC: ;------[CLEAR BUFFERS]------; ;R07 ;R11 LD HL,CLEAR_ZONE.start @@ -304,7 +253,6 @@ F_START: DI LD (HL),'.' ;R11 ;---------------------------; - ;R02 ;LD B,#FF ;INIT ENVIRONMENT CALL INITENV @@ -313,18 +261,7 @@ F_START: DI ENDIF ;R02 JP VERSION - - ;R12 -.err_oldBIOS: - LD HL,.err_oldBIOS_message - ;LD C,Dss.PChars - ;RST ToDSS - CALL PCHARS - SCF - RET -.err_oldBIOS_message: - DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." - ; + ;R03 ;R07Allocate memory @@ -524,9 +461,76 @@ SECBUF EQU BUFFER ; - ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; ; !!!!! эта процедура затрётся после исполнения +; Первый старт системы, после инициализации адрес в таблице меняется на VERSION +F_START: DI + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;LD (.saveDRV),A + LD H,A + LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве + ; + + ;R12 + LD C,BIOS.DRV_VERSION + RST ToBIOS + JR C,.err_oldBIOS + EX DE,HL + LD DE,MINIMUM_BIOS_VERSION + SBC HL,DE + JR NC,.good + LD A,(.saveDRV+1) + CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 + JR NC,.err_oldBIOS + LD HL,#C9AF ; XOR A : RET opcodes + LD (DRV_CONTENT + INITDVC.if_old),HL ;!!!!!! + ; + +.good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения + RET C ;R10 + CALL KEYBOARD_INIT + CALL PRINT_INIT + LD C,Dss.Mouse.Init + RST ToDSS.Mouse + LD A,(VMODE) + LD C,Dss.Mouse.SetVideoMode + RST ToDSS.Mouse + ;CALL INITDVC ;R05 + ;R05 + LD C,Dss.DRV.Init + RST ToDSS.DRV + LD (LDRIVE),A + ;R05 +.saveDRV+1: + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD HL,0 ; H - номер устройства, L - номер раздела на устройстве + ;LD A,H + ;LD A,0 + ; + LD B,1 + CALL BOOTDSK + RET C + ; + EI + ;Set new address fn. VERSION + LD HL,ADRST10 + LD (HL),low VERSION ;R03 + INC H + LD (HL),high VERSION ;R03 + JP CLEAR_BUFFER_AND_INIT_PROC + ; + ;R12 +.err_oldBIOS: + LD HL,.err_oldBIOS_message + ;LD C,Dss.PChars + ;RST ToDSS + CALL PCHARS + SCF + RET +.err_oldBIOS_message: + DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." + ; + DEPLOY: ;Allocate memory LD BC,USING_MEMPAGES*256 + BIOS.GetMem RST ToBIOS diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index e882438..78187a5 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -526,8 +526,13 @@ RD_BPB: LD C,SLOT3 ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; ADD HL,DE ; - LD (FatBuffer.FAT1_SEC_L),HL ; first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; first sector FAT #2 + LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ;[ ] fat32 ;!FIXIT + LD DE,0 + LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 + LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 + ; ; LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 6b3f4a0..cdb6ce8 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -29,7 +29,7 @@ G_CLUST: ; [x] fat32 IF _FAT32_ENABLE LD A,(FatBuffer.FAT_TYPE) - XOR 32 + XOR FAT_TYPE.x32 CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER ENDIF ; @@ -73,22 +73,22 @@ INC_FAT: RET ;RX01 -;----------------------------------------------------------- +;------------------------------------------------------------------------------------------------ ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl - номер кластера (младшее слово) ; hl' - номера кластера (старшее слово. только для FAT32) ; выход: hl - номер кластера (младшее слово) ; hl' - номера кластера (старшее слово) -; de - номер след. кластера (младшее слово. если 0, то кластер hl свободен) -; de' - номер след. кластера (старшее слово. если 0, то кластер hl' свободен) +; de - номер след. кластера (младшее слово) +; de' - номер след. кластера (старшее слово) +; если DE':DE = 0, то кластер HL':HL свободен ; CF - конец цепочки -;!FIXIT далее заточка на то, что в DE всегда 0 - файл не больше 2Gb -;----------------------------------------------------------- -;[ ] fat32 +;------------------------------------------------------------------------------------------------ +;[x] fat32 ;!TEST READ_FROM_FAT: ;[x] fat32 LD A,(FatBuffer.FAT_TYPE) - XOR 32 + XOR FAT_TYPE.x32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера ; проверяем старшее слово номера кластера ; !FIXIT fat32 проверять оба слова FAT_Max_Cluster @@ -101,7 +101,7 @@ READ_FROM_FAT: EXX LD A,DSS_Error.sys.DISK_FULL RET C - JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - IX != 0, то кластер корректный + JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - hl' != 0, то кластер корректный ; ; проверяем младше слово номера кластера .low: EX DE,HL @@ -118,7 +118,7 @@ READ_FROM_FAT: PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYPE) - CP 16 ; fat16 + CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 ; fat16, просто читать след. номер @@ -127,11 +127,13 @@ READ_FROM_FAT: INC HL LD D,(HL) ; - POP AF + LD HL,SERVICE_SECTORS.FAT16 +.exit: POP AF OUT (SLOT3),A - LD HL,#FFEF ;!HARDCODE -.exit: XOR A ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR - SBC HL,DE ; проверка на служ. кластеры + ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR + XOR A + ; проверка на служ. кластеры + SBC HL,DE POP HL ; [x] fat32 EXX @@ -146,12 +148,8 @@ READ_FROM_FAT: LD E,(HL) INC HL LD D,(HL) - JR C,.Correct_1 - LD A,D - AND #0F - LD D,A - JR .Correct_2 - ; + LD HL,SERVICE_SECTORS.FAT12 + JR NC,.Correct_2 .Correct_1: LD A,E AND #F0 @@ -160,23 +158,60 @@ READ_FROM_FAT: RRA EDUP LD E,A -.Correct_2: - POP AF - OUT (SLOT3),A - LD HL,#0FEF JR .exit ; -.FAT32: ; [ ] fat32 +.Correct_2 + LD A,D + AND #0F + LD D,A + JR .exit + ; +.FAT32: ; [x] fat32 ;!TEST + EXX + PUSH HL + EXX + ; CALL GET_FAT32_CELL - DI - HALT + ; прочитать младшее слово номера кластера + 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 RET -;----------------------------------------------------------- +;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера -; вход: hl = номер кластера в который записать -; de = номер кластера который вписать +; вход: hl = младшее слово номера кластера в который записать +; hl' = старшее слово номера кластера в который записать (только для fat32) +; de = младшее слово номера кластера которое вписать +; de' = старшее слово номера кластера которое вписать (только для fat32) ; выход: такой же как и вход -;----------------------------------------------------------- +;------------------------------------------------------------------------------------------------ ; [ ] fat32 WRITE_TO_FAT: PUSH DE @@ -193,22 +228,22 @@ WRITE_TO_FAT: EXX PUSH HL PUSH AF + PUSH DE ; de = номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,1 ;LD (FatCache.Update),A ; LD A,(FatBuffer.FAT_TYPE) - CP 16 ; fat16 + CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 ; -.FAT16: PUSH DE - CALL GET_FAT16_CELL - POP DE +.FAT16: CALL GET_FAT16_CELL + POP DE ; de = номер кластера который вписать LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D - POP AF ; восст. порт +.exit: POP AF ; восст. порт POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD @@ -219,9 +254,8 @@ WRITE_TO_FAT: RET ; .FAT12: ;!FIXIT переделать на переменные FAT_CACHE - PUSH DE CALL GET_FAT12_CELL - POP DE + POP DE ; de = номер кластера который вписать JR C,.Correct_1 ; номер нечётный LD (HL),E INC HL @@ -229,15 +263,8 @@ WRITE_TO_FAT: AND #F0 OR D LD (HL),A - POP AF - POP HL - OUT (SLOT3),A - ; [x] 2/12/23 FAT не всегда мог записаться на HDD - XOR A - INC A - LD (FatCache.Update),A - ; CF = 0 - RET + JR .exit + ; .Correct_1: ; влево на 4 битa EX DE,HL @@ -267,15 +294,22 @@ WRITE_TO_FAT: ; CF = 0 RET .FAT32: ; [ ] fat32 + CALL GET_FAT32_CELL + POP DE ; de = номер кластера который вписать + LD (HL),E ; сохр. в кеше FAT-а + INC HL ; номер кластера + LD (HL),D + + DI HALT + + ;RE_FAT: ;RX01 ; Прочитать в кеш ХХ секторов FAT-а -; [ ] fat32 - //; A - NEW FAT BLOCK +; [ ] fat32 ;!TEST ; DE - NEW FAT BLOCK -; READ_FAT_TABLE: PUSH HL ; [x] fat32 @@ -297,24 +331,29 @@ READ_FAT_TABLE: EX DE,HL ; LD (FatCache.Block),HL - LD (FatCache.Update),A + ;LD (FatCache.Update),A ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT - DUP FAT_CACHE.Degree_16 + DUP FAT_CACHE.Degree ; 4 ADD HL,HL ;x2 EDUP LD DE,(FatBuffer.FAT1_SEC_L) + ; номер лог. сектора ADD HL,DE EX DE,HL - ; - LD XH,D - LD XL,E - ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора - ; - LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING - LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS + LD XH,D + LD XL,E + LD HL,(FatBuffer.FAT1_SEC_H) + LD DE,0 + ADC HL,DE + ; HL:IX - SECTOR FAT FOR READING + LD B,FAT_CACHE.Sectors_16 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.nxt + LD B,FAT_CACHE.Sectors_32 +.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска - LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE + LD C,Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE RST ToDSS.DRV POP HL RET @@ -333,13 +372,13 @@ WRITE_FAT_TABLE: ; ;LD H,0 ;FAT BLOCK * 16 = SECTOR OF FAT - DUP FAT_CACHE.Degree_16 + DUP FAT_CACHE.Degree ADD HL,HL ;x2 EDUP ; HL - номер лог. сектора LD B,H LD C,L ;BC - BLOCK OF FAT - LD DE,FAT_CACHE.Sectors + LD DE,FAT_CACHE.Sectors_16 ADD HL,DE ;+ SIZE CASH (16 SECTORS) LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT @@ -347,7 +386,7 @@ WRITE_FAT_TABLE: SBC HL,DE JR C,.WALLFAT EX DE,HL - LD HL,FAT_CACHE.Sectors + LD HL,FAT_CACHE.Sectors_16 ; CF = 0 SBC HL,DE JR C,.ERR @@ -499,7 +538,7 @@ GET_FAT12_CELL: PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; - IF FAT_CACHE.Size < #2000 + IF FAT_CACHE.Size_12 < #2000 ;!FIXIT оптимизировать LD A,H LD B,H @@ -1093,8 +1132,8 @@ SaveGotCluster: LD A,C FatCache: ;WORD #0000 -.Block WORD #0000 ;EQU FatCache -.Update BYTE 0 ;EQU FatCache+1 +.Block WORD #0000 +.Update BYTE 0 FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm index 054fcbd..34d5cdf 100644 --- a/DSS/FS/FAT/FAT32.asm +++ b/DSS/FS/FAT/FAT32.asm @@ -32,12 +32,47 @@ CHECK_INC_HIGH_CLUSTER: ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;----------------------------------------------------------------------- -;вход: DE:HL - номер кластера +;вход: HL':HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE +; +;[x] fat32 ;!TEST GET_FAT32_CELL: - ;[ ] fat32 - DI - HALT + ; двигаем влево 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_32 ; 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 ; сохраняем на случай, если READ_FAT_TABLE испортит + AND A + ; + EXX + EX DE,HL + LD HL,(FatCache.Block) ; 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 ; FOR 8192 bytes cache ; 1 073 741 824 bytes max fat32 size diff --git a/DSS/build.txt b/DSS/build.txt index cebfe35..b475567 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -946 \ No newline at end of file +945 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 4484ee0..2b165fe 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -21,6 +21,17 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE _FAT32_ENABLE 1 ;!TODO пока недоделано +SERVICE_SECTORS: +.FAT12 EQU #0FEF +.FAT16 EQU #FFEF +.FAT32.High EQU #0FFF +.FAT32.Low EQU #FFEF + +FAT_TYPE: +.x32 EQU 32 +.x16 EQU 16 +.x12 EQU 12 +/* define _bit (1 Date: Sun, 24 Mar 2024 04:53:25 +1000 Subject: [PATCH 100/219] =?UTF-8?q?=D0=B5=D1=89=D1=91=20=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BF=D1=80=D0=BE=D1=86?= =?UTF-8?q?=D0=B5=D0=B4=D1=83=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Delete.asm | 2 +- DSS/API/MkDir.asm | 3 +- DSS/API/RmDir.asm | 2 +- DSS/API/Write.asm | 2 +- DSS/API/diskINF.asm | 2 +- DSS/DSS-MAIN.ASM | 8 +- DSS/DSS_MACROSES.Z80 | 16 +- DSS/FS/FAT/FAT.asm | 78 +-- DSS/FS/FAT/FAT32.asm | 194 ------ DSS/FS/FAT/{FAT12_16.asm => FAT_X.asm} | 902 +++++++++++++------------ DSS/Media_drivers/ide-drv.asm | 205 +++--- DSS/Media_drivers/shared-drv.asm | 1 + DSS/build.txt | 2 +- DSS/defines.inc | 2 +- 14 files changed, 620 insertions(+), 799 deletions(-) delete mode 100644 DSS/FS/FAT/FAT32.asm rename DSS/FS/FAT/{FAT12_16.asm => FAT_X.asm} (66%) diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index a749150..cb8c85d 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -43,7 +43,7 @@ DEL_FN: ;!TEST PUSH DE ; номер след. кластера PUSH AF LD DE,#0000 ; номер кластера - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера POP AF POP DE JP NC,.loop diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 227c22f..c2382f8 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -48,7 +48,6 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 RET C PUSH HL ; [ ] fat32 - LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE @@ -142,7 +141,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LDIR ; POP HL - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 4463af8..e91ad9e 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -41,7 +41,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX .RMD17: PUSH HL - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 05e4434..163072e 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -18,7 +18,7 @@ WRITE.RD_ONLY: WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF - LD A,(FatCache.Update) + LD A,(FatBuffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index aa511ab..05ebab6 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -120,7 +120,7 @@ DISKINF:; [ ] 22/11/23 ;.FRESP2: LD D,B LD E,C - LD HL,(FAT_Max_Cluster_L) + LD HL,(FatBuffer.MaxClusterLow) DEC HL LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index e251750..4b3075b 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -357,6 +357,7 @@ ADRST10: ;DS 512 ;,0 INCLUDE "API.ASM" INCLUDE "DOS_Proc.asm" INCLUDE "FS/FAT/FAT.ASM" + INCLUDE "FS/FAT/FAT_X.ASM" INCLUDE "DOS_FM.ASM" INCLUDE "EXECUTE.ASM" @@ -461,8 +462,11 @@ SECBUF EQU BUFFER ; -;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; -; !!!!! эта процедура затрётся после исполнения +;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +; затрётся после инициализации +;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + + ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION F_START: DI ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 0c4f187..b495a90 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -134,17 +134,11 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ; MACRO SET_PAGE_X new_page - ; IF OLD_SET_BANK - ; LD A,new_page - ; CALL BANK - - ; ELSE - LD A,(BANKTBL+new_page) - LD B,A - LD C,SLOT3 - IN A,(SLOT3) - OUT (C),B - ; ENDIF + LD A,(BANKTBL+new_page) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B ENDM ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 78187a5..97ae971 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -359,7 +359,7 @@ LOADDIR: .LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(FatBuffer.DirSizeInSectros) + LD A,(FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 @@ -464,7 +464,7 @@ SAVEDIR: .SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) LD IX,(FatBuffer.RootDirFirstSector_L) - LD A,(FatBuffer.DirSizeInSectros) + LD A,(FatBuffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512 SUB B JR NC,.RTD1S @@ -576,7 +576,7 @@ RD_BPB: LD C,SLOT3 EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (FatBuffer.DirSizeInSectros),A + LD (FatBuffer.DirSizeInSectors),A ADD HL,BC ; Start DATA area LD (FatBuffer.FirstDataSector_L),HL ; B = 0 @@ -602,13 +602,13 @@ RD_BPB: LD C,SLOT3 JP Z,DOS_X_Error.UnknownBPB SBC HL,DE JR NC,.loop4 - LD (FatBuffer.ClusterPerBank),A ; A - Clusters per bank (16k) + LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) ; ;!TODO detect fat type by clusters! ;[ ] fat32 reset fat32 variables LD HL,0 LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FAT_Max_Cluster_H),HL + LD (FatBuffer.MaxClusterHigh),HL ; LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG @@ -627,34 +627,28 @@ RD_BPB: LD C,SLOT3 JR Z,.loop6 ; CP '1' - IF _FAT32_ENABLE - JP Z,.fat1x ;[ ] fat32 - CP '2' + JP Z,.fat1x + CP '3' JP NZ,DOS_X_Error.UnknownBPB LD A,#46 ; #46-#26 = 32 fat type LD HL,#0FFF LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FAT_Max_Cluster_H),HL - LD H,#FF + LD (FatBuffer.MaxClusterHigh),HL + LD H,L JR .BPB_FAT ; - ELSE - JP NZ,DOS_X_Error.UnknownBPB - ENDIF - ; .fat1x: LD A,(HL) - CP '6' ; FAT16 - LD HL,#FFFF - JR Z,.BPB_FAT - CP '2' ; FAT12 - JP NZ,DOS_X_Error.UnknownBPB + CP '2' ; FAT16 LD HL,#0FFF + JR Z,.BPB_FAT + CP '6' ; FAT12 + JP NZ,DOS_X_Error.UnknownBPB + LD H,L .BPB_FAT: SUB #26 ; A-#26 = fat type (12, 16, 32) LD (FatBuffer.FAT_TYPE),A LD (FatBuffer.ENDCLUS_LOW),HL - ;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// ; LD HL,0 @@ -694,13 +688,13 @@ RD_BPB: LD C,SLOT3 RR L JP .S4C01 .S4C02: INC HL - LD (FAT_Max_Cluster_L),HL + LD (FatBuffer.MaxClusterLow),HL ; XOR A LD H,A LD L,A - LD (FatCache.Block),HL - LD (FatCache.Update),A + LD (FatBuffer.CacheBlock),HL + LD (FatBuffer.CacheUpdated),A SET_PAGE_X FATPAGE @@ -722,13 +716,13 @@ RD_BPB: LD C,SLOT3 CP #F0 JR C,DOS_X_Error.UnknownBPB ; ID ram-диска - #FA - CP #F8 ; !FIXIT не обязательно если винт, то не FAT12 - LD A,'6' - LD HL,#FFFF - JP Z,.BPB_FAT - ; + CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 LD A,'2' LD HL,#0FFF + JP NZ,.BPB_FAT + ; + LD A,'6' + LD H,L JP .BPB_FAT ; DOS_X_Error: @@ -745,11 +739,14 @@ DOS_X_Error: ;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' -.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) -.BLOCK: DB #00 +.DRIVE: DB #FF +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 +.CacheBlock: DW #00 +.CacheUpdated: DB #00 +;.SectorsPerBank: DB #00 +.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? .RootDirStartCluster_L: DW #0000 .RootDirStartCluster_H: DW #0000 ; [ ] fat32 -.DRIVE: DB #FF .FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) .FAT1_SEC_H: DW #0000 ; [ ] fat32 .FAT2_SEC_L: DW #0000 @@ -757,20 +754,15 @@ FatBuffer: .RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR .FilesPerSector: DB #00 ; число файловых записей в секторе -.DirSizeInSectros: DB #00 ; DIR_SEC_SIZE +.DirSizeInSectors: DB #00 ; DIR_SEC_SIZE .FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low .FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ; [ ] fat32 .BytesPerCluster: DW #0000 ; CLUSTER_LEN -.ClusterPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 -.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? .ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 +.ENDCLUS_HIGH: DW #0FFF ; [ ] fat3 +.MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) +.MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) +;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? ; -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; - INCLUDE "FAT12_16.ASM" - IF _FAT32_ENABLE - INCLUDE "FAT32.ASM" - ENDIF -; \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm deleted file mode 100644 index 34d5cdf..0000000 --- a/DSS/FS/FAT/FAT32.asm +++ /dev/null @@ -1,194 +0,0 @@ -;!TODO fat32 -;======================================================================= -;BPB - ;LD (FatBuffer.FAT2_SEC_L),HL - ;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR -;BPB32 - ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта -;FAT Max Cluster - ;LD (FAT_Max_Cluster_L),HL -;======================================================================= - - -;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -; костыли - MODULE SET_FAT32 - -; ВХОД: HL - младшее слово номера кластера после инкремента -; ВЫХОД: HL - как и вход -; DE - старшее слово номера кластера после инкремента -CHECK_INC_HIGH_CLUSTER: - LD DE,(R_CLUST.FAT32) - ; - LD A,H - OR L - RET NZ - ; - INC DE - ; !FIXIT проверять переполнение? - RET - - ENDMODULE -;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -;----------------------------------------------------------------------- -;вход: HL':HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE -; -;[x] fat32 ;!TEST -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_32 ; 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 ; сохраняем на случай, если READ_FAT_TABLE испортит - AND A - ; - EXX - EX DE,HL - LD HL,(FatCache.Block) ; 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 - -; FOR 8192 bytes cache -; 1 073 741 824 bytes max fat32 size -; 1073741824/8192=131072 -; 0x40000000 / 0x2000 = 0x20000 - -; FOR 16384 bytes cache -; 1 073 741 824 bytes max fat32 size -; 1073741824/16384=65536 -; 0x40000000 / 0x4000 = 0x10000 - -/* - D E H L -0xEAB1022 - block 0x1D562 - D E H -0xEAB10 >>> 0x1D562 - [ ] fat32 доделать тут - LD A,H - LD B,H - AND #0F - ;AND FAT_CACHE.Size_Mask_16 ; #0F - LD H,A - LD A,B - ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) - ;DUP FAT_CACHE.Degree_16 - RRCA - RRCA - RRCA - RRCA - ;EDUP - AND #0F - ;AND FAT_CACHE.Part_Mask_16 - ; - ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH - CP C - CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT - RET -*/ -;----------------------------------------------------------------------- - -/* -; Прочитать в кеш 16 секторов FAT-а -; A - NEW FAT BLOCK -READ_FAT32: - PUSH HL - PUSH AF - LD A,(FatCache.Update) - OR A - CALL NZ,WRITE_FAT_TABLE.Start - POP AF - LD L,A - XOR A - LD H,A ;!FIXIT fat32 - LD (FatCache.Block),HL - LD (FatCache.Update),A - ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT - DUP FAT_CACHE.Degree_16 - ADD HL,HL ;x2 - EDUP - LD DE,(FatBuffer.FAT_FRM) - ADD HL,DE - EX DE,HL - ; - LD XH,D - LD XL,E - ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора - ; - LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32 - LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS - LD A,(FatBuffer.DRIVE) ; номер диска - LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE - RST ToDSS.DRV - POP HL - RET - -;вход: HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE -GET_FAT32_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.Block) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT - RET - - -R_F_F16: - CALL GET_FAT16_CELL - LD E,(HL) ; прочитать номер кластера - INC HL - LD D,(HL) - POP AF - OUT (SLOT3),A - ;!TODO #FFF7 - кластер с косякчными секторами - LD HL,#FFEF ;!HARDCODE - XOR A ; DssErr.sys.NO_ERROR - SBC HL,DE ; проверка на служ. кластеры - POP HL - RET -*/ -; \ No newline at end of file diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT_X.asm similarity index 66% rename from DSS/FS/FAT/FAT12_16.asm rename to DSS/FS/FAT/FAT_X.asm index cdb6ce8..7c5cd3d 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -14,35 +14,45 @@ ;--------------------------------------------------------------- ; Установить начальный кластер для чтения -; [ ] fat32 -R_CLUST: - LD HL,#0001 - LD (G_CLUST.num),HL - RET -.FAT32: WORD 0 +; [x] fat32 ;!TEST +R_CLUST: LD HL,#0001 + LD (G_CLUST.low),HL + DEC L + LD (G_CLUST.high),HL + RET -; найти первый свободный кластер -; [ ] fat32 -G_CLUST: -.num+1: LD HL,#0001 -.loop: INC HL ; номер кластера - ; [x] fat32 - IF _FAT32_ENABLE - LD A,(FatBuffer.FAT_TYPE) - XOR FAT_TYPE.x32 - CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER - ENDIF - ; - CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера - CP DSS_Error.sys.DISK_FULL - SCF - RET Z ; ошибка ? - LD A,D - OR E - JR NZ,.loop - LD (G_CLUST.num),HL - ; XOR A - RET + +; найти первый свободный кластер ;!TODO проверить перебор кластеров +; [x] fat32 ;!TEST +G_CLUST: ; +.low+1: LD HL,#0001 +.loop: INC HL ; номер кластера + LD A,L + OR H + ; [x] fat32 + EXX +.high+1: LD HL,0 + JR NZ,.no_inc + INC HL +.no_inc: EXX + ; + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера + CP DSS_Error.sys.DISK_FULL + SCF + RET Z ; ошибка ? + EXX + LD A,D + OR E + EXX + OR D + OR E + JR NZ,.loop + LD (G_CLUST.low),HL + EXX + LD (G_CLUST.high),HL + EXX + ; XOR A + RET ; HL - CLUSTER ; [ ] fat32 @@ -60,11 +70,10 @@ INC_FAT: ; JR NC,.loop ; не конец цепочки EX DE,HL ; POP DE ; номер кластера - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера ;!FIXIT <нет контроля ошибки> ; POP HL - LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск @@ -73,6 +82,35 @@ INC_FAT: RET ;RX01 + +; вход: de = младшее слово номера кластера для сравнения с FAT_Max_Cluster +; de' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) +; [x] fat32 ;!TEST +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 ; если FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный + ; проверяем младше слово номера кластера +.low: EX DE,HL + LD HL,(FatBuffer.MaxClusterLow) + ; CF = 0 + SBC HL,DE + EX DE,HL + LD A,DSS_Error.sys.DISK_FULL + RET + ; + ;------------------------------------------------------------------------------------------------ ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl - номер кластера (младшее слово) @@ -85,278 +123,263 @@ INC_FAT: ; CF - конец цепочки ;------------------------------------------------------------------------------------------------ ;[x] fat32 ;!TEST -READ_FROM_FAT: - ;[x] fat32 - LD A,(FatBuffer.FAT_TYPE) - XOR FAT_TYPE.x32 - JR NZ,.low ; Z=0 проверяем младшее слово номера кластера - ; проверяем старшее слово номера кластера - ; !FIXIT fat32 проверять оба слова FAT_Max_Cluster - EXX - EX DE,HL - LD HL,(FAT_Max_Cluster_H) - ; CF = 0 - SBC HL,DE - EX DE,HL - EXX - LD A,DSS_Error.sys.DISK_FULL - RET C - JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - hl' != 0, то кластер корректный - ; - ; проверяем младше слово номера кластера -.low: EX DE,HL - LD HL,(FAT_Max_Cluster_L) - ; CF = 0 - SBC HL,DE - EX DE,HL - LD A,DSS_Error.sys.DISK_FULL - RET C - ; -.correct_cluster: - SET_PAGE_X FATPAGE - ; - PUSH HL - PUSH AF - 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 - ; [x] 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: ; [x] fat32 ;!TEST - 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 - RET +READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER + RET C + ; + SET_PAGE_X FATPAGE + ; + PUSH HL + PUSH AF + 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 + 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 + RET ;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать ; hl' = старшее слово номера кластера в который записать (только для fat32) +; .Custom: ; de = младшее слово номера кластера которое вписать ; de' = старшее слово номера кластера которое вписать (только для fat32) ; выход: такой же как и вход ;------------------------------------------------------------------------------------------------ -; [ ] fat32 -WRITE_TO_FAT: - PUSH DE - EX DE,HL - LD HL,(FAT_Max_Cluster_L) - AND A - SBC HL,DE - EX DE,HL - POP DE - LD A,DSS_Error.sys.DISK_FULL - RET C - EXX - SET_PAGE_X FATPAGE - EXX - PUSH HL - PUSH AF - PUSH DE ; de = номер кластера который вписать - ; [x] 2/12/23 FAT не всегда мог записаться на HDD - ;LD A,1 - ;LD (FatCache.Update),A - ; - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x16 - JR C,.FAT12 - JR NZ,.FAT32 - ; -.FAT16: CALL GET_FAT16_CELL - POP DE ; de = номер кластера который вписать - LD (HL),E ; сохр. в кеше FAT-а - INC HL ; номер кластера - LD (HL),D -.exit: POP AF ; восст. порт - POP HL - OUT (SLOT3),A - ; [x] 2/12/23 FAT не всегда мог записаться на HDD - XOR A - INC A - LD (FatCache.Update),A - ; CF = 0 - RET - ; -.FAT12: ;!FIXIT переделать на переменные FAT_CACHE - CALL GET_FAT12_CELL - POP DE ; de = номер кластера который вписать - JR C,.Correct_1 ; номер нечётный - LD (HL),E - INC HL - LD A,(HL) - AND #F0 - OR D - LD (HL),A - JR .exit - ; -.Correct_1: - ; влево на 4 битa - EX DE,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - EX DE,HL - ; - LD A,(HL) - AND #0F - OR E - LD (HL),A ; сохр. в кеше FAT-а - INC HL ; номер кластера - LD (HL),D - POP AF - POP HL - OUT (SLOT3),A - ; [x] 2/12/23 FAT не всегда мог записаться на HDD - XOR A - INC A - LD (FatCache.Update),A - - ; LD A,1 - ; LD (FatCache.Update),A - ; AND A - ; CF = 0 - RET -.FAT32: ; [ ] fat32 - CALL GET_FAT32_CELL - POP DE ; de = номер кластера который вписать - LD (HL),E ; сохр. в кеше FAT-а - INC HL ; номер кластера - LD (HL),D +; [x] fat32 ;!TEST +WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера + EXX + LD DE,(FatBuffer.ENDCLUS_HIGH) ; номер кластера + EXX +.Custom: PUSH DE + EXX + PUSH DE + EXX + CALL CHECK_CLUSTER_IS_SMALLER + EXX + POP DE + EXX + POP DE + RET C + ; + EXX + SET_PAGE_X FATPAGE + EXX + PUSH HL + PUSH AF + PUSH DE ; младший номер кластера который вписать + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + ;LD A,1 + ;LD (FatBuffer.CacheUpdated),A + ; + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x16 + JR C,.FAT12 + JR NZ,.FAT32 + ; +.FAT16: CALL GET_FAT16_CELL + POP DE ; младший номер кластера который вписать + LD (HL),E ; сохр. в кеше FAT-а + INC HL ; номер кластера + LD (HL),D +.exit: POP AF ; восст. порт + POP HL + OUT (SLOT3),A + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + XOR A + INC A + LD (FatBuffer.CacheUpdated),A + ; CF = 0 + RET + ; +.FAT12: ;!FIXIT переделать на переменные FAT_CACHE + CALL GET_FAT12_CELL + POP DE ; младший номер кластера который вписать + JR C,.Correct_1 ; номер нечётный + LD (HL),E + INC HL + LD A,(HL) + AND #F0 + OR D + LD (HL),A + JR .exit + ; +.Correct_1: ; влево на 4 битa + EX DE,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + ; + LD A,(HL) + AND #0F + OR E + LD (HL),A ; сохр. в кеше FAT-а + INC HL ; номер кластера + LD (HL),D + JR .exit + ; +.FAT32: ; [x] fat32 ;!TEST + EXX + PUSH DE ; старший номер кластера который вписать + PUSH HL ; старшее слово номера кластера в который записать + EXX + CALL GET_FAT32_CELL + EXX + POP HL ; старшее слово номера кластера в который записать + EXX + POP DE ; старший номер кластера который вписать + POP BC ; младший номер кластера который вписать + ; сохр. в кеше FAT-а номер кластера + LD (HL),C + INC HL + LD (HL),B + INC HL + LD (HL),E + INC HL + LD (HL),D + JR .exit +;;;;;;;;; - DI - HALT + +;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT +; in: HL - Cache block +; out: C:HL - logical number +GET_SECTOR_OF_FAT: + XOR A + LD B,A + LD C,A + DUP FAT_CACHE.Degree ; 4 + ADD HL,HL ;x2 + ADC A,C + EDUP + LD C,A + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + RET NZ + ADD HL,HL ;x2 + RET NC + INC C + RET +;;;;;;;;; ;RE_FAT: ;RX01 ; Прочитать в кеш ХХ секторов FAT-а -; [ ] fat32 ;!TEST +; [x] fat32 ;!TEST ; DE - NEW FAT BLOCK -READ_FAT_TABLE: - PUSH HL - ; [x] fat32 - ; PUSH AF - PUSH DE - ; - LD A,(FatCache.Update) - OR A - CALL NZ,WRITE_FAT_TABLE.Start - ; [x] fat32 - ; POP AF - POP DE - ; +READ_FAT_TABLE: PUSH HL + PUSH DE + LD A,(FatBuffer.CacheUpdated) + OR A + CALL NZ,WRITE_FAT_TABLE.Start + POP DE + ; + EX DE,HL + LD (FatBuffer.CacheBlock),HL + ; + CALL GET_SECTOR_OF_FAT + ; + LD DE,(FatBuffer.FAT1_SEC_L) + ; BC:HL - номер лог. сектора + 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: ADD HL,BC + ; HL:IX - SECTOR FAT FOR READING + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE + JR NZ,.nxt + LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE +.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS + LD A,(FatBuffer.DRIVE) ; номер диска + RST ToDSS.DRV + POP HL + RET - ;[ ] fat32 - ; LD L,A - ; XOR A - ; LD H,A - EX DE,HL - ; - LD (FatCache.Block),HL - ;LD (FatCache.Update),A - ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT - DUP FAT_CACHE.Degree ; 4 - ADD HL,HL ;x2 - EDUP - LD DE,(FatBuffer.FAT1_SEC_L) - ; номер лог. сектора - ADD HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(FatBuffer.FAT1_SEC_H) - LD DE,0 - ADC HL,DE - ; HL:IX - SECTOR FAT FOR READING - LD B,FAT_CACHE.Sectors_16 - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR NZ,.nxt - LD B,FAT_CACHE.Sectors_32 -.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS - LD A,(FatBuffer.DRIVE) ; номер диска - LD C,Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE - RST ToDSS.DRV - POP HL - RET ; Подключить банку кеша FAT и записать его на диск ; [ ] fat32 @@ -368,34 +391,32 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD HL,(FatCache.Block) - ; - ;LD H,0 - ;FAT BLOCK * 16 = SECTOR OF FAT - DUP FAT_CACHE.Degree - ADD HL,HL ;x2 - EDUP - ; HL - номер лог. сектора +.Start: LD HL,(FatBuffer.CacheBlock) + ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT + CALL GET_SECTOR_OF_FAT + ; BC:HL - номер лог. сектора + ; [ ] fat32 ;!FIXIT LD B,H - LD C,L ;BC - BLOCK OF FAT + LD C,L + ; [ ] fat32 LD DE,FAT_CACHE.Sectors_16 - ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш + ADD HL,DE ;+ SIZE CASH (16 SECTORS) + LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT AND A SBC HL,DE JR C,.WALLFAT + ; EX DE,HL LD HL,FAT_CACHE.Sectors_16 ; CF = 0 SBC HL,DE - JR C,.ERR + JR C,.ERR ;!TODO проверить LD A,L -.WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? +.WALLFAT: LD H,B LD L,C - PUSH HL ; HL - номер лог. сектора - ; + PUSH HL LD DE,(FatBuffer.FAT1_SEC_L) LD B,A ; число секторов LD C,Dss.DRV.Write ; запись секторов @@ -416,7 +437,7 @@ WRITE_FAT_TABLE: AND A ;!TODO нет контроля ошибок .only_one_FAT: .ERR: LD A,0 - LD (FatCache.Update),A + LD (FatBuffer.CacheUpdated),A RET ; .SAVE_FAT_XX: @@ -438,66 +459,50 @@ WRITE_FAT_TABLE: LD DE,FATPAGE.cache ; откуда LD A,(FatBuffer.DRIVE) ; номер диска JP ToDSS.DRV -/* -.WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? - LD H,B - LD L,C - PUSH HL ; HL - номер лог. сектора + +;----------------------------------------------------------------------- +;вход: HL':HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +; +;[x] fat32 ;!TEST +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_32 ; 4 сдвига +.loop_block: + RLCA ; << H + RL L ; << L' + RL H ; << H' + DJNZ .loop_block + EXX + ; В итоге тут в HL' номер блока FAT ; - LD DE,(FatBuffer.FAT1_SEC_L) - ADD HL,DE + ; 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 IX,0 - ;ADD IX,DE - LD XH,D - LD XL,E - ; - LD HL,0 ; ст. разряд - ;HL:IX - SECTOR OF FAT FOR SAVE - LD DE,FATPAGE.cache ; откуда - LD B,A ; число секторов - LD C,Dss.DRV.Write ; запись секторов - LD A,(FatBuffer.DRIVE) ; номер диска - PUSH BC - RST ToDSS.DRV - ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 - LD DE,(FatBuffer.FAT2_SEC_L) - LD HL,(FatBuffer.FAT1_SEC_L) - AND A - SBC HL,DE - POP BC ; b=число секторов - POP HL - JR Z,.only_one_FAT - ; POP BC ; b=число секторов - ; POP HL - ; LD DE,(FatBuffer.FAT2_SEC_L) - ; - ADD HL,DE - EX DE,HL - LD XH,D - LD XL,E - ; - LD HL,0 - ; CF = ADD HL,DE - ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? - IF _FAT32_ENABLE - RL L - ENDIF - ; - LD DE,FATPAGE.cache - LD A,(FatBuffer.DRIVE) - LD C,Dss.DRV.Write - RST ToDSS.DRV - AND A ;!TODO нет контроля ошибок -.only_one_FAT: - ; -.ERR: LD A,0 - LD (FatCache.Update),A + 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 -*/ - - +;----------------------------------------------------------------------- ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT16_CELL: @@ -516,9 +521,9 @@ GET_FAT16_CELL: ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH + LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -526,7 +531,7 @@ GET_FAT16_CELL: LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET - +;----------------------------------------------------------------------- ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE ; CF - чётный/нечётный адрес кластера @@ -538,7 +543,7 @@ GET_FAT12_CELL: PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; - IF FAT_CACHE.Size_12 < #2000 + IF FAT_CACHE.Size_12 < #1800 ;!FIXIT оптимизировать LD A,H LD B,H @@ -559,9 +564,9 @@ GET_FAT12_CELL: ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH + LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -572,12 +577,20 @@ GET_FAT12_CELL: ADD HL,DE POP AF RET +;----------------------------------------------------------------------- -; in: DE:HL - CLUSTER -; out: HL:IX - SECTOR -NSECTOR:;[ ] fat32 - LD DE,(FAT_Max_Cluster_H) ; [ ] fat32 - заменить другой переменной + +;NSECTOR: +; in: HL':HL - CLUSTER +; out: HL:IX - SECTOR +;[ ] fat32 +CLUSTER_TO_SECTOR: + EXX + PUSH HL + EXX + POP DE + ; DE:HL - cluster DEC HL DEC HL LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) @@ -645,7 +658,7 @@ BLOCK_READ: PUSH BC ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1) ; PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово) - JP .enter_loop1 + JR .enter_loop1 ; .fast_exit_5: POP DE .fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE @@ -678,26 +691,26 @@ BLOCK_READ: PUSH BC ; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP DE - POP BC + POP BC ; B - Amount sectors CALL SaveGotCluster ; - POP DE ; остаток DIV_for_SPC - POP BC ; HL:DE - FP (in sectors) + POP DE ; D = 0, E = остаток DIV_for_SPC + POP BC ; B = Amount sectors ; (SP) = (RET) - ; + ; работа с остатком от деления LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) SUB E - LD C,A ;\ - CP B ; \ - JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ - LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться -.skip1: LD A,B ; / - SUB C ; / - LD B,A ;/ - PUSH HL + LD C,A + CP B + JR C,.skip1 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +.skip1: LD A,B + SUB C + LD B,A + PUSH HL ; номер кластера младшая часть PUSH BC PUSH DE - CALL NSECTOR + CALL CLUSTER_TO_SECTOR POP DE ADD IX,DE JR NC,.skip2 @@ -745,7 +758,7 @@ BLOCK_READ: PUSH BC EX DE,HL PUSH HL PUSH BC - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C @@ -826,7 +839,6 @@ BLOK_WR: PUSH BC LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H EXX ; - LD DE,(FatBuffer.ENDCLUS_LOW) CALL WRITE_TO_FAT ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;PUSH HL @@ -903,7 +915,7 @@ BLOK_WR: PUSH BC PUSH HL PUSH BC PUSH DE - CALL NSECTOR + CALL CLUSTER_TO_SECTOR POP DE ADD IX,DE JR NC,.WR4 @@ -954,7 +966,7 @@ BLOK_WR: PUSH BC EX DE,HL PUSH HL PUSH BC - CALL NSECTOR + CALL CLUSTER_TO_SECTOR ; DOUBLE 1 LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) @@ -988,53 +1000,53 @@ BLOK_WR: PUSH BC ;SCF RET -/* -;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -; Вход: HL - первый кластер файла (младшее слово) -; BC - смещение в файле в кластерах (младшее слово) -; Выход: HL - известный кластер файла для отсчёта (младшее слово) -; BC - оставшееся смещение в файле в кластерах (младшее слово) -GetSavedCluster: - INC B - ;PUSH DE ; первый кластер файла (старшее слово) - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_L+1) - LD A,E - OR D - RET Z - ; - DEC B - PUSH DE ; KnownCluster_H - PUSH HL ; первый кластер файла (младшее слово) - PUSH BC ; смещение в файле в кластерах - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_L+1) - LD A,D - OR E - JR Z,.noOptimization_3 - ; - POP HL ; смещение в файле в кластерах - SBC HL,DE - JR C,.noOptimization_2 - LD C,L - LD B,H - POP DE ; баланс стека - POP HL - ; оптимизация: HL - не первый кластер файла, а KnownCluster - ; BC - расстояние до требуемого смещения от KnownCluster - ; - INC B - RET - ; -.noOptimization_3: - POP BC -.noOptimization_2: - POP HL -.noOptimization_1: - POP DE - INC B - RET -*/ + +; ;GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; ; Вход: HL - первый кластер файла (младшее слово) +; ; BC - смещение в файле в кластерах (младшее слово) +; ; Выход: HL - известный кластер файла для отсчёта (младшее слово) +; ; BC - оставшееся смещение в файле в кластерах (младшее слово) +; GetSavedCluster: +; INC B +; ;PUSH DE ; первый кластер файла (старшее слово) +; LD E,(IY+_sFM.KnownCluster_L) +; LD D,(IY+_sFM.KnownCluster_L+1) +; LD A,E +; OR D +; RET Z +; ; +; DEC B +; PUSH DE ; KnownCluster_H +; PUSH HL ; первый кластер файла (младшее слово) +; PUSH BC ; смещение в файле в кластерах +; LD E,(IY+_sFM.KnownOffset_L) +; LD D,(IY+_sFM.KnownOffset_L+1) +; LD A,D +; OR E +; JR Z,.noOptimization_3 +; ; +; POP HL ; смещение в файле в кластерах +; SBC HL,DE +; JR C,.noOptimization_2 +; LD C,L +; LD B,H +; POP DE ; баланс стека +; POP HL +; ; оптимизация: HL - не первый кластер файла, а KnownCluster +; ; BC - расстояние до требуемого смещения от KnownCluster +; ; +; INC B +; RET +; ; +; .noOptimization_3: +; POP BC +; .noOptimization_2: +; POP HL +; .noOptimization_1: +; POP DE +; INC B +; RET + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ; Вход: DE - смещение в файле в кластерах (старшее слово) @@ -1131,11 +1143,23 @@ SaveGotCluster: LD A,C //////////////////////////////////////////////////////////////////////// -FatCache: ;WORD #0000 -.Block WORD #0000 -.Update BYTE 0 -FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) -FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) +;!TODO fat32 +;======================================================================= +;BPB + ;LD (FatBuffer.FAT2_SEC_L),HL + ;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR +;BPB32 + ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта +;FAT Max Cluster + ;LD (FatBuffer.MaxClusterLow),HL +;======================================================================= + + +;FatCache: +;.Block WORD #0000 +;.Update BYTE 0 +;FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) +;FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) ;//MODULE: FAT_X ;[END] @@ -1258,7 +1282,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ////////////// OLD //////////////// ; HL - CLUSTER ; HL:IX - SECTOR -; NSECTOR: DEC HL +; CLUSTER_TO_SECTOR: DEC HL ; DEC HL ; EX DE,HL ; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index b1f5015..08a538c 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -1,3 +1,4 @@ +;!TODO привести к общему виду в одну инструкцию, проверить корректность ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- @@ -7,167 +8,167 @@ ; ; Disk Driver Specification ver. 2.20 ;[]===========================================================[0] -;Procedure : Initialization +;Procedure: Initialization ; -;Function : Initialization device(s) +;Function: Initialization device(s) ; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver +;Input: C = #00 +; IX = Environment +; +;Output: A = Amount drive support ;[]===========================================================[0] ;[]===========================================================[1] -;Procedure : Open +;Procedure: Open ; -;Function : Open disk +;Function: Open disk ; -;Input : C = 01h -; A - Drive -;Output : None +;Input: C = #01 +; A = Drive ; +;Output: None ;[]===========================================================[1] ;[]===========================================================[2] -;Procedure : Close +;Procedure: Close ; -;Function : Close disk +;Function: Close disk ; -;Input : C = 02h -; A - Drive -;Output : None +;Input: C = #02 +; A = Drive ; +;Output: None ;[]===========================================================[2] ;[]===========================================================[3] -;Procedure : Media check +;Procedure: Media check ; -;Function : Checking change line +;Function: Checking change line ; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed +;Input: C = #03 +; A = Drive ; +;Output: A = #00 disk no changed +; #FF disk changed ;[]===========================================================[3] ;[]===========================================================[4] -;Procedure : Get BPB +;Procedure: Get BPB ; -;Function : Get Block Parameters BIOS +;Function: Get Block Parameters BIOS ; -;Input : C = 04h -; DE - Address -;Output : None +;Input: C = #04 +; A = Drive +; DE = Address ; +;Output: None ;[]===========================================================[4] ;[]===========================================================[5] -;Procedure : Input +;Procedure: Read ; -;Function : Input from disk +;Function: Read from disk ; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None +;Input: C = #05 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A = Drive ; +;Output: None ;[]===========================================================[5] ;[]===========================================================[6] -;Procedure : Output +;Procedure: Write ; -;Function : Output to disk +;Function: Write to disk ; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None +;Input: C = #06 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count ; +;Output: None ;[]===========================================================[6] ;[]===========================================================[7] -;Procedure : Removable +;Procedure: Removable ; -;Function : Checking change line +;Function: Checking change line ; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable +;Input: C = #07 +; A = Drive ; +;Output: A = #00 Removable +; A = #FF Non-removable ;[]===========================================================[7] ;[]===========================================================[8] -;Procedure : Generic IOCTL +;Procedure: Generic IOCTL ; -;Function : Generic Input Output Control +;Function: Generic Input Output Control ; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : +;Input: C = #08 +; B = Subcommand +; DE = #55AA Magic Number ; +;Subcommands: #00 - Get Device Parameters +; #01 - Read track +; #02 - Test track +; #80 - Set Device Parameters +; #81 - Write track +; #82 - Format track +;Output: ;[]===========================================================[8] ;[]===========================================================[9] -;Procedure : Read Long +;Procedure: Read Long ; -;Function : Reading sectors from disk +;Function: Reading sectors from disk ; -;Input : C = 0Ah -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address +;Input: C = #0A +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page ; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address ;[]===========================================================[9] ;[]===========================================================[10] -;Procedure : Write Long +;Procedure: Write Long ; -;Function : Writing sectors to disk +;Function: Writing sectors to disk ; -;Input : C = 0Bh -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address +;Input: C = #0B +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page ; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address ;[]===========================================================[10] ; ; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED +; 0 (#00) - NO ERRORS +; 1 (#01) - BAD COMMAND +; 2 (#02) - BAD DRIVE NUMBER +; 3 (#03) - UNKNOW FORMAT +; 4 (#04) - NOT READY +; 5 (#05) - SEEK ERROR +; 6 (#06) - SECTOR NOT FOUND +; 7 (#07) - CRC ERROR +; 8 (#08) - WRITE PROTECT +; 9 (#09) - READ ERROR +; 10 (#0A) - WRITE ERROR +; 11 (#0B) - FAILURE +; 12 (#0C) - BUSY (DEVICE OPENED) +; 13 (#0D) - RESERVED ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 @@ -286,7 +287,7 @@ SELHDD: PUSH DE ; LD L,A LOGDRV_ENTRY_FIND LOGDRV - ; + ; !HARDCODE LD C,(IY+1) LD B,(IY+2) LD E,(IY+3) @@ -431,14 +432,14 @@ CHEK_H: ;LD A,#FF RET -;HL:IX - SECTOR ; DE - ADDRESS +; A - DRIVE GBPB_H: PUSH IY PUSH DE LD L,A ; LOGDRV_ENTRY_FIND LOGDRV - ; + ; !HARDCODE LD E,(IY+1) LD D,(IY+2) LD L,(IY+3) @@ -469,7 +470,7 @@ LREADH: PUSH IY ; DE - ADDRESS ; B - COUNTER ; A'- PAGE -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;WRITE SECTOR LWRITEH: PUSH IY @@ -482,7 +483,7 @@ LWRITEH: ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;WRITE SECTOR WRITEH: PUSH IY CALL SELHDD @@ -494,7 +495,7 @@ WRITEH: PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;READ SECTOR READH: PUSH IY CALL SELHDD @@ -506,7 +507,7 @@ READH: PUSH IY ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER -; A - HDD NUMBER +#80 +; A - HDD LOG NUMBER ;CHECK SECTOR CHECKH: PUSH IY CALL SELHDD diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index af304f2..9ff323a 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -9,6 +9,7 @@ ; DISK DRIVER SPECIFICATION +; !FIXIT некорректная! ;--------------------------------------------- ; COMMAND 00h (INITIALIZATION) ; diff --git a/DSS/build.txt b/DSS/build.txt index b475567..0c8ddea 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -945 \ No newline at end of file +955 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 2b165fe..c9607c3 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -66,7 +66,7 @@ FAT_CACHE: ; for FAT32 .Size_32 EQU #4000 .Sectors_32 EQU .Size_32 / .Sector_Size ; #20 -.Degree_32 EQU .Degree +.Degree_32 EQU 5 .Size_Mask_32 EQU #0F .Part_Mask_32 EQU #0F .bytes_record_32 EQU 2 From 69829e359afde714935bed983b6274aabe77ba95 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 26 Mar 2024 04:45:27 +1000 Subject: [PATCH 101/219] =?UTF-8?q?=D0=B8=20=D0=B5=D1=89=D1=91=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/MkDir.asm | 71 ++++++++++++++++++++++------------ DSS/FS/FAT/FAT_X.asm | 92 ++++++++++++++++++++++++++++---------------- DSS/build.txt | 2 +- 3 files changed, 106 insertions(+), 59 deletions(-) diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index c2382f8..fe08e0d 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -46,8 +46,12 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; CALL G_CLUST RET C - PUSH HL - ; [ ] fat32 + ; [x] fat32 + PUSH HL ; младший номер сектора + EXX + PUSH HL ; старший номер сектора + EXX + ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE @@ -55,35 +59,50 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD BC,11 LDIR EX DE,HL - LD A,#10 ; атрибут записи каталога + LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога + ; _sFAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL - LD BC,#0A00 ; b=счетчик + LD BC,#0800 ; b=счетчик ; .loop1: LD (HL),C INC HL DJNZ .loop1 - ; - PUSH HL - CALL SYSTIME ; узнать тек. дату и время - CALL MK_TIME ; закодировать время/дату - POP HL - LD (HL),E ; de=время - INC HL - LD (HL),D - INC HL - LD (HL),C ; день - INC HL - LD (HL),B ; месяц - INC HL + ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H + ; [x] fat32 запись старшего номера кластера .FIRST_CLUSTER_H POP DE - PUSH DE + PUSH DE ; старший номер сектора LD (HL),E INC HL LD (HL),D INC HL + ; [ ] fat32 & VFAT + PUSH HL + CALL SYSTIME ; узнать тек. дату и время + CALL MK_TIME ; закодировать время/дату + POP HL + ; _sFAT_DIRECTORY_RECORD.TIME + LD (HL),E ; de=время + INC HL + LD (HL),D + INC HL + ; _sFAT_DIRECTORY_RECORD.DATE + LD (HL),C ; день + INC HL + LD (HL),B ; месяц + INC HL + ; запись младшего номера кластера .FIRST_CLUSTER_L + POP BC ; старший номер сектора + POP DE ; младший номер сектора + PUSH DE + PUSH BC + ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L + LD (HL),E + INC HL + LD (HL),D + INC HL + ; _sFAT_DIRECTORY_RECORD.F_SIZE LD BC,#0400 ; b=счетчик - ; .loop2: LD (HL),C INC HL DJNZ .loop2 @@ -97,9 +116,9 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 .loop3: INC HL LD (HL),C DJNZ .loop3 - ; + ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD INC HL - LD DE,HANDBUF+11 ; ячейка атрибутов файла + LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла EX DE,HL LD BC,21 LDIR @@ -118,16 +137,16 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; LD A,(DIRPAGE.buffer) CP "." - LD DE,DIRPAGE.buffer+11 ; атрибуты записи ;!HARDCODE + LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи JP Z,.MKD04 LD IX,HANDBUF XOR A - ; [ ] fat32 + ; [ ] fat32 разобраться LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .MKD04: EX DE,HL - LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT + LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 LDIR POP AF OUT (SLOT3),A @@ -140,7 +159,9 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD BC,512-65 ;!HARDCODE LDIR ; - POP HL + POP HL ; старший номер сектора + EXX + POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 7c5cd3d..81d28ea 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -22,8 +22,10 @@ R_CLUST: LD HL,#0001 RET +; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров -; [x] fat32 ;!TEST +; выход: HL - младший номер свободного кластера +; HL' - старший номер свободного кластера G_CLUST: ; .low+1: LD HL,#0001 .loop: INC HL ; номер кластера @@ -31,7 +33,7 @@ G_CLUST: ; OR H ; [x] fat32 EXX -.high+1: LD HL,0 +.high+1: LD HL,#0000 JR NZ,.no_inc INC HL .no_inc: EXX @@ -39,7 +41,8 @@ G_CLUST: ; CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF - RET Z ; ошибка ? + RET Z + ; EXX LD A,D OR E @@ -51,33 +54,54 @@ G_CLUST: ; EXX LD (G_CLUST.high),HL EXX - ; XOR A RET -; HL - CLUSTER -; [ ] fat32 +; Прикрепить к последнему кластеру цепочки новый пустой кластер +; Вход: HL':HL - номер кластера к которому прикрепить пустой +; Выход: HL':HL - номер кластера к которому прикрепился пустой +; DE':DE - номер пустого кластера +; [x] fat32 ;!TEST INC_FAT: - PUSH HL - CALL G_CLUST - POP DE - RET C + PUSH HL ; текущий кластер + EXX + PUSH HL ; текущий кластер + EXX + ; + CALL G_CLUST + ; + EXX + POP DE ; текущий кластер + EXX + POP DE ; текущий кластер + RET C + ; HL':HL - свободный кластер, DE':DE - текущий кластер ; - PUSH HL -; PUSH HL -; EX DE,HL ; hl=номер кластера -; .loop: CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера -; EX DE,HL -; JR NC,.loop ; не конец цепочки EX DE,HL -; POP DE ; номер кластера + EXX + EX DE,HL + EXX + ; CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера ;!FIXIT <нет контроля ошибки> ; - POP HL + PUSH HL + EX DE,HL + EXX + PUSH HL + EX DE,HL + EXX + ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ; + EXX + POP DE + EX DE,HL + EXX + POP DE + EX DE,HL + ; AND A RET ;RX01 @@ -216,10 +240,11 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать ; hl' = старшее слово номера кластера в который записать (только для fat32) -; .Custom: ; de = младшее слово номера кластера которое вписать ; de' = старшее слово номера кластера которое вписать (только для fat32) -; выход: такой же как и вход +; выход: HL':HL такие же как и на входе +; .Custom: +; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ ; [x] fat32 ;!TEST WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера @@ -270,7 +295,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; .FAT12: ;!FIXIT переделать на переменные FAT_CACHE CALL GET_FAT12_CELL POP DE ; младший номер кластера который вписать - JR C,.Correct_1 ; номер нечётный + JR C,.Correct_1 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -280,6 +305,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; JR .exit ; .Correct_1: ; влево на 4 битa + PUSH DE EX DE,HL ADD HL,HL ADD HL,HL @@ -293,6 +319,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; LD (HL),A ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D + POP DE JR .exit ; .FAT32: ; [x] fat32 ;!TEST @@ -619,7 +646,6 @@ CLUSTER_TO_SECTOR: ;LD E,A ; ADC HL,DE - ;!TODO а надо ли проверять переполнение HL:IX? RET //////////////////////////////////////////////////////////////////////// @@ -868,15 +894,15 @@ BLOK_WR: PUSH BC JR NC,.next ; end of chain - get new cluster ; [ ] fat32 - PUSH HL - EXX - PUSH HL - EXX + ; PUSH HL + ; EXX + ; PUSH HL + ; EXX CALL INC_FAT - EXX - POP HL - EXX - POP HL + ; EXX + ; POP HL + ; EXX + ; POP HL JP C,.Error_6 ; CALL READ_FROM_FAT @@ -957,11 +983,11 @@ BLOK_WR: PUSH BC PUSH BC CALL READ_FROM_FAT JR NC,.WR9 - PUSH HL + ;PUSH HL CALL INC_FAT - POP HL + ;POP HL JR C,.ErrorFull - CALL READ_FROM_FAT + ;CALL READ_FROM_FAT .WR9: POP BC EX DE,HL PUSH HL diff --git a/DSS/build.txt b/DSS/build.txt index 0c8ddea..5a30e5a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -955 \ No newline at end of file +947 \ No newline at end of file From 32a15477225620e480c88b8629e4d816a743dba9 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 27 Mar 2024 03:36:05 +1000 Subject: [PATCH 102/219] =?UTF-8?q?App=5FEXE=5FVersion=20-=20=D1=8D=D0=BA?= =?UTF-8?q?=D1=81=D0=BF=D0=B5=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D1=84=D0=B8=D1=88=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20Current=20Dir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 8 +- DSS/API.asm | 8 + DSS/API/AppInfo.asm | 101 +++ DSS/API/Ex_Path.asm | 240 ++++++ DSS/API/FreeMem.asm | 10 + DSS/API/GSwitch.asm | 31 + DSS/API/GetMem.asm | 20 + DSS/API/RetMem.asm | 27 + DSS/API/SetMem.asm | 72 ++ DSS/API/SetWin.asm | 96 +++ DSS/DRV-MAIN.ASM | 12 +- DSS/DSS-MAIN.ASM | 43 +- DSS/EXECUTE.ASM | 1727 ++++++++++++++----------------------------- DSS/defines.inc | 62 +- SHELL/SHELL.ASM | 3 +- Shared_Includes | 2 +- 16 files changed, 1249 insertions(+), 1213 deletions(-) create mode 100644 DSS/API/AppInfo.asm create mode 100644 DSS/API/Ex_Path.asm create mode 100644 DSS/API/FreeMem.asm create mode 100644 DSS/API/GSwitch.asm create mode 100644 DSS/API/GetMem.asm create mode 100644 DSS/API/RetMem.asm create mode 100644 DSS/API/SetMem.asm create mode 100644 DSS/API/SetWin.asm diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 535b497..690d745 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -144,6 +144,10 @@ MSG0: DB 0 MSGE DB 0 CONTINUE: + ;!TEST 26/03/2024 + LD SP,#C000 + ; + LD HL,0 LD (DISKL),HL LD (DISKH),HL @@ -160,7 +164,7 @@ CONTINUE: LD HL,(FCLUSTR) LD DE,#C000 - CALL FLOAD + CALL FLOAD ; загрузка DI XOR A OUT (SYS_PORT.OFF),A @@ -448,6 +452,7 @@ IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) LD HL,#0FFF JR BPB_FAT +; поиск system.dos GETROOT: LD HL,(DIR_FRH) LD IX,(DIR_FRL) LD BC,(DISKL) @@ -514,6 +519,7 @@ SEARCH2: LD A,(DE) ; HL - CLUSTER ; DE - ADDRESS +;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы FLOAD: LD (READMEM),DE LD_FILE: PUSH HL CALL NSECTOR diff --git a/DSS/API.asm b/DSS/API.asm index 10c7d9d..3f33c53 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -57,6 +57,14 @@ include 'API/DosName.asm' include 'API/Read.asm' include 'API/Write.asm' + include 'API/FreeMem.asm' + include 'API/GetMem.asm' + include 'API/RetMem.asm' + include 'API/SetMem.asm' + include 'API/SetWin.asm' + include 'API/AppInfo.asm' + include 'API/Ex_Path.asm' + include 'API/GSwitch.asm' include 'API/Environ.ASM' include 'API/Lib_Sub.asm' diff --git a/DSS/API/AppInfo.asm b/DSS/API/AppInfo.asm new file mode 100644 index 0000000..a783749 --- /dev/null +++ b/DSS/API/AppInfo.asm @@ -0,0 +1,101 @@ +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER + +////////////////////////////////////////////////////////////////////// +; !FIXIT тут одни затупы и дебилизм +; Функция #47. Получение информации приложения. +; +; вход: HL - буфер данных +; B - номер подфункции: +; B=0 - получение параметров командной строки +; B=1 - получение полного пути к каталогу программы +; B=2 - получение полного пути и имени файла программы +; выход: нет +; +; APPLICATION INFO +;==================== +; B = 0 - GET APP_PARAM +; B = 1 - GET APP_PATH +; B = 2 - GET APP_FULLNAME +////////////////////////////////////////////////////////////////////// +;LAST_PSP_PTR: DW 0 +APPINFO: INC B + ; + DJNZ .FN1 + ; получение параметров командной строки EX DE,HL + XOR A + LD (DE),A + LD HL,(.LAST_PSP_PTR) + LD C,(HL) + INC C + RET Z + INC HL + LDIR + AND A + RET + +.FN1: DJNZ .FN2 + ; получение полного пути к каталогу программы + EX DE,HL +.LAST_PSP_PTR+1: + LD HL,0 + LD C,(HL) + INC HL + ADD HL,BC + INC HL + INC HL + PUSH HL + LD BC,#100 ;!HARDCODE длина коммандной строки + XOR A + CPIR + DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога + DEC HL ;R10,5 - не тестил ;!!!!! + LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки + LD A,'\' + CPDR + INC HL + INC HL + POP BC + AND A + SBC HL,BC + ;R10 ;[x] могло всё в космос улететь + LD A,DSS_Error.sys.COMMON_ERROR + JR C,.error + ; + LD A,B ;EX HL,A,BC + LD B,H + LD H,A + LD A,C + LD C,L + LD L,A + LDIR + XOR A + LD (DE),A + RET + ; +.FN2: DJNZ .FN3 + ; получение полного пути и имени файла + EX DE,HL + LD HL,(.LAST_PSP_PTR) + LD C,(HL) + INC HL + ADD HL,BC + INC HL + INC HL + ; +.loop LD A,(HL) + LDI + OR A + JR NZ,.loop + ; + RET + ; +.FN3: + ; + ; ошибка + LD A,DSS_Error.sys.INVALID_FUNCTION +.error: SCF + RET +; \ No newline at end of file diff --git a/DSS/API/Ex_Path.asm b/DSS/API/Ex_Path.asm new file mode 100644 index 0000000..6545b4c --- /dev/null +++ b/DSS/API/Ex_Path.asm @@ -0,0 +1,240 @@ +////////////////////////////////////////////////////////////////////// +; Функция #45. Разбор командной строки. +; +; вход: HL - указатель командной строки +; DE - указатель на буфер пользователя +; B - номер подфункции: +; 0 - Разобрать строку +; 1 - Выделить имя диска +; 2 - Выделить директорию +; 3 - Выделить имя файла +; 4 - Выделить расширение файла +; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла +; 6 - Зарезервировано +; 7 - Выделить параметр командной строки +; 8 - Преобразовать из 11 символьного формата в формат ДОС +; 9 - Преобразовать из формата ДОС в 11 символьный формат +; выход: нет +////////////////////////////////////////////////////////////////////// +GLOB_PR EQU 7 ;%10000000 +DRIV_PR EQU 3 ;%00001000 +PATH_PR EQU 2 ;%00000100 +EXTN_PR EQU 1 ;%00000010 +NAM_PR EQU 0 ;%00000001 + +EX_PATH: EXX + LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер + LD (NM_PATH),HL + LD HL,NM_NAME_A + LD (NM_NAME),HL + LD HL,NM_EXTN_A + LD (NM_EXTN),HL + LD HL,NM_DRIVE_A + LD (NM_DRIVE),HL + EXX + INC B + DEC B + JR Z,.FULL ;0 ; разобрать строку + DEC B + JR Z,.GET_DRIVE ;1 ; выделить имя диска + DEC B + JR Z,.GET_PATH ;2 ; выделить директорию + DEC B + JR Z,.GET_NAME ;3 ; выделить имя файла + DEC B + JR Z,.GET_TYPE ;4 ; выделить расширение файла + DEC B + JR Z,.GET_ALL_EX ;5 ; выделить диск, путь, файл и расш. + DEC B + JR Z,.EX_RESR ;6 ; зарезервировано + DEC B + JP Z,GSWITCH ;7 ; выделить параметр ком-строки + DEC B + JP Z,GetName ;8 ; преобр. имя 11 -> 8.3 формат + DEC B + JP Z,MASK.custom ;9 ; преобр. имя 8.3 -> 11 формат +.EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET + ; Выделить имя диска +.GET_DRIVE: LD (NM_DRIVE),DE + CALL .FULL + RET C + LD DE,(NM_DRIVE) + LD A,(DE) + DEC A + CP #FF + RET Z + CP "A"-1 + JR C,.GD_error + CP "Z" + JR NC,.GD_error + SUB "A"-1 + RET + ; +.GD_error: LD A,DSS_Error.sys.INVALID_DRIVE + SCF + RET + + ; Выделить директорию +.GET_PATH: LD (NM_PATH),DE + JR .FULL + + ; Выделить имя файла +.GET_NAME: LD (NM_NAME),DE + JR .FULL + + ; Выделить расширение файла +.GET_TYPE: LD (NM_EXTN),DE + JR .FULL + ; Выделить диск, путь, файл и расш. +.GET_ALL_EX: EX DE,HL + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD (NM_DRIVE),BC + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD (NM_PATH),BC + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD (NM_NAME),BC + LD C,(HL) + INC HL + LD B,(HL) + LD (NM_EXTN),BC + EX DE,HL + ;JR EX_FULL + ; Разобрать строку +.FULL: EX AF,AF' + EXX + XOR A + LD HL,(NM_PATH) + LD (HL),A + LD HL,(NM_NAME) ; адрес буфера под имя файла + LD (HL),A + LD HL,(NM_EXTN) + LD (HL),A + LD HL,(NM_DRIVE) + LD (HL),A + EXX + EX AF,AF' +.PAT0: LD DE,TMPBUF + LD BC,#0D01 ;!HARDCODE счетчики +.PAT1: LD A,(HL) + CALL UPPER ; a..z -> A..Z + LD (DE),A + INC HL + INC DE + INC C ; ++счетчик + CP '\' + JR Z,.PATH_YEP + CP ":" + JR Z,.DRIVE_YEP + CP "!" + JR C,.NAME_YEP + CP "?" + JR Z,.GLOBP1 + CP "*" + JR Z,.GLOBP1 +.PAT2: DJNZ .PAT1 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET + ; +.GLOBP1: EX AF,AF' + SET GLOB_PR,A + EX AF,AF' + JR .PAT2 + ; +.NAME_YEP: LD A,2 + CP C + JR Z,.NOFNAME + PUSH HL + LD HL,TMPBUF + LD DE,(NM_NAME) ; адрес буфера под имя файла + LD B,0 + DEC C + DEC C + LD A,C + LDIR + LD C,A + XOR A + LD (DE),A + LD HL,(NM_NAME) + LD A,"." + CPIR + JR NZ,.NOEXTN + LD C,3 + LD DE,(NM_EXTN) +.EXTSK0: LD A,(HL) + OR A + JR NZ,.EXTSK1 + LD A,' ' + DEC HL +.EXTSK1: LD (DE),A + INC HL + INC DE + DEC C + JR NZ,.EXTSK0 + XOR A + LD (DE),A + EX AF,AF' + SET EXTN_PR,A ; указано расш. файла + EX AF,AF' +.NOEXTN: EX AF,AF' + SET NAM_PR,A ; указано имя файла + EX AF,AF' + POP HL +.NOFNAME: EX AF,AF' + AND A + RET + ; +.DRIVE_YEP: XOR A + LD (DE),A + PUSH HL + LD HL,TMPBUF + LD DE,(NM_DRIVE) + LD B,0 + LDIR + POP HL + EX AF,AF' + SET DRIV_PR,A ; указано имя диска + EX AF,AF' + JP .PAT0 + ; +.PATH_YEP: XOR A + LD (DE),A + PUSH HL + PUSH BC + LD HL,(NM_PATH) + LD BC,#00FF ; !FIXIT глубина буфера не зависит от CurrentDirectory.DEPTH + CPIR + DEC HL + EX DE,HL + LD HL,TMPBUF ; 12 пробелов + POP BC + LD B,0 + LDIR + POP HL + EX AF,AF' + SET PATH_PR,A + EX AF,AF' + JP .PAT0 +;!TODO перенести/заменить на общий +TMPBUF: DB " ",#00 ; 12 пробелов +NM_DRIVE: DW NM_DRIVE_A +NM_NAME: DW NM_NAME_A +NM_EXTN: DW NM_EXTN_A +NM_PATH: DW NM_PATH_A +NM_DRIVE_A: BLOCK 9,0 +NM_NAME_A: DB " ",#00 ; 12 пробелов +NM_EXTN_A: DB " ",0 +NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer + + diff --git a/DSS/API/FreeMem.asm b/DSS/API/FreeMem.asm new file mode 100644 index 0000000..0b8bf33 --- /dev/null +++ b/DSS/API/FreeMem.asm @@ -0,0 +1,10 @@ +////////////////////////////////////////////////////////////////////// +; Функция #3C. Информация о памяти. +; +; вход: нет +; выход: HL - общее кол-во страниц +; BC - кол-во своб. страниц +////////////////////////////////////////////////////////////////////// +FREEMEM: LD C,BIOS.GetMemSize + JP ToBIOS +; \ No newline at end of file diff --git a/DSS/API/GSwitch.asm b/DSS/API/GSwitch.asm new file mode 100644 index 0000000..0d5ce7b --- /dev/null +++ b/DSS/API/GSwitch.asm @@ -0,0 +1,31 @@ +////////////////////////////////////////////////////////////////////// +; Функция #43. Выделить параметр командной строки. +; +; вход: HL - указатель командной строки +; DE - буфер для выдел. параметра +; выход: HL - указатель на след. параметр ком-строки +; CF=0 - конец строки не достигнут (есть другие параметры) +; CF=1 - конец строки (в буфер перенесён последний параметр или ноль) +; +;ENTRY: HL - COMMAND LINE +; DE - SWITCH BUFFER +;EXIT: BUFFER +////////////////////////////////////////////////////////////////////// +GSWITCH: XOR A + LD (DE),A +.loop1: LD A,(HL) + INC HL + CP " " + RET C + JR Z,.loop1 +.loop2: LD (DE),A + LD A,(HL) + INC HL + INC DE + CP " "+1 + JR NC,.loop2 + CP " " + LD A,0 + LD (DE),A + RET +; \ No newline at end of file diff --git a/DSS/API/GetMem.asm b/DSS/API/GetMem.asm new file mode 100644 index 0000000..5052ee7 --- /dev/null +++ b/DSS/API/GetMem.asm @@ -0,0 +1,20 @@ +////////////////////////////////////////////////////////////////////// +; Функция #3D. Выделение блока памяти. +; +; вход: B - размер блока в страницах по 16kB +; выход: A - идентификатор блока памяти, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +GETMEM: LD C,BIOS.GetMem + RST ToBIOS + LD E,A + LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY + RET C + LD D,#00 + LD HL,MEMTAB ; массив списка выдел. страниц + ADD HL,DE + LD A,(TASK) ; уровень текущей программы + LD (HL),A + LD A,E + ;AND A + RET \ No newline at end of file diff --git a/DSS/API/RetMem.asm b/DSS/API/RetMem.asm new file mode 100644 index 0000000..fb5aab4 --- /dev/null +++ b/DSS/API/RetMem.asm @@ -0,0 +1,27 @@ +////////////////////////////////////////////////////////////////////// +; Функция #3E. Освобождение блока памяти. +; +; вход: A - идентификатор блока памяти +; выход: A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +RETMEM: LD E,A + LD D,#00 + LD HL,MEMTAB ; массив списка выдел. страниц + ADD HL,DE + LD A,(TASK) ; уровень текущей программы + CP (HL) + LD A,DSS_Error.sys.INVALID_MEMORY_HND + SCF + RET NZ + ;PUSH DE + LD A,E + LD C,BIOS.FreeMem + RST ToBIOS + ;POP DE + LD A,DSS_Error.sys.INVALID_MEMORY_HND + RET C + LD HL,MEMTAB + ADD HL,DE + XOR A + LD (HL),A + RET \ No newline at end of file diff --git a/DSS/API/SetMem.asm b/DSS/API/SetMem.asm new file mode 100644 index 0000000..edde33a --- /dev/null +++ b/DSS/API/SetMem.asm @@ -0,0 +1,72 @@ +////////////////////////////////////////////////////////////////////// +; Функция #3F. Изменение блока памяти. +; +; вход: A - идентификатор блока памяти +; B - новый размер блока +; выход: A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETMEM: LD E,A + LD D,#00 + LD HL,MEMTAB + ADD HL,DE + LD A,(TASK) + CP (HL) + LD A,DSS_Error.sys.INVALID_MEMORY_HND + SCF + RET NZ + LD D,B + PUSH DE + LD A,E + CALL .SIZEBLK + POP DE + LD A,DSS_Error.sys.INVALID_MEMORY_HND + RET C + LD A,B + CP D + RET Z + JR C,.INCMEM + ; DECMEM + LD B,D + LD A,E + LD C,BIOS.DivMemBlocks + RST ToBIOS + LD A,B + LD C,BIOS.FreeMem + RST ToBIOS + XOR A + RET + ; Добавить страниц памяти к блоку +.INCMEM: + LD A,D + SUB B + LD B,A + LD C,E + PUSH BC + LD C,BIOS.GetMem + RST ToBIOS + POP BC + LD B,A + LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY + RET C + LD A,C + LD C,BIOS.MergeMemBlocks + RST ToBIOS + XOR A + RET + ; +.SIZEBLK: + LD B,#FF + LD C,A +.loop: INC B + PUSH BC + LD A,C + LD C,BIOS.GetMemPage + RST ToBIOS + POP BC + JR NC,.loop + OR A + SCF + RET Z + XOR A + RET +; \ No newline at end of file diff --git a/DSS/API/SetWin.asm b/DSS/API/SetWin.asm new file mode 100644 index 0000000..c71c2a6 --- /dev/null +++ b/DSS/API/SetWin.asm @@ -0,0 +1,96 @@ +////////////////////////////////////////////////////////////////////// +; Функция #38. Подключение страницы памяти. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +; if B = 0FFh, then logical page number got from DE +////////////////////////////////////////////////////////////////////// +SETWIN: LD C,A + LD A,H + AND %1100'0000 + JR NZ,.no_error + OR %0100'0000 +.no_error: RRCA + OR %100'0010 + LD H,A ;SLOT number + LD A,C +.ALL: LD C,BIOS.GetMemPage + EX DE,HL + RST ToBIOS + EX DE,HL + RET C + LD C,H ;SLOT number + IN B,(C) + OUT (C),A + LD A,B + RET +; SETWIN: BIT 7,H ; if #8000 or high? +; JR Z,SETWIN1 ; no, go to open in SLOT1 +; BIT 6,H ; if #C000 or high? +; JR Z,SETWIN2 ; no, go to open in SLOT2 +; JR SETWIN3 ; yes, go to open in SLOT3 +////////////////////////////////////////////////////////////////////// +; Функция #39. Подключение страницы памяти в первое окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN1: LD H,SLOT1 + JR SETWIN.ALL + +; SETWIN1: LD C,BIOS.GetMemPage +; EX DE,HL +; RST ToBIOS +; EX DE,HL +; RET C +; LD C,SLOT1 +; IN B,(C) +; OUT (C),A +; LD A,B +; RET + +////////////////////////////////////////////////////////////////////// +; Функция #3A. Подключение страницы памяти во второе окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN2: LD H,SLOT2 + JR SETWIN.ALL +; SETWIN2 LD C,BIOS.GetMemPage +; EX DE,HL +; RST ToBIOS +; EX DE,HL +; RET C +; LD C,SLOT2 +; IN B,(C) +; OUT (C),A +; LD A,B +; RET +////////////////////////////////////////////////////////////////////// +; Функция #3B. Подключение страницы памяти в третье окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN3: LD H,SLOT3 + JR SETWIN.ALL +; SETWIN3: LD C,BIOS.GetMemPage +; EX DE,HL +; RST ToBIOS +; EX DE,HL +; RET C +; LD C,SLOT3 +; IN B,(C) +; OUT (C),A +; LD A,B +; RET \ No newline at end of file diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 54a491d..5736edb 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -367,12 +367,12 @@ RAMDTBL EQU LOGDRV + LOGDRV.Size ; ENDMODULE ////////////////////////////////////////////////////////////////////////; - DISPLAY "DEVICE start: ", /H, DEVICE - DISPLAY "Old DEVICE start: ", /H, OLD_TABLES.DEVICE - DISPLAY "LOGDRV start: ", /H, LOGDRV - DISPLAY "Old LOGDRV start: ", /H, OLD_TABLES.LOGDRV - DISPLAY "RAMDTBL start: ", /H, RAMDTBL - DISPLAY "Old RAMDTBL start: ", /H, OLD_TABLES.RAMDTBL + ;DISPLAY "DEVICE start: ", /H, DEVICE + ;DISPLAY "Old DEVICE start: ", /H, OLD_TABLES.DEVICE + ;DISPLAY "LOGDRV start: ", /H, LOGDRV + ;DISPLAY "Old LOGDRV start: ", /H, OLD_TABLES.LOGDRV + ;DISPLAY "RAMDTBL start: ", /H, RAMDTBL + ;DISPLAY "Old RAMDTBL start: ", /H, OLD_TABLES.RAMDTBL ; ;DRV_TEMP_BUFFER: diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 4b3075b..db660de 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -285,8 +285,10 @@ CLEAR_BUFFER_AND_INIT_PROC: ;R07 JP INIT2 ;R03 ; DS $/256+1*256-$,0 c:\bin\menu +;----------------------------------------------------------------------; +MEMTAB: BLOCK 256,0 +;----------------------------------------------------------------------; -MEMTAB BLOCK 256,0 _mInfoALIGN 256,0 ;------------------------------------------------------------------------------------------------------------------------; GO_ZERO EQU #0000 @@ -375,7 +377,7 @@ MASKARE: BLOCK 8,0 ; BLOCK 3,0 ; расш. BLOCK 21,0 ; 11+21=32 ; - DISPLAY "DOS-MAIN end address: ",/H,$-1 + DISPLAY "DOS-MAIN end address: ",/H,$-1 ; ;!TODO к буферам! @@ -386,6 +388,9 @@ CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце ; +; !TODO допилить WorkPath? +;WorkPath: DB 'X' +; DB ':' WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце @@ -411,12 +416,12 @@ SECBUF EQU BUFFER ;!TODO CLEAR_ZONE.size EQU _sBuffers ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" - DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector - DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector - DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF - DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector - DISPLAY "--- --- --- --- --- --- --- ---" + ;DISPLAY "--- --- --- --- --- --- --- ---" + ;DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector + ;DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector + ;DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF + ;DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + ;DISPLAY "--- --- --- --- --- --- --- ---" /* @@ -450,12 +455,12 @@ BUFFER EQU XSTACK+1 SECBUF EQU BUFFER ;R11 //////////////////////////////// */ - DISPLAY "FM_BUF addr: ",/H,CORE_BUFFERS.FM_BUF - DISPLAY "FM_BUF.Size: ",/H,CORE_BUFFERS.FM_BUF.Size - DISPLAY "FM_BUF.FullSize: ",/H,CORE_BUFFERS.FM_BUF.FullSize - DISPLAY "EXEBUFF: ",/H,CORE_BUFFERS.EXEBUFF - DISPLAY "XSTACK: ",/H,CORE_BUFFERS.XSTACK - DISPLAY "BUFFER: ",/H,CORE_BUFFERS.BUFFER + DISPLAY "FM_BUF addr: ",/H,CORE_BUFFERS.FM_BUF + DISPLAY "FM_BUF.Size: ",/H,CORE_BUFFERS.FM_BUF.Size + DISPLAY "FM_BUF.FullSize: ",/H,CORE_BUFFERS.FM_BUF.FullSize + DISPLAY "EXEBUFF: ",/H,CORE_BUFFERS.EXEBUFF + DISPLAY "XSTACK: ",/H,CORE_BUFFERS.XSTACK + DISPLAY "BUFFER: ",/H,CORE_BUFFERS.BUFFER ; ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < @@ -561,7 +566,7 @@ DEPLOY: ;Allocate memory OUT (SLOT3),A SET_PAGE_X DRVPAGE -\ + PUSH AF LD HL,DRV_CONTENT LD DE,#C000 @@ -583,17 +588,17 @@ DEPLOY: ;Allocate memory ; C_OSTYPE ;--- --- --- --- --- --- --- --- --- --- --- ---; - DISPLAY "DEPLOY end address: ",/H,$ + DISPLAY "DEPLOY end address: ",/H,$ ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; - DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." + DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." DRV_CONTENT: DISP 0 INCLUDE 'DRV-MAIN.ASM' ENT DRV_CONTENT.SIZE EQU $-DRV_CONTENT - DISPLAY " END ADDRESS: ",/H,$ - // ASSERT $<#4001,'-> Memory leack!!!'; + DISPLAY "END ADDRESS: ",/H,$ + ASSERT $<#4001,'-> Memory leack!!!'; ;[END] ; diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 61320d6..3daa2b6 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -3,12 +3,11 @@ ;//MODULE: EXECUTE ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- +;------------------------------------------------------------------------------------------------------------------------- ;Rev Date Name Description -;--------------------------------------------------------------- -//;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 +;------------------------------------------------------------------------------------------------------------------------- +;R12 20-07-2023 BAO При завершении приложения "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE -;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R09 -- 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR ;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR ;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH @@ -18,530 +17,574 @@ ;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC ;R02 24-05-1999 DNS FIX CREATE PSP AND ; MOVE EXEC STACK -;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE -;--------------------------------------------------------------- +; 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE +;------------------------------------------------------------------------------------------------------------------------- +RELATIVE_DIR EQU 0 +ABSOLUTE_DIR EQU 1 - MACRO _mINCTASK - LD HL,TASK ;R08 - INC (HL) ;R08 - ENDM - ; - MACRO _mDECTASK - LD HL,TASK ;R08 - DEC (HL) ;R08 - ENDM - -////////////////////////////////////////////////////////////////////// -; !FIXIT тут одни затупы и дебилизм -; Функция #47. Получение информации приложения. + MACRO _mINCTASK + LD HL,TASK ;R08 + INC (HL) ;R08 + ENDM ; -; вход: HL - буфер данных -; B - номер подфункции: -; B=0 - получение параметров командной строки -; B=1 - получение полного пути к каталогу программы -; B=2 - получение полного пути и имени файла программы -; выход: нет + MACRO _mDECTASK + LD HL,TASK ;R08 + DEC (HL) ;R08 + ENDM +;------------------------------------------------------------------------------------------------------------------------- + +;;; +;TMP_CURDIR_AUTO EQU #FB00 +; не нужно если SAVE_PATH_MACRO = 1 +; TMP_CURDIR EQU #FD00 + + +;/////////////////////////////////////////////////////////////////////// +; Функция #40. Выполнить файл. ; -; APPLICATION INFO -;==================== -; B = 0 - GET APP_PARAM -; B = 1 - GET APP_PATH -; B = 2 - GET APP_FULLNAME -////////////////////////////////////////////////////////////////////// -;LAST_PSP_PTR: DW 0 -APPINFO: INC B - ; - DJNZ .FN1 - ; получение параметров командной строки EX DE,HL - XOR A - LD (DE),A - LD HL,(.LAST_PSP_PTR) - LD C,(HL) - INC C - RET Z - INC HL - LDIR - AND A - RET - -.FN1: DJNZ .FN2 - ; получение полного пути к каталогу программы - EX DE,HL -.LAST_PSP_PTR+1: - LD HL,0 - LD C,(HL) - INC HL - ADD HL,BC - INC HL - INC HL - PUSH HL - LD BC,#100 ;!HARDCODE длина коммандной строки - XOR A - CPIR - DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога - DEC HL ;R10,5 - не тестил ;!!!!! - LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки - LD A,'\' - CPDR - INC HL - INC HL - POP BC - AND A - SBC HL,BC - ;R10 ;[x] могло всё в космос улететь - LD A,DSS_Error.sys.COMMON_ERROR - JR C,.error - ; - LD A,B ;EX HL,A,BC - LD B,H - LD H,A - LD A,C - LD C,L - LD L,A - LDIR - XOR A - LD (DE),A - RET - ; -.FN2: DJNZ .FN3 - ; получение полного пути и имени файла - EX DE,HL - LD HL,(.LAST_PSP_PTR) - LD C,(HL) - INC HL - ADD HL,BC - INC HL - INC HL - ; -.loop LD A,(HL) - LDI - OR A - JR NZ,.loop - ; - RET - ; -.FN3: - ; - ; ошибка - LD A,DSS_Error.sys.INVALID_FUNCTION -.error: SCF - RET - -////////////////////////////////////////////////////////////////////// -; Функция #45. Разбор командной строки. +; вход: HL - указатель на имя файла +; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) +; B=1 - загрузить и выполнить программу с полным путём до программы +; выход: A - код завершения, если CF=0 +; код ошибки, если CF=1 +;--------------------------------------------------------------------- +; Загрузить и выполнить программу. +; функ. #40, B=0. ; -; вход: HL - указатель командной строки -; DE - указатель на буфер пользователя -; B - номер подфункции: -; 0 - Разобрать строку -; 1 - Выделить имя диска -; 2 - Выделить директорию -; 3 - Выделить имя файла -; 4 - Выделить расширение файла -; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла -; 6 - Зарезервировано -; 7 - Выделить параметр командной строки -; 8 - Преобразовать из 11 символьного формата в формат ДОС -; 9 - Преобразовать из формата ДОС в 11 символьный формат -; выход: нет -////////////////////////////////////////////////////////////////////// -GLOB_PR EQU 7 ;%10000000 -DRIV_PR EQU 3 ;%00001000 -PATH_PR EQU 2 ;%00000100 -EXTN_PR EQU 1 ;%00000010 -NAM_PR EQU 0 ;%00000001 - -EX_PATH: - EXX - LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер - LD (NM_PATH),HL - LD HL,NM_NAME_A - LD (NM_NAME),HL - LD HL,NM_EXTN_A - LD (NM_EXTN),HL - LD HL,NM_DRIVE_A - LD (NM_DRIVE),HL - EXX - INC B - DEC B - JR Z,EX_FULL ;0 ; разобрать строку - DEC B - JR Z,EX_GET_DRIVE ;1 ; выделить имя диска - DEC B - JR Z,EX_GET_PATH ;2 ; выделить директорию - DEC B - JR Z,EX_GET_NAME ;3 ; выделить имя файла - DEC B - JR Z,EX_GET_TYPE ;4 ; выделить расширение файла - DEC B - JR Z,EX_GET_ALL_EX ;5 ; выделить диск, путь, файл и расш. - DEC B - JR Z,EX_RESR ;6 ; зарезервировано - DEC B - JP Z,GSWITCH ;7 ; выделить параметр ком-строки - DEC B - JP Z,GetName ;8 ; преобр. имя 11 -> 8.3 формат - DEC B - JP Z,MASK.custom ;9 ; преобр. имя 8.3 -> 11 формат -EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET - -; Выделить имя диска -EX_GET_DRIVE: - LD (NM_DRIVE),DE - CALL EX_FULL - RET C - LD DE,(NM_DRIVE) - LD A,(DE) - DEC A - CP #FF - RET Z - CP "A"-1 - JR C,ERGD001 - CP "Z" - JR NC,ERGD001 - SUB "A"-1 - RET -ERGD001 LD A,DSS_Error.sys.INVALID_DRIVE - SCF - RET - -; Выделить директорию -EX_GET_PATH - LD (NM_PATH),DE - JR EX_FULL - -; Выделить имя файла -EX_GET_NAME - LD (NM_NAME),DE - JR EX_FULL - -; Выделить расширение файла -EX_GET_TYPE - LD (NM_EXTN),DE - JR EX_FULL - -; Выделить диск, путь, файл и расш. -EX_GET_ALL_EX: - EX DE,HL - LD C,(HL) - INC HL - LD B,(HL) - INC HL - LD (NM_DRIVE),BC - LD C,(HL) - INC HL - LD B,(HL) - INC HL - LD (NM_PATH),BC - LD C,(HL) - INC HL - LD B,(HL) - INC HL - LD (NM_NAME),BC - LD C,(HL) - INC HL - LD B,(HL) - LD (NM_EXTN),BC - EX DE,HL - ;JR EX_FULL - ; Разобрать строку -EX_FULL: EX AF,AF' - EXX - XOR A - LD HL,(NM_PATH) - LD (HL),A - LD HL,(NM_NAME) ; адрес буфера под имя файла - LD (HL),A - LD HL,(NM_EXTN) - LD (HL),A - LD HL,(NM_DRIVE) - LD (HL),A - EXX - EX AF,AF' -EX_PAT0: LD DE,TMPBUF - LD BC,#0D01 ;!HARDCODE счетчики -EX_PAT1: LD A,(HL) - CALL UPPER ; a..z -> A..Z - LD (DE),A - INC HL - INC DE - INC C ; ++счетчик - CP '\' - JR Z,PATH_YEP - CP ":" - JR Z,DRIVE_YEP - CP "!" - JR C,NAME_YEP - CP "?" - JR Z,GLOBP1 - CP "*" - JR Z,GLOBP1 -EX_PAT2: DJNZ EX_PAT1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -GLOBP1: EX AF,AF' - SET GLOB_PR,A - EX AF,AF' - JR EX_PAT2 - -NAME_YEP: LD A,2 - CP C - JR Z,NOFNAME - PUSH HL - LD HL,TMPBUF - LD DE,(NM_NAME) ; адрес буфера под имя файла - LD B,0 - DEC C - DEC C - LD A,C - LDIR - LD C,A - XOR A - LD (DE),A - LD HL,(NM_NAME) - LD A,"." - CPIR - JR NZ,NOEXTN - LD C,3 - LD DE,(NM_EXTN) -EXTSK0: LD A,(HL) - OR A - JR NZ,EXTSK1 - LD A,' ' - DEC HL -EXTSK1: LD (DE),A - INC HL - INC DE - DEC C - JR NZ,EXTSK0 - XOR A - LD (DE),A - EX AF,AF' - SET EXTN_PR,A ; указано расш. файла - EX AF,AF' -NOEXTN: EX AF,AF' - SET NAM_PR,A ; указано имя файла - EX AF,AF' - POP HL -NOFNAME: EX AF,AF' - AND A - RET - - -DRIVE_YEP: XOR A - LD (DE),A - PUSH HL - LD HL,TMPBUF - LD DE,(NM_DRIVE) - LD B,0 - LDIR - POP HL - EX AF,AF' - SET DRIV_PR,A ; указано имя диска - EX AF,AF' - JP EX_PAT0 - -PATH_YEP: XOR A - LD (DE),A - PUSH HL - PUSH BC - LD HL,(NM_PATH) - LD BC,#00FF ; !FIXIT глубина буфера не зависит от CurrentDirectory.DEPTH - CPIR - DEC HL - EX DE,HL - LD HL,TMPBUF ; 12 пробелов - POP BC - LD B,0 - LDIR - POP HL - EX AF,AF' - SET PATH_PR,A - EX AF,AF' - JP EX_PAT0 - -TMPBUF: DB " ",#00 ; 12 пробелов - -NM_DRIVE: DW NM_DRIVE_A -NM_NAME: DW NM_NAME_A -NM_EXTN: DW NM_EXTN_A -NM_PATH: DW NM_PATH_A - -NM_DRIVE_A: BLOCK 9,0 - -NM_NAME_A: DB " ",#00 - -NM_EXTN_A: DB " ",0 - -NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer - - -////////////////////////////////////////////////////////////////////// -; Функция #43. Выделить параметр командной строки. +; 1) Открывает exe-файл на чтение; +; 2) Считывает в рабочую область префикс exe-файла; +; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного +; загрузчика, если его размер не равен нулю; +; 4) Сохраняет стек; +; 5) Подключает страницы из выделенного блока; +; 6) Строит префикс запуска программы и устанавливает на него регистр IX; +; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения +; кода в памяти); +; 8) Закрывает exe-файл, если это не первичный загрузчик; +; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека); +; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); ; -; вход: HL - указатель командной строки -; DE - буфер для выдел. параметра -; выход: HL - указатель на след. параметр ком-строки -; CF=0 - конец строки не достигнут (есть другие параметры) -; CF=1 - конец строки (в буфер перенесён последний параметр или ноль) +; Префикс запуска файла: ; -;ENTRY: HL - COMMAND LINE -; DE - SWITCH BUFFER -;EXIT: BUFFER -////////////////////////////////////////////////////////////////////// -GSWITCH: XOR A - LD (DE),A -GSWIT1: LD A,(HL) - INC HL - CP " " - RET C - JR Z,GSWIT1 -GSWIT2: LD (DE),A - LD A,(HL) - INC HL - INC DE - CP " "+1 - JR NC,GSWIT2 - CP " " - LD A,0 - LD (DE),A - RET +; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком +; -02 1 db ? ; Идентификатор блока памяти +; -01 1 db ? ; Уровень текущей программы +; +00 1 db ? ; Длина ком-строки +; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем +;/////////////////////////////////////////////////////////////////////// +EXEC: LD (CMDLINE),HL + INC B ;R03 + DEC B ;R03 + JR Z,.VAR_1 ;R03 + DEC B ;R03 + JR Z,.VAR_2 ;R03 + LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 + SCF ;R03 + RET ;R03 + ; +.VAR_1: ;LD (CMDLINE),HL + CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME + ;LD HL,(CMDLINE) + JR C,EXEC0_SHORT +.VAR_2: CALL EXEC_1 + ;LD A,DSS_Error.sys.FILE_NOT_FOUND + SCF + RET ; File not found - exit -////////////////////////////////////////////////////////////////////// -; Функция #3C. Информация о памяти. + ; при выходе с ошибкой, в регистре А - код ошибки +EXEC_1: ;LD (CMDLINE),HL + LD HL,(CMDLINE) + LD A,FAT_ATTR.READ_ONLY + LD (OPEN_FN.TMP),A + CALL GETWORD + RET C + ; LD HL,TMPNAME + ; LD DE,MASKARE + CALL MASK + RET C + CALL TST_EXT + ;LD A,DSS_Error.sys.FILE_NOT_FOUND + RET C + _mINCTASK ;R08 + CALL OPEN_FN.FILE + JR C,.Error + POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру + JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM +.Error: _mDECTASK ;R08 + AND A + RET + ;JR NC,.noError + ;_mDECTASK ;R08 + ;AND A + ;RET + ; +;.noError: + ;POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру + ;JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM + ; + ;SHORT NAME + ;TRY TO FIND IN CURRENT DIRECTORY +EXEC0_SHORT: CALL EXEC_1 + RET C + ;FILE NOT FOUND, SEARCHING IN PATH + ; GET PATH AND ETC. + LD HL,ENVPATH + LD DE,ENVPAGE.ENVTEMP + LD B,high Dss.Environ.Get + CALL ENVIRON + LD HL,(CMDLINE) + LD DE,CORE_BUFFERS.EXEBUFF +COPYEXN: LD A,(HL) + LDI + OR A + JR NZ,COPYEXN + + CALL FINDPATH + ;[x] 1/10/2023 + LD A,DSS_Error.sys.FILE_NOT_FOUND + RET C + ; + LD HL,(CMDLINE) + JR EXEC.VAR_2 + ; +EXEC02: LD (EXE_FM),A + LD HL,CORE_BUFFERS.EXEBUFF + LD DE,#0080 ;!#0200(512) ;R02 + LD A,(EXE_FM) + CALL READ + JP C,ERREXE + LD IX,CORE_BUFFERS.EXEBUFF + LD HL,(CORE_BUFFERS.EXEBUFF.EXE_EXT) + LD DE,'E'+'X'*256 + ;AND A - не нужно, если бы был CF=1, то чуть выше мы бы ушли на JP C,ERREXE + SBC HL,DE + LD A,DSS_Error.sys.INVALID_EXE + SCF + JP NZ,ERREXE + ;!TEST + ;LD A,(CORE_BUFFERS.EXEBUFF.VERSION) + ;OR A + ;LD A,DSS_Error.sys.UNKNOWN_EXE + ;SCF + ;JP NZ,ERREXE + LD A,MINIMUM_EXE_VERSION + CP (IX + _sEXE_HEADER.VERSION) + JP C,ERREXE + ; + ; + LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) + LD A,E + OR D + JP NZ,PRELOAD + ; A=0 + LD H,A + LD L,A + LD XL,A + LD XH,A + ; + LD B,high Dss.Move_FP.FrEnd + LD A,(EXE_FM) + CALL MOVE_FP + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD A,D + AND #3F + LD D,A + ADD IX,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 + RL H + SLA A + RL L + RL H + OR XL + JR Z,.NOINK + INC HL +.NOINK: LD A,H + OR A + JP NZ,ERREXE0 + LD B,L + + LD HL,.RET_1 + LD (_ret),HL + JP _TST_PROC + ; +.RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + XOR A + LD H,A + LD L,A + SBC HL,DE + EX DE,HL ; de=число чит. байт + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер + LD A,(EXE_FM) ; дескр. файла + CALL READ ; чтение из файла + ;!TEST ;[x] no close source EXE file before start 08/11/23 + ; LD A,(EXE_FM) ; дескр. файла + ; CALL CLOSE ; закрыть файл + ; + JP _TST_PROC_2 + ; +RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN + JP LEAVE ; завершить программу (процесс) + +;------------------------------------------------- +; Если расш. файла не задано, задать "exe". +; Если расш. файла задано, сравнить его с "exe". +;------------------------------------------------- +TST_EXT: LD HL,EXE_EXT ; "EXE" + LD DE,MASKARE+8 + LD B,3 + LD A,(DE) + CP ' ' + JR NZ,.loop ; задано расш. + LDI + LDI + LDI + XOR A + RET + ; сравнить расш. с "EXE" +.loop: LD A,(DE) + CP (HL) + SCF + RET NZ ; не совпадает + INC HL + INC DE + DJNZ .loop + XOR A ; Ok + RET + ; +ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY +ERREXE: PUSH AF + LD A,(EXE_FM) + CALL CLOSE_FN + _mDECTASK + POP AF + RET + ; +PRELOAD: EX DE,HL + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD A,D + AND #3F + LD D,A + ADC HL,DE + XOR A + SLA H + RLA + SLA H + RLA + LD B,A + LD A,H + OR L + JR Z,NOINK2 + INC B +NOINK2: LD HL,_RET_2 + LD (_ret),HL + JR _TST_PROC + ; +_RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер + LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт + LD A,(EXE_FM) ; дескр. файла + CALL READ ; чтение из файла + JP _TST_PROC_2 +;-------------------------------------------------------------------;[ ] +_TST_PROC: CALL GETMEM + JP C,ERREXE0 + LD (EXE_MEM),A + EXX + POP DE ;снимаем со стека адрес возврата + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX + ; + ;!TEST 27/03/2024 + LD DE,RAMMAP+3 + LD A,(EXE_MEM) + LD BC,4*256 + BIOS.GetMemPage +.mem_loop: PUSH AF + PUSH BC + DEC B + RST ToBIOS + LD (DE),A + DEC DE + POP BC + POP AF + DJNZ .mem_loop + ; + ; LD DE,RAMMAP + ; ; + ; LD A,(EXE_MEM) + ; LD BC,0*256 + BIOS.GetMemPage + ; RST ToBIOS + ; LD (DE),A + ; INC DE + ; ; + ; LD A,(EXE_MEM) + ; LD BC,1*256 + BIOS.GetMemPage + ; RST ToBIOS + ; LD (DE),A + ; INC DE + ; ; + ; LD A,(EXE_MEM) + ; LD BC,2*256 + BIOS.GetMemPage + ; RST ToBIOS + ; LD (DE),A + ; INC DE + ; ; + ; LD A,(EXE_MEM) + ; LD BC,3*256 + BIOS.GetMemPage + ; RST ToBIOS + ; LD (DE),A + ; + ; + LD HL,(CMDLINE) + LD DE,CORE_BUFFERS.SECBUF+1 + CALL SCOPYS + LD A,#80 ;!HARDCODE cmd line size + SUB B + LD (CORE_BUFFERS.SECBUF),A + ;R02 + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE + ; + LD A,SHARED_PAGE + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,RAMMAP + LD A,H + AND #C0 + ;!TEST + CP #80 + JR Z,FR8000 + JR NC,FRC000 + ;CP #40 + ;JR Z,FR4000 + ;CP #80 + ;JR Z,FR8000 + ;CP #C0 + ;JR Z,FRC000 + ; +FR4000: LD A,(DE) + OUT (SLOT1),A + INC DE +FR8000: LD A,(DE) + OUT (SLOT2),A + INC DE +FRC000: LD A,(DE) + OUT (SLOT3),A + CALL M_PSP + ; + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) + LD B,high Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE + ; +_ret+1: JP 0 + +_TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,#0080 + XOR A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) + LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" + PUSH DE + PUSH HL + ;!TEST Current Dir ;[x] 15/10/23 + PUSH IX + LD HL,CurrentPath + LD A,(CORE_BUFFERS.EXEBUFF.VERSION) + OR A + JR NZ,.set_path + CALL DIR_PATH_CHANGE.FullCurrent +.set_path: CALL CHDIR_FN + POP IX + ; + RET +;----------------------------------------------------------------------- +M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + DEC H + LD D,H + LD E,L + INC DE + LD BC,#00FF ;!HARDCODE + LD (HL),B + LDIR + EX DE,HL + DEC H + LD DE,#0080 + ADD HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,CORE_BUFFERS.SECBUF + LD C,(HL) + INC C + LDIR + EX DE,HL ;R06 + LD (HL),B + LD A,(TASK) + LD (IX-1),A + LD A,(EXE_MEM) + LD (IX-2),A + LD A,(EXE_FM) + LD (IX-3),A + ;R05 + INC HL + LD (HL),B + INC HL + ;!FIXIT тут восстанавливать правильный каталог + CALL CURDISK + ADD A,'A' + LD (HL),A + INC HL + LD A,':' + LD (HL),A + INC HL + PUSH HL + CALL CURRDIR + ; + POP HL + XOR A + LD BC,#0100 ;!FIXIT нет привязки к CurrentDirectory.DEPTH + CPIR ;!FIXIT нет проверки на выход по BC=0 + DEC HL + DEC HL + LD A,'\' ; + CP (HL) + INC HL + JR Z,.YP_ESLA + LD (HL),A + INC HL +.YP_ESLA: EX DE,HL + LD HL,TMPNAME +.loop: LD A,(HL) + LDI + CP ' '+1 + JR NC,.loop + DEC DE + XOR A + LD (DE),A + LD (APPINFO.LAST_PSP_PTR),IX + ; + RET + ; +SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size +.loop: LD A,(HL) + CP C + JR C,.copy + INC HL + DJNZ .loop + XOR A + LD (DE),A + LD B,#80 + RET + ; +.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size +.loop2: LD A,(HL) + LD (DE),A + INC HL + INC DE + CP C + RET C + DJNZ .loop2 + RET +;--------------------------------------------------------------------- +ENVPATH: DB "PATH=",0 +EXE_EXT: DB "EXE" +TASK: DB #01 ; уровень текущей программы +RAMMAP: DB #00,#00,#00,#00 +ErrorLevel: DB #00 ; код завершения программы (процесса) +EXE_FM: DB #00 ; дескр. файла +EXE_MEM: DB #00 ; идентификатор блока памяти +CMDLINE: DW #0000 +EXSTACK: DW CORE_BUFFERS.XSTACK ; адрес стека +;///////////////////////////////////////////////////////////////////// + + + +;///////////////////////////////////////////////////////////////////// +; Функция #41. Завершить программу (процесс). +; +; вход: B - код завершения +; выход: A - код ошибки, если CF=1 +; +; Выход из EXE-файла: +; +; 1) Освобождаются все блоки памяти которые выделялась данному приложению. +; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. +; 3) Вспоминается стек. +; 4) В регистр A помещается код возврата и выполняется RET. +; +;///////////////////////////////////////////////////////////////////// +LEAVE: LD A,B + LD (ErrorLevel),A + CALL FREE_PROCESS_MEMORY + LD SP,(EXSTACK) + ;[x] 10/12/23 close EXE FMs + CALL FREE_PROCESS_FMs + ; + _mDECTASK + ; + POP AF + POP HL + OUT (SLOT1),A + LD A,L + OUT (SLOT2),A + LD A,H + OUT (SLOT3),A + POP DE + POP HL + LD (EXSTACK),SP + LD SP,HL + EX DE,HL + LD A,(ErrorLevel) + ;R12 + CP DSS_Error.sys.UNEXPECTED_APP_TRMN + JR NZ,.exit + SCF + JP (HL) + ; +.exit: AND A + JP (HL) +;///////////////////////////////////////////////////////////////////// + +;///////////////////////////////////////////////////////////////////// +; Функция #42. Получить код завершения программы. ; ; вход: нет -; выход: HL - общее кол-во страниц -; BC - кол-во своб. страниц -////////////////////////////////////////////////////////////////////// -FREEMEM: LD C,BIOS.GetMemSize - RST ToBIOS - RET +; выход: A - код завершения +;///////////////////////////////////////////////////////////////////// +WAIT: LD A,(ErrorLevel) + AND A + RET +;///////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////// -; Функция #3D. Выделение блока памяти. -; -; вход: B - размер блока в страницах по 16kB -; выход: A - идентификатор блока памяти, если CF=0 -; A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -GETMEM: LD C,BIOS.GetMem - RST ToBIOS - LD E,A - LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY - RET C - LD D,#00 - LD HL,MEMTAB ; массив списка выдел. страниц - ADD HL,DE - LD A,(TASK) ; уровень текущей программы - LD (HL),A - LD A,E - AND A - RET - -////////////////////////////////////////////////////////////////////// -; Функция #3E. Освобождение блока памяти. -; -; вход: A - идентификатор блока памяти -; выход: A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -RETMEM: LD E,A - LD D,#00 - LD HL,MEMTAB ; массив списка выдел. страниц - ADD HL,DE - LD A,(TASK) ; уровень текущей программы - CP (HL) - LD A,DSS_Error.sys.INVALID_MEMORY_HND - SCF - RET NZ - PUSH DE - LD A,E - LD C,BIOS.FreeMem - RST ToBIOS - POP DE - LD A,DSS_Error.sys.INVALID_MEMORY_HND - RET C - LD HL,MEMTAB - ADD HL,DE - XOR A - LD (HL),A - RET - -////////////////////////////////////////////////////////////////////// -; Функция #3F. Изменение блока памяти. -; -; вход: A - идентификатор блока памяти -; B - новый размер блока -; выход: A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -SETMEM: LD E,A - LD D,#00 - LD HL,MEMTAB - ADD HL,DE - LD A,(TASK) - CP (HL) - LD A,DSS_Error.sys.INVALID_MEMORY_HND - SCF - RET NZ - LD D,B - PUSH DE - LD A,E - CALL SIZEBLK - POP DE - LD A,DSS_Error.sys.INVALID_MEMORY_HND - RET C - LD A,B - CP D - RET Z - JR C,INCMEM -DECMEM: LD B,D - LD A,E - LD C,BIOS.DivMemBlocks - RST ToBIOS - LD A,B - LD C,BIOS.FreeMem - RST ToBIOS - XOR A - RET - -; Добавить страниц памяти к блоку -INCMEM: LD A,D - SUB B - LD B,A - LD C,E - PUSH BC - LD C,BIOS.GetMem - RST ToBIOS - POP BC - LD B,A - LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY - RET C - LD A,C - LD C,BIOS.MergeMemBlocks - RST ToBIOS - XOR A - RET - -SIZEBLK: LD B,#FF - LD C,A -.loop: INC B - PUSH BC - LD A,C - LD C,BIOS.GetMemPage - RST ToBIOS - POP BC - JR NC,.loop - OR A - SCF - RET Z - XOR A - RET - -//////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------- FREE_PROCESS_MEMORY: LD HL,MEMTAB LD BC,256 ;!HARDCODE размер блока страниц ОЗУ @@ -559,9 +602,10 @@ FREE_PROCESS_MEMORY: POP BC POP HL JP .loop -//////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------- -//////////////////////////////////////////////////////////////////////// + +;----------------------------------------------------------------------- FREE_PROCESS_FMs: LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size LD DE,CORE_BUFFERS.FM_BUF.Size @@ -583,122 +627,24 @@ FREE_PROCESS_FMs: POP DE POP IY RET -//////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////// -; Функция #38. Подключение страницы памяти. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -; if B = 0FFh, then logical page number got from DE -////////////////////////////////////////////////////////////////////// -SETWIN: BIT 7,H ; if #8000 or high? - JR Z,SETWIN1 ; no, go to open in SLOT1 - BIT 6,H ; if #C000 or high? - JR Z,SETWIN2 ; no, go to open in SLOT2 - //JR SETWIN3 ; yes, go to open in SLOT3 -////////////////////////////////////////////////////////////////////// -; Функция #3B. Подключение страницы памяти в третье окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -SETWIN3: LD C,BIOS.GetMemPage - EX DE,HL - RST ToBIOS - EX DE,HL - RET C - LD C,SLOT3 - IN B,(C) - OUT (C),A - LD A,B - RET +;----------------------------------------------------------------------- -////////////////////////////////////////////////////////////////////// -; Функция #39. Подключение страницы памяти в первое окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -SETWIN1: LD C,BIOS.GetMemPage - EX DE,HL - RST ToBIOS - EX DE,HL - RET C - LD C,SLOT1 - IN B,(C) - OUT (C),A - LD A,B - RET - -////////////////////////////////////////////////////////////////////// -; Функция #3A. Подключение страницы памяти во второе окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -SETWIN2 LD C,BIOS.GetMemPage - EX DE,HL - RST ToBIOS - EX DE,HL - RET C - LD C,SLOT2 - IN B,(C) - OUT (C),A - LD A,B - RET - -;!TODO если надо будет сэкономить память, но привязаться к номерам слотов -; SETWIN1: LD H,SLOT1 : JR SETWIN.ALL -; SETWIN2: LD H,SLOT2 : JR SETWIN.ALL -; SETWIN3: LD H,SLOT3 : JR SETWIN.ALL -; SETWIN: LD C,A -; LD A,H -; AND %1100'0000 -; JR NZ,.no_error -; OR %0100'0000 -; .no_error: RRСA -; OR %100'0010 -; LD H,A ;SLOT number -; LD A,C -; .ALL: LD C,BIOS.GetMemPage -; EX DE,HL -; RST ToBIOS -; EX DE,HL -; RET C -; LD C,H ;SLOT number -; IN B,(C) -; OUT (C),A -; LD A,B -; RET -; -; // SLOT0 - #82 %1000'0010 -; // SLOT0 - #A2 %1010'0010 -; // SLOT0 - #C2 %1100'0010 -; // SLOT0 - #E2 %1110'0010 +;----------------------------------------------------------------------- CHECKPATH: ; !TODO сделать проверку на количество циклов LD A,(HL) INC HL CP '\' RET Z - CP '/' ;ALT SLASH - RET Z + ; CP '/' ;ALT SLASH + ; RET Z CP '!' JR NC,CHECKPATH RET +;----------------------------------------------------------------------- -RELATIVE_DIR EQU 0 -ABSOLUTE_DIR EQU 1 +;----------------------------------------------------------------------- FINDPATH: SET_PAGE_X ENVPAGE PUSH AF @@ -797,537 +743,8 @@ FINDPATH: INC HL LD (HL),A RET - -ENVPATH: DB "PATH=",0 - -;;; -;TMP_CURDIR_AUTO EQU #FB00 -; не нужно если SAVE_PATH_MACRO = 1 -; TMP_CURDIR EQU #FD00 - - -;///////////////////////////////////////////////////////////////////// -; Функция #40. Выполнить файл. -; -; вход: HL - указатель на имя файла -; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) -; B=1 - загрузить и выполнить программу с полным путём до программы -; выход: A - код завершения, если CF=0 -; код ошибки, если CF=1 -;--------------------------------------------------------------------- -; Загрузить и выполнить программу. -; функ. #40, B=0. -; -; 1) Открывает exe-файл на чтение; -; 2) Считывает в рабочую область префикс exe-файла; -; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного -; загрузчика, если его размер не равен нулю; -; 4) Сохраняет стек; -; 5) Подключает страницы из выделенного блока; -; 6) Строит префикс запуска программы и устанавливает на него регистр IX; -; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения -; кода в памяти); -; 8) Закрывает exe-файл, если это не первичный загрузчик; -; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека); -; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); -; -; Префикс запуска файла: -; -; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком -; -02 1 db ? ; Идентификатор блока памяти -; -01 1 db ? ; Уровень текущей программы -; +00 1 db ? ; Длина ком-строки -; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем -;///////////////////////////////////////////////////////////////////// -EXEC: LD (CMDLINE),HL - INC B ;R03 - DEC B ;R03 - JR Z,.VAR_1 ;R03 - DEC B ;R03 - JR Z,.VAR_2 ;R03 - LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 - SCF ;R03 - RET ;R03 - ; -.VAR_1: ;LD (CMDLINE),HL - CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME - ;LD HL,(CMDLINE) - JR C,EXEC0_SHORT -.VAR_2: CALL EXEC_1 - ;LD A,DSS_Error.sys.FILE_NOT_FOUND - SCF - RET ; File not found - exit - -; при выходе с ошибкой, в регистре А - код ошибки -EXEC_1: ;LD (CMDLINE),HL - LD HL,(CMDLINE) - LD A,FAT_ATTR.READ_ONLY - LD (OPEN_FN.TMP),A - CALL GETWORD - RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE - CALL MASK - RET C - CALL TST_EXT - ;LD A,DSS_Error.sys.FILE_NOT_FOUND - RET C - _mINCTASK ;R08 - CALL OPEN_FN.FILE - JR C,.Error - POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру - JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM -.Error: _mDECTASK ;R08 - AND A - RET -; JR NC,.noError -; _mDECTASK ;R08 -; AND A -; RET -; ; -; .noError: -; POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру -; JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM - - - ;SHORT NAME - ;TRY TO FIND IN CURRENT DIRECTORY -EXEC0_SHORT: - CALL EXEC_1 - RET C - ;FILE NOT FOUND, SEARCHING IN PATH - ; GET PATH AND ETC. - LD HL,ENVPATH - LD DE,ENVPAGE.ENVTEMP - LD B,high Dss.Environ.Get - CALL ENVIRON - - LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.EXEBUFF -COPYEXN: LD A,(HL) - LDI - OR A - JR NZ,COPYEXN - - CALL FINDPATH - ;[x] 1/10/2023 - LD A,DSS_Error.sys.FILE_NOT_FOUND - RET C - ; - LD HL,(CMDLINE) - JR EXEC.VAR_2 - -EXEC02: LD (EXE_FM),A - LD HL,CORE_BUFFERS.EXEBUFF - LD DE,#0080 ;!#0200(512) ;R02 - LD A,(EXE_FM) - CALL READ - JP C,ERREXE - LD IX,CORE_BUFFERS.EXEBUFF - LD HL,(CORE_BUFFERS.EXEBUFF) - LD DE,'E'+'X'*256 - ;AND A ; не нужно, если бы был CF=1, то чуть выше мы бы ушли на JP C,ERREXE - SBC HL,DE - LD A,DSS_Error.sys.INVALID_EXE - SCF - JP NZ,ERREXE - LD A,(IX+3) ;!HARDCODE - OR A - LD A,DSS_Error.sys.UNKNOWN_EXE - SCF - JP NZ,ERREXE - - LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) - LD A,E - OR D - JP NZ,PRELOAD - ; A=0 - LD H,A - LD L,A - LD XL,A - LD XH,A - ; - LD B,high Dss.Move_FP.FrEnd - LD A,(EXE_FM) - CALL MOVE_FP - LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD A,D - AND #3F - LD D,A - ADD IX,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 - RL H - SLA A - RL L - RL H - OR XL - JR Z,NOINK - INC HL -NOINK: LD A,H - OR A - JP NZ,ERREXE0 - LD B,L - - LD HL,_RET_1 - LD (_ret),HL - JP _TST_PROC - -_RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - XOR A - LD H,A - LD L,A - SBC HL,DE - EX DE,HL ; de=число чит. байт - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер - LD A,(EXE_FM) ; дескр. файла - CALL READ ; чтение из файла - ;!TEST ;[x] no close source EXE file before start 08/11/23 - ; LD A,(EXE_FM) ; дескр. файла - ; CALL CLOSE ; закрыть файл - ; - JP _TST_PROC_2 - -RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN - JP LEAVE ; завершить программу (процесс) - -;------------------------------------------------- -; Если расш. файла не задано, задать "exe". -; Если расш. файла задано, сравнить его с "exe". -;------------------------------------------------- -TST_EXT: LD HL,EXE_EXT ; "EXE" - LD DE,MASKARE+8 - LD B,3 - LD A,(DE) - CP ' ' - JR NZ,.loop ; задано расш. - LDI - LDI - LDI - XOR A - RET -; сравнить расш. с "EXE" -.loop: LD A,(DE) - CP (HL) - SCF - RET NZ ; не совпадает - INC HL - INC DE - DJNZ .loop - XOR A ; Ok - RET - -ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY -ERREXE: PUSH AF - LD A,(EXE_FM) - CALL CLOSE_FN - _mDECTASK - POP AF - RET - -PRELOAD: EX DE,HL - LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD A,D - AND #3F - LD D,A - ADC HL,DE - XOR A - SLA H - RLA - SLA H - RLA - LD B,A - LD A,H - OR L - JR Z,NOINK2 - INC B -NOINK2: LD HL,_RET_2 - LD (_ret),HL - JR _TST_PROC - -_RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер - LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт - LD A,(EXE_FM) ; дескр. файла - CALL READ ; чтение из файла - JP _TST_PROC_2 - - -;-------------------------------------------------------------------;[ ] -_TST_PROC: - CALL GETMEM - JP C,ERREXE0 - LD (EXE_MEM),A - EXX - POP DE ;снимаем со стека адрес возврата - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL - EXX - ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит - LD A,(EXE_MEM) - LD DE,RAMMAP - LD BC,0*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,1*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,2*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - INC DE - LD A,(EXE_MEM) - LD BC,3*256 + BIOS.GetMemPage - RST ToBIOS - LD (DE),A - - LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECBUF+1 - CALL SCOPYS - LD A,#80 ;!HARDCODE cmd line size - SUB B - LD (CORE_BUFFERS.SECBUF),A - ;R02 - LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE - ; - LD A,SHARED_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,RAMMAP - LD A,H - AND #C0 - CP #40 - JR Z,FR4000 - CP #80 - JR Z,FR8000 - CP #C0 - JR Z,FRC000 -FR4000: LD A,(DE) - OUT (SLOT1),A - INC DE -FR8000: LD A,(DE) - OUT (SLOT2),A - INC DE -FRC000: LD A,(DE) - OUT (SLOT3),A - CALL M_PSP - - LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) - LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) - LD B,high Dss.Move_FP.FrStart - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE - ; -_ret+1: JP 0 - -_TST_PROC_2: - LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) - LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" - PUSH DE - PUSH HL - ;!TEST Current Dir ;[x] 15/10/23 - PUSH IX - LD HL,CurrentDirectory - CALL CHDIR_FN - POP IX - ; - RET - ; ;----------------------------------------------------------------------- -;///////////////////////////////////////////////////////////////////// -; Функция #41. Завершить программу (процесс). -; -; вход: B - код завершения -; выход: A - код ошибки, если CF=1 -; -; Выход из EXE-файла: -; -; 1) Освобождаются все блоки памяти которые выделялась данному приложению. -; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. -; 3) Вспоминается стек. -; 4) В регистр A помещается код возврата и выполняется RET. -; -;///////////////////////////////////////////////////////////////////// -LEAVE: LD A,B - LD (ErrorLevel),A - CALL FREE_PROCESS_MEMORY - LD SP,(EXSTACK) - ;[x] 10/12/23 close EXE FMs - CALL FREE_PROCESS_FMs - _mDECTASK - ; - POP AF - POP HL - OUT (SLOT1),A - LD A,L - OUT (SLOT2),A - LD A,H - OUT (SLOT3),A - POP DE - POP HL - LD (EXSTACK),SP - LD SP,HL - EX DE,HL - LD A,(ErrorLevel) - ;R12 - CP DSS_Error.sys.UNEXPECTED_APP_TRMN - JR NZ,.exit - SCF - JP (HL) - ; -.exit: AND A - JP (HL) - -;///////////////////////////////////////////////////////////////////// -; Функция #42. Получить код завершения программы. -; -; вход: нет -; выход: A - код завершения -;///////////////////////////////////////////////////////////////////// -WAIT: LD A,(ErrorLevel) - AND A - RET -;///////////////////////////////////////////////////////////////////// - -; -M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - DEC H - LD D,H - LD E,L - INC DE - LD BC,#00FF ;!HARDCODE - LD (HL),B - LDIR - EX DE,HL - DEC H - LD DE,#0080 - ADD HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,CORE_BUFFERS.SECBUF - LD C,(HL) - INC C - LDIR - EX DE,HL ;R06 - LD (HL),B - LD A,(TASK) - LD (IX-1),A - LD A,(EXE_MEM) - LD (IX-2),A - LD A,(EXE_FM) - LD (IX-3),A - ;R05 - INC HL - LD (HL),B - INC HL - ;!FIXIT тут восстанавливать правильный каталог - CALL CURDISK - ADD A,'A' - LD (HL),A - INC HL - LD A,':' - LD (HL),A - INC HL - PUSH HL - CALL CURRDIR - ; - POP HL - XOR A - LD BC,#0100 ;!FIXIT нет привязки к CurrentDirectory.DEPTH - CPIR ;!FIXIT нет проверки на выход по BC=0 - DEC HL - DEC HL - LD A,'\' ; - CP (HL) - INC HL - JR Z,.YP_ESLA - LD (HL),A - INC HL -.YP_ESLA: EX DE,HL - LD HL,TMPNAME -.loop: LD A,(HL) - LDI - CP ' '+1 - JR NC,.loop - DEC DE - XOR A - LD (DE),A - LD (APPINFO.LAST_PSP_PTR),IX - ; - RET - -SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size -.loop: LD A,(HL) - CP C - JR C,.copy - INC HL - DJNZ .loop - XOR A - LD (DE),A - LD B,#80 - RET -.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size -.loop2: LD A,(HL) - LD (DE),A - INC HL - INC DE - CP C - RET C - DJNZ .loop2 - RET - - -EXE_EXT: DB "EXE" - -TASK: DB #01 ; уровень текущей программы - -RAMMAP: DB #00,#00,#00,#00 - -ErrorLevel: DB #00 ; код завершения программы (процесса) - -EXE_FM: DB #00 ; дескр. файла -EXE_MEM: DB #00 ; идентификатор блока памяти - -CMDLINE: DW #0000 - -EXSTACK: DW CORE_BUFFERS.XSTACK ; адрес стека ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;; @@ -1348,6 +765,4 @@ EXSTACK: DW CORE_BUFFERS.XSTACK ; ; BLOCK 255,0 ; XSTACK DB #00 ;R11 //////////////////////////// - -;//MODULE: EXECUTE -;[END] \ No newline at end of file +; \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index c9607c3..1b2217b 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -2,6 +2,10 @@ DEFINE TEST_FEATURE 0 ; +; + DEFINE MINIMUM_EXE_VERSION 1 +; + ; DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. DEFINE COMPILE_UNUSED_CODE 0 @@ -31,35 +35,35 @@ FAT_TYPE: .x32 EQU 32 .x16 EQU 16 .x12 EQU 12 -/* - define _bit (1 Date: Thu, 28 Mar 2024 02:59:48 +1000 Subject: [PATCH 103/219] =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BB=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=88=20=D0=BD=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=8F=D0=B7=D1=8B=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B0=D1=81=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8?= =?UTF-8?q?=20ctrl+space=20=D0=B8=D0=BB=D0=B8=20shift+ctrl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 58 +- DSS/API.asm | 1 + DSS/{EXECUTE.ASM => API/Execute.ASM} | 44 +- DSS/DOS_FM.ASM | 116 ++-- DSS/DSS-MAIN.ASM | 20 +- DSS/KEYINTER.ASM | 982 ++++++++++++++------------- DSS/Kernel_Panic.asm | 52 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/build.txt | 2 +- 10 files changed, 691 insertions(+), 588 deletions(-) rename DSS/{EXECUTE.ASM => API/Execute.ASM} (93%) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index ce9672d..e4bbec6 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -148,7 +148,7 @@ confirm_flag+*: ld a,0 ; запросить целевой диск ld a,(disk) ; заданный номер диска add a,'A' - ld (lett2),a + ld (messages.lett2),a ld a,5 ; индекс строки "Insert destination disk..." call print_string ld bc,3035h ; ждем нажатия клавиши @@ -198,7 +198,7 @@ ok_write1: ; ; ld a,(disk) ; заданный номер диска add a,'A' - ld (lett1),a + ld (messages.lett1),a ld a,1 ; индекс строки "System installed on disk " call print_string ld a,(confirm_flag) @@ -209,7 +209,7 @@ ok_write1: ; cp 2 jr nc,exit-1 ; не дисководы add a,'A' - ld (lett3),a + ld (messages.lett3),a ld a,6 ; индекс строки "Insert system disk..." call print_string ld bc,3035h ; ждем нажатия клавиши @@ -518,41 +518,39 @@ id_mem: db -1 ; ; ; сообщения messages: db 0 - db 0Dh,0Ah,"Boot and System files Installer v" ;0 + db "\r\nBoot and System files Installer v" ;0 db major_version + '0','.' - db (minor_version / 10) + '0',(minor_version % 10) + '0','.' - db 0Dh,0Ah,0Ah - db "Copyright (c) 2006-2022 Vasil Ivanov." - db 0Dh,0Ah,0Ah - db "Copyright (c) 2023 Sprinter Team." - db 0Dh,0Ah,0Ah,0 + db (minor_version / 10) + '0',(minor_version % 10) + '0','.' + db "\r\n\nCopyright (c) 2006-2022 Vasil Ivanov." + db "\r\n\nCopyright (c) 2023 Sprinter Team." + db "\r\n\n",0 ; db "System successfully installed on disk " ;1 -lett1: db "X:",0Dh,0Ah,0Ah,0 +.lett1: db "X:\r\n\n",0 ; - db "Installing boot loader...",0Dh,0Ah,0Ah,0 ;2 - db "Writing system files...",0Dh,0Ah,0Ah,0 ;3 + db "Installing boot loader...\r\n\n",0 ;2 + db "Writing system files...\r\n\n",0 ;3 ; - db "Syntax: SYS X:",0Dh,0Ah ;4 - db " where X: - drive letter (A..Z)",0Dh,0Ah,0Ah,0 + db "Syntax: SYS X:\r\n" ;4 + db " where X: - drive letter (A..Z)\r\n\n",0 ; db "Insert destination disk in drive " ;5 -lett2: db "X:",0Dh,0Ah - db "and strike any key when ready ...",0Dh,0Ah,0Ah,0 +.lett2: db "X:\r\n" + db "and strike any key when ready ...\r\n\n",0 ; db "Insert system disk in drive " ;6 -lett3: db "X:",0Dh,0Ah - db "and strike any key when ready ...",0Dh,0Ah,0Ah,0 +.lett3: db "X:\r\n" + db "and strike any key when ready ...\r\n\n",0 ; - db "Can't install boot on this disk",0Dh,0Ah,0Ah,0 ;7 - db "Invalid drive specification",0Dh,0Ah,0Ah,0 ;8 - db " Error: Can't open file",0Dh,0Ah,0Ah,0 ;9 - db " Error: Can't allocate memory",0Dh,0Ah,0Ah,0 ;10 - db " Error: Need DOS version 1.70.811 or higher",0Dh,0Ah,0Ah,0 ;11 - db " Error: Reading error",0Dh,0Ah,0Ah,0 ;12 - db " Error: Can't create file",0Dh,0Ah,0Ah,0 ;13 - db " Error: Writing error",0Dh,0Ah,0Ah,0 ;14 -endmess: db 0 + db "Can't install boot on this disk\r\n\n",0 ;7 + db "Invalid drive specification\r\n\n",0 ;8 + db " Error: Can't open file\r\n\n",0 ;9 + db " Error: Can't allocate memory\r\n\n",0 ;10 + db " Error: Need DOS version 1.70.811 or higher\r\n\n",0 ;11 + db " Error: Reading error\r\n\n",0 ;12 + db " Error: Can't create file\r\n\n",0 ;13 + db " Error: Writing error\r\n\n",0 ;14 +.endmess: db 0 @@ -565,8 +563,8 @@ print_string: call get_string ; ; поиск строки по ее индексу в 'a' -get_string: ld hl,messages ; список мессаг для индекс. доступа - ld bc,endmess-messages ; размер списка +get_string: ld hl,messages ; список мессаг для индекс. доступа + ld bc,messages.endmess - messages ; размер списка inc a ex af,af' xor a diff --git a/DSS/API.asm b/DSS/API.asm index 3f33c53..05e1e45 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -67,6 +67,7 @@ include 'API/GSwitch.asm' include 'API/Environ.ASM' include 'API/Lib_Sub.asm' + include "API/EXECUTE.ASM" diff --git a/DSS/EXECUTE.ASM b/DSS/API/Execute.ASM similarity index 93% rename from DSS/EXECUTE.ASM rename to DSS/API/Execute.ASM index 3daa2b6..1dbefd2 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/API/Execute.ASM @@ -607,26 +607,30 @@ FREE_PROCESS_MEMORY: ;----------------------------------------------------------------------- FREE_PROCESS_FMs: - LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size - LD DE,CORE_BUFFERS.FM_BUF.Size - LD B,FMCOUNT+1 - LD A,(TASK) -.loop: ADD IY,DE - CP (IY+_sFM.TASK_NUM) - CALL Z,.CLOSE - DJNZ .loop - RET - ; -.CLOSE: PUSH IY - PUSH DE - PUSH AF - LD A,FMCOUNT+1 - SUB B - CALL CLOSE_FN - POP AF - POP DE - POP IY - RET + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size + LD B,FMCOUNT+1 + LD A,(TASK) +.loop: ADD IY,DE + CP (IY+_sFM.TASK_NUM) + JR NZ,.next + ; close fm + PUSH AF + XOR A + OR (IY+_sFM.TASK_NUM) + JR Z,.skip + PUSH IY + PUSH DE + LD A,FMCOUNT+1 + SUB B + CALL CLOSE_FN + POP DE + POP IY +.skip: POP AF + ; +.next: DJNZ .loop + RET + ; ;----------------------------------------------------------------------- diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index cc12620..91d1f5a 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -42,57 +42,85 @@ FM_BUF: _sFM */ ; на выходе без ошибок IY указывает на файловый манипулятор - MACRO _mFM_FIND - CP FMCOUNT+1 - JR NC,ABS_FM - PUSH DE +; MACRO _mFM_FIND +; CP FMCOUNT+1 +; CCF +; RET C +; PUSH DE - LD IY,CORE_BUFFERS.FM_BUF - LD DE,CORE_BUFFERS.FM_BUF.Size - AND A - JR Z,.endLoop -.loop: ADD IY,DE - DEC A - JR NZ,.loop -.endLoop: - POP DE - ; A=0 - OR (IY) ;+00 NAME - ENDM +; LD IY,CORE_BUFFERS.FM_BUF +; LD DE,CORE_BUFFERS.FM_BUF.Size +; AND A +; JR Z,.endLoop +; .loop: ADD IY,DE +; DEC A +; JR NZ,.loop +; .endLoop: +; POP DE +; ; A=0 +; OR (IY) ;+00 NAME +; RET +; ENDM //////////////////////////////////////////////////////////////////////// -SET_FM: _mFM_FIND - LD A,DSS_Error.sys.NO_ERROR - RET NZ -ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE - SCF - RET +; на выходе без ошибок IY указывает на файловый манипулятор +FM_FIND: CP FMCOUNT+1 + JR NC,.error + ; + PUSH DE + LD IY,CORE_BUFFERS.FM_BUF + LD DE,CORE_BUFFERS.FM_BUF.Size + AND A + JR Z,.endLoop +.loop: ADD IY,DE + DEC A + JR NZ,.loop +.endLoop: POP DE + ; A=0 + OR (IY) ;+00 NAME + RET +.error: XOR A + LD A,DSS_Error.sys.INVALID_HANDLE + RET + +SET_FM: CALL FM_FIND + ; error + ;LD A,DSS_Error.sys.INVALID_HANDLE + ; CF = 1 + SCF + RET Z + ; no error + XOR A ;LD A,DSS_Error.sys.NO_ERROR + ; CF = 0 + RET + -RES_FM: _mFM_FIND - LD A,DSS_Error.sys.INVALID_HANDLE - ;EXX - SCF - RET Z - XOR A - LD (IY + _sFM.FS_REC.NAME),A - RET +RES_FM: CALL FM_FIND + ; error + ; LD A,DSS_Error.sys.INVALID_HANDLE + SCF + RET Z + ; no error + XOR A + LD (IY + _sFM.FS_REC.NAME),A + RET ; -GET_FM: LD B,FMCOUNT - LD C,#FF - LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size - LD DE,CORE_BUFFERS.FM_BUF.Size -.loop: ADD IY,DE - INC C - LD A,(IY + _sFM.FS_REC.NAME) - OR A - RET Z - DJNZ .loop - LD A,DSS_Error.sys.NO_HANDLES - SCF - RET +GET_FM: LD B,FMCOUNT + LD C,#FF + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size +.loop: ADD IY,DE + INC C + LD A,(IY + _sFM.FS_REC.NAME) + OR A + RET Z + DJNZ .loop + LD A,DSS_Error.sys.NO_HANDLES + SCF + RET /* - ;!TEST CHECK LOCKING 10/11/2023 + ;!TODO CHECK LOCKING 10/11/2023 GET_FM: LD IY,0 LD (.freeHandle),IY ; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index db660de..2f24a98 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -237,7 +237,6 @@ PORTAL.out_MAIN: ; ; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; ; - ; CLEAR_BUFFER_AND_INIT_PROC: ;------[CLEAR BUFFERS]------; @@ -353,17 +352,16 @@ ADRST10: ;DS 512 ;,0 ; DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT, high NOPS, high NOPS, high NOPS, high NOPS ;---------------------------------------------------------------------------------------------------------------------------------------------------------------; ;[INCLUDE] - ;!TODO заменить по-максимому всё в KEYINTER.ASM на вызовы биоса - INCLUDE "KEYINTER.ASM" - INCLUDE "VIDEO.ASM" + ;!TODO заменить по-максимому всё в KEYINTER.ASM на вызовы биоса + INCLUDE "KEYINTER.ASM" + INCLUDE "VIDEO.ASM" INCLUDE "API.ASM" - INCLUDE "DOS_Proc.asm" - INCLUDE "FS/FAT/FAT.ASM" - INCLUDE "FS/FAT/FAT_X.ASM" - INCLUDE "DOS_FM.ASM" - - INCLUDE "EXECUTE.ASM" - INCLUDE "INTMOUSE.ASM" + INCLUDE "DOS_Proc.asm" + INCLUDE "FS/FAT/FAT.ASM" + INCLUDE "FS/FAT/FAT_X.ASM" + INCLUDE "DOS_FM.ASM" + ;INCLUDE "EXECUTE.ASM" + INCLUDE "INTMOUSE.ASM" INCLUDE "Procedures.asm" INCLUDE "Kernel_Panic.asm" diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 9806bb3..b9e4b70 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -18,8 +18,8 @@ HOST DB #00 K_LOCK EQU $-KEYFLAG LANG_L EQU 7 PAUSE_L EQU 6 -RES5_L EQU 5 -RES4_L EQU 4 +LANG_R EQU 5 ; сочетание клавиш для переключения языка отжато +LANG_S EQU 4 ; сочетание клавиш для переключения языка нажато NUM_L EQU 3 SCRL_L EQU 2 INS_L EQU 1 @@ -58,6 +58,7 @@ FLAG_S2 EQU 2 SF_ALT EQU 1 SF_BUFF EQU 0 DB #03 +UNCODE DW 0 ; последняя отжатая клавиша ; D15 - LShift ; D14 - RShift @@ -87,7 +88,6 @@ SF_BUFF EQU 0 ; D7..D0 - ASCII code -UNCODE DW 0 WAITKEY LD HL,HOST LD A,(HEAD) @@ -360,6 +360,7 @@ K_CLEAR: JR C,.error LD C,B JP RST_10 + ; .error: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET @@ -408,6 +409,7 @@ GETSYM: LD HL,HOST INC L LD C,(HL) RET +; FULL_BF: EX AF,AF' @@ -429,150 +431,188 @@ FULL_BF: .E1_KEY: SET FLAG_E1,(IX+KEYFLG) JR KEYSCAN.RESCAN +; - -KEYSCAN: - LD IX,KEYFLAG - ;!TEST SIO INT - IF KEYBOARD_INT_ENABLED - CALL .RESCAN - LD A,%0011'1000 ; return from int - OUT (Z84.SIO.Ch_A.Ctrl),A - RET +KEYSCAN: LD IX,KEYFLAG + ;!TEST SIO INT + IF KEYBOARD_INT_ENABLED + CALL .RESCAN + LD A,%0011'1000 ; return from int + OUT (Z84.SIO.Ch_A.Ctrl),A + RET + ENDIF +.RESCAN: IN A,(Z84.SIO.Ch_A.Ctrl) + AND 1 + RET Z + ;[ ] 18/02/2024 проверка на переполнение буфера + ; A = 1 + ; reg 1 + OUT (Z84.SIO.Ch_A.Ctrl),A + IN A,(Z84.SIO.Ch_A.Ctrl) + AND %0010'0000 ; check receiver overrun error + JP NZ,KBD_Receiver_Overrun + ; + IN A,(Z84.SIO.Ch_A.Data) + CP #F0 + JR Z,FULL_BF.F0_KEY + ; + CP #E0 + JR Z,FULL_BF.E0_KEY + ; + CP #E1 + JR Z,FULL_BF.E1_KEY + ; + BIT FLAG_F0,(IX+KEYFLG) + JR NZ,UN_KEY + ; + LD L,A + CALL XLAT + CALL SHIFTS + RES FLAG_E0,(IX+KEYFLG) + RES FLAG_E1,(IX+KEYFLG) + ;[ ] выгребсти весь буфер + JR Z,.RESCAN + ; RET Z ;IT'S SHIFT KEY + ; + CALL INPCODE ;L - AT POS. CODE + ;PUTCODE + ;Caps Lock + LD HL,#1C00 + AND A + SBC HL,DE + CALL Z,CAPS_X + IFN CHANGE_LANG_CTRL_SHIFT + ;Ctrl + Space + LD HL,#B800 + AND A + SBC HL,DE + CALL Z,LANG_X ENDIF - ; -.RESCAN: - IN A,(Z84.SIO.Ch_A.Ctrl) - AND 1 - RET Z - ;[ ] 18/02/2024 проверка на переполнение буфера - ; A = 1 - ; reg 1 - OUT (Z84.SIO.Ch_A.Ctrl),A - IN A,(Z84.SIO.Ch_A.Ctrl) - AND %0010'0000 ; check receiver overrun error - JP NZ,KBD_Receiver_Overrun - ; - IN A,(Z84.SIO.Ch_A.Data) - CP #F0 - JR Z,FULL_BF.F0_KEY - CP #E0 - JR Z,FULL_BF.E0_KEY - CP #E1 - JR Z,FULL_BF.E1_KEY - BIT FLAG_F0,(IX+KEYFLG) - JR NZ,UN_KEY - LD L,A - CALL XLAT - CALL SHIFTS - RES FLAG_E0,(IX+KEYFLG) - RES FLAG_E1,(IX+KEYFLG) - ;[ ] 29/02/2024 выгребсти весь буфер - JR Z,.RESCAN ;IT'S SHIFT KEY - ; RET Z ;IT'S SHIFT KEY - ; - CALL INPCODE ;L - AT POS. CODE - ;PUTCODE - LD HL,#1C00 ;Caps Lock - AND A - SBC HL,DE - CALL Z,CAPS_X - LD HL,#B800 ;Ctrl + Space - AND A - SBC HL,DE - CALL Z,RUS_X - LD HL,#5000 ;Insert - AND A - SBC HL,DE - CALL Z,INS_X - LD HL,#4900 ;Num Lock - AND A - SBC HL,DE - CALL Z,NUM_X - LD HL,#C900 ;Pause Lock - AND A - SBC HL,DE - CALL Z,PAUSE_X - LD HL,#4800 ;Scroll Lock - AND A - SBC HL,DE - CALL Z,SCL_X - ;[x] small optimization))) - ; LD HL,#CF00 ;Ctrl + Alt + Del - ; AND A - ; SBC HL,DE - ; CALL Z,RST_X - ; - LD BC,(KEYFLAG) - CALL PUTSYM - RET - ;[ ] 18/02/2024 проверка на переполнение буфера -; .Receiver_Overrun: -; LD (IX+K_SHIFT),0 -; LD (IX+KEYFLG),0 -; ; reg 0 - reset errors -; LD A,%0011'0000 -; OUT (Z84.SIO.Ch_A.Ctrl),A -; RET + ;Insert + LD HL,#5000 + AND A + SBC HL,DE + CALL Z,INS_X + ;Num Lock + LD HL,#4900 + AND A + SBC HL,DE + CALL Z,NUM_X + ;Pause Lock + LD HL,#C900 + AND A + SBC HL,DE + CALL Z,PAUSE_X + ;Scroll Lock + LD HL,#4800 + AND A + SBC HL,DE + CALL Z,SCL_X + ;Ctrl + Alt + Del + ;[x] small optimization))) + ; LD HL,#CF00 + ; AND A + ; SBC HL,DE + ; CALL Z,RST_X + ; + LD BC,(KEYFLAG) + CALL PUTSYM + ;[ ] 29/02/2024 выгребсти весь буфер + JR .RESCAN + ;RET + ; +; + IF CHANGE_LANG_CTRL_SHIFT +UN_KEY: RES FLAG_F0,(IX+KEYFLG) + LD L,A + CALL XLAT + CALL UNSHIFT + RES FLAG_E0,(IX+KEYFLG) + LD A,(UNCODE) + LD H,0 + LD (UNCODE),HL + CP #36 ;L CTRL + JR Z,.check_shift + CP #29 ;L SHIFT + RET NZ + ; check ctrl + LD A,L + SUB #36 ;L CTRL + JR Z,LANG_X + RET + ; +.check_shift: LD A,L + SUB #29 + JR Z,LANG_X + RET + ELSE +UN_KEY: RES FLAG_F0,(IX+KEYFLG) + LD L,A + CALL XLAT + CALL UNSHIFT + RES FLAG_E0,(IX+KEYFLG) + LD H,0 + LD (UNCODE),HL + RET + ENDIF +; +CAPS_X: LD A,(IX+K_LOCK) + XOR 1< Date: Sun, 31 Mar 2024 03:32:06 +1000 Subject: [PATCH 104/219] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D0=B2=D0=BE=D0=B9=20(=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B7=D0=B0=20=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20XLAT=5FT).=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20ctrl+c=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81?= =?UTF-8?q?=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Ex_Path.asm | 2 +- DSS/API/Execute.ASM | 8 +- DSS/DSS_MACROSES.Z80 | 176 +++++----- DSS/FS/FAT/FAT.asm | 10 +- DSS/FS/FAT/FAT_X.asm | 259 ++++++++------ DSS/KEYINTER.ASM | 626 ++++++++++++++++++++++------------ DSS/Media_drivers/ide-drv.asm | 4 +- DSS/build.txt | 2 +- DSS/defines.inc | 9 +- SHELL/Commands/DIR.ASM | 2 +- SHELL/EXEC.ASM | 4 +- SHELL/Procedures/Print.ASM | 2 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 14 files changed, 681 insertions(+), 427 deletions(-) diff --git a/DSS/API/Ex_Path.asm b/DSS/API/Ex_Path.asm index 6545b4c..aab7a8b 100644 --- a/DSS/API/Ex_Path.asm +++ b/DSS/API/Ex_Path.asm @@ -10,7 +10,7 @@ ; 3 - Выделить имя файла ; 4 - Выделить расширение файла ; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла -; 6 - Зарезервировано +; 6 - Зарезервировано ;!TODO преобразовать относительный путь в полный ; [ ] ; 7 - Выделить параметр командной строки ; 8 - Преобразовать из 11 символьного формата в формат ДОС ; 9 - Преобразовать из формата ДОС в 11 символьный формат diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 1dbefd2..fa52f6e 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -565,11 +565,13 @@ LEAVE: LD A,B LD A,(ErrorLevel) ;R12 CP DSS_Error.sys.UNEXPECTED_APP_TRMN - JR NZ,.exit - SCF + JR Z,.error_exit + CP DSS_Error.sys.USER_ABORT + JR NZ,.norm_exit +.error_exit: SCF JP (HL) ; -.exit: AND A +.norm_exit: AND A JP (HL) ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index b495a90..7589bb9 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -1,101 +1,101 @@ ; - MACRO BUFFER_KEYINTER - _mInfoALIGN 256,0 -;KEYBOARD BUFFER -SBUF: BLOCK 64,0 +; MACRO BUFFER_KEYINTER +; _mInfoALIGN 256,0 +; ;KEYBOARD BUFFER +; SBUF: BLOCK 64,0 -HEAD DB #00 -HOST DB #00 +; HEAD DB #00 +; HOST DB #00 -K_LOCK EQU $-KEYFLAG -LANG_L EQU 7 -PAUSE_L EQU 6 -RES5_L EQU 5 -RES4_L EQU 4 -NUM_L EQU 3 -SCRL_L EQU 2 -INS_L EQU 1 -CAPS_L EQU 0 -KEYFLAG DB #02 ;D0-Key Pressed +; K_LOCK EQU $-KEYFLAG +; LANG_L EQU 7 +; PAUSE_L EQU 6 +; RES5_L EQU 5 +; RES4_L EQU 4 +; NUM_L EQU 3 +; SCRL_L EQU 2 +; INS_L EQU 1 +; CAPS_L EQU 0 +; KEYFLAG DB #02 ;D0-Key Pressed -K_SHIFT EQU $-KEYFLAG -L_SHIFT EQU 7 -R_SHIFT EQU 6 -X_CTRL EQU 5 -X_ALT EQU 4 -L_CTRL EQU 3 -L_ALT EQU 2 -R_CTRL EQU 1 -R_ALT EQU 0 -KEYCTRL DB #00 +; K_SHIFT EQU $-KEYFLAG +; L_SHIFT EQU 7 +; R_SHIFT EQU 6 +; X_CTRL EQU 5 +; X_ALT EQU 4 +; L_CTRL EQU 3 +; L_ALT EQU 2 +; R_CTRL EQU 1 +; R_ALT EQU 0 +; KEYCTRL DB #00 -KEYFLG EQU $-KEYFLAG -FLAG_E0 EQU 7 -FLAG_F0 EQU 6 -FLAG_E1 EQU 5 -FLAG_04 EQU 4 -FLAG_03 EQU 3 -FLAG_02 EQU 2 -FLAG_01 EQU 1 -FLAG_00 EQU 0 - DB #00 +; KEYFLG EQU $-KEYFLAG +; FLAG_E0 EQU 7 +; FLAG_F0 EQU 6 +; FLAG_E1 EQU 5 +; FLAG_04 EQU 4 +; FLAG_03 EQU 3 +; FLAG_02 EQU 2 +; FLAG_01 EQU 1 +; FLAG_00 EQU 0 +; DB #00 -SOUND_K EQU $-KEYFLAG -FLAG_S7 EQU 7 -FLAG_S6 EQU 6 -FLAG_S5 EQU 5 -FLAG_S4 EQU 4 -FLAG_S3 EQU 3 -FLAG_S2 EQU 2 -SF_ALT EQU 1 -SF_BUFF EQU 0 - DB #03 -; -; D15 - LShift -; D14 - RShift -; D13 - CTRL -; D12 - ALT -; D11 - LCTRL -; D10 - LALT -; D9 - RCTRL -; D8 - RALT -; D7 - Language Lock -; D6 - Reserved -; D5 - Reserved -; D4 - Reserved -; D3 - Num Lock -; D2 - Scroll Lock -; D1 - Insert Lock -; D0 - Caps Lock -; -; D15 - Keystroke -; D14 -; D13 \ -; D12 \ -; D11 -- Position code (0...5Ah) -; D10 / -; D9 / -; D8 -; D7..D0 - ASCII code -; - ENDM +; SOUND_K EQU $-KEYFLAG +; FLAG_S7 EQU 7 +; FLAG_S6 EQU 6 +; FLAG_S5 EQU 5 +; FLAG_S4 EQU 4 +; FLAG_S3 EQU 3 +; FLAG_S2 EQU 2 +; SF_ALT EQU 1 +; SF_BUFF EQU 0 +; DB #03 +; ; +; ; D15 - LShift +; ; D14 - RShift +; ; D13 - CTRL +; ; D12 - ALT +; ; D11 - LCTRL +; ; D10 - LALT +; ; D9 - RCTRL +; ; D8 - RALT +; ; D7 - Language Lock +; ; D6 - Reserved +; ; D5 - Reserved +; ; D4 - Reserved +; ; D3 - Num Lock +; ; D2 - Scroll Lock +; ; D1 - Insert Lock +; ; D0 - Caps Lock +; ; +; ; D15 - Keystroke +; ; D14 +; ; D13 \ +; ; D12 \ +; ; D11 -- Position code (0...5Ah) +; ; D10 / +; ; D9 / +; ; D8 +; ; D7..D0 - ASCII code +; ; +; ENDM ; ; - MACRO TABLE_XLAT_T - _mInfoALIGN 256,0 -; 0 1 2 3 4 5 6 7 8 9 A B C D E F -XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 - DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 - DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 - DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 - DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 - DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 - DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 - DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 - DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 - ENDM +; MACRO TABLE_XLAT_T +; _mInfoALIGN 256,0 +; ; 0 1 2 3 4 5 6 7 8 9 A B C D E F +; XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 +; DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 +; DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 +; DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 +; DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 +; DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 +; DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 +; DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 +; DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 +; ENDM ; ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 97ae971..138799a 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -432,6 +432,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ;----------------------------------------------------------------------; ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора +; [ ] fat32 SAVEDIR: XOR A LD HL,0 @@ -529,12 +530,17 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ;[ ] fat32 ;!FIXIT - LD DE,0 + XOR A + LD D,A + LD E,A LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 + LD (FatBuffer.SectorsPerFAT_H),A ; ; LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) + LD (FatBuffer.SectorsPerFAT_L),DE + ; LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs CP 1 JR Z,.loop1 @@ -751,6 +757,8 @@ FatBuffer: .FAT1_SEC_H: DW #0000 ; [ ] fat32 .FAT2_SEC_L: DW #0000 .FAT2_SEC_H: DW #0000 ; [ ] fat32 +.SectorsPerFAT_L DW #0000 +.SectorsPerFAT_H DB #00 .RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR .FilesPerSector: DB #00 ; число файловых записей в секторе diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 81d28ea..b4f8a44 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -349,22 +349,39 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ; in: HL - Cache block ; out: C:HL - logical number +; B = 0 +; [x] fat32 ;!TEST GET_SECTOR_OF_FAT: - XOR A - LD B,A - LD C,A - DUP FAT_CACHE.Degree ; 4 - ADD HL,HL ;x2 - ADC A,C - EDUP - LD C,A LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - RET NZ - ADD HL,HL ;x2 - RET NC - INC C + 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 +; GET_SECTOR_OF_FAT: +; XOR A +; LD B,A +; LD C,A +; DUP FAT_CACHE.Degree ; 4 +; ADD HL,HL ;x2 +; ADC A,C +; EDUP +; LD C,A +; LD A,(FatBuffer.FAT_TYPE) +; CP FAT_TYPE.x32 +; RET NZ +; ADD HL,HL ;x2 +; RET NC +; INC C +; RET ;;;;;;;;; @@ -385,23 +402,23 @@ READ_FAT_TABLE: PUSH HL ; CALL GET_SECTOR_OF_FAT ; + ; BC:HL - номер лог.сектора LD DE,(FatBuffer.FAT1_SEC_L) - ; BC:HL - номер лог. сектора 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: ADD HL,BC + ; JR NC,.no_inc + ; INC HL +.no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 + XOR FAT_TYPE.x32 LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE - JR NZ,.nxt + JR NZ,.next LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE -.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS +.next: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска RST ToDSS.DRV POP HL @@ -409,83 +426,121 @@ READ_FAT_TABLE: PUSH HL ; Подключить банку кеша FAT и записать его на диск -; [ ] fat32 +; [x] fat32 ;!TEST WRITE_FAT_TABLE: - SET_PAGE_X FATPAGE - PUSH AF - CALL .Start ;!TODO нет контроля ошибок - POP AF - OUT (SLOT3),A - RET - ; Запись кеша FAT-а на диск -.Start: LD HL,(FatBuffer.CacheBlock) - ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT - CALL GET_SECTOR_OF_FAT - ; BC:HL - номер лог. сектора - ; [ ] fat32 ;!FIXIT - LD B,H - LD C,L - ; [ ] fat32 - LD DE,FAT_CACHE.Sectors_16 - ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш - LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT - AND A - SBC HL,DE - JR C,.WALLFAT - ; - EX DE,HL - LD HL,FAT_CACHE.Sectors_16 - ; CF = 0 - SBC HL,DE - JR C,.ERR ;!TODO проверить - LD A,L -.WALLFAT: - LD H,B - LD L,C - PUSH HL - LD DE,(FatBuffer.FAT1_SEC_L) - LD B,A ; число секторов - LD C,Dss.DRV.Write ; запись секторов - PUSH BC - ; сохраняем первую копию FAT - CALL .SAVE_FAT_XX - ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 - LD DE,(FatBuffer.FAT2_SEC_L) - LD HL,(FatBuffer.FAT1_SEC_L) - AND A - SBC HL,DE - POP BC ; b=число секторов - POP HL - JR Z,.only_one_FAT - ; - ; сохраняем вторую копию FAT - CALL .SAVE_FAT_XX - AND A ;!TODO нет контроля ошибок -.only_one_FAT: -.ERR: LD A,0 - LD (FatBuffer.CacheUpdated),A - RET - ; -.SAVE_FAT_XX: - ADD HL,DE - EX DE,HL - ; номер лог. сектора - ;LD IX,0 - ;ADD IX,DE - LD XH,D - LD XL,E - ; - LD HL,0 ; ст. разряд - ; CF = ADD HL,DE - ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? - IF _FAT32_ENABLE - RL L - ENDIF - ;HL:IX - SECTOR OF FAT FOR SAVE - LD DE,FATPAGE.cache ; откуда - LD A,(FatBuffer.DRIVE) ; номер диска - JP ToDSS.DRV + SET_PAGE_X FATPAGE + PUSH AF + CALL .Start ;!TODO нет контроля ошибок + POP AF + OUT (SLOT3),A + RET + ; Запись кеша FAT-а на диск +.Start: LD HL,(FatBuffer.CacheBlock) + ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT + CALL GET_SECTOR_OF_FAT + ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока + ; [x] fat32 ;!FIXIT + LD (.save_hl),HL + ;LD B,H + ;LD C,L + ; + LD DE,FAT_CACHE.Sectors_32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR Z,.next + LD DE,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде + ; +.next: ADD HL,DE ;+ SIZE CASH (16 SECTORS) + JR NC,.no_inc + INC C + ; + ; C:HL смещение в секторах внутри таблицы FAT на конец блока + ; +.no_inc: ; конец блока выходит за пределы таблицы? + LD B,E ; MAX число секторов для чтения в кэш + LD A,(FatBuffer.SectorsPerFAT_H) + LD (.sub_A),A + ;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT + LD DE,(FatBuffer.SectorsPerFAT_L) + AND A + LD A,C + SBC HL,DE +.sub_A+1: SBC A,0 + JR C,.WALLFAT ; СF=1: не выходит + OR A + JR NZ,.ERR + ; + EX DE,HL + ; DE - на сколько секторов конец блока выходит за пределы таблицы. + LD HL,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде + ; CF = 0 + SBC HL,DE + ;SBC A,0 + JR C,.ERR ;!TODO проверить + LD B,L ; число секторов для чтения в кэш +.WALLFAT: ; +.save_hl+1: LD HL,0 + ;LD H,B + ;LD L,C + ;PUSH HL + ; + ; B = число секторов + LD IX,(FatBuffer.FAT1_SEC_H) + LD DE,(FatBuffer.FAT1_SEC_L) + ;LD B,A + ;LD C,Dss.DRV.Write ; запись секторов + PUSH BC + ; + ; сохраняем первую копию FAT. Вход IX:DE - начало таблицы FAT + ; C:HL - смещение внутри таблицы + ; B - количество секторов + CALL .SAVE_FAT_XX + ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 + POP BC ; B = число секторов, C = старший байт смещения в секторах + LD HL,(FatBuffer.FAT1_SEC_H) + LD DE,(FatBuffer.FAT2_SEC_H) + AND A + SBC HL,DE + JR NZ,.not_one_FAT + LD HL,(FatBuffer.FAT2_SEC_L) + LD DE,(FatBuffer.FAT1_SEC_L) + ; CF = 0 + SBC HL,DE + JR Z,.only_one_FAT + ; + ; сохраняем вторую копию FAT +.not_one_FAT: LD IX,(FatBuffer.FAT2_SEC_H) + LD DE,(FatBuffer.FAT2_SEC_L) + LD HL,(.save_hl) + CALL .SAVE_FAT_XX + AND A ;!TODO нет контроля ошибок +.only_one_FAT: ; +.ERR: LD A,0 + LD (FatBuffer.CacheUpdated),A + RET + ; Вход: IX:DE - начало таблицы FAT в секторах + ; C:HL - смещение в таблице в секторах + ; B - количество секторов +.SAVE_FAT_XX: ADD HL,DE + ;EX DE,HL + JR NC,.no_inc_C + INC C + ; номер лог. сектора +.no_inc_C: LD D,0 + LD E,C + ADD IX,DE + LD D,XH + LD E,XL + EX DE,HL + ; LD H,0 + ; LD L,C + LD XH,D + LD XL,E + ; HL:IX - смещение внутри раздела на начало нужного блока FAT + LD DE,FATPAGE.cache ; откуда + LD A,(FatBuffer.DRIVE) ; номер диска + LD C,Dss.DRV.Write + JP ToDSS.DRV ;----------------------------------------------------------------------- ;вход: HL':HL - номер кластера @@ -590,7 +645,7 @@ GET_FAT12_CELL: AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH @@ -611,7 +666,7 @@ GET_FAT12_CELL: ;NSECTOR: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR -;[ ] fat32 +;[x] fat32 ;!TEST CLUSTER_TO_SECTOR: EXX PUSH HL @@ -747,6 +802,7 @@ BLOCK_READ: PUSH BC LD C,Dss.DRV.Read RST ToDSS.DRV JR C,.Error + ; [ ] fat32 ??? POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) @@ -952,6 +1008,7 @@ BLOK_WR: PUSH BC LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV + LD A,DSS_Error.sys.WRITE_ERROR JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) @@ -999,6 +1056,7 @@ BLOK_WR: PUSH BC LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV + LD A,DSS_Error.sys.WRITE_ERROR JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) @@ -1013,11 +1071,11 @@ BLOK_WR: PUSH BC ; .Error_6: POP BC POP BC -.Error_4: POP BC + POP BC POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE .ErrorWrite: POP BC POP DE - LD A,DSS_Error.sys.WRITE_ERROR + ;LD A,DSS_Error.sys.WRITE_ERROR ;SCF RET ; @@ -1084,6 +1142,7 @@ BLOK_WR: PUSH BC ; DE - оставшееся смещение в файле в кластерах (старшее слово, D=D+1) ; BC - оставшееся смещение в файле в кластерах (младшее слово, B=B+1) ; не портит HL, HL' и DE:BC если оптимизация не сработала +;[ ] fat32 GetSavedCluster: XOR A CP (IY+_sFM.OptimizedClusters) diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index b9e4b70..290ad13 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -1,64 +1,84 @@ ;[BEGIN] -;//MODULE: KEYINTER +;//MODULE: KEYINTER Keyboard Scan Codes: Set 2 ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;------------------------------------------------ ;R02 13-04-2023 BAO FIX BUG IN K_CLEAR WITH STACK OVERFLOW ;R01 10-02-2003 DNS Add cursor visualisation ; - _mInfoALIGN 256,0 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;KEYBOARD BUFFER -SBUF: BLOCK 64,0 + _mInfoALIGN 256,0 +SBUF: BLOCK 64,0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -HEAD DB #00 -HOST DB #00 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; _mInfoALIGN 256,0 ;; +; 0 1 2 3 4 5 6 7 8 9 A B C D E F ;; +XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ;; + DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 ;; + DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 ;; + DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 ;; + DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 ;; + DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 ;; + DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 ;; + DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 ;; + DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 ;; +.Size EQU $-XLAT_T ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -K_LOCK EQU $-KEYFLAG -LANG_L EQU 7 -PAUSE_L EQU 6 -LANG_R EQU 5 ; сочетание клавиш для переключения языка отжато -LANG_S EQU 4 ; сочетание клавиш для переключения языка нажато -NUM_L EQU 3 -SCRL_L EQU 2 -INS_L EQU 1 -CAPS_L EQU 0 -KEYFLAG DB #02 ;D0-Key Pressed - -K_SHIFT EQU $-KEYFLAG -L_SHIFT EQU 7 -R_SHIFT EQU 6 -X_CTRL EQU 5 -X_ALT EQU 4 -L_CTRL EQU 3 -L_ALT EQU 2 -R_CTRL EQU 1 -R_ALT EQU 0 -KEYCTRL DB #00 - -KEYFLG EQU $-KEYFLAG -FLAG_E0 EQU 7 -FLAG_F0 EQU 6 -FLAG_E1 EQU 5 -FLAG_04 EQU 4 -FLAG_03 EQU 3 -FLAG_02 EQU 2 -FLAG_01 EQU 1 -FLAG_00 EQU 0 - DB #00 - -SOUND_K EQU $-KEYFLAG -FLAG_S7 EQU 7 -FLAG_S6 EQU 6 -FLAG_S5 EQU 5 -FLAG_S4 EQU 4 -FLAG_S3 EQU 3 -FLAG_S2 EQU 2 -SF_ALT EQU 1 -SF_BUFF EQU 0 - DB #03 -UNCODE DW 0 ; последняя отжатая клавиша +HEAD DB #00 +HOST DB #00 +; +K_LOCK EQU $-KEYFLAG +LANG_L EQU 7 +PAUSE_L EQU 6 +RES5_L EQU 5 ; not used ;X_SHIFT +RES4_L EQU 4 ; not used +NUM_L EQU 3 +SCRL_L EQU 2 +INS_L EQU 1 +CAPS_L EQU 0 +KEYFLAG DB #02 ;D0-Key Pressed +; +K_SHIFT EQU $-KEYFLAG +L_SHIFT EQU 7 +R_SHIFT EQU 6 +X_CTRL EQU 5 +X_ALT EQU 4 +L_CTRL EQU 3 +L_ALT EQU 2 +R_CTRL EQU 1 +R_ALT EQU 0 +KEYCTRL DB #00 +; +KEYFLG EQU $-KEYFLAG +FLAG_E0 EQU 7 +FLAG_F0 EQU 6 +FLAG_E1 EQU 5 +FLAG_04 EQU 4 +FLAG_03 EQU 3 +FLAG_02 EQU 2 +FLAG_01 EQU 1 +CTRL_SHIFT EQU 0 ; ctrl+shift = change language +KEY_FLG DB #00 +; +SOUND_K EQU $-KEYFLAG +FLAG_S7 EQU 7 +FLAG_S6 EQU 6 +FLAG_S5 EQU 5 +FLAG_S4 EQU 4 +FLAG_S3 EQU 3 +FLAG_S2 EQU 2 +SF_ALT EQU 1 +SF_BUFF EQU 0 + DB #03 +; +UnCODE EQU $-KEYFLAG +UNCODE DW 0 ; последняя отжатая клавиша ; D15 - LShift ; D14 - RShift @@ -69,7 +89,7 @@ UNCODE DW 0 ; ; D9 - RCTRL ; D8 - RALT ; D7 - Language Lock -; D6 - Reserved +; D6 - Pause Lock ; D5 - Reserved ; D4 - Reserved ; D3 - Num Lock @@ -188,36 +208,35 @@ ECHOKEY: CALL Cursor_On ; RET Cursor: -.Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть - CPL - LD (.Flag),A +.Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть + CPL + LD (.Flag),A ; Включить курсор -Cursor_On: LD C,BIOS.LP_GET_PLACE ; узнать полож. курсора - RST ToBIOS - LD (Cursor_Off.pos),DE - XOR A - LD C,BIOS.WIN_GET_SYM ; получить символ - RST ToBIOS - LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран - LD A,(Cursor.Flag) - OR A - JR Z,.put - LD B,CURSOR_ZG ; черта - LD A,(KEYFLAG) ; флаги клавы - ;BIT 1,A ; бит Ins - AND %0000'0010 ; бит Ins - JR NZ,.put - LD B,INS_CUR_ZG ; блок -.put: XOR A ; номер окна - RST ToBIOS - +Cursor_On: LD C,BIOS.LP_GET_PLACE ; узнать полож. курсора + RST ToBIOS + LD (Cursor_Off.pos),DE + XOR A + LD C,BIOS.WIN_GET_SYM ; получить символ + RST ToBIOS + LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран + LD A,(Cursor.Flag) + OR A + JR Z,.put_ + LD B,INS_CUR_ZG ; блок + LD A,(KEYFLAG) ; флаги клавы + AND 1< Date: Sun, 31 Mar 2024 03:33:40 +1000 Subject: [PATCH 105/219] fix --- DSS/KEYINTER.ASM | 3 ++- DSS/build.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 290ad13..05b833d 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -955,7 +955,8 @@ K_SND_R: DJNZ K_SND_W AND A RET ; subfunc 2 -K_SND_W: DJNZ K_RESET_BUFFER +K_SND_W: ;DJNZ K_RESET_BUFFER ;. [ ] 31/03/2024 subfunc 3 нужна ли? + DJNZ K_SETUP.ERROR ; LD (SOUND_K),A AND A diff --git a/DSS/build.txt b/DSS/build.txt index b7cbeb8..db8b695 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -953 \ No newline at end of file +948 \ No newline at end of file From 4fd82287e9cfa2fa866748f0568c1fa81d09abd7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Mar 2024 05:10:52 +1000 Subject: [PATCH 106/219] ... --- BOOT/boot.asm | 3 ++- DSS/API/Time.asm | 6 +++--- DSS/API/bootDsk.asm | 6 +++--- DSS/DOS_Proc.asm | 6 +++--- DSS/DSS-MAIN.ASM | 4 ++-- DSS/INTMOUSE.ASM | 4 ++-- DSS/KEYINTER.ASM | 6 ++---- DSS/Media_drivers/fdd-drv.asm | 2 +- DSS/Media_drivers/ide-drv.asm | 12 ++++++------ DSS/Media_drivers/ram_disk-drv.asm | 2 +- DSS/Procedures.asm | 2 +- SHELL/BATCH.ASM | 8 ++++---- SHELL/Commands/BREAK.ASM | 2 +- SHELL/Commands/DATE.ASM | 4 ++-- SHELL/Commands/REM.ASM | 2 +- SHELL/Messages/main_txt.asm | 2 +- SHELL/SHELL.ASM | 2 +- 17 files changed, 36 insertions(+), 37 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index e4bbec6..9f79832 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -25,7 +25,8 @@ include 'shared_includes/macroses/macros.z80' include 'shared_includes/structures/FileSystem.inc' - DEFINE EXEinfoMACRO 1 + DEFINE EXEinfoMACRO 0 + DEFINE App_EXE_Version 1 MACRO _mEXEinfo BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX BYTE ' Bootloader ' diff --git a/DSS/API/Time.asm b/DSS/API/Time.asm index d5ca9b6..5bad9af 100644 --- a/DSS/API/Time.asm +++ b/DSS/API/Time.asm @@ -123,7 +123,7 @@ SETTIME: PUSH HL PUSH DE ; - ; [ ] 25/01/2024 + ; [x] 25/01/2024 CALL CalcDayOfWeek PUSH HL ; @@ -131,7 +131,7 @@ SETTIME: RST ToBIOS JR C,.NOCMOS2 ; - ; [ ] 25/01/2024 + ; [x] 25/01/2024 POP AF LD D,CMOS.Register.dayOfWeek LD C,BIOS.CMOS_WR @@ -157,7 +157,7 @@ SETTIME: ;PUSH AF ; [ ] баг с установкой дня недели из регистра C. Нашел Hard LD D,CMOS.Register.seconds CALL WCMOS - ; [ ] баг с установкой дня недели из регистра C. Нашел Hard + ; [x] баг с установкой дня недели из регистра C. Нашел Hard ;POP BC ;LD A,C ;LD D,CMOS.Register.dayOfWeek diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index 5f33cbc..b53de93 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -26,7 +26,7 @@ BOOTDSK: .SET: LD B,H ;SET BOOT DISK LD C,0 - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD (.part),HL ; .loop: PUSH BC @@ -34,7 +34,7 @@ BOOTDSK: LD DE,#55AA LD BC,256*0 + Dss.DRV.GenIOCTL RST ToDSS.DRV - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD A,C ; номер партиции в MBR диска ; POP BC @@ -42,7 +42,7 @@ BOOTDSK: EX AF,AF' ;PHISICAL DRIVE NUMBER CP B JR NZ,.NoSupport - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого EX AF,AF' ; номер партиции в MBR диска .part+1: LD HL,0 CP L diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 9830796..f89fab1 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -219,7 +219,7 @@ OPENDSK:;!TEST DRV.Open RST ToDSS.DRV POP BC JP C,.error - ;[ ] 29/02/2024 fix "open drive error" + ;[x] 29/02/2024 fix "open drive error" LD A,(FatBuffer.DRIVE) LD D,A PUSH DE @@ -228,7 +228,7 @@ OPENDSK:;!TEST DRV.Open LD (FatBuffer.DRIVE),A ; CALL RD_BPB - ;[ ] 29/02/2024 fix "open drive error" + ;[x] 29/02/2024 fix "open drive error" POP DE LD A,D JR C,.error_disk @@ -242,7 +242,7 @@ OPENDSK:;!TEST DRV.Open RET Z LD A,DSS_Error.sys.NOT_READY RET - ;[ ] 29/02/2024 fix "open drive error" + ;[x] 29/02/2024 fix "open drive error" .error_disk: CALL OPENDSK.force LD A,(BOOTDSK.NUM) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 2f24a98..9c2a42f 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -472,7 +472,7 @@ SECBUF EQU BUFFER ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION F_START: DI - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого ;LD (.saveDRV),A LD H,A LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве @@ -509,7 +509,7 @@ F_START: DI LD (LDRIVE),A ;R05 .saveDRV+1: - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD HL,0 ; H - номер устройства, L - номер раздела на устройстве ;LD A,H ;LD A,0 diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 59575af..14ba294 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -837,7 +837,7 @@ DECY: LD A,E SENSE: LD HL,(SENSEXY) LD A,L - ; [ ] 15/03/2024 теперь поправки чувствительности по координатам работают корректно + ; [x] 15/03/2024 теперь поправки чувствительности по координатам работают корректно ;OR L ;RET Z ;DEC A @@ -863,7 +863,7 @@ SENSE: LD HL,(SENSEXY) LD B,A ; .next: LD E,B - ; [ ] 15/03/2024 теперь поправки чувствительности по координатам работают корректно + ; [x] 15/03/2024 теперь поправки чувствительности по координатам работают корректно .check_Y: LD A,H CP 2 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 05b833d..269188b 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -643,7 +643,7 @@ PAUSE_X: BIT X_CTRL,(IX+K_SHIFT) RET Z POP HL ; баланс стека LD A,(KEYFLAG) - XOR 1< Date: Mon, 1 Apr 2024 02:49:38 +1000 Subject: [PATCH 107/219] FAT_X done --- DSS/API/Close.asm | 2 +- DSS/API/Find.asm | 26 +-- DSS/API/Open.asm | 4 +- DSS/API/Write.asm | 6 +- DSS/DOS_Proc.asm | 4 +- DSS/FS/FAT/FAT.asm | 23 +- DSS/FS/FAT/FAT_X.asm | 520 +++++++++++++++---------------------------- DSS/build.txt | 2 +- 8 files changed, 214 insertions(+), 373 deletions(-) diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index fe945ee..38843d0 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -40,7 +40,7 @@ CLOSE_FN: ; SET_PAGE_X DIRPAGE ; - ;TEST 9/11/23 + ;!TEST 9/11/23 record index ; LD HL,DIR ; LD DE,#0020 ; LD C,(IY+_sFM.HANDLE) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index e6875b5..1c2c86b 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -3,26 +3,17 @@ ; C - #19 ; HL - указатель на файловую спецификацию ; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт -; ;!!!!! на самом деле пока что если B=1, рабочий буфер 46 байт ; A - атрибуты, используемые при поиске -; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" -; B = 1 - имя найденного файла в формате DOS "filename.ext",0 +; B = #00 - имя найденного файла в формате 11 байт "FilenameExt" +; B = #01 - имя найденного файла в формате DOS "filename.ext",0 +; поиск без ограничение на размер каталога: +; !TODO B = #02 - имя найденного файла в формате DOS + LFN +; !TODO B = #80 - имя найденного файла в формате 11 байт "FilenameExt" +; !TODO B = #81 - имя найденного файла в формате DOS "filename.ext",0 ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// F_FIRST: - ; Current Dir [x] 15/10/23 - ; LD C,A - ; PUSH HL - ; PUSH DE - ; PUSH BC - ; CALL DIR_PATH_CHECK - ; POP BC - ; POP DE - ; POP HL - ; RET C - ; LD A,C - ; ; LD (.TMP),A LD (.DTABUF),DE LD A,B @@ -50,7 +41,8 @@ F_FIRST: LD (DE),A .FIND_S: INC DE - LD BC,#0020 + ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes + LD BC,#0020 ;!HARDCODE размер одной записи каталога ADD IX,BC LD (F_NEXT.CURHND),IX LD HL,HANDBUF+12 ;!HARDCODE @@ -112,7 +104,7 @@ F_NEXT: EX AF,AF' CPL LD C,A - ;TEST 9/11/23 + ;!TEST 9/11/23 record index ; EXX ; LD DE,0 ; EXX diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 645f568..e69b6df 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -26,14 +26,14 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 RET C .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C - ;!TEST указатель на запись в каталоге FS + ;!TEST 9/11/23 record index PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) ;R002 ; .FM: CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' - ;!TEST указатель на запись в каталоге FS + ;!TEST 9/11/23 record index указатель на запись в каталоге FS POP DE ; EXX LD (IY+_sFM.HANDLE),E diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 163072e..fcc9d91 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -64,7 +64,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH BC .R_POINT+2: LD IX,0 - CALL BLOK_WR + CALL BLOK_WRITE POP BC JR C,.ERR3 LD C,B @@ -114,7 +114,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_WR + CALL BLOK_WRITE POP BC LD C,SLOT3 OUT (C),B @@ -192,7 +192,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_WR + CALL BLOK_WRITE POP BC LD C,SLOT3 OUT (C),B diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index f89fab1..86b816f 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -276,8 +276,8 @@ OPENDIR:;[x] some optimizations .REROOT1: LD DE,0 ;[x] some optimizations - ;LD (IY+_sFM.FIRST_CLUSTER_L),E - ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D + ; LD (IY+_sFM.FIRST_CLUSTER_L),E + ; LD (IY+_sFM.FIRST_CLUSTER_L+1),D ; [ ] fat32 EX DE,HL LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 138799a..e3c9e92 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -18,7 +18,7 @@ SEARCH: .Dir: ;LD A,FAT_ATTR.DIRECTORY LD A,FAT_ATTR.HiddenSysDir - CALL SEARCH.Custom + CALL .Custom RET NC CP DSS_Error.sys.PATH_NOT_FOUND + 1 RET C @@ -36,7 +36,9 @@ SEARCH: CPL LD C,A LD IX,DIRPAGE.buffer - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) + ;!TEST 9/11/23 record index + ; оптимизация для индекса записи в списке каталога. + ; Понадобится вернуть для перебора каталога > #4000 байт ; EXX ; LD DE,0 ; EXX @@ -67,18 +69,17 @@ SEARCH: ; LD D,XH LD E,XL - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) - EXX - ; LD D,XH - ; LD E,XL + ;!TEST 9/11/23 record index + ; EXX + ; PUSH DE + ; EXX PUSH IX - EXX ; LD HL,HANDBUF EX DE,HL LD BC,HANDBUF.SIZE LDIR - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится удалить) + ;!TEST 9/11/23 record index POP DE ; EX AF,AF' @@ -87,7 +88,7 @@ SEARCH: AND A RET .next_record: - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) + ;!TEST 9/11/23 record index ; EXX ; INC DE ; EXX @@ -96,7 +97,6 @@ SEARCH: ADD IX,DE JR NC,.loop .error_too_many_files: - ;POP AF EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR @@ -104,7 +104,6 @@ SEARCH: RET ; .error_file_not_found: - ;POP AF EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND @@ -383,7 +382,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ; ;LD IX,DIRPAGE.buffer LD HL,DIRPAGE.buffer - ;TEST 9/11/23 + ;!TEST 9/11/23 record index ; EXX ; LD DE,0 ; EXX diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index b4f8a44..e0665fb 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; FAT 12-16 +; FAT 12-16-32 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;[BEGIN] @@ -13,8 +13,8 @@ ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- +; [x] fat32 ;!TEST ; Установить начальный кластер для чтения -; [x] fat32 ;!TEST R_CLUST: LD HL,#0001 LD (G_CLUST.low),HL DEC L @@ -22,6 +22,7 @@ R_CLUST: LD HL,#0001 RET +; ; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров ; выход: HL - младший номер свободного кластера @@ -56,11 +57,12 @@ G_CLUST: ; EXX RET +; +; [x] fat32 ;!TEST ; Прикрепить к последнему кластеру цепочки новый пустой кластер ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -; [x] fat32 ;!TEST INC_FAT: PUSH HL ; текущий кластер EXX @@ -107,9 +109,9 @@ INC_FAT: ;RX01 -; вход: de = младшее слово номера кластера для сравнения с FAT_Max_Cluster -; de' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) ; [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 @@ -133,20 +135,21 @@ CHECK_CLUSTER_IS_SMALLER: EX DE,HL LD A,DSS_Error.sys.DISK_FULL RET - ; +; +; +;[x] fat32 ;!TEST ;------------------------------------------------------------------------------------------------ ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl - номер кластера (младшее слово) -; hl' - номера кластера (старшее слово. только для FAT32) +; hl' - номер кластера (старшее слово. только для FAT32) ; выход: hl - номер кластера (младшее слово) -; hl' - номера кластера (старшее слово) +; hl' - номер кластера (старшее слово) ; de - номер след. кластера (младшее слово) ; de' - номер след. кластера (старшее слово) ; если DE':DE = 0, то кластер HL':HL свободен ; CF - конец цепочки ;------------------------------------------------------------------------------------------------ -;[x] fat32 ;!TEST READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER RET C ; @@ -172,6 +175,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; проверка на служ. кластеры SBC HL,DE POP HL + ;!FIXIT fat32 перестраховка EXX LD H,A LD L,A @@ -180,6 +184,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER EXX RET ; + ; .FAT12: CALL GET_FAT12_CELL LD E,(HL) INC HL @@ -236,17 +241,20 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER LD A,B OUT (SLOT3),A RET + +; +; [x] fat32 ;!TEST ;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать ; hl' = старшее слово номера кластера в который записать (только для fat32) +; .Custom: ; de = младшее слово номера кластера которое вписать ; de' = старшее слово номера кластера которое вписать (только для fat32) ; выход: HL':HL такие же как и на входе -; .Custom: +; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -; [x] fat32 ;!TEST WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера EXX LD DE,(FatBuffer.ENDCLUS_HIGH) ; номер кластера @@ -324,12 +332,12 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; ; .FAT32: ; [x] fat32 ;!TEST EXX - PUSH DE ; старший номер кластера который вписать - PUSH HL ; старшее слово номера кластера в который записать + PUSH DE ; старший номер кластера который вписать + PUSH HL ; старшее слово номера кластера в который записать EXX CALL GET_FAT32_CELL EXX - POP HL ; старшее слово номера кластера в который записать + POP HL ; старшее слово номера кластера в который записать EXX POP DE ; старший номер кластера который вписать POP BC ; младший номер кластера который вписать @@ -346,11 +354,11 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; +; [x] fat32 ;!TEST ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ; in: HL - Cache block ; out: C:HL - logical number ; B = 0 -; [x] fat32 ;!TEST GET_SECTOR_OF_FAT: LD A,(FatBuffer.FAT_TYPE) LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную @@ -385,10 +393,10 @@ GET_SECTOR_OF_FAT: ;;;;;;;;; +; [x] fat32 ;!TEST ;RE_FAT: ;RX01 ; Прочитать в кеш ХХ секторов FAT-а -; [x] fat32 ;!TEST ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL PUSH DE @@ -425,8 +433,8 @@ READ_FAT_TABLE: PUSH HL RET -; Подключить банку кеша FAT и записать его на диск ; [x] fat32 ;!TEST +; Подключить банку кеша FAT и записать его на диск WRITE_FAT_TABLE: SET_PAGE_X FATPAGE PUSH AF @@ -543,10 +551,10 @@ WRITE_FAT_TABLE: JP ToDSS.DRV ;----------------------------------------------------------------------- -;вход: HL':HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE ; ;[x] fat32 ;!TEST +;вход: HL':HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_CELL: ; двигаем влево HL':H LD A,H @@ -572,7 +580,7 @@ GET_FAT32_CELL: LD H,A ADD HL,HL ADD HL,HL - PUSH HL ; [ ] fat32 сохраняем на случай, если READ_FAT_TABLE испортит + PUSH HL ; [ч] fat32 сохраняем на случай, если READ_FAT_TABLE испортит AND A ; EXX @@ -663,10 +671,10 @@ GET_FAT12_CELL: +;[x] fat32 ;!TEST ;NSECTOR: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR -;[x] fat32 ;!TEST CLUSTER_TO_SECTOR: EXX PUSH HL @@ -705,17 +713,16 @@ CLUSTER_TO_SECTOR: //////////////////////////////////////////////////////////////////////// - -; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 -; -;READ SECTORS OF FILE -;HL:DE - FP (in sectors) -; B - Amount sectors -; IX - buffer in RAM -; [ ] fat32 -BLOCK_READ: PUSH BC - LD (READ.PointerOnBuffer),IX +; [x] fat32 ;!TEST +; READ SECTORS OF FILE +; вход: HL:DE - FP (in sectors) +; IY - FM +; IX - buffer in RAM +; B - количество секторов для чтения +BLOCK_READ: LD (READ.PointerOnBuffer),IX LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD C,A + PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток CALL DIV_for_SPC PUSH HL ; остаток DIV_for_SPC @@ -723,16 +730,17 @@ BLOCK_READ: PUSH BC PUSH BC ; младшее слово номера кластера PUSH DE ; [x] fat32 старшее слово номера кластера ; - EXX - LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High - LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) - LD A,L - OR H - EXX - LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER Low - LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - OR L - OR H + ; EXX + ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High + ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + ; LD A,L + ; OR H + ; EXX + ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER Low + ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + ; OR L + ; OR H + CALL CHECK_FIRST_CLUSTER JR Z,.fast_exit_4 CALL GetSavedCluster ;HL': HL - известный кластер файла для отсчёта @@ -759,7 +767,7 @@ BLOCK_READ: PUSH BC JR C,.fast_exit_5 ;RY01 EX DE,HL EXX - EX DE,HL + EX DE,HL EXX .enter_loop1: INC B DEC BC ; ВС - смещение внутри файла в кластерах (младшее слово) @@ -771,28 +779,32 @@ BLOCK_READ: PUSH BC ;;;; ; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - POP DE - POP BC ; B - Amount sectors + POP DE ; [x] fat32 старшее слово номера кластера + POP BC ; младшее слово номера кластера CALL SaveGotCluster ; POP DE ; D = 0, E = остаток DIV_for_SPC - POP BC ; B = Amount sectors + POP BC ; B - количество секторов для чтения, C - SectorsPerCluster ; (SP) = (RET) ; работа с остатком от деления - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,C SUB E LD C,A - CP B - JR C,.skip1 ;SIZE > RESIDUE CLUSTER - LD C,B ;SIZE < CLUSTER + CP B ; (SectorsPerCluster - остаток) - количество секторов для чтения + JR C,.skip1 ; SIZE > RESIDUE CLUSTER + LD C,B ; SIZE < CLUSTER .skip1: LD A,B SUB C LD B,A - PUSH HL ; номер кластера младшая часть - PUSH BC - PUSH DE + ; + EXX + PUSH HL ; номер кластера старшая часть + EXX + PUSH HL ; номер кластера младшая часть + PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения + PUSH DE ; D = 0, E = остаток DIV_for_SPC CALL CLUSTER_TO_SECTOR - POP DE + POP DE ; D = 0, E = остаток DIV_for_SPC ADD IX,DE JR NC,.skip2 INC HL @@ -801,24 +813,25 @@ BLOCK_READ: PUSH BC LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV + ; JR C,.Error - ; [ ] fat32 ??? - POP BC + POP BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) ;!TEST - LD A,B - LD B,C -.loop2: ADD HL,DE - ;DEC C - ;JR NZ,.loop2 - DJNZ .loop2 - LD (READ.PointerOnBuffer),HL - POP DE - ;LD A,B - OR A - RET Z - LD B,A + LD A,B + LD B,C +.loop2: ADD HL,DE + DJNZ .loop2 + ; + LD (READ.PointerOnBuffer),HL + POP DE ; номер кластера младшая часть + EXX + POP HL ; номер кластера старшая часть + EXX + OR A + RET Z ; количество секторов на дочитку = 0? + LD B,A ; .loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B @@ -834,11 +847,17 @@ BLOCK_READ: PUSH BC ; .BLOKRD7: EX DE,HL PUSH BC + ; HL':HL - номер кластера CALL READ_FROM_FAT POP BC JR C,.ECL1 ;RY01 + ; + EXX + EX DE,HL + PUSH HL ; номер след. кластера (старшее слово) + EXX EX DE,HL - PUSH HL + PUSH HL ; номер след. кластера (младшее слово) PUSH BC CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) @@ -847,6 +866,7 @@ BLOCK_READ: PUSH BC LD C,Dss.DRV.Read RST ToDSS.DRV JR C,.Error + ; POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) @@ -854,11 +874,15 @@ BLOCK_READ: PUSH BC DEC C JR NZ,.loop3 LD (READ.PointerOnBuffer),HL - POP DE + POP DE ; номер след. кластера (младшее слово) + EXX + POP HL ; номер след. кластера (старшее слово) + EXX JP .loop4 ; .Error: POP BC POP DE + POP HL ;SCF RET ; @@ -866,34 +890,12 @@ BLOCK_READ: PUSH BC RET ;----------------------------------------------------------------------- -; BLOK_WR.Error: -; POP BC -; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -; 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), IX - data in RAM -; B - Amount sectors -; [ ] fat32 -BLOK_WR: PUSH BC - LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER - ; HL:DE / A => DE:BC, H=0, L - остаток - CALL DIV_for_SPC - PUSH HL ; остаток DIV_for_SPC - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - PUSH BC ; младшее слово номера кластера - PUSH DE ; [x] fat32 старшее слово номера кластера - ; +; [x] fat32 +; вход: IY - FM +; выход: HL':HL - first cluster +; ZF = 0 если первого кластера нет +CHECK_FIRST_CLUSTER: EXX LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) @@ -904,19 +906,48 @@ BLOK_WR: PUSH BC LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) OR L OR H + RET + +; [x] fat32 ;!TEST +; WRITE SECTORS OF FILE +; вход: HL:DE - FP (in sectors) +; IX - data in RAM +; IY - FM +; B - количество секторов для записи +BLOK_WRITE: LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD C,A + PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + PUSH HL ; остаток DIV_for_SPC + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + PUSH BC ; младшее слово номера кластера + PUSH DE ; [x] fat32 старшее слово номера кластера + ; + ; EXX + ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High + ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + ; LD A,L + ; OR H + ; EXX + ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER + ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + ; OR L + ; OR H + CALL CHECK_FIRST_CLUSTER JR NZ,.FindCluster ; PUSH BC ; младшее слово номера кластера PUSH DE ; [x] fat32 старшее слово номера кластера - ; [ ] fat32 + ; [x] fat32 CALL G_CLUST JP C,.Error_6 ; LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H - ; [ ] fat32 + ; [x] fat32 EXX - LD HL,0 ;!FIXIT LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),L ; START CLUSTER High LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H EXX @@ -949,23 +980,15 @@ BLOK_WR: PUSH BC CALL READ_FROM_FAT JR NC,.next ; end of chain - get new cluster - ; [ ] fat32 - ; PUSH HL - ; EXX - ; PUSH HL - ; EXX CALL INC_FAT - ; EXX - ; POP HL - ; EXX - ; POP HL JP C,.Error_6 + ; [x] избыточное обращение 01/04/2024 + ;CALL READ_FROM_FAT ; - CALL READ_FROM_FAT .next: POP BC EX DE,HL EXX - EX DE,HL + EX DE,HL EXX .enter_loop: INC B DEC BC @@ -981,49 +1004,58 @@ BLOK_WR: PUSH BC POP BC CALL SaveGotCluster ; - POP DE - POP BC + POP DE ; D = 0, E = остаток DIV_for_SPC + POP BC ; B - количество секторов для чтения, C - SectorsPerCluster ; (SP) = (RET) ; - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,C SUB E LD C,A - CP B - JR C,.WR3 ;SIZE > RESIDUE CLUSTER + CP B ; (SectorsPerCluster - остаток) - количество секторов для чтения + JR C,.skip1 ;SIZE > RESIDUE CLUSTER LD C,B ;SIZE < CLUSTER -.WR3: LD A,B +.skip1: LD A,B SUB C LD B,A - PUSH HL - PUSH BC - PUSH DE + ; + EXX + PUSH HL ; номер кластера старшая часть + EXX + PUSH HL ; номер кластера младшая часть + PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения + PUSH DE ; D = 0, E = остаток DIV_for_SPC CALL CLUSTER_TO_SECTOR - POP DE + POP DE ; D = 0, E = остаток DIV_for_SPC ADD IX,DE - JR NC,.WR4 + JR NC,.skip2 INC HL ; DOUBLE 1 -.WR4: LD DE,(READ.PointerOnBuffer) +.skip2: LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV - LD A,DSS_Error.sys.WRITE_ERROR - JR C,.ErrorWrite + ; + LD A,DSS_Error.sys.WRITE_ERROR + JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) ; + LD A,B + LD B,C .loop2: ADD HL,DE - DEC C - JR NZ,.loop2 + DJNZ .loop2 ; LD (READ.PointerOnBuffer),HL - POP DE + POP DE ; номер кластера младшая часть + EXX + POP HL ; номер кластера старшая часть + EXX ; - LD A,B OR A - RET Z + RET Z ; количество секторов на дочитку = 0? + LD B,A ; .big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B @@ -1036,18 +1068,24 @@ BLOK_WR: PUSH BC LD C,A OR A ;CLEAR CF RET Z + ; .WR7: EX DE,HL PUSH BC + ; HL':HL - номер кластера CALL READ_FROM_FAT JR NC,.WR9 - ;PUSH HL CALL INC_FAT - ;POP HL - JR C,.ErrorFull - ;CALL READ_FROM_FAT + JR C,.ErrorFull + ; [x] избыточное обращение 01/04/2024 + ;CALL READ_FROM_FAT + ; .WR9: POP BC + EXX + EX DE,HL + PUSH HL ; номер след. кластера (старшее слово) + EXX EX DE,HL - PUSH HL + PUSH HL ; номер след. кластера (младшее слово) PUSH BC CALL CLUSTER_TO_SECTOR ; DOUBLE 1 @@ -1056,8 +1094,8 @@ BLOK_WR: PUSH BC LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV - LD A,DSS_Error.sys.WRITE_ERROR - JR C,.ErrorWrite + LD A,DSS_Error.sys.WRITE_ERROR + JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) @@ -1065,15 +1103,17 @@ BLOK_WR: PUSH BC DEC C JR NZ,.loop3 LD (READ.PointerOnBuffer),HL - POP DE - ; + POP DE ; номер след. кластера (младшее слово) + EXX + POP HL ; номер след. кластера (старшее слово) + EXX JP .big_loop ; .Error_6: POP BC POP BC POP BC - POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -.ErrorWrite: POP BC +.Error_3: POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP BC POP DE ;LD A,DSS_Error.sys.WRITE_ERROR ;SCF @@ -1084,54 +1124,8 @@ BLOK_WR: PUSH BC ;SCF RET - -; ;GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -; ; Вход: HL - первый кластер файла (младшее слово) -; ; BC - смещение в файле в кластерах (младшее слово) -; ; Выход: HL - известный кластер файла для отсчёта (младшее слово) -; ; BC - оставшееся смещение в файле в кластерах (младшее слово) -; GetSavedCluster: -; INC B -; ;PUSH DE ; первый кластер файла (старшее слово) -; LD E,(IY+_sFM.KnownCluster_L) -; LD D,(IY+_sFM.KnownCluster_L+1) -; LD A,E -; OR D -; RET Z -; ; -; DEC B -; PUSH DE ; KnownCluster_H -; PUSH HL ; первый кластер файла (младшее слово) -; PUSH BC ; смещение в файле в кластерах -; LD E,(IY+_sFM.KnownOffset_L) -; LD D,(IY+_sFM.KnownOffset_L+1) -; LD A,D -; OR E -; JR Z,.noOptimization_3 -; ; -; POP HL ; смещение в файле в кластерах -; SBC HL,DE -; JR C,.noOptimization_2 -; LD C,L -; LD B,H -; POP DE ; баланс стека -; POP HL -; ; оптимизация: HL - не первый кластер файла, а KnownCluster -; ; BC - расстояние до требуемого смещения от KnownCluster -; ; -; INC B -; RET -; ; -; .noOptimization_3: -; POP BC -; .noOptimization_2: -; POP HL -; .noOptimization_1: -; POP DE -; INC B -; RET - - +; +;[x] fat32 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ; Вход: DE - смещение в файле в кластерах (старшее слово) ; BC - смещение в файле в кластерах (младшее слово) @@ -1142,7 +1136,6 @@ BLOK_WR: PUSH BC ; DE - оставшееся смещение в файле в кластерах (старшее слово, D=D+1) ; BC - оставшееся смещение в файле в кластерах (младшее слово, B=B+1) ; не портит HL, HL' и DE:BC если оптимизация не сработала -;[ ] fat32 GetSavedCluster: XOR A CP (IY+_sFM.OptimizedClusters) @@ -1157,7 +1150,7 @@ GetSavedCluster: ; проверка старшего слова AND A SBC HL,DE - JR C,.noOptimization_2 + JR C,.noOptimization_2 ; PUSH BC EX DE,HL @@ -1170,7 +1163,7 @@ GetSavedCluster: LD BC,0 EX DE,HL SBC HL,BC - JR C,.noOptimization_3 + JR C,.noOptimization_3 EX DE,HL LD B,H LD C,L @@ -1239,148 +1232,5 @@ SaveGotCluster: LD A,C ;LD (FatBuffer.MaxClusterLow),HL ;======================================================================= - -;FatCache: -;.Block WORD #0000 -;.Update BYTE 0 -;FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) -;FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) - ;//MODULE: FAT_X -;[END] - - -;RX01 - ;; HL - CLUSTER - ;; DE - (CLUSTER) - ; - ;READ_FROM_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,READ_FAT_TABLE - ; 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 - ; - ; - - ;WRITE_FAT_TABLE 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_SEC_L) - ; 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 - - -////////////// OLD //////////////// -; HL - CLUSTER -; HL:IX - SECTOR -; CLUSTER_TO_SECTOR: DEC HL -; DEC HL -; EX DE,HL -; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) -; LD B,A -; LD HL,0 -; LD IX,0 -; ADD_DE1: ADD IX,DE -; JR NC,ADD_DE2 -; INC HL -; ADD_DE2: DJNZ ADD_DE1 -; LD DE,(FatBuffer.FirstDataSector_L) ;first data sector -; ADD IX,DE -; LD DE,#0000 -; ADC HL,DE -; RET -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index db8b695..b7cbeb8 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -948 \ No newline at end of file +953 \ No newline at end of file From 53dbf83712ddb00e5e9edff4e897331bc391364a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 4 Apr 2024 02:12:55 +1000 Subject: [PATCH 108/219] SAVEDIR, LOADDIR, OPENDIR --- DSS/API/Read.asm | 370 ++++++++++++++++++++++----------------------- DSS/DOS_FM.ASM | 85 ++++++----- DSS/DOS_Proc.asm | 279 ++++++++++++---------------------- DSS/FS/FAT/FAT.asm | 338 ++++++++++++++++++++++++++++------------- DSS/build.txt | 2 +- 5 files changed, 551 insertions(+), 523 deletions(-) diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index 5218696..8fe813b 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -1,189 +1,185 @@ -; HL - ADDRESS -; DE - SIZE +; HL - BUFFER ADDRESS +; DE - BLOCK SIZE ; A - FM -READ: LD (.R_POINT),HL - LD (.S_POINT),HL - CALL SET_FM - RET C - CALL TSTSIZE - ; - LD A,D - OR E - JP Z,.NOREAD - ; - PUSH DE - LD A,(IY+_sFM.DRIVE) - CALL OPENDSK - JP C,.ERR_1 - ;Расчёт смещения в секторах - LD H,0 ;!HARDCODE max file size = 8 gb - LD L,(IY+_sFM.F_POSITION+3) - LD D,(IY+_sFM.F_POSITION+2) - LD E,(IY+_sFM.F_POSITION+1) - LD A,E - AND #01 - LD B,A - LD C,(IY+_sFM.F_POSITION) - ;OR A - RR L - RR D - RR E - ;HL:DE FP (in sectors) - ;BC FP residue (in bytes) - ; - OR C - JP NZ,.ROV1 -.ROV4: POP BC - PUSH BC - SRL B - JR Z,.ROV2 - LD (.SECTORH),HL - LD (.SECTORL),DE -.R_POINT+2: LD IX,0 - CALL BLOCK_READ - JP C,.ERR_1 - LD DE,(.R_POINT) +READ: LD (.R_POINT),HL + LD (.S_POINT),HL + CALL SET_FM + RET C + CALL .TEST_SIZE + ; + LD A,D + OR E + JP Z,.NOREAD + ; + PUSH DE + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JP C,.ERR_1 + ;Расчёт смещения в секторах ;!HARDCODE sectro size + LD H,0 ;!HARDCODE max file size = 8 gb + LD E,(IY+_sFM.F_POSITION+1) + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD A,E + AND #01 + LD B,A + LD C,(IY+_sFM.F_POSITION) + RR L + RR D + RR E + ;HL:DE FP (in sectors) + ;BC FP residue (in bytes) + ; + OR C + JP NZ,.ROV1 +.ROV4: POP BC + PUSH BC + SRL B + JR Z,.ROV2 + LD (.SECTORH),HL + LD (.SECTORL),DE +.R_POINT+2: LD IX,0 + CALL BLOCK_READ + JP C,.ERR_1 + LD DE,(.R_POINT) .PointerOnBuffer+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 - SRL C -.SECTORL+1: LD HL,0 // LD HL,(SECTORL) - ADD HL,BC - EX DE,HL -.SECTORH+1: LD HL,0 // LD HL,(SECTORH) - LD C,B - ADC HL,BC -.ROV2: POP BC - LD A,B - AND #01 - LD B,A - OR C - JP Z,.ROV6 - PUSH BC - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - JP C,.ERR_1 - LD HL,CORE_BUFFERS.BUFFER - LD DE,(.R_POINT) - POP BC - LDIR - 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 - EX DE,HL - LD XH,D - LD XL,E - LD HL,0 - CALL MOVE_FP.F_current - POP DE -.NOREAD: -.COD+1: LD A,0 - OR A - RET - ; -.ROV1: PUSH BC - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,.ERR_3 - ; inc HL:DE - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - ; - EXX - POP DE - LD HL,512 ;!HARDCODE sector size! - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.ROV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? -.ROV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - LDIR - LD (.R_POINT),DE - EXX - JP .ROV4 -.ERR_3: POP HL -.ERR_2: POP HL -.ERR_1: POP BC - SCF - RET - - - -TSTSIZE: - XOR A - LD (READ.COD),A - LD L,(IY+_sFM.F_POSITION) ;FP LOW - LD H,(IY+_sFM.F_POSITION+1) - ADD HL,DE - ; - EXX - ;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.FS_REC.F_SIZE) - LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW - AND A - SBC HL,BC - EXX - LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH - LD B,(IY+_sFM.FS_REC.F_SIZE+3) - SBC HL,BC - EXX - RET C ;OK READ ALL - EX DE,HL - SBC HL,DE ;VERY BIG - EX DE,HL - LD A,#FF - LD (READ.COD),A - RET \ No newline at end of file + LD HL,0 // LD HL,(READMEM) + AND A + SBC HL,DE + LD C,H + LD B,0 + ADD HL,DE + LD (.R_POINT),HL + SRL C +.SECTORL+1: LD HL,0 // LD HL,(SECTORL) + ADD HL,BC + EX DE,HL +.SECTORH+1: LD HL,0 // LD HL,(SECTORH) + LD C,B + ADC HL,BC +.ROV2: POP BC + LD A,B + AND #01 + LD B,A + OR C + JP Z,.ROV6 + PUSH BC + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + JP C,.ERR_1 + LD HL,CORE_BUFFERS.BUFFER + LD DE,(.R_POINT) + POP BC + LDIR + 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 + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + POP DE +.NOREAD: ; +.COD+1: LD A,0 + OR A + RET + ; +.ROV1: PUSH BC + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR_3 + ; inc HL:DE + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + ; + EXX + POP DE + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.ROV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? +.ROV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + LDIR + LD (.R_POINT),DE + EXX + JP .ROV4 + ; +.ERR_3: POP HL +.ERR_2: POP HL +.ERR_1: POP BC + SCF + RET + ; +.TEST_SIZE: XOR A + LD (READ.COD),A + LD L,(IY+_sFM.F_POSITION) ;FP LOW + LD H,(IY+_sFM.F_POSITION+1) + ADD HL,DE + ; + EXX + ;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.FS_REC.F_SIZE) + LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW + AND A + SBC HL,BC + EXX + LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH + LD B,(IY+_sFM.FS_REC.F_SIZE+3) + SBC HL,BC + EXX + RET C ;OK READ ALL + EX DE,HL + SBC HL,DE ;VERY BIG + EX DE,HL + LD A,#FF + LD (READ.COD),A + RET \ No newline at end of file diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 91d1f5a..3585f13 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -79,6 +79,7 @@ FM_FIND: CP FMCOUNT+1 ; A=0 OR (IY) ;+00 NAME RET + ; .error: XOR A LD A,DSS_Error.sys.INVALID_HANDLE RET @@ -145,48 +146,48 @@ GET_FM: LD IY,0 ; HL:IX - OFFSET POINTER ; A - FILE MANIPULATOR -MOVE_FP: - CALL SET_FM - RET C - INC B - DEC B - JR Z,.F_start - DEC B - JR Z,.F_current - DEC B - JR Z,.B_end - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -;from Start File -.F_start: - ; B=0 - LD C,B - LD D,B - LD E,B - JP .DO -;from End File -.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) - LD B,(IY + _sFM.FS_REC.F_SIZE+1) - LD E,(IY + _sFM.FS_REC.F_SIZE+2) - LD D,(IY + _sFM.FS_REC.F_SIZE+3) - JP .DO -;from Current Position -.F_current: - LD C,(IY+_sFM.F_POSITION) - LD B,(IY+_sFM.F_POSITION+1) - LD E,(IY+_sFM.F_POSITION+2) - LD D,(IY+_sFM.F_POSITION+3) -.DO: ADD IX,BC - ADC HL,DE - LD D,XH - LD E,XL - LD (IY+_sFM.F_POSITION),E - LD (IY+_sFM.F_POSITION+1),D - LD (IY+_sFM.F_POSITION+2),L - LD (IY+_sFM.F_POSITION+3),H - XOR A - RET +MOVE_FP: CALL SET_FM + RET C + INC B + DJNZ .B_1 + ;from Start File + ; B=0 +.F_start: LD C,B + LD D,B + LD E,B + JP .DO + ; +.B_1: DJNZ .B_2 + ;from Current Position +.F_current: LD C,(IY+_sFM.F_POSITION) + LD B,(IY+_sFM.F_POSITION+1) + LD E,(IY+_sFM.F_POSITION+2) + LD D,(IY+_sFM.F_POSITION+3) +.DO: ADD IX,BC + ADC HL,DE + LD D,XH + LD E,XL + LD (IY+_sFM.F_POSITION),E + LD (IY+_sFM.F_POSITION+1),D + LD (IY+_sFM.F_POSITION+2),L + LD (IY+_sFM.F_POSITION+3),H + XOR A + RET + ; +.B_2: DJNZ .error + ;from End File +.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) + LD B,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.FS_REC.F_SIZE+2) + LD D,(IY + _sFM.FS_REC.F_SIZE+3) + JP .DO + ; B > 2 +.error: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +;;;;;;;;; + + ;FP COMPARE ; CY - FILE POINTER > SIZE diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 86b816f..71eb2a6 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -63,116 +63,106 @@ ; DJNZ .GETN6 ; RET ;---------------;---------------;--------------- -GetName: - LD BC,#08FF ;!HARDCODE длина имени + счётчик - LD A,' ' -.loop: CP (HL) - JR Z,.skip - LDI - DJNZ .loop - ;;;; - JP .extension - ;;;; -.skip: LD C,B - LD B,0 - ; CF=0 - ADC HL,BC - ;;;; -.extension: - CP (HL) - LD A,"." - JR NZ,.copy_extension - XOR A -.copy_extension: - LD (DE),A - INC DE - RET Z ;no copy extension - ; copy extension - LD BC,#03FF ;!HARDCODE длина расширения + счётчик - LD A,' ' -.loop2: CP (HL) - JR Z,.exit - LDI - DJNZ .loop2 -.exit: XOR A - LD (DE),A - RET +GetName: LD BC,#08FF ;!HARDCODE длина имени + счётчик + LD A,' ' +.loop: CP (HL) + JR Z,.skip + LDI + DJNZ .loop + JP .extension + ; +.skip: LD C,B + LD B,0 + ; CF=0 + ADC HL,BC +.extension: CP (HL) + LD A,"." + JR NZ,.copy_ext + XOR A +.copy_ext: LD (DE),A + INC DE + RET Z ;no copy extension + ; copy extension + LD BC,#03FF ;!HARDCODE длина расширения + счётчик + LD A,' ' +.loop2: CP (HL) + JR Z,.exit + LDI + DJNZ .loop2 +.exit: XOR A + LD (DE),A + RET ;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; ; Тест на допустимое имя и настроиться на диск. ; вход: hl=строка имени ; выход: (TMPNAME) -GETWORD: - ; !TEST - INC HL - LD A,(HL) - DEC HL - CP ':' - JR NZ,.dir_loop +GETWORD: ; !TEST + INC HL + LD A,(HL) + DEC HL + CP ':' + JR NZ,.dir_loop - LD A,(HL) - CP 'a' - JR C,.next - CP 'z'+1 - JR NC,.next - SUB #20 -.next: SUB 'A' - INC HL - INC HL - PUSH HL - CALL CHNDISK - ;CALL OPENDSK - POP HL - RET C - LD A,(HL) - OR A - JR Z,.done - CP ' ' ; - JR Z,.done - CP '\' ; - SCF - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET NZ - INC HL - ; -.dir_loop: - LD DE,TMPNAME - LD BC,#0DFF - ; -.loop: LD A,(HL) - INC HL - CP '\' ; - JR Z,.DIR_NAME - ; AND A - ; JR Z,.DIR_NAME - ;CP ':' - ;JR Z,.DRV_NAME - LD (DE),A - INC DE - CP ' '+1 - CCF - RET NC - DJNZ .loop - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - ; -.done: XOR A - LD (TMPNAME),A - RET - ; -.DIR_NAME: - XOR A - LD (DE),A - PUSH HL - LD HL,TMPNAME - CALL OPENDIR - POP HL - RET C - JR .dir_loop + LD A,(HL) + CP 'a' + JR C,.next + CP 'z'+1 + JR NC,.next + SUB #20 +.next: SUB 'A' + INC HL + INC HL + PUSH HL + CALL CHNDISK + ;CALL OPENDSK + POP HL + RET C + LD A,(HL) + OR A + JR Z,.done + CP ' ' ; + JR Z,.done + CP '\' ; + SCF + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET NZ + INC HL + ; +.dir_loop: LD DE,TMPNAME + LD BC,#0DFF +.loop: LD A,(HL) + INC HL + CP '\' ; + JR Z,.DIR_NAME + ; AND A + ; JR Z,.DIR_NAME + ;CP ':' + ;JR Z,.DRV_NAME + LD (DE),A + INC DE + CP ' '+1 + CCF + RET NC + DJNZ .loop + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET + ; +.done: XOR A + LD (TMPNAME),A + RET + ; +.DIR_NAME: XOR A + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + RET C + JR .dir_loop ; .DRV_NAME: ; LD A,(TMPNAME) ; CP 'a' @@ -191,6 +181,7 @@ GETWORD: ; JR .loop ; + ; Буфер имени 8.3 формата TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам ;----------------------------------------------------------------------; @@ -262,89 +253,6 @@ OPENDSK:;!TEST DRV.Open ;----------------------------------------------------------------------; - -;----------------------------------------------------------------------; -; вход: HL - имя директории -OPENDIR:;[x] some optimizations - ;XOR A - ;CALL SET_FM - LD IY,CORE_BUFFERS.FM_BUF - ; - LD A,(HL) - OR A - JR NZ,.SUBDIR -.REROOT1: - LD DE,0 - ;[x] some optimizations - ; LD (IY+_sFM.FIRST_CLUSTER_L),E - ; LD (IY+_sFM.FIRST_CLUSTER_L+1),D - ; [ ] fat32 - EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL - EX DE,HL - ; - CALL LOADDIR - LD HL,WorkDirectory - LD (HL),'\' - INC HL - LD (HL),#00 - ; CF=0 - ;AND A - RET -.SUBDIR: - CP "." - JR NZ,.SUBDIR2 - ;!TEST ;[x] some optimizations - ;LD A,(IY+_sFM.FIRST_CLUSTER_L) ;R005 - ; [ ] fat32 - LD A,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 - ; - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) ;R005 - JR NZ,.SUDI1 ;R005 - INC HL ;R005 - LD A,(HL) ;R005 - OR A ;R005 - DEC HL ;R005 - JR Z,.REROOT1 ;R005 -.SUDI1: EXX - LD HL,MASKARE - LD DE,MASKARE+1 - LD BC,10 ;!HARDCODE - LD (HL),' ' - LDIR - EXX - LD DE,MASKARE -.loop: LDI - LD A,(HL) - OR A - JR NZ,.loop - JR .SUBDIR3 -.SUBDIR2: - CALL MASK.name - RET C -.SUBDIR3: - CALL FINDDIR - RET C - ;!TEST ;[x] some optimizations - ;LD (IY+_sFM.FIRST_CLUSTER_L),E - ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D - ;LD DE,#4000 ;!HARDCODE - ;LD (IY+_sFM.F_SIZE),E - ;LD (IY+_sFM.F_SIZE+1),D - EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32 - LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL - EX DE,HL - ; - JP LOADDIR - ; CF=0 - ;AND A - ;RET -;----------------------------------------------------------------------; - - - ;----------------------------------------------------------------------; ; Преобразовать имя 8.3 -> 11 формат ; вход: hl = 8.3 имя @@ -528,7 +436,6 @@ DIR_PATH_CHECK: LD A,(HL) ;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; CHECK_NAME: LD HL,MASKARE diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index e3c9e92..0e758b9 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -170,6 +170,8 @@ SEARCH: ;----------------------------------------------------------------------; ; FIND "MASKAREA" IN DIRECTORY +; [ ] fat32 +; выход: IY:DE - cluster number FINDDIR: SET_PAGE_X DIRPAGE ; @@ -237,7 +239,8 @@ FINDDIR: OUT (SLOT3),A LD A,DSS_Error.sys.PATH_NOT_FOUND SCF - RET + RET + ; .ADDSPEC: LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 @@ -290,8 +293,12 @@ FINDDIR: ; ; JP IT_DIR ; .IT_DIR: ; [ ] fat32 + LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD YH,D + LD YL,E LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) - LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) POP AF OUT (SLOT3),A AND A @@ -316,67 +323,233 @@ FINDDIR: RET ;----------------------------------------------------------------------; +CHECK_ZERO_CLUSTER: + EX DE,HL + LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 + LD A,L + OR H + LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H) + OR L + OR H + EX DE,HL + RET + + + +;----------------------------------------------------------------------; +; вход: HL - имя директории +; [x] fat32 +OPENDIR: LD IY,CORE_BUFFERS.FM_BUF + LD A,(HL) + OR A + JR NZ,.SUBDIR +.REROOT: ; fat32 + EX DE,HL + LD HL,(FatBuffer.RootDirStartCluster_L) + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + LD HL,(FatBuffer.RootDirStartCluster_H) + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL + EX DE,HL + CALL LOADDIR + ; CF=0 + LD HL,WorkDirectory + LD (HL),'\' + INC HL + LD (HL),#00 + ;AND A + RET + ; +.SUBDIR: CP "." + JR NZ,.SUBDIR2 + ; fat32 + CALL CHECK_ZERO_CLUSTER + JR NZ,.no_root ;R005 + ; "cd ." or "cd .." + ;R005 + INC HL + LD A,(HL) + OR A + DEC HL + JR Z,.REROOT + ; +.no_root: EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 ;!HARDCODE + LD (HL),' ' + LDIR + EXX + LD DE,MASKARE +.loop: LDI + LD A,(HL) + OR A + JR NZ,.loop + JR .SUBDIR3 + ; +.SUBDIR2: CALL MASK.name + RET C + ; fat32 +.SUBDIR3: CALL FINDDIR + RET C + EX DE,HL + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32 + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; [ ] fat32 + LD HL,#4000 ;!HARDCODE + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL + ;EX DE,HL + JP LOADDIR +;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; Прочитать список каталога -LOADDIR: - XOR A - LD H,A - LD L,A - LD IX,0 - LD B,A ; от начала файла - CALL MOVE_FP +; [x] fat32 ;!TEST +LOADDIR: ;!TODO optimize + ; XOR A ; FILE MANIPULATOR = 0 + ; LD H,A + ; LD L,A + ; LD IX,0 + ; LD B,A ; от начала файла + ; CALL MOVE_FP + ; ; + ; SET_PAGE_X DIRPAGE + ; AND A + ; PUSH AF + ; ;!TEST no ldir + ; ; очистить кеш каталога + ; ; LD HL,#C000 + ; ; LD DE,#C001 + ; ; LD BC,#3FFF + ; ; LD (HL),L + ; ; LDIR + ; ; + ; LD A,(FatBuffer.DRIVE) ; номер диска + ; LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор + ; ; номер первого кластера + ; ; [x] fat32 + ; LD A,(FatBuffer.FAT_TYPE) + ; XOR 32 + ; JR Z,.read_dir + ; ;!FIXIT переделать на работу без IY + ; LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + ; OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + CALL LOAD_SAVE_DIR_PREPARE + PUSH AF + EX AF,AF' + JR Z,.LoadRootDir +.read_dir: LD HL,DIRPAGE.buffer ; куда + LD DE,#4000 ; сколько + XOR A ; дескриптор + CALL READ ; чтение из файла + LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов + POP AF + OUT (SLOT3),A + RET + ; +.LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд + LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(FatBuffer.DirSizeInSectors) + LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога + CP B + JR NC,.RTD1 + LD B,A ; число секторов +.RTD1: LD A,(FatBuffer.DRIVE) ; номер диска + LD DE,DIRPAGE.buffer ; буфер + LD C,Dss.DRV.Read ; чтение секторов + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + RET +;----------------------------------------------------------------------; - SET_PAGE_X DIRPAGE - AND A - PUSH AF - ;!TEST no ldir - ; очистить кеш каталога - ; LD HL,#C000 - ; LD DE,#C001 - ; LD BC,#3FFF - ; LD (HL),L - ; LDIR - ; - LD A,(FatBuffer.DRIVE) ; номер диска - LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор - ; номер первого кластера - ; [ ] fat32 - LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - JP Z,.LoadRootDir - ; - LD HL,DIRPAGE.buffer ; куда - LD DE,#4000 ; сколько - XOR A ; дескриптор - CALL READ ; чтение из файла - LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов - POP AF - OUT (SLOT3),A - RET -.LoadRootDir: - LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд - LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(FatBuffer.DirSizeInSectors) - LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога - CP B - JR NC,.RTD1 - LD B,A ; число секторов -.RTD1: LD A,(FatBuffer.DRIVE) ; номер диска - LD DE,DIRPAGE.buffer ; буфер - LD C,Dss.DRV.Read ; чтение секторов - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - RET +LOAD_SAVE_DIR_PREPARE: + ;!TODO optimize + XOR A ; FILE MANIPULATOR = 0 + LD H,A + LD L,A + LD IX,0 + LD B,A ; от начала файла + CALL MOVE_FP + ; + SET_PAGE_X DIRPAGE + AND A + EX AF,AF' + ; + LD A,(FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + ; [x] fat32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 - 1 + JR NC,.exit + ;!FIXIT переделать на работу без IY + LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) +.exit: EX AF,AF' + RET + +;!TODO FAT procedures +;----------------------------------------------------------------------; +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +; [x] fat32 ;!TEST +SAVEDIR: ;!TODO optimize + ; XOR A ; FILE MANIPULATOR = 0 + ; LD H,A + ; LD L,A + ; LD IX,0 + ; LD B,A ; от начала файла + ; CALL MOVE_FP + ; ; + ; SET_PAGE_X DIRPAGE + ; AND A + ; PUSH AF + ; ; + ; LD A,(FatBuffer.DRIVE) + ; LD (IY+_sFM.DRIVE),A + ; ; [x] fat32 + ; LD A,(FatBuffer.FAT_TYPE) + ; XOR 32 + ; JR Z,.save_dir + ; ;!FIXIT переделать на работу без IY + ; LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + ; OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + CALL LOAD_SAVE_DIR_PREPARE + PUSH AF + EX AF,AF' + JR Z,.SaveRootDir +.save_dir: LD HL,DIRPAGE.buffer + ; размер списка каталога size_cash_directory + ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) + ; когда будет чтение кусками каталога в кэш, тут ещё счётчик прикрутить +.DIRSIZE+1: LD DE,0 + XOR A + CALL WRITE + POP AF + OUT (SLOT3),A + RET + ; +.SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) + LD IX,(FatBuffer.RootDirFirstSector_L) + LD A,(FatBuffer.DirSizeInSectors) + LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors + SUB B + JR NC,.RTD1S + ADD A,B + LD B,A +.RTD1S: LD A,(FatBuffer.DRIVE) + LD DE,DIRPAGE.buffer + LD C,Dss.DRV.Write + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + RET ;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; -; скопировать запись в список диска (каталога) +; скопировать запись в список диска (каталога) de ix iy ; и сбросить кеш каталога на диск +; вход: (HANDBUF) - запись каталога WRT_HND: SET_PAGE_X DIRPAGE EX AF,AF' ; @@ -396,7 +569,7 @@ WRT_HND: SET_PAGE_X DIRPAGE JR Z,.WRT_HN2 ;ADD IX,BC ADD HL,BC - JR NC,.loop + JR NC,.loop ;!FIXIT количество записей каталога = страница ; EX AF,AF' OUT (SLOT3),A @@ -427,59 +600,6 @@ WRT_HND: SET_PAGE_X DIRPAGE JP SAVEDIR ;----------------------------------------------------------------------; -;!TODO FAT procedures -;----------------------------------------------------------------------; -; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -; [ ] fat32 -SAVEDIR: - XOR A - LD HL,0 - LD IX,0 - LD B,0 - CALL MOVE_FP - ; - SET_PAGE_X DIRPAGE - PUSH AF - ; - LD A,(FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - ;[ ] fat32 - LD D,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - LD E,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - LD A,D - OR E - JP Z,.SaveRootDir - LD HL,DIRPAGE.buffer -; размер списка каталога size_cash_directory -;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) -.DIRSIZE+1: - LD DE,0 - XOR A - CALL WRITE - POP AF - OUT (SLOT3),A - AND A - RET -.SaveRootDir: - LD HL,(FatBuffer.RootDirFirstSector_H) - LD IX,(FatBuffer.RootDirFirstSector_L) - LD A,(FatBuffer.DirSizeInSectors) - LD B,32 ;!HARDCODE sector size 512 - SUB B - JR NC,.RTD1S - ADD A,B - LD B,A -.RTD1S: LD A,(FatBuffer.DRIVE) - LD DE,DIRPAGE.buffer - LD C,Dss.DRV.Write - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - AND A - RET -;----------------------------------------------------------------------; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; не используется @@ -490,7 +610,9 @@ SAVEDIR: ; OR A ; RET Z + ; рег. D - номер диска +; [ ] fat32 RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC @@ -534,6 +656,8 @@ RD_BPB: LD C,SLOT3 LD E,A LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 + LD (FatBuffer.RootDirStartCluster_L),DE + LD (FatBuffer.RootDirStartCluster_H),DE LD (FatBuffer.SectorsPerFAT_H),A ; ; diff --git a/DSS/build.txt b/DSS/build.txt index b7cbeb8..1307450 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -953 \ No newline at end of file +956 \ No newline at end of file From ada25b0fe1cc87e8f2deea8f7bcfa1ee5b9622f1 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 6 Apr 2024 04:27:47 +1000 Subject: [PATCH 109/219] =?UTF-8?q?fat32=20-=2080%=20(=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=8D=D1=82=D0=BE=20=D0=BD=D0=B5=20=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Attribute.asm | 70 +++---- DSS/API/Close.asm | 21 ++- DSS/API/Create.asm | 198 ++++++++++---------- DSS/API/Delete.asm | 39 +++- DSS/API/Execute.ASM | 4 +- DSS/API/Lib_Sub.asm | 4 +- DSS/API/MkDir.asm | 393 +++++++++++++++++++++------------------- DSS/API/Open.asm | 143 ++++++++------- DSS/API/Read.asm | 37 ++-- DSS/API/RmDir.asm | 235 +++++++++++++----------- DSS/API/SetDateTime.asm | 1 + DSS/API/Write.asm | 380 +++++++++++++++++++------------------- DSS/API/diskINF.asm | 1 + DSS/DOS_FM.ASM | 1 - DSS/DOS_Proc.asm | 3 - DSS/DSS-MAIN.ASM | 4 +- DSS/FS/FAT/FAT.asm | 10 +- DSS/FS/FAT/FAT_X.asm | 46 ++++- DSS/Structures.inc | 28 +-- DSS/build.txt | 2 +- 20 files changed, 866 insertions(+), 754 deletions(-) diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 2ecbc1b..2ae2501 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -6,41 +6,41 @@ ; B = #01 SET ATTRIB ; OUTPUT: A - ATTRIB //////////////////////////////////////////////////////////////////////// -ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 - LD C,A - PUSH HL - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - ; - INC B - DEC B - JP Z,.READ - DEC B - JP Z,.WRITE_FN - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -.READ: ;!TEST ;[x] 16/11/23 optimize get attribute - ;XOR A - ; - CALL .OPENATR ;R002 - RET C - ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) - ;LD B,(IY+_sFM.ATTRIBUT) - ;PUSH BC - ;CALL CLOSE - ;POP BC - ;RET C - ;LD A,B - ; - RET - ; +ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + ; + INC B + DJNZ .B_1 + ; B = 0 +.READ: ;!TEST ;[x] 16/11/23 optimize get attribute + ;XOR A + ; + CALL .OPENATR ;R002 + RET C + ;!TEST ;[x] 16/11/23 optimize get attribute + LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + ;LD B,(IY+_sFM.ATTRIBUT) + ;PUSH BC + ;CALL CLOSE + ;POP BC + ;RET C + ;LD A,B + ; + RET + ; +.error_fn: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET + ; +.B_1: DJNZ .error_fn .WRITE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID .WRITE: PUSH AF diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 38843d0..a881cb1 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ;Входные значения: ; C - #12 @@ -18,18 +19,30 @@ CLOSE_FN: RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) JR Z,.NOTMODF - LD E,(IY+_sFM.DIR_CLUSTER) - LD D,(IY+_sFM.DIR_CLUSTER+1) + LD E,(IY+_sFM.DIR_CLUSTER_L) + LD D,(IY+_sFM.DIR_CLUSTER_L+1) PUSH DE + ; [x] fat32 + LD E,(IY+_sFM.DIR_CLUSTER_H) + LD D,(IY+_sFM.DIR_CLUSTER_H+1) + PUSH DE + ; ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD A,(IY+_sFM.DRIVE) CALL OPENDSK ; XOR A CALL SET_FM + ; [x] fat32 POP DE - LD (IY+_sFM.DIR_CLUSTER),E - LD (IY+_sFM.DIR_CLUSTER+1),D + LD (IY+_sFM.DIR_CLUSTER_H),E + LD (IY+_sFM.DIR_CLUSTER_H+1),D + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D + ; + POP DE + LD (IY+_sFM.DIR_CLUSTER_L),E + LD (IY+_sFM.DIR_CLUSTER_L+1),D ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 2bdefac..c4b1b21 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -3,111 +3,99 @@ ; A - File attribute ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - LD C,A - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - CALL .Prepare - RET C - CALL SEARCH.File - ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 - ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT - CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT - CP DSS_Error.sys.FILE_NOT_FOUND - JR Z,.DO - SCF - RET +CREATE: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + LD C,A + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL .Prepare + RET C + CALL SEARCH.File + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT + CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT + CP DSS_Error.sys.FILE_NOT_FOUND + JR Z,.DO + SCF + RET .FILE_EXISTS_DEL: - CALL DEL_FN.DELETE - LD A,DSS_Error.sys.FILE_NOT_FOUND - RET - ; - ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 - ; OUTPUT: A - FM -.NEW: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - LD C,A - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - CALL .Prepare - RET C - CALL SEARCH.File - ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 - ; LD A,DSS_Error.sys.FILE_EXISTS - ; CCF - ; RET C - JR NC,.FILE_EXISTS - CP DSS_Error.sys.FILE_NOT_FOUND - SCF - RET NZ - ; - ; - ;no_file_found -.DO: LD HL,MASKARE - LD DE,HANDBUF - LD BC,11 - LDIR - EX DE,HL -.TMP+1: LD A,0 - LD (HL),A - INC HL - LD BC,#0A00 ;!HARDCODE - ; -.loop1: LD (HL),C - INC HL - DJNZ .loop1 - ;AaRR - PUSH HL - CALL SYSTIME - CALL MK_TIME - POP HL - LD (HL),E - INC HL - LD (HL),D - INC HL - LD (HL),C - INC HL - LD (HL),B - INC HL - LD BC,#0600 - ; -.loop2: LD (HL),C - INC HL - DJNZ .loop2 - ; - CALL WRT_HND - RET C - ;CALL SAVEDIR -.PATH0+1: - LD HL,0 - XOR A - LD (OPEN_FN.TMP),A - JP OPEN_FN.FILE ;R008 -.Prepare: - ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE - AND FAT_ATTR.NoDIRnoVolID - LD (.TMP),A - LD (.PATH0),HL - CALL GETWORD - RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE - JP MASK - ; + CALL DEL_FN.DELETE + LD A,DSS_Error.sys.FILE_NOT_FOUND + RET + ; + ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 + ; OUTPUT: A - FM +.NEW: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + LD C,A + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL .Prepare + RET C + CALL SEARCH.File + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.FILE_EXISTS + ; CCF + ; RET C + JR NC,.FILE_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ + ; + ; + ;no_file_found +.DO: LD HL,MASKARE + LD DE,HANDBUF + LD BC,11 + LDIR + EX DE,HL +.TMP+1: LD A,0 + LD (HL),A + INC HL + LD BC,#0A00 ;!HARDCODE + ; +.loop1: LD (HL),C + INC HL + DJNZ .loop1 + ;AaRR + CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD + ; + LD BC,#0600 + ; +.loop2: LD (HL),C + INC HL + DJNZ .loop2 + ; + CALL WRT_HND + RET C + ;CALL SAVEDIR +.PATH0+1: LD HL,0 + XOR A + LD (OPEN_FN.TMP),A + JP OPEN_FN.FILE ;R008 + ; +.Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE + AND FAT_ATTR.NoDIRnoVolID + LD (.TMP),A + LD (.PATH0),HL + CALL GETWORD + RET C + ; LD HL,TMPNAME + ; LD DE,MASKARE + JP MASK + ; ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 -.FILE_EXISTS: - LD A,DSS_Error.sys.FILE_EXISTS - CCF - RET +.FILE_EXISTS: LD A,DSS_Error.sys.FILE_EXISTS + CCF + RET ; \ No newline at end of file diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index cb8c85d..13aaefe 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// @@ -27,26 +28,46 @@ DEL_FN: ;!TEST CALL SEARCH.File RET C ; пометить запись как "удаленная" +;!TODO record index. возможно, что может сломаться, если больше страницы .DELETE: SET_PAGE_X DIRPAGE + EX AF,AF' LD (IX + _sFAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла - ; [ ] fat32 - LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - ; - OUT (SLOT3),A + ; fat32 + LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD A,E OR D - JP Z,SAVEDIR ; сбросить кеш каталога на диск + EXX + LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + OR D + OR E + ; + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + JP Z,SAVEDIR ; сбросить кеш каталога на диск + ; если размер файла не ноль .loop: EX DE,HL ; hl=номер кластера + EXX + EX DE,HL + EXX CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера - PUSH DE ; номер след. кластера - PUSH AF + EXX + PUSH DE ; номер след. кластера + PUSH AF + LD DE,#0000 ; номер кластера + EXX + PUSH DE LD DE,#0000 ; номер кластера CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера POP AF POP DE + EXX + POP DE + EXX JP NC,.loop - CALL WRITE_FAT_TABLE ;!FIXIT может не нужна тут? Там дальше будет + CALL WRITE_FAT_TABLE JP SAVEDIR ; сбросить кеш каталога на диск ; \ No newline at end of file diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index fa52f6e..8cc11c1 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -266,13 +266,13 @@ ERREXE: PUSH AF _mDECTASK POP AF RET - ; + ;!TODO сравнить с EXEC02 PRELOAD: EX DE,HL LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD A,D AND #3F LD D,A - ADC HL,DE + ADD HL,DE XOR A SLA H RLA diff --git a/DSS/API/Lib_Sub.asm b/DSS/API/Lib_Sub.asm index faaeac5..48bb066 100644 --- a/DSS/API/Lib_Sub.asm +++ b/DSS/API/Lib_Sub.asm @@ -3,11 +3,11 @@ ; B = 1 Вызов функции SETUP_CURSORS для восстановления системных шрифтов DSS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LIB_SUB: - DJNZ 1F + DJNZ .B_2 ; func B = 1 JP SETUP_CURSORS ; -1: ; func B > 1 or 0 +.B_2: ; func B > 1 or 0 SCF RET ; diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index fe08e0d..6f55c51 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; @@ -6,196 +7,206 @@ ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// +MKDIR: ;error -MKDIR.DIR_EXISTS: - LD A,DSS_Error.sys.DIR_EXISTS - CCF - RET - - -MKDIR: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL .START - PUSH AF - LD HL,CurrentDirectory - CALL CHDIR - POP AF - RET - ; -.START: CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - ;LD HL,TMPNAME ; 8.3 имя - ;LD DE,MASKARE ; буфер имени 11 симв. формата - CALL MASK ; преобр. имя 8.3 -> 11 формат - RET C - ;!TEST optimization ранее GETWORD уже загрузил директорию - ;CALL LOADDIR ; прочитать список каталога - ; - CALL SEARCH.Dir ; поиск записи каталога в списке диска - ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 - ; LD A,DSS_Error.sys.DIR_EXISTS - ; CCF - ; RET C ; каталог найден - JR NC,.DIR_EXISTS - CP DSS_Error.sys.FILE_NOT_FOUND - SCF - RET NZ - ; - CALL G_CLUST - RET C - ; [x] fat32 - PUSH HL ; младший номер сектора - EXX - PUSH HL ; старший номер сектора - EXX - ; - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - LD HL,MASKARE - LD DE,HANDBUF - LD BC,11 - LDIR - EX DE,HL - LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога - ; _sFAT_DIRECTORY_RECORD.ATTRIBUT - LD (HL),A - INC HL - LD BC,#0800 ; b=счетчик - ; -.loop1: LD (HL),C - INC HL - DJNZ .loop1 - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H - ; [x] fat32 запись старшего номера кластера .FIRST_CLUSTER_H - POP DE - PUSH DE ; старший номер сектора - LD (HL),E - INC HL - LD (HL),D - INC HL - ; [ ] fat32 & VFAT - PUSH HL - CALL SYSTIME ; узнать тек. дату и время - CALL MK_TIME ; закодировать время/дату - POP HL - ; _sFAT_DIRECTORY_RECORD.TIME - LD (HL),E ; de=время - INC HL - LD (HL),D - INC HL - ; _sFAT_DIRECTORY_RECORD.DATE - LD (HL),C ; день - INC HL - LD (HL),B ; месяц - INC HL - ; запись младшего номера кластера .FIRST_CLUSTER_L - POP BC ; старший номер сектора - POP DE ; младший номер сектора - PUSH DE - PUSH BC - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L - LD (HL),E - INC HL - LD (HL),D - INC HL - ; _sFAT_DIRECTORY_RECORD.F_SIZE - LD BC,#0400 ; b=счетчик -.loop2: LD (HL),C - INC HL - DJNZ .loop2 - ; - CALL WRT_HND ; скопир. новую запись в список диска (каталога) - ;CALL SAVEDIR ; и сбросить кеш каталога на диск - LD HL,CORE_BUFFERS.SECBUF ; буфер - LD (HL),"." ; запись тек. каталога - LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел - ; -.loop3: INC HL - LD (HL),C - DJNZ .loop3 - ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD - INC HL - LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла - EX DE,HL - LD BC,21 - LDIR - EX DE,HL - LD (HL),"." ; запись родит. каталога - INC HL - LD (HL),"." - LD BC,9*256 + ' ' ; b=счетчик, c=пробел -.MKD03: INC HL - LD (HL),C - DJNZ .MKD03 - ; - INC HL - SET_PAGE_X DIRPAGE - PUSH AF - ; - LD A,(DIRPAGE.buffer) - CP "." - LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи - JP Z,.MKD04 - LD IX,HANDBUF - XOR A - ; [ ] fat32 разобраться - LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A - LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A - LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла -.MKD04: EX DE,HL - LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 - LDIR - POP AF - OUT (SLOT3),A - ; - EX DE,HL - LD D,H - LD E,L - INC DE - LD (HL),0 - LD BC,512-65 ;!HARDCODE - LDIR - ; - POP HL ; старший номер сектора - EXX - POP HL ; младший номер сектора - CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер -.MKD12: PUSH AF - PUSH HL ; ст. разряд - PUSH IX ; номер лог. сектора - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - ; - LD A,(FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Write - RST ToDSS.DRV - ; - POP AF - OUT (SLOT3),A - ; - LD HL,CORE_BUFFERS.SECBUF - LD DE,CORE_BUFFERS.SECBUF+1 - LD BC,511 - LD (HL),0 - LDIR - ; - POP IX - POP HL - INC IX - LD A,XH - OR XL - JR NZ,.MKD11 - INC HL -.MKD11 POP AF - DEC A - JR NZ,.MKD12 - AND A - RET +.DIR_EXISTS: LD A,DSS_Error.sys.DIR_EXISTS + CCF + RET + ; +; Entry point ;!TEST Current Dir ;[x] 15/10/23 +.B: PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + POP AF + RET + ; +.START: CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + ;LD HL,TMPNAME ; 8.3 имя + ;LD DE,MASKARE ; буфер имени 11 симв. формата + CALL MASK ; преобр. имя 8.3 -> 11 формат + RET C + ;!TEST optimization ранее GETWORD уже загрузил директорию + ;CALL LOADDIR ; прочитать список каталога + ; + CALL SEARCH.Dir ; поиск записи каталога в списке диска + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.DIR_EXISTS + ; CCF + ; RET C ; каталог найден + JR NC,.DIR_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ + ; + CALL G_CLUST + RET C + ; fat32 + PUSH HL ; младший номер сектора + EXX + PUSH HL ; старший номер сектора + EXX + ; + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + LD HL,MASKARE + LD DE,HANDBUF + LD BC,11 + LDIR + EX DE,HL + LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога + ; _sFAT_DIRECTORY_RECORD.ATTRIBUT + LD (HL),A + INC HL + LD BC,#0800 ; b=счетчик + ; +.loop1: LD (HL),C + INC HL + DJNZ .loop1 + ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H + ; fat32 запись старшего номера кластера .FIRST_CLUSTER_H + POP DE + PUSH DE ; старший номер сектора + LD (HL),E + INC HL + LD (HL),D + INC HL + ; + CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD + ; запись младшего номера кластера .FIRST_CLUSTER_L + POP BC ; старший номер сектора + POP DE ; младший номер сектора + PUSH DE + PUSH BC + ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L + LD (HL),E + INC HL + LD (HL),D + INC HL + ; _sFAT_DIRECTORY_RECORD.F_SIZE + LD BC,#0400 ; b=счетчик +.loop2: LD (HL),C + INC HL + DJNZ .loop2 + ; + CALL WRT_HND ; скопир. новую запись в список диска (каталога) + ;CALL SAVEDIR ; и сбросить кеш каталога на диск + ; + ; создаём служебные каталоги "." и ".." в созданном каталоге + ; КАТАЛОГ "." + LD HL,CORE_BUFFERS.SECBUF ; буфер + LD (HL),"." ; запись тек. каталога + LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел + ; +.loop3: INC HL + LD (HL),C + DJNZ .loop3 + ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD + INC HL + LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + EX DE,HL + LD BC,21 ; !HARDCODE + LDIR + ; КАТАЛОГ ".." + EX DE,HL + LD (HL),"." ; запись родит. каталога + INC HL + LD (HL),"." + LD BC,9*256 + ' ' ; b=счетчик, c=пробел +.loop4: INC HL + LD (HL),C + DJNZ .loop4 + ; + INC HL + SET_PAGE_X DIRPAGE + PUSH AF + ; + LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи + ; + LD A,(DIRPAGE.buffer) + CP "." + JR Z,.copy_dir_record + ; fat32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.fat16_root_dir + ; fat 32 + EX DE,HL + LD HL,(FatBuffer.RootDirStartCluster_L) + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL + LD HL,(FatBuffer.RootDirStartCluster_H) + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL + EX DE,HL + JR .set_rec + ; +.fat16_root_dir:; fat 12/16 + ;LD IX,HANDBUF + XOR A + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A +.set_rec: LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла +.copy_dir_record: + EX DE,HL + LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 + LDIR + POP AF + OUT (SLOT3),A + ; + EX DE,HL + LD D,H + LD E,L + INC DE + LD (HL),0 + LD BC,512-65 ;!HARDCODE + LDIR + ; + POP HL ; старший номер сектора + EXX + POP HL ; младший номер сектора + CALL CLUSTER_TO_SECTOR + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер +.MKD12: PUSH AF + PUSH HL ; ст. разряд + PUSH IX ; номер лог. сектора + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + ; + LD A,(FatBuffer.DRIVE) + LD DE,CORE_BUFFERS.SECBUF+#C000 + LD BC,1*256 + Dss.DRV.Write + RST ToDSS.DRV + ; + POP AF + OUT (SLOT3),A + ; + LD HL,CORE_BUFFERS.SECBUF + ; [x] optimization + LD A,(HL) + OR A + JR Z,.skip_clean + ; + LD DE,CORE_BUFFERS.SECBUF+1 + LD BC,511 ;!HARDCODE + LD (HL),0 + LDIR +.skip_clean: ; + POP IX + POP HL + INC IX + LD A,XH + OR XL + JR NZ,.MKD11 + INC HL +.MKD11 POP AF + DEC A + JR NZ,.MKD12 + AND A + RET ; \ No newline at end of file diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index e69b6df..40864dc 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; @@ -11,71 +12,79 @@ ; выход: CF=0, A - дескриптор файла. ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// -OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 - LD (.TMP),A - PUSH HL - CALL DIR_PATH_CHECK.forceCheck - POP HL - RET C - ;JR .start - ;!FIXIT сделать как в mkdir или rmdir? -;R008 ; -.start: CALL GETWORD - RET C - CALL MASK - RET C -.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE - RET C - ;!TEST 9/11/23 record index - PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) -;R002 ; -.FM: CALL GET_FM ; enter point from ATTRIB - RET C - LD A,C - EX AF,AF' - ;!TEST 9/11/23 record index указатель на запись в каталоге FS - POP DE - ; EXX - LD (IY+_sFM.HANDLE),E - LD (IY+_sFM.HANDLE+1),D - ; EXX - ; - LD D,YH - LD E,YL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR -.TMP+1: LD A,0 - LD (IY+_sFM.ACCESS_MODE),A - LD A,(TASK) - LD (IY+_sFM.TASK_NUM),A - XOR A - LD (IY+_sFM.KnownCluster_L),A - LD (IY+_sFM.KnownCluster_L+1),A - LD (IY+_sFM.KnownOffset_L),A - LD (IY+_sFM.KnownOffset_L+1),A - LD (IY+_sFM.OptimizedClusters),A - ; [x] fat32 - LD (IY+_sFM.KnownCluster_H),A - LD (IY+_sFM.KnownCluster_H+1),A - LD (IY+_sFM.KnownOffset_H),A - LD (IY+_sFM.KnownOffset_H+1),A - ; - LD (IY+_sFM.F_POSITION),A - LD (IY+_sFM.F_POSITION+1),A - LD (IY+_sFM.F_POSITION+2),A - LD (IY+_sFM.F_POSITION+3),A - LD A,(FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - ; [ ] fat32 - LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L - LD E,(HL) - INC HL - LD D,(HL) - ; [ ] fat32 - LD (IY+_sFM.DIR_CLUSTER),E - LD (IY+_sFM.DIR_CLUSTER+1),D - EX AF,AF' - AND A - RET +OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 + ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO + LD (.TMP),A + PUSH HL + CALL DIR_PATH_CHECK.forceCheck + POP HL + RET C + ;JR .start + ;!FIXIT сделать как в mkdir или rmdir? +;R008 ; +.start: CALL GETWORD + RET C + CALL MASK + RET C +.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE + RET C + ;!TEST 9/11/23 record index + PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) +;R002 ; +.FM: CALL GET_FM ; enter point from ATTRIB + RET C + LD A,C + EX AF,AF' + ;!TEST 9/11/23 record index указатель на запись в каталоге FS + POP DE + ; EXX + LD (IY+_sFM.HANDLE),E + LD (IY+_sFM.HANDLE+1),D + ; EXX + ; + LD D,YH + LD E,YL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR +.TMP+1: LD A,0 + LD (IY+_sFM.ACCESS_MODE),A + LD A,(TASK) + LD (IY+_sFM.TASK_NUM),A + XOR A + LD (IY+_sFM.OptimizedClusters),A + LD (IY+_sFM.KnownCluster_L),A + LD (IY+_sFM.KnownCluster_L+1),A + LD (IY+_sFM.KnownOffset_L),A + LD (IY+_sFM.KnownOffset_L+1),A + ; fat32 + LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownCluster_H+1),A + LD (IY+_sFM.KnownOffset_H),A + LD (IY+_sFM.KnownOffset_H+1),A + ; + LD (IY+_sFM.F_POSITION),A + LD (IY+_sFM.F_POSITION+1),A + LD (IY+_sFM.F_POSITION+2),A + LD (IY+_sFM.F_POSITION+3),A + LD A,(FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + ; fat32 + LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+_sFM.DIR_CLUSTER_H),E + LD (IY+_sFM.DIR_CLUSTER_H+1),D + ; + LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+_sFM.DIR_CLUSTER_L),E + LD (IY+_sFM.DIR_CLUSTER_L+1),D + ; + EX AF,AF' + AND A + RET ; \ No newline at end of file diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index 8fe813b..77cd97b 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -15,22 +15,23 @@ READ: LD (.R_POINT),HL LD A,(IY+_sFM.DRIVE) CALL OPENDSK JP C,.ERR_1 - ;Расчёт смещения в секторах ;!HARDCODE sectro size - LD H,0 ;!HARDCODE max file size = 8 gb - LD E,(IY+_sFM.F_POSITION+1) - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD A,E - AND #01 - LD B,A - LD C,(IY+_sFM.F_POSITION) - RR L - RR D - RR E - ;HL:DE FP (in sectors) - ;BC FP residue (in bytes) - ; - OR C + CALL GET_OFFSET_IN_SECTORS + ; ;Расчёт смещения в секторах ;!HARDCODE sector size + ; LD H,0 ;!HARDCODE max file size = 8 gb + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD C,(IY+_sFM.F_POSITION) + ; RR L + ; RR D + ; RR E + ; ;HL:DE FP (in sectors) + ; ;BC FP residue (in bytes) + ; ; + ; OR C JP NZ,.ROV1 .ROV4: POP BC PUSH BC @@ -145,9 +146,9 @@ READ: LD (.R_POINT),HL JP .ROV4 ; .ERR_3: POP HL -.ERR_2: POP HL + POP HL .ERR_1: POP BC - SCF + ;SCF RET ; .TEST_SIZE: XOR A diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index e91ad9e..3bcacfa 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. @@ -7,112 +8,132 @@ ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// -RMDIR: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL .START - PUSH AF - LD HL,CurrentDirectory - CALL CHDIR - CALL DIR_PATH_CHANGE.Current - POP AF - RET - ; -.START: CALL GETWORD - RET C - CALL MASK - RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - CALL LOADDIR - CALL SEARCH.Dir - RET C - ; [ ] fat32 - LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) - PUSH IX -.RMD17: PUSH HL - CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - ; начинаем вычитывать содержимое каталога посекторно -.read_dir_loop: - PUSH AF - PUSH HL - PUSH IX - ; - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Read - LD A,(FatBuffer.DRIVE) - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - ; - ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора - LD B,16 - LD HL,CORE_BUFFERS.SECBUF +RMDIR: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + CALL DIR_PATH_CHANGE.Current + POP AF + RET + ; +.START: CALL GETWORD + RET C + CALL MASK + RET C + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + CALL LOADDIR + CALL SEARCH.Dir + RET C + ; fat32 + LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + EXX + LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы + ; + ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах +.read_dir_big_loop: + PUSH HL + EXX + PUSH HL + EXX + CALL CLUSTER_TO_SECTOR + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD B,A + LD C,Dss.DRV.Read + ; начинаем вычитывать содержимое каталога посекторно +.read_dir_loop: ;PUSH AF + PUSH BC + PUSH HL + PUSH IX + ; + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + LD DE,CORE_BUFFERS.SECBUF+#C000 + ;LD BC,1*256 + Dss.DRV.Read + LD B,1 + LD A,(FatBuffer.DRIVE) + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + ; + ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + LD B,16 + LD HL,CORE_BUFFERS.SECBUF .check_dir_loop: - LD A,(HL) - OR A - JP Z,.RMD15 ;DIR EMPTY - CP "." - JR Z,.next_record - CP #E5 ;!HARDCODE байт удаления файла - JR Z,.next_record - LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов - ADD HL,DE - LD A,(HL) - SBC HL,DE - AND FAT_ATTR.VOLUME_ID - JP Z,.error ;DIR NOT EMPTY -.next_record: - LD DE,#0020 - ADD HL,DE - DJNZ .check_dir_loop - ; - POP IX - POP HL - INC IX - LD A,XH - OR XL - JR NZ,.no_inc_hl - INC HL -.no_inc_hl: - POP AF - DEC A - JR NZ,.read_dir_loop - ; [ ] fat32 - POP HL ; номер кластера - CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера - EX DE,HL ; hl=номер след. кластера - JR NC,.RMD17 ; не конец цепочки -.delete: - POP IX - JP DEL_FN.DELETE ; пометить запись как "удаленная" -.RMD15: POP IX - POP HL - POP AF - POP HL - JR .delete - ; -.error: POP IX - POP HL - POP AF - POP HL - POP IX - LD A,DSS_Error.sys.DIR_NOT_EMPTY - SCF - RET + LD A,(HL) + OR A + JP Z,.RMD15 ;DIR EMPTY + CP "." + JR Z,.next_record + CP #E5 ;!HARDCODE байт удаления файла + JR Z,.next_record + LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов + ADD HL,DE + LD A,(HL) + SBC HL,DE + AND FAT_ATTR.VOLUME_ID + JP Z,.error ;DIR NOT EMPTY +.next_record: LD DE,#0020 + ADD HL,DE + DJNZ .check_dir_loop + ; + POP IX + POP HL + INC IX + LD A,XH + OR XL + JR NZ,.no_inc_hl + INC HL +.no_inc_hl: ; POP AF + ; DEC A + ; JR NZ,.read_dir_loop + POP BC + DJNZ .read_dir_loop + ; fat32 + EXX + POP HL ; номер кластера + EXX + POP HL ; номер кластера + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера + EX DE,HL ; hl=номер след. кластера + EXX + EX DE,HL ; hl=номер след. кластера + EXX + JR NC,.read_dir_big_loop ; не конец цепочки + ; +.delete: POP IX + JP DEL_FN.DELETE ; пометить запись как "удаленная" + ; +.RMD15: POP HL + POP HL + POP HL + POP HL + POP HL + JR .delete + ; +.error: POP HL + POP HL + POP HL + POP HL + POP HL + POP HL + LD A,DSS_Error.sys.DIR_NOT_EMPTY + SCF + RET ; \ No newline at end of file diff --git a/DSS/API/SetDateTime.asm b/DSS/API/SetDateTime.asm index 4da4a74..38aab39 100644 --- a/DSS/API/SetDateTime.asm +++ b/DSS/API/SetDateTime.asm @@ -20,6 +20,7 @@ PUT_D_T: POP BC POP DE RET C + ; [ ] VFAT LD (IY + _sFM.FS_REC.TIME),E LD (IY + _sFM.FS_REC.TIME+1),D LD (IY + _sFM.FS_REC.DATE),C diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index fcc9d91..9a886b3 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -15,194 +15,194 @@ WRITE.RD_ONLY: ; HL - ADDRESS ; DE - SIZE ; A - FM -WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE - CALL .Start - PUSH AF - LD A,(FatBuffer.CacheUpdated) - OR A - CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - POP AF - RET - ; -.Start: LD (.R_POINT),HL - LD (.S_POINT),HL - PUSH DE - CALL SET_FM - JR C,.ERR1 - LD A,(IY+_sFM.ACCESS_MODE) - AND FAT_ATTR.READ_ONLY - JR NZ,.RD_ONLY - SET 7,(IY + _sFM.ACCESS_MODE) - SET 5,(IY + _sFM.FS_REC.ATTRIBUT) - LD A,(IY + _sFM.DRIVE) - CALL OPENDSK - JR C,.ERR1 - ; - LD C,(IY+_sFM.F_POSITION) - LD A,(IY+_sFM.F_POSITION+1) - LD E,A - AND #01 - LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A - RR L - RR D - RR E - ; HL:DE - FP (in sectors) - ; BC - FP residue (in bytes) - LD A,B - OR C - JP NZ,.WOV1 -.WOV4: POP BC - PUSH BC - SRL B - JR Z,.WOV2 - PUSH HL - PUSH DE - PUSH BC -.R_POINT+2: - LD IX,0 - CALL BLOK_WRITE - POP BC - JR C,.ERR3 - LD C,B - 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 - LD A,B - AND #01 - LD B,A - OR C - JR Z,.WOV6 - PUSH HL - PUSH DE - PUSH BC - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - LD DE,CORE_BUFFERS.BUFFER - LD HL,(.R_POINT) - POP BC - JP C,.ERR2 - LDIR - LD (.R_POINT),HL - POP DE - POP HL - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_WRITE - POP BC - LD C,SLOT3 - OUT (C),B - RET C -.WOV6: LD HL,(.R_POINT) -.S_POINT+1: LD DE,0 - ; CF=0 - ;AND A - SBC HL,DE - PUSH HL - EX DE,HL - LD XH,D - LD XL,E - LD HL,0 - CALL MOVE_FP.F_current - CALL MOVE_CP - POP DE - 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.FS_REC.F_SIZE+0),L - LD (IY + _sFM.FS_REC.F_SIZE+1),H - LD (IY + _sFM.FS_REC.F_SIZE+2),C - LD (IY + _sFM.FS_REC.F_SIZE+3),B - AND A - RET - ; -.WOV1: PUSH BC - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - POP DE - POP HL - EXX - POP DE - JP C,.ERR1 - LD HL,512 ;!HARDCODE sector size! - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.WOV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 -.WOV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - EX DE,HL - LDIR - LD (.R_POINT),HL - EXX - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_WRITE - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,.ERR2 - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - JP .WOV4 +WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE + CALL .Start + PUSH AF + LD A,(FatBuffer.CacheUpdated) + OR A + CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + POP AF + RET + ; +.Start: LD (.R_POINT),HL + LD (.S_POINT),HL + PUSH DE + CALL SET_FM + JR C,.ERR1 + LD A,(IY+_sFM.ACCESS_MODE) + AND Dss.Open.R + JR NZ,.RD_ONLY + SET 7,(IY + _sFM.ACCESS_MODE) + SET 5,(IY + _sFM.FS_REC.ATTRIBUT) + LD A,(IY + _sFM.DRIVE) + CALL OPENDSK + JR C,.ERR1 + CALL GET_OFFSET_IN_SECTORS + ; ;Расчёт смещения в секторах ;!HARDCODE sector size + ; LD H,0 ;!HARDCODE max file size = 8 gb + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD C,(IY+_sFM.F_POSITION) + ; RR L + ; RR D + ; RR E + ; ;HL:DE FP (in sectors) + ; ;BC FP residue (in bytes) + ; ; + ; OR C + JP NZ,.WOV1 + ; +.WOV4: POP BC + PUSH BC + SRL B + JR Z,.WOV2 + PUSH HL + PUSH DE + PUSH BC +.R_POINT+2: LD IX,0 + CALL BLOK_WRITE + POP BC + JR C,.ERR3 + LD C,B + 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 + LD A,B + AND #01 + LD B,A + OR C + JR Z,.WOV6 + PUSH HL + PUSH DE + PUSH BC + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + LD DE,CORE_BUFFERS.BUFFER + LD HL,(.R_POINT) + POP BC + JP C,.ERR2 + LDIR + LD (.R_POINT),HL + POP DE + POP HL + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WRITE + POP BC + LD C,SLOT3 + OUT (C),B + RET C +.WOV6: LD HL,(.R_POINT) +.S_POINT+1: LD DE,0 + ; CF=0 + ;AND A + SBC HL,DE + PUSH HL + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + CALL MOVE_CP + POP DE + 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.FS_REC.F_SIZE+0),L + LD (IY + _sFM.FS_REC.F_SIZE+1),H + LD (IY + _sFM.FS_REC.F_SIZE+2),C + LD (IY + _sFM.FS_REC.F_SIZE+3),B + AND A + RET + ; +.WOV1: PUSH BC + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + POP DE + POP HL + EXX + POP DE + JP C,.ERR1 + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.WOV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +.WOV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + EX DE,HL + LDIR + LD (.R_POINT),HL + EXX + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WRITE + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR2 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + JP .WOV4 ; \ No newline at end of file diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 05ebab6..1967ee6 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -131,6 +131,7 @@ DISKINF:; [ ] 22/11/23 LD HL,2 LD BC,0 .FRESP: PUSH BC + ; [ ] fat32 CALL READ_FROM_FAT POP BC CP DSS_Error.sys.DISK_FULL diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 3585f13..693bf5e 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -94,7 +94,6 @@ SET_FM: CALL FM_FIND XOR A ;LD A,DSS_Error.sys.NO_ERROR ; CF = 0 RET - RES_FM: CALL FM_FIND diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 71eb2a6..db4128c 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -446,6 +446,3 @@ CHECK_NAME: SCF RET ;----------------------------------------------------------------------; - - - diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 9c2a42f..417f7ba 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -297,7 +297,7 @@ ADRST10: ;DS 512 ;,0 ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B @@ -324,7 +324,7 @@ ADRST10: ;DS 512 ;,0 ;...............................................[HIGH ADDRESS]: DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN + DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 0e758b9..8370fe9 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -170,7 +170,7 @@ SEARCH: ;----------------------------------------------------------------------; ; FIND "MASKAREA" IN DIRECTORY -; [ ] fat32 +; [x] fat32 ;!TEST ; выход: IY:DE - cluster number FINDDIR: SET_PAGE_X DIRPAGE @@ -292,7 +292,7 @@ FINDDIR: ; .MM3: LD (HL),0 ; ; JP IT_DIR ; -.IT_DIR: ; [ ] fat32 +.IT_DIR:; fat32 LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD YH,D @@ -338,7 +338,7 @@ CHECK_ZERO_CLUSTER: ;----------------------------------------------------------------------; ; вход: HL - имя директории -; [x] fat32 +; [x] fat32 ;!TEST OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD A,(HL) OR A @@ -392,8 +392,8 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF .SUBDIR3: CALL FINDDIR RET C EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32 - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; [ ] fat32 + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; fat32 + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; fat32 LD HL,#4000 ;!HARDCODE LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL ;EX DE,HL diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index e0665fb..8d29b55 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -610,7 +610,7 @@ GET_FAT16_CELL: AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH @@ -1220,6 +1220,50 @@ SaveGotCluster: LD A,C RET //////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------; +; Вход: HL - адрес куда писать +; Выход: HL - адрес следующий после записаного +WRITE_DATE_TIME_TO_DIRECTORY_RECORD: + ; [ ] fat32 & VFAT date + PUSH HL + CALL SYSTIME ; узнать тек. дату и время + CALL MK_TIME ; закодировать время/дату + POP HL + ; _sFAT_DIRECTORY_RECORD.TIME + LD (HL),E ; de=время + INC HL + LD (HL),D + INC HL + ; _sFAT_DIRECTORY_RECORD.DATE + LD (HL),C ; день + INC HL + LD (HL),B ; месяц + INC HL + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +;Расчёт смещения в секторах ;!HARDCODE sector size +GET_OFFSET_IN_SECTORS: + LD H,0 ;!HARDCODE max file size = 8 gb + LD E,(IY+_sFM.F_POSITION+1) + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD A,E + AND #01 + LD B,A + LD C,(IY+_sFM.F_POSITION) + RR L + RR D + RR E + ;HL:DE FP (in sectors) + ;BC FP residue (in bytes) + ; + OR C + RET +;----------------------------------------------------------------------; + ;!TODO fat32 ;======================================================================= diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 3934e8c..ca9cbe3 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -35,22 +35,28 @@ ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED ; .TIME: WORD #0000 ;+ #16 +22 TIME ; .DATE: WORD #0000 ;+ #18 +24 DATE -; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ;!TODO fat32 +; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE .FS_REC: _sFAT_DIRECTORY_RECORD ; from Core .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 -.OptimizedClusters BYTE #00 ;+ #2B +43 -.KnownCluster_L: WORD #0000 ;+ #2C +44 Младшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: WORD #0000 ;+ #2E +46 Старшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: WORD #0000 ;+ #30 +48 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: WORD #0000 ;+ #32 +50 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.DIR_CLUSTER_L: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW +.DIR_CLUSTER_H: WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32 +.HANDLE: WORD #0000 ;+ #28 +40 HANDLE NUMBER +.DRIVE: BYTE #00 ;+ #2A +42 DRIVE OR CURRENT +.ACCESS_MODE: BYTE #00 ;+ #2B +43 ACCESS MODE +.TASK_NUM: BYTE #00 ;+ #2C +44 TASK +.OptimizedClusters BYTE #00 ;+ #2D +45 +.KnownCluster_L: WORD #0000 ;+ #2E +46 Младшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: WORD #0000 ;+ #30 +48 Старшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS +;ACCESS MODE: A=0 чтение/запись +; A=1 чтение +; A=2 запись +; ;!TODO A=3 запись без лишних сохранений кэша FAT +; ;!TODO A=4 записать кэш FAT ; ; diff --git a/DSS/build.txt b/DSS/build.txt index 1307450..397787a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -956 \ No newline at end of file +949 \ No newline at end of file From 8448dbef48e76a446a68c9c4b68bb5613f31b36d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 7 Apr 2024 05:28:29 +1000 Subject: [PATCH 110/219] 82% --- DSS/API/diskINF.asm | 294 ++++++++++++++++++++++++------------------- DSS/FS/FAT/FAT.asm | 30 +++-- DSS/FS/FAT/FAT_X.asm | 2 +- 3 files changed, 183 insertions(+), 143 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 1967ee6..d710756 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -5,8 +5,9 @@ ; ; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий) ; При A bit7 = 1: -; HL - буфер (256 байтов) для расширенных данных: -; B != 0 - считать свободное место +; A and #7F - номер диска +; HL - буфер (256 байтов) для расширенных данных: +; B != 0 - считать свободное место ; ; ; размер поля - 1 байт ; Файловая система @@ -23,134 +24,167 @@ ; размер поля - 1 байт ; зарезервировано ; ; - -; A and #7F - номер диска -; -; выход: A - размер кластера в секторах, если CF=0 -; HL - общее кол-во кластеров -; DE - свободных кластеров -; BC - размер сектора в байтах -; A - код ошибки, если CF=1 +; выход: CF=0: +; A - размер кластера в секторах +; HL':HL - общее кол-во кластеров +; DE':DE - свободных кластеров +; BC - размер сектора в байтах +; CF=1: +; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// -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 - AND %0111'1111 - PUSH HL - PUSH AF - CALL .CustomDisk - POP IX - JR C,.error - ; - EX (SP),HL - PUSH DE - PUSH AF - PUSH BC - ;;;; - ; - EX DE,HL - LD HL,CORE_BUFFERS.BootSector.ID_FAT - LD A,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length - CALL .mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER - LD A,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER - CALL .mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_LABEL - LD A,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL - CALL .mCOPY_LOOP - ; - PUSH DE - LD A,XH - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - POP DE - JR C,.error_drv - LD A,2 ;!HARDCODE длина поля №4 2 байта: физ номер диска, номер раздела диска - LD (DE),A - INC DE - EX AF,AF' - LD (DE),A ;физ номер диска - INC DE - LD A,C - LD (DE),A ;номер раздела диска - INC DE - ; -.error_drv: - XOR A - LD (DE),A - ;;;; - POP BC - POP AF - POP DE -.error: POP HL - RET - ; - - ;CP #FF ; !FIXIT WorkDirectory - ;!TEST Current Dir - ;JR Z,CURRDS ;R06 -.CurrentDisk: - LD A,(CurrentPath) - SUB 'A' - LD HL,FatBuffer.DRIVE - CP (HL) - JR Z,.CheckFreeSpace - ; -.CustomDisk: - PUSH BC - CALL CHNDISK ;R06 - POP BC - RET C - ; +DISKINF: LD C,B + LD B,1 + ; + CP #80 + JR C,.CustomDisk + CP #FF + JR Z,.CurrentDisk + ; more info + LD B,C + AND %0111'1111 + PUSH HL + PUSH AF + CALL .CustomDisk + POP IX + JR C,.error + ; + EX (SP),HL + PUSH DE + PUSH AF + PUSH BC + ;;;; + ; + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + ; + EX DE,HL + LD HL,CORE_BUFFERS.BootSector.ID_FAT + JR NZ,1F + LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.ID_FAT +1: LD C,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + CALL .mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER + JR NZ,1F + LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_SERIAL_NUMBER +1: LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER + CALL .mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_LABEL + JR NZ,1F + LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_LABEL +1: LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL + CALL .mCOPY_LOOP + ; fat32 + EXX + PUSH DE + PUSH HL + EXX + PUSH DE + LD A,XH + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + POP DE + ; fat32 + EXX + POP HL + POP DE + EXX + JR C,.error_drv + LD A,2 ;!HARDCODE длина поля №4 2 байта: физ номер диска, номер раздела диска + LD (DE),A + INC DE + EX AF,AF' + LD (DE),A ;физ номер диска + INC DE + LD A,C + LD (DE),A ;номер раздела диска + INC DE + ; +.error_drv: XOR A + LD (DE),A + ;;;; + POP BC + POP AF + POP DE +.error: POP HL + RET + ; + CP #FF ; !FIXIT WorkDirectory + ;!TEST Current Dir + ;JR Z,CURRDS ;R06 +.CurrentDisk: LD A,(CurrentPath) + SUB 'A' + LD HL,FatBuffer.DRIVE + CP (HL) + JR Z,.CheckFreeSpace + ; +.CustomDisk: PUSH BC + CALL CHNDISK ;R06 + POP BC + RET C + ; .CheckFreeSpace: - XOR A - OR B - CALL NZ,.CURRDS - ; - ;.FRESP2: - LD D,B - LD E,C - LD HL,(FatBuffer.MaxClusterLow) - DEC HL - LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - AND A - RET - ; -.CURRDS: - LD HL,2 - LD BC,0 -.FRESP: PUSH BC - ; [ ] fat32 - CALL READ_FROM_FAT - POP BC - CP DSS_Error.sys.DISK_FULL - RET Z - - LD A,E - OR D - JR NZ,.skip - INC BC -.skip: INC HL - JP .FRESP - ; - ; [ ] 22/11/23 подфункция с доп.инфой -.mCOPY_LOOP: - LD C,A - LD B,0 - LD (DE),A - INC DE - LDIR - RET - ; + XOR A + OR B + CALL NZ,.GetFreeSpace + ; + ;.FRESP2: + LD D,B + LD E,C + LD HL,(FatBuffer.MaxClusterLow) + DEC HL + ; fat 32 + EXX + LD HL,(FatBuffer.MaxClusterHigh) + DEC HL + EXX + LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + AND A + RET + ; +.GetFreeSpace: XOR A + LD HL,2 ; [ ] fat32 ? номер кластера от которого считать + ; fat32 + EXX + LD H,A + LD L,A + EXX + LD B,A + LD C,A +.loop_free_space: + PUSH BC + CALL READ_FROM_FAT + POP BC + CP DSS_Error.sys.DISK_FULL + RET Z + ; fat 32 + EXX + LD A,E + OR D + EXX + OR E + OR D + JR NZ,.skip + INC BC + LD A,B + OR C + JR NZ,.skip + EXX + INC BC + EXX +.skip: INC HL + JR .loop_free_space + ; + ; [ ] 22/11/23 подфункция с доп.инфой +.mCOPY_LOOP: LD B,0 + EX DE,HL + LD (HL),C + EX DE,HL + INC DE + LDIR + RET + ; ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 8370fe9..56dd5cc 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -690,7 +690,9 @@ RD_BPB: LD C,SLOT3 LD C,A LD B,0 ; BC - File handels in sectors ;;;; - LD (FatBuffer.FilesPerSector),A + IF COMPILE_UNUSED_CODE + LD (FatBuffer.FilesPerSector),A + ENDIF ; EX DE,HL LD HL,(CORE_BUFFERS.BootSector.FilesInRootDIR) ; 0 for fat32 @@ -723,15 +725,17 @@ RD_BPB: LD C,SLOT3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - EX DE,HL - LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize - XOR A + IF COMPILE_UNUSED_CODE + EX DE,HL + LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize + XOR A ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -.loop4: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,DE - JR NC,.loop4 - LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) +.loop4: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,DE + JR NC,.loop4 + LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) + ENDIF ; ;!TODO detect fat type by clusters! ;[ ] fat32 reset fat32 variables @@ -873,7 +877,6 @@ FatBuffer: .CacheBlock: DW #00 .CacheUpdated: DB #00 ;.SectorsPerBank: DB #00 -.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? .RootDirStartCluster_L: DW #0000 .RootDirStartCluster_H: DW #0000 ; [ ] fat32 .FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) @@ -884,15 +887,18 @@ FatBuffer: .SectorsPerFAT_H DB #00 .RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR -.FilesPerSector: DB #00 ; число файловых записей в секторе .DirSizeInSectors: DB #00 ; DIR_SEC_SIZE .FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low -.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ; [ ] fat32 +.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига .BytesPerCluster: DW #0000 ; CLUSTER_LEN .ENDCLUS_LOW: DW #FFFF .ENDCLUS_HIGH: DW #0FFF ; [ ] fat3 .MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) .MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) + IF COMPILE_UNUSED_CODE +.FilesPerSector: DB #00 ; число файловых записей в секторе +.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? + ENDIF ;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? ; diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 8d29b55..cc2fe84 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1224,7 +1224,7 @@ SaveGotCluster: LD A,C ; Вход: HL - адрес куда писать ; Выход: HL - адрес следующий после записаного WRITE_DATE_TIME_TO_DIRECTORY_RECORD: - ; [ ] fat32 & VFAT date + ; [ ] VFAT date PUSH HL CALL SYSTIME ; узнать тек. дату и время CALL MK_TIME ; закодировать время/дату From 9b975b7a8891ebde0a5efafcefe797cd09af95c8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 13 Apr 2024 02:17:04 +1000 Subject: [PATCH 111/219] temp --- DSS/API.asm | 2 - DSS/API/diskINF.asm | 43 +-- DSS/DOS_Proc.asm | 11 - DSS/DSS-MAIN.ASM | 15 +- DSS/FS/FAT/FAT.asm | 526 ++++++++++++++++++---------------- DSS/FS/FAT/FAT_X.asm | 4 +- DSS/Media_drivers/ide-drv.asm | 1 + DSS/Structures.inc | 14 +- DSS/build.txt | 2 +- DSS/defines.inc | 6 +- 10 files changed, 317 insertions(+), 307 deletions(-) diff --git a/DSS/API.asm b/DSS/API.asm index 05e1e45..7c49cd2 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -21,8 +21,6 @@ ;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES ;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT ;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES -;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION -;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;R001 16-12-1999 DNS Y2K fix ;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS ;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index d710756..9914621 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -36,7 +36,7 @@ DISKINF: LD C,B LD B,1 ; CP #80 - JR C,.CustomDisk + JP C,.CustomDisk CP #FF JR Z,.CurrentDisk ; more info @@ -54,26 +54,31 @@ DISKINF: LD C,B PUSH BC ;;;; ; - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - ; EX DE,HL - LD HL,CORE_BUFFERS.BootSector.ID_FAT - JR NZ,1F - LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.ID_FAT -1: LD C,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + LD HL,FAT_STRING +1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + CALL .mCOPY_LOOP + ; 12, 16 or 32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x16 + JR C,.next_prm + ; + PUSH DE + DEC DE + LD A,'6' + JR Z,.put_char + ; fat 32 + DEC DE + LD A,'3' +.put_char: LD (DE),A + POP DE + ; +.next_prm: LD HL,FatBuffer.BPB_SERIAL_NUMBER + LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; - LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER - JR NZ,1F - LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_SERIAL_NUMBER -1: LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER - CALL .mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_LABEL - JR NZ,1F - LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_LABEL -1: LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL + LD HL,FatBuffer.BPB_LABEL + LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; fat32 EXX @@ -187,4 +192,4 @@ DISKINF: LD C,B LDIR RET ; -; +FAT_STRING: DB 'FAT12' diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index db4128c..a2bb9e3 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -20,17 +20,6 @@ ;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" ;--------------------------------------------------------------- -;[BEGIN] -;//MODULE: FAT_X -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;RX01 10-02-1999 DNS UPGRADE FAT CASH -;--------------------------------------------------------------- - - ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 417f7ba..fa82eb8 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -405,7 +405,7 @@ BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size -BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector +BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector разной длины EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer @@ -414,12 +414,13 @@ SECBUF EQU BUFFER ;!TODO CLEAR_ZONE.size EQU _sBuffers ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" - ;DISPLAY "--- --- --- --- --- --- --- ---" - ;DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector - ;DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector - ;DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF - ;DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector - ;DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector + DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector + DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF + DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "--- --- --- --- --- --- --- ---" /* diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 56dd5cc..95976eb 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -5,9 +5,9 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;RX01 10-02-1999 DNS UPGRADE FAT CASH +;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION +;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;--------------------------------------------------------------- - ;----------------------------------------------------------------------; ; Поиск записи каталога в списке каталога ; @@ -69,7 +69,7 @@ SEARCH: ; LD D,XH LD E,XL - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index ; EXX ; PUSH DE ; EXX @@ -79,7 +79,7 @@ SEARCH: EX DE,HL LD BC,HANDBUF.SIZE LDIR - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index POP DE ; EX AF,AF' @@ -88,7 +88,7 @@ SEARCH: AND A RET .next_record: - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index ; EXX ; INC DE ; EXX @@ -555,7 +555,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ; ;LD IX,DIRPAGE.buffer LD HL,DIRPAGE.buffer - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index ; EXX ; LD DE,0 ; EXX @@ -611,267 +611,278 @@ WRT_HND: SET_PAGE_X DIRPAGE ; RET Z -; рег. D - номер диска +; рег. A - номер диска ; [ ] fat32 -RD_BPB: LD C,SLOT3 - IN B,(C) - PUSH BC - IN A,(SLOT0) - OUT (SLOT3),A - LD A,(FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 - LD C,Dss.DRV.GetBPB - RST ToDSS.DRV - POP BC - OUT (C),B - JP C,DOS_X_Error.Not_ready +RD_BPB: LD C,SLOT3 + IN B,(C) + PUSH BC + IN A,(SLOT0) + OUT (SLOT3),A + LD A,(FatBuffer.DRIVE) + LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 + LD C,Dss.DRV.GetBPB + RST ToDSS.DRV + POP BC + OUT (C),B + JP C,DOS_X_Error.Not_ready + ; + LD DE,#AA55 ; сигнатура ;R05 + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + ;R05 + AND A + SBC HL,DE + JP NZ,DOS_X_Error.UnknownBPB + ; + ; ;R08 ; [x] fat32 + ; LD HL,CORE_BUFFERS.SECBUF + ; LD DE,CORE_BUFFERS.BootSector + ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size + ; LDIR + ; + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + JP C,DOS_X_Error.UnknownBPB + ; calc. first sector FAT + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) + ; + ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec + ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) + ; ADD HL,DE + ; + ;!FIXIT для fat32 втыкать сюда сектора активной таблицы + LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ;[ ] fat32 + XOR A + LD B,A + LD C,A + 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.RootDirStartCluster_L),BC ; [ ] fat32 + LD (FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 + LD (FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + LD (FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables + LD (FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 + ; + ; + LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16) + LD A,E + OR D + JR NZ,.skip_high + ; + LD BC,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32+4) + LD (FatBuffer.SectorsPerFAT_H),BC + LD DE,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32) +.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE + ; + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs + CP 1 + JR Z,.one_FAT + DEC A + ADD HL,DE + LD (FatBuffer.FAT2_SEC_L),HL + JR NC,.no_inc_BC + INC BC +.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC +.one_FAT: ;C_DATA1 +.loop1: ADD HL,DE + JR NC,.loop1_1 + INC BC +.loop1_1: DEC A + JR NZ,.loop1 + ; + LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 - ;R05 - AND A - SBC HL,DE - JP NZ,DOS_X_Error.UnknownBPB - ;R08 - LD HL,CORE_BUFFERS.SECBUF - LD DE,CORE_BUFFERS.BootSector - LD BC,_sBOOT_SECTOR_PARAMS ; size - LDIR - ; - LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) - CP #F0 - JP C,DOS_X_Error.UnknownBPB - ; calc. first sector FAT - LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS) - ; - ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec - ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) - ; ADD HL,DE - ; - LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 - ;[ ] fat32 ;!FIXIT - XOR A - LD D,A - LD E,A - LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 - LD (FatBuffer.RootDirStartCluster_L),DE - LD (FatBuffer.RootDirStartCluster_H),DE - LD (FatBuffer.SectorsPerFAT_H),A - ; - ; - LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) - LD (FatBuffer.SectorsPerFAT_L),DE - ; - LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs - CP 1 - JR Z,.loop1 - DEC A - ADD HL,DE - LD (FatBuffer.FAT2_SEC_L),HL -;C_DATA1 -.loop1: ADD HL,DE - DEC A - JR NZ,.loop1 - ; - LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) - LD A,B - AND A - ; - RL C - RLA - RL C - RLA - RL C - RLA - ; - LD C,A - LD B,0 ; BC - File handels in sectors - ;;;; + LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD A,B + AND A + ; + RL C + RLA + RL C + RLA + RL C + RLA + ; + LD C,A + LD B,0 ; BC - File handels in sectors + ;;;; + IF COMPILE_UNUSED_CODE + LD (FatBuffer.FilesPerSector),A + ENDIF + ; + EX DE,HL + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FilesInRootDIR) ; 0 for fat32 + DEC HL ; [ ]fat32 + XOR A + ;NEXTAD2 +.loop2: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,BC + JR NC,.loop2 + ; + EX DE,HL + LD C,A ; A - sectors in DIR + LD B,0 + LD (FatBuffer.DirSizeInSectors),A + + ADD HL,BC ; Start DATA area + LD (FatBuffer.FirstDataSector_L),HL + ; B = 0 + ; + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + ;!TODO FATcacheSize + ; calc. cluster size + XOR 1 + JR Z,.loop3.end + RRA +.loop3: ADD HL,HL + RRA + JP NC,.loop3 +.loop3.end: ; + LD (FatBuffer.BytesPerCluster),HL + ; IF COMPILE_UNUSED_CODE - LD (FatBuffer.FilesPerSector),A + EX DE,HL + LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize + XOR A + ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится +.loop4: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,DE + JR NC,.loop4 + LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) ENDIF - ; - EX DE,HL - LD HL,(CORE_BUFFERS.BootSector.FilesInRootDIR) ; 0 for fat32 - DEC HL ; [ ]fat32 - XOR A -;NEXTAD2 -.loop2: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,BC - JR NC,.loop2 - ; - EX DE,HL - LD C,A ; A - sectors in DIR - LD B,0 - LD (FatBuffer.DirSizeInSectors),A - ADD HL,BC ; Start DATA area - LD (FatBuffer.FirstDataSector_L),HL - ; B = 0 - ; - LD HL,(CORE_BUFFERS.BootSector.BytesPerSector) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - ;!TODO FATcacheSize - ; calc. cluster size - XOR 1 - JR Z,.loop3.end - RRA -.loop3: ADD HL,HL - RRA - JP NC,.loop3 -.loop3.end: - ; - LD (FatBuffer.BytesPerCluster),HL - IF COMPILE_UNUSED_CODE - EX DE,HL - LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize - XOR A -;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -.loop4: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,DE - JR NC,.loop4 - LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) - ENDIF - ; - ;!TODO detect fat type by clusters! - ;[ ] fat32 reset fat32 variables - LD HL,0 - LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FatBuffer.MaxClusterHigh),HL - ; - LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага - LD DE,FatBuffer.MSG - LD B,3 -;R_BPBL1 -.loop5: LD A,(DE) - CP (HL) - JP NZ,.IBM_DOS - INC HL - INC DE - DJNZ .loop5 -;FID -.loop6: LD A,(HL) - INC HL - CP ' ' - JR Z,.loop6 - ; - CP '1' - ;[ ] fat32 - JP Z,.fat1x - CP '3' - JP NZ,DOS_X_Error.UnknownBPB - LD A,#46 ; #46-#26 = 32 fat type - LD HL,#0FFF - LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FatBuffer.MaxClusterHigh),HL - LD H,L - JR .BPB_FAT - ; -.fat1x: LD A,(HL) - CP '2' ; FAT16 - LD HL,#0FFF - JR Z,.BPB_FAT - CP '6' ; FAT12 - JP NZ,DOS_X_Error.UnknownBPB - LD H,L -.BPB_FAT: - SUB #26 ; A-#26 = fat type (12, 16, 32) - LD (FatBuffer.FAT_TYPE),A - LD (FatBuffer.ENDCLUS_LOW),HL + ; + ;!TODO detect fat type by clusters! + ; [ ] fat32 + LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FAT16.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага + LD DE,FAT_STRING + LD B,3 + ;R_BPBL1 +.loop5: LD A,(DE) + CP (HL) + JP NZ,.IBM_DOS + INC HL + INC DE + DJNZ .loop5 + ;FID +.loop6: LD A,(HL) + INC HL + CP ' ' + JR Z,.loop6 + ; + CP '1' + ;[ ] fat32 + JP Z,.fat1x + CP '3' + JP NZ,DOS_X_Error.UnknownBPB + LD A,#52 ; #52-#20 = #32 fat type + LD HL,#0FFF + LD (FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT + LD H,L + JR .BPB_FAT + ; +.fat1x: LD A,(HL) + CP '2' ; FAT16 + LD HL,#0FFF + JR Z,.BPB_FAT + CP '6' ; FAT12 + JP NZ,DOS_X_Error.UnknownBPB + LD H,L +.BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) + LD (FatBuffer.FAT_TYPE),A + LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// -; LD HL,0 -; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track -; LD A,(CORE_BUFFERS.BootSector.HEADS) -; .BPB_L1:; calc. sector per cylinder -; ADD HL,BC -; DEC A -; JR NZ,.BPB_L1 -; LD (FatBuffer.S_X_H),HL +; LD HL,0 +; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.BootSector.HEADS) +; .BPB_L1: ; calc. sector per cylinder +; ADD HL,BC +; DEC A +; JR NZ,.BPB_L1 +; LD (FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// - ; [ ] fat32 - LD HL,(CORE_BUFFERS.BootSector.SectorsPerDrive) - LD DE,(FatBuffer.FirstDataSector_L) - LD A,H - OR L - JP NZ,.HDDSMAL - ; - LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_L) - LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_H) - AND A - SBC HL,DE - JP NC,.HDDBIG - DEC BC - JP .HDDBIG - ; -.HDDSMAL:; CF = 0 - SBC HL,DE - LD BC,0 -.HDDBIG: LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - SCF -.S4C01: RRA - JR C,.S4C02 - RR B - RR C - RR H - RR L - JP .S4C01 -.S4C02: INC HL - LD (FatBuffer.MaxClusterLow),HL - ; - XOR A - LD H,A - LD L,A - LD (FatBuffer.CacheBlock),HL - LD (FatBuffer.CacheUpdated),A + ; [ ] fat32 + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive) + LD DE,(FatBuffer.FirstDataSector_L) + LD A,H + OR L + JP NZ,.HDDSMAL + ; + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L) + LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H) + AND A + SBC HL,DE + JP NC,.HDDBIG + DEC BC + JP .HDDBIG + ; +.HDDSMAL: ; CF = 0 + SBC HL,DE + LD BC,0 +.HDDBIG: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + SCF +.S4C01: RRA + JR C,.S4C02 + RR B + RR C + RR H + RR L + JP .S4C01 +.S4C02: INC HL + LD (FatBuffer.MaxClusterLow),HL + ; + XOR A + LD H,A + LD L,A + LD (FatBuffer.CacheBlock),HL + LD (FatBuffer.CacheUpdated),A SET_PAGE_X FATPAGE - PUSH AF - ; [ ] fat32 - ; XOR A - ; HL = 0 - EX DE,HL - ; - CALL READ_FAT_TABLE - POP AF - OUT (SLOT3),A - CALL R_CLUST - XOR A - RET -;!TODO detect fat type by clusters! -.IBM_DOS: - LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) - CP #F0 - JR C,DOS_X_Error.UnknownBPB - ; ID ram-диска - #FA - CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 - LD A,'2' - LD HL,#0FFF - JP NZ,.BPB_FAT - ; - LD A,'6' - LD H,L - JP .BPB_FAT - ; + PUSH AF + ; [ ] fat32 + ; XOR A + ; HL = 0 + EX DE,HL + ; + CALL READ_FAT_TABLE + POP AF + OUT (SLOT3),A + CALL R_CLUST + XOR A + RET + ;!TODO detect fat type by clusters! +.IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + JR C,DOS_X_Error.UnknownBPB + ; ID ram-диска - #FA + CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 + LD A,'2' + LD HL,#0FFF + JP NZ,.BPB_FAT + ; + LD A,'6' + LD H,L + JP .BPB_FAT + ; DOS_X_Error: -.UnknownBPB: - LD A,DSS_Error.sys.UNKNOWN_FORMAT - SCF - RET -.Not_ready: - LD A,DSS_Error.sys.NOT_READY - ; CF = 1 - RET +.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET + ; +.Not_ready: LD A,DSS_Error.sys.NOT_READY + ; CF = 1 + RET ; ; ;!TODO к буферам! FatBuffer: -.MSG: DB 'FAT' +;.MSG: DB 'FAT' .DRIVE: DB #FF .FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .CacheBlock: DW #00 @@ -885,16 +896,21 @@ FatBuffer: .FAT2_SEC_H: DW #0000 ; [ ] fat32 .SectorsPerFAT_L DW #0000 .SectorsPerFAT_H DB #00 -.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR +.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .DirSizeInSectors: DB #00 ; DIR_SEC_SIZE .FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low .FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига .BytesPerCluster: DW #0000 ; CLUSTER_LEN -.ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #0FFF ; [ ] fat3 +.END_CHAIN_CLUSTER_L: DW #FFFF +.END_CHAIN_CLUSTER_H: DW #0FFF ; [ ] fat3 .MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) .MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) +; +.BytesPerSector DW #0000 +.SectorsPerCluster DB #00 +.BPB_SERIAL_NUMBER DW 0,0 +.BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS IF COMPILE_UNUSED_CODE .FilesPerSector: DB #00 ; число файловых записей в секторе .ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index cc2fe84..91db79b 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -255,9 +255,9 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера +WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера EXX - LD DE,(FatBuffer.ENDCLUS_HIGH) ; номер кластера + LD DE,(FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера EXX .Custom: PUSH DE EXX diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 9d14672..bdbb111 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -111,6 +111,7 @@ ;Input: C = #08 ; B = Subcommand ; DE = #55AA Magic Number +; A = Drive ; ;Subcommands: #00 - Get Device Parameters ; #01 - Read track diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ca9cbe3..2f72d1f 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -75,12 +75,12 @@ ; STRUCT _sBuffers -.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) -.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; -.BootSector _sBOOT_SECTOR_PARAMS ; 62 bytes ;!TODO перенести в область буферов -.EXE_Header _sEXE_HEADER ; 512 bytes -.Stack _sStack ; 256 bytes -.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF -.MemoryTable BLOCK 256,0 ; 256 bytes +.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) +.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; +.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 +.EXE_Header _sEXE_HEADER ; 512 bytes +.Stack _sStack ; 256 bytes +.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF +.MemoryTable BLOCK 256,0 ; 256 bytes ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index 397787a..9f02e1c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -949 \ No newline at end of file +952 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 1670edb..f380f5c 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -36,9 +36,9 @@ SERVICE_SECTORS: .FAT32.Low EQU #FFEF FAT_TYPE: -.x32 EQU 32 -.x16 EQU 16 -.x12 EQU 12 +.x32 EQU #32 +.x16 EQU #16 +.x12 EQU #12 ; define _bit (1 Date: Sun, 14 Apr 2024 01:54:39 +1000 Subject: [PATCH 112/219] =?UTF-8?q?DSS:=20=D0=B4=D0=B5=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=20=D1=80=D0=B0=D0=B7=D1=80=D1=8F=D0=B4=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=20FAT=20=D0=B2=20BPB=20=D1=82=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D0=BF=D0=BE=20=D0=B2=D1=81=D0=B5=D0=BC=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=BD=D0=B0=D0=BC.=20=D0=94=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE?= =?UTF-8?q?=20FAT32.=20SYS:=20=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B0=20System.dos=20>=20#4000=20=D0=B1=D0=B0=D0=B9=D1=82?= =?UTF-8?q?=D0=BE=D0=B2.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=83=D0=B6=D0=BD=D0=BE=D0=B9=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=BE=D0=B9=20=D1=80=D0=B0=D1=81=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=82=20BPB=20=D0=B4=D0=BE=20?= =?UTF-8?q?FAT=20=D0=B4=D0=BB=D1=8F=20HDD.=20SHELL:=20=D0=BC=D0=B5=D0=BB?= =?UTF-8?q?=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 1479 ++++++++++++++-------------- BOOT/boot.asm | 8 +- DSS/API.asm | 2 +- DSS/API/Delete.asm | 2 +- DSS/API/MkDir.asm | 10 +- DSS/API/Open.asm | 2 +- DSS/API/RmDir.asm | 4 +- DSS/API/Write.asm | 2 +- DSS/API/curDisk.asm | 2 +- DSS/API/diskINF.asm | 16 +- DSS/DOS_Proc.asm | 15 +- DSS/DSS-MAIN.ASM | 22 +- DSS/FS/FAT/FAT.asm | 292 ++++-- DSS/FS/FAT/FAT_X.asm | 110 +-- DSS/Media_drivers/ram_disk-drv.asm | 9 +- DSS/Structures.inc | 45 +- DSS/build.txt | 2 +- DSS/defines.inc | 7 +- SHELL/BATCH.ASM | 10 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 21 files changed, 1124 insertions(+), 919 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 690d745..051747a 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -19,118 +19,741 @@ OUTPUT 'build/DSSloader.bin' -ADRIVE EQU #00 -CDRIVE EQU #02 +;ADRIVE EQU #00 +;CDRIVE EQU #02 -DRIVE: _mSYSID - DI - LD (DRIVE),A - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - XOR A - LD (DRIVE+1),A +DRIVE: _mSYSID + DI + LD (DRIVE),A + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + XOR A + LD (DRIVE+1),A + ; + LD C,BIOS.DRV_VERSION + RST ToBIOS_18 + ; + LD HL,FAIL + PUSH HL + ; + LD A,INCORR + ;JR C,FAIL + RET C + LD A,(DRIVE) + BIT 7,A + JR Z,GOOD_DRIVE + EX DE,HL + LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка + SBC HL,DE + LD A,INCORR + ;JR C,FAIL + RET C +GOOD_DRIVE: LD DE,#8200 ;!HARDCODE + LD HL,0 + LD IX,2 + LD BC,2*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + JP C,FAIL.NULL + ; + ; CONTINUE + ;!TEST 26/03/2024 + LD SP,#C000 + ; + LD HL,0 + LD (DISKL),HL + LD (DISKH),HL + ; + LD BC,1*256 + BIOS.GetMem + RST ToBIOS_18 ;GET PAGE FOR DOS + LD (BANKDOS),A + ; + OUT (SLOT0),A + ; + CALL GET_BPB ;READ BPB + LD A,ERRIBPB + ;JP C,FAIL + RET C + CALL GETROOT + LD A,NO_SYS + ;JP C,FAIL + RET C + ; [ ] загрузка system.dos больше #4000 байтов + LD HL,(FSIZE1) + LD A,H + OR L + JR NZ,.set_size + LD DE,(FSIZE0) + LD HL,#4000 + SBC HL,DE + RLA +.set_size: LD (BIG_SHELL),A + ; + LD HL,(FCLUSTR) + LD DE,#C000 + CALL FLOAD ; загрузка + DI + XOR A + OUT (SYS_PORT.OFF),A + ; + LD A,#10 + LD BC,#7FFD + OUT (C),A + ; + LD A,1 + LD B,#1F ;1FFD + OUT (C),A + ; + ; LD A,(BANKDOS) + ; OUT (SLOT0),A + ;DOS LOADED + IF UNIVERSAL_BOOT + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,(DRIVE+1) ; номер раздела + LD L,A + ; + LD A,(DRIVE) ; номер устройства + LD C,Dss.Version + RST ToDSS + JP C,XFAIL.fail + ; + LD A,STARTDO + CALL DOSMESS + ; + LD A,(DRIVE) + LD BC,Dss.BootDSK.Set + RST ToDSS + ; + LD BC,Dss.BootDSK.Get + ELSE + IF ORIGINAL_DSS + LD C,Dss.Version + RST ToDSS + ELSE + LD A,(DRIVE) + LD C,Dss.Version + RST ToDSS + jp c,XFAIL.fail + LD C,Dss.BootDSK + ENDIF ; + LD A,STARTDO + CALL DOSMESS + IF ORIGINAL_DSS + LD A,(DRIVE) + LD BC,Dss.BootDSK.Set + RST ToDSS + LD BС,Dss.BootDSK.Get + ENDIF + ENDIF ; - LD C,BIOS.DRV_VERSION - RST ToBIOS_18 - LD A,INCORR - JR C,FAIL - LD A,(DRIVE) - BIT 7,A - JR Z,GOOD_DRIVE - EX DE,HL - LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка - SBC HL,DE - LD A,INCORR - JR C,FAIL -GOOD_DRIVE: - LD DE,#8200 ;!HARDCODE - LD HL,0 - LD IX,2 - LD BC,2*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - JR C,NULL - JP CONTINUE + RST ToDSS + ; + ADD A,"A" + ; + LD HL,ROOT + LD (HL),A + LD C,Dss.ChDir + RST ToDSS + ; + LD HL,PSHELL + LD BC,Dss.Exec + RST ToDSS +.NoShell: LD A,NOSHELL + ;JP XFAIL +XFAIL: CALL DOSMESS +.fail: LD A,FAILURE + CALL DOSMESS + DI + HALT +.halt: JR .halt +; -FAIL CALL MESSAGE -NULL LD A,FAILURE - CALL MESSAGE - DI - HALT - JR $ +; +PART_TB: PUSH BC + LD HL,(BOOT+510) + LD DE,#AA55 + AND A + SBC HL,DE + JR NZ,.ERRP + LD IX,BOOT+#01BE + LD B,4 ;!HARDCODE счетчик записей партиций в MBR +.DOSAGA: LD A,(IX+4) + CP PartitionSysTypes.FAT16_LBA + JR Z,YEPDOS + CP PartitionSysTypes.FAT16 + JR Z,YEPDOS + CP PartitionSysTypes.FAT16_32Mb + JR Z,YEPDOS + CP PartitionSysTypes.FAT12 + JR Z,YEPDOS +.next: LD DE,#10 + ADD IX,DE + DJNZ .DOSAGA +.ERRP: LD A,ERRPART + JP FAIL +; -FMESAGE LD HL,MSG0 - LD BC,MSGE-MSG0 - INC A - EX AF,AF' - XOR A - EX AF,AF' -NEXTMSG EX AF,AF' - CPIR - RET PO - RET NZ - EX AF,AF' - DEC A - JR NZ,NEXTMSG - RET +; +YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,#80 + CP (IX+0) + JR NZ,PART_TB.next + LD A,4 ;!HARDCODE счетчик записей партиций в MBR + SUB B + PUSH AF ; номер загрузочного раздела + ; + LD E,(IX+08) + LD D,(IX+09) + LD L,(IX+10) + LD H,(IX+11) + LD XH,D + LD XL,E + LD (DISKL),IX + LD (DISKH),HL + LD A,(DRIVE) + LD DE,BOOT + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS_18 + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + POP AF + POP BC + LD L,A ; номер загрузочного раздела + LD A,C + ;LD A,C + ; + RET +; -MESSAGE CALL FMESAGE - JR PRINTZ +; +SET_PRM: PUSH BC + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS_18 + LD A,(BOOT.SectorsPerTrack) + LD L,A + POP AF + PUSH AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS_18 + POP BC + LD A,C + RET +; -;R01 Start -PRINTZ LD A,(HL) ;R01 - INC HL - OR A - RET Z - CALL PRINTX - JR PRINTZ +; +GET_BPB: LD IX,#0000 + LD HL,#0000 + LD DE,BOOT + LD BC,1*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + RET C + LD A,(DRIVE) + LD B,A + AND #F0 + LD C,A + CP #80 + JR NZ,.NX1 + CALL PART_TB ;HDD + RET C + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD (DRIVE+1),HL + ; +.NX1: CP #00 + JR NZ,.NX2 + CALL SET_PRM ;FDD +.NX2: LD HL,(BOOT+510) + LD DE,#AA55 + AND A + SBC HL,DE + SCF + RET NZ + LD IY,BOOT ;Analysing Block Parametr BIOS + LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + RET C + LD HL,0 ;calc. first sector FAT + LD (DIR_FRH),HL + ; + LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) + ADD HL,DE + LD (FAT_FRM),HL ;first sector FAT + LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT + LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) + LD A,(BOOT.Number_of_FATs) ;amount FATs +.C_DATA1: ADD HL,DE + DEC A + JR NZ,.C_DATA1 + LD (DIR_FRM),HL ;first sector DIR + EX DE,HL + LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel + LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD A,H + SRL A + LD (DIR_S_S),A ;Sectors per dir + LD L,A + LD H,0 + ADD HL,DE + LD (DAT_FRM),HL ;First sector data + ; + LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector + LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) + LD HL,0 + LD A,(BOOT.SectorsPerCluster) +.NEXTAD3: ADD HL,BC ;calc. cluster size + DEC A + JR NZ,.NEXTAD3 + LD (CLU_LEN),HL + LD HL,BOOT.ID_FAT + LD DE,FATMSG + LD B,3 +.R_BPBL1: LD A,(DE) + CP (HL) + JP NZ,.IBMDOS_ + INC HL + INC DE + DJNZ .R_BPBL1 +.FID: LD A,(HL) + INC HL + CP " " + JR Z,.FID + CP "1" + SCF + RET NZ + LD A,(HL) + CP "6" ; FAT16 + LD HL,#FFFF + JR Z,.BPB_FAT + CP "2" ; FAT12 + SCF + RET NZ + LD HL,#0FFF +.BPB_FAT: LD (FAT_TYP),A + LD (ENDCLUS),HL + ; + LD IX,(DISKL) + LD HL,(DISKH) + LD DE,(FAT_FRM) + LD BC,#0000 + ADD IX,DE + ADC HL,BC + ;HL:IX + LD DE,FAT + LD BC,3*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + RET C + LD HL,0 + LD (FatCache),HL + XOR A + RET + ; +.IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + RET C + CP #F8 + LD A,"6" + LD HL,#FFFF + JR Z,.BPB_FAT + LD A,"2" + LD HL,#0FFF + JR .BPB_FAT +; -PRINTX CP #0D - JR Z,CR_ - CP #0A - JR Z,LF_ - LD BC,1*256 + BIOS.LP_PRINT_SYM - RST ToBIOS_18 - RET -CR_ LD C,BIOS.LP_GET_PLACE - RST ToBIOS_18 - LD E,0 - LD C,#84 - RST ToBIOS_18 - RET -LF_ LD C,BIOS.LP_GET_PLACE - RST ToBIOS_18 - LD A,#1F - CP D - JR NZ,LF2 - PUSH DE - PUSH HL - LD DE,#0020 - LD BC,1*256 + BIOS.LP_SCROLL_UD - RST ToBIOS_18 - LD DE,#1F00 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS_18 - LD A," " - LD BC,#50 + BIOS.LP_PRINT_SYM - RST ToBIOS_18 - POP HL - POP DE - DEC D -LF2 INC D - LD C,BIOS.LP_SET_PLACE - RST ToBIOS_18 - RET ;R01 +; поиск system.dos +GETROOT: LD HL,(DIR_FRH) + LD IX,(DIR_FRL) + LD BC,(DISKL) + LD DE,(DISKH) + LD A,(DIR_S_S) +.NEXTSEC: PUSH AF + ADD IX,BC + ADC HL,DE + ;HL:IX + PUSH IX + PUSH HL + LD BC,1*256 + BIOS.DRV_READ + LD DE,DIR + LD A,(DRIVE) + RST ToBIOS_18 + CALL SEARCH + POP HL + POP IX + POP BC + RET C + RET NZ + LD A,B + LD DE,0 + LD BC,1 + DEC A + JR NZ,.NEXTSEC + SCF + RET +; + +; +SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 + LD IX,DIR-#0020 +.SKIPNAM: LD DE,#0020 + ADD IX,DE + DEC C + RET Z + LD A,(IX+00) + OR A + SCF + RET Z + CP #E5 + JR Z,.SKIPNAM + LD A,(IX+11) + AND #10 + JR NZ,.SKIPNAM + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 +.SEARCH2: LD A,(DE) + CP (HL) + JR NZ,.SKIPNAM + INC HL + INC DE + DJNZ .SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,#0020 + LDIR + XOR A + INC A + RET + +; HL - CLUSTER +; DE - ADDRESS +;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +FLOAD: LD (READMEM),DE +.LD_FILE: PUSH HL ; system.dos first cluster + CALL NSECTOR ; Cluster to Sector + LD DE,(READMEM) + LD A,(BOOT.SectorsPerCluster) + CP #20 + LD C,BIOS.DRV_READ_LONG + JR C,.SMALL_CLUSTER + LD A,(BANKDOS) + EX AF,AF' + ;LD BC,#20*256 + BIOS.DRV_READ_LONG + LD B,#20 ; !HARDCODE кол-во загружаемых секторов +.set_drv: LD A,(DRIVE) + RST ToBIOS_18 + JP C,GOOD_DRIVE.NoShell + POP HL + ; [ ] загрузка system.dos больше #4000 байтов + ;AND A + ;RET + LD A,(BIG_SHELL) + OR A + RET Z + ; + XOR A + LD (BIG_SHELL),A + PUSH HL + CALL NSECTOR + LD DE,#20 ; !HARDCODE кол-во прочитанных секторов + AND A + ADD IX,DE + JR NC,.no_inc_hl + INC HL +.no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE кол-во ДОзагружаемых секторов + LD DE,#4000 + JR .set_drv + ; +.SMALL_CLUSTER: LD B,A + ;LD C,BIOS.DRV_READ_LONG + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST ToBIOS_18 + JP C,GOOD_DRIVE.NoShell + ; + LD HL,(READMEM) + LD DE,(CLU_LEN) + ADD HL,DE + LD (READMEM),HL + ; [ ] загрузка system.dos больше #4000 байтов + ;POP HL + ;RET C + CALL C,.more_than_1 + POP HL + RET C + ; + CALL R_F_FAT ; next cluster in chain + RET C + EX DE,HL + JP .LD_FILE + ; [ ] загрузка system.dos больше #4000 байтов +.more_than_1: LD A,(BIG_SHELL) + OR A + SCF + RET Z + IN A,(SLOT1) + LD HL,BANKDOS + CP (HL) + CCF + RET Z + LD (BANKDOS),A + LD HL,#C000 + LD (READMEM),HL + AND A + RET + + +; + +; --> HL - CLUSTER +; <-- HL:IX - SECTOR +NSECTOR: LD DE,0 + DEC HL + DEC HL + LD A,(BOOT.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,(DAT_FRM) ;first data sector + XOR A + ADD IX,DE + LD D,A + LD E,A + ADC HL,DE + ; + LD DE,(DISKL) + ADD IX,DE + LD DE,(DISKH) + ADC HL,DE + RET +;----------------- +;!TODO сделать это макросами или инклюдами универсальными. повторяются в досе и ещё где-то +; HL - CLUSTER +; DE - (CLUSTER) +R_F_FAT: 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 + XOR A + SBC HL,DE + POP HL + 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,(BOOT.BytesPerSector) + 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 + LD BC,(FatCache) + CP C + CALL NZ,RE_FAT + LD DE,FAT + ADD HL,DE + POP AF + LD E,(HL) + INC HL + LD D,(HL) + JP C,.R_F_F01 + LD A,D + AND #0F + LD D,A + JP .R_F_F02 + ; +.R_F_F01: LD A,E + AND #F0 + RR D ; вправо на 4 битa + RRA + RR D + RRA + RR D + RRA + RR D + RRA + LD E,A +.R_F_F02: LD HL,#0FEF + XOR A + SBC HL,DE + POP HL + RET +; + +; +RE_FAT: PUSH HL + LD L,A + LD H,0 + LD (FatCache),HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + LD IX,0 + LD DE,(FAT_FRM) + ADD HL,DE + EX DE,HL + JR NC,.NOINX + INC IX +.NOINX: LD HL,(DISKL) + ADD HL,DE + EX DE,HL + LD BC,(DISKH) + JR NC,.NOINX2 + INC IX +.NOINX2: ADD IX,BC + PUSH IX + PUSH DE + POP IX + POP HL + LD DE,FAT + LD BC,3*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + POP HL + RET +; + +//////////////////////////////////////////////////////////////////////// +FAIL: CALL MESSAGE +.NULL: LD A,FAILURE + CALL MESSAGE + DI + HALT + JR $ +; + +; +DOSMESS: CALL FMESAGE + LD C,Dss.PChars + JP ToDSS +; + +; +FMESAGE: LD HL,MSG0 + LD BC,MSGE-MSG0 + INC A + EX AF,AF' + XOR A + EX AF,AF' +.NEXTMSG: EX AF,AF' + CPIR + RET PO + RET NZ + EX AF,AF' + DEC A + JR NZ,.NEXTMSG + RET +; + +; +MESSAGE: CALL FMESAGE + ;R01 Start +PRINTZ: LD A,(HL) ;R01 + INC HL + OR A + RET Z + CALL PRINTX + JR PRINTZ +; + +; +PRINTX: CP #0D + JR Z,.CR_ + CP #0A + JR Z,.LF_ + LD BC,1*256 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 + RET +.CR_: LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 + LD E,0 + LD C,#84 + JP ToBIOS_18 + ;RET + ; +.LF_: LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 + LD A,#1F + CP D + JR NZ,.LF2 + PUSH DE + PUSH HL + LD DE,#0020 + LD BC,1*256 + BIOS.LP_SCROLL_UD + RST ToBIOS_18 + LD DE,#1F00 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS_18 + LD A," " + LD BC,#50 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 + POP HL + POP DE + DEC D +.LF2: INC D + LD C,BIOS.LP_SET_PLACE + JP ToBIOS_18 + ;RET ;R01 ;R01 End -FAILURE EQU 0 -INCORR EQU 1 -ERRPART EQU 2 -ERRIBPB EQU 3 -NO_SYS EQU 4 -NOSHELL EQU 5 -STARTDO EQU 6 +FAILURE EQU 0 +INCORR EQU 1 +ERRPART EQU 2 +ERRIBPB EQU 3 +NO_SYS EQU 4 +NOSHELL EQU 5 +STARTDO EQU 6 ;a BIOS version that is incompatible with this version of DOS ; 0 10 20 30 40 50 60 70 80 MSG0: DB 0 @@ -141,596 +764,18 @@ MSG0: DB 0 DB "Invalid BOOT sector.",13,10,0 DB "Can't open file SYSTEM.DOS...",13,10,0 DB 13,10,"Starting DSS... ",13,10,13,10,0 -MSGE DB 0 - -CONTINUE: - ;!TEST 26/03/2024 - LD SP,#C000 - ; - - LD HL,0 - LD (DISKL),HL - LD (DISKH),HL - - LD BC,1*256 + BIOS.GetMem - RST ToBIOS_18 ;GET PAGE FOR DOS - LD (BANKDOS),A - CALL GET_BPB ;READ BPB - LD A,ERRIBPB - JP C,FAIL - CALL GETROOT - LD A,NO_SYS - JP C,FAIL - - LD HL,(FCLUSTR) - LD DE,#C000 - CALL FLOAD ; загрузка - DI - XOR A - OUT (SYS_PORT.OFF),A - - LD A,#10 - LD BC,#7FFD - OUT (C),A - - LD A,1 - LD B,#1F ;1FFD - OUT (C),A - - LD A,(BANKDOS) - OUT (SLOT0),A - -;DOS LOADED - IF UNIVERSAL_BOOT - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD A,(DRIVE+1) ; номер раздела - LD L,A - ; - LD A,(DRIVE) ; номер устройства - LD C,Dss.Version - RST ToDSS - jp c,XFAIL.fail - - LD A,STARTDO - CALL DOSMESS - - LD A,(DRIVE) - LD BC,Dss.BootDSK.Set - RST ToDSS - - ;LD B,high Dss.BootDSK.Get - LD BC,Dss.BootDSK.Get - ELSE - - IF ORIGINAL_DSS - LD C,Dss.Version - RST ToDSS - ELSE - LD A,(DRIVE) - LD C,Dss.Version - RST ToDSS - jp c,XFAIL.fail - LD C,Dss.BootDSK - ENDIF - - LD A,STARTDO - CALL DOSMESS - - IF ORIGINAL_DSS - LD A,(DRIVE) - LD BC,Dss.BootDSK.Set - RST ToDSS - - ;LD B,high Dss.BootDSK.Get - LD BС,Dss.BootDSK.Get - ENDIF - ENDIF - - ;LD C,Dss.BootDSK - RST ToDSS - - ADD A,"A" +MSGE: DB 0 +; +PSHELL: DB '\SYSTEM.EXE /P',0 +ROOT: DB 'X:\',0 +MASKARE: DB "SYSTEM DOS" +FATMSG: DB "FAT" +//////////////////////////////////////////////////////////////////////// - LD HL,ROOT - LD (HL),A - LD C,Dss.ChDir - RST ToDSS - - LD HL,PSHELL - LD BC,Dss.Exec - RST ToDSS - LD A,NOSHELL - JP XFAIL - -PSHELL: DB '\SYSTEM.EXE /P',0 -ROOT: DB 'X:\',0 - -DOSMESS CALL FMESAGE - LD C,Dss.PChars - RST ToDSS - RET - -XFAIL: CALL DOSMESS -.fail: LD A,FAILURE - CALL DOSMESS - DI - HALT -.halt: JR .halt - -PART_TB: PUSH BC - LD HL,(BOOT+510) - LD DE,#AA55 - AND A - SBC HL,DE - JR NZ,ERRP - LD IX,BOOT+#01BE - LD B,4 ;!HARDCODE счетчик записей партиций в MBR -DOSAGA: LD A,(IX+4) - CP PartitionSysTypes.FAT16_LBA - JR Z,YEPDOS - CP PartitionSysTypes.FAT16 - JR Z,YEPDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,YEPDOS - CP PartitionSysTypes.FAT12 - JR Z,YEPDOS -.next: LD DE,#10 - ADD IX,DE - DJNZ DOSAGA -ERRP: LD A,ERRPART - JP FAIL - -YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD A,#80 - CP (IX+0) - JR NZ,DOSAGA.next - LD A,4 ;!HARDCODE счетчик записей партиций в MBR - SUB B - PUSH AF ; номер загрузочного раздела - ; - LD E,(IX+08) - LD D,(IX+09) - LD L,(IX+10) - LD H,(IX+11) - LD XH,D - LD XL,E - LD (DISKL),IX - LD (DISKH),HL - LD A,(DRIVE) - LD DE,BOOT - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS_18 - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - POP AF - POP BC - LD L,A ; номер загрузочного раздела - LD A,C - ;LD A,C - ; - RET - -SET_PRM: PUSH BC - LD A,B - LD C,BIOS.DRV_GET_PAR - RST ToBIOS_18 - LD A,(BOOT.SectorsPerTrack) - LD L,A - POP AF - PUSH AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS_18 - POP BC - LD A,C - RET - -GET_BPB: LD IX,#0000 - LD HL,#0000 - LD DE,BOOT - LD BC,1*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - RET C - LD A,(DRIVE) - LD B,A - AND #F0 - LD C,A - CP #80 - JR NZ,NX1 - CALL PART_TB ;HDD - RET C - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD (DRIVE+1),HL - ; -NX1: CP #00 - JR NZ,NX2 - CALL SET_PRM ;FDD -NX2: LD HL,(BOOT+510) - LD DE,#AA55 - AND A - SBC HL,DE - SCF - RET NZ - LD IY,BOOT ;Analysing Block Parametr BIOS - LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) - CP #F0 - RET C - LD HL,0 ;calc. first sector FAT - LD (DIR_FRH),HL - - LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec - LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) - ADD HL,DE - LD (FAT_FRM),HL ;first sector FAT - LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT - LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) - LD A,(BOOT.Number_of_FATs) ;amount FATs -C_DATA1: ADD HL,DE - DEC A - JR NZ,C_DATA1 - LD (DIR_FRM),HL ;first sector DIR - EX DE,HL - LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel - LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD A,H - SRL A - LD (DIR_S_S),A ;Sectors per dir - LD L,A - LD H,0 - ADD HL,DE - LD (DAT_FRM),HL ;First sector data - - LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector - LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) - LD HL,0 - LD A,(BOOT.SectorsPerCluster) -NEXTAD3: - ADD HL,BC ;calc. cluster size - DEC A - JR NZ,NEXTAD3 - LD (CLU_LEN),HL - - LD HL,BOOT.ID_FAT - LD DE,FATMSG - LD B,3 -R_BPBL1: - LD A,(DE) - CP (HL) - JP NZ,IBMDOS_ - INC HL - INC DE - DJNZ R_BPBL1 -FID: LD A,(HL) - INC HL - CP " " - JR Z,FID - CP "1" - SCF - RET NZ - LD A,(HL) - CP "6" ; FAT16 - LD HL,#FFFF - JR Z,BPB_FAT - CP "2" ; FAT12 - SCF - RET NZ - LD HL,#0FFF -BPB_FAT - LD (FAT_TYP),A - LD (ENDCLUS),HL - - LD IX,(DISKL) - LD HL,(DISKH) - LD DE,(FAT_FRM) - LD BC,#0000 - ADD IX,DE - ADC HL,BC -;HL:IX - LD DE,FAT - LD BC,3*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - RET C - LD HL,0 - LD (FatCache),HL - XOR A - RET - -IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) - CP #F0 - RET C - CP #F8 - LD A,"6" - LD HL,#FFFF - JR Z,BPB_FAT - LD A,"2" - LD HL,#0FFF - JR BPB_FAT - -; поиск system.dos -GETROOT: LD HL,(DIR_FRH) - LD IX,(DIR_FRL) - LD BC,(DISKL) - LD DE,(DISKH) - LD A,(DIR_S_S) -NEXTSEC: PUSH AF - ADD IX,BC - ADC HL,DE -;HL:IX - PUSH IX - PUSH HL - LD BC,1*256 + BIOS.DRV_READ - LD DE,DIR - LD A,(DRIVE) - RST ToBIOS_18 - CALL SEARCH - POP HL - POP IX - POP BC - RET C - RET NZ - LD A,B - LD DE,0 - LD BC,1 - DEC A - JR NZ,NEXTSEC - SCF - RET - -SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 - LD IX,DIR-#0020 -SKIPNAM: LD DE,#0020 - ADD IX,DE - DEC C - RET Z - LD A,(IX+00) - OR A - SCF - RET Z - CP #E5 - JR Z,SKIPNAM - LD A,(IX+11) - AND #10 - JR NZ,SKIPNAM - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 -SEARCH2: LD A,(DE) - CP (HL) - JR NZ,SKIPNAM - INC HL - INC DE - DJNZ SEARCH2 - LD D,XH - LD E,XL - LD HL,HANDBUF - EX DE,HL - LD BC,#0020 - LDIR - XOR A - INC A - RET - -; HL - CLUSTER -; DE - ADDRESS -;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы -FLOAD: LD (READMEM),DE -LD_FILE: PUSH HL - CALL NSECTOR - LD DE,(READMEM) - LD A,(BOOT.SectorsPerCluster) - CP #20 - JR C,SMALL_CLUSTER - LD BC,#20*256 + BIOS.DRV_READ_LONG - LD A,(BANKDOS) - EX AF,AF' - LD A,(DRIVE) - RST ToBIOS_18 - POP HL - AND A - RET -SMALL_CLUSTER: - LD B,A - LD C,BIOS.DRV_READ_LONG - LD A,(BANKDOS) - EX AF,AF' - LD A,(DRIVE) - RST ToBIOS_18 - LD HL,(READMEM) - LD DE,(CLU_LEN) - ADD HL,DE - LD (READMEM),HL - POP HL - RET C - CALL R_F_FAT - RET C - EX DE,HL - JP LD_FILE - -; HL - CLUSTER -; HL:IX - SECTOR - -; NSECTOR: -; DEC HL -; DEC HL -; EX DE,HL -; LD A,(BOOT.SectorsPerCluster) -; LD B,A -; LD HL,0 -; LD IX,0 -; ADD_DE1 ADD IX,DE -; JP NC,ADD_DE2 -; INC HL -; ADD_DE2 DJNZ ADD_DE1 -; LD DE,(DAT_FRM) -; ADD IX,DE -; LD DE,#0000 -; ADC HL,DE - -; LD DE,(DISKL) -; ADD IX,DE -; LD DE,(DISKH) -; ADC HL,DE -; RET - - -NSECTOR: - LD DE,0 - DEC HL - DEC HL - LD A,(BOOT.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,(DAT_FRM) ;first data sector - XOR A - ADD IX,DE - LD D,A - LD E,A - ADC HL,DE - ; - LD DE,(DISKL) - ADD IX,DE - LD DE,(DISKH) - ADC HL,DE - RET -;----------------- -;!TODO сделать это макросами или инклюдами универсальными. повторяются в досе и ещё где-то -; HL - CLUSTER -; DE - (CLUSTER) -R_F_FAT: 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 - XOR A - SBC HL,DE - POP HL - 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,(BOOT.BytesPerSector) - 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 - LD BC,(FatCache) - CP C - CALL NZ,RE_FAT - LD DE,FAT - ADD HL,DE - POP AF - LD E,(HL) - INC HL - LD D,(HL) - JP C,R_F_F01 - LD A,D - AND #0F - LD D,A - JP R_F_F02 - -R_F_F01 LD A,E - AND #F0 - RR D ; вправо на 4 битa - RRA - RR D - RRA - RR D - RRA - RR D - RRA - LD E,A -R_F_F02 LD HL,#0FEF - XOR A - SBC HL,DE - POP HL - RET - -RE_FAT PUSH HL - LD L,A - LD H,0 - LD (FatCache),HL - LD E,L - LD D,H - ADD HL,HL - ADD HL,DE - LD IX,0 - LD DE,(FAT_FRM) - ADD HL,DE - EX DE,HL - JR NC,NOINX - INC IX -NOINX LD HL,(DISKL) - ADD HL,DE - EX DE,HL - LD BC,(DISKH) - JR NC,NOINX2 - INC IX -NOINX2 ADD IX,BC - PUSH IX - PUSH DE - POP IX - POP HL - LD DE,FAT - LD BC,3*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - POP HL - RET - -MASKARE DB "SYSTEM DOS" - -FATMSG DB "FAT" - +//////////////////////////////////////////////////////////////////////// ; Area for boot sector [512Bytes] -BOOT _sBOOT_SECTOR_PARAMS = $ +BOOT _sBOOT_SECTOR_PARAMS = $ ; BOOT EQU $ ; ID_NAME EQU BOOT+#03 ; +03 DOS NAME @@ -750,33 +795,34 @@ BOOT _sBOOT_SECTOR_PARAMS = $ ; ; end boot sector -DIR EQU BOOT+512 -FAT EQU DIR+512 +DIR EQU BOOT+512 +FAT EQU DIR+512 -VALUE EQU 3*512+FAT +VALUE EQU 3*512+FAT 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 -DIR_FRM EQU VALUE+6 -DIR_S_S EQU VALUE+8 ; DIR_SEC_SIZE -DAT_FRM EQU VALUE+9 ; MSD_DAT_SEC -FAT_TYP EQU VALUE+11; TYPE FAT (#32 - 12bit, #36 - 16bit) -CLU_LEN EQU VALUE+12; CLASTER_LEN -ENDCLUS EQU VALUE+14 +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 +DIR_FRM EQU VALUE+6 +DIR_S_S EQU VALUE+8 ; DIR_SEC_SIZE +DAT_FRM EQU VALUE+9 ; MSD_DAT_SEC +FAT_TYP EQU VALUE+11; TYPE FAT (#32 - 12bit, #36 - 16bit) +CLU_LEN EQU VALUE+12; CLASTER_LEN +ENDCLUS EQU VALUE+14 -HANDBUF EQU VALUE+16 -FTIME EQU VALUE+16+22 -FDATE EQU VALUE+16+24 -FCLUSTR EQU VALUE+16+26 -FSIZE0 EQU VALUE+16+28 -FSIZE1 EQU VALUE+16+30 +HANDBUF EQU VALUE+16 +FTIME EQU VALUE+16+22 +FDATE EQU VALUE+16+24 +FCLUSTR EQU VALUE+16+26 +FSIZE0 EQU VALUE+16+28 +FSIZE1 EQU VALUE+16+30 -DISKH EQU VALUE+48 -DISKL EQU VALUE+50 -READMEM EQU VALUE+52 -SHEL_FM EQU VALUE+54 -BANKDOS EQU VALUE+55 +DISKH EQU VALUE+48 +DISKL EQU VALUE+50 +READMEM EQU VALUE+52 +;SHEL_FM EQU VALUE+54 +BIG_SHELL EQU VALUE+54 +BANKDOS EQU VALUE+55 ; EQU VALUE+56 ;----------------- @@ -791,14 +837,5 @@ BANKDOS EQU VALUE+55 ;STACK EQU (($/256)+2)*256 ENT -;START DI -; LD (SPZ+1),SP -; LD SP,#BFFF -; LD C,#FE -; CALL #3D13 -;SPZ LD SP,#0000 -; EI -; RET - - OUTEND + OUTEND ;[]-----------------------------------------------------------[] diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 9f79832..dce1683 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -24,6 +24,7 @@ include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/macros.z80' include 'shared_includes/structures/FileSystem.inc' + include '../DSS/defines.inc' DEFINE EXEinfoMACRO 0 DEFINE App_EXE_Version 1 @@ -348,9 +349,11 @@ write_to_: ld a,(disk) ; ld b,a inc c scf - ret z ; !TODO загрузка с расширенного раздела не поддерживается + ret z ; !TODO загрузка с расширенного раздела не поддерживается dec c - push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + CP #80 ;!HARDCODE тип драйва - HDD + JR NC,.skip_FAT_check + push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR ; [x] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) LD HL,0 LD IX,0 @@ -364,6 +367,7 @@ write_to_: ld a,(disk) ; SBC HL,DE RET C ; +.skip_FAT_check:; push bc ld a,b ld hl,0 ; ст. разряд лог. сектора diff --git a/DSS/API.asm b/DSS/API.asm index 7c49cd2..e2a7cc0 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -79,7 +79,7 @@ ; POP BC ; JP C,NDISK11 ; LD A,B - ; LD (FatBuffer.DRIVE),A + ; LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; CALL RD_BPB ; RET C ; LD A,(LDRIVE) diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 13aaefe..a0277a7 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -62,9 +62,9 @@ DEL_FN: ;!TEST PUSH DE LD DE,#0000 ; номер кластера CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - POP AF POP DE EXX + POP AF POP DE EXX JP NC,.loop diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 6f55c51..c0ddc0d 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -132,14 +132,14 @@ MKDIR: CP "." JR Z,.copy_dir_record ; fat32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.fat16_root_dir ; fat 32 EX DE,HL - LD HL,(FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL - LD HL,(FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL EX DE,HL JR .set_rec @@ -169,7 +169,7 @@ MKDIR: EXX POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора @@ -178,7 +178,7 @@ MKDIR: IN A,(SLOT0) OUT (SLOT3),A ; - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Write RST ToDSS.DRV diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 40864dc..676313a 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -67,7 +67,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+2),A LD (IY+_sFM.F_POSITION+3),A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A ; fat32 LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 3bcacfa..0723673 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -51,7 +51,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL EXX CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD B,A LD C,Dss.DRV.Read ; начинаем вычитывать содержимое каталога посекторно @@ -67,7 +67,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 LD DE,CORE_BUFFERS.SECBUF+#C000 ;LD BC,1*256 + Dss.DRV.Read LD B,1 - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) RST ToDSS.DRV POP AF OUT (SLOT3),A diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 9a886b3..aa5b773 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -18,7 +18,7 @@ WRITE.RD_ONLY: WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF - LD A,(FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index 5c61c19..bd51cdb 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -16,7 +16,7 @@ CURDISK_FN: CURDISK: LD A,(LDRIVE) LD C,A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) AND A RET ; \ No newline at end of file diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 9914621..9852d60 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -59,7 +59,7 @@ DISKINF: LD C,B 1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.next_prm ; @@ -73,11 +73,11 @@ DISKINF: LD C,B .put_char: LD (DE),A POP DE ; -.next_prm: LD HL,FatBuffer.BPB_SERIAL_NUMBER +.next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; - LD HL,FatBuffer.BPB_LABEL + LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; fat32 @@ -121,7 +121,7 @@ DISKINF: LD C,B ;JR Z,CURRDS ;R06 .CurrentDisk: LD A,(CurrentPath) SUB 'A' - LD HL,FatBuffer.DRIVE + LD HL,CORE_BUFFERS.FatBuffer.DRIVE CP (HL) JR Z,.CheckFreeSpace ; @@ -138,15 +138,15 @@ DISKINF: LD C,B ;.FRESP2: LD D,B LD E,C - LD HL,(FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) DEC HL ; fat 32 EXX - LD HL,(FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) DEC HL EXX - LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) AND A RET ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index a2bb9e3..08f26b5 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -181,7 +181,7 @@ TMPNAME: DZ ' ' ; 12 ; IN: A - drive number OPENDSK:;!TEST DRV.Open обход R10 LD C,A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP C IF CHECK_DRIVE_CHANGE JR NZ,.open @@ -200,12 +200,12 @@ OPENDSK:;!TEST DRV.Open POP BC JP C,.error ;[x] 29/02/2024 fix "open drive error" - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD D,A PUSH DE ; LD A,B - LD (FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; CALL RD_BPB ;[x] 29/02/2024 fix "open drive error" @@ -217,6 +217,7 @@ OPENDSK:;!TEST DRV.Open .exit: LD A,(LDRIVE) AND A RET + ; .error: CP DSS_Error.sys.INVALID_DRIVE SCF RET Z @@ -356,7 +357,7 @@ MASK: LD HL,TMPNAME ;----------------------------------------------------------------------; ;!TEST Current Dir ;[x] 15/10/23 DIR_PATH_CHANGE: -.FullCurrent: LD A,(FatBuffer.DRIVE) +.FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' LD (CurrentPath),A ; @@ -365,7 +366,7 @@ DIR_PATH_CHANGE: ; .FullWork: LD A,(CurrentPath) SUB 'A' - LD (FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; .Work: LD HL,WorkDirectory JP CURRDIR_FN @@ -391,7 +392,7 @@ DIR_PATH_CHECK: LD A,(HL) JR Z,.checkDir ; LD HL,CurrentPath - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) JR NZ,.gotoPath @@ -413,7 +414,7 @@ DIR_PATH_CHECK: LD A,(HL) JR .gotoPath ; .checkDrive: LD HL,CurrentPath - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) RET diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index fa82eb8..3329914 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -241,11 +241,16 @@ PORTAL.out_MAIN: ; CLEAR_BUFFER_AND_INIT_PROC: ;------[CLEAR BUFFERS]------; ;R07 ;R11 + XOR A LD HL,CLEAR_ZONE.start LD DE,CLEAR_ZONE.start+1 LD BC,CLEAR_ZONE.size-1 - LD (HL),0 + LD (HL),A LDIR + ; A = 0 + DEC A + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + ; ;R07 ;R11 ;R11 LD HL,CORE_BUFFERS.FM_BUF @@ -405,7 +410,8 @@ BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size -BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector разной длины +;BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector разной длины +FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer @@ -415,11 +421,11 @@ CLEAR_ZONE.size EQU _sBuffers ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector - DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector - DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "BUFFERSplace ", /H, CORE_BUFFERS.BUFFERSplace + DISPLAY "FatBuffer ", /H, CORE_BUFFERS.FatBuffer + DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF - DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF DISPLAY "--- --- --- --- --- --- --- ---" @@ -597,7 +603,9 @@ DRV_CONTENT: DRV_CONTENT.SIZE EQU $-DRV_CONTENT DISPLAY "END ADDRESS: ",/H,$ - ASSERT $<#4001,'-> Memory leack!!!'; + DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512 + ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!'; + ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!'; ;[END] ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 95976eb..55c64cd 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -345,9 +345,9 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF JR NZ,.SUBDIR .REROOT: ; fat32 EX DE,HL - LD HL,(FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL EX DE,HL CALL LOADDIR @@ -423,11 +423,11 @@ LOADDIR: ;!TODO optimize ; ; LD (HL),L ; ; LDIR ; ; - ; LD A,(FatBuffer.DRIVE) ; номер диска + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска ; LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор ; ; номер первого кластера ; ; [x] fat32 - ; LD A,(FatBuffer.FAT_TYPE) + ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) ; XOR 32 ; JR Z,.read_dir ; ;!FIXIT переделать на работу без IY @@ -446,14 +446,14 @@ LOADDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд - LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(FatBuffer.DirSizeInSectors) +.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ; ст. разряд + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 LD B,A ; число секторов -.RTD1: LD A,(FatBuffer.DRIVE) ; номер диска +.RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV @@ -475,10 +475,10 @@ LOAD_SAVE_DIR_PREPARE: AND A EX AF,AF' ; - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A ; [x] fat32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 - 1 JR NC,.exit ;!FIXIT переделать на работу без IY @@ -504,10 +504,10 @@ SAVEDIR: ;!TODO optimize ; AND A ; PUSH AF ; ; - ; LD A,(FatBuffer.DRIVE) + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; LD (IY+_sFM.DRIVE),A ; ; [x] fat32 - ; LD A,(FatBuffer.FAT_TYPE) + ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) ; XOR 32 ; JR Z,.save_dir ; ;!FIXIT переделать на работу без IY @@ -528,15 +528,15 @@ SAVEDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) - LD IX,(FatBuffer.RootDirFirstSector_L) - LD A,(FatBuffer.DirSizeInSectors) +.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors SUB B JR NC,.RTD1S ADD A,B LD B,A -.RTD1S: LD A,(FatBuffer.DRIVE) +.RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD DE,DIRPAGE.buffer LD C,Dss.DRV.Write RST ToDSS.DRV @@ -593,7 +593,7 @@ WRT_HND: SET_PAGE_X DIRPAGE SBC HL,DE JR NC,SAVEDIR LD HL,(SAVEDIR.DIRSIZE) - LD BC,(FatBuffer.BytesPerCluster) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ADD HL,BC LD (SAVEDIR.DIRSIZE),HL AND A @@ -604,7 +604,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; не используется ; TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open -; LD A,(FatBuffer.DRIVE) +; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; LD C,Dss.DRV.MediaCheck ; RST ToDSS.DRV ; OR A @@ -618,7 +618,7 @@ RD_BPB: LD C,SLOT3 PUSH BC IN A,(SLOT0) OUT (SLOT3),A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD C,Dss.DRV.GetBPB RST ToDSS.DRV @@ -642,6 +642,17 @@ RD_BPB: LD C,SLOT3 LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) CP #F0 JP C,DOS_X_Error.UnknownBPB + ; + ;!TODO проверить по метке раздела, что это FAT, потом определять какой FAT + ; + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER) + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),HL + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER+2) + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),HL ; calc. first sector FAT LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ; @@ -649,20 +660,20 @@ RD_BPB: LD C,SLOT3 ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; ADD HL,DE ; - ;!FIXIT для fat32 втыкать сюда сектора активной таблицы - LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ;!FIXIT для fat32 втыкать сюда сектора активной таблицы + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ;[ ] fat32 XOR A LD B,A LD C,A - 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.RootDirStartCluster_L),BC ; [ ] fat32 - LD (FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 - LD (FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables - LD (FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables - LD (FatBuffer.SectorsPerFAT_H),A ; [ ] 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.RootDirStartCluster_L),BC ; [ ] fat32 + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables + LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 ; ; LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16) @@ -670,20 +681,21 @@ RD_BPB: LD C,SLOT3 OR D JR NZ,.skip_high ; - LD BC,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32+4) - LD (FatBuffer.SectorsPerFAT_H),BC - LD DE,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32) -.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE + LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32+4) + LD A,C + LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A + LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32) +.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE ; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT DEC A ADD HL,DE - LD (FatBuffer.FAT2_SEC_L),HL + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL JR NC,.no_inc_BC INC BC -.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC +.no_inc_BC: LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC .one_FAT: ;C_DATA1 .loop1: ADD HL,DE JR NC,.loop1_1 @@ -691,9 +703,9 @@ RD_BPB: LD C,SLOT3 .loop1_1: DEC A JR NZ,.loop1 ; - LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,B AND A ; @@ -708,7 +720,7 @@ RD_BPB: LD C,SLOT3 LD B,0 ; BC - File handels in sectors ;;;; IF COMPILE_UNUSED_CODE - LD (FatBuffer.FilesPerSector),A + LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A ENDIF ; EX DE,HL @@ -724,14 +736,14 @@ RD_BPB: LD C,SLOT3 EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (FatBuffer.DirSizeInSectors),A + LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A ADD HL,BC ; Start DATA area - LD (FatBuffer.FirstDataSector_L),HL + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL ; B = 0 ; - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) - LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -741,7 +753,7 @@ RD_BPB: LD C,SLOT3 RRA JP NC,.loop3 .loop3.end: ; - LD (FatBuffer.BytesPerCluster),HL + LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL ; IF COMPILE_UNUSED_CODE EX DE,HL @@ -752,69 +764,71 @@ RD_BPB: LD C,SLOT3 JP Z,DOS_X_Error.UnknownBPB SBC HL,DE JR NC,.loop4 - LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) + LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) ENDIF - ; - ;!TODO detect fat type by clusters! - ; [ ] fat32 - LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FAT16.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага - LD DE,FAT_STRING - LD B,3 - ;R_BPBL1 -.loop5: LD A,(DE) - CP (HL) - JP NZ,.IBM_DOS - INC HL - INC DE - DJNZ .loop5 + + //////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////// +; LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага +; LD DE,FAT_STRING +; LD B,3 +; ;R_BPBL1 +; .loop5: LD A,(DE) +; CP (HL) +; JP NZ,.IBM_DOS +; INC HL +; INC DE +; DJNZ .loop5 ;FID -.loop6: LD A,(HL) - INC HL - CP ' ' - JR Z,.loop6 - ; - CP '1' - ;[ ] fat32 - JP Z,.fat1x - CP '3' - JP NZ,DOS_X_Error.UnknownBPB - LD A,#52 ; #52-#20 = #32 fat type - LD HL,#0FFF - LD (FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT - LD H,L - JR .BPB_FAT - ; -.fat1x: LD A,(HL) - CP '2' ; FAT16 - LD HL,#0FFF - JR Z,.BPB_FAT - CP '6' ; FAT12 - JP NZ,DOS_X_Error.UnknownBPB - LD H,L -.BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) - LD (FatBuffer.FAT_TYPE),A - LD (FatBuffer.END_CHAIN_CLUSTER_L),HL +; .loop6: LD A,(HL) +; INC HL +; CP ' ' +; JR Z,.loop6 +; ; +; CP '1' +; JP Z,.fat1x +; CP '3' +; JP NZ,DOS_X_Error.UnknownBPB +; LD A,#52 ; #52-#20 = #32 fat type +; LD HL,#0FFF +; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL +; LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT +; LD H,L +; JR .BPB_FAT +; ; +; .fat1x: LD A,(HL) +; CP '2' ; FAT16 +; LD HL,#0FFF +; JR Z,.BPB_FAT +; CP '6' ; FAT12 +; JP NZ,DOS_X_Error.UnknownBPB +; LD H,L +; .BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) +; LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A +; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL ;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// ; LD HL,0 -; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track -; LD A,(CORE_BUFFERS.BootSector.HEADS) +; LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.HEADS) ; .BPB_L1: ; calc. sector per cylinder ; ADD HL,BC ; DEC A ; JR NZ,.BPB_L1 -; LD (FatBuffer.S_X_H),HL +; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// ; [ ] fat32 LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive) - LD DE,(FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L) LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H) + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low AND A SBC HL,DE JP NC,.HDDBIG @@ -822,25 +836,104 @@ RD_BPB: LD C,SLOT3 JP .HDDBIG ; .HDDSMAL: ; CF = 0 - SBC HL,DE LD BC,0 -.HDDBIG: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low + SBC HL,DE + ; +.HDDBIG: LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) SCF -.S4C01: RRA - JR C,.S4C02 +.loop7: RRA + JR C,.loop7_exit RR B RR C RR H RR L - JP .S4C01 -.S4C02: INC HL - LD (FatBuffer.MaxClusterLow),HL + JP .loop7 + ; +.loop7_exit: INC HL + LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL ; XOR A LD H,A LD L,A - LD (FatBuffer.CacheBlock),HL - LD (FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ; A = 0 + LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD H,A + EX DE,HL + LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + ; DE:HL = SectorsPerFAT + ; + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) + LD B,A + DEC A + JR Z,.loop_mul_end + ; .Number_of_FATs * .SectorsPerFAT +.loop_mul: ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + DJNZ .loop_mul +.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD B,0 + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) + LD C,A + ADD HL,BC + JR NC,.no_inc_DE + INC DE +.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) + ADD HL,BC + JR NC,.no_inc_de + INC DE +.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT) + AND A + LD B,D + LD C,E + POP DE ; Total Sectors low + EX DE,HL + SBC HL,DE + EX (SP),HL ; Total Sectors high + SBC HL,BC + POP DE ; Total Sectors low + ; HL:DE = DataSec + ; + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + ; выясняем разрядность FAT + LD A,D + OR E + JR NZ,.its_FAT32 + ; + LD HL,4084 + SBC HL,BC + JR NC,.its_FAT12 + ; + LD HL,65525 + SBC HL,BC + JR C,.its_FAT32 + ; + ; It's FAT16 + LD A,FAT_TYPE.x16 + LD HL,#FFFF + JR .BPB_FAT + ; +.its_FAT12: LD HL,#0FFF + LD A,FAT_TYPE.x12 + JR .BPB_FAT + ; +.its_FAT32: LD A,FAT_TYPE.x32 + LD HL,#0FFF + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT + LD H,L + ; +.BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL + ; SET_PAGE_X FATPAGE @@ -848,8 +941,9 @@ RD_BPB: LD C,SLOT3 ; [ ] fat32 ; XOR A ; HL = 0 - EX DE,HL + ; EX DE,HL ; + LD DE,0 CALL READ_FAT_TABLE POP AF OUT (SLOT3),A @@ -881,6 +975,7 @@ DOS_X_Error: ; ; ;!TODO к буферам! +/* FatBuffer: ;.MSG: DB 'FAT' .DRIVE: DB #FF @@ -918,4 +1013,5 @@ FatBuffer: ;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? ; +*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 91db79b..9430351 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -113,23 +113,23 @@ INC_FAT: ; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster ; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) CHECK_CLUSTER_IS_SMALLER: - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) XOR FAT_TYPE.x32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера ; проверяем старшее слово номера кластера EXX EX DE,HL - LD HL,(FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) ; CF = 0 SBC HL,DE EX DE,HL EXX LD A,DSS_Error.sys.DISK_FULL ;RET C - RET NZ ; если FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный + RET NZ ; если CORE_BUFFERS.FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный ; проверяем младше слово номера кластера .low: EX DE,HL - LD HL,(FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) ; CF = 0 SBC HL,DE EX DE,HL @@ -157,7 +157,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; PUSH HL PUSH AF - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -255,9 +255,9 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера +WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера EXX - LD DE,(FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера + LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера EXX .Custom: PUSH DE EXX @@ -278,9 +278,9 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; PUSH DE ; младший номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,1 - ;LD (FatBuffer.CacheUpdated),A + ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -296,7 +296,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; ; [x] 2/12/23 FAT не всегда мог записаться на HDD XOR A INC A - LD (FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; CF = 0 RET ; @@ -360,7 +360,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; ; out: C:HL - logical number ; B = 0 GET_SECTOR_OF_FAT: - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную XOR FAT_TYPE.x32 JR Z,.next @@ -383,7 +383,7 @@ GET_SECTOR_OF_FAT: ; ADC A,C ; EDUP ; LD C,A -; LD A,(FatBuffer.FAT_TYPE) +; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) ; CP FAT_TYPE.x32 ; RET NZ ; ADD HL,HL ;x2 @@ -400,34 +400,34 @@ GET_SECTOR_OF_FAT: ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL PUSH DE - LD A,(FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE.Start POP DE ; EX DE,HL - LD (FatBuffer.CacheBlock),HL + LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL ; CALL GET_SECTOR_OF_FAT ; ; BC:HL - номер лог.сектора - LD DE,(FatBuffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) ADD HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(FatBuffer.FAT1_SEC_H) + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) ; JR NC,.no_inc ; INC HL .no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) XOR FAT_TYPE.x32 LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE JR NZ,.next LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE .next: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS - LD A,(FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска RST ToDSS.DRV POP HL RET @@ -443,7 +443,7 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD HL,(FatBuffer.CacheBlock) +.Start: LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока @@ -453,7 +453,7 @@ WRITE_FAT_TABLE: ;LD C,L ; LD DE,FAT_CACHE.Sectors_32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 JR Z,.next LD DE,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде @@ -466,10 +466,10 @@ WRITE_FAT_TABLE: ; .no_inc: ; конец блока выходит за пределы таблицы? LD B,E ; MAX число секторов для чтения в кэш - LD A,(FatBuffer.SectorsPerFAT_H) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) LD (.sub_A),A ;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT - LD DE,(FatBuffer.SectorsPerFAT_L) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) AND A LD A,C SBC HL,DE @@ -493,8 +493,8 @@ WRITE_FAT_TABLE: ;PUSH HL ; ; B = число секторов - LD IX,(FatBuffer.FAT1_SEC_H) - LD DE,(FatBuffer.FAT1_SEC_L) + LD IX,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) ;LD B,A ;LD C,Dss.DRV.Write ; запись секторов PUSH BC @@ -505,26 +505,26 @@ WRITE_FAT_TABLE: CALL .SAVE_FAT_XX ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 POP BC ; B = число секторов, C = старший байт смещения в секторах - LD HL,(FatBuffer.FAT1_SEC_H) - LD DE,(FatBuffer.FAT2_SEC_H) + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) AND A SBC HL,DE JR NZ,.not_one_FAT - LD HL,(FatBuffer.FAT2_SEC_L) - LD DE,(FatBuffer.FAT1_SEC_L) + LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) + LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) ; CF = 0 SBC HL,DE JR Z,.only_one_FAT ; ; сохраняем вторую копию FAT -.not_one_FAT: LD IX,(FatBuffer.FAT2_SEC_H) - LD DE,(FatBuffer.FAT2_SEC_L) +.not_one_FAT: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) LD HL,(.save_hl) CALL .SAVE_FAT_XX AND A ;!TODO нет контроля ошибок .only_one_FAT: ; .ERR: LD A,0 - LD (FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A RET ; Вход: IX:DE - начало таблицы FAT в секторах ; C:HL - смещение в таблице в секторах @@ -546,7 +546,7 @@ WRITE_FAT_TABLE: LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT LD DE,FATPAGE.cache ; откуда - LD A,(FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV @@ -585,7 +585,7 @@ GET_FAT32_CELL: ; EXX EX DE,HL - LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH SBC HL,DE CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT POP HL @@ -611,9 +611,9 @@ GET_FAT16_CELL: ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -654,9 +654,9 @@ GET_FAT12_CELL: ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -683,7 +683,7 @@ CLUSTER_TO_SECTOR: ; DE:HL - cluster DEC HL DEC HL - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -698,13 +698,13 @@ CLUSTER_TO_SECTOR: .skip: EX DE,HL LD XL,E LD XH,D - LD DE,(FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) ; [x] fat32 ;XOR A ; ADD IX,DE ; [x] fat32 - LD DE,(FatBuffer.FirstDataSector_H) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) ;LD D,A ;LD E,A ; @@ -720,7 +720,7 @@ CLUSTER_TO_SECTOR: ; IX - buffer in RAM ; B - количество секторов для чтения BLOCK_READ: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -809,7 +809,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR NC,.skip2 INC HL .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -817,7 +817,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR C,.Error POP BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) ;!TEST LD A,B LD B,C @@ -833,7 +833,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster +.loop4: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -861,7 +861,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX PUSH BC CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -869,7 +869,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX ; POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -915,7 +915,7 @@ CHECK_FIRST_CLUSTER: ; IY - FM ; B - количество секторов для записи BLOK_WRITE: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -1031,7 +1031,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX INC HL ; DOUBLE 1 .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -1040,7 +1040,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) ; LD A,B LD B,C @@ -1057,7 +1057,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster +.big_loop: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -1090,7 +1090,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX CALL CLUSTER_TO_SECTOR ; DOUBLE 1 LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -1098,7 +1098,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -1268,12 +1268,12 @@ GET_OFFSET_IN_SECTORS: ;!TODO fat32 ;======================================================================= ;BPB - ;LD (FatBuffer.FAT2_SEC_L),HL - ;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + ;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + ;LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR ;BPB32 ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта ;FAT Max Cluster - ;LD (FatBuffer.MaxClusterLow),HL + ;LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL ;======================================================================= ;//MODULE: FAT_X diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 9fe4bcb..3c90bec 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -538,5 +538,12 @@ GET_RAMDRV_NUM: LD A,(BC) OR #60 ;!HARDCODE сделать номера разных устройств через метки RET -ENDDRVR EQU $ +; + +; +;TEST_DB_DEL_ME: DB 'Make here more than one page to load test' +; + +; +;ENDDRVR EQU $ ; \ No newline at end of file diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 2f72d1f..ff95c4c 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -73,14 +73,55 @@ ; LEN2 EQU 29 ; AMODE EQU 41 ; LEN3 EQU 30 ; FTASK EQU 42 +; + STRUCT _sFatBuffer +;.MSG: BYTE 'FAT' +.DRIVE: BYTE #FF +.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] 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 +.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 ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE +.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low +.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига +.BytesPerCluster: WORD #0000 ; CLUSTER_LEN +.END_CHAIN_CLUSTER_L: WORD #FFFF +.END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3 +.MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.) +.MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.) +; +.BytesPerSector WORD #0000 +.SectorsPerCluster BYTE #00 +.BPB_SERIAL_NUMBER DWORD #00000000 +.BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS +; IF COMPILE_UNUSED_CODE +; .FilesPerSector: BYTE #00 ; число файловых записей в секторе +; .ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) +; ENDIF +;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +;.S_X_H: DWORD #0000 ; количество секторов на цилиндре + ENDS +; + ; STRUCT _sBuffers .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; -.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 +.FatBuffer _sFatBuffer +;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .EXE_Header _sEXE_HEADER ; 512 bytes .Stack _sStack ; 256 bytes .Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF .MemoryTable BLOCK 256,0 ; 256 bytes ENDS -; +; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 9f02e1c..4d19020 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -952 \ No newline at end of file +950 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f380f5c..6bd6034 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -149,4 +149,9 @@ MOUSE_BAUD: .multiplier_2 EQU 45 ; второй множитель = 45. 875000/Мн1*Мн2=1215 ENDIF ;----------------------------------------------------; -; \ No newline at end of file +; + +; +;----------------------------------------------------; +SUBLOAD_SIZE EQU 10 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу +;----------------------------------------------------; diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index e990f93..22b9e4c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -103,8 +103,14 @@ BATCH: ;CALL Restore_Screen ;R10 ;pop af - ret c - ld (BAT_FM),a ; дескр. bat-файла + JR NC,.good + CP DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET NZ + LD A,DSS_Error.sys.FILE_NOT_FOUND + RET + ; +.good: ld (BAT_FM),a ; дескр. bat-файла ; выполн. команд bat-файла call NEWLINE ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat diff --git a/SHELL/build.txt b/SHELL/build.txt index c0d6976..75af06e 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -314 \ No newline at end of file +315 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 18c132c..0e2bbfb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292 +Subproject commit 0e2bbfb73ceb70a16b2ab2b5ee6cbc6bd5005bf7 From 6330028b93ffcd955d26bb3b6e3a116bcf9933d0 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 15 Apr 2024 02:16:33 +1000 Subject: [PATCH 113/219] 88% --- DSS/API/MkDir.asm | 17 +-- DSS/DSS-MAIN.ASM | 9 +- DSS/FS/FAT/FAT.asm | 247 ++++++++++++++++++---------------- DSS/FS/FAT/FAT_X.asm | 1 + DSS/KEYINTER.ASM | 7 - DSS/Media_drivers/ide-drv.asm | 16 +-- DSS/Structures.inc | 24 ++-- DSS/build.txt | 2 +- Shared_Includes | 2 +- 9 files changed, 165 insertions(+), 160 deletions(-) diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index c0ddc0d..de6133b 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -131,25 +131,14 @@ MKDIR: LD A,(DIRPAGE.buffer) CP "." JR Z,.copy_dir_record - ; fat32 - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR NZ,.fat16_root_dir - ; fat 32 - EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL - EX DE,HL - JR .set_rec ; -.fat16_root_dir:; fat 12/16 ;LD IX,HANDBUF XOR A LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A -.set_rec: LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A + LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .copy_dir_record: EX DE,HL LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 3329914..6453629 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -427,7 +427,14 @@ CLEAR_ZONE.size EQU _sBuffers DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF DISPLAY "--- --- --- --- --- --- --- ---" - + + EXPORT CORE_BUFFERS.BUFFERSplace + EXPORT CORE_BUFFERS.FM_BUF + EXPORT CORE_BUFFERS.FatBuffer + EXPORT CORE_BUFFERS.EXEBUFF + EXPORT CORE_BUFFERS.XSTACK + EXPORT CORE_BUFFERS.BUFFER + EXPORT CORE_BUFFERS.SECBUF /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 55c64cd..04663f3 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -323,7 +323,7 @@ FINDDIR: RET ;----------------------------------------------------------------------; -CHECK_ZERO_CLUSTER: +CHECK_ROOT_CLUSTER: EX DE,HL LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 LD A,L @@ -334,22 +334,25 @@ CHECK_ZERO_CLUSTER: EX DE,HL RET - - ;----------------------------------------------------------------------; ; вход: HL - имя директории ; [x] fat32 ;!TEST +; !FIXIT ловится двойное обращение при открытии корня диска, например OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD A,(HL) OR A JR NZ,.SUBDIR .REROOT: ; fat32 - EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL - EX DE,HL + ; EX DE,HL + ; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + ; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + ; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + ; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL + ; EX DE,HL + LD DE,0 + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),DE + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),DE + CALL LOADDIR ; CF=0 LD HL,WorkDirectory @@ -362,7 +365,7 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF .SUBDIR: CP "." JR NZ,.SUBDIR2 ; fat32 - CALL CHECK_ZERO_CLUSTER + CALL CHECK_ROOT_CLUSTER JR NZ,.no_root ;R005 ; "cd ." or "cd .." ;R005 @@ -397,46 +400,29 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD HL,#4000 ;!HARDCODE LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL ;EX DE,HL - JP LOADDIR -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; + ;JP LOADDIR +;--------------; ; Прочитать список каталога ; [x] fat32 ;!TEST LOADDIR: ;!TODO optimize - ; XOR A ; FILE MANIPULATOR = 0 - ; LD H,A - ; LD L,A - ; LD IX,0 - ; LD B,A ; от начала файла - ; CALL MOVE_FP - ; ; - ; SET_PAGE_X DIRPAGE - ; AND A - ; PUSH AF - ; ;!TEST no ldir - ; ; очистить кеш каталога - ; ; LD HL,#C000 - ; ; LD DE,#C001 - ; ; LD BC,#3FFF - ; ; LD (HL),L - ; ; LDIR - ; ; - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска - ; LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор - ; ; номер первого кластера - ; ; [x] fat32 - ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - ; XOR 32 - ; JR Z,.read_dir - ; ;!FIXIT переделать на работу без IY - ; LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - ; OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) CALL LOAD_SAVE_DIR_PREPARE PUSH AF EX AF,AF' - JR Z,.LoadRootDir + JR NZ,.read_dir + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.LoadRootDir + ; fat32 + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL + ; CALL .read_dir + ; LD HL,0 + ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + ; RET + ; .read_dir: LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько XOR A ; дескриптор @@ -477,14 +463,12 @@ LOAD_SAVE_DIR_PREPARE: ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A - ; [x] fat32 - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - 1 - JR NC,.exit ;!FIXIT переделать на работу без IY LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) -.exit: EX AF,AF' + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + EX AF,AF' RET ;!TODO FAT procedures @@ -493,30 +477,20 @@ LOAD_SAVE_DIR_PREPARE: ; вход: iy=структура дескриптора ; [x] fat32 ;!TEST SAVEDIR: ;!TODO optimize - ; XOR A ; FILE MANIPULATOR = 0 - ; LD H,A - ; LD L,A - ; LD IX,0 - ; LD B,A ; от начала файла - ; CALL MOVE_FP - ; ; - ; SET_PAGE_X DIRPAGE - ; AND A - ; PUSH AF - ; ; - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - ; LD (IY+_sFM.DRIVE),A - ; ; [x] fat32 - ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - ; XOR 32 - ; JR Z,.save_dir - ; ;!FIXIT переделать на работу без IY - ; LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - ; OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) CALL LOAD_SAVE_DIR_PREPARE PUSH AF EX AF,AF' - JR Z,.SaveRootDir + JR NZ,.save_dir + ; + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.SaveRootDir + ; fat32 + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL + ; .save_dir: LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) @@ -591,7 +565,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ADD HL,BC AND A SBC HL,DE - JR NC,SAVEDIR + JP NC,SAVEDIR LD HL,(SAVEDIR.DIRSIZE) LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ADD HL,BC @@ -627,7 +601,7 @@ RD_BPB: LD C,SLOT3 JP C,DOS_X_Error.Not_ready ; LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 ;R05 AND A SBC HL,DE @@ -639,22 +613,18 @@ RD_BPB: LD C,SLOT3 ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LDIR ; - LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE) CP #F0 JP C,DOS_X_Error.UnknownBPB ; ;!TODO проверить по метке раздела, что это FAT, потом определять какой FAT ; - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BytesPerSector) LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL - LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerCluster) LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER) - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),HL - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER+2) - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),HL ; calc. first sector FAT - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) + LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) ; ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) @@ -669,25 +639,23 @@ RD_BPB: LD C,SLOT3 LD C,A 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.RootDirStartCluster_L),BC ; [ ] fat32 - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables - LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables + ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + ;LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 ; ; - LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16) + LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32+4) + LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32 + 2) LD A,C LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A - LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32) + LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE ; - LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs + LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT DEC A @@ -724,8 +692,13 @@ RD_BPB: LD C,SLOT3 ENDIF ; EX DE,HL - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FilesInRootDIR) ; 0 for fat32 - DEC HL ; [ ]fat32 + LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 + ; [ ]fat32 ;!TEST + LD A,H + OR L + JR Z,.skip_loop2 + ; + DEC HL XOR A ;NEXTAD2 .loop2: INC A @@ -733,7 +706,7 @@ RD_BPB: LD C,SLOT3 SBC HL,BC JR NC,.loop2 ; - EX DE,HL +.skip_loop2: EX DE,HL LD C,A ; A - sectors in DIR LD B,0 LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A @@ -819,14 +792,14 @@ RD_BPB: LD C,SLOT3 ; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// ; [ ] fat32 - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive) + LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerDrive) LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L) - LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H) + LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) + LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low AND A @@ -841,18 +814,20 @@ RD_BPB: LD C,SLOT3 PUSH HL ; Total Sectors low SBC HL,DE ; -.HDDBIG: LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) - SCF -.loop7: RRA - JR C,.loop7_exit - RR B - RR C - RR H - RR L - JP .loop7 +.HDDBIG: CALL ClusterToSector +; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) +; SCF +; .loop7: RRA +; JR C,.loop7_exit +; RR B +; RR C +; RR H +; RR L +; JP .loop7 ; .loop7_exit: INC HL LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL + LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; XOR A LD H,A @@ -866,7 +841,7 @@ RD_BPB: LD C,SLOT3 LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) ; DE:HL = SectorsPerFAT ; - LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) + LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) LD B,A DEC A JR Z,.loop_mul_end @@ -884,7 +859,7 @@ RD_BPB: LD C,SLOT3 JR NC,.no_inc_DE INC DE .no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT - LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) + LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) ADD HL,BC JR NC,.no_inc_de INC DE @@ -917,32 +892,54 @@ RD_BPB: LD C,SLOT3 JR C,.its_FAT32 ; ; It's FAT16 - LD A,FAT_TYPE.x16 LD HL,#FFFF + LD A,FAT_TYPE.x16 +.Set_SN: EXX + LD HL,0 + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL + LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.LABEL + EXX + LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) JR .BPB_FAT ; .its_FAT12: LD HL,#0FFF LD A,FAT_TYPE.x12 - JR .BPB_FAT + JR .Set_SN ; -.its_FAT32: LD A,FAT_TYPE.x32 +.its_FAT32: EXX + LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.LABEL + EXX + ; + LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL + LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster+2) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC + CALL ClusterToSector + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC + ; + LD A,FAT_TYPE.x32 LD HL,#0FFF LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT LD H,L + LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) ; .BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC + EXX + LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL + LD BC,11 ;!HARDCODE + LDIR ; SET_PAGE_X FATPAGE PUSH AF - ; [ ] fat32 - ; XOR A - ; HL = 0 - ; EX DE,HL - ; LD DE,0 CALL READ_FAT_TABLE POP AF @@ -951,7 +948,7 @@ RD_BPB: LD C,SLOT3 XOR A RET ;!TODO detect fat type by clusters! -.IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) +.IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE) CP #F0 JR C,DOS_X_Error.UnknownBPB ; ID ram-диска - #FA @@ -963,7 +960,25 @@ RD_BPB: LD C,SLOT3 LD A,'6' LD H,L JP .BPB_FAT - ; +; + +; --> BC:HL - Cluster +; <-- BC:HL - Sector +ClusterToSector: + LD A,B + AND #0F + LD B,A + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + SCF +.loop: RRA + RET C + RR B + RR C + RR H + RR L + JP .loop +; + DOS_X_Error: .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 9430351..8ed5544 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -240,6 +240,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER POP BC LD A,B OUT (SLOT3),A + POP HL RET ; diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 269188b..97e7db7 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -1146,13 +1146,6 @@ KBD_Receiver_Overrun: ; reg 0 - error reset .reset_errors: LD A,%0011'0000 OUT (Z84.SIO.Ch_A.Ctrl),A - ;!TEST SIO INT - ; reg 0 - return from int - IF KEYBOARD_INT_ENABLED - LD A,%0011'1000 - OUT (Z84.SIO.Ch_A.Ctrl),A - ENDIF - ; ;!TODO при детекте переполнения буфера проца снять клавиши из порта #FE спектрума ; XOR A diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index bdbb111..82fcd6b 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -523,10 +523,10 @@ DEFINE_PARTITIONS: .EASYDOS: .MEDIDOS: .HIGHDOS: - LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) - LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) - LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) + LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) LD IX,(CURRENT_SECTOR_L) ADD IX,DE LD DE,(CURRENT_SECTOR_H) @@ -539,10 +539,10 @@ DEFINE_PARTITIONS: LD (IX + LOGDRV.SECTOR_OFFSET + 1),D LD (IX + LOGDRV.SECTOR_OFFSET + 2),L LD (IX + LOGDRV.SECTOR_OFFSET + 3),H - LD E,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 0) - LD D,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 1) - LD L,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 2) - LD H,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 3) + LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) ;SIZE DISK LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ff95c4c..ee7e17f 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -37,20 +37,20 @@ ; .DATE: WORD #0000 ;+ #18 +24 DATE ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE -.FS_REC: _sFAT_DIRECTORY_RECORD +.FS_REC _sFAT_DIRECTORY_RECORD ; from Core -.F_POSITION: DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) -.DIR_CLUSTER_L: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW -.DIR_CLUSTER_H: WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32 -.HANDLE: WORD #0000 ;+ #28 +40 HANDLE NUMBER -.DRIVE: BYTE #00 ;+ #2A +42 DRIVE OR CURRENT -.ACCESS_MODE: BYTE #00 ;+ #2B +43 ACCESS MODE -.TASK_NUM: BYTE #00 ;+ #2C +44 TASK +.F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) +.DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW +.DIR_CLUSTER_H WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32 +.HANDLE WORD #0000 ;+ #28 +40 HANDLE NUMBER +.DRIVE BYTE #00 ;+ #2A +42 DRIVE OR CURRENT +.ACCESS_MODE BYTE #00 ;+ #2B +43 ACCESS MODE +.TASK_NUM BYTE #00 ;+ #2C +44 TASK .OptimizedClusters BYTE #00 ;+ #2D +45 -.KnownCluster_L: WORD #0000 ;+ #2E +46 Младшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: WORD #0000 ;+ #30 +48 Старшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownCluster_L WORD #0000 ;+ #2E +46 Младшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H WORD #0000 ;+ #30 +48 Старшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS ;ACCESS MODE: A=0 чтение/запись ; A=1 чтение diff --git a/DSS/build.txt b/DSS/build.txt index 4d19020..3d3f955 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -950 \ No newline at end of file +973 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 0e2bbfb..e9bcf54 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 0e2bbfb73ceb70a16b2ab2b5ee6cbc6bd5005bf7 +Subproject commit e9bcf54a516df972207fc032925d2dfb74c39a89 From bb5748091c4298b8d9a4912ae7358eb46839b5fb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 16 Apr 2024 03:14:08 +1000 Subject: [PATCH 114/219] fat32: 90% --- DSS/API/Create.asm | 8 +++++--- DSS/API/diskINF.asm | 8 ++++++++ DSS/FS/FAT/FAT_X.asm | 15 +++++++++------ DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 32 ++++++++++++++++++++++---------- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 7 files changed, 47 insertions(+), 22 deletions(-) diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index c4b1b21..f3c4ed3 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -54,20 +54,22 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; ; ;no_file_found -.DO: LD HL,MASKARE +.DO: ; _sFAT_DIRECTORY_RECORD.NAME + .EXT + LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR EX DE,HL .TMP+1: LD A,0 + ; _sFAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL LD BC,#0A00 ;!HARDCODE - ; + ; .RESERVED_NT .. .FIRST_CLUSTER_H .loop1: LD (HL),C INC HL DJNZ .loop1 - ;AaRR + ; .TIME .. .DATE CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD ; LD BC,#0600 diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 9852d60..c4f79b9 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -156,6 +156,8 @@ DISKINF: LD C,B EXX LD H,A LD L,A + LD B,A + LD C,A EXX LD B,A LD C,A @@ -181,6 +183,12 @@ DISKINF: LD C,B INC BC EXX .skip: INC HL + LD A,L + OR H + JR NZ,.loop_free_space + EXX + INC HL + EXX JR .loop_free_space ; ; [ ] 22/11/23 подфункция с доп.инфой diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 8ed5544..5ebdb27 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -241,6 +241,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER LD A,B OUT (SLOT3),A POP HL + LD A,0 RET ; @@ -339,17 +340,19 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; CALL GET_FAT32_CELL EXX POP HL ; старшее слово номера кластера в который записать + POP DE + PUSH DE ; старший номер кластера который вписать EXX - POP DE ; старший номер кластера который вписать - POP BC ; младший номер кластера который вписать + POP BC ; старший номер кластера который вписать + POP DE ; младший номер кластера который вписать ; сохр. в кеше FAT-а номер кластера - LD (HL),C - INC HL - LD (HL),B - INC HL LD (HL),E INC HL LD (HL),D + INC HL + LD (HL),C + INC HL + LD (HL),B JR .exit ;;;;;;;;; diff --git a/DSS/build.txt b/DSS/build.txt index 3d3f955..0ebf2af 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -973 \ No newline at end of file +951 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 1c85b0f..c6d83a5 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -531,15 +531,27 @@ read_disk_info: ;PUSH DE ; свободных кластеров PUSH BC ; размер сектора в байтах EX AF,AF' - LD C,A ; A - размер кластера в секторах - CALL Mult16X8 - ; A:HL = DE*A + ; !TEST fat 32 + ;LD C,A ; A - размер кластера в секторах + ;CALL Mult16X8 + ; A:HL = DE*A + LD B,0 + LD C,A + EXX + PUSH DE + EXX + POP HL + ; HL:DE * BC свободные_кластеры * размер_кластера_в_секторах + CALL Mult32 + ; HL:DE = свободные_секторы ; - EX DE,HL - LD H,0 - LD L,A + ; EX DE,HL + ; LD H,0 + ; LD L,A POP BC CALL Mult32 + ; HL:DE = свободное место ;!FIXIT ограничено 4 гигами + ; LD (free_space+2),HL EX DE,HL LD (free_space),HL @@ -773,8 +785,8 @@ Size2Char: /////////////////////////////////////////////////////////////////////////////////////// ;----------------------------------------------------------------------; ;Процедура умножения (16*8bit) -;На вход: DE*C -;На выход:A+HL-результат +;На вход: DE * C +;На выход:A:HL = результат Mult16X8: SUB A LD L,A @@ -798,8 +810,8 @@ Mlt16x8: ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;Процедура умножения (32bit) -;На вход: HL+DE*BC -;На выход:HL+DE-результат +;На вход: HL:DE * BC +;На выход:HL:DE = результат Mult32: PUSH IX LD IX,#0000 diff --git a/SHELL/build.txt b/SHELL/build.txt index 75af06e..272a458 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -315 \ No newline at end of file +316 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index e9bcf54..17acd88 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e9bcf54a516df972207fc032925d2dfb74c39a89 +Subproject commit 17acd882094d59946a9cd430a03e736e36fea49b From 453d3d6b688c227d5b96822085db40f6ad0e0d83 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 17 Apr 2024 03:02:12 +1000 Subject: [PATCH 115/219] + new func DELETE_LFS_RECORDS --- BOOT/DSSBOOT.ASM | 6 ++--- DSS/API/Attribute.asm | 2 +- DSS/API/Close.asm | 4 +-- DSS/API/Create.asm | 4 +-- DSS/API/Delete.asm | 11 ++++---- DSS/API/Find.asm | 2 +- DSS/API/MkDir.asm | 32 +++++++++++----------- DSS/API/Rename.asm | 9 +++++-- DSS/API/RmDir.asm | 8 +++--- DSS/DSS-MAIN.ASM | 13 +++++---- DSS/FS/FAT/FAT.asm | 63 +++++++++++++++++++++++++++++++++---------- DSS/FS/FAT/FAT_X.asm | 4 +-- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- Shared_Includes | 2 +- 16 files changed, 105 insertions(+), 61 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 051747a..bf675bb 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -400,8 +400,8 @@ GETROOT: LD HL,(DIR_FRH) ; SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 - LD IX,DIR-#0020 -.SKIPNAM: LD DE,#0020 + LD IX,DIR - FAT_DIRECTORY_RECORD +.SKIPNAM: LD DE,FAT_DIRECTORY_RECORD ADD IX,DE DEC C RET Z @@ -428,7 +428,7 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD E,XL LD HL,HANDBUF EX DE,HL - LD BC,#0020 + LD BC,FAT_DIRECTORY_RECORD LDIR XOR A INC A diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 2ae2501..a26b780 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -26,7 +26,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 CALL .OPENATR ;R002 RET C ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT) ;PUSH BC ;CALL CLOSE diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index a881cb1..64844b3 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -55,7 +55,7 @@ CLOSE_FN: ; ;!TEST 9/11/23 record index ; LD HL,DIR - ; LD DE,#0020 + ; LD DE,FAT_DIRECTORY_RECORD ; LD C,(IY+_sFM.HANDLE) ; LD B,(IY+_sFM.HANDLE+1) ; JR .CLOSE2 @@ -75,7 +75,7 @@ CLOSE_FN: ;PUSH HL ;SET_PAGE_X DIRPAGE ;POP HL - LD BC,#0020 ;!HARDCODE + LD BC,FAT_DIRECTORY_RECORD LDIR OUT (SLOT3),A CALL SAVEDIR diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index f3c4ed3..acfd62b 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -54,14 +54,14 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; ; ;no_file_found -.DO: ; _sFAT_DIRECTORY_RECORD.NAME + .EXT +.DO: ; FAT_DIRECTORY_RECORD.NAME + .EXT LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR EX DE,HL .TMP+1: LD A,0 - ; _sFAT_DIRECTORY_RECORD.ATTRIBUT + ; FAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL LD BC,#0A00 ;!HARDCODE diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index a0277a7..b6d0873 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -32,15 +32,16 @@ DEL_FN: ;!TEST .DELETE: SET_PAGE_X DIRPAGE EX AF,AF' - LD (IX + _sFAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла + CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN + LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла ; fat32 - LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера - LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD A,E OR D EXX - LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) OR D OR E ; diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 1c2c86b..fa24f3b 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -42,7 +42,7 @@ F_FIRST: .FIND_S: INC DE ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes - LD BC,#0020 ;!HARDCODE размер одной записи каталога + LD BC,FAT_DIRECTORY_RECORD ADD IX,BC LD (F_NEXT.CURHND),IX LD HL,HANDBUF+12 ;!HARDCODE diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index de6133b..9735f72 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -53,14 +53,14 @@ MKDIR: EXX ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR EX DE,HL LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога - ; _sFAT_DIRECTORY_RECORD.ATTRIBUT + ; FAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL LD BC,#0800 ; b=счетчик @@ -68,7 +68,7 @@ MKDIR: .loop1: LD (HL),C INC HL DJNZ .loop1 - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H + ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H ; fat32 запись старшего номера кластера .FIRST_CLUSTER_H POP DE PUSH DE ; старший номер сектора @@ -83,12 +83,12 @@ MKDIR: POP DE ; младший номер сектора PUSH DE PUSH BC - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L + ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L LD (HL),E INC HL LD (HL),D INC HL - ; _sFAT_DIRECTORY_RECORD.F_SIZE + ; FAT_DIRECTORY_RECORD.F_SIZE LD BC,#0400 ; b=счетчик .loop2: LD (HL),C INC HL @@ -106,9 +106,9 @@ MKDIR: .loop3: INC HL LD (HL),C DJNZ .loop3 - ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD + ; скопировать байты 11..31 FAT_DIRECTORY_RECORD INC HL - LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + LD DE,HANDBUF+FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла EX DE,HL LD BC,21 ; !HARDCODE LDIR @@ -126,7 +126,7 @@ MKDIR: SET_PAGE_X DIRPAGE PUSH AF ; - LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи + LD DE,DIRPAGE.buffer + FAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи ; LD A,(DIRPAGE.buffer) CP "." @@ -134,14 +134,14 @@ MKDIR: ; ;LD IX,HANDBUF XOR A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A - LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A - LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A + LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A + LD DE,HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .copy_dir_record: EX DE,HL - LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 + LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.ATTRIBUT ; 21 LDIR POP AF OUT (SLOT3),A @@ -151,7 +151,7 @@ MKDIR: LD E,L INC DE LD (HL),0 - LD BC,512-65 ;!HARDCODE + LD BC,512-65 ;!HARDCODE sector size LDIR ; POP HL ; старший номер сектора @@ -182,7 +182,7 @@ MKDIR: JR Z,.skip_clean ; LD DE,CORE_BUFFERS.SECBUF+1 - LD BC,511 ;!HARDCODE + LD BC,511 ;!HARDCODE sector size LD (HL),0 LDIR .skip_clean: ; diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index e324224..cf18e26 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -61,12 +61,17 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 RET C SET_PAGE_X DIRPAGE - + EX AF,AF' + ; LD HL,MASKARE LD D,XH LD E,XL LD BC,11 - LDIR + LDIR + ; + CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN + ; + EX AF,AF' OUT (SLOT3),A JP SAVEDIR ; \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 0723673..9823609 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -39,9 +39,9 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 CALL SEARCH.Dir RET C ; fat32 - LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) EXX - LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы ; ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах @@ -83,13 +83,13 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 JR Z,.next_record CP #E5 ;!HARDCODE байт удаления файла JR Z,.next_record - LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов + LD DE,FAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE AND FAT_ATTR.VOLUME_ID JP Z,.error ;DIR NOT EMPTY -.next_record: LD DE,#0020 +.next_record: LD DE,FAT_DIRECTORY_RECORD ADD HL,DE DJNZ .check_dir_loop ; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 6453629..a7dd2b7 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -28,15 +28,15 @@ //SPRINTER EQU 2000 includelua 'Shared_includes/lua/Functions.lua' - INCLUDE 'defines.inc' + include 'shared_includes/structures/FileSystem.inc' include 'shared_includes/constants/sp2000.inc' + INCLUDE 'defines.inc' + include 'Structures.inc' include 'shared_includes/constants/standart_colors.inc' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' - include 'shared_includes/structures/FileSystem.inc' include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/macros.z80' - include 'Structures.inc' INCLUDE 'VERSION.INC' INCLUDE 'DSS_MACROSES.Z80' @@ -605,11 +605,14 @@ DEPLOY: ;Allocate memory DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." DRV_CONTENT: DISP 0 - INCLUDE 'DRV-MAIN.ASM' + INCLUDE 'DRV-MAIN.ASM' ENT DRV_CONTENT.SIZE EQU $-DRV_CONTENT - DISPLAY "END ADDRESS: ",/H,$ +BIN_END_ADDRESS EQU $ + + + DISPLAY "END ADDRESS: ",/H,BIN_END_ADDRESS DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512 ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!'; ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!'; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 04663f3..6b3894d 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -9,6 +9,41 @@ ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;--------------------------------------------------------------- ;----------------------------------------------------------------------; + +; [ ] удаление записи LFN +; +; вход: IX = текущая запись в странице с каталогом FAT +; для которой надо удалить записи LFS +DELETE_LFN_RECORDS: + PUSH IX + LD A,XH + AND #C0 + SUB 1 + LD C,A + ; В регистре C маска для определения выхода за пределы страницы + ; +.find_LFN: LD DE, -(FAT_DIRECTORY_RECORD) + LD A,FAT_ATTR.LFS_Entry + ; +.loop: ADD IX,DE + LD A,XH + CP C + JR Z,.beyond_boundaries + ; + LD A,FAT_ATTR.LFS_Entry + CP (IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + JR NZ,.exit + LD (IX+FAT_DIRECTORY_RECORD.NAME),#E5 + JR .loop + ; +.exit: AND A +.beyond_boundaries: ; !TODO подгрузка другой части каталога. пока заглушка + POP IX + RET + +;----------------------------------------------------------------------; + + ; Поиск записи каталога в списке каталога ; ; вход: a = атрибут записи @@ -43,12 +78,12 @@ SEARCH: ; LD DE,0 ; EXX ; -.loop: LD A,(IX+_sFAT_DIRECTORY_RECORD.NAME) +.loop: LD A,(IX+FAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены JR Z,.next_record - LD A,(IX+_sFAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) AND C JR NZ,.next_record LD HL,MASKARE @@ -93,7 +128,7 @@ SEARCH: ; INC DE ; EXX ; - LD DE,#0020 ;!HARDCODE + LD DE,FAT_DIRECTORY_RECORD ADD IX,DE JR NC,.loop .error_too_many_files: @@ -122,7 +157,7 @@ SEARCH: ; CALL LOADDIR ; POP DE ; LD HL,DIR -; LD BC,#0020 +; LD BC,FAT_DIRECTORY_RECORD ;G_HAND2: ; LD A,D ; OR E @@ -178,12 +213,12 @@ FINDDIR: PUSH AF LD IX,DIRPAGE.buffer .big_loop: - LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) + LD A,(IX + FAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error CP #E5 JR Z,.next_step - LD A,(IX + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT) AND FAT_ATTR.DIRECTORY JR Z,.next_step LD HL,MASKARE @@ -201,10 +236,10 @@ FINDDIR: INC DE DJNZ .loop ; - LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) + LD A,(IX + FAT_DIRECTORY_RECORD.NAME) CP "." JP NZ,.ADDSPEC - LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME + 1) + LD A,(IX + FAT_DIRECTORY_RECORD.NAME + 1) CP "." JP NZ,.IT_DIR LD HL,WorkDirectory @@ -231,7 +266,7 @@ FINDDIR: JP .IT_DIR ; .next_step: - LD BC,#0020 ;!HARDCODE + LD BC,FAT_DIRECTORY_RECORD ADD IX,BC JR NC,.big_loop ; @@ -293,12 +328,12 @@ FINDDIR: ; ; JP IT_DIR ; .IT_DIR:; fat32 - LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) - LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD YH,D LD YL,E - LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) - LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) POP AF OUT (SLOT3),A AND A @@ -534,7 +569,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ; LD DE,0 ; EXX ; - LD BC,#0020 + LD BC,FAT_DIRECTORY_RECORD .loop: ;LD A,(IX+00) LD A,(HL) OR A diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 5ebdb27..14a208f 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1233,12 +1233,12 @@ WRITE_DATE_TIME_TO_DIRECTORY_RECORD: CALL SYSTIME ; узнать тек. дату и время CALL MK_TIME ; закодировать время/дату POP HL - ; _sFAT_DIRECTORY_RECORD.TIME + ; FAT_DIRECTORY_RECORD.TIME LD (HL),E ; de=время INC HL LD (HL),D INC HL - ; _sFAT_DIRECTORY_RECORD.DATE + ; FAT_DIRECTORY_RECORD.DATE LD (HL),C ; день INC HL LD (HL),B ; месяц diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ee7e17f..ce82e8c 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -37,7 +37,7 @@ ; .DATE: WORD #0000 ;+ #18 +24 DATE ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE -.FS_REC _sFAT_DIRECTORY_RECORD +.FS_REC FAT_DIRECTORY_RECORD ; from Core .F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW diff --git a/DSS/build.txt b/DSS/build.txt index 0ebf2af..9f02e1c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -951 \ No newline at end of file +952 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 6bd6034..0e35f90 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -129,7 +129,7 @@ ENVADDR EQU #E400 ;FAT_CACHE EQU #C000 FMCOUNT EQU 10 ; Количество файловых манипуляторов -HANDBUF.SIZE EQU 32 ; !HARDCODE _sFAT_DIRECTORY_RECORD +HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD ;----------------------------------------------------; ; diff --git a/Shared_Includes b/Shared_Includes index 17acd88..73f764c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 17acd882094d59946a9cd430a03e736e36fea49b +Subproject commit 73f764ccd1ab8de8dea7eef3b4f5cd27e2ea8dab From beb5dd8196bd1aff441b3d8d430c0e5442524e19 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 19 Apr 2024 03:39:02 +1000 Subject: [PATCH 116/219] many bugfixes --- BOOT/boot.asm | 28 ++- DSS/API/Execute.ASM | 12 +- DSS/API/GetMem.asm | 3 +- DSS/API/MkDir.asm | 33 +-- DSS/API/RetMem.asm | 6 +- DSS/API/RmDir.asm | 31 +-- DSS/API/SetMem.asm | 3 +- DSS/DSS-MAIN.ASM | 45 ++-- DSS/FS/FAT/FAT.asm | 393 +++++++++++++++++++--------------- DSS/FS/FAT/FAT_X.asm | 52 +++-- DSS/Media_drivers/ide-drv.asm | 369 ++++++++++++++++--------------- DSS/Structures.inc | 16 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- Shared_Includes | 2 +- 15 files changed, 553 insertions(+), 444 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index dce1683..e26b06a 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -380,12 +380,16 @@ write_to_: ld a,(disk) ; ; ret write_to_hard_disk: - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого CALL write_to_ RET C + ; проверка на РАМ-диск + LD A,B + CP #80-1 ;!HARDCODE HDD number + CCF + RET NC ; PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR - LD A,B LD HL,0 LD IX,0 LD DE,buffer @@ -414,6 +418,26 @@ write_to_hard_disk: ; LD A,#80 LD (HL),A + ;!FIXIT fat32 not supported + PUSH HL + INC HL + INC HL + INC HL + INC HL + LD A,(HL) + POP HL + CP PartitionSysTypes.FAT12 + JR Z,.next + CP PartitionSysTypes.FAT16_32Mb + JR Z,.next + CP PartitionSysTypes.FAT16 + JR Z,.next + CP PartitionSysTypes.FAT16_LBA + JR Z,.next + ; NOT SUPPORTED FS + POP BC + SCF + RET ; .next: AND A SBC HL,DE diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 8cc11c1..38712ce 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -355,11 +355,11 @@ _TST_PROC: CALL GETMEM ; ; LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECBUF+1 + LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 CALL SCOPYS LD A,#80 ;!HARDCODE cmd line size SUB B - LD (CORE_BUFFERS.SECBUF),A + LD (CORE_BUFFERS.SECTOR_BUFFER),A ;R02 LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; @@ -441,7 +441,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) EX DE,HL LD XH,D LD XL,E - LD HL,CORE_BUFFERS.SECBUF + LD HL,CORE_BUFFERS.SECTOR_BUFFER LD C,(HL) INC C LDIR @@ -588,7 +588,8 @@ WAIT: LD A,(ErrorLevel) ;----------------------------------------------------------------------- FREE_PROCESS_MEMORY: - LD HL,MEMTAB + ;LD HL,MEMTAB + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц LD BC,256 ;!HARDCODE размер блока страниц ОЗУ .loop: LD A,(TASK) CPIR @@ -597,7 +598,8 @@ FREE_PROCESS_MEMORY: PUSH BC DEC HL AND A - LD DE,MEMTAB + ;LD DE,MEMTAB + LD DE,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц SBC HL,DE LD A,L CALL RETMEM ; освоб. блок памяти diff --git a/DSS/API/GetMem.asm b/DSS/API/GetMem.asm index 5052ee7..9d30112 100644 --- a/DSS/API/GetMem.asm +++ b/DSS/API/GetMem.asm @@ -11,7 +11,8 @@ GETMEM: LD C,BIOS.GetMem LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY RET C LD D,#00 - LD HL,MEMTAB ; массив списка выдел. страниц + ;LD HL,MEMTAB ; массив списка выдел. страниц + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц ADD HL,DE LD A,(TASK) ; уровень текущей программы LD (HL),A diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 9735f72..3ea0859 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -53,7 +53,7 @@ MKDIR: EXX ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 @@ -99,7 +99,7 @@ MKDIR: ; ; создаём служебные каталоги "." и ".." в созданном каталоге ; КАТАЛОГ "." - LD HL,CORE_BUFFERS.SECBUF ; буфер + LD HL,CORE_BUFFERS.SECTOR_BUFFER ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел ; @@ -162,26 +162,29 @@ MKDIR: .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Write - RST ToDSS.DRV + ; IN A,(SLOT3) + ; PUSH AF + ; IN A,(SLOT0) + ; OUT (SLOT3),A + ; ; + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 + ; LD BC,1*256 + Dss.DRV.Write + ; RST ToDSS.DRV + ; ; + ; POP AF + ; OUT (SLOT3),A + CALL WRITE_SECTOR + ; !FIXIT нет проверки на ошибку ; - POP AF - OUT (SLOT3),A - ; - LD HL,CORE_BUFFERS.SECBUF + LD HL,CORE_BUFFERS.SECTOR_BUFFER ; [x] optimization LD A,(HL) OR A JR Z,.skip_clean ; - LD DE,CORE_BUFFERS.SECBUF+1 + LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 LD BC,511 ;!HARDCODE sector size LD (HL),0 LDIR diff --git a/DSS/API/RetMem.asm b/DSS/API/RetMem.asm index fb5aab4..4258bf2 100644 --- a/DSS/API/RetMem.asm +++ b/DSS/API/RetMem.asm @@ -6,7 +6,8 @@ ////////////////////////////////////////////////////////////////////// RETMEM: LD E,A LD D,#00 - LD HL,MEMTAB ; массив списка выдел. страниц + ;LD HL,MEMTAB ; массив списка выдел. страниц + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц ADD HL,DE LD A,(TASK) ; уровень текущей программы CP (HL) @@ -20,7 +21,8 @@ RETMEM: LD E,A ;POP DE LD A,DSS_Error.sys.INVALID_MEMORY_HND RET C - LD HL,MEMTAB + ;LD HL,MEMTAB + LD HL,CORE_BUFFERS.MemoryTable ADD HL,DE XOR A LD (HL),A diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 9823609..95f45f5 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -53,32 +53,33 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD B,A - LD C,Dss.DRV.Read ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: ;PUSH AF PUSH BC PUSH HL PUSH IX ; - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - LD DE,CORE_BUFFERS.SECBUF+#C000 - ;LD BC,1*256 + Dss.DRV.Read - LD B,1 - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - RST ToDSS.DRV - POP AF - OUT (SLOT3),A + ; IN A,(SLOT3) + ; PUSH AF + ; IN A,(SLOT0) + ; OUT (SLOT3),A + ; ; + ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 + ; LD BC,1*256 + Dss.DRV.Read + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; RST ToDSS.DRV + ; POP AF + ; OUT (SLOT3),A + CALL READ_SECTOR + ; !FIXIT нет проверки на ошибку ; ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD B,16 - LD HL,CORE_BUFFERS.SECBUF + LD HL,CORE_BUFFERS.SECTOR_BUFFER .check_dir_loop: LD A,(HL) OR A - JP Z,.RMD15 ;DIR EMPTY + JP Z,.dir_empty CP "." JR Z,.next_record CP #E5 ;!HARDCODE байт удаления файла @@ -120,7 +121,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 .delete: POP IX JP DEL_FN.DELETE ; пометить запись как "удаленная" ; -.RMD15: POP HL +.dir_empty: POP HL POP HL POP HL POP HL diff --git a/DSS/API/SetMem.asm b/DSS/API/SetMem.asm index edde33a..92beb2f 100644 --- a/DSS/API/SetMem.asm +++ b/DSS/API/SetMem.asm @@ -7,7 +7,8 @@ ////////////////////////////////////////////////////////////////////// SETMEM: LD E,A LD D,#00 - LD HL,MEMTAB + ;LD HL,MEMTAB + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц ADD HL,DE LD A,(TASK) CP (HL) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index a7dd2b7..2d8b51f 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -290,7 +290,7 @@ CLEAR_BUFFER_AND_INIT_PROC: ; DS $/256+1*256-$,0 c:\bin\menu ;----------------------------------------------------------------------; -MEMTAB: BLOCK 256,0 +;MEMTAB: BLOCK 256,0 ;----------------------------------------------------------------------; _mInfoALIGN 256,0 @@ -415,17 +415,32 @@ FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer -SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER +SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER +MemoryTable EQU BUFFERSplace.MemoryTable ENDMODULE CLEAR_ZONE.size EQU _sBuffers ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "BUFFERSplace ", /H, CORE_BUFFERS.BUFFERSplace - DISPLAY "FatBuffer ", /H, CORE_BUFFERS.FatBuffer - DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer - DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF - DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF + DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start + DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size + DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "Consist: " + DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF + DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size + DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize + DISPLAY " FatBuffer ", /H, CORE_BUFFERS.FatBuffer + DISPLAY " FatBuffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer + DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF + DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF + DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK + DISPLAY " Size ", /H, CORE_BUFFERS.BUFFER - CORE_BUFFERS.XSTACK + DISPLAY " BUFFER ", /H, CORE_BUFFERS.BUFFER + DISPLAY " Size ", /H, CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFER + DISPLAY " MemoryTable ", /H, CORE_BUFFERS.MemoryTable + DISPLAY " Size ", /H, _sBuffers - (CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFERSplace) + DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size DISPLAY "--- --- --- --- --- --- --- ---" EXPORT CORE_BUFFERS.BUFFERSplace @@ -434,8 +449,8 @@ CLEAR_ZONE.size EQU _sBuffers EXPORT CORE_BUFFERS.EXEBUFF EXPORT CORE_BUFFERS.XSTACK EXPORT CORE_BUFFERS.BUFFER - EXPORT CORE_BUFFERS.SECBUF - + EXPORT CORE_BUFFERS.SECTOR_BUFFER + EXPORT CORE_BUFFERS.MemoryTable /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FM_BUF _sFM=$ @@ -464,16 +479,10 @@ EXEBUFF _sEXE_HEADER=$+FM_BUF.FullSize XSTACK EQU EXEBUFF+_sEXE_HEADER+255 BUFFER EQU XSTACK+1 -SECBUF EQU BUFFER +SECTOR_BUFFER EQU BUFFER ;R11 //////////////////////////////// */ - DISPLAY "FM_BUF addr: ",/H,CORE_BUFFERS.FM_BUF - DISPLAY "FM_BUF.Size: ",/H,CORE_BUFFERS.FM_BUF.Size - DISPLAY "FM_BUF.FullSize: ",/H,CORE_BUFFERS.FM_BUF.FullSize - DISPLAY "EXEBUFF: ",/H,CORE_BUFFERS.EXEBUFF - DISPLAY "XSTACK: ",/H,CORE_BUFFERS.XSTACK - DISPLAY "BUFFER: ",/H,CORE_BUFFERS.BUFFER -; + ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < ; @@ -634,7 +643,7 @@ BIN_END_ADDRESS EQU $ ;R06 ;R06 BUFFER -;R06 SECBUF DB ". ",#10 +;R06 SECTOR_BUFFER DB ". ",#10 ;R06 DW 0,0,0,0,0 ;R06 DW #0000 ;R06 DW #0000 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 6b3894d..ada06b3 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -10,10 +10,65 @@ ;--------------------------------------------------------------- ;----------------------------------------------------------------------; +; сбрасывает значения свободных и первого свободного секторов на "неопределено" +RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) + OR A + RET Z + ; + CALL READ_FSinfo + ; + LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + LD B,8 ; 2 x DWORD + LD A,#FF + ; +.fsinfo_loop: LD (HL),A + INC HL + DJNZ .fsinfo_loop + ; + XOR A + LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + JR WRITE_FSinfo +; ; +; Прочитать BPB в SECTOR_BUFFER +READ_BPB: LD C,Dss.DRV.GetBPB + JR RW_SECTOR + ; +; Записать FSinfo из SECTOR_BUFFER +WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) + LD HL,0 +; Записать сектор из SECTOR_BUFFER +; Вход: HL:IX = Logical Block (sector) +WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write + JR RW_SECTOR + ; +; Прочитать FSinfo в SECTOR_BUFFER +READ_FSinfo: + LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) + LD HL,0 +; Прочитать сектор в SECTOR_BUFFER +; Вход: HL:IX = Logical Block (sector) +READ_SECTOR: LD BC,1*256 + Dss.DRV.Read + ; +RW_SECTOR: IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + ; + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 + RST ToDSS.DRV + EX AF,AF' + ; + POP AF + OUT (SLOT3),A + EX AF,AF' + RET +; + ; [ ] удаление записи LFN ; -; вход: IX = текущая запись в странице с каталогом FAT -; для которой надо удалить записи LFS +; вход: IX = текущая запись в странице с каталогом FAT для которой +; надо удалить записи LFS DELETE_LFN_RECORDS: PUSH IX LD A,XH @@ -40,7 +95,6 @@ DELETE_LFN_RECORDS: .beyond_boundaries: ; !TODO подгрузка другой части каталога. пока заглушка POP IX RET - ;----------------------------------------------------------------------; @@ -360,10 +414,10 @@ FINDDIR: CHECK_ROOT_CLUSTER: EX DE,HL - LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005 LD A,L OR H - LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H) + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) OR L OR H EX DE,HL @@ -372,22 +426,14 @@ CHECK_ROOT_CLUSTER: ;----------------------------------------------------------------------; ; вход: HL - имя директории ; [x] fat32 ;!TEST -; !FIXIT ловится двойное обращение при открытии корня диска, например OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD A,(HL) OR A JR NZ,.SUBDIR -.REROOT: ; fat32 - ; EX DE,HL - ; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - ; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL - ; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - ; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL - ; EX DE,HL - LD DE,0 - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),DE - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),DE - + ; +.REROOT: LD DE,0 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE CALL LOADDIR ; CF=0 LD HL,WorkDirectory @@ -430,13 +476,12 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF .SUBDIR3: CALL FINDDIR RET C EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; fat32 - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; fat32 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32 LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL - ;EX DE,HL - ;JP LOADDIR -;--------------; + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL +;-------------; EX DE,HL +; JP LOADDIR ; Прочитать список каталога ; [x] fat32 ;!TEST LOADDIR: ;!TODO optimize @@ -449,14 +494,9 @@ LOADDIR: ;!TODO optimize JR NZ,.LoadRootDir ; fat32 LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL - ; CALL .read_dir - ; LD HL,0 - ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - ; RET + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL ; .read_dir: LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько @@ -467,7 +507,7 @@ LOADDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ; ст. разряд +.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога @@ -522,9 +562,9 @@ SAVEDIR: ;!TODO optimize JR NZ,.SaveRootDir ; fat32 LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL ; .save_dir: LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory @@ -537,7 +577,7 @@ SAVEDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) +.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors @@ -611,60 +651,44 @@ WRT_HND: SET_PAGE_X DIRPAGE ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ; не используется -; TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open -; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) -; LD C,Dss.DRV.MediaCheck -; RST ToDSS.DRV -; OR A -; RET Z - - -; рег. A - номер диска -; [ ] fat32 -RD_BPB: LD C,SLOT3 - IN B,(C) - PUSH BC - IN A,(SLOT0) - OUT (SLOT3),A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 - LD C,Dss.DRV.GetBPB - RST ToDSS.DRV - POP BC - OUT (C),B +; [x] fat32 ;!TEST +RD_BPB: ; LD C,SLOT3 + ; IN B,(C) + ; PUSH BC + ; IN A,(SLOT0) + ; OUT (SLOT3),A + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08 + ; LD C,Dss.DRV.GetBPB + ; RST ToDSS.DRV + ; POP BC + ; OUT (C),B + CALL READ_BPB JP C,DOS_X_Error.Not_ready ; LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 ;R05 AND A SBC HL,DE JP NZ,DOS_X_Error.UnknownBPB ; ; ;R08 ; [x] fat32 - ; LD HL,CORE_BUFFERS.SECBUF + ; LD HL,CORE_BUFFERS.SECTOR_BUFFER ; LD DE,CORE_BUFFERS.BootSector ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LDIR ; - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE) + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) CP #F0 JP C,DOS_X_Error.UnknownBPB ; - ;!TODO проверить по метке раздела, что это FAT, потом определять какой FAT - ; - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BytesPerSector) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector) LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerCluster) + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A ; calc. first sector FAT - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) - ; - ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec - ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) - ; ADD HL,DE - ; + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) ;!FIXIT для fat32 втыкать сюда сектора активной таблицы LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 @@ -675,22 +699,21 @@ RD_BPB: LD C,SLOT3 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.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables - ;LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 ; ; - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT16) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) LD A,C LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE ; - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) ; amount FATs + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT DEC A @@ -727,7 +750,7 @@ RD_BPB: LD C,SLOT3 ENDIF ; EX DE,HL - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 ; [ ]fat32 ;!TEST LD A,H OR L @@ -762,79 +785,36 @@ RD_BPB: LD C,SLOT3 JP NC,.loop3 .loop3.end: ; LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL - ; - IF COMPILE_UNUSED_CODE - EX DE,HL - LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize - XOR A - ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -.loop4: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,DE - JR NC,.loop4 - LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) - ENDIF - - //////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////// -; LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага -; LD DE,FAT_STRING -; LD B,3 -; ;R_BPBL1 -; .loop5: LD A,(DE) -; CP (HL) -; JP NZ,.IBM_DOS -; INC HL -; INC DE -; DJNZ .loop5 - ;FID -; .loop6: LD A,(HL) -; INC HL -; CP ' ' -; JR Z,.loop6 -; ; -; CP '1' -; JP Z,.fat1x -; CP '3' -; JP NZ,DOS_X_Error.UnknownBPB -; LD A,#52 ; #52-#20 = #32 fat type -; LD HL,#0FFF -; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL -; LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT -; LD H,L -; JR .BPB_FAT -; ; -; .fat1x: LD A,(HL) -; CP '2' ; FAT16 -; LD HL,#0FFF -; JR Z,.BPB_FAT -; CP '6' ; FAT12 -; JP NZ,DOS_X_Error.UnknownBPB -; LD H,L -; .BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) -; LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A -; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL -;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// +;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer +; EX DE,HL +; LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize +; XOR A +; ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится +;.loop4: INC A +; JP Z,DOS_X_Error.UnknownBPB +; SBC HL,DE +; JR NC,.loop4 +; LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) +; ; LD HL,0 -; LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track -; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.HEADS) -; .BPB_L1: ; calc. sector per cylinder +; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.HEADS) +;.BPB_L1: ; calc. sector per cylinder ; ADD HL,BC ; DEC A ; JR NZ,.BPB_L1 ; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// ; [ ] fat32 - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerDrive) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low AND A @@ -862,7 +842,11 @@ RD_BPB: LD C,SLOT3 ; .loop7_exit: INC HL LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL - LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC + LD A,L + OR H + JR NZ,.no_inc_bc + INC BC +.no_inc_bc: LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; XOR A LD H,A @@ -876,7 +860,7 @@ RD_BPB: LD C,SLOT3 LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) ; DE:HL = SectorsPerFAT ; - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) LD B,A DEC A JR Z,.loop_mul_end @@ -894,7 +878,7 @@ RD_BPB: LD C,SLOT3 JR NC,.no_inc_DE INC DE .no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) ADD HL,BC JR NC,.no_inc_de INC DE @@ -926,43 +910,48 @@ RD_BPB: LD C,SLOT3 SBC HL,BC JR C,.its_FAT32 ; - ; It's FAT16 + ; It's FAT16 LD HL,#FFFF LD A,FAT_TYPE.x16 -.Set_SN: EXX +.set_vars: EXX LD HL,0 LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.LABEL + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),HL + LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL EXX - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER) - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) - JR .BPB_FAT + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) + JR .SET_VARS ; .its_FAT12: LD HL,#0FFF LD A,FAT_TYPE.x12 - JR .Set_SN + JR .set_vars ; .its_FAT32: EXX - LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.LABEL + LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL EXX ; - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster+2) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC + CALL ClusterToSector LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC ; + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) + LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL + ; LD A,FAT_TYPE.x32 LD HL,#0FFF LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL LD H,L - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER) - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) ; -.BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A +.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC @@ -970,32 +959,98 @@ RD_BPB: LD C,SLOT3 LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL LD BC,11 ;!HARDCODE LDIR - ; SET_PAGE_X FATPAGE - PUSH AF LD DE,0 CALL READ_FAT_TABLE POP AF OUT (SLOT3),A - CALL R_CLUST - XOR A - RET - ;!TODO detect fat type by clusters! -.IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE) - CP #F0 - JR C,DOS_X_Error.UnknownBPB - ; ID ram-диска - #FA - CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 - LD A,'2' - LD HL,#0FFF - JP NZ,.BPB_FAT ; - LD A,'6' - LD H,L - JP .BPB_FAT -; + ; Установить начальный кластер для чтения + LD A,(CORE_BUFFERS.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 + XOR A + RET + ; +.set_FSinfo: ; + IFN USE_FSINFO_FAT32 + CALL READ_FSinfo + ; !FIXIT проверка на ошибку + ; + LD A,#FF + ; проверка одной из сотни сраных сигнатур + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) + LD BC,#7272 + SBC HL,BC + JR NZ,.error_sig + EX DE,HL + LD DE,#6141 + SBC HL,DE + JR NZ,.error_sig + ; + LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + LD B,8 ; 2 x DWORD + LD A,#FF + ; +.fsinfo_loop: AND (HL) + INC HL + DJNZ .fsinfo_loop + ; +.error_sig: XOR #FF + LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + ; + XOR A + LD H,A + LD L,2 + LD (G_CLUST.low),HL + LD L,H + LD (G_CLUST.high),HL + RET + ELSE + CALL READ_FSinfo + ; !FIXIT проверка на ошибку + ; + ; проверка одной из сотни сраных сигнатур + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) + LD BC,#7272 + SBC HL,BC + JR NZ,.error_sig + EX DE,HL + LD DE,#6141 + SBC HL,DE + JR NZ,.error_sig + ; !FIXIT сделать проверку кластеров на валидность (не больше максимального для раздела) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) + LD (G_CLUST.low),HL + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) + LD (G_CLUST.high),HL + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + XOR A + RET +.error_sig: LD HL,#FFFF + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.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 + ENDIF +;;;;;;;; ; --> BC:HL - Cluster ; <-- BC:HL - Sector diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 14a208f..e77f6fe 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -13,15 +13,6 @@ ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- -; [x] fat32 ;!TEST -; Установить начальный кластер для чтения -R_CLUST: LD HL,#0001 - LD (G_CLUST.low),HL - DEC L - LD (G_CLUST.high),HL - RET - - ; ; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров @@ -29,14 +20,16 @@ R_CLUST: LD HL,#0001 ; HL' - старший номер свободного кластера G_CLUST: ; .low+1: LD HL,#0001 + EXX +.high+1: LD HL,#0000 + EXX .loop: INC HL ; номер кластера LD A,L OR H ; [x] fat32 EXX -.high+1: LD HL,#0000 - JR NZ,.no_inc - INC HL + JR NZ,.no_inc + INC HL .no_inc: EXX ; CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера @@ -125,12 +118,11 @@ CHECK_CLUSTER_IS_SMALLER: EX DE,HL EXX LD A,DSS_Error.sys.DISK_FULL - ;RET C - RET NZ ; если CORE_BUFFERS.FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный + RET C + RET NZ ; проверяем младше слово номера кластера .low: EX DE,HL LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) - ; CF = 0 SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL @@ -246,6 +238,24 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; ; [x] fat32 ;!TEST +; +; !TODO optimize +; при записи в кэш значения отмечать через OR в ячейке FatBuffer.SectorOfCacheBlock +; бит соответствующий куску в странице кэша, который был изменён и потом скидывать на диск +; только те куски, которые были изменены. +; |--------------------| +; | bit | adresses | +; |-----|--------------| +; | 0 | #0000..#07FF | +; | 1 | #0800..#0FFF | +; | 2 | #1000..#17FF | +; | 3 | #1800..#1FFF | +; | 4 | #2000..#27FF | +; | 5 | #2800..#2FFF | +; | 6 | #3000..#37FF | +; | 7 | #3800..#3FFF | +; |--------------------| +; ;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать @@ -447,7 +457,10 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) +.Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + CALL Z,RESET_FSInfo + LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока @@ -465,10 +478,9 @@ WRITE_FAT_TABLE: .next: ADD HL,DE ;+ SIZE CASH (16 SECTORS) JR NC,.no_inc INC C +.no_inc: ; C:HL смещение в секторах внутри таблицы FAT на конец блока ; - ; C:HL смещение в секторах внутри таблицы FAT на конец блока - ; -.no_inc: ; конец блока выходит за пределы таблицы? + ; конец блока выходит за пределы таблицы? LD B,E ; MAX число секторов для чтения в кэш LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) LD (.sub_A),A @@ -569,7 +581,7 @@ GET_FAT32_CELL: LD H,A LD A,C ; - LD B,FAT_CACHE.Degree_32 ; 4 сдвига + LD B,FAT_CACHE.Degree ; 4 сдвига .loop_block: RLCA ; << H RL L ; << L' diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 82fcd6b..08efad2 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -281,7 +281,6 @@ DRVCLC: ; INC A ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV - ;!TODO заменить PUSH на EXX? SELHDD: PUSH DE PUSH BC PUSH HL @@ -519,192 +518,190 @@ CHECKH: PUSH IY ;------------------------------[ PARTIT ]------------------------------; DEFINE_PARTITIONS: -.FAT32_DOS: -.EASYDOS: -.MEDIDOS: -.HIGHDOS: - LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) - LD IX,(CURRENT_SECTOR_L) - ADD IX,DE - LD DE,(CURRENT_SECTOR_H) - ADC HL,DE - LD D,XH - LD E,XL - ;BPB SECTOR - LD IX,(OFFSECT) - LD (IX + LOGDRV.SECTOR_OFFSET + 0),E - LD (IX + LOGDRV.SECTOR_OFFSET + 1),D - LD (IX + LOGDRV.SECTOR_OFFSET + 2),L - LD (IX + LOGDRV.SECTOR_OFFSET + 3),H - LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) - ;SIZE DISK - LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E - LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D - LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L - LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +.FAT32_DOS: ; +.EASYDOS: ; +.MEDIDOS: ; +.HIGHDOS: ; + LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) + LD IX,(CURRENT_SECTOR_L) + ADD IX,DE + LD DE,(CURRENT_SECTOR_H) + ADC HL,DE + LD D,XH + LD E,XL + ;BPB SECTOR + LD IX,(OFFSECT) + LD (IX + LOGDRV.SECTOR_OFFSET + 0),E + LD (IX + LOGDRV.SECTOR_OFFSET + 1),D + LD (IX + LOGDRV.SECTOR_OFFSET + 2),L + LD (IX + LOGDRV.SECTOR_OFFSET + 3),H + LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) + ;SIZE DISK + LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E + LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D + LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L + LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого .ExtendedPartitionFlag+1: - LD A,0 - OR A ; !TODO загрузка с расширенного раздела не поддерживается - LD A,#FF - JR NZ,.not_supported ; если расширенный раздел, то облом - ; - POP BC - PUSH BC - LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table - SUB B -.not_supported: - LD (IX + LOGDRV.PARTITION_RECORD_NUM),A - ; - ;!TEST Подстраховка от переполнения таблицы LOGDRV - LD A,(DRVCLC.count) - INC A - CP DSS_MAX_DRIVES_AMOUNT+1 - RET NC - LD (DRVCLC.count),A - ; - LD A,(DRV_NUM) - LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A - LD DE,LOGDRV.TBL_Entry ;DSKITEM - ADD IX,DE - LD (OFFSECT),IX - JP .NextPartition - ; -.NotExtended: - CP PartitionSysTypes.FAT16 - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_LBA - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,.MEDIDOS - CP PartitionSysTypes.FAT12 - JR Z,.EASYDOS - ;[ ] fat32 - CP PartitionSysTypes.FAT32 - JP Z,.FAT32_DOS - CP PartitionSysTypes.FAT32_LBA - JP Z,.FAT32_DOS - ; - CP PartitionSysTypes.Win_Ext_LBA - JR Z,.SubLevel - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - ;OR A ;PartitionSysTypes.Empty - ;JR NZ,NXTPART - JR .NextPartition ; раздел не поддерживается - ;POP BC ; баланс стека - ;RET - ;POP BC - ;OR A - ;RET Z -;NODEFIN: - ;SCF - ;RET - ; -.BEGIN: IN A,(SLOT3) - PUSH AF - LD A,SHARED_PAGE - OUT (SLOT3),A - CALL .Start - POP AF - OUT (SLOT3),A - RET -.Start: LD IX,0 - LD DE,0 - LD (EXTDOSL),DE ;R01 - LD (EXTDOSH),IX ;R01 - ; -.LOOP: LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - ; - LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) - LD DE,#AA55 - AND A - SBC HL,DE - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - ;JR NZ,NODEFIN - SCF - RET NZ - ; - LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR - LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table -.DOSAGA: - PUSH BC - LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) - CP PartitionSysTypes.Extended - JR NZ,.NotExtended -.SubLevel: - PUSH IY - LD DE,(CURRENT_SECTOR_L) - LD IX,(CURRENT_SECTOR_H) - PUSH DE - PUSH IX - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - INC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - CALL .ParseExtended - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - DEC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - POP IX - POP DE - LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - POP IY -.NextPartition: - LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry - ADD IY,DE - POP BC - DJNZ .DOSAGA - AND A - RET -.ParseExtended: - LD HL,(EXTDOSL) - LD DE,(EXTDOSH) - LD A,L - OR H - OR E - OR D - LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) - LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) - LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) - JP NZ,.EXTDOS2 - LD (EXTDOSL),DE - LD (EXTDOSH),HL - LD IX,(EXTDOSH) -.EXTDOS2: - LD IX,(EXTDOSL) - ADD IX,DE - PUSH IX - LD DE,(EXTDOSH) - ADC HL,DE - PUSH HL - POP IX - POP DE - JP .LOOP - ; -.LOAD_SECTOR: - PUSH IY - LD IX,(CURRENT_SECTOR_L) - LD HL,(CURRENT_SECTOR_H) - LD DE,PARTITION_BUFFER - LD A,(DRV_NUM) - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP IY - RET + LD A,0 + OR A ; !TODO загрузка с расширенного раздела не поддерживается + LD A,#FF + JR NZ,.not_supported ; если расширенный раздел, то облом + ; + POP BC + PUSH BC + LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table + SUB B +.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A + ; + ;!TEST Подстраховка от переполнения таблицы LOGDRV + LD A,(DRVCLC.count) + INC A + CP DSS_MAX_DRIVES_AMOUNT+1 + RET NC + LD (DRVCLC.count),A + ; + LD A,(DRV_NUM) + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A + LD DE,LOGDRV.TBL_Entry ;DSKITEM + ADD IX,DE + LD (OFFSECT),IX + JP .NextPartition + ; +.NotExtended: CP PartitionSysTypes.FAT16 + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_LBA + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_32Mb + JR Z,.MEDIDOS + CP PartitionSysTypes.FAT12 + JR Z,.EASYDOS + ;[ ] fat32 + CP PartitionSysTypes.FAT32 + JP Z,.FAT32_DOS + CP PartitionSysTypes.FAT32_LBA + JP Z,.FAT32_DOS + ; + CP PartitionSysTypes.Win_Ext_LBA + JR Z,.SubLevel + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта + ;OR A ;PartitionSysTypes.Empty + ;JR NZ,NXTPART + JR .NextPartition ; раздел не поддерживается + ;POP BC ; баланс стека + ;RET + ;POP BC + ;OR A + ;RET Z + ;NODEFIN: + ;SCF + ;RET + ; +.BEGIN: IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A + CALL .Start + POP AF + OUT (SLOT3),A + RET +.Start: LD IX,0 + LD DE,0 + LD (EXTDOSL),DE ;R01 + LD (EXTDOSH),IX ;R01 + ; +.LOOP: LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + ; + LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) + LD DE,#AA55 + AND A + SBC HL,DE + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + ;JR NZ,NODEFIN + SCF + RET NZ + ; + LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR + LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table +.DOSAGA: PUSH BC + LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) + CP PartitionSysTypes.Extended + JR Z,.SubLevel + CP PartitionSysTypes.Win_Ext_LBA + JR NZ,.NotExtended + ; +.SubLevel: PUSH IY + LD DE,(CURRENT_SECTOR_L) + LD IX,(CURRENT_SECTOR_H) + PUSH DE + PUSH IX + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + INC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + CALL .ParseExtended + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + DEC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + POP IX + POP DE + LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + POP IY +.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry + ADD IY,DE + POP BC + DJNZ .DOSAGA + AND A + RET + ; +.ParseExtended: LD HL,(EXTDOSL) + LD DE,(EXTDOSH) + LD A,L + OR H + OR E + OR D + LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) + JP NZ,.ext_in_ext + LD (EXTDOSL),DE + LD (EXTDOSH),HL + PUSH DE + JR .set_regs + ; +.ext_in_ext: LD IX,(EXTDOSL) + ADD IX,DE + LD DE,(EXTDOSH) + ADC HL,DE + PUSH IX +.set_regs: PUSH HL + POP IX + POP DE + JP .LOOP + ; +.LOAD_SECTOR: PUSH IY + LD IX,(CURRENT_SECTOR_L) + LD HL,(CURRENT_SECTOR_H) + LD DE,PARTITION_BUFFER + LD A,(DRV_NUM) + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP IY + RET ;----------------------------------------------------------------------; ; diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ce82e8c..0758840 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -75,7 +75,6 @@ ; STRUCT _sFatBuffer -;.MSG: BYTE 'FAT' .DRIVE: BYTE #FF .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .CacheBlock: WORD #0000 @@ -99,15 +98,18 @@ .END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3 .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 -; IF COMPILE_UNUSED_CODE -; .FilesPerSector: BYTE #00 ; число файловых записей в секторе -; .ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) -; ENDIF +.RESET_FSINFO BYTE 0 +; IF USE_FSINFO_FAT32 +;.FREE_CLUSTERS_COUNT_L WORD #FFFF +;.FREE_CLUSTERS_COUNT_H WORD #FFFF +; ENDIF +;.FilesPerSector: BYTE #00 ; число файловых записей в секторе +;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DWORD #0000 ; количество секторов на цилиндре ENDS @@ -121,7 +123,7 @@ ;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .EXE_Header _sEXE_HEADER ; 512 bytes .Stack _sStack ; 256 bytes -.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF +.Buffer BLOCK 512,0 ; FOR BUFFER & SECTOR_BUFFER .MemoryTable BLOCK 256,0 ; 256 bytes ENDS ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 9f02e1c..71ed48c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -952 \ No newline at end of file +954 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 0e35f90..972f2cd 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -27,7 +27,7 @@ ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// - DEFINE _FAT32_ENABLE 1 ;!TODO пока недоделано + DEFINE USE_FSINFO_FAT32 0 ; недоделано. А нужно ли? SERVICE_SECTORS: .FAT12 EQU #0FEF diff --git a/Shared_Includes b/Shared_Includes index 73f764c..62170ee 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 73f764ccd1ab8de8dea7eef3b4f5cd27e2ea8dab +Subproject commit 62170ee7bc7dabe6fd55b94e89826ca510a60097 From ed82bbff7872e4886f83973447815c56fbcfc9da Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 21 Apr 2024 05:11:18 +1000 Subject: [PATCH 117/219] fat32 - 98% --- DSS/API/Create.asm | 2 +- DSS/API/Delete.asm | 95 +++------- DSS/API/RmDir.asm | 14 +- DSS/DSS_MACROSES.Z80 | 6 +- DSS/FS/FAT/FAT.asm | 72 ++++--- DSS/FS/FAT/FAT_X.asm | 348 +++++++++++++++++++++++++--------- DSS/Media_drivers/ide-drv.asm | 66 ++++--- DSS/build.txt | 2 +- DSS/defines.inc | 3 +- 9 files changed, 374 insertions(+), 234 deletions(-) diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index acfd62b..88bfdea 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -24,7 +24,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 SCF RET .FILE_EXISTS_DEL: - CALL DEL_FN.DELETE + CALL DELETE_REC_FAT LD A,DSS_Error.sys.FILE_NOT_FOUND RET ; diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index b6d0873..d03c56f 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -2,73 +2,30 @@ //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -DEL_FN: ;!TEST - ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - CALL MASK - RET C - ; - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - CALL LOADDIR - CALL SEARCH.File - RET C -; пометить запись как "удаленная" -;!TODO record index. возможно, что может сломаться, если больше страницы -.DELETE: - SET_PAGE_X DIRPAGE - EX AF,AF' - CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN - LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла - ; fat32 - LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) - LD A,E - OR D - EXX - LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - OR D - OR E - ; - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - JP Z,SAVEDIR ; сбросить кеш каталога на диск - ; если размер файла не ноль -.loop: EX DE,HL ; hl=номер кластера - EXX - EX DE,HL - EXX - CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера - EXX - PUSH DE ; номер след. кластера - PUSH AF - LD DE,#0000 ; номер кластера - EXX - PUSH DE - LD DE,#0000 ; номер кластера - CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - POP DE - EXX - POP AF - POP DE - EXX - JP NC,.loop - CALL WRITE_FAT_TABLE - JP SAVEDIR ; сбросить кеш каталога на диск +DEL_FN: ;!TEST + ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + CALL MASK + RET C + ; + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + CALL LOADDIR + CALL SEARCH.File + RET C + JP DELETE_REC_FAT ; пометить запись как "удаленная" ; \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 95f45f5..28fb499 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -89,6 +89,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 LD A,(HL) SBC HL,DE AND FAT_ATTR.VOLUME_ID + SCF JP Z,.error ;DIR NOT EMPTY .next_record: LD DE,FAT_DIRECTORY_RECORD ADD HL,DE @@ -119,22 +120,17 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 JR NC,.read_dir_big_loop ; не конец цепочки ; .delete: POP IX - JP DEL_FN.DELETE ; пометить запись как "удаленная" + JP DELETE_REC_FAT ; пометить запись как "удаленная" ; -.dir_empty: POP HL +.dir_empty: ; CF = 0 +.error: ; CF = 1 POP HL - POP HL - POP HL - POP HL - JR .delete - ; -.error: POP HL POP HL POP HL POP HL POP HL + JR NC,.delete POP HL LD A,DSS_Error.sys.DIR_NOT_EMPTY - SCF RET ; \ No newline at end of file diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 7589bb9..776efd5 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -101,16 +101,14 @@ ; ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи -; ПОРТИТ: HL, IY. HL<-->DE +; ПОРТИТ: HL, DE, IY. MACRO LOGDRV_ENTRY_FIND tbl_addr LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL - ;LD B,H - ;LD C,L - EX DE,HL + EX DE,HL LD IY,tbl_addr ADD IY,DE ENDM diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index ada06b3..769a3a6 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -10,20 +10,23 @@ ;--------------------------------------------------------------- ;----------------------------------------------------------------------; -; сбрасывает значения свободных и первого свободного секторов на "неопределено" -RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) +; сбрасывает значение свободных кластеров на "неопределено" +; меняет значение первого свободного кластера +SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) OR A RET Z ; CALL READ_FSinfo ; - LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT - LD B,8 ; 2 x DWORD - LD A,#FF - ; -.fsinfo_loop: LD (HL),A - INC HL - DJNZ .fsinfo_loop + ;!TODO FREE_CLUSTERS_COUNT + LD HL,#FFFF + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL + ; FIRST_FREE_CLUSTER + LD HL,(G_CLUST.low) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL + LD HL,(G_CLUST.high) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL ; XOR A LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A @@ -32,18 +35,16 @@ RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) ; Прочитать BPB в SECTOR_BUFFER READ_BPB: LD C,Dss.DRV.GetBPB JR RW_SECTOR - ; ; Записать FSinfo из SECTOR_BUFFER WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) LD HL,0 + ;JR WRITE_SECTOR ; Записать сектор из SECTOR_BUFFER ; Вход: HL:IX = Logical Block (sector) WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write JR RW_SECTOR - ; ; Прочитать FSinfo в SECTOR_BUFFER -READ_FSinfo: - LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) +READ_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) LD HL,0 ; Прочитать сектор в SECTOR_BUFFER ; Вход: HL:IX = Logical Block (sector) @@ -712,7 +713,7 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE - ; + ;!TODO выбор активной FAT для fat32 LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT @@ -1023,25 +1024,38 @@ RD_BPB: ; LD C,SLOT3 LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) LD BC,#7272 SBC HL,BC - JR NZ,.error_sig + JR NZ,.error EX DE,HL LD DE,#6141 SBC HL,DE - JR NZ,.error_sig - ; !FIXIT сделать проверку кластеров на валидность (не больше максимального для раздела) - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) - LD (G_CLUST.low),HL - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) - LD (G_CLUST.high),HL - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + JR NZ,.error + ; FIRST_FREE_CLUSTER + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + ; CF = 0 + ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? + SBC HL,BC + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + SBC HL,DE + JR C,.error + ; + LD (G_CLUST.high),DE + LD (G_CLUST.low),BC + ;!TODO FREE_CLUSTERS_COUNT + ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + ; XOR A - RET -.error_sig: LD HL,#FFFF - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL +.error: LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + RET Z + ;!TODO FREE_CLUSTERS_COUNT + ;LD HL,#FFFF + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + ; XOR A LD H,A LD L,2 diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index e77f6fe..87f285e 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -13,6 +13,91 @@ ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- +; Удаляет запись в каталоге и освобождает занятую цепочку кластеров +; Вход: IX - указатель на удаляемую запись в DIRPAGE +;!TODO record index. возможно, что может сломаться, если больше страницы +DELETE_REC_FAT: SET_PAGE_X DIRPAGE + EX AF,AF' + CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN + LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла + ; fat32 + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD A,E + OR D + EXX + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + OR D + OR E + ; + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + JP Z,SAVEDIR ; сбросить кеш каталога на диск + ; если размер файла не ноль +.loop: EX DE,HL ; hl=номер кластера + EXX + EX DE,HL + EXX + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера + EXX + PUSH DE ; номер след. кластера + PUSH AF + LD DE,#0000 ; номер кластера + EXX + PUSH DE + ; + CALL SET_NEW_FREE_CLUSTER + ; + LD DE,#0000 ; номер кластера + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера + POP DE + EXX + POP AF + POP DE + EXX + JP NC,.loop + CALL WRITE_FAT_TABLE + JP SAVEDIR ; сбросить кеш каталога на диск + +; Установить первым известным кластером для поиска свободного. +; Установится только если меньше предыдущего +; Вход: HL':HL - cluster +; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный +SET_NEW_FREE_CLUSTER: + XOR A + LD B,D + LD C,E + EX DE,HL + LD HL,(G_CLUST.low) + SBC HL,DE + EX DE,HL + LD D,B + LD E,C + ; + EXX + LD B,D + LD C,E + EX DE,HL + LD HL,(G_CLUST.high) + SBC HL,DE + EX DE,HL + LD D,B + LD E,C + EXX + RET C + ; + JR G_CLUST.set_new + ; LD (G_CLUST.low),HL + ; EXX + ; LD (G_CLUST.high),HL + ; EXX + ; XOR A + ; INC A + ; LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + ; RET + ; ; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров @@ -44,10 +129,13 @@ G_CLUST: ; OR D OR E JR NZ,.loop +.set_new: ; A = 0 LD (G_CLUST.low),HL EXX - LD (G_CLUST.high),HL + LD (G_CLUST.high),HL EXX + INC A + LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A RET ; @@ -56,49 +144,48 @@ G_CLUST: ; ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -INC_FAT: - PUSH HL ; текущий кластер - EXX - PUSH HL ; текущий кластер - EXX - ; - CALL G_CLUST - ; - EXX - POP DE ; текущий кластер - EXX - POP DE ; текущий кластер - RET C - ; HL':HL - свободный кластер, DE':DE - текущий кластер - ; - EX DE,HL - EXX - EX DE,HL - EXX - ; - CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - ;!FIXIT <нет контроля ошибки> - ; - PUSH HL - EX DE,HL - EXX - PUSH HL - EX DE,HL - EXX - ; - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? - ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - ; - EXX - POP DE - EX DE,HL - EXX - POP DE - EX DE,HL - ; - AND A - RET +INC_FAT: PUSH HL ; текущий кластер + EXX + PUSH HL ; текущий кластер + EXX + ; + CALL G_CLUST + ; + EXX + POP DE ; текущий кластер + EXX + POP DE ; текущий кластер + RET C + ; HL':HL - свободный кластер, DE':DE - текущий кластер + ; + EX DE,HL + EXX + EX DE,HL + EXX + ; + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера + ;!FIXIT <нет контроля ошибки> + ; + PUSH HL + EX DE,HL + EXX + PUSH HL + EX DE,HL + EXX + ; + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + ; + EXX + POP DE + EX DE,HL + EXX + POP DE + EX DE,HL + ; + AND A + RET ;RX01 @@ -235,6 +322,24 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER POP HL LD A,0 RET +; + +; Вход: HL - Номер первой ячейки кластера в блоке фата +; Портить только HL и A +SET_FAT32_CACHE_BLOCK_CHANGED_REGION: + LD A,H + AND #38 + LD HL,#0108 + JR Z,.set_region + ; +.loop: SLA H + SUB L + JR NZ,.loop + ; +.set_region: LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + OR H + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + RET ; ; [x] fat32 ;!TEST @@ -302,13 +407,17 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D -.exit: POP AF ; восст. порт + ; +.exit: ; [ ] ускорение работы с кэшем FAT + CALL SET_FAT32_CACHE_BLOCK_CHANGED_REGION + ; + POP AF ; восст. порт POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - XOR A - INC A - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;XOR A + ;INC A + ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; CF = 0 RET ; @@ -362,7 +471,10 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; INC HL LD (HL),C INC HL - LD (HL),B + LD A,(HL) + AND #F0 + OR B + LD (HL),A JR .exit ;;;;;;;;; @@ -459,7 +571,7 @@ WRITE_FAT_TABLE: ; Запись кеша FAT-а на диск .Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 - CALL Z,RESET_FSInfo + CALL Z,SET_FSInfo LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT @@ -556,16 +668,73 @@ WRITE_FAT_TABLE: LD D,XH LD E,XL EX DE,HL - ; LD H,0 - ; LD L,C LD XH,D LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT + LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + CP #FF + JR NZ,.SAVE_NOT_ALL_BLOCK + ; LD DE,FATPAGE.cache ; откуда LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV +.SAVE_NOT_ALL_BLOCK: + ; A = CORE_BUFFERS.FatBuffer.CacheBlock + ; HL:IX - смещение внутри раздела на начало нужного блока FAT + ; B = максимальное число блоков для записи + EXX + LD HL,FATPAGE.cache + LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов) + EXX + LD C,A + LD A,B + LD B,8 ;!HARDCODE количество регионов в блоке КЭШа FAT + LD DE,4 ;!HARDCODE размер региона в блоке КЭШа FAT (секторов) + ; чтоб не насрать за границы FAT +.region_loop: SUB A,E + JR NC,.good_blk + ; максимально допустимый блок для записи меньше, чем хочется + ADD A,E + LD E,A + ; +.good_blk: SRL C + JR C,.SAVE_FAT_CACHE_REGION + EXX + ADD HL,DE + EXX + ADD IX,DE + JR NC,.no_inc_HL + INC HL +.no_inc_HL: DJNZ .region_loop + RET + ; HL' - Адрес в странице КЭШа + ; HL:IX - смещение внутри раздела на начало нужного РЕГИОНА блока FAT +.SAVE_FAT_CACHE_REGION: + PUSH AF + PUSH DE + PUSH BC + ; + EXX + PUSH HL + EXX + LD B,E ; кол-во секторов + POP DE ; Адрес в странице КЭШа + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD C,Dss.DRV.Write + RST ToDSS.DRV + PUSH DE + EXX + POP HL + LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов) + EXX + ; + POP BC + POP DE + POP AF + DJNZ .region_loop + RET ;----------------------------------------------------------------------- ; ;[x] fat32 ;!TEST @@ -692,40 +861,47 @@ GET_FAT12_CELL: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR CLUSTER_TO_SECTOR: - EXX - PUSH HL - EXX - POP DE - ; DE:HL - cluster - DEC HL - DEC HL - LD A,(CORE_BUFFERS.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,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) - ; [x] fat32 - ;XOR A - ; - ADD IX,DE - ; [x] fat32 - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) - ;LD D,A - ;LD E,A - ; - ADC HL,DE - RET + PUSH BC + EXX + PUSH HL + EXX + POP DE + ; DE:HL - cluster + ; + LD BC,-2 + ADD HL,BC + JR C,.no_dec_de + DEC DE +.no_dec_de: ; cluster = cluster - 2 + ; + LD A,(CORE_BUFFERS.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,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + ; [x] fat32 + ;XOR A + ; + ADD IX,DE + ; [x] fat32 + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + ;LD D,A + ;LD E,A + ; + ADC HL,DE + POP BC + RET //////////////////////////////////////////////////////////////////////// diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 08efad2..59d8a11 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -175,34 +175,35 @@ ; IDE1 EQU #0C1C8 PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR -HDDRIVE INC C - DEC C - JP Z,INIT_H ; c=0 Initialization - DEC C - JP Z,RESE_H ; c=1 open - DEC C - JP Z,STAT_H ; c=2 close - DEC C - JP Z,CHEK_H ; c=3 media check (смена носителя) - DEC C - JP Z,GBPB_H ; c=4 get BPB - DEC C - JP Z,READH ; c=5 read (чтение секторов) - DEC C - JP Z,WRITEH ; c=6 write (запись секторов) - DEC C - JP Z,REMOV_H ; c=7 Removable - DEC C - JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL - DEC C - JP Z,RESR_H ; c=9 Reserved - DEC C - JP Z,LREADH ; c=10 Read Long - DEC C - JP Z,LWRITEH ; c=11 Write Long -RESR_H LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET +HDDRIVE: INC C + DEC C + JP Z,INIT_H ; c=0 Initialization + DEC C + JP Z,RESE_H ; c=1 open + DEC C + JP Z,STAT_H ; c=2 close + DEC C + JP Z,CHEK_H ; c=3 media check (смена носителя) + DEC C + JP Z,GBPB_H ; c=4 get BPB + DEC C + JP Z,READH ; c=5 read (чтение секторов) + DEC C + JP Z,WRITEH ; c=6 write (запись секторов) + DEC C + JP Z,REMOV_H ; c=7 Removable + DEC C + JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL + DEC C + JP Z,.Reserved ; c=9 Reserved + DEC C + JP Z,LREADH ; c=10 Read Long + DEC C + JP Z,LWRITEH ; c=11 Write Long + ; +.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET //////////////////////////////////////////////////////////////////////// @@ -280,23 +281,20 @@ DRVCLC: ; INC A ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV - SELHDD: PUSH DE - PUSH BC PUSH HL ; LD L,A LOGDRV_ENTRY_FIND LOGDRV ; !HARDCODE - LD C,(IY+1) - LD B,(IY+2) + LD E,(IY+1) + LD D,(IY+2) + ADD IX,DE LD E,(IY+3) LD D,(IY+4) POP HL - ADD IX,BC ADC HL,DE LD A,(IY+0) ;DRIVE NUMBER - POP BC POP DE RET diff --git a/DSS/build.txt b/DSS/build.txt index 71ed48c..0c8ddea 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -954 \ No newline at end of file +955 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 972f2cd..55068c7 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -27,7 +27,8 @@ ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// - DEFINE USE_FSINFO_FAT32 0 ; недоделано. А нужно ли? + DEFINE USE_FSINFO_FAT32 1 ; недоделано. А нужно ли? + DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 SERVICE_SECTORS: .FAT12 EQU #0FEF From 2f0db9fa9834357413820deaf78f6334f074f8a8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 22 Apr 2024 03:47:11 +1000 Subject: [PATCH 118/219] bug fixes --- BOOT/DSSBOOT.ASM | 2 +- DSS/API/Find.asm | 2 +- DSS/API/ScanDRV.asm | 64 ++++++++++++++++----------------- DSS/FS/FAT/FAT.asm | 9 ++--- DSS/FS/FAT/FAT_X.asm | 2 +- DSS/Media_drivers/ReScanDRV.ASM | 4 +-- DSS/build.txt | 2 +- DSS/defines.inc | 1 + 8 files changed, 42 insertions(+), 44 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index bf675bb..f1c59b8 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -59,7 +59,7 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE ; ; CONTINUE ;!TEST 26/03/2024 - LD SP,#C000 + ;LD SP,#C000 ; LD HL,0 LD (DISKL),HL diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index fa24f3b..0ae8afc 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -23,9 +23,9 @@ F_FIRST: CALL DIR_PATH_CHECK RET C ; - CALL LOADDIR POP HL CALL GETWORD + ;CALL LOADDIR RET C CALL MASK RET C diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index 39b4371..e9c364e 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -10,52 +10,48 @@ SCANDRV: ; 1. запоминаем состояние прерываний ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,R - DI - PUSH AF + LD A,R + DI + PUSH AF ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 2. узнаём букву бут-диска ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - CALL BOOTDSK.GET + CALL BOOTDSK.GET ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 3. вызываем рескан ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - ; A = Boot disk - LD B,A - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - ; проверка на ошибку boot disk lost - LD HL,.BOOT_DSK_LOST - LD E, +(80-.BOOT_DSK_LOST.size)/2 ; coord X - LD BC,.BOOT_DSK_LOST.size - JP C,KERNEL_PANIC - ; - LD (LDRIVE),A + ; A = Boot disk + LD B,A + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + ; проверка на ошибку boot disk lost + LD HL,.BOOT_DSK_LOST + LD E, +(80-.BOOT_DSK_LOST.size)/2 ; coord X + LD BC,.BOOT_DSK_LOST.size + JP C,KERNEL_PANIC + ; + LD (LDRIVE),A ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 4. на всякий случай перечитываем дирректорию ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,(CurrentPath) - SUB 'A' - CALL CHNDISK - ; - LD HL,CurrentDirectory - CALL CHDIR - JR NC,.exit - LD HL,CurrentDirectory - LD (HL),0 - ; LD HL,CurrentPath - ; CALL CHDIR + LD A,(CurrentPath) + SUB 'A' + CALL OPENDSK + LD HL,CurrentDirectory + CALL CHDIR + JR NC,.exit + LD HL,CurrentDirectory + LD (HL),0 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 5. выход ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -.exit: POP AF - RET PO - EI - RET - ; -.BOOT_DSK_LOST: - DZ "Boot drive lost o_O" +.exit: POP AF + RET PO + EI + RET + ; +.BOOT_DSK_LOST: DZ "Boot drive lost o_O" .BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ;/////////////////////////////////////////////////////////////////////// diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 769a3a6..7fcd78a 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -540,10 +540,11 @@ LOAD_SAVE_DIR_PREPARE: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A ;!FIXIT переделать на работу без IY - LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + ; EX AF,AF' RET diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 87f285e..f1a82d6 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -680,7 +680,7 @@ WRITE_FAT_TABLE: LD C,Dss.DRV.Write JP ToDSS.DRV .SAVE_NOT_ALL_BLOCK: - ; A = CORE_BUFFERS.FatBuffer.CacheBlock + ; A = CORE_BUFFERS.FatBuffer.CacheUpdated ; HL:IX - смещение внутри раздела на начало нужного блока FAT ; B = максимальное число блоков для записи EXX diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index cb278eb..8a81258 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -443,8 +443,8 @@ KILL_FM:; POP BC PUSH AF ; Шерстим манипуляторы на наличие в них грохнутого драйва - LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + #C000 - LD B,FMCOUNT + LD IY,CORE_BUFFERS.FM_BUF + #C000 ; - CORE_BUFFERS.FM_BUF.Size + LD B,FMCOUNT - 1 ; пропускаем служебный нулевой манипулятор LD DE,CORE_BUFFERS.FM_BUF.Size .loop_fm: ADD IY,DE diff --git a/DSS/build.txt b/DSS/build.txt index 0c8ddea..36c9eca 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -955 \ No newline at end of file +957 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 55068c7..348c999 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -154,5 +154,6 @@ MOUSE_BAUD: ; ;----------------------------------------------------; +; Внимание, стек хранится в той же странице! SUBLOAD_SIZE EQU 10 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу ;----------------------------------------------------; From 0af59044c8adfbd6eafe6e09866318c3b03e99b3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 23 Apr 2024 23:56:35 +1000 Subject: [PATCH 119/219] bugs --- BOOT/DSSBOOT.ASM | 89 +++++++++++++- DSS/API/diskINF.asm | 8 +- DSS/DOS_Proc.asm | 29 +++-- DSS/Structures.inc | 24 ++-- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/Commands/CHDIR.ASM | 4 +- SHELL/Commands/DIR.ASM | 243 ++++++++++++++++++++++++--------------- SHELL/build.txt | 2 +- 9 files changed, 280 insertions(+), 123 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index f1c59b8..76ef5e2 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -93,6 +93,8 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,(FCLUSTR) LD DE,#C000 CALL FLOAD ; загрузка + + DI XOR A OUT (SYS_PORT.OFF),A @@ -434,6 +436,84 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 INC A RET +; ; HL - CLUSTER +; ; DE - ADDRESS +; ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +; FLOAD: LD (READMEM),DE +; .LD_FILE: PUSH HL ; system.dos first cluster +; CALL NSECTOR ; Cluster to Sector +; LD DE,(READMEM) +; LD A,(BOOT.SectorsPerCluster) +; CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов +; LD C,BIOS.DRV_READ_LONG +; JR C,.SMALL_CLUSTER +; LD A,(BANKDOS) +; EX AF,AF' +; ;LD BC,#20*256 + BIOS.DRV_READ_LONG +; LD B,#20 ; !HARDCODE кол-во загружаемых секторов +; .set_drv: LD A,(DRIVE) +; RST ToBIOS_18 +; JP C,GOOD_DRIVE.NoShell +; POP HL +; ; [ ] загрузка system.dos больше #4000 байтов +; ;AND A +; ;RET +; LD A,(BIG_SHELL) +; OR A +; RET Z +; ; +; XOR A +; LD (BIG_SHELL),A +; PUSH HL +; CALL NSECTOR +; LD DE,#20 ; !HARDCODE кол-во прочитанных секторов +; AND A +; ADD IX,DE +; JR NC,.no_inc_hl +; INC HL +; .no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE кол-во ДОзагружаемых секторов +; LD DE,#4000 +; JR .set_drv +; ; +; .SMALL_CLUSTER: LD B,A +; ;LD C,BIOS.DRV_READ_LONG +; LD A,(BANKDOS) +; EX AF,AF' +; LD A,(DRIVE) +; RST ToBIOS_18 +; JP C,GOOD_DRIVE.NoShell +; ; +; LD HL,(READMEM) +; LD DE,(CLU_LEN) +; ADD HL,DE +; LD (READMEM),HL +; ; [ ] загрузка system.dos больше #4000 байтов +; ;POP HL +; ;RET C +; CALL C,.more_than_1 +; POP HL +; RET C +; ; +; CALL R_F_FAT ; next cluster in chain +; RET C +; EX DE,HL +; JP .LD_FILE +; ; [ ] загрузка system.dos больше #4000 байтов +; .more_than_1: LD A,(BIG_SHELL) +; OR A +; SCF +; RET Z +; IN A,(SLOT1) +; LD HL,BANKDOS +; CP (HL) +; CCF +; RET Z +; LD (BANKDOS),A +; LD HL,#C000 +; LD (READMEM),HL +; AND A +; RET + ; HL - CLUSTER ; DE - ADDRESS ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы @@ -442,7 +522,7 @@ FLOAD: LD (READMEM),DE CALL NSECTOR ; Cluster to Sector LD DE,(READMEM) LD A,(BOOT.SectorsPerCluster) - CP #20 + CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов LD C,BIOS.DRV_READ_LONG JR C,.SMALL_CLUSTER LD A,(BANKDOS) @@ -474,7 +554,6 @@ FLOAD: LD (READMEM),DE JR .set_drv ; .SMALL_CLUSTER: LD B,A - ;LD C,BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' LD A,(DRIVE) @@ -509,6 +588,12 @@ FLOAD: LD (READMEM),DE LD (BANKDOS),A LD HL,#C000 LD (READMEM),HL + LD A,(BOOT.SectorsPerCluster) + SUB SUBLOAD_SIZE + 1 + CCF + RET NC + LD A,SUBLOAD_SIZE + LD (BOOT.SectorsPerCluster),A AND A RET diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index c4f79b9..4938c26 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -161,9 +161,15 @@ DISKINF: LD C,B EXX LD B,A LD C,A -.loop_free_space: +.loop_free_space:;!FIXIT PUSH BC + EXX + PUSH BC + EXX CALL READ_FROM_FAT + EXX + POP BC + EXX POP BC CP DSS_Error.sys.DISK_FULL RET Z diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 08f26b5..58d3f01 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -399,6 +399,10 @@ DIR_PATH_CHECK: LD A,(HL) ; .checkDir: LD HL,CurrentDirectory+1 LD DE,WorkDirectory+1 + ; счётчик + LD A,B + LD B,C + EX AF,AF' ; .loop: LD A,(DE) AND A @@ -406,8 +410,22 @@ DIR_PATH_CHECK: LD A,(HL) CP (HL) INC HL INC DE - JR Z,.loop - JP .gotoPath + JR NZ,.gotoPath + DJNZ .loop + EX AF,AF' + SUB 1 + RET C + EX AF,AF' + DJNZ .loop + ; +.gotoPath: LD C,B + EX AF,AF' + LD B,A + CALL FINDDIR.CHECK_SLASH + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET C + LD HL,CurrentPath + JP GETWORD ; .end: CP (HL) RET Z @@ -417,12 +435,7 @@ DIR_PATH_CHECK: LD A,(HL) LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) - RET -.gotoPath: CALL FINDDIR.CHECK_SLASH - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET C - LD HL,CurrentPath - JP GETWORD + RET ;----------------------------------------------------------------------; diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 0758840..a4eedd7 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -1,22 +1,22 @@ ; - STRUCT _sStack ; 256 bytes + STRUCT _sStack ; 256 bytes .buffer BLOCK 256,0 .SPoint BYTE 0 ENDS ; ; - STRUCT _sEXE_HEADER ; 512 bytes -.EXE_EXT TEXT 3,{"EX","E"} -.VERSION BYTE 0 -.OFFCOD1 WORD 0 -.OFFCOD2 WORD 0 -.LOADER WORD 0 -.RESERVED BLOCK 6,0 -.LD_ADDR WORD 0 -.PC_REG WORD 0 -.SP_REG WORD 0 -.RESERVED2 BLOCK 490,0 + STRUCT _sEXE_HEADER ; 512 bytes +.EXE_EXT TEXT 3,{"EX","E"} ; 0-2 EXE Сигнатура +.VERSION BYTE 0 ; 3 Version of EXE file +.OFFCOD1 WORD 00 ; 4-5 С какого смещения в файле будет грузиться код в +.OFFCOD2 WORD 00 ; 6-7 память по адресу (Code_addr) Low addr, High addr. +.LOADER WORD 00 ; 8-9 Размер первичного загрузчика или 0 +.RESERVED BLOCK 6,0 ; 10-15 Reserved +.LD_ADDR WORD 00 ; 16-17 Адрес расположения кода в памяти (#4100-#FFFF) +.PC_REG WORD 00 ; 18-19 Адрес в памяти с которого запустится код (Reg. PC) +.SP_REG WORD 00 ; 20-21 Адрес стека (Reg. SP) +.RESERVED2 BLOCK 490,0 ; 22-512 Можно использовать под текст для выпендрёжа или не использовать ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index 36c9eca..a8a24cb 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -957 \ No newline at end of file +959 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 348c999..2461fc3 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -155,5 +155,5 @@ MOUSE_BAUD: ; ;----------------------------------------------------; ; Внимание, стек хранится в той же странице! -SUBLOAD_SIZE EQU 10 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу +SUBLOAD_SIZE EQU 2 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу ;----------------------------------------------------; diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index 0fda843..5a7a215 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -11,7 +11,7 @@ cmd_chdir: xor a ld hl,work_buffer1; cp (hl) - jr nz,A877B + jr nz,.chdir ld (hl),"." ; ".." родит. папка inc hl ld (hl),"." @@ -19,7 +19,7 @@ cmd_chdir: ld (hl),0 dec hl dec hl -A877B: ld c,Dss.ChDir ; сменить тек. каталог +.chdir: ld c,Dss.ChDir ; сменить тек. каталог RST ToDSS jp c,print_err_message ; вывод сообщения jp Get_Path ; сохр. тек. диск и путь diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index c6d83a5..a64e308 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -181,9 +181,10 @@ cmd_dir: ;ld hl,has_not_full_info ;JR Z,.skip_full_space ; - ld hl,(free_space) ; мл. разряд + ld hl,(free_space_low) ; мл. разряд exx - ld hl,(free_space+2) ; ст. разряд + ld hl,(free_space_medium) ; ст. разряд + ;!FIXIT использовать старший разряд! free_space_high exx CALL Size2Char ld hl,T8B46 ; "0 000 000 000" @@ -495,11 +496,13 @@ A8B16: inc a ret ; -D88DC: dw 0 -D88DE: dw 0 -D88E0: dw 0 -dir_number: dw 0 -free_space: dword 0 +D88DC: WORD 0 +D88DE: WORD 0 +D88E0: WORD 0 +dir_number: WORD 0 +free_space_low: WORD 0 +free_space_medium: WORD 0 +free_space_high: BYTE 0 ; T8B2E: db "000000000" @@ -512,50 +515,76 @@ T8B46: db "0 000 000 000",0 ; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo ; иная логика получения метки тома - сначала ищется в корневой директории, ; если там нет, то берётся из BPB -read_disk_info: - OR #80 - LD HL,work_buffer -.full+1: LD B,0 - LD C,Dss.DskInfo - RST ToDSS - ; Файловая система - ; Серийный номер диска - ; Метка диска в BPB - EX AF,AF' - LD A,(.full) - OR A - JR Z,.no_full_space_option - ; - ; (DE*A)*BC - ;PUSH HL ; общее кол-во кластеров - ;PUSH DE ; свободных кластеров - PUSH BC ; размер сектора в байтах - EX AF,AF' - ; !TEST fat 32 - ;LD C,A ; A - размер кластера в секторах - ;CALL Mult16X8 - ; A:HL = DE*A - LD B,0 - LD C,A - EXX - PUSH DE - EXX - POP HL - ; HL:DE * BC свободные_кластеры * размер_кластера_в_секторах - CALL Mult32 - ; HL:DE = свободные_секторы - ; - ; EX DE,HL - ; LD H,0 - ; LD L,A - POP BC - CALL Mult32 - ; HL:DE = свободное место ;!FIXIT ограничено 4 гигами - ; - LD (free_space+2),HL - EX DE,HL - LD (free_space),HL - ; +read_disk_info: OR #80 + LD HL,work_buffer +.full+1: LD B,0 + LD C,Dss.DskInfo + RST ToDSS + ; Файловая система + ; Серийный номер диска + ; Метка диска в BPB + EX AF,AF' + LD A,(.full) + OR A + JR Z,.no_full_space_option + ; + ; max sector (LBA28) #0FFF'FFFF + ; HL - общее кол-во кластеров + ; DE - свободных кластеров low + ; DE' - свободных кластеров high + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + PUSH IX + ; + PUSH BC ; размер сектора в байтах + EX AF,AF' + ; A - размер кластера в секторах + ; + ; free_clu_L * clu_size_in_sect + LD C,A + EX AF,AF' + CALL Mult16X8 ; DE*C = A:HL + ; A:HL = DE*C + ; + ; free_clu_H * clu_size_in_sect + EXX + EX AF,AF' + LD C,A + PUSH BC + CALL Mult16X8 ; DE*C = A:HL + ; max #0FFF'FFFF sectors for LBA28 + EX AF,AF' + LD D,0 + LD E,A + ADD HL,DE + EXX + ; HL':HL - свободных секторов + ; + EX DE,HL + POP BC ; размер сектора в байтах + PUSH BC + CALL Mult_16x16 ; DE*BC = HL:DE. + EXX + POP BC + CALL Mult_16x16 ; DE*BC = HL:DE. + LD XH,D + LD XL,E + EXX + EX DE,HL + ADD IX,DE + EX DE,HL + EXX + JR NC,.no_inc_HL + INC L + ; потому что не должно быть больше #001F'FFFF'FE00 + ; при секторе в 512 байтов + ; +.no_inc_HL: LD A,L + LD (free_space_high),A + LD (free_space_medium),IX + EXX + LD (free_space_low),DE + POP IX ; .no_full_space_option: ; parse @@ -647,8 +676,7 @@ read_disk_info: .good_label: POP HL PUSH HL ; лишнее - -; есть метка + ; есть метка volume_label: pop DE ; лишнее ; %5 @@ -663,7 +691,6 @@ volume_label: call ncopy_string ; скопир. строку (с нулем) ret ; - ; если не удалось прочитать серийный номер диска или формат неизвестен unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже @@ -787,51 +814,77 @@ Size2Char: ;Процедура умножения (16*8bit) ;На вход: DE * C ;На выход:A:HL = результат -Mult16X8: - SUB A - LD L,A - LD H,A - CP C - RET Z - OR D - OR E - RET Z - LD A,C - LD C,#00 - LD B,#08 -Mlt16x8: - ADD HL,HL - RLA - JR NC,1F - ADD HL,DE - ADC A,C -1: DJNZ Mlt16x8 - RET +Mult16X8: SUB A + LD L,A + LD H,A + CP C + RET Z + OR D + OR E + RET Z + LD A,C + LD C,#00 + LD B,#08 +.loop: ADD HL,HL + RLA + JR NC,.next + ADD HL,DE + ADC A,C +.next: DJNZ .loop + RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;Процедура умножения (32bit) ;На вход: HL:DE * BC ;На выход:HL:DE = результат -Mult32: - PUSH IX - LD IX,#0000 - LD A,#20 - EX DE,HL -mul32b: - ADD IX,IX - ADC HL,HL - RL E - RL D - JR NC,noadd1 - ADD IX,BC - JR NC,noadd1 - INC HL -noadd1: - DEC A - JR NZ,mul32b - LD E,LX - LD D,HX - POP IX - RET + IFUSED Mult32 +Mult32: PUSH IX + LD IX,#0000 + LD A,#20 + EX DE,HL +.loop: ADD IX,IX + ADC HL,HL + RL E + RL D + JR NC,.no_add + ADD IX,BC + JR NC,no_add + INC HL +.no_add: DEC A + JR NZ,.loop + LD E,LX + LD D,HX + POP IX + RET + ENDIF ;----------------------------------------------------------------------; +;INPUT : DE * BC +;OUTPUT: HL:DE +Mult_16x16: LD IX,0 + LD HL,0 + ; + LD A,B + OR C + JR Z,.exit + ; +.loop: SRL B + RR C + JP NC,.no_add + ADD IX,DE + JR NC,.no_add + INC HL + ; +.no_add: LD A,B + OR C + JR Z,.exit + ; + SLA E + RL D + RL L + RL H + JP .loop + ; +.exit: LD D,XH + LD E,XL + RET /////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 272a458..194ba8c 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -316 \ No newline at end of file +320 \ No newline at end of file From 34e1fc6773804a34a0e29d41d2801c606ffb57ac Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 24 Apr 2024 05:52:14 +1000 Subject: [PATCH 120/219] =?UTF-8?q?no=20bugs.=20=D0=BE=D1=82=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B8=D0=BB=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D1=80=D1=8F=D0=BB=D0=BA=D1=83=20=D1=84=D0=B0?= =?UTF-8?q?=D1=82=20-=20=D0=B3=D0=BB=D1=8E=D1=87=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 190 ++++++++++++++++++++++--------------------- DSS/FS/FAT/FAT_X.asm | 31 +++++-- DSS/build.txt | 2 +- DSS/defines.inc | 1 + 4 files changed, 124 insertions(+), 100 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 76ef5e2..c8113e3 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -87,15 +87,37 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD DE,(FSIZE0) LD HL,#4000 SBC HL,DE - RLA -.set_size: LD (BIG_SHELL),A - ; + JR NC,.set_no_size +.set_size: LD A,#FF +.set_no_size: LD (BIG_CORE),A + OR A + PUSH AF + ; загрузка LD HL,(FCLUSTR) LD DE,#C000 - CALL FLOAD ; загрузка - - - DI + CALL LOAD_CORE + ; [ ] загрузка system.dos больше #4000 байтов + EX AF,AF' + POP AF + JR Z,.no_big_core + EX AF,AF' + JR C,.no_big_core + ; + IN A,(SLOT1) + LD (BANKDOS),A + LD A,SUBLOAD_SIZE + LD (LOAD_CORE.max_sectors),A + LD (BIG_CORE),A ; теперь это счётчик оставшихся секторов + ; + LD A,(BOOT.SectorsPerCluster) + CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов + JP NC,INC_SECTOR_NUM + CALL C,R_F_FAT ; next cluster in chain + EX DE,HL + LD DE,#C000 + CALL NC,LOAD_CORE +.no_big_core: ; +RUN_CORE: DI XOR A OUT (SYS_PORT.OFF),A ; @@ -171,6 +193,21 @@ XFAIL: CALL DOSMESS .halt: JR .halt ; +; +INC_SECTOR_NUM: PUSH DE + CALL NSECTOR + LD DE,#20 ;!HARDCODE количество прочитанных секторов + ADD IX,DE + JR NC,.no_inc + INC HL +.no_inc: ; + POP DE + CALL .set_stack + JP RUN_CORE +.set_stack: PUSH HL + JP LOAD_CORE.subload +; + ; PART_TB: PUSH BC LD HL,(BOOT+510) @@ -439,6 +476,53 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 ; ; HL - CLUSTER ; ; DE - ADDRESS ; ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +LOAD_CORE: LD (READMEM),DE +.loop: PUSH HL + CALL NSECTOR + LD DE,(READMEM) + LD A,(BOOT.SectorsPerCluster) +.max_sectors+1: CP #20 + JR C,.SMALL_CLUSTER + ; +.subload: LD A,(.max_sectors) + LD B,A + LD C,BIOS.DRV_READ_LONG + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST ToBIOS_18 + POP HL + AND A + RET + ; +.SMALL_CLUSTER: LD B,A + LD C,BIOS.DRV_READ_LONG + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST ToBIOS_18 + ; + LD HL,(READMEM) + LD DE,(CLU_LEN) + ADD HL,DE + LD (READMEM),HL + POP HL + CCF + RET NC + ; [ ] загрузка system.dos больше #4000 байтов + LD A,(BIG_CORE) + DEC A + LD (BIG_CORE),A + RET Z + ; + CALL R_F_FAT + RET C + EX DE,HL + JP .loop + +; HL - CLUSTER +; DE - ADDRESS +;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы ; FLOAD: LD (READMEM),DE ; .LD_FILE: PUSH HL ; system.dos first cluster ; CALL NSECTOR ; Cluster to Sector @@ -476,7 +560,6 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 ; JR .set_drv ; ; ; .SMALL_CLUSTER: LD B,A -; ;LD C,BIOS.DRV_READ_LONG ; LD A,(BANKDOS) ; EX AF,AF' ; LD A,(DRIVE) @@ -511,92 +594,15 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 ; LD (BANKDOS),A ; LD HL,#C000 ; LD (READMEM),HL +; LD A,(BOOT.SectorsPerCluster) +; SUB SUBLOAD_SIZE + 1 +; CCF +; RET NC +; LD A,SUBLOAD_SIZE +; LD (BOOT.SectorsPerCluster),A ; AND A ; RET -; HL - CLUSTER -; DE - ADDRESS -;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы -FLOAD: LD (READMEM),DE -.LD_FILE: PUSH HL ; system.dos first cluster - CALL NSECTOR ; Cluster to Sector - LD DE,(READMEM) - LD A,(BOOT.SectorsPerCluster) - CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов - LD C,BIOS.DRV_READ_LONG - JR C,.SMALL_CLUSTER - LD A,(BANKDOS) - EX AF,AF' - ;LD BC,#20*256 + BIOS.DRV_READ_LONG - LD B,#20 ; !HARDCODE кол-во загружаемых секторов -.set_drv: LD A,(DRIVE) - RST ToBIOS_18 - JP C,GOOD_DRIVE.NoShell - POP HL - ; [ ] загрузка system.dos больше #4000 байтов - ;AND A - ;RET - LD A,(BIG_SHELL) - OR A - RET Z - ; - XOR A - LD (BIG_SHELL),A - PUSH HL - CALL NSECTOR - LD DE,#20 ; !HARDCODE кол-во прочитанных секторов - AND A - ADD IX,DE - JR NC,.no_inc_hl - INC HL -.no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE кол-во ДОзагружаемых секторов - LD DE,#4000 - JR .set_drv - ; -.SMALL_CLUSTER: LD B,A - LD A,(BANKDOS) - EX AF,AF' - LD A,(DRIVE) - RST ToBIOS_18 - JP C,GOOD_DRIVE.NoShell - ; - LD HL,(READMEM) - LD DE,(CLU_LEN) - ADD HL,DE - LD (READMEM),HL - ; [ ] загрузка system.dos больше #4000 байтов - ;POP HL - ;RET C - CALL C,.more_than_1 - POP HL - RET C - ; - CALL R_F_FAT ; next cluster in chain - RET C - EX DE,HL - JP .LD_FILE - ; [ ] загрузка system.dos больше #4000 байтов -.more_than_1: LD A,(BIG_SHELL) - OR A - SCF - RET Z - IN A,(SLOT1) - LD HL,BANKDOS - CP (HL) - CCF - RET Z - LD (BANKDOS),A - LD HL,#C000 - LD (READMEM),HL - LD A,(BOOT.SectorsPerCluster) - SUB SUBLOAD_SIZE + 1 - CCF - RET NC - LD A,SUBLOAD_SIZE - LD (BOOT.SectorsPerCluster),A - AND A - RET - ; @@ -906,7 +912,7 @@ DISKH EQU VALUE+48 DISKL EQU VALUE+50 READMEM EQU VALUE+52 ;SHEL_FM EQU VALUE+54 -BIG_SHELL EQU VALUE+54 +BIG_CORE EQU VALUE+54 BANKDOS EQU VALUE+55 ; EQU VALUE+56 diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index f1a82d6..d256392 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -28,8 +28,8 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE EXX LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - OR D OR E + OR D ; EX AF,AF' OUT (SLOT3),A @@ -327,7 +327,14 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Вход: HL - Номер первой ячейки кластера в блоке фата ; Портить только HL и A SET_FAT32_CACHE_BLOCK_CHANGED_REGION: - LD A,H + DEC HL + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x16 + 1 + JR C,.start + DEC HL + DEC HL + ; +.start: LD A,H AND #38 LD HL,#0108 JR Z,.set_region @@ -391,6 +398,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; SET_PAGE_X FATPAGE EXX PUSH HL + AND A PUSH AF PUSH DE ; младший номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD @@ -407,17 +415,21 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D - ; -.exit: ; [ ] ускорение работы с кэшем FAT +.exit: ; + IF FAST_FAT_CASHE + ; [ ] ускорение работы с кэшем FAT CALL SET_FAT32_CACHE_BLOCK_CHANGED_REGION ; + ENDIF POP AF ; восст. порт POP HL OUT (SLOT3),A + IFN FAST_FAT_CASHE ; [x] 2/12/23 FAT не всегда мог записаться на HDD - ;XOR A - ;INC A - ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD A,#FF + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ; + ENDIF ; CF = 0 RET ; @@ -672,13 +684,17 @@ WRITE_FAT_TABLE: LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + IF FAST_FAT_CASHE CP #FF JR NZ,.SAVE_NOT_ALL_BLOCK + ENDIF ; LD DE,FATPAGE.cache ; откуда LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV + ; + IF FAST_FAT_CASHE .SAVE_NOT_ALL_BLOCK: ; A = CORE_BUFFERS.FatBuffer.CacheUpdated ; HL:IX - смещение внутри раздела на начало нужного блока FAT @@ -735,6 +751,7 @@ WRITE_FAT_TABLE: POP AF DJNZ .region_loop RET + ENDIF ;----------------------------------------------------------------------- ; ;[x] fat32 ;!TEST diff --git a/DSS/build.txt b/DSS/build.txt index a8a24cb..1c4af3a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -959 \ No newline at end of file +972 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 2461fc3..815195c 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -29,6 +29,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE USE_FSINFO_FAT32 1 ; недоделано. А нужно ли? DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 + DEFINE FAST_FAT_CASHE 0 ; !FIXIT баги при стирании SERVICE_SECTORS: .FAT12 EQU #0FEF From ebeb859eb128bf412411c90567bfcd47998554cb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 26 Apr 2024 06:20:12 +1000 Subject: [PATCH 121/219] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=83=D1=81=D0=BA=D0=BE=D1=80=D1=8F=D0=BB=D0=BA=D1=83?= =?UTF-8?q?=20=D1=84=D0=B0=D1=82.=20=D0=B2=20Shell=20=D1=81=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=20=D1=81=D0=B2=D0=BE=D0=B1=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B5=20=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0=20fat32,=20?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BD=D0=B5=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/FS/FAT/FAT_X.asm | 69 ++++++----- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/Commands/DIR.ASM | 257 +++++++++++++++++++++-------------------- SHELL/build.txt | 2 +- 5 files changed, 177 insertions(+), 155 deletions(-) diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index d256392..97fbb35 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -16,30 +16,30 @@ ; Удаляет запись в каталоге и освобождает занятую цепочку кластеров ; Вход: IX - указатель на удаляемую запись в DIRPAGE ;!TODO record index. возможно, что может сломаться, если больше страницы -DELETE_REC_FAT: SET_PAGE_X DIRPAGE +DELETE_REC_FAT: SET_PAGE_X DIRPAGE: EX AF,AF' CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла ; fat32 - LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) - LD A,E - OR D + LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD H,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD A,L + OR H EXX - LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - OR E - OR D + LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD H,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + OR L + OR H ; EX AF,AF' OUT (SLOT3),A EX AF,AF' JP Z,SAVEDIR ; сбросить кеш каталога на диск ; если размер файла не ноль -.loop: EX DE,HL ; hl=номер кластера - EXX - EX DE,HL - EXX +.loop: ;EX DE,HL ; hl=номер кластера + ;EXX + ; EX DE,HL + ;EXX CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EXX PUSH DE ; номер след. кластера @@ -52,11 +52,13 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE ; LD DE,#0000 ; номер кластера CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - POP DE + POP HL EXX POP AF - POP DE + POP HL + ;EX DE,HL EXX + ;EX DE,HL JP NC,.loop CALL WRITE_FAT_TABLE JP SAVEDIR ; сбросить кеш каталога на диск @@ -64,17 +66,18 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE ; Установить первым известным кластером для поиска свободного. ; Установится только если меньше предыдущего ; Вход: HL':HL - cluster +; портит DE, BC' и A ; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный SET_NEW_FREE_CLUSTER: XOR A - LD B,D - LD C,E + ;LD B,D + ;LD C,E EX DE,HL LD HL,(G_CLUST.low) SBC HL,DE EX DE,HL - LD D,B - LD E,C + ;LD D,B + ;LD E,C ; EXX LD B,D @@ -327,12 +330,12 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Вход: HL - Номер первой ячейки кластера в блоке фата ; Портить только HL и A SET_FAT32_CACHE_BLOCK_CHANGED_REGION: - DEC HL - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x16 + 1 - JR C,.start - DEC HL - DEC HL + ;DEC HL + ;LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + ;CP FAT_TYPE.x16 + 1 + ;JR C,.start + ;DEC HL + ;DEC HL ; .start: LD A,H AND #38 @@ -340,6 +343,7 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: JR Z,.set_region ; .loop: SLA H + AND A SUB L JR NZ,.loop ; @@ -716,7 +720,7 @@ WRITE_FAT_TABLE: LD E,A ; .good_blk: SRL C - JR C,.SAVE_FAT_CACHE_REGION + CALL C,.SAVE_FAT_CACHE_REGION EXX ADD HL,DE EXX @@ -731,26 +735,33 @@ WRITE_FAT_TABLE: PUSH AF PUSH DE PUSH BC + PUSH HL + PUSH IX ; EXX PUSH HL + PUSH HL EXX LD B,E ; кол-во секторов POP DE ; Адрес в странице КЭШа LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write RST ToDSS.DRV - PUSH DE + ; HL:IX = Sector + Sector counter + ; DE = Address + (Sector counter * Size sector) EXX - POP HL + POP HL ; адрес в странице КЭШа LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов) EXX ; + POP IX + POP HL POP BC POP DE POP AF - DJNZ .region_loop RET + ; DJNZ .region_loop + ; RET ENDIF ;----------------------------------------------------------------------- ; diff --git a/DSS/build.txt b/DSS/build.txt index 1c4af3a..fbee9e3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -972 \ No newline at end of file +982 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 815195c..33a4515 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -29,7 +29,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE USE_FSINFO_FAT32 1 ; недоделано. А нужно ли? DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 - DEFINE FAST_FAT_CASHE 0 ; !FIXIT баги при стирании + DEFINE FAST_FAT_CASHE 1 ; !FIXIT баги при стирании SERVICE_SECTORS: .FAT12 EQU #0FEF diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index a64e308..d58bf22 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -291,7 +291,7 @@ A89A4: ld a,(ix+32) ld h,(ix+31) exx push ix - call A8A8F ; десятичный 32-х разрядный вывод + call MAKE_LN ; десятичный 32-х разрядный вывод ld hl,T8B37 ld a,(hl) cp " " @@ -299,7 +299,7 @@ A89A4: ld a,(ix+32) ld a,"0" ld (hl),a A89CD: ld de,T8B46 ; "0 000 000 000" - ld hl,T8B2E ; "0000000000" + ld hl,L32BIT_ ; "0000000000" ldi ld a," " ld (de),a @@ -411,89 +411,100 @@ A8A7E: ld c,2Fh ;!TODO перетащить в procedures/math.asm ; Десятичный 32-х разрядный вывод -A8A8F: ld ix,T8B2E ; "0000000000" - exx - ld de,3B9Ah - exx - ld de,0CA00h - call A8B15 ; 1,000,000,000 - exx - ld de,05F5h - exx - ld de,0E100h - call A8B15 ; 100,000,000...999,999,999 - exx - ld de,98h - exx - ld de,9680h - call A8B15 ; 10,000,000...99,999,999 - exx - ld de,0Fh - exx - ld de,4240h - call A8B15 ; 1,000,000...9,999,999 - exx - ld de,1 - exx - ld de,86A0h - call A8B15 ; 100,000...999,999 - exx - ld de,0 - exx - ld de,10000 - call A8B15 ; 10,000...99,999 - exx - ld de,0 - exx - ld de,1000 - call A8B15 ; 1,000...9,999 - exx - ld de,0 - exx - ld de,100 - call A8B15 ; 100..999 - exx - ld de,0 - exx - ld de,10 - call A8B15 ; 10..99 - ld a,l - add a,"0" - ld (ix+0),a - inc ix - ld hl,T8B2E ; "0000000000" - ld de,2030h ; " ","0" -A8B04: ld a,(hl) - cp e - jr nz,A8B0D - ld (hl),d - inc hl - jr A8B04 - ; -A8B0D: ld hl,T8B37 ; "0" - ld a,(hl) - cp d - ret nz - ld (hl),e - ret +; HL':HL - число для перевода +MAKE_LN: ld ix,L32BIT_ ; "0000000000" + exx + ld de,#3B9A + exx + ld de,#CA00 + ; DE':DE = 1,000,000,000 + call GET_DIG + exx + ld de,#05F5 + exx + ld de,#E100 + ; DE':DE = 100,000,000 + call GET_DIG ; 100,000,000...999,999,999 + exx + ld de,#98 + exx + ld de,#9680 + ; DE':DE = 10,000,000 + call GET_DIG ; 10,000,000...99,999,999 + exx + ld de,#0F + exx + ld de,#4240 + ; DE':DE = 1,000,000 + call GET_DIG ; 1,000,000...9,999,999 + exx + ld de,#01 + exx + ld de,#86A0 + ; DE':DE = 100,000 + call GET_DIG ; 100,000...999,999 + exx + ld de,#00 + exx + ld de,#2710 + ; DE':DE = 10,000 + call GET_DIG ; 10,000...99,999 + exx + ld de,#00 + exx + ld de,#03E8 + ; DE':DE = 1,000 + call GET_DIG ; 1,000...9,999 + exx + ld de#00 + exx + ld de,#64 + ; DE':DE = 100 + call GET_DIG ; 100..999 + exx + ld de,#00 + exx + ld de,#0A + ; DE':DE = 10 + call GET_DIG ; 10..99 + ld a,l + add a,"0" + ld (ix+0),a + inc ix + ld hl,L32BIT_ ; "0000000000" + ld de,#2030 ; " ","0" +.KILLZ: ld a,(hl) + cp e + jr nz,.KILLZ2 + ld (hl),d + inc hl + jr .KILLZ + ; +.KILLZ2: ld hl,T8B37 ; "0" + ld a,(hl) + cp d + ret nz + ld (hl),e + ret -A8B15: xor a -A8B16: inc a - sbc hl,de - exx - sbc hl,de - exx - jp nc,A8B16 - add hl,de - exx - adc hl,de - exx - dec a - add a,"0" - ld (ix+0),a - inc ix - ret +GET_DIG: xor a +.loop: inc a + sbc hl,de + exx + sbc hl,de + exx + jp nc,.loop + ; + add hl,de + exx + adc hl,de + exx + dec a + add a,"0" + ld (ix+0),a + inc ix + ret ; D88DC: WORD 0 @@ -505,11 +516,11 @@ free_space_medium: WORD 0 free_space_high: BYTE 0 ; -T8B2E: db "000000000" -T8B37: db "0" -T8B38: db " ",0 -T8B46: db "0 000 000 000",0 - db 0 +L32BIT_: db "000000000" +T8B37: db "0" +T8B38: db " ",0 +T8B46: db "0 000 000 000",0 + db 0 ; ; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo @@ -523,18 +534,17 @@ read_disk_info: OR #80 ; Файловая система ; Серийный номер диска ; Метка диска в BPB + ; + ; HL':HL - общее кол-во кластеров + ; DE':DE - свободных кластеров + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + ; max sector (LBA28) #0FFF'FFFF + ; EX AF,AF' LD A,(.full) OR A JR Z,.no_full_space_option - ; - ; max sector (LBA28) #0FFF'FFFF - ; HL - общее кол-во кластеров - ; DE - свободных кластеров low - ; DE' - свободных кластеров high - ; A - размер кластера в секторах - ; BC - размер сектора в байтах - PUSH IX ; PUSH BC ; размер сектора в байтах EX AF,AF' @@ -547,45 +557,46 @@ read_disk_info: OR #80 ; A:HL = DE*C ; ; free_clu_H * clu_size_in_sect - EXX EX AF,AF' - LD C,A - PUSH BC - CALL Mult16X8 ; DE*C = A:HL - ; max #0FFF'FFFF sectors for LBA28 - EX AF,AF' - LD D,0 - LD E,A - ADD HL,DE EXX - ; HL':HL - свободных секторов + LD C,A + CALL Mult16X8 ; DE*C = A:HL + ; A:HL = DE*C + ; max #0FFF'FFFF sectors for LBA28 + EX AF,AF' + LD D,0 + LD E,A + ADD HL,DE + EXX ; EX DE,HL + ; HL':DE - свободных секторов + ; POP BC ; размер сектора в байтах PUSH BC CALL Mult_16x16 ; DE*BC = HL:DE. EXX - POP BC - CALL Mult_16x16 ; DE*BC = HL:DE. - LD XH,D - LD XL,E - EXX - EX DE,HL - ADD IX,DE + POP BC EX DE,HL + CALL Mult_16x16 ; DE*BC = HL:DE. + LD XH,D + LD XL,E EXX - JR NC,.no_inc_HL - INC L + EX DE,HL + ADD IX,DE + EX DE,HL + EXX + JR NC,.no_inc_HL + INC L ; потому что не должно быть больше #001F'FFFF'FE00 ; при секторе в 512 байтов - ; -.no_inc_HL: LD A,L - LD (free_space_high),A - LD (free_space_medium),IX +.no_inc_HL: ; + LD A,L + LD (free_space_high),A + LD (free_space_medium),IX EXX LD (free_space_low),DE - POP IX - ; + ; .no_full_space_option: ; parse LD D,0 @@ -767,7 +778,7 @@ cmd_dir_pause: jp cmd_dir.parse /////////////////////////////////////////////////////////////////////////////////////// Size2Char: - call A8A8F ; десятичный 32-х разрядный вывод + call MAKE_LN ; десятичный 32-х разрядный вывод ld hl,T8B37 ; "0" ld a,(hl) cp " " @@ -776,7 +787,7 @@ Size2Char: ld (hl),a .not_zero: ld de,T8B46 ; "0 000 000 000" - ld hl,T8B2E ; "0000000000" + ld hl,L32BIT_ ; "0000000000" ld a,(hl) ldi cp " " diff --git a/SHELL/build.txt b/SHELL/build.txt index 194ba8c..871cae9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -320 \ No newline at end of file +323 \ No newline at end of file From a904026a45e9e7e3f503b98693fe7d191bb441fd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Apr 2024 06:14:56 +1000 Subject: [PATCH 122/219] =?UTF-8?q?CORE:=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB?= =?UTF-8?q?=20=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20FSinfo=20free=20clust?= =?UTF-8?q?ers=20count=20SHELL:=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D0=B0=20DIR=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=8F=D0=B5?= =?UTF-8?q?=D1=82=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/diskINF.asm | 36 +- DSS/FS/FAT/FAT.asm | 68 +- DSS/FS/FAT/FAT_X.asm | 59 +- DSS/Media_drivers/fdd-drv.asm | 13 +- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 1 + SHELL/Commands/DIR.ASM | 1339 +++++++++++++++++---------------- SHELL/Messages/main_txt.asm | 59 +- SHELL/SHELL.ASM | 21 +- SHELL/build.txt | 2 +- 11 files changed, 880 insertions(+), 722 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 4938c26..770ac93 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -130,28 +130,48 @@ DISKINF: LD C,B POP BC RET C ; -.CheckFreeSpace: +.CheckFreeSpace:; если GetFreeSpace не вызывается XOR A OR B + LD A,#FF + LD B,A + LD C,A + EXX + LD B,A + LD C,A + EXX CALL NZ,.GetFreeSpace ; ;.FRESP2: - LD D,B - LD E,C + ; A = 0 if B != 0 before .GetFreeSpace + ; + LD H,B + LD L,C + ; LD DE,2 + ; SBC HL,DE + EX DE,HL + EXX + LD H,B + LD L,C + ; LD DE,2 + ; SBC HL,DE + EX DE,HL + EXX LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) DEC HL ; fat 32 EXX - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + JR NC,.skip_dec_hl DEC HL - EXX +.skip_dec_hl: EXX LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) AND A RET ; .GetFreeSpace: XOR A - LD HL,2 ; [ ] fat32 ? номер кластера от которого считать + LD HL,2 ; fat32 номер кластера от которого считать ; fat32 EXX LD H,A @@ -181,6 +201,7 @@ DISKINF: LD C,B OR E OR D JR NZ,.skip + ; INC BC LD A,B OR C @@ -188,6 +209,7 @@ DISKINF: LD C,B EXX INC BC EXX + ; .skip: INC HL LD A,L OR H @@ -195,7 +217,7 @@ DISKINF: LD C,B EXX INC HL EXX - JR .loop_free_space + JP .loop_free_space ; ; [ ] 22/11/23 подфункция с доп.инфой .mCOPY_LOOP: LD B,0 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 7fcd78a..ba6fd0a 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -12,16 +12,22 @@ ; сбрасывает значение свободных кластеров на "неопределено" ; меняет значение первого свободного кластера -SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) +SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + RET NZ + ; + LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) OR A RET Z ; + ;!TODO формировать самому в буфер CALL READ_FSinfo ; ;!TODO FREE_CLUSTERS_COUNT - LD HL,#FFFF - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL ; FIRST_FREE_CLUSTER LD HL,(G_CLUST.low) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL @@ -29,7 +35,7 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL ; XOR A - LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A JR WRITE_FSinfo ; ; ; Прочитать BPB в SECTOR_BUFFER @@ -831,7 +837,7 @@ RD_BPB: ; LD C,SLOT3 PUSH HL ; Total Sectors low SBC HL,DE ; -.HDDBIG: CALL ClusterToSector +.HDDBIG: CALL SectorToCluster ; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; SCF ; .loop7: RRA @@ -938,8 +944,8 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC - - CALL ClusterToSector + ; + CALL CLUSTER_TO_SECTOR LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC ; @@ -1007,7 +1013,7 @@ RD_BPB: ; LD C,SLOT3 DJNZ .fsinfo_loop ; .error_sig: XOR #FF - LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A ; XOR A LD H,A @@ -1030,27 +1036,32 @@ RD_BPB: ; LD C,SLOT3 LD DE,#6141 SBC HL,DE JR NZ,.error + ;!TODO FREE_CLUSTERS_COUNT + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + LD DE,(CORE_BUFFERS.SECTOR_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 (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),BC + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),DE + ; ; FIRST_FREE_CLUSTER - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) ; CF = 0 - ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? - SBC HL,BC - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) - SBC HL,DE + CALL .check_cluster JR C,.error ; LD (G_CLUST.high),DE LD (G_CLUST.low),BC - ;!TODO FREE_CLUSTERS_COUNT - ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL - ; XOR A -.error: LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A +.error: LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A RET Z ;!TODO FREE_CLUSTERS_COUNT ;LD HL,#FFFF @@ -1064,12 +1075,19 @@ RD_BPB: ; LD C,SLOT3 LD L,H LD (G_CLUST.high),HL RET + ; + ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? +.check_cluster: LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + SBC HL,BC + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + SBC HL,DE + RET ENDIF ;;;;;;;; -; --> BC:HL - Cluster -; <-- BC:HL - Sector -ClusterToSector: +; --> BC:HL - Sector +; <-- BC:HL - Cluster +SectorToCluster: LD A,B AND #0F LD B,A diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 97fbb35..200492e 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -16,7 +16,7 @@ ; Удаляет запись в каталоге и освобождает занятую цепочку кластеров ; Вход: IX - указатель на удаляемую запись в DIRPAGE ;!TODO record index. возможно, что может сломаться, если больше страницы -DELETE_REC_FAT: SET_PAGE_X DIRPAGE: +DELETE_REC_FAT: SET_PAGE_X DIRPAGE EX AF,AF' CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла @@ -68,6 +68,7 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE: ; Вход: HL':HL - cluster ; портит DE, BC' и A ; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный +; [ ] free clusters for FSInfo SET_NEW_FREE_CLUSTER: XOR A ;LD B,D @@ -138,16 +139,62 @@ G_CLUST: ; LD (G_CLUST.high),HL EXX INC A - LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + ; [ ] free clusters for FSInfo + ; XOR A ; уменьшить + ; CALL SET_NEW_FREE_CLUSTERS RET +; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров +SET_NEW_FREE_CLUSTERS: + PUSH HL + EXX + PUSH HL + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + EXX + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + ; + OR A + JR Z,.dec_clusters + ; inc clusters + INC HL + LD A,H + OR L + JR NZ,.set_new + EXX + INC HL + EXX + ; +.set_new: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + EXX + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + POP HL + EXX + POP HL + LD A,1 + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + RET + ; +.dec_clusters: LD A,H + OR L + DEC HL + JR NZ,.set_new + EXX + DEC HL + EXX + JP .set_new +; ; + ; ; [x] fat32 ;!TEST ; Прикрепить к последнему кластеру цепочки новый пустой кластер ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -INC_FAT: PUSH HL ; текущий кластер +INC_FAT: ; [ ] free clusters for FSInfo + ; + ; + PUSH HL ; текущий кластер EXX PUSH HL ; текущий кластер EXX @@ -210,7 +257,7 @@ CHECK_CLUSTER_IS_SMALLER: LD A,DSS_Error.sys.DISK_FULL RET C RET NZ - ; проверяем младше слово номера кластера + ; проверяем младшее слово номера кластера .low: EX DE,HL LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) SBC HL,DE @@ -585,9 +632,7 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - CALL Z,SET_FSInfo +.Start: CALL SET_FSInfo LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index c3a3082..50104cf 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -172,10 +172,15 @@ FDDRIVE: .STAT: XOR A RET -;!FIXIT проверять ВГ93 когда это станет возможным -.CHEK: LD A,#FF - AND A - RET + +.CHEK: ;!FIXIT проверять ВГ93 когда это станет возможным + IF NON_REMOVABLE_FDD + XOR A + ELSE + LD A,#FF + OR A + ENDIF + RET ;DE - ADDRESS .GBPB: LD IX,0 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index a4eedd7..1c8cc57 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -103,7 +103,7 @@ .FSINFO_Sector WORD #01 .BPB_SERIAL_NUMBER DWORD #00000000 .BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS -.RESET_FSINFO BYTE 0 +.UPD_FSINFO BYTE 0 ; IF USE_FSINFO_FAT32 ;.FREE_CLUSTERS_COUNT_L WORD #FFFF ;.FREE_CLUSTERS_COUNT_H WORD #FFFF diff --git a/DSS/build.txt b/DSS/build.txt index fbee9e3..c9ebe15 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -982 \ No newline at end of file +978 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 33a4515..c85ad2d 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -102,6 +102,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE EnoughtOnly_LF 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - тормознее, но безопаснее + DEFINE NON_REMOVABLE_FDD 0 ; ;-------------------[MEMORY]-------------------------; DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index d58bf22..093e313 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -3,415 +3,405 @@ ; DIR. Вывод списка файлов и папок ; ;/////////////////////////////////////////////////// -cmd_dir: - push de - ;;;; [ ] поддержка параметров - ; зануляем все параметры на старте - xor a - ld (read_disk_info.full),a - ld (.key_p),a - - ; выполняем/настраиваем все найденные параметры в строке - LD C,256-3 ;!HARDCODE длина строки с командой -.parse: ld hl,cmd_dir_options - call RUN_OPTION - jr nc,.end_opt - jp (hl) -.end_opt: - ; выводим строку о расчёте свободного места так, чтоб она затёрлась - ld a,(read_disk_info.full) - and a - jr z,.skip - LD DE,MAIN_MSG.CALCULATING - CALL MESSAGE -.skip: ld c,Dss.CurDisk ; узнать тек. диск - RST ToDSS - ADD A,"A" - ld (root_path),a ; номер диска - SUB "A" - call read_disk_info ; прочитать метку и серийный номер диска - ; - pop de - ld hl,0 - ld (D88DC),hl - ld (D88DE),hl - ld (D88E0),hl - ld (dir_number),hl - - ex de,hl - ld de,work_buffer1 ; 80 - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - ; - ld a,(work_buffer1) - or a - jr nz,1F ; задана маска имен - ; - ld hl,mask_fname ; "*.*" - ld de,work_buffer1 - call copy_string - ; [ ] 1/10/23 -1: ld hl,work_buffer1 ; имя файла - ld de,work_buffer1 ; 80 буфер - ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) - ld bc,Dss.F_First.FATname ; f_first (формат 11) - RST ToDSS - JR C,.dir_empty ;R14 - CALL .Print_Header - ; - LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE - PUSH AF - ; цикл вывода списка файлов/папок -.loop: POP AF -.key_p+1: and #ff - dec a - jr nz,.skip_wait - ld de,MAIN_MSG.PAUSE - call MESSAGE ; вывести строку - ld c,Dss.WaitKey - rst ToDSS - dec d - ld de,MAIN_MSG.DIR_ESCAPE - jp z,MESSAGE ; закончить по ESC - ;jr nz,.skip_esc - ;xor a - ;ld (.key_p),a ; отменяем ESC -.skip_esc: - ld a,32-1 -.skip_wait: - PUSH AF - ; - ld hl,work_buffer1+33 ; 80 - ;push af - ;ld de,33 - ;add hl,de - call A88E2 - ; - ld ix,work_buffer1 ; 80 - ld a,(ix+32) ; атрибут тек. записи - and FAT_ATTR.DIRECTORY ; папка ? - jr z,.calc_size ; нет - ; считаем папки - ; не считаем папкой служебные "." и ".." - ld d,(ix+33) - ld e,(ix+34) - ld hl,-('..') - add hl,de - ld a,h - or l - jr z,.next - ld hl,-('. ') - add hl,de - ld a,h - or l - jr z,.next - ; увеличиваем счётчик папок - ld hl,(dir_number) - inc hl - ld (dir_number),hl - jr .next - +cmd_dir: push de + ;;;; [ ] поддержка параметров + ; зануляем все параметры на старте + xor a + ld (read_disk_info.full),a + ld (.key_p),a + ; выполняем/настраиваем все найденные параметры в строке + LD C,256-3 ;!HARDCODE длина строки с командой +.parse: ld hl,cmd_dir_options + call RUN_OPTION + jr nc,.end_opt + jp (hl) +.end_opt: ; выводим строку о расчёте свободного места так, чтоб она затёрлась + ld a,(read_disk_info.full) + and a + jr z,.skip + LD DE,MAIN_MSG.CALCULATING + CALL MESSAGE +.skip: ld c,Dss.CurDisk ; узнать тек. диск + RST ToDSS + ADD A,"A" + ld (root_path),a ; номер диска + SUB "A" + call read_disk_info ; прочитать метку и серийный номер диска + ; + pop de + xor a + ld h,a + ld l,a + ld (FILES),hl + ld (dir_number),hl + ld (S_LOW),hl + ld (S_MED),hl + ld (S_HIGH),a + ; + ex de,hl + ld de,work_buffer1 ; 80 + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ; + ld a,(work_buffer1) + or a + jr nz,.skipMask ; задана маска имен + ; + ld hl,mask_fname ; "*.*" + ld de,work_buffer1 + call copy_string + ; [ ] 1/10/23 +.skipMask: ld hl,work_buffer1 ; имя файла + ld de,work_buffer1 ; 80 буфер + ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) + ld bc,Dss.F_First.FATname ; f_first (формат 11) + RST ToDSS + JR C,.Dir_Empty ;R14 + CALL Print_Header + ; + LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE + PUSH AF + ; цикл вывода списка файлов/папок +.loop: POP AF +.key_p+1: and #ff + dec a + jr nz,.skip_wait + ld de,MAIN_MSG.PAUSE + call MESSAGE ; вывести строку + ld c,Dss.WaitKey + rst ToDSS + dec d + ld de,MAIN_MSG.DIR_ESCAPE + jp z,MESSAGE ; закончить по ESC + ;jr nz,.skip_esc + ;xor a + ;ld (.key_p),a ; отменяем ESC +.skip_esc: ld a,32-1 +.skip_wait: PUSH AF + ld hl,work_buffer1+33 ; 80 + ;push af + ;ld de,33 + ;add hl,de + call PRNNAME + ; + ld ix,work_buffer1 ; 80 + ld a,(ix+32) ; атрибут тек. записи + and FAT_ATTR.DIRECTORY ; папка ? + jr z,.Calc_Size ; нет + ; считаем папки + ; не считаем папкой служебные "." и ".." + ld d,(ix+33) + ld e,(ix+34) + ld hl,-('..') + add hl,de + ld a,h + or l + jr z,.next + ld hl,-('. ') + add hl,de + ld a,h + or l + jr z,.next + ; увеличиваем счётчик папок + ld hl,(dir_number) + inc hl + ld (dir_number),hl + jr .next ;;R14 -.dir_empty: - push af - CALL .Print_Header - pop af - CALL print_err_message - jr .print +.Dir_Empty: push af + CALL Print_Header + pop af + CALL print_err_message + jr .print ;;R14 - - ; прибавить размер тек. файла -.calc_size: - ld hl,(D88DC) - inc hl - ld (D88DC),hl - ld e,(ix+30) - ld d,(ix+31) - ld hl,(D88E0) - exx - ld e,(ix+28) - ld d,(ix+29) - ld hl,(D88DE) - add hl,de - exx - adc hl,de - exx - ld (D88DE),hl - exx - ld (D88E0),hl -.next: ld de,work_buffer1 ; 80 буфер - ld c,Dss.F_Next ; поиск след. - RST ToDSS - jp nc,.loop ; назад в цикл, если не конец списка - ; - pop af ; баланс стека - ; Десятичный вывод -.print: ld hl,(D88DC) - ld ix,PRM1 ; буфер - call PDIGIT - ; - ld hl,(D88DE) ; мл. разряд - exx - ld hl,(D88E0) ; ст. разряд - exx - ; - CALL Size2Char - ;;;;;;;;;;;;; - ; -; [ ] вывод количества папок -; [ ] вывод общего количества свободного места - ld hl,T8B46 ; "0 000 000 000" - ld de,PRM2 ; куда - call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ; - ;!TEST - ;ld hl,(dir_number) - ;ld de,PRM3 - ;call hex2dec_ascii_16bit.n10000 - ; Десятичный вывод - ld hl,(dir_number) - ld ix,PRM3 ; буфер - call PDIGIT - ;xor a - ;ld (de),a - ; - ; - ;LD A,(read_disk_info.full) - ;OR A - ;ld hl,has_not_full_info - ;JR Z,.skip_full_space - ; - ld hl,(free_space_low) ; мл. разряд - exx - ld hl,(free_space_medium) ; ст. разряд - ;!FIXIT использовать старший разряд! free_space_high - exx - CALL Size2Char - ld hl,T8B46 ; "0 000 000 000" - ; -;.skip_full_space: - ld de,PRM4 ; куда - call ncopy_string ; скопир. строку (с нулем), макс.15 симв. - ; - ; - ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s) %2 bytes" - CALL MESSAGE ; вывести строку - ld a,(read_disk_info.full) - and a - ld de,MAIN_MSG.DIR_4 ; - jp nz,MESSAGE - ld de,MAIN_MSG.CRLF ; - jp MESSAGE - - -.Print_Header: - ; %1 - ld hl,PRM1 - ld a,'"' - ld (hl),a - inc hl - ld a,(screen_path) ; диск - ld (hl),a - inc hl - ld a,'"' - ld (hl),a - inc hl - ;ld (hl),":" - ld (hl),0 - ; %2 - ld hl,serial_string ; строка серийного номера диска - ld de,PRM2 ; куда - call ncopy_string ; скопир. строку (с нулем) - ; %3 - ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным - ld de,PRM3 ; 16 буфер - CALL copy_string ; скопир. строку (с нулем) - ; - ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." - JP MESSAGE ; вывести строку - ; -; + ; прибавить размер тек. файла +.Calc_Size: ld hl,(FILES) + inc hl + ld (FILES),hl + ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) + ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3) + ld hl,(S_MED) + ld a,(S_HIGH) + exx + ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE) + ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1) + ld hl,(S_LOW) + add hl,de + ld (S_LOW),hl + exx + adc hl,de + ld (S_MED),hl + ;exx + adc a,0 + ld (S_HIGH),a + ;exx +.next: ld de,work_buffer1 ; 80 буфер + ld c,Dss.F_Next ; поиск след. + RST ToDSS + jp nc,.loop ; назад в цикл, если не конец списка + pop af ; баланс стека + ; Десятичный вывод +.print: ld hl,(FILES) + ld ix,PRM3 ; количество файлов + call PDIGIT + ; + ld a,(S_HIGH) + ld hl,(S_MED) ; ст. разряд + exx + ld hl,(S_LOW) ; мл. разряд + ;exx + ; + ;CALL PRINT_DWORD + CALL PRINT_5BYTES + ; + ; [ ] вывод количества папок + ; [x] вывод общего количества свободного места + ld hl,SIZE_BUFFER.high ; "000 000 000 000" + ld de,PRM1; + PRM2 ; размер файлов в каталоге + ld bc,SIZE_BUFFER.bytes + call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. + ; + ;!TEST + ;ld hl,(dir_number) + ;ld de,PRM3 + ;call hex2dec_ascii_16bit.n10000 + ; Десятичный вывод + ld hl,(dir_number) + ld ix,PRM4 ; кол-во каталогов в каталоге + call PDIGIT + ;xor a + ;ld (de),a + ; + ; + ;LD A,(read_disk_info.full) + ;OR A + ;ld hl,has_not_full_info + ;JR Z,.skip_full_space + ; + ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" + CALL MESSAGE ; вывести строку + ; + ld a,(read_disk_info.full) + and a + ld de,MAIN_MSG.CRLF + jp z,MESSAGE + ; + ld a,(free_space_high) + ld hl,(free_space_medium) ; ст. разряд + exx + ld hl,(free_space_low) ; мл. разряд + ;exx + call PRINT_5BYTES + ld hl,SIZE_BUFFER.high ; "000 000 000 000" + ld de,PRM1 ; and PRM2 ; куда + ld bc,SIZE_BUFFER.bytes + call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. + ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" + jp MESSAGE + ; +Print_Header: ; %1 + ld hl,PRM1 + ld a,'"' + ld (hl),a + inc hl + ld a,(screen_path) ; диск + ld (hl),a + inc hl + ld a,'"' + ld (hl),a + inc hl + ;ld (hl),":" + ld (hl),0 + ; %2 + ld hl,serial_string ; строка серийного номера диска + ld de,PRM2 ; куда + call ncopy_string ; скопир. строку (с нулем) + ; %3 + ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным + ld de,PRM3 ; 16 буфер + CALL copy_string ; скопир. строку (с нулем) + ; + ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." + JP MESSAGE ; вывести строку + ; ; Подготовить строку списка файлов/папок -A88E2: - dec hl - ld a,(hl) - and FAT_ATTR.DIRECTORY - call z,.set_small - inc hl - ; - ld bc,8 - ld de,PRM1 ; буфер - ldir - xor a - ld (de),a - ld de,PRM2 ; куда - ldi - ldi - ldi - ld (de),a - ld ix,work_buffer1 - call A89A4 ; вывести в буфер имя файла и его размер (у папки ) - call A89FA ; вывести в буфер дату файла/папки - call A8A19 ; вывести в буфер время файла/папки - ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" - jp MESSAGE ; вывод строки - ; +PRNNAME: dec hl + ld a,(hl) + and FAT_ATTR.DIRECTORY + call z,.set_small + inc hl + ; + ld bc,8 + ld de,PRM1 ; буфер + ldir + xor a + ld (de),a + ld de,PRM2 ; куда + ldi + ldi + ldi + ld (de),a + ld ix,work_buffer1 + call PRNSIZE ; вывести в буфер имя файла и его размер (у папки ) + call PRNDATE ; вывести в буфер дату файла/папки + call PRNTIME ; вывести в буфер время файла/папки + ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" + jp MESSAGE ; вывод строки + ; .set_small: - ld d,h - ld e,l - ld b,11 ;!HARDCODE длина имени DOS -.loop: inc hl - ld a,(hl) - cp 'A' - jr c,.next - cp 'Z'+1 - jr c,.letter - ; - cp 'А' ;#80 - jr c,.next - cp 'Я'+1 ;#9F + 1 - jr nc,.next -.letter: - or %0010'0000 - ld (hl),a -.next: djnz .loop - ex de,hl - ret + ld d,h + ld e,l + ld b,11 ;!HARDCODE длина имени DOS +.loop: inc hl + ld a,(hl) + cp 'A' + jr c,.next + cp 'Z'+1 + jr c,.letter + ; + cp 'А' ;#80 + jr c,.next + cp 'Я'+1 ;#9F + 1 + jr nc,.next + ; +.letter: or %0010'0000 + ld (hl),a +.next: djnz .loop + ex de,hl + ret ; Вывести в буфер имя файла и его размер (у папки ) -A89A4: ld a,(ix+32) - ld hl,T8B38 ; " " - and FAT_ATTR.DIRECTORY ; папка ? - jr nz,A89F4 ; да - ld l,(ix+28) ; мл. разряд - ld h,(ix+29) - exx - ld l,(ix+30) ; ст. разряд - ld h,(ix+31) - exx - push ix - call MAKE_LN ; десятичный 32-х разрядный вывод - ld hl,T8B37 - ld a,(hl) - cp " " - jr nz,A89CD - ld a,"0" - ld (hl),a -A89CD: ld de,T8B46 ; "0 000 000 000" - ld hl,L32BIT_ ; "0000000000" - ldi - ld a," " - ld (de),a - inc de - ldi - ldi - ldi - ld (de),a - inc de - ldi - ldi - ldi - ld (de),a - inc de - ldi - ldi - ldi - ld hl,T8B46 ; "0 000 000 000" - pop ix -A89F4: ld de,PRM3 ; 16 буфер - jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. +PRNSIZE: ld a,(ix+32) + ld hl,DIRIDD ; " " + and FAT_ATTR.DIRECTORY ; папка ? + jr nz,.PRZ ; да + ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE) ; мл. разряд + ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1) + exx + ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) ; ст. разряд + ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3) + exx + push ix + call MAKE_LN ; десятичный 32-х разрядный вывод + ld hl,L32BIT_.end + ld a,(hl) + cp " " + jr nz,.not_zero + ld a,"0" + ld (hl),a +.not_zero: ld de,SIZE_BUFFER.low ; "0 000 000 000" + ld hl,L32BIT_ ; "0000000000" + ldi + ld a," " + ld (de),a + inc de + ldi + ldi + ldi + ld (de),a + inc de + ldi + ldi + ldi + ld (de),a + inc de + ldi + ldi + ldi + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + pop ix +.PRZ: ld de,PRM3 ; 16 буфер + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер дату файла/папки -A89FA: ld b,(ix+25) - ld c,(ix+24) - ld hl,T8B46 ; "0 000 000 000" - call A8A53 ; вывод в буфер даты - ld (hl),0 - ld hl,T8B46 ; "0 000 000 000" - ld de,PRM4 ; 16 куда - ld a,(hl) - cp "0" - jr nz,$+4 - ld (hl)," " - jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. - - +PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE) + ld b,(ix+FAT_DIRECTORY_RECORD.DATE+1) + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + call MAKE_DATE ; вывод в буфер даты + ld (hl),0 + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + ld de,PRM4 ; 16 куда + ; ld a,(hl) + ; cp "0" + ; jr nz,$+4 + ; ld (hl)," " + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер время файла/папки -A8A19: ld b,(ix+22) - ld c,(ix+23) - ld hl,T8B46 ; "0 000 000 000" - call A8A38 ; скопир. в буфер время файла/папки - ld (hl),0 - ld hl,T8B46 ; "0 000 000 000" - ld de,PRM5 ; 80 буфер строки - ld a,(hl) - cp "0" - jr nz,$+4 - ld (hl)," " - jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. - +PRNTIME: ld b,(ix+22) + ld c,(ix+23) + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + call MAKE_TIME ; скопир. в буфер время файла/папки + ld (hl),0 + ld hl,SIZE_BUFFER.low ; "0 000 000 000" + ld de,PRM5 ; 80 буфер строки + ; ld a,(hl) + ; cp "0" + ; jr nz,$+4 + ; ld (hl)," " + jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; в буфер время файла/папки -A8A38: srl c - rr b - srl c - rr b - srl c - rr b - srl b - srl b - ld a,c - call A8A7E - ld (hl),":" ; раздел. времени - inc hl - ld a,b - jr A8A7E - +MAKE_TIME: srl c + rr b + srl c + rr b + srl c + rr b + srl b + srl b + ld a,c + call toNumber + ld (hl),":" ; раздел. времени + inc hl + ld a,b + jr toNumber ; в буфер дату файла/папки -A8A53: ld a,c - and 1Fh - push bc - call A8A7E - ld (hl),"." ; раздел. даты - inc hl - pop bc - ld a,c - srl b - rla - rla - rla - rla - and 0Fh - call A8A7E - ld (hl),"." ; раздел. даты - inc hl - ld a,b - add a,80 - cp 100 - jr c,A8A7E -A8A75: sub 100 - cp 100 - jr nc,A8A75 -A8A7E: ld c,2Fh - inc c - sub 10 - jr nc,$-3 - add a,10 - add a,"0" - ld (hl),c - inc hl - ld (hl),a - inc hl - ret +MAKE_DATE: ld a,c + and #1F + push bc + call toNumber + ld (hl),"." ; раздел. даты + inc hl + pop bc + ld a,c + srl b + rla + rla + rla + rla + and #0F + call toNumber + ld (hl),"." ; раздел. даты + inc hl + ld a,b + add a,80 + cp 100 + jr c,toNumber +.loop: sub 100 + cp 100 + jr nc,.loop + ; +toNumber: ld c,#2F +.loop: inc c + sub 10 + jr nc,.loop + add a,10 + add a,"0" + ld (hl),c + inc hl + ld (hl),a + inc hl + ret ;!TODO перетащить в procedures/math.asm ; Десятичный 32-х разрядный вывод ; HL':HL - число для перевода +; !FIXIT можно объеденить с PDIGIT MAKE_LN: ld ix,L32BIT_ ; "0000000000" exx ld de,#3B9A @@ -419,7 +409,7 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" ld de,#CA00 ; DE':DE = 1,000,000,000 call GET_DIG - exx +.skip_1: exx ld de,#05F5 exx ld de,#E100 @@ -456,7 +446,7 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" ; DE':DE = 1,000 call GET_DIG ; 1,000...9,999 exx - ld de#00 + ld de,#00 exx ld de,#64 ; DE':DE = 100 @@ -480,14 +470,13 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" inc hl jr .KILLZ ; -.KILLZ2: ld hl,T8B37 ; "0" +.KILLZ2: ld hl,L32BIT_.end ; "0" ld a,(hl) cp d ret nz ld (hl),e ret - GET_DIG: xor a .loop: inc a sbc hl,de @@ -507,20 +496,26 @@ GET_DIG: xor a ret ; -D88DC: WORD 0 -D88DE: WORD 0 -D88E0: WORD 0 +FILES: WORD 0 +S_LOW: WORD 0 +S_MED: WORD 0 +S_HIGH: BYTE 0 dir_number: WORD 0 free_space_low: WORD 0 free_space_medium: WORD 0 free_space_high: BYTE 0 ; +L40BIT_ db "00" L32BIT_: db "000000000" -T8B37: db "0" -T8B38: db " ",0 -T8B46: db "0 000 000 000",0 - db 0 +.end: db "0" +; +DIRIDD: db " ",0 +; +SIZE_BUFFER: +.high db "00" +.low: db "0 000 000 000",0,0 +.bytes equ SIZE_BUFFER - $ ; ; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo @@ -545,278 +540,344 @@ read_disk_info: OR #80 LD A,(.full) OR A JR Z,.no_full_space_option - ; - PUSH BC ; размер сектора в байтах EX AF,AF' - ; A - размер кластера в секторах ; - ; free_clu_L * clu_size_in_sect - LD C,A - EX AF,AF' - CALL Mult16X8 ; DE*C = A:HL - ; A:HL = DE*C - ; - ; free_clu_H * clu_size_in_sect - EX AF,AF' + ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE EXX - LD C,A - CALL Mult16X8 ; DE*C = A:HL - ; A:HL = DE*C - ; max #0FFF'FFFF sectors for LBA28 - EX AF,AF' - LD D,0 - LD E,A - ADD HL,DE + LD BC,0 + EXX + SRL B + RR C + RRCA + JR C,.loop2 + ; +.loop1: SLA L + RL H + EXX + RL L + RL H + RL B EXX ; - EX DE,HL - ; HL':DE - свободных секторов + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + ; + RRCA + JP NC,.loop1 ; - POP BC ; размер сектора в байтах - PUSH BC - CALL Mult_16x16 ; DE*BC = HL:DE. +.loop2: SLA L + RL H EXX - POP BC - EX DE,HL - CALL Mult_16x16 ; DE*BC = HL:DE. - LD XH,D - LD XL,E + RL L + RL H + RL B EXX - EX DE,HL - ADD IX,DE - EX DE,HL + ; + SLA E + RL D EXX - JR NC,.no_inc_HL - INC L - ; потому что не должно быть больше #001F'FFFF'FE00 - ; при секторе в 512 байтов -.no_inc_HL: ; - LD A,L + RL E + RL D + RL C + EXX + ; + SRL B + RR C + JP NC,.loop2 + ; <-- B':HL'HL, C':DE':DE + ;!TODO выводить полный размер диска + EXX + LD A,C LD (free_space_high),A - LD (free_space_medium),IX + LD (free_space_medium),DE EXX LD (free_space_low),DE ; .no_full_space_option: - ; parse - LD D,0 - LD HL,work_buffer - ; тут в HL длина поля "Файловая система" - LD E,(HL) - ADD HL,DE - INC HL - ; длина поля "Серийный номер диска" - LD A,(HL) - LD E,A - ADD HL,DE - INC HL - PUSH HL ; указатель на длину поля "Метка диска" - CP 4 ;!HARDCODE длина поля серийного номера - JR NZ,unknown_serial - DEC HL - ; старшее слово серийника - LD D,(HL) - DEC HL - LD E,(HL) - DEC HL - PUSH HL - EX DE,HL - ld de,serial_string ; xxxx-xxxx - call hex16 - POP HL - ; - ld a,"-" - ld (de),a - INC DE - ; младшее слово серийника - LD A,(HL) - DEC HL - LD L,(HL) - LD H,A - call hex16 - ; + ; parse + LD D,0 + LD HL,work_buffer + ; тут в HL длина поля "Файловая система" + LD E,(HL) + ADD HL,DE + INC HL + ; длина поля "Серийный номер диска" + LD A,(HL) + LD E,A + ADD HL,DE + INC HL + PUSH HL ; указатель на длину поля "Метка диска" + CP 4 ;!HARDCODE длина поля серийного номера + JR NZ,unknown_serial + DEC HL + ; старшее слово серийника + LD D,(HL) + DEC HL + LD E,(HL) + DEC HL + PUSH HL + EX DE,HL + ld de,serial_string ; xxxx-xxxx + call hex16 + POP HL + ; + ld a,"-" + ld (de),a + INC DE + ; младшее слово серийника + LD A,(HL) + DEC HL + LD L,(HL) + LD H,A + call hex16 + ; - ; Метка диска - ; ld a,(disk) ; номер диска - ; cp 2 ; меньше "C:" ? - ; jr nc,get_inf_data1 ; метка в BPB + ; Метка диска + ; ld a,(disk) ; номер диска + ; cp 2 ; меньше "C:" ? + ; jr nc,get_inf_data1 ; метка в BPB -.get_label: - ; ищем метку в корне ФС раздела - ; уст. корень диска - ld hl,root_path ; "x:\",0 - ld c,Dss.ChDir - RST ToDSS - ; поиск метки - ld hl,mask_fname ; "*.*" имя метки - ld de,work_buffer1 ; куда - ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома - ld bc,Dss.F_First.FATname ; f_first, формат 11 - RST ToDSS - push af - call restore_path ; восст. тек. путь - pop af - ;jr c,no_volume_label ; метки нет дирректории - ld hl,work_buffer1+33 ; начало метки в буфере f_first - jr nc,volume_label ; метка в корневом каталоге - ; берём метку из BPB - ; тут в HL длина поля "Метка диска" - POP hl - LD A,(HL) - INC HL - AND A - jr z,.no_volume_label ; да - PUSH HL - LD B,A - LD A,' ' - ; -.loop: CP (HL) - JR NZ,.good_label - INC HL - DJNZ .loop - POP HL ; снимаем лишнее -; нет метки -.no_volume_label: - ; %4 - ld hl,volume_string_no ; строка - ld de,PRM4 ; куда - call ncopy_string ; скопир. строку (с нулем) - XOR A - LD (PRM5),A - ret -.good_label: - POP HL - PUSH HL ; лишнее - ; есть метка -volume_label: - pop DE ; лишнее - ; %5 - ld de,PRM5 - ld bc,11 ;!HARDCODE длина метки - ldir - xor a - ld (de),a - ; %4 - ld hl,volume_string_yes ; строка - ld de,PRM4 ; куда - call ncopy_string ; скопир. строку (с нулем) - ret - ; +.get_label: ; ищем метку в корне ФС раздела + ; уст. корень диска + ld hl,root_path ; "x:\",0 + ld c,Dss.ChDir + RST ToDSS + ; поиск метки + ld hl,mask_fname ; "*.*" имя метки + ld de,work_buffer1 ; куда + ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома + ld bc,Dss.F_First.FATname ; f_first, формат 11 + RST ToDSS + push af + call restore_path ; восст. тек. путь + pop af + ;jr c,no_volume_label ; метки нет дирректории + ld hl,work_buffer1+33 ; начало метки в буфере f_first + jr nc,volume_label ; метка в корневом каталоге + ; берём метку из BPB + ; тут в HL длина поля "Метка диска" + POP hl + LD A,(HL) + INC HL + AND A + jr z,.no_volume_label ; да + PUSH HL + LD B,A + LD A,' ' + ; +.loop: CP (HL) + JR NZ,.good_label + INC HL + DJNZ .loop + POP HL ; снимаем лишнее + ; нет метки +.no_volume_label:; %4 + ld hl,volume_string_no ; строка + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем) + XOR A + LD (PRM5),A + ret +.good_label: POP HL + PUSH HL ; лишнее + ; есть метка +volume_label: pop DE ; лишнее + ; %5 + ld de,PRM5 + ld bc,11 ;!HARDCODE длина метки + ldir + xor a + ld (de),a + ; %4 + ld hl,volume_string_yes ; строка + ld de,PRM4 ; куда + call ncopy_string ; скопир. строку (с нулем) + ret + ; ; если не удалось прочитать серийный номер диска или формат неизвестен -unknown_serial: - ; серийный номер диска - неизвестен ;!HARDCODE ниже - LD HL,serial_string - LD A,'?' - LD B,serial_string.Size -.loop: LD (HL),A - INC HL - DJNZ .loop - LD HL,serial_string+4 - LD (HL),'-' - ;POP HL ; лишнее - JP read_disk_info.get_label - ; +unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже + LD HL,serial_string + LD A,'?' + LD B,serial_string.Size +.loop: LD (HL),A + INC HL + DJNZ .loop + LD HL,serial_string+4 + LD (HL),'-' + ;POP HL ; лишнее + JP read_disk_info.get_label + ; ; маска файлов -mask_fname: - db "*.*",0 +mask_fname: db "*.*",0 ; корень диска -root_path: - db 'X:\',0 +root_path: db 'X:\',0 ; Серийный номер диска -serial_string: - db "xxxx-xxxx" -.Size equ $-serial_string - db 0 ; закрывашка +serial_string: db "xxxx-xxxx" +.Size equ $-serial_string + db 0 ; закрывашка volume_string_no: - db "has no label",0 + db "has no label",0 volume_string_yes: - db "has label",0 + db "has label",0 ; has_not_full_info: -; db ' (?)',0 +; db ' (?)',0 ; -cmd_dir_options: - ; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) - DB 'f' : DW cmd_dir_freeSpace - DB 'p' : DW cmd_dir_pause -.Size EQU ($-cmd_dir_options)/3 +cmd_dir_options:; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) + DB 'f' : DW cmd_dir_freeSpace + DB 'p' : DW cmd_dir_pause +.Size EQU ($-cmd_dir_options)/3 .paramLength equ 3 ; ; cmd_dir_freeSpace: - ;PUSH DE - ;PUSH BC - ; затираем найденый ключ - ; ld A,'/' - ; ex de,hl - ; ld bc,4 - ; CPDR - ; inc hl - ; ld (hl),' ' - ; inc hl - ; ld (hl),' ' - - ; ставим опцию для API DSS DskInfo - ld a,1 - ld (read_disk_info.full),a - ; ; выводим строку о расчёте свободного места так, чтоб она затёрлась - ; LD DE,MAIN_MSG.CALCULATING - ; CALL MESSAGE - ; возвращаемся в цикл - ;POP BC - ;POP DE - jp cmd_dir.parse + ;PUSH DE + ;PUSH BC + ; затираем найденый ключ + ; ld A,'/' + ; ex de,hl + ; ld bc,4 + ; CPDR + ; inc hl + ; ld (hl),' ' + ; inc hl + ; ld (hl),' ' + ; + ; ставим опцию для API DSS DskInfo + ld a,1 + ld (read_disk_info.full),a + ; ; выводим строку о расчёте свободного места так, чтоб она затёрлась + ; LD DE,MAIN_MSG.CALCULATING + ; CALL MESSAGE + ; возвращаемся в цикл + ;POP BC + ;POP DE + jp cmd_dir.parse ; -cmd_dir_pause: - ld a,#ff - ld (cmd_dir.key_p),a - jp cmd_dir.parse +cmd_dir_pause: ld a,#ff + ld (cmd_dir.key_p),a + jp cmd_dir.parse /////////////////////////////////////////////////////////////////////////////////////// -Size2Char: - call MAKE_LN ; десятичный 32-х разрядный вывод - ld hl,T8B37 ; "0" - ld a,(hl) - cp " " - jr nz,.not_zero - ld a,"0" - ld (hl),a -.not_zero: - ld de,T8B46 ; "0 000 000 000" - ld hl,L32BIT_ ; "0000000000" - ld a,(hl) - ldi - cp " " - jr z,1F - ld a,"," ; разд. разрядов -1: ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,1F - ld a,"," ; разд. разрядов -1: ld (de),a - inc de - ldi - ldi - ld a,(hl) - ldi - cp " " - jr z,1F - ld a,"," ; разд. разрядов -1: ld (de),a - inc de - ldi - ldi - ldi - ret +GET_BIG_DIG: ld b,0 + and a +.loop: inc b + sbc hl,de + exx + sbc hl,de + exx + sbc a,c + jp nc,.loop + ; + exx + rr b + exx + adc hl,de + ; + exx + adc hl,de + exx + adc a,c + ; + ex af,af' + dec b + ld a,b + add a,"0" + ld (ix+0),a + ex af,af' + inc ix + ret + ; stop +PRINT_5BYTES: ld ix,L40BIT_ ; "00" + ld c,#17 + exx + ld de,#4876 + exx + ld de,#E800 + ; C:DE':DE = 100,000,000,000 + call GET_BIG_DIG + ; + ld c,#02 + exx + ld de,#540B + exx + ld de,#E400 + ; C:DE':DE = 10,000,000,000 + CALL GET_BIG_DIG + ; + ld c,#00 + exx + ld de,#3B9A + exx + ld de,#CA00 + ; C:DE':DE = 1,000,000,000 + CALL GET_BIG_DIG + ; + ; DE':DE = 100,000,000 + ; HL':HL ещё нужны + PUSH HL + LD HL,L40BIT_ + LD B,2 ;!HARDCODE 2 знака +.loop: LD A,(HL) + CP "0" + jr nz,.not_zero + LD (HL)," " +.not_zero: INC HL + DJNZ .loop + POP HL + CALL MAKE_LN.skip_1 + JR PRINT_DWORD.skip_LN + ; +PRINT_DWORD: call MAKE_LN ; десятичный 32-х разрядный вывод +.skip_LN: ld hl,L32BIT_.end ; "0" + ld a,(hl) + cp " " + jr nz,.not_zero + ld a,"0" + ld (hl),a +.not_zero: ld de,SIZE_BUFFER.high ; "0 000 000 000" + ld hl,L40BIT_ ; "0000000000" + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ld a,(hl) + ldi + cp " " + jr z,1F + ld a,"," ; разд. разрядов +1: ld (de),a + inc de + ldi + ldi + ldi + scf + ret /////////////////////////////////////////////////////////////////////////////////////// @@ -825,6 +886,7 @@ Size2Char: ;Процедура умножения (16*8bit) ;На вход: DE * C ;На выход:A:HL = результат + IFUSED Mult32 Mult16X8: SUB A LD L,A LD H,A @@ -842,7 +904,8 @@ Mult16X8: SUB A ADD HL,DE ADC A,C .next: DJNZ .loop - RET + RET + ENDIF ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;Процедура умножения (32bit) @@ -871,6 +934,7 @@ Mult32: PUSH IX ;----------------------------------------------------------------------; ;INPUT : DE * BC ;OUTPUT: HL:DE + IFUSED Mult32 Mult_16x16: LD IX,0 LD HL,0 ; @@ -898,4 +962,5 @@ Mult_16x16: LD IX,0 .exit: LD D,XH LD E,XL RET -/////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file + ENDIF +/////////////////////////////////////////////////////////////////////////////////////// diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 8ec2ebb..c67f942 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -29,35 +29,40 @@ MAIN_MSG: stN .CRLF_ : db CR,LF,0; | ;________________/ ; - stN .DIR_1_ : db "Volume in drive %1 %4 %5",CR,LF - db "Volume Serial Number is %2",CR,LF - db CR,LF,"Directory of %3",CR,LF,LF,0 - stN .VERS_ : db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 - stN .DATE_ : db "Current date: %1, %2",CR,LF,0 ; [x] вывод дня недели 26/01/2023 - stN .TIME_ : db "Current time: %1",CR,LF,0 - stN .PAUSE_ : db "Press any key to continue . . .",CR,0 - stN .DIR_ESC_ : db 'Command "DIR" aborted by user ',CR,LF,CR,LF,0 - stN .INV_ : db "Invalid parametr",CR,LF,0 - stN .ECHO_ : db "Echo is %1",CR,LF,0 - stN .ON_ : db "on",0 - stN .OFF_ : db "off",0 - stN .DIR_2_ : db " %1 File(s) %2 bytes",CR,LF - db " %3 Dir(s) ",0 - stN .DIR_4_ : db "%4 bytes free",CR,LF,0 - ; db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 -; : db " %3 Dir(s)",CR,LF,LF,0 - stN .DIR_3_ : db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME - stN .HELP_ : db "COMMANDS:",CR,LF,CR,LF - db "DIR REN | RENAME PATH HELP ",CR,LF - db "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - db "MD | MKDIR TIME ECHO EXIT ",CR,LF - db "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 - stN .CALC_ : db "Calculating free space...",CR,0 +; 1 2 3 4 5 6 7 +; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; + stN .DIR_1_ : db "Volume in drive %1 %4 %5\r\n" + db "Volume Serial Number is %2\r\n" + DZ "\r\nDirectory of %3\r\n\n" + stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13 + stN .DATE_ : DZ "Current date: %1, %2\r\n" ; [x] вывод дня недели 26/01/2023 + stN .TIME_ : DZ "Current time: %1\r\n" + stN .PAUSE_ : DZ "Press any key to continue . . .\r" + stN .DIR_ESC_ : DZ "Command 'DIR' aborted by user \r\n\n" + stN .INV_ : DZ "Invalid parametr\r\n" + stN .ECHO_ : DZ "Echo is %1\r\n" + stN .ON_ : DZ "on" + stN .OFF_ : DZ "off" +; stN .DIR_2_ : db " %3 File(s) %1 byte(s)\r\n" +; DZ " %4 Dir(s) " +; stN .DIR_4_ : DZ "%1 bytes free\r\n" + stN .DIR_2_ : db " %3 File(s)\r %1 byte(s)\r\n" + DZ " %4 Dir(s)" + stN .DIR_4_ : DZ "\r %1 bytes free\r\n" +; stN .DIR_3_ : DZ "%1 %2 %3 %4 - %5\r\n" ;FILENAME EXT SIZE DATE TIME + stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT + stN .HELP_ : db "COMMANDS:\r\n" + db "DIR REN | RENAME PATH HELP \r\n" + db "CD | CHDIR DEL | ERASE SET VER | VERSION \r\n" + db "MD | MKDIR TIME ECHO EXIT \r\n" + DZ "RD | RMDIR DATE CLS REBOOT \r\n\n" + stN .CALC_ : DZ "Calculating free space...\r" ; ;R11 - db 0 - DZ "Unknown command" + db 0 + DZ "Unknown command" ; ; .TABLE.Size EQU $-.TABLE ; !txtCounter=0 -; \ No newline at end of file +; + ; \ No newline at end of file diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 128f097..014d0ee 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -42,7 +42,7 @@ include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'SHELL/version.inc' - + include 'shared_includes/structures/FileSystem.inc' ; ; Program EQU section ;---------------------------------------------------------------------[] @@ -379,7 +379,7 @@ COMPARE: ; (hl) -> (de) ncopy_string: ld bc,15 ; макс. длина строки - ld a,(hl) +.start: ld a,(hl) ldi ret po or a @@ -457,7 +457,7 @@ STR2DEC: ;!FIXIT есть дубл hex2dec_ascii_16bit PDIGIT: ld de,10000 ld a,#C8 ; ret z - ld (.patch),a + ld (.RET_Z),a call .DIG ld de,1000 call .DIG @@ -467,31 +467,28 @@ PDIGIT: ld de,10000 call .DIG ld a,l add a,"0" - ;!TEST + ;!TEST пока не требуется передавать следующий IX дальше ;ld (ix+0),a ;inc ix ;ld (ix+0),0 LD (IX+0),A - LD (IX+1),0 + LD (IX+1),0 ; ret .DIG: xor a - inc a +.loop: inc a sbc hl,de - jr nc,$-3 + jr nc,.loop add hl,de dec a -.patch: ret z +.RET_Z: ret z add a,"0" ld (ix+0),a inc ix xor a ; nop - ld (.patch),a + ld (.RET_Z),a ret - - - Restore_Screen: PUSH AF LD C,Dss.GetVMod diff --git a/SHELL/build.txt b/SHELL/build.txt index 871cae9..136c8ca 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -323 \ No newline at end of file +342 \ No newline at end of file From 7c01581aaefc599332b635c01a97122239f8e551 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Apr 2024 08:10:35 +1000 Subject: [PATCH 123/219] FSInfo: free clusters count DONE --- DSS/API/MkDir.asm | 3 +++ DSS/API/diskINF.asm | 41 +++++++++++++++++++++-------------------- DSS/DSS-MAIN.ASM | 27 ++++++++++++++++++++++----- DSS/FS/FAT/FAT.asm | 4 ++++ DSS/FS/FAT/FAT_X.asm | 39 ++++++++++++++++++++++++++------------- DSS/Structures.inc | 6 ++---- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 14 ++++++++++++-- SHELL/build.txt | 2 +- 9 files changed, 92 insertions(+), 46 deletions(-) diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 3ea0859..8caaccb 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -52,6 +52,9 @@ MKDIR: PUSH HL ; старший номер сектора EXX ; + XOR A ; уменьшить + CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo + ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 770ac93..3e634bf 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -133,28 +133,23 @@ DISKINF: LD C,B .CheckFreeSpace:; если GetFreeSpace не вызывается XOR A OR B - LD A,#FF - LD B,A - LD C,A + LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) EXX - LD B,A - LD C,A + LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) EXX - CALL NZ,.GetFreeSpace + CALL NZ,GetFreeSpace ; ;.FRESP2: ; A = 0 if B != 0 before .GetFreeSpace ; LD H,B LD L,C - ; LD DE,2 - ; SBC HL,DE + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL EX DE,HL EXX LD H,B LD L,C - ; LD DE,2 - ; SBC HL,DE + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL EX DE,HL EXX LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) @@ -170,8 +165,21 @@ DISKINF: LD C,B AND A RET ; -.GetFreeSpace: XOR A + ; [ ] 22/11/23 подфункция с доп.инфой +.mCOPY_LOOP: LD B,0 + EX DE,HL + LD (HL),C + EX DE,HL + INC DE + LDIR + RET + ; + +; +GetFreeSpace: LD A,1 + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A LD HL,2 ; fat32 номер кластера от которого считать + XOR A ; fat32 EXX LD H,A @@ -219,13 +227,6 @@ DISKINF: LD C,B EXX JP .loop_free_space ; - ; [ ] 22/11/23 подфункция с доп.инфой -.mCOPY_LOOP: LD B,0 - EX DE,HL - LD (HL),C - EX DE,HL - INC DE - LDIR - RET - ; + FAT_STRING: DB 'FAT12' +; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 2d8b51f..f88fd4d 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -247,8 +247,13 @@ CLEAR_BUFFER_AND_INIT_PROC: LD BC,CLEAR_ZONE.size-1 LD (HL),A LDIR - ; A = 0 - DEC A + LD HL,':'*256 + 'X' + LD (CurrentPath),HL + LD A,'\' ; + LD (CurrentDirectory),A + LD (WorkDirectory),A + ; + LD A,#FF LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; ;R07 ;R11 @@ -385,18 +390,21 @@ MASKARE: BLOCK 8,0 ; ;!TODO к буферам! ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +; 259 CurrentPath: DB 'X' DB ':' CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце ; -; !TODO допилить WorkPath? -;WorkPath: DB 'X' -; DB ':' +; 257 WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + +; 516 +*/ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; @@ -418,8 +426,17 @@ BUFFER EQU BUFFERSplace.Buffer SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER MemoryTable EQU BUFFERSplace.MemoryTable ENDMODULE +; +CurrentPath EQU CORE_BUFFERS.BUFFERSplace + _sBuffers +CurrentDirectory EQU CurrentPath + 2 +.DEPTH: EQU DIRECTORY_PATH_LENGTH +; +WorkDirectory EQU CurrentDirectory + 1 + CurrentDirectory.DEPTH +.DEPTH: EQU DIRECTORY_PATH_LENGTH +; CLEAR_ZONE.size EQU _sBuffers + ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index ba6fd0a..640ec18 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -984,6 +984,10 @@ RD_BPB: ; LD C,SLOT3 LD (G_CLUST.low),HL DEC L LD (G_CLUST.high),HL + ; + DEC HL + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL XOR A RET ; diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 200492e..e881f9d 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -70,15 +70,14 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE ; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный ; [ ] free clusters for FSInfo SET_NEW_FREE_CLUSTER: - XOR A - ;LD B,D - ;LD C,E + LD A,1 ; увеличить + CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo + ; CF=0 + ; EX DE,HL LD HL,(G_CLUST.low) SBC HL,DE EX DE,HL - ;LD D,B - ;LD E,C ; EXX LD B,D @@ -147,13 +146,25 @@ G_CLUST: ; ; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров SET_NEW_FREE_CLUSTERS: + EX AF,AF PUSH HL + PUSH DE EXX PUSH HL + PUSH DE LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD A,H + AND L EXX LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + AND H + AND L + INC A + EXX + JR Z,.no_change + EXX ; + EX AF,AF OR A JR Z,.dec_clusters ; inc clusters @@ -165,14 +176,17 @@ SET_NEW_FREE_CLUSTERS: INC HL EXX ; -.set_new: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL +.set_new: LD A,1 + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + ; + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL EXX LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL +.no_change: POP DE POP HL EXX + POP DE POP HL - LD A,1 - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A RET ; .dec_clusters: LD A,H @@ -191,10 +205,7 @@ SET_NEW_FREE_CLUSTERS: ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -INC_FAT: ; [ ] free clusters for FSInfo - ; - ; - PUSH HL ; текущий кластер +INC_FAT: PUSH HL ; текущий кластер EXX PUSH HL ; текущий кластер EXX @@ -234,7 +245,9 @@ INC_FAT: ; [ ] free clusters for FSInfo POP DE EX DE,HL ; - AND A + ; [ ] free clusters for FSInfo + XOR A ; уменьшить + CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo RET ;RX01 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 1c8cc57..cb296d1 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -104,10 +104,8 @@ .BPB_SERIAL_NUMBER DWORD #00000000 .BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS .UPD_FSINFO BYTE 0 -; IF USE_FSINFO_FAT32 -;.FREE_CLUSTERS_COUNT_L WORD #FFFF -;.FREE_CLUSTERS_COUNT_H WORD #FFFF -; ENDIF +.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 не используются некоторые значения, но задумка неплохая))) diff --git a/DSS/build.txt b/DSS/build.txt index c9ebe15..a637eba 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -978 \ No newline at end of file +980 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 093e313..b0e8251 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -537,9 +537,19 @@ read_disk_info: OR #80 ; max sector (LBA28) #0FFF'FFFF ; EX AF,AF' - LD A,(.full) - OR A + LD A,D + AND E + EXX + AND D + AND E + EXX + INC A JR Z,.no_full_space_option + LD (.full),A + ; ; + ; LD A,(.full) + ; OR A + ; JR Z,.no_full_space_option EX AF,AF' ; ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE diff --git a/SHELL/build.txt b/SHELL/build.txt index 136c8ca..fc72547 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -342 \ No newline at end of file +344 \ No newline at end of file From 93e2fd7269de2cc2821e4ac0a1ed3b4d0cffd29e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Apr 2024 09:49:37 +1000 Subject: [PATCH 124/219] FSInfo: optimization --- DSS/FS/FAT/FAT.asm | 28 ++++++++++++++++++++++++---- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 640ec18..b156df1 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -9,7 +9,26 @@ ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;--------------------------------------------------------------- ;----------------------------------------------------------------------; - +MAKE_FSinfo: ; чистим сектор + LD HL,CORE_BUFFERS.SECTOR_BUFFER + LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 + LD (HL),0 + LD BC,512 - 1 ;!HARDCODE размер сектора + LDIR + ; LEAD_SIGNATURE + LD HL,#5252 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE),HL + LD HL,#4161 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE + 2),HL + ; DATA_SIGNATURE + LD HL,#7272 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE),HL + LD HL,#6141 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2),HL + ; SECTOR_SIGNATURE + LD HL,#AA55 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL + RET ; сбрасывает значение свободных кластеров на "неопределено" ; меняет значение первого свободного кластера SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) @@ -21,9 +40,10 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) RET Z ; ;!TODO формировать самому в буфер - CALL READ_FSinfo + ;CALL READ_FSinfo + CALL MAKE_FSinfo ; - ;!TODO FREE_CLUSTERS_COUNT + ; FREE_CLUSTERS_COUNT LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) @@ -1040,7 +1060,7 @@ RD_BPB: ; LD C,SLOT3 LD DE,#6141 SBC HL,DE JR NZ,.error - ;!TODO FREE_CLUSTERS_COUNT + ; FREE_CLUSTERS_COUNT LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) ; CF = 0 diff --git a/DSS/build.txt b/DSS/build.txt index a637eba..37944e4 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -980 \ No newline at end of file +981 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index b0e8251..1f0b0c4 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -61,7 +61,7 @@ cmd_dir: push de ; LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE PUSH AF - ; цикл вывода списка файлов/папок + ; цикл вывода списка файлов/папок .loop: POP AF .key_p+1: and #ff dec a From e2606832b9b3c97c64fe1381cedd52aa993681db Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Apr 2024 10:26:12 +1000 Subject: [PATCH 125/219] SHELL: -bug in DIR --- SHELL/Commands/DIR.ASM | 5 +---- SHELL/build.txt | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 1f0b0c4..4edba5e 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -788,10 +788,7 @@ GET_BIG_DIG: ld b,0 sbc a,c jp nc,.loop ; - exx - rr b - exx - adc hl,de + add hl,de ; exx adc hl,de diff --git a/SHELL/build.txt b/SHELL/build.txt index fc72547..387c46f 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -344 \ No newline at end of file +346 \ No newline at end of file From dbc5088978380ba5814ebb1f24d9b6566c874408 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Apr 2024 14:43:45 +1000 Subject: [PATCH 126/219] shell: partition capacity in DIR --- SHELL/Commands/DIR.ASM | 124 +++++++++++++++++++++++------------- SHELL/Messages/main_txt.asm | 10 +-- SHELL/build.txt | 2 +- 3 files changed, 83 insertions(+), 53 deletions(-) diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 4edba5e..96333c2 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -172,33 +172,39 @@ cmd_dir: push de ;xor a ;ld (de),a ; - ; - ;LD A,(read_disk_info.full) - ;OR A - ;ld hl,has_not_full_info - ;JR Z,.skip_full_space - ; + ; full capacity + ld a,(full_space_high) + ld hl,(full_space_medium) ; ст. разряд + exx + ld hl,(full_space_low) ; мл. разряд + CALL PRN_DISK_SIZE + ; ; ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" CALL MESSAGE ; вывести строку ; ld a,(read_disk_info.full) and a - ld de,MAIN_MSG.CRLF - jp z,MESSAGE + ;ld de,MAIN_MSG.CRLF + ;jp z,MESSAGE + RET Z ; + ; free space ld a,(free_space_high) ld hl,(free_space_medium) ; ст. разряд exx ld hl,(free_space_low) ; мл. разряд - ;exx - call PRINT_5BYTES - ld hl,SIZE_BUFFER.high ; "000 000 000 000" - ld de,PRM1 ; and PRM2 ; куда - ld bc,SIZE_BUFFER.bytes - call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. + ; + CALL PRN_DISK_SIZE + ; ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" jp MESSAGE ; +PRN_DISK_SIZE: call PRINT_5BYTES + ld hl,SIZE_BUFFER.high ; "000 000 000 000" + ld de,PRM5 ; and PRM6 ; куда + ld bc,SIZE_BUFFER.bytes + jp ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. + ; Print_Header: ; %1 ld hl,PRM1 ld a,'"' @@ -283,7 +289,7 @@ PRNSIZE: ld a,(ix+32) ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3) exx push ix - call MAKE_LN ; десятичный 32-х разрядный вывод + call MAKE_LN_32 ; десятичный 32-х разрядный вывод ld hl,L32BIT_.end ld a,(hl) cp " " @@ -402,6 +408,28 @@ toNumber: ld c,#2F ; Десятичный 32-х разрядный вывод ; HL':HL - число для перевода ; !FIXIT можно объеденить с PDIGIT +MAKE_LN_32: CALL MAKE_LN + ld hl,L32BIT_ ; "0000000000" + JR MAKE_LN_Clean + ; +MAKE_LN_40: CALL MAKE_LN.skip_1 + ld hl,L40BIT_ ; "0000000000" + ; +MAKE_LN_Clean: ld de,#2030 ; " ","0" +.KILLZ: ld a,(hl) + cp e + jr nz,.KILLZ2 + ld (hl),d + inc hl + jr .KILLZ + ; +.KILLZ2: ld hl,L32BIT_.end ; "0" + ld a,(hl) + cp d + ret nz + ld (hl),e + ret + MAKE_LN: ld ix,L32BIT_ ; "0000000000" exx ld de,#3B9A @@ -461,22 +489,8 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" add a,"0" ld (ix+0),a inc ix - ld hl,L32BIT_ ; "0000000000" - ld de,#2030 ; " ","0" -.KILLZ: ld a,(hl) - cp e - jr nz,.KILLZ2 - ld (hl),d - inc hl - jr .KILLZ - ; -.KILLZ2: ld hl,L32BIT_.end ; "0" - ld a,(hl) - cp d - ret nz - ld (hl),e ret - + ; GET_DIG: xor a .loop: inc a sbc hl,de @@ -505,6 +519,10 @@ free_space_low: WORD 0 free_space_medium: WORD 0 free_space_high: BYTE 0 ; +full_space_low: WORD 0 +full_space_medium: WORD 0 +full_space_high: BYTE 0 +; L40BIT_ db "00" L32BIT_: db "000000000" @@ -544,7 +562,7 @@ read_disk_info: OR #80 AND E EXX INC A - JR Z,.no_full_space_option + ;JR Z,.no_full_space_option LD (.full),A ; ; ; LD A,(.full) @@ -605,8 +623,13 @@ read_disk_info: OR #80 LD A,C LD (free_space_high),A LD (free_space_medium),DE + ; + LD A,B + LD (full_space_high),A + LD (full_space_medium),HL EXX LD (free_space_low),DE + LD (full_space_low),HL ; .no_full_space_option: ; parse @@ -831,27 +854,38 @@ PRINT_5BYTES: ld ix,L40BIT_ ; "00" ; ; DE':DE = 100,000,000 ; HL':HL ещё нужны - PUSH HL - LD HL,L40BIT_ - LD B,2 ;!HARDCODE 2 знака -.loop: LD A,(HL) - CP "0" - jr nz,.not_zero - LD (HL)," " -.not_zero: INC HL - DJNZ .loop - POP HL - CALL MAKE_LN.skip_1 - JR PRINT_DWORD.skip_LN + ; PUSH HL + ; LD HL,L40BIT_ +; LD B,3 ;!HARDCODE 2 знака +; .loop: LD A,(HL) +; CP "1" +; jr nc,.exit_clean +; LD (HL)," " +; INC HL +; DJNZ .loop +;.exit_clean: POP HL + CALL MAKE_LN_40 + ;JR PRINT_DWORD.skip_LN ; -PRINT_DWORD: call MAKE_LN ; десятичный 32-х разрядный вывод +;PRINT_DWORD: call MAKE_LN ; десятичный 32-х разрядный вывод .skip_LN: ld hl,L32BIT_.end ; "0" ld a,(hl) cp " " jr nz,.not_zero ld a,"0" ld (hl),a -.not_zero: ld de,SIZE_BUFFER.high ; "0 000 000 000" + +.not_zero: +; ld hl,SIZE_BUFFER.high ; "0 000 000 000" +; ld b,SIZE_BUFFER.bytes - 1 +; .clean_loop: ld a,(hl) +; cp "1" +; jr nc,.exit_clean +; ld (hl)," " +; inc hl +; djnz .clean_loop + ; +.exit_clean: ld de,SIZE_BUFFER.high ; "0 000 000 000" ld hl,L40BIT_ ; "0000000000" ldi ldi diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index c67f942..53d9244 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -43,13 +43,9 @@ MAIN_MSG: stN .ECHO_ : DZ "Echo is %1\r\n" stN .ON_ : DZ "on" stN .OFF_ : DZ "off" -; stN .DIR_2_ : db " %3 File(s) %1 byte(s)\r\n" -; DZ " %4 Dir(s) " -; stN .DIR_4_ : DZ "%1 bytes free\r\n" stN .DIR_2_ : db " %3 File(s)\r %1 byte(s)\r\n" - DZ " %4 Dir(s)" - stN .DIR_4_ : DZ "\r %1 bytes free\r\n" -; stN .DIR_3_ : DZ "%1 %2 %3 %4 - %5\r\n" ;FILENAME EXT SIZE DATE TIME + DZ " %4 Dir(s)\r %5 byte(s) capacity\r\n" + stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT stN .HELP_ : db "COMMANDS:\r\n" db "DIR REN | RENAME PATH HELP \r\n" @@ -57,7 +53,7 @@ MAIN_MSG: db "MD | MKDIR TIME ECHO EXIT \r\n" DZ "RD | RMDIR DATE CLS REBOOT \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" -; ;R11 +; ;R11 db 0 DZ "Unknown command" ; ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 387c46f..bbce651 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -346 \ No newline at end of file +356 \ No newline at end of file From 4083da9fa5e13e8267ea1ece06d4fceacbfb2e17 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 3 May 2024 05:01:10 +1000 Subject: [PATCH 127/219] Core: -bug in ATTRIB with OPEN_FN.FM --- DSS/API/Attribute.asm | 92 ++++++++++++++++++++++-------------------- DSS/API/Open.asm | 8 ++-- DSS/FS/FAT/FAT.asm | 29 ++++++------- DSS/FS/FAT/FAT_X.asm | 3 -- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 57 ++------------------------ SHELL/EXEC.ASM | 2 +- SHELL/build.txt | 2 +- 8 files changed, 72 insertions(+), 123 deletions(-) diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index a26b780..a973978 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -35,49 +35,55 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 ;LD A,B ; RET + ; +.B_1: DJNZ .B_2 + ; +.WRITE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 фикс для volume ID +.WRITE: PUSH AF + XOR A + ;!TEST ;[x] 16/11/23 optimize get attribute + LD (OPEN_FN.TMP),A + ; + CALL .OPENATR ;R002 + ;!TEST ;[x] 16/11/23 optimize get attribute + CALL NC,OPEN_FN.FM + ; + POP BC + RET C + SET 7,(IY+_sFM.ACCESS_MODE) + ;RES 3,B ;CLEAR LABEL ATTR ;R003 + LD (IY+_sFM.FS_REC.ATTRIBUT),B + PUSH BC + CALL CLOSE_FN +.error: POP BC + RET C + LD A,B + RET + ;R002 +; выход: если CF = 0, то DE = record index +;!TEST 9/11/23 record index +.OPENATR: ;!TEST ;[x] 16/11/23 optimize get attribute + ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + CALL MASK + RET C + LD A,FAT_ATTR.NoVolID + ;!TEST ;[x] 16/11/23 optimize get attribute + JP SEARCH.Custom + ;CALL SEARCH.Custom + ;RET C ; запись не найдена + ;JP OPEN.FM ; на поиск своб. дескриптора + ; + ; + ; [ ] ; !TODO для команды LABEL в Shell + ; 1. проверить что в HL указана только метка в кавычках + ; 2. если метка без недопустимых символов, то делаем её не + ; только в BPB, но и на корневом разделе, иначе удаляем на корневом + ; 3. открываем требуемый диск через .force, чтоб сбросить кэши +.B_2: DJNZ .error_fn ; .error_fn: LD A,DSS_Error.sys.INVALID_FUNCTION SCF - RET - ; -.B_1: DJNZ .error_fn -.WRITE_FN: - AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID -.WRITE: PUSH AF - XOR A - ;!TEST ;[x] 16/11/23 optimize get attribute - LD (OPEN_FN.TMP),A - ; - CALL .OPENATR ;R002 - ;!TEST ;[x] 16/11/23 optimize get attribute - CALL NC,OPEN_FN.FM - ; - POP BC - RET C - SET 7,(IY+_sFM.ACCESS_MODE) - RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit - LD (IY+_sFM.FS_REC.ATTRIBUT),B - PUSH BC - CALL CLOSE_FN -.error: POP BC - RET C - LD A,B - RET -;R002 -.OPENATR: - ;!TEST ;[x] 16/11/23 optimize get attribute - ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) - ; - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - CALL MASK - RET C - LD A,FAT_ATTR.NoVolID - ;!TEST ;[x] 16/11/23 optimize get attribute - JP SEARCH.Custom - ;CALL SEARCH.Custom - ;RET C ; запись не найдена - ;JP OPEN.FM ; на поиск своб. дескриптора - ; - ; -;R002 \ No newline at end of file + RET \ No newline at end of file diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 676313a..331fb20 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -28,10 +28,10 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 RET C .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C - ;!TEST 9/11/23 record index - PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) -;R002 ; -.FM: CALL GET_FM ; enter point from ATTRIB +;R002 ;!TEST 9/11/23 record index +.FM: PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) + ; + CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index b156df1..98ae456 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -9,7 +9,17 @@ ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;--------------------------------------------------------------- ;----------------------------------------------------------------------; -MAKE_FSinfo: ; чистим сектор + +SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + RET NZ + ; + LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) + OR A + RET Z + ; + ; Делаем FSInfo сектор + ; чистим сектор LD HL,CORE_BUFFERS.SECTOR_BUFFER LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 LD (HL),0 @@ -28,21 +38,6 @@ MAKE_FSinfo: ; ; SECTOR_SIGNATURE LD HL,#AA55 LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL - RET -; сбрасывает значение свободных кластеров на "неопределено" -; меняет значение первого свободного кластера -SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - RET NZ - ; - LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) - OR A - RET Z - ; - ;!TODO формировать самому в буфер - ;CALL READ_FSinfo - CALL MAKE_FSinfo - ; ; FREE_CLUSTERS_COUNT LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL @@ -53,7 +48,7 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL LD HL,(G_CLUST.high) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL - ; + ; Пишем его на винт XOR A LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A JR WRITE_FSinfo diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index e881f9d..0582a6b 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -139,9 +139,6 @@ G_CLUST: ; EXX INC A LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A - ; [ ] free clusters for FSInfo - ; XOR A ; уменьшить - ; CALL SET_NEW_FREE_CLUSTERS RET ; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров diff --git a/DSS/build.txt b/DSS/build.txt index 37944e4..fbee9e3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -981 \ No newline at end of file +982 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 96333c2..ac3c70e 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -411,7 +411,7 @@ toNumber: ld c,#2F MAKE_LN_32: CALL MAKE_LN ld hl,L32BIT_ ; "0000000000" JR MAKE_LN_Clean - ; +; десятичный 40-а разрядный вывод MAKE_LN_40: CALL MAKE_LN.skip_1 ld hl,L40BIT_ ; "0000000000" ; @@ -429,7 +429,7 @@ MAKE_LN_Clean: ld de,#2030 ; " ","0" ret nz ld (hl),e ret - +; десятичный 32-х разрядный вывод MAKE_LN: ld ix,L32BIT_ ; "0000000000" exx ld de,#3B9A @@ -668,13 +668,6 @@ read_disk_info: OR #80 LD L,(HL) LD H,A call hex16 - ; - - ; Метка диска - ; ld a,(disk) ; номер диска - ; cp 2 ; меньше "C:" ? - ; jr nc,get_inf_data1 ; метка в BPB - .get_label: ; ищем метку в корне ФС раздела ; уст. корень диска ld hl,root_path ; "x:\",0 @@ -774,27 +767,9 @@ cmd_dir_options:; [ ] ; cmd_dir_freeSpace: - ;PUSH DE - ;PUSH BC - ; затираем найденый ключ - ; ld A,'/' - ; ex de,hl - ; ld bc,4 - ; CPDR - ; inc hl - ; ld (hl),' ' - ; inc hl - ; ld (hl),' ' - ; ; ставим опцию для API DSS DskInfo ld a,1 ld (read_disk_info.full),a - ; ; выводим строку о расчёте свободного места так, чтоб она затёрлась - ; LD DE,MAIN_MSG.CALCULATING - ; CALL MESSAGE - ; возвращаемся в цикл - ;POP BC - ;POP DE jp cmd_dir.parse ; cmd_dir_pause: ld a,#ff @@ -853,38 +828,14 @@ PRINT_5BYTES: ld ix,L40BIT_ ; "00" CALL GET_BIG_DIG ; ; DE':DE = 100,000,000 - ; HL':HL ещё нужны - ; PUSH HL - ; LD HL,L40BIT_ -; LD B,3 ;!HARDCODE 2 знака -; .loop: LD A,(HL) -; CP "1" -; jr nc,.exit_clean -; LD (HL)," " -; INC HL -; DJNZ .loop -;.exit_clean: POP HL CALL MAKE_LN_40 - ;JR PRINT_DWORD.skip_LN - ; -;PRINT_DWORD: call MAKE_LN ; десятичный 32-х разрядный вывод -.skip_LN: ld hl,L32BIT_.end ; "0" + ld hl,L32BIT_.end ; "0" ld a,(hl) cp " " jr nz,.not_zero ld a,"0" ld (hl),a - -.not_zero: -; ld hl,SIZE_BUFFER.high ; "0 000 000 000" -; ld b,SIZE_BUFFER.bytes - 1 -; .clean_loop: ld a,(hl) -; cp "1" -; jr nc,.exit_clean -; ld (hl)," " -; inc hl -; djnz .clean_loop - ; +.not_zero: ; .exit_clean: ld de,SIZE_BUFFER.high ; "0 000 000 000" ld hl,L40BIT_ ; "0000000000" ldi diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index a67f946..48aa538 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -97,7 +97,7 @@ RUN_EXT: ex de,hl ; ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS ld hl,(SAVEHL) ; имя файла - jr c,RUN_EXE ; выполнить exe-файл + jr c,RUN_EXE ; выполнить exe-файл bit 1,a ; есть расш. ? jr z,.NON_EXT ; нет ; есть расш. файла diff --git a/SHELL/build.txt b/SHELL/build.txt index bbce651..2a9c18a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -356 \ No newline at end of file +357 \ No newline at end of file From f1350835197d459138f232df471e5e53c3f84a5d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 5 May 2024 04:00:30 +1000 Subject: [PATCH 128/219] =?UTF-8?q?=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=20=D0=BC=D1=8B=D1=88=D0=BA=D0=B8=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=81=D1=91=D0=BD=20=D0=B2=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=83=20=D0=B4=D1=80=D0=B0=D0=B9?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BE=D0=B2.=20=D0=B4=D0=BB=D1=8F=20FAT32=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20BPB=5FExtFlags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/ChDir.asm | 2 +- DSS/API/ChnDisk.asm | 2 +- DSS/API/CurrDir.asm | 4 +- DSS/API/Execute.ASM | 6 +- DSS/API/MkDir.asm | 2 +- DSS/API/RmDir.asm | 2 +- DSS/API/ScanDRV.asm | 6 +- DSS/API/curDisk.asm | 2 +- DSS/API/diskINF.asm | 2 +- DSS/DOS_Proc.asm | 22 +-- DSS/DRV-MAIN.ASM | 159 ++++++++---------- DSS/DSS-MAIN.ASM | 66 +++++--- DSS/FS/FAT/FAT.asm | 127 +++++++------- DSS/FS/FAT/FAT_X.asm | 80 +++++---- DSS/KEYINTER.ASM | 4 +- DSS/Structures.inc | 18 +- DSS/build.txt | 2 +- DSS/defines.inc | 3 +- DSS/{INTMOUSE.ASM => drivers/Input/MOUSE.ASM} | 15 +- .../media}/ReScanDRV.ASM | 0 .../media}/fdd-drv.asm | 0 .../media}/ide-drv.asm | 0 .../media}/ram_disk-drv.asm | 0 .../media}/shared-drv.asm | 0 24 files changed, 268 insertions(+), 256 deletions(-) rename DSS/{INTMOUSE.ASM => drivers/Input/MOUSE.ASM} (93%) rename DSS/{Media_drivers => drivers/media}/ReScanDRV.ASM (100%) rename DSS/{Media_drivers => drivers/media}/fdd-drv.asm (100%) rename DSS/{Media_drivers => drivers/media}/ide-drv.asm (100%) rename DSS/{Media_drivers => drivers/media}/ram_disk-drv.asm (100%) rename DSS/{Media_drivers => drivers/media}/shared-drv.asm (100%) diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index 9b20e37..daaec16 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -20,7 +20,7 @@ CHDIR_FN: JP NC,DIR_PATH_CHANGE.FullCurrent ; если неудачно, то возвращаемся туда откуда пришли PUSH AF - LD HL,CurrentDirectory + LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR POP AF RET diff --git a/DSS/API/ChnDisk.asm b/DSS/API/ChnDisk.asm index 272db10..9a8cc87 100644 --- a/DSS/API/ChnDisk.asm +++ b/DSS/API/ChnDisk.asm @@ -14,7 +14,7 @@ CHNDISK:;[x] ; ;R010 RET C - LD HL,WorkDirectory + LD HL,CORE_BUFFERS.WorkDirectory LD (HL),0 PUSH AF CALL OPENDIR diff --git a/DSS/API/CurrDir.asm b/DSS/API/CurrDir.asm index 93e2d5a..7ae85dc 100644 --- a/DSS/API/CurrDir.asm +++ b/DSS/API/CurrDir.asm @@ -4,10 +4,10 @@ ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -CURRDIR: LD DE,WorkDirectory +CURRDIR: LD DE,CORE_BUFFERS.WorkDirectory JR CURRDIR_FN.skip CURRDIR_FN: - LD DE,CurrentDirectory + LD DE,CORE_BUFFERS.CurrentDirectory .skip: EX DE,HL LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 могло выйти за пределы буфера XOR A diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 38712ce..171da66 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -416,7 +416,7 @@ _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) PUSH HL ;!TEST Current Dir ;[x] 15/10/23 PUSH IX - LD HL,CurrentPath + LD HL,CORE_BUFFERS.CurrentPath LD A,(CORE_BUFFERS.EXEBUFF.VERSION) OR A JR NZ,.set_path @@ -522,7 +522,7 @@ ErrorLevel: DB #00 ; EXE_FM: DB #00 ; дескр. файла EXE_MEM: DB #00 ; идентификатор блока памяти CMDLINE: DW #0000 -EXSTACK: DW CORE_BUFFERS.XSTACK ; адрес стека +EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ; адрес стека ;///////////////////////////////////////////////////////////////////// @@ -703,7 +703,7 @@ FINDPATH: .GOTO_CURDIR: PUSH AF PUSH HL - LD HL,CurrentDirectory + LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR POP HL POP AF diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 8caaccb..b0a290a 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -20,7 +20,7 @@ MKDIR: RET C CALL .START PUSH AF - LD HL,CurrentDirectory + LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR POP AF RET diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 28fb499..84d5cbf 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -15,7 +15,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 RET C CALL .START PUSH AF - LD HL,CurrentDirectory + LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR CALL DIR_PATH_CHANGE.Current POP AF diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index e9c364e..88663d4 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -35,13 +35,13 @@ SCANDRV: ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 4. на всякий случай перечитываем дирректорию ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,(CurrentPath) + LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' CALL OPENDSK - LD HL,CurrentDirectory + LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR JR NC,.exit - LD HL,CurrentDirectory + LD HL,CORE_BUFFERS.CurrentDirectory LD (HL),0 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 5. выход diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index bd51cdb..3eb0638 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -8,7 +8,7 @@ CURDISK_FN: LD A,(LDRIVE) LD C,A - LD A,(CurrentPath) + LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' RET NC LD A,DSS_Error.sys.INVALID_DRIVE diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 3e634bf..033b221 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -119,7 +119,7 @@ DISKINF: LD C,B CP #FF ; !FIXIT WorkDirectory ;!TEST Current Dir ;JR Z,CURRDS ;R06 -.CurrentDisk: LD A,(CurrentPath) +.CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' LD HL,CORE_BUFFERS.FatBuffer.DRIVE CP (HL) diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 58d3f01..7da3511 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -359,16 +359,16 @@ MASK: LD HL,TMPNAME DIR_PATH_CHANGE: .FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' - LD (CurrentPath),A + LD (CORE_BUFFERS.CurrentPath),A ; -.Current: LD HL,CurrentDirectory +.Current: LD HL,CORE_BUFFERS.CurrentDirectory JP CURRDIR ; -.FullWork: LD A,(CurrentPath) +.FullWork: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; -.Work: LD HL,WorkDirectory +.Work: LD HL,CORE_BUFFERS.WorkDirectory JP CURRDIR_FN ; DIR_PATH_CHECK: LD A,(HL) @@ -377,7 +377,7 @@ DIR_PATH_CHECK: LD A,(HL) ; CALL .checkDrive RET Z - LD A,(CurrentPath) + LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' JP OPENDSK ; @@ -387,18 +387,18 @@ DIR_PATH_CHECK: LD A,(HL) RET Z ; .forceCheck: ;LD HL,CurrentDirectory+1 - LD BC,CurrentDirectory.DEPTH-1 + LD BC,CORE_BUFFERS.CurrentDirectory.DEPTH-1 CALL .checkDrive JR Z,.checkDir ; - LD HL,CurrentPath + LD HL,CORE_BUFFERS.CurrentPath LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) JR NZ,.gotoPath ; -.checkDir: LD HL,CurrentDirectory+1 - LD DE,WorkDirectory+1 +.checkDir: LD HL,CORE_BUFFERS.CurrentDirectory+1 + LD DE,CORE_BUFFERS.WorkDirectory+1 ; счётчик LD A,B LD B,C @@ -424,14 +424,14 @@ DIR_PATH_CHECK: LD A,(HL) CALL FINDDIR.CHECK_SLASH LD A,DSS_Error.sys.PATH_NOT_FOUND RET C - LD HL,CurrentPath + LD HL,CORE_BUFFERS.CurrentPath JP GETWORD ; .end: CP (HL) RET Z JR .gotoPath ; -.checkDrive: LD HL,CurrentPath +.checkDrive: LD HL,CORE_BUFFERS.CurrentPath LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 5736edb..9217369 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -26,11 +26,11 @@ ;===============; ;!TODO -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[NOT USED]> ; -A0000: JP RST_00 ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// +; <[NOT USED]> +A0000: JP RST_00 +//////////////////////////////////////////////////////////////////////// + ; RST_00: @@ -39,49 +39,47 @@ RST_00: RET ; -; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[BIOS API]> ; - BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode -A0008: PUSH AF ; - LD A,SYS_PORT.PAGE8; - OUT (SYS_PORT.ON),A ; - POP AF ; - RET ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// +; <[BIOS API]> + BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode +A0008: PUSH AF + LD A,SYS_PORT.PAGE8 + OUT (SYS_PORT.ON),A + POP AF + RET +//////////////////////////////////////////////////////////////////////// + ;!FIXIT -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[DSS API]> ; - BLOCK #10-$,#C7 ; #C7 - "RST 0" opcode -A0010: ;JP DRV_PAGE.RST_10 ; - DI : HALT ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// +; <[DSS API]> + BLOCK #10-$,#C7 ; #C7 - "RST 0" opcode +A0010: ;JP DRV_PAGE.RST_10 + DI : HALT +//////////////////////////////////////////////////////////////////////// -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[DRIVE API]> ; - BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode -;A0018 JP INTDISK ; -A0018: ;PUSH AF ; - ;PUSH BC ; +//////////////////////////////////////////////////////////////////////// +; <[DRIVE API]> + BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode +;A0018 JP INTDISK +A0018: ;PUSH AF + ;PUSH BC SCF RET -DRV_PAGE.MAIN_PAGE_NUMBER+2: ; - LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? - ;JP PORTAL.outDRV ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +DRV_PAGE.MAIN_PAGE_NUMBER+2: + LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? + ;JP PORTAL.outDRV +//////////////////////////////////////////////////////////////////////// ;!TODO -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[NOT USED]> ; - BLOCK #20-$,#C7 ; #C7 - "RST 0" opcode -A0020: JP DRV_PAGE.RST_20 ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// +; <[NOT USED]> + BLOCK #20-$,#C7 ; #C7 - "RST 0" opcode +A0020: JP DRV_PAGE.RST_20 +//////////////////////////////////////////////////////////////////////// + ; DRV_PAGE.RST_20: @@ -91,12 +89,12 @@ DRV_PAGE.RST_20: ; ;!TODO -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[NOT USED]> ; - BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode -A0028: JP DRV_PAGE.RST_28 ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// +; <[NOT USED]> + BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode +A0028: JP DRV_PAGE.RST_28 +//////////////////////////////////////////////////////////////////////// + ; DRV_PAGE.RST_28: @@ -105,23 +103,16 @@ DRV_PAGE.RST_28: RET ; -;!TODO -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; <[NOT USED]> ; - BLOCK #30-$,#C7 ; -A0030: JP RST_30 ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// + BLOCK #30-$,#C7 ; #C7 - "RST 0" opcode +RST_30: JP MOUSE_DRV.API +.RET: OUT (SLOT0),A + JP MOUSE_HANDLER +//////////////////////////////////////////////////////////////////////// -; -RST_30: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET -; ;!FIXIT -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +//////////////////////////////////////////////////////////////////////// ; <[MAIN INT]> ; BLOCK #38-$,#C7 ; A0038: ; @@ -188,21 +179,21 @@ A0038: ; ENDIF EI ; RETI ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// + ; DRV_PAGE.KEYSCAN: RET ;!FIXIT ; -; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; + +//////////////////////////////////////////////////////////////////////// ; <[ NMI ]> ; DRV_PAGE.NMI: RETN ; BLOCK #66-$,#C7; A0066: JP DRV_PAGE.NMI ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// + ;-------------------------------; @@ -220,8 +211,8 @@ A0066: JP DRV_PAGE.NMI ; ; EX (SP),HL ; RET -; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; + +//////////////////////////////////////////////////////////////////////// ; <[DRIVE PAGE SWITCH]> ; BLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: PUSH BC ; @@ -234,22 +225,20 @@ PORTAL.out_DRV: PUSH BC ; POP AF ; .ADCALL+1: CALL DISPATCH ; патчится на INTDISK JP PORTAL.out_DRV ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// -;!FIXIT чёт не то тут -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; LD B,#00; ; -; OUT (C),A ; -;--- ; -; POP BC ; -; RET ; -;PORTAL.outDRV: ; -; RET ; -;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +//////////////////////////////////////////////////////////////////////// +MOUSE_HANDLER: POP AF + CALL MOUSE_DRV.API + PUSH AF +.CorePage EQU $$$ + 1 + LD A,#FF + JP RST_30.RET +//////////////////////////////////////////////////////////////////////// + + DRV_PAGE.LDRIVE: DB #00 @@ -263,11 +252,11 @@ INITDVC_RET_DRIVE: AND A RET - INCLUDE 'dss/media_drivers/shared-drv.asm' - INCLUDE 'dss/media_drivers/ide-drv.asm' - INCLUDE 'dss/media_drivers/fdd-drv.asm' - INCLUDE 'dss/media_drivers/ram_disk-drv.asm' - + INCLUDE 'dss/Drivers/media/shared-drv.asm' + INCLUDE 'dss/Drivers/media/ide-drv.asm' + INCLUDE 'dss/Drivers/media/fdd-drv.asm' + INCLUDE 'dss/Drivers/media/ram_disk-drv.asm' + INCLUDE "dss/Drivers/input/MOUSE.ASM" /////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\; ; ;------------------------[shared-drv.asm table]------------------------; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f88fd4d..4cfc2b3 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -128,7 +128,11 @@ RST_0x28: JP RST_28 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[MOUSE API]> ; _mInfoBLOCK #30-$,#FF ; -RST_0x30: JP INTMOUS ; +RST_0x30: PUSH AF +.drv_page+1: LD A,#FF + OUT (SLOT0),A + POP AF + RET ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -151,7 +155,9 @@ INT_: PUSH AF PUSH IX PUSH IY CALL KEYSCAN - CALL M_INT + LD C,Dss.Mouse.GetPackets + RST ToDSS.Mouse + ;CALL M_INT IFN CLASSIC_CURSOR CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL ENDIF @@ -248,10 +254,10 @@ CLEAR_BUFFER_AND_INIT_PROC: LD (HL),A LDIR LD HL,':'*256 + 'X' - LD (CurrentPath),HL + LD (CORE_BUFFERS.CurrentPath),HL LD A,'\' ; - LD (CurrentDirectory),A - LD (WorkDirectory),A + LD (CORE_BUFFERS.CurrentDirectory),A + LD (CORE_BUFFERS.WorkDirectory),A ; LD A,#FF LD (CORE_BUFFERS.FatBuffer.DRIVE),A @@ -370,8 +376,6 @@ ADRST10: ;DS 512 ;,0 INCLUDE "FS/FAT/FAT.ASM" INCLUDE "FS/FAT/FAT_X.ASM" INCLUDE "DOS_FM.ASM" - ;INCLUDE "EXECUTE.ASM" - INCLUDE "INTMOUSE.ASM" INCLUDE "Procedures.asm" INCLUDE "Kernel_Panic.asm" @@ -414,30 +418,36 @@ WorkDirectory: DB '\' CLEAR_ZONE.start EQU $ MODULE CORE_BUFFERS -BUFFERSplace _sBuffers=$ -FM_BUF _sFM = BUFFERSplace.FileManipulator -.Size EQU _sFM -.FullSize EQU FMCOUNT*FM_BUF.Size -;BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector разной длины -FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer -EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header -XSTACK EQU BUFFERSplace.Stack.SPoint -BUFFER EQU BUFFERSplace.Buffer -SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER -MemoryTable EQU BUFFERSplace.MemoryTable +BUFFERSplace _sBuffers=$ +FM_BUF _sFM = BUFFERSplace.FileManipulator +.Size EQU _sFM +.FullSize EQU FMCOUNT*FM_BUF.Size +FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer +EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header +XSTACK _sStack = BUFFERSplace.Stack +.Spoint EQU XSTACK + _sStack +BUFFER EQU BUFFERSplace.Buffer +SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER +MemoryTable EQU BUFFERSplace.MemoryTable +CurrentPath EQU BUFFERSplace.CurrentPath +CurrentDirectory EQU BUFFERSplace.CurrentDirectory +.DEPTH EQU DIRECTORY_PATH_LENGTH +WorkDirectory EQU BUFFERSplace.WorkDirectory +.DEPTH EQU DIRECTORY_PATH_LENGTH ENDMODULE ; -CurrentPath EQU CORE_BUFFERS.BUFFERSplace + _sBuffers -CurrentDirectory EQU CurrentPath + 2 -.DEPTH: EQU DIRECTORY_PATH_LENGTH -; -WorkDirectory EQU CurrentDirectory + 1 + CurrentDirectory.DEPTH -.DEPTH: EQU DIRECTORY_PATH_LENGTH +; CurrentPath EQU CORE_BUFFERS.BUFFERSplace + _sBuffers +; CurrentDirectory EQU CurrentPath + 2 +; .DEPTH: EQU DIRECTORY_PATH_LENGTH +; ; +; WorkDirectory EQU CurrentDirectory + 1 + CurrentDirectory.DEPTH +; .DEPTH: EQU DIRECTORY_PATH_LENGTH ; CLEAR_ZONE.size EQU _sBuffers - ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" + ASSERT (CLEAR_ZONE.start + _sBuffers)<#4000, "Warning!!! OUT OF SLOT0" + DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size @@ -599,7 +609,11 @@ DEPLOY: ;Allocate memory LD HL,BANKTBL + COREPAGE IN A,(SLOT0) LD (HL),A - + ; для API драйвера мышки + LD (MOUSE_HANDLER.CorePage),A + LD A,(BANKTBL + DRVPAGE) + LD (RST_0x30.drv_page),A + POP AF OUT (SLOT3),A diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 98ae456..10001ba 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -318,17 +318,17 @@ FINDDIR: LD A,(IX + FAT_DIRECTORY_RECORD.NAME + 1) CP "." JP NZ,.IT_DIR - LD HL,WorkDirectory + LD HL,CORE_BUFFERS.WorkDirectory LD D,H LD E,L INC HL - LD BC,WorkDirectory.DEPTH + LD BC,CORE_BUFFERS.WorkDirectory.DEPTH XOR A CPIR JP PO,.error ;[x] 20/11/23 проверка на выход за границы DEC HL ;R009 DEC HL - LD BC,WorkDirectory.DEPTH + LD BC,CORE_BUFFERS.WorkDirectory.DEPTH LD A,'\' CPDR INC HL @@ -353,8 +353,8 @@ FINDDIR: RET ; .ADDSPEC: - LD HL,WorkDirectory+1 - LD BC,WorkDirectory.DEPTH-1 + LD HL,CORE_BUFFERS.WorkDirectory+1 + LD BC,CORE_BUFFERS.WorkDirectory.DEPTH-1 CALL .CHECK_SLASH JR C,.error ;R011 @@ -458,7 +458,7 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE CALL LOADDIR ; CF=0 - LD HL,WorkDirectory + LD HL,CORE_BUFFERS.WorkDirectory LD (HL),'\' INC HL LD (HL),#00 @@ -712,7 +712,6 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A ; calc. first sector FAT LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) - ;!FIXIT для fat32 втыкать сюда сектора активной таблицы LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ;[ ] fat32 @@ -735,8 +734,8 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE - ;!TODO выбор активной FAT для fat32 LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs + LD (CORE_BUFFERS.FatBuffer.Number_Of_FATs),A CP 1 JR Z,.one_FAT DEC A @@ -951,38 +950,65 @@ RD_BPB: ; LD C,SLOT3 LD A,FAT_TYPE.x12 JR .set_vars ; -.its_FAT32: EXX - LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL +.its_FAT32: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MainFATnumber) + CP #80 + JR C,.mirrored_FATs ;если все копии FAT используются + ; используется только одна копия FAT + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD D,0 EXX + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + AND #0F + JR Z,.first_FAT_active + LD B,A ; - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC +.fat_calc_loop: ADD HL,DE + EXX + ADC HL,DE + EXX + DJNZ .fat_calc_loop ; - CALL CLUSTER_TO_SECTOR - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC +.first_FAT_active: + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + EXX + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL ; - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) - LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL +.mirrored_FATs: ; + LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL ; - LD A,FAT_TYPE.x32 - LD HL,#0FFF - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL - LD H,L - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) - ; -.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC + EXX + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC + ; + CALL CLUSTER_TO_SECTOR + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC + ; + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) + LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL + ; + LD A,FAT_TYPE.x32 + LD HL,#0FFF + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD H,L + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) + ; +.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC EXX LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL LD BC,11 ;!HARDCODE LDIR - + ; SET_PAGE_X FATPAGE PUSH AF LD DE,0 @@ -1006,43 +1032,7 @@ RD_BPB: ; LD C,SLOT3 XOR A RET ; -.set_FSinfo: ; - IFN USE_FSINFO_FAT32 - CALL READ_FSinfo - ; !FIXIT проверка на ошибку - ; - LD A,#FF - ; проверка одной из сотни сраных сигнатур - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE) - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) - LD BC,#7272 - SBC HL,BC - JR NZ,.error_sig - EX DE,HL - LD DE,#6141 - SBC HL,DE - JR NZ,.error_sig - ; - LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT - LD B,8 ; 2 x DWORD - LD A,#FF - ; -.fsinfo_loop: AND (HL) - INC HL - DJNZ .fsinfo_loop - ; -.error_sig: XOR #FF - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A - ; - XOR A - LD H,A - LD L,2 - LD (G_CLUST.low),HL - LD L,H - LD (G_CLUST.high),HL - RET - ELSE - CALL READ_FSinfo +.set_FSinfo: CALL READ_FSinfo ; !FIXIT проверка на ошибку ; ; проверка одной из сотни сраных сигнатур @@ -1101,7 +1091,6 @@ RD_BPB: ; LD C,SLOT3 LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) SBC HL,DE RET - ENDIF ;;;;;;;; ; --> BC:HL - Sector diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 0582a6b..5c601cd 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -647,11 +647,7 @@ WRITE_FAT_TABLE: ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока - ; [x] fat32 ;!FIXIT - LD (.save_hl),HL - ;LD B,H - ;LD C,L - ; + LD (.save_offset_HL),HL LD DE,FAT_CACHE.Sectors_32 LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 @@ -675,7 +671,7 @@ WRITE_FAT_TABLE: .sub_A+1: SBC A,0 JR C,.WALLFAT ; СF=1: не выходит OR A - JR NZ,.ERR + JP NZ,.ERR ; EX DE,HL ; DE - на сколько секторов конец блока выходит за пределы таблицы. @@ -686,23 +682,17 @@ WRITE_FAT_TABLE: JR C,.ERR ;!TODO проверить LD B,L ; число секторов для чтения в кэш .WALLFAT: ; -.save_hl+1: LD HL,0 - ;LD H,B - ;LD L,C - ;PUSH HL - ; +.pop_offset_HL+1: + LD HL,0 ; B = число секторов LD IX,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) - ;LD B,A - ;LD C,Dss.DRV.Write ; запись секторов PUSH BC - ; ; сохраняем первую копию FAT. Вход IX:DE - начало таблицы FAT ; C:HL - смещение внутри таблицы ; B - количество секторов CALL .SAVE_FAT_XX - ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 + ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 POP BC ; B = число секторов, C = старший байт смещения в секторах LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) @@ -715,12 +705,51 @@ WRITE_FAT_TABLE: SBC HL,DE JR Z,.only_one_FAT ; - ; сохраняем вторую копию FAT -.not_one_FAT: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) +.not_one_FAT: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.fat_num_2 + ; + LD A,(CORE_BUFFERS.FatBuffer.Number_Of_FATs) + CP 2 + JR Z,.fat_num_2 + ; сохраняем больше двух копий FAT + LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD D,0 + EXX + LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + DEC A +.many_fat_loop: EXX + PUSH HL + PUSH HL + POP IX + EXX + PUSH HL + PUSH BC + EX DE,HL + LD HL,(.pop_offset_HL) + CALL .SAVE_FAT_XX + POP BC + POP HL + ; + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + ADD HL,DE + EXX + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + POP HL + ADC HL,DE + EXX + DEC A + JR NZ,.many_fat_loop + JR .norm_exit + ; + ; сохраняем вторую копию FAT +.fat_num_2: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) - LD HL,(.save_hl) + LD HL,(.pop_offset_HL) CALL .SAVE_FAT_XX - AND A ;!TODO нет контроля ошибок +.norm_exit: AND A ;!TODO нет контроля ошибок .only_one_FAT: ; .ERR: LD A,0 LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A @@ -729,7 +758,6 @@ WRITE_FAT_TABLE: ; C:HL - смещение в таблице в секторах ; B - количество секторов .SAVE_FAT_XX: ADD HL,DE - ;EX DE,HL JR NC,.no_inc_C INC C ; номер лог. сектора @@ -1539,17 +1567,5 @@ GET_OFFSET_IN_SECTORS: RET ;----------------------------------------------------------------------; - -;!TODO fat32 -;======================================================================= -;BPB - ;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL - ;LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR -;BPB32 - ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта -;FAT Max Cluster - ;LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL -;======================================================================= - ;//MODULE: FAT_X ;[END] \ No newline at end of file diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 97e7db7..0698da2 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -1,4 +1,5 @@ +; MODULE KEYINTER ;[BEGIN] ;//MODULE: KEYINTER Keyboard Scan Codes: Set 2 ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov @@ -1270,4 +1271,5 @@ SHF2RUS DB #F1,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs ;================================ ;//MODULE: KEYINTER -;[END] \ No newline at end of file +;[END] +; ENDMODULE \ No newline at end of file diff --git a/DSS/Structures.inc b/DSS/Structures.inc index cb296d1..34f8616 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -1,7 +1,7 @@ ; STRUCT _sStack ; 256 bytes .buffer BLOCK 256,0 -.SPoint BYTE 0 +;.SPoint BYTE 0 ENDS ; @@ -76,23 +76,24 @@ ; STRUCT _sFatBuffer .DRIVE: BYTE #FF -.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 +.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 +.RootDirStartCluster_H: WORD #0000 ; fat32 .FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) -.FAT1_SEC_H: WORD #0000 ; [ ] fat32 +.FAT1_SEC_H: WORD #0000 ; fat32 .FAT2_SEC_L: WORD #0000 -.FAT2_SEC_H: WORD #0000 ; [ ] fat32 +.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 ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.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 ; [ ] fat32 было ограничение в 32 Гига +.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 ; [ ] fat3 @@ -123,5 +124,8 @@ .Stack _sStack ; 256 bytes .Buffer BLOCK 512,0 ; FOR BUFFER & SECTOR_BUFFER .MemoryTable BLOCK 256,0 ; 256 bytes +.CurrentPath WORD 0 +.CurrentDirectory BLOCK DIRECTORY_PATH_LENGTH,0 +.WorkDirectory BLOCK DIRECTORY_PATH_LENGTH,0 ENDS ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index fbee9e3..ad12b97 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -982 \ No newline at end of file +983 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index c85ad2d..4db938b 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -27,9 +27,8 @@ ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// - DEFINE USE_FSINFO_FAT32 1 ; недоделано. А нужно ли? DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 - DEFINE FAST_FAT_CASHE 1 ; !FIXIT баги при стирании + DEFINE FAST_FAT_CASHE 1 SERVICE_SECTORS: .FAT12 EQU #0FEF diff --git a/DSS/INTMOUSE.ASM b/DSS/drivers/Input/MOUSE.ASM similarity index 93% rename from DSS/INTMOUSE.ASM rename to DSS/drivers/Input/MOUSE.ASM index 14ba294..87506e2 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/drivers/Input/MOUSE.ASM @@ -1,6 +1,6 @@ - + MODULE MOUSE_DRV ;[BEGIN] -;//MODULE: INTMOUSE +;//MODULE: MOUSE_DRV ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module @@ -102,8 +102,7 @@ PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data ; 4 - CURSOR OFF (UZHE) ; 5 - CURSOR IMAGE VERY BIG -INTMOUS: - BIT 7,C +API: BIT 7,C JR NZ,EMOUSE INC C DEC C @@ -340,7 +339,7 @@ MS_BCUR: POP BC POP HL LD A,5 - JR C,NOSAVEM + JR C,.NOSAVEM LD DE,M_IMAGE EX DE,HL DI @@ -355,7 +354,7 @@ MS_BCUR: LD D,C LD BC,0 XOR A -NOSAVEM: +.NOSAVEM: EI RET @@ -1032,6 +1031,6 @@ M_IMAGE: BLOCK 256-($-M_IMAGE),0 .Size EQU $-M_IMAGE -;//MODULE: INTMOUSE +;//MODULE: MOUSE_DRV ;[END] - + ENDMODULE diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM similarity index 100% rename from DSS/Media_drivers/ReScanDRV.ASM rename to DSS/drivers/media/ReScanDRV.ASM diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm similarity index 100% rename from DSS/Media_drivers/fdd-drv.asm rename to DSS/drivers/media/fdd-drv.asm diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/drivers/media/ide-drv.asm similarity index 100% rename from DSS/Media_drivers/ide-drv.asm rename to DSS/drivers/media/ide-drv.asm diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm similarity index 100% rename from DSS/Media_drivers/ram_disk-drv.asm rename to DSS/drivers/media/ram_disk-drv.asm diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/drivers/media/shared-drv.asm similarity index 100% rename from DSS/Media_drivers/shared-drv.asm rename to DSS/drivers/media/shared-drv.asm From cc435bef7dd4fc3a3cc87f5055bd351a63c00e9c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 10 May 2024 01:30:13 +1000 Subject: [PATCH 129/219] CORE: -bug in LOADDIR for fat32 SHELL: small optimize --- DSS/API/Execute.ASM | 2 +- DSS/API/Find.asm | 14 ++--- DSS/API/diskINF.asm | 2 +- DSS/DOS_Proc.asm | 1 + DSS/DSS-MAIN.ASM | 4 +- DSS/FS/FAT/FAT.asm | 2 + DSS/FS/FAT/FAT_X.asm | 2 +- DSS/KEYINTER.ASM | 23 ++++---- DSS/Structures.inc | 1 + DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 119 ++++++++++++++++------------------------- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 13 files changed, 79 insertions(+), 97 deletions(-) diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 171da66..2060854 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -581,7 +581,7 @@ LEAVE: LD A,B ; вход: нет ; выход: A - код завершения ;///////////////////////////////////////////////////////////////////// -WAIT: LD A,(ErrorLevel) +GET_ERR: LD A,(ErrorLevel) AND A RET ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 0ae8afc..b600da9 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -48,7 +48,7 @@ F_FIRST: LD HL,HANDBUF+12 ;!HARDCODE LD BC,HANDBUF.SIZE-12 ;????? метку вместо числа? LDIR - LD A,(HANDBUF+11) + LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) LD (DE),A INC DE LD HL,HANDBUF @@ -58,16 +58,18 @@ F_FIRST: JR NZ,.FIND_M2 LD BC,11 ;!HARDCODE LDIR - LD A,F_NEXT.NO_NEXT.NO +.exit: LD A,F_NEXT.NO_NEXT.NO LD (F_NEXT.NO_NEXT),A XOR A RET .FIND_M2: + ;!TODO LFN + ;CP 2 + ;CALL NC,GetName_LFN + ;CALL C,GetName + ; CALL GetName - LD A,F_NEXT.NO_NEXT.NO - LD (F_NEXT.NO_NEXT),A - XOR A - RET + JR .exit //////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 033b221..c86db8a 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -76,7 +76,7 @@ DISKINF: LD C,B .next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP - ; + ; !FIXIT если метка в BPB "NO NAME" или пробелы, то проверять метку в корневом каталоге. LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 7da3511..49a4799 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -52,6 +52,7 @@ ; DJNZ .GETN6 ; RET ;---------------;---------------;--------------- +;!TODO LFN GetName: LD BC,#08FF ;!HARDCODE длина имени + счётчик LD A,' ' .loop: CP (HL) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 4cfc2b3..f92c6ec 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -317,7 +317,7 @@ ADRST10: ;DS 512 ;,0 DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B - DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low WAIT, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 + DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F @@ -344,7 +344,7 @@ ADRST10: ;DS 512 ;,0 DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 - DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high WAIT, high GSWITCH,high DOSNAME, high EX_PATH + DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 10001ba..51214f3 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -519,6 +519,8 @@ LOADDIR: ;!TODO optimize LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + LD HL,#4000 ;!HARDCODE размер директории + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ; .read_dir: LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 5c601cd..e3460c2 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -647,7 +647,7 @@ WRITE_FAT_TABLE: ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока - LD (.save_offset_HL),HL + LD (.pop_offset_HL),HL LD DE,FAT_CACHE.Sectors_32 LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 0698da2..18535e4 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -554,11 +554,11 @@ KEYSCAN: LD IX,KEYFLAG ; SBC HL,DE ; CALL Z,RST_X ; - ; [x] опасная хрень - LD HL,BREAK_PROCESS_CODE - AND A - SBC HL,DE - CALL Z,Break_Process + ;; [ ] опасная хрень + ;LD HL,BREAK_PROCESS_CODE + ;AND A + ;SBC HL,DE + ;CALL Z,Break_Process ; LD BC,(KEYFLAG) CALL PUTSYM @@ -1154,12 +1154,13 @@ KBD_Receiver_Overrun: LD (KEY_FLG),A ;LD (UNCODE),A RET - ; [x] опасная хрень -Break_Process: LD A,(TASK) - XOR 2 ; 2 - task of primary shell - RET Z - LD B,DSS_Error.sys.USER_ABORT - JP LEAVE + ; + ; [ ] опасная хрень +; Break_Process: LD A,(TASK) +; XOR 2 ; 2 - task of primary shell +; RET Z +; LD B,DSS_Error.sys.USER_ABORT +; JP LEAVE ; ` ; 0 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 34f8616..4a2ef37 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -52,6 +52,7 @@ .KnownOffset_L WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. .KnownOffset_H WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS + ;ACCESS MODE: A=0 чтение/запись ; A=1 чтение ; A=2 запись diff --git a/DSS/build.txt b/DSS/build.txt index ad12b97..9a32da2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -983 \ No newline at end of file +984 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index ac3c70e..ae5f3f8 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -289,13 +289,7 @@ PRNSIZE: ld a,(ix+32) ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3) exx push ix - call MAKE_LN_32 ; десятичный 32-х разрядный вывод - ld hl,L32BIT_.end - ld a,(hl) - cp " " - jr nz,.not_zero - ld a,"0" - ld (hl),a + call MAKE_LN ; десятичный 32-х разрядный вывод .not_zero: ld de,SIZE_BUFFER.low ; "0 000 000 000" ld hl,L32BIT_ ; "0000000000" ldi @@ -403,33 +397,12 @@ toNumber: ld c,#2F ld (hl),a inc hl ret +; ;!TODO перетащить в procedures/math.asm ; Десятичный 32-х разрядный вывод ; HL':HL - число для перевода ; !FIXIT можно объеденить с PDIGIT -MAKE_LN_32: CALL MAKE_LN - ld hl,L32BIT_ ; "0000000000" - JR MAKE_LN_Clean -; десятичный 40-а разрядный вывод -MAKE_LN_40: CALL MAKE_LN.skip_1 - ld hl,L40BIT_ ; "0000000000" - ; -MAKE_LN_Clean: ld de,#2030 ; " ","0" -.KILLZ: ld a,(hl) - cp e - jr nz,.KILLZ2 - ld (hl),d - inc hl - jr .KILLZ - ; -.KILLZ2: ld hl,L32BIT_.end ; "0" - ld a,(hl) - cp d - ret nz - ld (hl),e - ret -; десятичный 32-х разрядный вывод MAKE_LN: ld ix,L32BIT_ ; "0000000000" exx ld de,#3B9A @@ -491,7 +464,8 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000" inc ix ret ; -GET_DIG: xor a +GET_DIG: ld a,"0"-1 + AND A .loop: inc a sbc hl,de exx @@ -503,9 +477,16 @@ GET_DIG: xor a exx adc hl,de exx - dec a - add a,"0" - ld (ix+0),a + ;dec a + cp "0" + jr nz,.putChar + ld b,a + ld a,(ix-1) + cp " " + jr z,.putChar + ld a,b + ; +.putChar: ld (ix+0),a inc ix ret ; @@ -524,16 +505,18 @@ full_space_medium: WORD 0 full_space_high: BYTE 0 ; -L40BIT_ db "00" -L32BIT_: db "000000000" +; !TODO может обойтись одним буфером 00 вместо двух? +L40BIT: db " " ; маркер для ix-1 +.Str: db " " ; 00 +L32BIT_: db " " ; 000000000 .end: db "0" ; DIRIDD: db " ",0 ; -SIZE_BUFFER: -.high db "00" -.low: db "0 000 000 000",0,0 -.bytes equ SIZE_BUFFER - $ +SIZE_BUFFER: db " " ; маркер для ix-1 +.high db " " ; "00" +.low: db " ",0,0 ; "0 000 000 000",0,0 +.bytes equ SIZE_BUFFER - $ ; ; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo @@ -562,12 +545,7 @@ read_disk_info: OR #80 AND E EXX INC A - ;JR Z,.no_full_space_option LD (.full),A - ; ; - ; LD A,(.full) - ; OR A - ; JR Z,.no_full_space_option EX AF,AF' ; ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE @@ -618,7 +596,6 @@ read_disk_info: OR #80 RR C JP NC,.loop2 ; <-- B':HL'HL, C':DE':DE - ;!TODO выводить полный размер диска EXX LD A,C LD (free_space_high),A @@ -674,17 +651,16 @@ read_disk_info: OR #80 ld c,Dss.ChDir RST ToDSS ; поиск метки - ld hl,mask_fname ; "*.*" имя метки - ld de,work_buffer1 ; куда - ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома - ld bc,Dss.F_First.FATname ; f_first, формат 11 + ld hl,mask_fname ; "*.*" имя метки + ld de,work_buffer1 ; куда + ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома + ld bc,Dss.F_First.FATname ; f_first, формат 11 RST ToDSS push af - call restore_path ; восст. тек. путь + call restore_path ; восст. тек. путь pop af - ;jr c,no_volume_label ; метки нет дирректории - ld hl,work_buffer1+33 ; начало метки в буфере f_first - jr nc,volume_label ; метка в корневом каталоге + ld hl,work_buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first + jr nc,volume_label ; метка в корневом каталоге ; берём метку из BPB ; тут в HL длина поля "Метка диска" POP hl @@ -710,12 +686,12 @@ read_disk_info: OR #80 LD (PRM5),A ret .good_label: POP HL - PUSH HL ; лишнее + PUSH HL ; толкаем лишнее ; есть метка -volume_label: pop DE ; лишнее +volume_label: POP DE ; снимаем лишнее ; %5 ld de,PRM5 - ld bc,11 ;!HARDCODE длина метки + ld bc,11 ;!HARDCODE длина метки ldir xor a ld (de),a @@ -758,11 +734,11 @@ volume_string_yes: ; has_not_full_info: ; db ' (?)',0 ; -cmd_dir_options:; [ ] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) +cmd_dir_options:; [x] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) DB 'f' : DW cmd_dir_freeSpace DB 'p' : DW cmd_dir_pause .Size EQU ($-cmd_dir_options)/3 -.paramLength equ 3 +.paramLength EQU 3 ; ; @@ -776,7 +752,7 @@ cmd_dir_pause: ld a,#ff ld (cmd_dir.key_p),a jp cmd_dir.parse /////////////////////////////////////////////////////////////////////////////////////// -GET_BIG_DIG: ld b,0 +GET_BIG_DIG: ld b,"0"-1 and a .loop: inc b sbc hl,de @@ -794,15 +770,21 @@ GET_BIG_DIG: ld b,0 adc a,c ; ex af,af' - dec b + ;dec b ld a,b - add a,"0" - ld (ix+0),a + cp "0" + jr nz,.putChar + ld a,(ix-1) + cp " " + jr z,.putChar + ld a,b + ; +.putChar: ld (ix+0),a ex af,af' inc ix ret ; stop -PRINT_5BYTES: ld ix,L40BIT_ ; "00" +PRINT_5BYTES: ld ix,L40BIT.Str ; "00" ld c,#17 exx ld de,#4876 @@ -828,16 +810,9 @@ PRINT_5BYTES: ld ix,L40BIT_ ; "00" CALL GET_BIG_DIG ; ; DE':DE = 100,000,000 - CALL MAKE_LN_40 - ld hl,L32BIT_.end ; "0" - ld a,(hl) - cp " " - jr nz,.not_zero - ld a,"0" - ld (hl),a -.not_zero: ; + CALL MAKE_LN.skip_1 .exit_clean: ld de,SIZE_BUFFER.high ; "0 000 000 000" - ld hl,L40BIT_ ; "0000000000" + ld hl,L40BIT.Str ; "0000000000" ldi ldi ld a,(hl) diff --git a/SHELL/build.txt b/SHELL/build.txt index 2a9c18a..55f04f2 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -357 \ No newline at end of file +365 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 62170ee..5797b0c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 62170ee7bc7dabe6fd55b94e89826ca510a60097 +Subproject commit 5797b0c5804320f86d263997f624cb8b6bb69385 From e5868883f87455370bb8ad4f47b6aee30d41770c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 11 May 2024 07:19:36 +1000 Subject: [PATCH 130/219] =?UTF-8?q?-bug:=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=20=D1=81=D1=87=D0=B8=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D1=81=D1=8C=20=D1=81=D0=B2=D0=BE=D0=B1=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D1=8B=D0=B5=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=B2=20?= =?UTF-8?q?1=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/FS/FAT/FAT_X.asm | 17 ++++++++++------- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 3 ++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index e3460c2..45561f1 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1211,7 +1211,7 @@ CHECK_FIRST_CLUSTER: OR H RET -; [x] fat32 ;!TEST +; [x] fat32 ; WRITE SECTORS OF FILE ; вход: HL:DE - FP (in sectors) ; IX - data in RAM @@ -1226,7 +1226,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX PUSH HL ; остаток DIV_for_SPC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE PUSH BC ; младшее слово номера кластера - PUSH DE ; [x] fat32 старшее слово номера кластера + PUSH DE ; fat32 старшее слово номера кластера ; ; EXX ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High @@ -1242,7 +1242,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR NZ,.FindCluster ; PUSH BC ; младшее слово номера кластера - PUSH DE ; [x] fat32 старшее слово номера кластера + PUSH DE ; fat32 старшее слово номера кластера ; [x] fat32 CALL G_CLUST JP C,.Error_6 @@ -1255,6 +1255,9 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H EXX ; + XOR A + CALL SET_NEW_FREE_CLUSTERS + ; CALL WRITE_TO_FAT ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;PUSH HL @@ -1262,10 +1265,10 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX ;POP HL ; POP DE ; младшее слово номера кластера - POP BC ; [x] fat32 старшее слово номера кластера + POP BC ; fat32 старшее слово номера кластера ; INC B - INC D ; [x] fat32 + INC D ; fat32 PUSH DE JP .enter_loop ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE @@ -1273,7 +1276,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX ;HL': HL - известный кластер файла для отсчёта ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1) ; - PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово) + PUSH DE ; оставшееся смещение в файле в кластерах (старшее слово) JP .enter_loop ; ; [x] fat32 @@ -1296,7 +1299,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX .enter_loop: INC B DEC BC DJNZ .loop - POP BC ; [x] оставшееся смещение в файле в кластерах (старшее слово) + POP BC ; оставшееся смещение в файле в кластерах (старшее слово) INC B DEC BC DJNZ .loop_big diff --git a/DSS/build.txt b/DSS/build.txt index 9a32da2..6f17eed 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -984 \ No newline at end of file +985 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index ae5f3f8..23008c1 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -784,6 +784,7 @@ GET_BIG_DIG: ld b,"0"-1 inc ix ret ; stop +; A:HL':HL - число для перевода PRINT_5BYTES: ld ix,L40BIT.Str ; "00" ld c,#17 exx @@ -811,7 +812,7 @@ PRINT_5BYTES: ld ix,L40BIT.Str ; "00" ; ; DE':DE = 100,000,000 CALL MAKE_LN.skip_1 -.exit_clean: ld de,SIZE_BUFFER.high ; "0 000 000 000" + ld de,SIZE_BUFFER.high ; "0 000 000 000" ld hl,L40BIT.Str ; "0000000000" ldi ldi From 82ed30ef6109e71859e3e4462aa69d9b349af8cd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 18 May 2024 01:30:26 +1000 Subject: [PATCH 131/219] ... --- DSS/API/diskINF.asm | 3 +-- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 36 ++++++++++++++++++++++-------------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index c86db8a..88ddc61 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -56,7 +56,7 @@ DISKINF: LD C,B ; EX DE,HL LD HL,FAT_STRING -1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) @@ -174,7 +174,6 @@ DISKINF: LD C,B LDIR RET ; - ; GetFreeSpace: LD A,1 LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A diff --git a/DSS/build.txt b/DSS/build.txt index 6f17eed..be9c519 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -985 \ No newline at end of file +986 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 23008c1..ae2787e 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -1,7 +1,7 @@ ;/////////////////////////////////////////////////// ; ; DIR. Вывод списка файлов и папок -; +; !TODO убрать баг если в параметре маски указан путь до папки или даже до другого диска ;/////////////////////////////////////////////////// cmd_dir: push de ;;;; [ ] поддержка параметров @@ -21,11 +21,12 @@ cmd_dir: push de jr z,.skip LD DE,MAIN_MSG.CALCULATING CALL MESSAGE + ; .skip: ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS - ADD A,"A" - ld (root_path),a ; номер диска - SUB "A" + ;ADD A,"A" + ;ld (root_path),a ; номер диска + ;SUB "A" call read_disk_info ; прочитать метку и серийный номер диска ; pop de @@ -41,11 +42,15 @@ cmd_dir: push de ex de,hl ld de,work_buffer1 ; 80 ld c,Dss.GSwitch ; выделить параметр ком-строки + ;!TODO тут в work_buffer1 лежит путь и/или/либо маска файла + ; надо разобрать её Dss.EX_Path выделить если есть диск, путь и маску, после чего уже + ; отпечатывать путь в шапке, узнавать CurDisk как в .skip выше. Делать это до вызова + ; процедуры read_disk_info. Лучше делать это после метки .skip RST ToDSS ; ld a,(work_buffer1) or a - jr nz,.skipMask ; задана маска имен + jr nz,.skipMask ; задана маска имён ; ld hl,mask_fname ; "*.*" ld de,work_buffer1 @@ -647,18 +652,19 @@ read_disk_info: OR #80 call hex16 .get_label: ; ищем метку в корне ФС раздела ; уст. корень диска - ld hl,root_path ; "x:\",0 - ld c,Dss.ChDir - RST ToDSS + ; ld hl,root_path ; "x:\",0 + ; ld c,Dss.ChDir + ; RST ToDSS ; поиск метки - ld hl,mask_fname ; "*.*" имя метки + ;ld hl,mask_fname ; "*.*" имя метки + ld hl,SlashMaskFname ; "\*.*" имя метки ld de,work_buffer1 ; куда ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома ld bc,Dss.F_First.FATname ; f_first, формат 11 RST ToDSS - push af - call restore_path ; восст. тек. путь - pop af + ;push af + ;call restore_path ; восст. тек. путь + ;pop af ld hl,work_buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first jr nc,volume_label ; метка в корневом каталоге ; берём метку из BPB @@ -715,12 +721,14 @@ unknown_serial: ; JP read_disk_info.get_label ; - +;---------------; +SlashMaskFname: db '\' ; ; маска файлов mask_fname: db "*.*",0 +;---------------; ; корень диска -root_path: db 'X:\',0 +;root_path: db 'X:\',0 ; Серийный номер диска serial_string: db "xxxx-xxxx" From da7b40b234155a5511e71d342752da33f41e985d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 23 May 2024 22:44:03 +1000 Subject: [PATCH 132/219] ... --- SHELL/Commands/DIR.ASM | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index ae2787e..9c5dab7 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -24,9 +24,6 @@ cmd_dir: push de ; .skip: ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS - ;ADD A,"A" - ;ld (root_path),a ; номер диска - ;SUB "A" call read_disk_info ; прочитать метку и серийный номер диска ; pop de @@ -42,11 +39,11 @@ cmd_dir: push de ex de,hl ld de,work_buffer1 ; 80 ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS ;!TODO тут в work_buffer1 лежит путь и/или/либо маска файла ; надо разобрать её Dss.EX_Path выделить если есть диск, путь и маску, после чего уже ; отпечатывать путь в шапке, узнавать CurDisk как в .skip выше. Делать это до вызова ; процедуры read_disk_info. Лучше делать это после метки .skip - RST ToDSS ; ld a,(work_buffer1) or a From 6088a447f75a5dd39210d993de24eacbed0ef253 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 25 May 2024 01:00:41 +1000 Subject: [PATCH 133/219] ... --- SHELL/BATCH.ASM | 2 +- SHELL/Commands/DIR.ASM | 132 +++++++++++++++++++++++++++++++---------- SHELL/EDLINE.ASM | 115 ++++++++++++++++++----------------- SHELL/EXEC.ASM | 2 +- SHELL/SHELL.ASM | 32 +++++++++- SHELL/build.txt | 2 +- SHELL/structures.inc | 25 ++++++++ 7 files changed, 217 insertions(+), 93 deletions(-) create mode 100644 SHELL/structures.inc diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 22b9e4c..09f0ddc 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -408,7 +408,7 @@ EVALCMD: xor a call EVALSTR ld hl,work_buffer2 ;work_buffer+256 ld de,struct_input_line+5 ; куда - ld bc,255 + ld bc,255 ;!HARDCODE .loop: ld a,(hl) ldi inc b diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 9c5dab7..736914e 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -7,6 +7,7 @@ cmd_dir: push de ;;;; [ ] поддержка параметров ; зануляем все параметры на старте xor a + ld (work_buffer2),a ld (read_disk_info.full),a ld (.key_p),a ; выполняем/настраиваем все найденные параметры в строке @@ -21,10 +22,10 @@ cmd_dir: push de jr z,.skip LD DE,MAIN_MSG.CALCULATING CALL MESSAGE - ; -.skip: ld c,Dss.CurDisk ; узнать тек. диск - RST ToDSS - call read_disk_info ; прочитать метку и серийный номер диска + ;!TEST 23/05/24 +.skip: ;LD C,Dss.CurDisk ; узнать тек. диск + ;RST ToDSS + ;CALL read_disk_info ; прочитать метку и серийный номер диска ; pop de xor a @@ -37,7 +38,7 @@ cmd_dir: push de ld (S_HIGH),a ; ex de,hl - ld de,work_buffer1 ; 80 + ld de,work_buffer1 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ;!TODO тут в work_buffer1 лежит путь и/или/либо маска файла @@ -47,19 +48,82 @@ cmd_dir: push de ; ld a,(work_buffer1) or a - jr nz,.skipMask ; задана маска имён + ;jr nz,.SkipMask ; задана маска имён + jr z,.NoSkipMask ; не задана маска имён + ; сохранить текущий путь в work_buffer2 + ; Из буфера DE запомнить маску (первые справа символы после первого справа '\') и убрать её + ; если маски нет и последний в строке '\', то потом добавить маску как в "; добавление маски" + ; сделать CD в директорию из буфера DE + ; make_short_path + ; + ld hl,work_buffer1 + ld bc,Dss.EX_Path.GET_ALL + rst ToDSS ; - ld hl,mask_fname ; "*.*" + and %00001100 ; имя диска и путь + jr z,.SkipMask + ; + ld hl,work_buffer2+2 + ld c,Dss.CurDir + rst ToDSS + ld c,Dss.CurDisk + rst ToDSS + add a,"A" + ld (work_buffer2),a + ld a,":" + ld (work_buffer2+1),a + ; + xor a + ld hl,work_buffer1 + ld bc,256 + cpir + ;!FIXIT проверка на ошибку по флагу P/V + dec hl + ex de,hl + ld hl,256-1 + and a + sbc hl,bc + ld b,h + ld c,l + ld a,'\' ; + ex de,hl + cpdr + ;!FIXIT проверка на ошибку по флагу P/V + inc hl + ld (hl),0 + inc hl + ld de,PRM1 + call ncopy_string ; сохраняем маску файла + ; + ld hl,work_buffer1 + ld c,Dss.ChDir + rst ToDSS + ; + ld hl,PRM1 + ld de,work_buffer1 + call ncopy_string ; восстанавливаем маску файла + ; + ld a,(PRM1) + or a + jr nz,.SkipMask + ; + ; добавление маски +.NoSkipMask: ld hl,mask_fname ; "*.*" ld de,work_buffer1 call copy_string - ; [ ] 1/10/23 -.skipMask: ld hl,work_buffer1 ; имя файла - ld de,work_buffer1 ; 80 буфер - ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) - ld bc,Dss.F_First.FATname ; f_first (формат 11) - RST ToDSS - JR C,.Dir_Empty ;R14 - CALL Print_Header + ; !TEST 23/05/24 +.SkipMask: LD C,Dss.CurDisk ; узнать тек. диск + RST ToDSS + CALL read_disk_info ; прочитать метку и серийный номер диска + ; + CALL Print_Header + ; [ ] 01/10/23 + ld hl,work_buffer1 ; имя файла + ld de,work_buffer1 ; 80 буфер + ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) + ld bc,Dss.F_First.FATname ; f_first (формат 11) + RST ToDSS + JR C,.Dir_Empty ;R14 ; LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE PUSH AF @@ -110,9 +174,9 @@ cmd_dir: push de ld (dir_number),hl jr .next ;;R14 -.Dir_Empty: push af - CALL Print_Header - pop af +.Dir_Empty: ;push af + ;CALL Print_Header + ;pop af CALL print_err_message jr .print ;;R14 @@ -156,24 +220,17 @@ cmd_dir: push de ;CALL PRINT_DWORD CALL PRINT_5BYTES ; - ; [ ] вывод количества папок + ; [x] вывод количества папок ; [x] вывод общего количества свободного места ld hl,SIZE_BUFFER.high ; "000 000 000 000" ld de,PRM1; + PRM2 ; размер файлов в каталоге ld bc,SIZE_BUFFER.bytes call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. ; - ;!TEST - ;ld hl,(dir_number) - ;ld de,PRM3 - ;call hex2dec_ascii_16bit.n10000 - ; Десятичный вывод - ld hl,(dir_number) - ld ix,PRM4 ; кол-во каталогов в каталоге - call PDIGIT - ;xor a - ;ld (de),a - ; + ; Десятичный вывод + ld hl,(dir_number) + ld ix,PRM4 ; кол-во каталогов в каталоге + call PDIGIT ; full capacity ld a,(full_space_high) ld hl,(full_space_medium) ; ст. разряд @@ -184,6 +241,13 @@ cmd_dir: push de ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" CALL MESSAGE ; вывести строку ; + ; [ ] 23/05/2024 + ld hl,work_buffer2 + ld c,Dss.ChDir + ld a,(hl) + or a + call nz,ToDSS + ; ld a,(read_disk_info.full) and a ;ld de,MAIN_MSG.CRLF @@ -200,7 +264,9 @@ cmd_dir: push de ; ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" jp MESSAGE - ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + PRN_DISK_SIZE: call PRINT_5BYTES ld hl,SIZE_BUFFER.high ; "000 000 000 000" ld de,PRM5 ; and PRM6 ; куда @@ -212,7 +278,7 @@ Print_Header: ; %1 ld a,'"' ld (hl),a inc hl - ld a,(screen_path) ; диск + ld a,(screen_path) ; диск ; !TODO вот это заменить на вывод честного диска ld (hl),a inc hl ld a,'"' @@ -224,6 +290,8 @@ Print_Header: ; %1 ld hl,serial_string ; строка серийного номера диска ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем) + ; диск ; !TODO вот это заменить на вывод честного пути + ; пример вывода длинной строки пути есть в print_compath: ; %3 ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным ld de,PRM3 ; 16 буфер diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index 60bfa00..f8e889a 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -66,45 +66,9 @@ input_line: ; Вывод пути в ком-строке на экран + новая ширина поля ввода ;--------------------------------------------------------------- print_compath: - ; узнать длину сист. пути ld hl,system_path ; сист. путь - ld e,l - ld d,h - ld bc,max_len_comline ; 254 - xor a - ld (print_compath_flag),a ; сбр. флаг - cpir - dec hl - push hl ; сохр. конец пути - sbc hl,de - ld a,l ; длина строки - cp max_screen_path+1 ; 33 - jr c,print_compath__ - ; длина пути > 32 - ld a,max_screen_path ; 32 - ld (print_compath_flag),a ; уст. флаг -print_compath__: - ld c,a ; полная длина строки - ld b,0 - ex af,af' ; сохр. длину строки - pop hl ; восст. конец пути - ld de,screen_path+2 ; куда - ; скопировать строку - and a - sbc hl,bc ; hl=начало перекачки - ldir -print_compath_flag+1: - ld a,0 ; флаг переполн. строки - or a - jr z,print_compath1__ - ld hl,screen_path+2 - ld (hl),'\' - inc hl - ld a,"." - ld (hl),a - inc hl - ld (hl),a -print_compath1__: + ld de,screen_path+2 ; буфер для короткого пути + call make_short_path xor a ld (de),a ; зануление строки ex af,af' ; восст. длину строки @@ -164,7 +128,7 @@ print_inpline: push de ld (de),a inc de - djnz $-2 + djnz $-2 ; !FIXIT ld a,(iy+0) sub (iy+3) cp c @@ -203,6 +167,45 @@ print_inpline: prne1__:ld (cursor_position),a ; X полож. курсора на экране ret +; вход: HL - полный путь +; DE - буфер для короткой строки пути +make_short_path:; узнать длину сист. пути + ld (.bufferAddr),de + ld e,l + ld d,h + ld bc,max_len_comline ; 254 + xor a + ld (.flag),a ; сбр. флаг + cpir + dec hl + push hl ; сохр. конец пути + sbc hl,de + ld a,l ; длина строки + cp max_screen_path+1 ; 33 + jr c,.copy + ; длина пути > 32 + ld a,max_screen_path ; 32 + ld (.flag),a ; уст. флаг +.copy: ld c,a ; полная длина строки + ld b,0 + ex af,af' ; сохр. длину строки + pop hl ; восст. конец пути +.bufferAddr+1: ld de,0 ; куда + ; скопировать строку + and a + sbc hl,bc ; hl=начало перекачки + ldir +.flag+1: ld a,0 ; флаг переполн. строки + or a + ret z + ld hl,(.bufferAddr) + ld (hl),'\' + inc hl + ld a,"." + ld (hl),a + inc hl + ld (hl),a + ret ; Вывод строки по счетчику ;print_inpchar: @@ -988,24 +991,24 @@ screen_path: system_path: BLOCK 256,0 ;!HARDCODE -; 7 0 -; Структура строки ввода ~input line~ -struct_input_line: - db max_len_comline ;+0 254 макс. число ввод. символов - db 0 ;+1 флаг ReadyString - db 0 ;+2 X тек. полож. курсора в пределах строки - db 0 ;+3 X смещ. строки за левый край (в символах) - db 0 ;+4 число введенных символов - ds max_len_comline+1 ;+5 строка ввода +; ; 7 0 +; ; Структура строки ввода ~input line~ +; struct_input_line: +; db max_len_comline ;+0 254 макс. число ввод. символов +; db 0 ;+1 флаг ReadyString +; db 0 ;+2 X тек. полож. курсора в пределах строки +; db 0 ;+3 X смещ. строки за левый край (в символах) +; db 0 ;+4 число введенных символов +; BLOCK max_len_comline+1,0 ;+5 строка ввода -; 8 0 -; Буфер истории -history_buff: - BLOCK history_size,0 ; 256 +; ; 8 0 +; ; Буфер истории +; history_buff: +; BLOCK history_size,0 ; 256 -; 9 0 -; Рабочий буфер -work_buffer: - BLOCK 512,0 +; ; 9 0 +; ; Рабочий буфер +; work_buffer: +; BLOCK 512,0 //////////////////////////////////////////////////////////////////////// ; \ No newline at end of file diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 48aa538..440143f 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -71,7 +71,7 @@ COMP: call EVALCMD ; (batch.asm) ld hl,system_path ; буфер сист. пути ld c,Dss.ChDir ; уст. тек. путь RST ToDSS - jp nc,Get_Path ; Ok + jp nc,Get_Path ; Ok ENDIF ; diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 014d0ee..6092c8a 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -43,6 +43,7 @@ include 'shared_includes/constants/dss_equ.inc' include 'SHELL/version.inc' include 'shared_includes/structures/FileSystem.inc' + include 'SHELL/structures.inc' ; ; Program EQU section ;---------------------------------------------------------------------[] @@ -54,7 +55,7 @@ false EQU 0 Loader_length EQU 0 code_addr EQU shell program_start EQU shell -stack_point EQU #BFFE +stack_point EQU #C000 org_addr EQU #8000 + CLP_Buffer ;---------------------------------------------------------------------[] ; @@ -555,6 +556,33 @@ T8C24: db "OFF",0 include 'Commands/reboot.asm' ; софт ресет ; DISPLAY "Empty space for buffers from ",/H,$ + +CLEAR_ZONE: + +Buffers Struc_Buffers = $ + + + +; 7 0 +; Структура строки ввода ~input line~ +struct_input_line: + db max_len_comline ;+0 254 макс. число ввод. символов + db 0 ;+1 флаг ReadyString + db 0 ;+2 X тек. полож. курсора в пределах строки + db 0 ;+3 X смещ. строки за левый край (в символах) + db 0 ;+4 число введенных символов + BLOCK max_len_comline+1,0 ;+5 строка ввода + +; 8 0 +; Буфер истории +history_buff: + BLOCK history_size,0 ; 256 + +; 9 0 +; Рабочий буфер +work_buffer: + BLOCK 512,0 + work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes -; \ No newline at end of file +; diff --git a/SHELL/build.txt b/SHELL/build.txt index 55f04f2..6c8526a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -365 \ No newline at end of file +370 \ No newline at end of file diff --git a/SHELL/structures.inc b/SHELL/structures.inc new file mode 100644 index 0000000..1427b2d --- /dev/null +++ b/SHELL/structures.inc @@ -0,0 +1,25 @@ + STRUCT Input_Line +.max_Len BYTE 254 ;+0 254 макс. число ввод. символов +.ReadyString BYTE 0 ;+1 флаг ReadyString +.Cur_X BYTE 0 ;+2 X тек. полож. курсора в пределах строки +.Left_Shift BYTE 0 ;+3 X смещ. строки за левый край (в символах) +.Symbols_Num BYTE 0 ;+4 число введенных символов +.Path BLOCK max_len_comline+1,0 ;+5 строка ввода + ENDS + + STRUCT History +.cmds BLOCK history_size,0 ; 256 + ENDS + + STRUCT Work +.work_buffer BLOCK 512,0 +.work_buffer1 BLOCK 128,0 +.work_buffer2 BLOCK 256,0 +.free_buffer BLOCK 3840,0 + ENDS + + STRUCT Struc_Buffers +.input_line Input_Line +.history History +.work Work + ENDS From 9ad718d6b37d4e5e206df9cc899e060f07ed6fec Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 25 May 2024 03:17:00 +1000 Subject: [PATCH 134/219] =?UTF-8?q?SHELL:=20=D0=BF=D0=BE=D0=B4=D0=B2=D0=B8?= =?UTF-8?q?=D0=B3=D0=B0=D0=BB=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D1=8B;=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20DIR=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=20=D1=81=20=D0=BF=D1=83=D1=82=D1=8F=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SHELL/BATCH.ASM | 71 +++--- SHELL/Commands/CHDIR.ASM | 4 +- SHELL/Commands/CLS.ASM | 2 +- SHELL/Commands/DATE.ASM | 8 +- SHELL/Commands/DEL.ASM | 4 +- SHELL/Commands/DIR.ASM | 101 +++++--- SHELL/Commands/MKDIR.ASM | 4 +- SHELL/Commands/PATH.ASM | 4 +- SHELL/Commands/REN.ASM | 8 +- SHELL/Commands/RMDIR.ASM | 4 +- SHELL/Commands/SET.ASM | 4 +- SHELL/EDLINE.ASM | 461 ++++++++++++++++++------------------ SHELL/EXEC.ASM | 20 +- SHELL/Messages/main_txt.asm | 2 +- SHELL/SHELL.ASM | 112 +++++---- SHELL/build.txt | 2 +- SHELL/structures.inc | 16 +- 17 files changed, 427 insertions(+), 400 deletions(-) diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 09f0ddc..daa71d8 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -75,9 +75,9 @@ BATCH: ; push hl ; сохр. имя bat-файла - ld de,work_buffer ; 512 местный буфер + ld de,Buffers.work.buffer ; 512 местный буфер call copy_string ; скопир. строку (с нулем) - ld hl,work_buffer ; 512 местный буфер + ld hl,Buffers.work.buffer ; 512 местный буфер ld de,BAT_PRM_ARRAY ; таблица указат. на "ZERO".."NINE" ld b,BAT_PRM_ARRAY.TOTAL ; число слов "ZERO".."NINE" call MAKE_BATCH_PRM_ARRAY @@ -123,15 +123,15 @@ BATCH: ret ; [x] 11/12/23 вложенные bat .new_process: - ld de,work_buffer2 + ld de,Buffers.work.buffer2 call copy_string ; ld hl,.shell - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path call copy_string ; - ld hl,work_buffer2 - ld de,struct_input_line+5 + .shell.size - 1 + ld hl,Buffers.work.buffer2 + ld de,Buffers.input_line.Path + .shell.size - 1 call copy_string ; ; ld c,Dss.CurDisk @@ -139,7 +139,7 @@ BATCH: ; add a,'A' ; ld (.shell),a ; - ld hl,struct_input_line+5 + ld hl,Buffers.input_line.Path ld bc,Dss.Exec RST ToDSS ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat @@ -172,9 +172,9 @@ BATCH: NEWLINE: LD (cmd_break.sp),SP ; [x] 11/12/23 cmd_break ; - ld de,struct_input_line+5 ;!HARDCODE + ld de,Buffers.input_line.Path .ADDBAT: push de - call READBAT ; прочитать 128 байт из файла в "work_buffer1" + call READBAT ; прочитать 128 байт из файла в "Buffers.work.buffer1" pop de ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку jp c,cmd_break.exit @@ -182,11 +182,11 @@ NEWLINE: jr nz,.BATLINE ; ex de,hl - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path sbc hl,de jp z,cmd_break.exit; ;[x] убран баг с незакрытым BAT-файлом ld a,l - ld (struct_input_line+4),a ; длина строки + ld (Buffers.input_line.Symbols_Num),a ; длина строки call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat @@ -200,21 +200,21 @@ NEWLINE: ; ret ; .BATLINE: - ld hl,work_buffer1 -.loop: call MOVWORD ; скопир. work_buffer1 -> struct_input_line+5 + ld hl,Buffers.work.buffer1 +.loop: call MOVWORD ; скопир. Buffers.work.buffer1 -> Buffers.input_line.Path jr c,.ADDBAT ld a,b ld (MOVWORD.count),a ; осталось пропарсить прочитанных байтов push hl ex de,hl - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path sbc hl,de ld a,l - ld (struct_input_line+4),a ; длина строки + ld (Buffers.input_line.Symbols_Num),a ; длина строки call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path pop hl jr .loop @@ -255,7 +255,7 @@ MOVWORD: ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку RET C ;ld hl,BATBUFF ; 128 буфер (ccp.asm) "work_buffer1" - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld b,a ; число прочит. байт or a jr nz,.loop2 @@ -264,8 +264,7 @@ MOVWORD: ; прочитать 128 байт из файла READBAT: - ;ld hl,T99B9 ; 128 буфер под данные (ccp.asm) "work_buffer1" - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld de,128 ; сколько ld a,(BAT_FM) ; дескр. bat-файла ld c,Dss.Read ; чтение файла @@ -288,18 +287,18 @@ CMDMODE: call EVALCMD ; (batch.asm) ;ld ix,T96AC ; нужно?? закоментарил (inline.asm) ;ld hl,T96AE ;;256 буфер (inline.asm) - ld hl,struct_input_line+5 + ld hl,Buffers.input_line.Path ld a,(hl) cp "@" ; 40h jr nz,.A8240 dec hl - ;ld hl,struct_input_line+4;; + ;ld hl,Buffers.input_line.Symbols_Num;; dec (hl) jr z,.A825B ld c,(hl) ; длина строки inc hl ld b,0 - ;ld hl,work_buffer+256;; + ;ld hl,Buffers.work.buffer+256;; ld d,h ld e,l inc hl @@ -311,7 +310,7 @@ CMDMODE: jr z,.A825B ; off ; вывести сист. путь и строку содержимого bat-файла ;ld de,T96AE ;;256 буфер (inline.asm) - ;ld de,struct_input_line+5 + ;ld de,Buffers.input_line.Path ;call A95DE ; вывод экран. пути с ">" (inline.asm) ; вывести экран. путь и введ. команду ld c,BIOS.LP_GET_PLACE ; узнать полож. курсора @@ -322,8 +321,8 @@ CMDMODE: ld de,(YXpos) ; Y/X начало ком-строки ld c,Dss.Locate ; уст. полож. курсора RST ToDSS - ;ld hl,work_buffer+256;; - ld hl,struct_input_line+4 ; длина строки + ;ld hl,Buffers.work.buffer+256;; + ld hl,Buffers.input_line.Symbols_Num ; длина строки ld a,(hl) ld b,a inc hl ;+5 @@ -348,25 +347,25 @@ CMDMODE: ; ; ;ld a,(D96AD) ;; длина строки (inline.asm) - ;ld a,(struct_input_line+4);- + ;ld a,(Buffers.input_line.Symbols_Num);- ;or a ;ret z ;call newline ;jr A8264 ; .A825B: ;ld a,(D96AD) ;; длина строки (inline.asm) - ld a,(struct_input_line+4) + ld a,(Buffers.input_line.Symbols_Num) or a ret z ;A8264: ld hl,T96AE ;;256 буфер (inline.asm) - ;ld hl,struct_input_line+5 + ;ld hl,Buffers.input_line.Path ;dec hl ; убрать концевые пробелы строки - ld hl,struct_input_line+4 + ld hl,Buffers.input_line.Symbols_Num ld c,(hl) ; hl=длина строки (inline.asm) ld b,0 inc hl - ;ld hl,work_buffer+256;; + ;ld hl,Buffers.work.buffer+256;; .A826C: ld a,(hl) cp " " jr nz,.A8276 @@ -391,23 +390,23 @@ CMDMODE: ld c,a ; длина слова или строки ? ld hl,BATLIST ; команды bat + dos-команды ; - ; de=struct_input_line+5, c=длина строки (без конц. пробелов) + ; de=Buffers.input_line.Path, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл jp COMP.start ; должна убрать конц. пробелы и уст. длину строки, если урезалась EVALCMD: xor a - ld hl,struct_input_line+4 ;!HARDCODE + ld hl,Buffers.input_line.Symbols_Num ;!HARDCODE ld c,(hl) ld b,a inc hl add hl,bc ld (hl),a ; 0 в конец строки sbc hl,bc - ld de,work_buffer2 ; 256 буфер + ld de,Buffers.work.buffer2 ; 256 буфер call EVALSTR - ld hl,work_buffer2 ;work_buffer+256 - ld de,struct_input_line+5 ; куда + ld hl,Buffers.work.buffer2 ;work_buffer+256 + ld de,Buffers.input_line.Path ; куда ld bc,255 ;!HARDCODE .loop: ld a,(hl) ldi @@ -416,7 +415,7 @@ EVALCMD: xor a jr nz,.loop dec b ld a,b - ld (struct_input_line+4),a ; длина строки (edline.asm) + ld (Buffers.input_line.Symbols_Num),a ; длина строки (edline.asm) and a ret diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index 5a7a215..b1268e3 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -5,11 +5,11 @@ ;/////////////////////////////////////////////////// cmd_chdir: ex de,hl - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS xor a - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; cp (hl) jr nz,.chdir ld (hl),"." ; ".." родит. папка diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 66acef9..2fe52b7 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -7,7 +7,7 @@ ;/////////////////////////////////////////////////// cmd_cls: ex de,hl ; hl=ком-строка ;ld de,T9186 ; буфер под параметр - ld de,work_buffer1; + ld de,Buffers.work.buffer1; push de ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index 020b7a1..b09accc 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -9,10 +9,10 @@ ;/////////////////////////////////////////////////// cmd_date: ex de,hl ; hl=ком-строка - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld a,(de) or a jr z,.cmd_dt1 @@ -104,11 +104,11 @@ cmd_date: cmd_time: ex de,hl ;ld de,T9186 - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS ;ld de,T9186 - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld a,(de) or a jr z,cmd_tm1 diff --git a/SHELL/Commands/DEL.ASM b/SHELL/Commands/DEL.ASM index 25f16b6..f66a790 100644 --- a/SHELL/Commands/DEL.ASM +++ b/SHELL/Commands/DEL.ASM @@ -4,10 +4,10 @@ ; ;/////////////////////////////////////////////////// cmd_del: ex de,hl - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.Delete RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 736914e..2375026 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -7,7 +7,7 @@ cmd_dir: push de ;;;; [ ] поддержка параметров ; зануляем все параметры на старте xor a - ld (work_buffer2),a + ld (Buffers.work.buffer2),a ld (read_disk_info.full),a ld (.key_p),a ; выполняем/настраиваем все найденные параметры в строке @@ -38,43 +38,43 @@ cmd_dir: push de ld (S_HIGH),a ; ex de,hl - ld de,work_buffer1 + ld de,Buffers.work.buffer1 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ;!TODO тут в work_buffer1 лежит путь и/или/либо маска файла + ;!TODO тут в Buffers.work.buffer1 лежит путь и/или/либо маска файла ; надо разобрать её Dss.EX_Path выделить если есть диск, путь и маску, после чего уже ; отпечатывать путь в шапке, узнавать CurDisk как в .skip выше. Делать это до вызова ; процедуры read_disk_info. Лучше делать это после метки .skip ; - ld a,(work_buffer1) + ld a,(Buffers.work.buffer1) or a ;jr nz,.SkipMask ; задана маска имён jr z,.NoSkipMask ; не задана маска имён - ; сохранить текущий путь в work_buffer2 + ; сохранить текущий путь в Buffers.work.buffer2 ; Из буфера DE запомнить маску (первые справа символы после первого справа '\') и убрать её ; если маски нет и последний в строке '\', то потом добавить маску как в "; добавление маски" ; сделать CD в директорию из буфера DE ; make_short_path ; - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld bc,Dss.EX_Path.GET_ALL rst ToDSS ; and %00001100 ; имя диска и путь jr z,.SkipMask ; - ld hl,work_buffer2+2 + ld hl,Buffers.work.buffer2+2 ld c,Dss.CurDir rst ToDSS ld c,Dss.CurDisk rst ToDSS add a,"A" - ld (work_buffer2),a + ld (Buffers.work.buffer2),a ld a,":" - ld (work_buffer2+1),a + ld (Buffers.work.buffer2+1),a ; xor a - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld bc,256 cpir ;!FIXIT проверка на ошибку по флагу P/V @@ -95,12 +95,12 @@ cmd_dir: push de ld de,PRM1 call ncopy_string ; сохраняем маску файла ; - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld c,Dss.ChDir rst ToDSS ; ld hl,PRM1 - ld de,work_buffer1 + ld de,Buffers.work.free call ncopy_string ; восстанавливаем маску файла ; ld a,(PRM1) @@ -109,7 +109,7 @@ cmd_dir: push de ; ; добавление маски .NoSkipMask: ld hl,mask_fname ; "*.*" - ld de,work_buffer1 + ld de,Buffers.work.free call copy_string ; !TEST 23/05/24 .SkipMask: LD C,Dss.CurDisk ; узнать тек. диск @@ -118,8 +118,8 @@ cmd_dir: push de ; CALL Print_Header ; [ ] 01/10/23 - ld hl,work_buffer1 ; имя файла - ld de,work_buffer1 ; 80 буфер + ld hl,Buffers.work.free ; имя файла + ld de,Buffers.work.buffer1 ; 80 буфер ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) ld bc,Dss.F_First.FATname ; f_first (формат 11) RST ToDSS @@ -144,13 +144,13 @@ cmd_dir: push de ;ld (.key_p),a ; отменяем ESC .skip_esc: ld a,32-1 .skip_wait: PUSH AF - ld hl,work_buffer1+33 ; 80 + ld hl,Buffers.work.buffer1+33 ; 80 ;push af ;ld de,33 ;add hl,de call PRNNAME ; - ld ix,work_buffer1 ; 80 + ld ix,Buffers.work.buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and FAT_ATTR.DIRECTORY ; папка ? jr z,.Calc_Size ; нет @@ -201,7 +201,7 @@ cmd_dir: push de adc a,0 ld (S_HIGH),a ;exx -.next: ld de,work_buffer1 ; 80 буфер +.next: ld de,Buffers.work.buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS jp nc,.loop ; назад в цикл, если не конец списка @@ -242,7 +242,7 @@ cmd_dir: push de CALL MESSAGE ; вывести строку ; ; [ ] 23/05/2024 - ld hl,work_buffer2 + ld hl,Buffers.work.buffer2 ld c,Dss.ChDir ld a,(hl) or a @@ -278,7 +278,13 @@ Print_Header: ; %1 ld a,'"' ld (hl),a inc hl - ld a,(screen_path) ; диск ; !TODO вот это заменить на вывод честного диска + push hl + ; + ld c,Dss.CurDisk + rst ToDSS + add a,"A" + ; + pop hl ld (hl),a inc hl ld a,'"' @@ -290,12 +296,31 @@ Print_Header: ; %1 ld hl,serial_string ; строка серийного номера диска ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем) - ; диск ; !TODO вот это заменить на вывод честного пути - ; пример вывода длинной строки пути есть в print_compath: - ; %3 - ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным - ld de,PRM3 ; 16 буфер - CALL copy_string ; скопир. строку (с нулем) + ; %3..5 + ;push hl + ld hl,Buffers.work.free + 256 + 128 ; 128 - на всякий случай + ld c,Dss.CurDir + rst ToDSS + ld hl,PRM3 + ld a,(PRM1 + 1) + ld (hl),a + inc hl + ld (hl),':' + ; + ld hl,PRM3+2 + ld de,PRM3+2+1 + ld (hl),0 + ld bc,16+16+16-1-2 + ldir + ; + ld hl,Buffers.work.free + 256 + 128 ; сист. путь + ld de,PRM3 + 2 ;+PRM4..5 ; 2 + 48 байтов буфер + call make_short_path + ;pop hl + + ; ld hl,Buffers.screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным + ; ld de,PRM3 ;+PRM4 ; 32 байта буфер + ; CALL copy_string ; скопир. строку (с нулем) ; ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." JP MESSAGE ; вывести строку @@ -318,7 +343,7 @@ PRNNAME: dec hl ldi ldi ld (de),a - ld ix,work_buffer1 + ld ix,Buffers.work.buffer1 call PRNSIZE ; вывести в буфер имя файла и его размер (у папки ) call PRNDATE ; вывести в буфер дату файла/папки call PRNTIME ; вывести в буфер время файла/папки @@ -593,7 +618,7 @@ SIZE_BUFFER: db " " ; ; иная логика получения метки тома - сначала ищется в корневой директории, ; если там нет, то берётся из BPB read_disk_info: OR #80 - LD HL,work_buffer + LD HL,Buffers.work.buffer .full+1: LD B,0 LD C,Dss.DskInfo RST ToDSS @@ -681,7 +706,7 @@ read_disk_info: OR #80 .no_full_space_option: ; parse LD D,0 - LD HL,work_buffer + LD HL,Buffers.work.buffer ; тут в HL длина поля "Файловая система" LD E,(HL) ADD HL,DE @@ -723,14 +748,14 @@ read_disk_info: OR #80 ; поиск метки ;ld hl,mask_fname ; "*.*" имя метки ld hl,SlashMaskFname ; "\*.*" имя метки - ld de,work_buffer1 ; куда + ld de,Buffers.work.buffer1 ; куда ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома ld bc,Dss.F_First.FATname ; f_first, формат 11 RST ToDSS ;push af ;call restore_path ; восст. тек. путь ;pop af - ld hl,work_buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first + ld hl,Buffers.work.buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first jr nc,volume_label ; метка в корневом каталоге ; берём метку из BPB ; тут в HL длина поля "Метка диска" @@ -749,26 +774,26 @@ read_disk_info: OR #80 DJNZ .loop POP HL ; снимаем лишнее ; нет метки -.no_volume_label:; %4 +.no_volume_label:; %6 ld hl,volume_string_no ; строка - ld de,PRM4 ; куда + ld de,PRM6 ; куда call ncopy_string ; скопир. строку (с нулем) XOR A - LD (PRM5),A + LD (PRM7),A ret .good_label: POP HL PUSH HL ; толкаем лишнее ; есть метка volume_label: POP DE ; снимаем лишнее - ; %5 - ld de,PRM5 + ; %7 + ld de,PRM7 ld bc,11 ;!HARDCODE длина метки ldir xor a ld (de),a - ; %4 + ; %6 ld hl,volume_string_yes ; строка - ld de,PRM4 ; куда + ld de,PRM6 ; куда call ncopy_string ; скопир. строку (с нулем) ret ; diff --git a/SHELL/Commands/MKDIR.ASM b/SHELL/Commands/MKDIR.ASM index f55682a..a01c513 100644 --- a/SHELL/Commands/MKDIR.ASM +++ b/SHELL/Commands/MKDIR.ASM @@ -6,11 +6,11 @@ cmd_mkdir: ex de,hl ;ld de,T9186 ; буфер - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ;ld hl,T9186 ; имя папки - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.MkDir ; создать папку RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/PATH.ASM b/SHELL/Commands/PATH.ASM index 9f18de3..c7faa99 100644 --- a/SHELL/Commands/PATH.ASM +++ b/SHELL/Commands/PATH.ASM @@ -34,7 +34,7 @@ cmd_path: ; Показать системный путь A85B9: ;ld de,T9186 ; куда - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld hl,T858C ; имя переменной "PATH=" ld bc,Dss.Environ.Get ; получить переменную окружения RST ToDSS @@ -43,7 +43,7 @@ A85B9: ;ld de,T9186 ; ld c,Dss.PChars RST ToDSS ;ld hl,T9186 ; строка - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.PChars RST ToDSS jp newline diff --git a/SHELL/Commands/REN.ASM b/SHELL/Commands/REN.ASM index 454d88a..7df2136 100644 --- a/SHELL/Commands/REN.ASM +++ b/SHELL/Commands/REN.ASM @@ -6,17 +6,17 @@ cmd_rename: ex de,hl ;ld de,T9186 - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS ;ld de,T9206 - ld de,work_buffer+256; + ld de,Buffers.work.buffer+256; ld c,Dss.GSwitch RST ToDSS ;ld hl,T9186 ;ld de,T9206 - ld hl,work_buffer1; - ld de,work_buffer+256; + ld hl,Buffers.work.buffer1; + ld de,Buffers.work.buffer+256; ld c,Dss.Rename RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/RMDIR.ASM b/SHELL/Commands/RMDIR.ASM index 800231a..86ef838 100644 --- a/SHELL/Commands/RMDIR.ASM +++ b/SHELL/Commands/RMDIR.ASM @@ -6,11 +6,11 @@ cmd_rmdir: ex de,hl ;ld de,T9186 ; буфер - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ;ld hl,T9186 ; имя папки - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.RmDir ; удалить папку RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/SET.ASM b/SHELL/Commands/SET.ASM index 7034ad2..3eba9b9 100644 --- a/SHELL/Commands/SET.ASM +++ b/SHELL/Commands/SET.ASM @@ -21,11 +21,11 @@ cmd_set:ld a,(de) ; ; Показать системное окружение A85EE: ;ld hl,T9186 ; куда - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld bc,Dss.Environ.Read ; получить сист. окружение RST ToDSS ;ld hl,T9186 - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; A85F8: ld c,Dss.PChars RST ToDSS call newline diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index f8e889a..b3aac17 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -4,12 +4,12 @@ ; Функция строки редактирования. Имеет историю вводимых строк. ; Функция использует для своей работы временный буфер: ; -; work_buffer - этот буфер использует история -; ;work_buffer+256 - возвращается набранная строка +; Buffers.work.buffer - этот буфер использует история +; ;Buffers.work.buffer+256 - возвращается набранная строка ; ; Клавиши: ; Esc - сбросить текущую строку -; Enter - выход из функции (в work_buffer+256 готовая строка) +; Enter - выход из функции (в Buffers.work.buffer+256 готовая строка) ; Ins - смена режима ввода (вставка/замена) ; , курсор - прокрутка истории ; PageUp - в начало истории @@ -45,7 +45,7 @@ evCombKey equ 2 ; ; Строка редактирования ; ; Выход из строки по клавише , -; ;в work_buffer+256 = набранная строка (или пустая) +; ;в Buffers.work.buffer+256 = набранная строка (или пустая) ;=========================================================== input_line: ld a,1 @@ -66,8 +66,8 @@ input_line: ; Вывод пути в ком-строке на экран + новая ширина поля ввода ;--------------------------------------------------------------- print_compath: - ld hl,system_path ; сист. путь - ld de,screen_path+2 ; буфер для короткого пути + ld hl,Buffers.sys_path ; сист. путь + ld de,Buffers.screen_path+2 ; буфер для короткого пути call make_short_path xor a ld (de),a ; зануление строки @@ -91,7 +91,7 @@ print_compath: RST ToBIOS pop bc ; вывести экран. путь - ld hl,screen_path ; экран. путь + ld hl,Buffers.screen_path ; экран. путь ;call print_inpchar ; вывод строки по счетчику ld c,BIOS.LP_PRINT_LINE2 RST ToBIOS; @@ -103,68 +103,68 @@ print_compath: ; Вывод строки ~input line~ на экран ;------------------------------------------------- print_inpline: - ld de,(YXpos) ; Y/X начало ком-строки - ld c,Dss.Locate ; уст. курсор + ld de,(YXpos) ; Y/X начало ком-строки + ld c,Dss.Locate ; уст. курсор RST ToDSS - ld hl,struct_input_line ; структура буфера ~input line~ + ld hl,Buffers.input_line ; структура буфера ~input line~ push hl pop iy - ld a,(iy+3) ;+3 смещ. строки за левый край + ld a,(iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ; !FIXIT inc h inc hl inc hl inc hl inc hl inc hl - ld a,(width_inpline) ; ширина поля + ld a,(width_inpline) ; ширина поля ld c,a ld b,a push bc xor a - ld de,work_buffer ; врем. буфер + ld de,Buffers.work.buffer ; врем. буфер push de ld (de),a inc de - djnz $-2 ; !FIXIT - ld a,(iy+0) - sub (iy+3) + djnz $-2 ; !FIXIT + ld a,(iy + Input_Line.max_Len) + sub (iy + Input_Line.Left_Shift) cp c - jr nc,$+3 + jr nc,$+3 ; !FIXIT ld c,a - ld a,(iy+4) ; число введ. символов + ld a,(iy + Input_Line.Symbols_Num) ; число введ. символов sub c - jr nc,$+4 + jr nc,$+4 ; !FIXIT add a,c ld c,a pop de push de ld a,b or c - jr z,$+4 + jr z,$+4 ; !FIXIT ldir pop hl pop bc - ld a,b ; длина строки + ld a,b ; длина строки or a - ;call nz,print_inpchar ; вывод строки по счетчику + ;call nz,print_inpchar ; вывод строки по счетчику ld c,BIOS.LP_PRINT_LINE2 call nz,ToBIOS - ld a,(YXpos) ; X начало ком-строки - ld e,(iy+2) ;+2 тек. полож. курсора в строке + ld a,(YXpos) ; X начало ком-строки + ld e,(iy + Input_Line.Cur_X) ;+2 тек. полож. курсора в строке add a,e - cp width_inpline.MAX ; ширина экрана + cp width_inpline.MAX ; ширина экрана jr c,prne1__ ld b,width_inpline.MAX-1 sub b - ld d,a ; "наезд" за правый край + ld d,a ; "наезд" за правый край ld a,e sub d - ld (iy+2),a ;+2 новое полож. курсора + ld (iy + Input_Line.Cur_X),a ;+2 новое полож. курсора ld a,b -prne1__:ld (cursor_position),a ; X полож. курсора на экране +prne1__:ld (cursor_position),a ; X полож. курсора на экране ret ; вход: HL - полный путь @@ -257,11 +257,6 @@ handle_event_comb: ; поле событий what: ds 3 - - - - - step_scroll equ 1 ; шаг X скроллинга строки @@ -269,11 +264,11 @@ step_scroll equ 1 ; шаг X ; Обработчик событий ~Input Line~ ;================================================= event_input_line: - call handle_event ; читаем событие + call handle_event ; читаем событие ld hl,event_input_line push hl - ld iy,struct_input_line ; структура буфера ~input line~ - ld hl,what ; список событий + ld iy,Buffers.input_line ; структура буфера ~input line~ + ld hl,what ; список событий ld a,(hl) inc hl cp evKeyboard @@ -285,8 +280,8 @@ event_input_line: ; Enter: pop hl ; восст. баланс стека (выход из обработчика) xor a - ;ld (work_buffer+256),a ; задать пустую строку - ld hl,struct_input_line+4 ; число введ. символов + ;ld (Buffers.work.buffer+256),a ; задать пустую строку + ld hl,Buffers.input_line.Symbols_Num ; число введ. символов ld e,(hl) cp e ret z ; пустая строка @@ -309,12 +304,12 @@ Enter: pop hl ; ld a,b or a ret z ; были одни пробелы - ld de,struct_input_line+4 ; число введ. символов + ld de,Buffers.input_line.Symbols_Num ; число введ. символов ld (de),a ; новое число (для history_adding) ent1__: call history_adding ; добавить строку в history ; скопир. строку во врем. буфер -; ld hl,struct_input_line+4 ; откуда -; ld de,work_buffer+254 ; куда +; ld hl,Buffers.input_line.Symbols_Num ; откуда +; ld de,Buffers.work.buffer+254 ; куда ; ld a,(hl) ; скопир. строку (с нулем) ; ldi ; or a @@ -327,8 +322,8 @@ ent1__: call history_adding ; ; xor a ; ld (YXpos+1),a; ; восст. буфер -; ld hl,work_buffer+254 ; откуда -; ld de,struct_input_line+4 ; куда +; ld hl,Buffers.work.buffer+254 ; откуда +; ld de,Buffers.input_line.Symbols_Num ; куда ; ld a,(hl) ; скопир. строку (с нулем) ; ldi ; or a @@ -341,57 +336,57 @@ ent1__: call history_adding ; ; Событие - обычная клавиша EvComKeys: - ld a,(hl) ;+1 what - cp #1B ; Esc - jp z,clear_input_line ; очистить строку ввода - cp #0D ; Enter + ld a,(hl) ;+1 what + cp #1B ; Esc + jp z,clear_input_line ; очистить строку ввода + cp #0D ; Enter jr z,Enter - cp 8 ; Backspace + cp 8 ; Backspace jr z,inpline_work cp " " ret c inpline_work: ld de,input_line_done push de - ld hl,struct_input_line ; структура буфера ~input line~ + ld hl,Buffers.input_line ; структура буфера ~input line~ ex af,af' - res 7,(iy+1) ;+1 флаг ReadyString - ld a,(insert_mode) ; режим ввода: 1-inser, 0-overwrite + res 7,(iy + Input_Line.ReadyString) ;+1 флаг ReadyString + ld a,(insert_mode) ; режим ввода: 1-inser, 0-overwrite and 1 - rrca ; вправо (мл.бит -> перенос) - or (iy+1) - ld (iy+1),a ;+1 флаг ReadyString + rrca ; вправо (мл.бит -> перенос) + or (iy + Input_Line.ReadyString) + ld (iy + Input_Line.ReadyString),a ;+1 флаг ReadyString ex af,af' - cp 8 ; Backspace + cp 8 ; Backspace jp z,back_space ex af,af' - ld a,(iy+4) ; InputSymb - cp (iy+0) ; Max len + ld a,(iy + Input_Line.Symbols_Num) ; InputSymb + cp (iy + Input_Line.max_Len) jr nz,ILn___ - ld a,(iy+2) - add a,(iy+3) - cp (iy+0) + ld a,(iy + Input_Line.Cur_X) + add a,(iy + Input_Line.Left_Shift) + cp (iy + Input_Line.max_Len) ;ret nc JR NC,LastChar_BEEP - bit 7,(iy+1) + bit 7,(iy + Input_Line.ReadyString) ;ret nz JR NZ,NoMoreChars_BEEP -ILn___: ld a,(iy+4) - sub (iy+3) - sub (iy+2) +ILn___: ld a,(iy + Input_Line.Symbols_Num) + sub (iy + Input_Line.Left_Shift) + sub (iy + Input_Line.Cur_X) jr z,no_insert - dec (iy+4) - bit 7,(iy+1) + dec (iy + Input_Line.Symbols_Num) + bit 7,(iy + Input_Line.ReadyString) jr z,no_insert - inc (iy+4) + inc (iy + Input_Line.Symbols_Num) ; ввод в середину текста (вставка) ld c,a ld b,0 - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+4) ;+4 число введ. символов + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -403,12 +398,12 @@ ILn___: ld a,(iy+4) dec hl lddr no_insert: - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -416,17 +411,17 @@ no_insert: inc hl inc hl ex af,af' - ld (hl),a ; сохр. символ в строке - inc (iy+4) - inc (iy+2) - ld a,(width_inpline) ; ширина поля ввода - cp (iy+2) ; X тек. полож. курсора в пределах строки - jr nz,$+8 + ld (hl),a ; сохр. символ в строке + inc (iy + Input_Line.Symbols_Num) + inc (iy + Input_Line.Cur_X) + ld a,(width_inpline) ; ширина поля ввода + cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки + jr nz,$+8 ;!FIXIT ; курсор за полем - inc (iy+3) ; смещ. строки за левый край - dec (iy+2) ; X тек. полож. курсора в пределах строки - call print_inpline ; вывести строку на экран - pop de ; восст. баланс стека + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки + call print_inpline ; вывести строку на экран + pop de ; восст. баланс стека input_line_done: ret LastChar_BEEP: @@ -447,35 +442,35 @@ NoMoreChars_BEEP: ; Событие - курс. клавиши или комбинации EvComComb: - ld b,(hl) ;+1 what + ld b,(hl) ;+1 what inc hl - ld a,(hl) ;+2 what - ld hl,struct_input_line ; структура буфера ~input line~ - ld de,input_line_done ; точка выхода + ld a,(hl) ;+2 what + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld de,input_line_done ; точка выхода push de - cp #54 ; курсор влево + cp #54 ; курсор влево jr z,Left - cp #56 ; курсор вправо + cp #56 ; курсор вправо jr z,Right - cp #58 ; курсор вверх, пред. строка истории + cp #58 ; курсор вверх, пред. строка истории jp z,history_prev - cp #52 ; курсор вниз, след. строка истории + cp #52 ; курсор вниз, след. строка истории jp z,history_next - cp #59 ; PageUp, в начало истории + cp #59 ; PageUp, в начало истории jp z,history_begin - cp #53 ; PageDown, в конец истории + cp #53 ; PageDown, в конец истории jp z,history_last - cp #4F ; Del, удалить символ в тек. позиции + cp #4F ; Del, удалить символ в тек. позиции jp z,Delete - cp #57 ; Home, в начало строки + cp #57 ; Home, в начало строки jp z,Home - cp #51 ; End, в конец строки + cp #51 ; End, в конец строки jp z,End1 - cp #50 ; Ins, смена режима ввода + cp #50 ; Ins, смена режима ввода jr z,change_insert_mode - bit 5,b ; Ctrl бит + bit 5,b ; Ctrl бит jr z,.exit - cp #4F+#80 ; Ctrl+Del, очистить историю команд + cp #4F+#80 ; Ctrl+Del, очистить историю команд jp z,clear_history .exit: pop de ret @@ -488,52 +483,52 @@ change_insert_mode: ret ; Курсор влево -Left: ld a,(iy+2) +Left: ld a,(iy + Input_Line.Cur_X) dec a jp p,ComPrint - ld a,(iy+3) ; смещ. строки за левый край - sub step_scroll ; шаг скроллинга - ret c ; курсор в крайнем левом полож. - ld (iy+3),a ; X смещ. строки за левый край (в символах) - ld a,(iy+2) ; X полож. курсора в пределах строки - add a,step_scroll-1 ; шаг скроллинга + ld a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub step_scroll ; шаг скроллинга + ret c ; курсор в крайнем левом полож. + ld (iy + Input_Line.Left_Shift),a ; X смещ. строки за левый край (в символах) + ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + add a,step_scroll-1 ; шаг скроллинга ComPrint: - ld (iy+2),a - jp print_inpline ; вывести строку на экран + ld (iy + Input_Line.Cur_X),a + jp print_inpline ; вывести строку на экран ; Курсор вправо -Right: ld a,(iy+2) ; X полож. курсора в пределах строки - add a,(iy+3) ; смещ. строки за левый край - cp (iy+4) ; число введ. символов +Right: ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край + cp (iy+4) ; число введ. символов ret z - ld a,(width_inpline) ; ширина поля ввода + ld a,(width_inpline) ; ширина поля ввода ld b,a - ld a,(iy+2) ; X полож. курсора в пределах строки + ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки inc a cp b jr nz,ComPrint - inc (iy+3) ; смещ. строки за левый край - ld a,(iy+2) ; X полож. курсора в пределах строки - sub step_scroll-1 ; шаг скроллинга + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + sub step_scroll-1 ; шаг скроллинга jr ComPrint ; Backspace - удалить символ левее курсора back_space: - ld a,(iy+2) ; X тек. полож. курсора в строке + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке or a jr nz,back_space1 - ld a,(iy+3) ; смещ. строки за левый край - sub step_scroll ; шаг скроллинга + ld a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub step_scroll ; шаг скроллинга ret c - ld (iy+3),a - inc (iy+2) ;+2 тек. полож. курсора в строке + ld (iy + Input_Line.Left_Shift),a + inc (iy + Input_Line.Cur_X) ;+2 тек. полож. курсора в строке back_space1: - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ;+2 X тек. полож. курсора в строке - add a,(iy+3) ;+3 смещ. строки за левый край + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ;+2 X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -543,27 +538,27 @@ back_space1: ld d,h ld e,l dec de - ld a,(iy+4) ;+4 число введ. символов - sub (iy+3) ; смещ. строки за левый край - sub (iy+2) ; X полож. курсора в пределах строки - jr z,$+7 ; курсор за концом строки + ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов + sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub (iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + jr z,$+7 ; курсор за концом строки ;!FIXIT ld c,a ld b,0 - ldir ; обновить остаток строки + ldir ; обновить остаток строки xor a - ld (de),a ; в конец строки - dec (iy+2) ; X полож. курсора в пределах строки - dec (iy+4) ; число введ. символов - jp print_inpline ; вывести строку на экран + ld (de),a ; в конец строки + dec (iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + dec (iy + Input_Line.Symbols_Num) ; число введ. символов + jp print_inpline ; вывести строку на экран ; Delete - удалить символ в тек. позиции -Delete: ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке +Delete: ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке inc a - add a,(iy+3) ; смещ. строки за левый край + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -573,74 +568,74 @@ Delete: ld hl,struct_input_line ; ld d,h ld e,l dec de - ld a,(iy+4) ;+4 число введ. символов - sub (iy+3) ; смещ. строки за левый край - sub (iy+2) ; X тек. полож. курсора в строке - ret z ; курсор за концом строки + ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов + sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + ret z ; курсор за концом строки ld c,a ld b,0 - ldir ; обновить остаток строки + ldir ; обновить остаток строки xor a - ld (de),a ; в конец строки - dec (iy+4) ; число введ. символов - jp print_inpline ; вывести строку на экран + ld (de),a ; в конец строки + dec (iy + Input_Line.Symbols_Num) ; число введ. символов + jp print_inpline ; вывести строку на экран ; Home - в начало строки -Home: ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) ; смещ. строки за левый край +Home: ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край ret z - xor a ; X полож. курсора - ld (iy+2),a ; X полож. курсора в пределах строки - ld (iy+3),a ; смещ. строки за левый край - jp ComPrint ; вывести строку на экран + xor a ; X полож. курсора + ld (iy + Input_Line.Cur_X),a ; X полож. курсора в пределах строки + ld (iy + Input_Line.Left_Shift),a ; смещ. строки за левый край + jp ComPrint ; вывести строку на экран ; End - в конец строки -End1: ld a,(iy+4) ;+4 число введ. символов - sub (iy+3) ;+3 смещ. строки за левый край - cp (iy+2) ;+2 X тек. полож. курсора в строке +End1: ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов + sub (iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край + cp (iy + Input_Line.Cur_X) ;+2 X тек. полож. курсора в строке ret z - add a,(iy+3) ; смещ. строки за левый край + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край ld c,a - ld (iy+3),0 ; смещ. строки за левый край - ld a,(width_inpline) ; ширина поля ввода + ld (iy + Input_Line.Left_Shift),0 ; смещ. строки за левый край + ld a,(width_inpline) ; ширина поля ввода sub c jr z,EndLp jr nc,EndNIL neg -EndLp: inc (iy+3) ; X смещ. строки за левый край - sub step_scroll ; шаг скроллинга +EndLp: inc (iy + Input_Line.Left_Shift) ; X смещ. строки за левый край + sub step_scroll ; шаг скроллинга jr nc,EndLp -EndNIL: ld a,(iy+4) ; число введ. символов - sub (iy+3) ; смещ. строки за левый край - jp ComPrint ; вывести строку на экран +EndNIL: ld a,(iy + Input_Line.Symbols_Num) ; число введ. символов + sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + jp ComPrint ; вывести строку на экран ; Очистить буфер строки clear_input_line: - call clear_inpline ; очистить структуру ~input line~ - jp print_inpline ; вывести строку на экран + call clear_inpline ; очистить структуру ~input line~ + jp print_inpline ; вывести строку на экран ; очистить структуру ~input line~ clear_inpline: xor a - ld hl,struct_input_line ; структура буфера ~input line~ - ld b,(hl) ;+0 макс. длина строки - inc hl - ld (hl),a ;+1 сбр. флаг ReadyString - inc hl - ld (hl),a ;+2 X тек. полож. курсора в строке - inc hl - ld (hl),a ;+3 смещ. строки за левый край - inc hl - ld (hl),a ;+4 число введ. символов - cp b - ret z - inc hl ;+5 буфер редакт. строки - ld (hl),a - djnz $-2 + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld b,(hl) ;+0 макс. длина строки + inc hl + ld (hl),a ;+1 сбр. флаг ReadyString + inc hl + ld (hl),a ;+2 X тек. полож. курсора в строке + inc hl + ld (hl),a ;+3 смещ. строки за левый край + inc hl + ld (hl),a ;+4 число введ. символов + cp b + ret z + inc hl ;+5 буфер редакт. строки + ld (hl),a + djnz $-2 ;!FIXIT ret @@ -648,17 +643,17 @@ clear_inpline: ; Вставить строку из history-буфера ; вход: de=структура строки: +0=длина строки, +1=строка put_from_history: - call clear_inpline ; очистить строку ввода - ld a,(de) ;+0 длина строки + call clear_inpline ; очистить строку ввода + ld a,(de) ;+0 длина строки ld c,a put_history_loop: inc de - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -667,14 +662,14 @@ put_history_loop: inc hl ld a,(de) ld (hl),a - inc (iy+4) ; число введ. символов - inc (iy+2) ; X тек. полож. курсора в строке - ld a,(width_inpline) ; ширина поля ввода - cp (iy+2) ; X тек. полож. курсора в пределах строки - jr nz,$+8 + inc (iy + Input_Line.Symbols_Num) ; число введ. символов + inc (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + ld a,(width_inpline) ; ширина поля ввода + cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки + jr nz,$+8 ;!FIXIT ; курсор за правым краем поля ввода - inc (iy+3) ; смещ. строки за левый край - dec (iy+2) ; X тек. полож. курсора в пределах строки + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки dec c jr nz,put_history_loop ; вывести строку на экран @@ -684,11 +679,11 @@ put_history_loop: ; Очистить историю команд clear_history: - call clear_input_line ; очистить строку ~input line~ + call clear_input_line ; очистить строку ~input line~ xor a - ld (history_count),a ; число строк в history - ld (history_cur_string),a ; номер тек. строки history - ld hl,history_buff ; конец посл. строки + ld (history_count),a ; число строк в history + ld (history_cur_string),a ; номер тек. строки history + ld hl,Buffers.history ; конец посл. строки ld (history_end),hl ret @@ -702,13 +697,13 @@ clear_history: ;======================================================================== history_count: - db 0 ; число строк в истории + db 0 ; число строк в истории ; history_cur_string: - db 0 ; номер тек. строки истории + db 0 ; номер тек. строки истории ; history_end: - dw history_buff ; конец послед. строки истории + dw Buffers.history ; конец послед. строки истории @@ -718,10 +713,10 @@ history_end: history_begin: ld a,(history_count) or a - ret z ; нет строк + ret z ; нет строк xor a ld (history_cur_string),a - jr history_copy ; перейти на 1-ю строку + jr history_copy ; перейти на 1-ю строку ;------------------------------------------------- ; В конец истории @@ -729,9 +724,9 @@ history_begin: history_last: ld a,(history_count) or a - ret z ; нет строк - ld (history_cur_string),a ; уст. послед. пустую строку - jp clear_input_line ; вернуть пустую строку + ret z ; нет строк + ld (history_cur_string),a ; уст. послед. пустую строку + jp clear_input_line ; вернуть пустую строку ;------------------------------------------------- ; Следующая строка @@ -745,7 +740,7 @@ history_next: ld hl,history_cur_string ld a,(hl) cp b - jr c,$+7 + jr c,$+7 ;!FIXIT inc b ld (hl),b jp clear_input_line ; вернуть пустую строку @@ -767,7 +762,7 @@ history_prev: or a jr z,history_copy ; уперлись в начало истории cp b - jr c,$+3 + jr c,$+3 ;!FIXIT ld a,b dec a ld (hl),a @@ -780,14 +775,14 @@ history_copy: ; выход: de=строка (ее структура из history-буфера) history_index: ld b,0 - ld hl,history_buff ; буфер истории + ld hl,Buffers.history ; буфер истории or a ; индекс строки jr z,hist_index ; 1-я строка истории ld c,(hl) ; размер строки inc c add hl,bc ; на след. строку dec a - jr nz,$-4 + jr nz,$-4 ;!FIXIT hist_index: ex de,hl ret @@ -799,24 +794,24 @@ hist_index: ; тех пор, пока появится достаточно места для новой строки. ;----------------------------------------------------------- history_adding: - ld de,struct_input_line+4 ; структура строки - call history_compare ; сравнить строки - ret z ; уже есть такая строка - ld bc,(history_end) ; адрес конца посл. строки - ld hl,history_buff+history_size ; адрес конца буфера + ld de,Buffers.input_line.Symbols_Num ; структура строки + call history_compare ; сравнить строки + ret z ; уже есть такая строка + ld bc,(history_end) ; адрес конца посл. строки + ld hl,Buffers.history + history_size ; адрес конца буфера and a - sbc hl,bc ; hl=размер своб. места - ld a,(de) ; длина новой строки + sbc hl,bc ; hl=размер своб. места + ld a,(de) ; длина новой строки inc a ld c,a xor a ld b,a - sbc hl,bc ; умещ. в своб. месте буфера истории ? - jr nc,history_add_ok ; да + sbc hl,bc ; умещ. в своб. месте буфера истории ? + jr nc,history_add_ok ; да ; удалить первую (самую старую) строку из буфера ;push de - ld de,history_buff ; буфер истории - ld a,(de) ; длина 1-й строки + ld de,Buffers.history ; буфер истории + ld a,(de) ; длина 1-й строки inc a ld c,a xor a @@ -837,7 +832,7 @@ history_adding: ldir ld hl,history_count dec (hl) ; --число строк в history - ;pop de ; восст. адрес struct_input_line+4 + ;pop de ; восст. адрес Buffers.input_line.Symbols_Num jr history_adding ; history_add_ok: @@ -866,7 +861,7 @@ history_compare: ex af,af' xor a ; сбр. индекс сравн. строки ex af,af' - ld hl,history_buff ; буфер истории + ld hl,Buffers.history ; буфер истории history_comp_loop: push de ld (move_cur_str+1),hl ; тек. строка истории @@ -922,7 +917,7 @@ move_to_end_history: ; сохр. строку во врем. буфере move_cur_str: ld hl,0 ; тек. строка истории - ld de,work_buffer ; врем. буфер + ld de,Buffers.work.buffer ; врем. буфер ld c,(hl) ;+0 длина строки inc c ; учесть ячейку длины строки xor a @@ -944,7 +939,7 @@ move_cur_str: pop hl ; откуда ldir ; восст. строку из врем. буфера в конец истории - ld hl,work_buffer ; врем. буфер + ld hl,Buffers.work.buffer ; врем. буфер ld c,(hl) inc c ld b,a @@ -982,18 +977,18 @@ insert_mode: ; 5 0 ; экранный путь -screen_path: - db "A:" - BLOCK max_screen_path+1,0 ; 32+1 +; screen_path: +; db "A:" +; BLOCK max_screen_path+1,0 ; 32+1 ; 6 0 ; системный путь -system_path: - BLOCK 256,0 ;!HARDCODE +; system_path: +; BLOCK 256,0 ;!HARDCODE ; ; 7 0 ; ; Структура строки ввода ~input line~ -; struct_input_line: +; Buffers.input_line.: ; db max_len_comline ;+0 254 макс. число ввод. символов ; db 0 ;+1 флаг ReadyString ; db 0 ;+2 X тек. полож. курсора в пределах строки @@ -1008,7 +1003,7 @@ system_path: ; ; 9 0 ; ; Рабочий буфер -; work_buffer: +; Buffers.work.buffer: ; BLOCK 512,0 //////////////////////////////////////////////////////////////////////// ; \ No newline at end of file diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 440143f..0aa1bf9 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -7,11 +7,11 @@ SAVEHL: dw 0 ; Разбор и выполнение введенных команд и имен файлов ;------------------------------------------------------------- COMP: call EVALCMD ; (batch.asm) - ld hl,struct_input_line+5 + ld hl,Buffers.input_line.Path dec hl ld c,(hl) ; длина строки ld b,0 - inc hl ; struct_input_line+5 + inc hl ; Buffers.input_line.Path .loop: ld a,(hl) cp " " jr nz,.COMP01 @@ -42,7 +42,7 @@ COMP: call EVALCMD ; (batch.asm) .skip: ; Не дос-команды. Тест на задание диска и запуск файла ld h,d ld l,e - ; hl=struct_input_line+5 + ; hl=Buffers.input_line.Path ld b,(hl) ;+0 1-й символ inc hl ld c,(hl) ;+1 2-й символ @@ -65,10 +65,10 @@ COMP: call EVALCMD ; (batch.asm) jp c,print_err_message ; вывод сообщения ;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре - ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) + ;!TODO доставать Buffers.sys_path отдельно для каждого диска (или в ядре сделать?) ; тест на существование папки на целевом диске IFDEF MANY_SYS_PATHES - ld hl,system_path ; буфер сист. пути + ld hl,Buffers.sys_path ; буфер сист. пути ld c,Dss.ChDir ; уст. тек. путь RST ToDSS jp nc,Get_Path ; Ok @@ -76,7 +76,7 @@ COMP: call EVALCMD ; (batch.asm) ; ; уст. корень, нет такой папки на новом диске - ld hl,system_path+1 ; буфер сист. пути + ld hl,Buffers.sys_path + 1 ; буфер сист. пути ld (hl),0 dec hl ld (hl),'\' @@ -92,7 +92,7 @@ COMP: call EVALCMD ; (batch.asm) ; задан не диск RUN_EXT: ex de,hl ; восст. адрес начала строки - ld (SAVEHL),hl ; struct_input_line+5 + ld (SAVEHL),hl ; Buffers.input_line.Path ld de,EXTBF ; буфер ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS @@ -124,7 +124,7 @@ RUN_EXT: ex de,hl ; jr nz,EXEERR push hl ;ld a,(D96AD) ; длина строки (inline.asm) - ld a,(struct_input_line+4) ; длина строки + ld a,(Buffers.input_line.Symbols_Num) ; длина строки ld b,a .loop: ld a,(hl) cp " "+1 @@ -187,12 +187,12 @@ RESTORE_ALL: ;[x] 01/11/23 ;!TEST CALL Get_Path ; - LD A,(screen_path) + LD A,(Buffers.screen_path) SUB 'A' LD C,Dss.ChDisk RST ToDSS ; - LD HL,system_path + LD HL,Buffers.sys_path LD C,Dss.ChDir RST ToDSS ; diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 53d9244..8dd5dcd 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -31,7 +31,7 @@ MAIN_MSG: ; ; 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; - stN .DIR_1_ : db "Volume in drive %1 %4 %5\r\n" + stN .DIR_1_ : db "Volume in drive %1 %6 %7\r\n" db "Volume Serial Number is %2\r\n" DZ "\r\nDirectory of %3\r\n\n" stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 6092c8a..26809c2 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -56,6 +56,7 @@ Loader_length EQU 0 code_addr EQU shell program_start EQU shell stack_point EQU #C000 +stack_size EQU #100 org_addr EQU #8000 + CLP_Buffer ;---------------------------------------------------------------------[] ; @@ -91,15 +92,17 @@ org_addr EQU #8000 + CLP_Buffer ;============================================================== ; Точка входа в Шелл ;============================================================== -shell: - ;!TODO merge: активировать когда буферы будут через структуру, а не нулями - ;LD HL,WORK_BUFFERS - ;LD DE,WORK_BUFFERS+1 - ;LD BC,BUFFERS_STRUCT-1 - ;LD (HL),0 - ;LDIR +shell: ld hl,Buffers + ld de,Buffers+1 + ld (hl),0 + ld bc,Struc_Buffers-1 + ldir + ; + ld hl,":A" + ld (Buffers.screen_path),hl + ld a,max_len_comline + ld (Buffers.input_line),a ; - ; сохр. уровень тек. шелла ld a,(ix-1) ld (cmd_exit.TASKX),a @@ -155,8 +158,8 @@ back_to_parent_process: ;--------------------------------------------------------------- option_c: ;ld hl,T96AE ; имя bat-файла, 256 буфер (inline.asm) - ;ld hl,work_buffer+256;; - ld hl,struct_input_line+5 ; имя bat-файла + ;ld hl,Buffers.work.buffer+256;; + ld hl,Buffers.input_line.Path ; имя bat-файла call BATCH ; обработка bat-файла (batch.asm) ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat jr back_to_parent_process.saveA ; вернуться в родит. процесс @@ -187,7 +190,7 @@ run_shell_loop: run_shell_loop1: call input_line call newline ; на новую строку - ld a,(struct_input_line+4) ; число введ. символов + ld a,(Buffers.input_line.Symbols_Num) ; число введ. символов or a jr z,run_shell_loop1 ; пустая ; Парсинг и выполнение команд @@ -225,12 +228,12 @@ GET_CMD: dec hl cp '/' ; опция jr nz,.PROCESS - ld de,work_buffer1 ; 128 буфер для параметра + ld de,Buffers.work.buffer1 ; 128 буфер для параметра ld c,Dss.GSwitch ; выдел. параметр ком-строки RST ToDSS push af ex de,hl - ld hl,work_buffer1 ; 128 буфер для параметра + ld hl,Buffers.work.buffer1 ; 128 буфер для параметра inc hl call set_option_flag ; уст. биты флагов pop af @@ -239,18 +242,18 @@ GET_CMD: ; уст. бит-флаг .PROCESS: ld a,(RUNMODE) - set 6,a ; 6-й бит (вводились дополн. параметры) ;!HARDCODE + set 6,a ; 6-й бит (вводились дополн. параметры) ;!HARDCODE ld (RUNMODE),a ; скопир. параметр из ком-строки ; в буфер строки редактирования ;copy_to_input_line: - ld iy,struct_input_line ; структура буфера ~input line~ + ld iy,Buffers.input_line ; структура буфера ~input line~ push hl - call clear_inpline ; обнулить структуру "input line" - pop de ; de=хвост строки -.loop: ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) + call clear_inpline ; обнулить структуру "input line" + pop de ; de=хвост строки +.loop: ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) add a,l ld l,a jr nc,1F @@ -260,20 +263,20 @@ GET_CMD: inc hl inc hl inc hl - ld a,(de) ; символ из строки + ld a,(de) ; символ из строки ld (hl),a or a - ret z ; конец строки - inc (iy+4) ; число введ. символов - inc (iy+2) ; X тек. полож. курсора в строке - ld a,(width_inpline) ; ширина поля ввода - cp (iy+2) ; X тек. полож. курсора в пределах строки + ret z ; конец строки + inc (iy + Input_Line.Symbols_Num) ; число введ. символов + inc (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + ld a,(width_inpline) ; ширина поля ввода + cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки jr nz,2F ; курсор за правым краем поля ввода - inc (iy+3) ; смещ. строки за левый край - dec (iy+2) ; X тек. полож. курсора в пределах строки -2: ld a,(de) ; символ из строки - inc de ; продв. поток + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки +2: ld a,(de) ; символ из строки + inc de ; продв. поток cp " " jr nc,.loop ret @@ -315,21 +318,21 @@ setopt4: ld a,c ;GETPATH: Get_Path: ; узнать тек. каталог - ld hl,system_path ; 256 буфер сист. пути + ld hl,Buffers.sys_path ; 256 буфер сист. пути ld c,Dss.CurDir RST ToDSS .disk: ; узнать тек. диск ld c,Dss.CurDisk RST ToDSS add a,"A" - ld (screen_path),a ; 33 строка экранного пути + ld (Buffers.screen_path),a ; 33 строка экранного пути ret ;!FIXIT убрать лишние вызовы ; Восстановить тек. диск и путь (после ошибки) restore_disk_path: ; уст. тек. диск - ld a,(screen_path) ; 33 строка экранного пути + ld a,(Buffers.screen_path) ; 33 строка экранного пути sub "A" ld c,Dss.ChDisk RST ToDSS @@ -337,7 +340,7 @@ restore_disk_path: ;!FIXIT убрать лишние вызовы restore_path: ; уст. тек. каталог - ld hl,system_path ; 256 буфер сист. пути + ld hl,Buffers.sys_path ; 256 буфер сист. пути ld c,Dss.ChDir RST ToDSS ret @@ -556,33 +559,40 @@ T8C24: db "OFF",0 include 'Commands/reboot.asm' ; софт ресет ; DISPLAY "Empty space for buffers from ",/H,$ - -CLEAR_ZONE: + DISPLAY "Free space from ",/H,$ + Struc_Buffers + assert ($ + Struc_Buffers) < (stack_point - stack_size), "Buffers can leack to stack!" Buffers Struc_Buffers = $ - - +; 5 0 +; экранный путь +;screen_path: +; db "A:" +; BLOCK max_screen_path+1,0 ; 32+1 +; 6 0 +; системный путь +; system_path: +; BLOCK 256,0 ;!HARDCODE ; 7 0 ; Структура строки ввода ~input line~ -struct_input_line: - db max_len_comline ;+0 254 макс. число ввод. символов - db 0 ;+1 флаг ReadyString - db 0 ;+2 X тек. полож. курсора в пределах строки - db 0 ;+3 X смещ. строки за левый край (в символах) - db 0 ;+4 число введенных символов - BLOCK max_len_comline+1,0 ;+5 строка ввода +; struct_input_line: +; db max_len_comline ;+0 254 макс. число ввод. символов +; db 0 ;+1 флаг ReadyString +; db 0 ;+2 X тек. полож. курсора в пределах строки +; db 0 ;+3 X смещ. строки за левый край (в символах) +; db 0 ;+4 число введенных символов +; BLOCK max_len_comline+1,0 ;+5 строка ввода ; 8 0 ; Буфер истории -history_buff: - BLOCK history_size,0 ; 256 +; history_buff: +; BLOCK history_size,0 ; 256 ; 9 0 ; Рабочий буфер -work_buffer: - BLOCK 512,0 +; work_buffer: +; BLOCK 512,0 -work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes -work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes +; work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes +; work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 6c8526a..cbafdca 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -370 \ No newline at end of file +393 \ No newline at end of file diff --git a/SHELL/structures.inc b/SHELL/structures.inc index 1427b2d..1826213 100644 --- a/SHELL/structures.inc +++ b/SHELL/structures.inc @@ -7,19 +7,17 @@ .Path BLOCK max_len_comline+1,0 ;+5 строка ввода ENDS - STRUCT History -.cmds BLOCK history_size,0 ; 256 - ENDS - STRUCT Work -.work_buffer BLOCK 512,0 -.work_buffer1 BLOCK 128,0 -.work_buffer2 BLOCK 256,0 -.free_buffer BLOCK 3840,0 +.buffer BLOCK 512,0 +.buffer1 BLOCK 128,0 +.buffer2 BLOCK 256,0 +.free BLOCK 3840,0 ENDS STRUCT Struc_Buffers +.screen_path BLOCK 2 + max_screen_path + 1, 0 ; db "A:" : BLOCK max_screen_path+1,0 +.sys_path BLOCK 256,0 .input_line Input_Line -.history History +.history BLOCK history_size,0 ; 256 .work Work ENDS From 4b564101d163b3d4d60f92d22515e38f84381a04 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 29 May 2024 01:10:05 +1000 Subject: [PATCH 135/219] =?UTF-8?q?[Core]=20DISKINF:=20=20=D0=9C=D0=B5?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=B4=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D1=81=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=B0=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B5=D0=B2=D0=BE=D0=BC=20=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=D0=B3=D0=B5=20=D0=B8=20=D0=B5=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B0=D0=BC=20=D0=BD=D0=B5=D1=82,=20=D1=82?= =?UTF-8?q?=D0=BE=20=D0=B1=D0=B5=D1=80=D1=91=D1=82=D1=81=D1=8F=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BA=D0=B0=20=D0=B8=D0=B7=20BPB.=20[Shell]=20?= =?UTF-8?q?=D0=9C=D0=B5=D1=82=D0=BA=D0=B0=20=D0=B1=D0=B5=D1=80=D1=91=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20DISKINF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/diskINF.asm | 25 ++++++++++++++++---- SHELL/BATCH.ASM | 13 ++++------- SHELL/Commands/BREAK.ASM | 4 ---- SHELL/Commands/CLS.ASM | 2 +- SHELL/Commands/DIR.ASM | 48 ++++----------------------------------- SHELL/Commands/ECHO.ASM | 2 +- SHELL/EDLINE.ASM | 6 ++--- SHELL/Procedures/math.asm | 4 ++-- SHELL/SHELL.ASM | 28 +++++++++-------------- SHELL/build.txt | 2 +- 10 files changed, 49 insertions(+), 85 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 88ddc61..219ac33 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -31,6 +31,10 @@ ; BC - размер сектора в байтах ; CF=1: ; A - код ошибки, если CF=1 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Метка диска проверяется сначала в корневом каталоге и если там ; +; нет, то берётся метка из BPB ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;///////////////////////////////////////////////////////////////////// DISKINF: LD C,B LD B,1 @@ -76,8 +80,9 @@ DISKINF: LD C,B .next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP - ; !FIXIT если метка в BPB "NO NAME" или пробелы, то проверять метку в корневом каталоге. - LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + ; + ;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + CALL GET_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; fat32 @@ -226,6 +231,18 @@ GetFreeSpace: LD A,1 EXX JP .loop_free_space ; - FAT_STRING: DB 'FAT12' -; \ No newline at end of file +; +; DE - буфер +GET_LABEL: PUSH DE + LD HL,.LABEL_MASK ; "\*.*" имя метки + LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома + LD BC,Dss.F_First.FATname ; f_first, формат 11 + RST ToDSS + POP DE + LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + RET C + LD HL,BUFFER_FIND.REC_Name + ADD HL,DE + RET +.LABEL_MASK: DB '\*.*',0 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index daa71d8..4392518 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -134,11 +134,6 @@ BATCH: ld de,Buffers.input_line.Path + .shell.size - 1 call copy_string ; - ; ld c,Dss.CurDisk - ; rst ToDSS - ; add a,'A' - ; ld (.shell),a - ; ld hl,Buffers.input_line.Path ld bc,Dss.Exec RST ToDSS @@ -161,10 +156,10 @@ BATCH: .shell.size EQU $ - .shell ;!TODO -.ErrorEnv: DB 'ERRORLEVEL=' -.ErrorEnv.Code: DB 'xxx',0 -.ErrorEnv.Size EQU $ - .ErrorEnv - ; + ; .ErrorEnv: DB 'ERRORLEVEL=' + ; .ErrorEnv.Code: DB 'xxx',0 + ; .ErrorEnv.Size EQU $ - .ErrorEnv +; ;--------------------------------------------------- ; Выполнение команд BAT-файла diff --git a/SHELL/Commands/BREAK.ASM b/SHELL/Commands/BREAK.ASM index 673fcec..55e7b69 100644 --- a/SHELL/Commands/BREAK.ASM +++ b/SHELL/Commands/BREAK.ASM @@ -1,9 +1,5 @@ ; [x] 11/12/23 cmd_break: - ; pop hl ; восстановление баланса стека - ; pop hl ; восстановление баланса стека - ; XOR A - ; ld (MOVWORD.count),a .sp+1: LD SP,0 ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat .exit: ld a,(BAT_FM) ; дескр. bat-файла diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 2fe52b7..11e9c0c 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -54,7 +54,7 @@ ascii2byte: cp "0" ret c cp "9"+1 - jr c,$+10 + jr c,$+10 ;!FIXIT $ and 5Fh cp "F"+1 ccf diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 2375026..f1fcd6a 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -1,7 +1,6 @@ ;/////////////////////////////////////////////////// ; ; DIR. Вывод списка файлов и папок -; !TODO убрать баг если в параметре маски указан путь до папки или даже до другого диска ;/////////////////////////////////////////////////// cmd_dir: push de ;;;; [ ] поддержка параметров @@ -22,7 +21,7 @@ cmd_dir: push de jr z,.skip LD DE,MAIN_MSG.CALCULATING CALL MESSAGE - ;!TEST 23/05/24 + ; 23/05/24 .skip: ;LD C,Dss.CurDisk ; узнать тек. диск ;RST ToDSS ;CALL read_disk_info ; прочитать метку и серийный номер диска @@ -41,21 +40,11 @@ cmd_dir: push de ld de,Buffers.work.buffer1 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ;!TODO тут в Buffers.work.buffer1 лежит путь и/или/либо маска файла - ; надо разобрать её Dss.EX_Path выделить если есть диск, путь и маску, после чего уже - ; отпечатывать путь в шапке, узнавать CurDisk как в .skip выше. Делать это до вызова - ; процедуры read_disk_info. Лучше делать это после метки .skip ; ld a,(Buffers.work.buffer1) or a ;jr nz,.SkipMask ; задана маска имён jr z,.NoSkipMask ; не задана маска имён - ; сохранить текущий путь в Buffers.work.buffer2 - ; Из буфера DE запомнить маску (первые справа символы после первого справа '\') и убрать её - ; если маски нет и последний в строке '\', то потом добавить маску как в "; добавление маски" - ; сделать CD в директорию из буфера DE - ; make_short_path - ; ld hl,Buffers.work.buffer1 ld bc,Dss.EX_Path.GET_ALL rst ToDSS @@ -111,7 +100,7 @@ cmd_dir: push de .NoSkipMask: ld hl,mask_fname ; "*.*" ld de,Buffers.work.free call copy_string - ; !TEST 23/05/24 + ; 23/05/24 .SkipMask: LD C,Dss.CurDisk ; узнать тек. диск RST ToDSS CALL read_disk_info ; прочитать метку и серийный номер диска @@ -409,8 +398,6 @@ PRNSIZE: ld a,(ix+32) .PRZ: ld de,PRM3 ; 16 буфер jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. - - ; Скопировать в буфер дату файла/папки PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE) ld b,(ix+FAT_DIRECTORY_RECORD.DATE+1) @@ -419,10 +406,6 @@ PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE) ld (hl),0 ld hl,SIZE_BUFFER.low ; "0 000 000 000" ld de,PRM4 ; 16 куда - ; ld a,(hl) - ; cp "0" - ; jr nz,$+4 - ; ld (hl)," " jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер время файла/папки @@ -433,10 +416,6 @@ PRNTIME: ld b,(ix+22) ld (hl),0 ld hl,SIZE_BUFFER.low ; "0 000 000 000" ld de,PRM5 ; 80 буфер строки - ; ld a,(hl) - ; cp "0" - ; jr nz,$+4 - ; ld (hl)," " jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; в буфер время файла/папки @@ -740,26 +719,9 @@ read_disk_info: OR #80 LD L,(HL) LD H,A call hex16 -.get_label: ; ищем метку в корне ФС раздела - ; уст. корень диска - ; ld hl,root_path ; "x:\",0 - ; ld c,Dss.ChDir - ; RST ToDSS - ; поиск метки - ;ld hl,mask_fname ; "*.*" имя метки - ld hl,SlashMaskFname ; "\*.*" имя метки - ld de,Buffers.work.buffer1 ; куда - ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома - ld bc,Dss.F_First.FATname ; f_first, формат 11 - RST ToDSS - ;push af - ;call restore_path ; восст. тек. путь - ;pop af - ld hl,Buffers.work.buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first - jr nc,volume_label ; метка в корневом каталоге - ; берём метку из BPB - ; тут в HL длина поля "Метка диска" - POP hl + ; +.get_label: ; тут в HL длина поля "Метка диска" + POP HL LD A,(HL) INC HL AND A diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 5828524..7fc3418 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -33,7 +33,7 @@ A8623: ld c,Dss.PChars A862E: ld a,(echo_mode) ; флаг echo-режима or a ld de,7 ; индекс "on" - jr nz,$+5 ; false + jr nz,$+5 ; false ;!FIXIT $ ld de,MAIN_MSG.OFF ; индекс "off" call FMESAGE ; найти строку по индексу ld de,PRM1 ; куда (аргумент %1) diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index b3aac17..e22a51a 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -295,10 +295,10 @@ Enter: pop hl ; ; убрать конц. пробелы ком-строки ld a,(hl) cp c - jr nz,$+8 + jr nz,$+8 ;!FIXIT $ dec hl dec (iy+4) ; --число введ. символов - djnz $-8 + djnz $-8 ;!FIXIT $ inc hl ld (hl),d ; в конец ком-строки ld a,b @@ -894,7 +894,7 @@ hist_comp_loop: hist_comp_notequal: inc hl dec c - jr nz,$-2 ; до конца строки + jr nz,$-2 ; до конца строки ;!FIXIT $ hist_comp_next: pop de ex af,af' diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm index 1809cf1..21ff29d 100644 --- a/SHELL/Procedures/math.asm +++ b/SHELL/Procedures/math.asm @@ -60,10 +60,10 @@ hex2dec_ascii_16bit: and a inc a sbc hl,bc - jr nc,$-3 + jr nc,$-3 ;!FIXIT $ add hl,bc cp "0" - jr z,$+6 + jr z,$+6 ;!FIXIT $ set 7,(ix+0) bit 7,(ix+0) ret z diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 26809c2..3e0f8b4 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -290,8 +290,8 @@ set_option_flag: cp "a" jr c,setopt1 cp "z"+1 - jr nc,$+4 - and 5Fh ; a..z -> A..Z + jr nc,$+4 ;!FIXIT $ + and #5F ; a..z -> A..Z setopt1: cp "P" ; запуск шелла с отраб. autoexec.bat jr nz,setopt2 set 7,c @@ -310,10 +310,6 @@ setopt4: ld a,c ret - - - -;!TODO проверить 4 нижеидущие процедуры когда в DSS будут нормально пути запоминаться ; Сохранить тек. диск и путь ;GETPATH: Get_Path: @@ -328,31 +324,29 @@ Get_Path: ld (Buffers.screen_path),a ; 33 строка экранного пути ret - ;!FIXIT убрать лишние вызовы + ; Восстановить тек. диск и путь (после ошибки) + IFUSED restore_disk_path + ASSERT restore_path restore_disk_path: ; уст. тек. диск ld a,(Buffers.screen_path) ; 33 строка экранного пути sub "A" ld c,Dss.ChDisk RST ToDSS + ENDIF - ;!FIXIT убрать лишние вызовы + IFUSED restore_path restore_path: ; уст. тек. каталог ld hl,Buffers.sys_path ; 256 буфер сист. пути ld c,Dss.ChDir - RST ToDSS + JP ToDSS ret + ENDIF +; -; на новую строку ;!FIXIT сделать через .PChars -; newline: ld a,_cc.cr -; ld c,Dss.PutChar -; rst ToDSS -; ld a,_cc.lf -; ld c,Dss.PutChar -; jp ToDSS newline: push hl ld hl,MAIN_MSG.TABLE+1 ; "CR,LF,0" ld c,Dss.PChars @@ -387,7 +381,7 @@ ncopy_string: ldi ret po or a - jr nz,$-5 + jr nz,$-5 ;!FIXIT $ ret ; Скопир. строку (с нулем) diff --git a/SHELL/build.txt b/SHELL/build.txt index cbafdca..50b04df 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -393 \ No newline at end of file +402 \ No newline at end of file From 83bfcf7cdde1b3f3cd7c43f8fba6162dfbfbc31b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 2 Jun 2024 18:43:36 +1000 Subject: [PATCH 136/219] BOOT: bug fixes --- BOOT/DSSBOOT.ASM | 1129 ++++++++++++++++++++++++++---------- BOOT/boot.asm | 2 +- DSS/FS/FAT/FAT.asm | 6 +- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- SHELL/Commands/DATE.ASM | 4 +- SHELL/Commands/DIR.ASM | 16 +- SHELL/Commands/ECHO.ASM | 2 +- SHELL/Commands/HELP.ASM | 2 +- SHELL/Commands/PAUSE.ASM | 2 +- SHELL/Commands/VER.ASM | 2 +- SHELL/Procedures/Print.ASM | 4 +- 12 files changed, 850 insertions(+), 323 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index c8113e3..e37d201 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -12,6 +12,7 @@ ; + Initial revision 09 Nov 1998 + ; +------------------------------+ +; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление. DEFINE ORIGINAL_DSS 0 DEFINE UNIVERSAL_BOOT 1 @@ -37,22 +38,140 @@ DRIVE: _mSYSID LD HL,FAIL PUSH HL ; - LD A,INCORR - ;JR C,FAIL - RET C + LD HL,MESSAGES.INCORR + RET C ; goto FAIL LD A,(DRIVE) BIT 7,A - JR Z,GOOD_DRIVE + JP Z,GOOD_DRIVE EX DE,HL LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка SBC HL,DE - LD A,INCORR - ;JR C,FAIL - RET C + LD HL,MESSAGES.INCORR + RET C ; goto FAIL + JP GOOD_DRIVE +//////////////////////////////////////////////////////////////////////// +FAIL: CALL MESSAGE +.NULL: LD HL,MESSAGES.FAILURE + CALL MESSAGE + DI + HALT + JR $ +; + +; +; DOSMESS: CALL FMESAGE +; LD C,Dss.PChars +; RST ToDSS +; RET +; + +; +; FMESAGE: LD HL,MSG0 +; LD BC,MSGE-MSG0 +; INC A +; EX AF,AF' +; XOR A +; EX AF,AF' +; .NEXTMSG: EX AF,AF' +; CPIR +; RET PO +; RET NZ +; EX AF,AF' +; DEC A +; JR NZ,.NEXTMSG +; RET +; + +; +MESSAGE: ;CALL FMESAGE + ;R01 Start + XOR A + OUT (SYS_PORT.ON),A +.loop: LD A,(HL) ;R01 + INC HL + OR A + RET Z + CALL PRINTX + JR .loop +; +PRINTX: CP "\r" ; + JR Z,.CR_ + CP "\n" ; + JR Z,.LF_ + LD BC,1*256 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 + RET + ; +.CR_: LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 + LD E,0 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS_18 + RET + ; +.LF_: LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 + LD A,#1F + CP D + JR NZ,.LF2 + PUSH DE + PUSH HL + LD DE,#0020 + LD BC,1*256 + BIOS.LP_SCROLL_UD + RST ToBIOS_18 + LD DE,#1F00 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS_18 + LD A," " + LD BC,#50 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 + POP HL + POP DE + DEC D +.LF2: INC D + LD C,BIOS.LP_SET_PLACE + RST ToBIOS_18 + RET ;R01 +;R01 End + +; FAILURE EQU 0 +; INCORR EQU 1 +; ERRPART EQU 2 +; ERRIBPB EQU 3 +; NO_SYS EQU 4 +; NOSHELL EQU 5 +; STARTDO EQU 6 +;a BIOS version that is incompatible with this version of DOS + +MESSAGES:; 0 10 20 30 40 50 60 70 80 +.FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0 +.INCORR: DB "\r\nUnsupported BIOS version! Update BIOS to run this version of DSS.\r\n",0 +.ERRPART: DB "\r\nUnknown partition table.",0 +.ERRIBPB: DB "\r\nInvalid BOOT sector.",0 +.NO_SYS: DB "\r\nCan't open file SYSTEM.DOS...",0 +.NOSHELL: DB "\r\nCan't open file SYSTEM.EXE...",0 +.STARTDO: DB "\r\nStarting DSS... \r\n\n",0 +; +SHELL_NAME: DB '\SYSTEM.EXE /P',0 +ROOT: DB 'X:\',0 +CORE_NAME: DB "SYSTEM DOS" +.Size EQU $-CORE_NAME +FATMSG: DB "FAT" +//////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////// + ASSERT $<#8200, "Error!!! BIOS LOADING ONLY FIRST #200 BYTES" +//////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////// GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 - LD BC,2*256 + BIOS.DRV_READ + LD BC,2*256 + BIOS.DRV_READ ;!HARDCODE дозагрузка ещё двух секторов загрузчика LD A,(DRIVE) RST ToBIOS_18 JP C,FAIL.NULL @@ -72,13 +191,11 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE OUT (SLOT0),A ; CALL GET_BPB ;READ BPB - LD A,ERRIBPB - ;JP C,FAIL - RET C + LD HL,MESSAGES.ERRIBPB + RET C ; goto FAIL CALL GETROOT - LD A,NO_SYS - ;JP C,FAIL - RET C + LD HL,MESSAGES.NO_SYS + RET C ; goto FAIL ; [ ] загрузка system.dos больше #4000 байтов LD HL,(FSIZE1) LD A,H @@ -109,16 +226,16 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD (LOAD_CORE.max_sectors),A LD (BIG_CORE),A ; теперь это счётчик оставшихся секторов ; - LD A,(BOOT.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов JP NC,INC_SECTOR_NUM - CALL C,R_F_FAT ; next cluster in chain + CALL R_F_FAT ; next cluster in chain EX DE,HL LD DE,#C000 CALL NC,LOAD_CORE .no_big_core: ; RUN_CORE: DI - XOR A + XOR A OUT (SYS_PORT.OFF),A ; LD A,#10 @@ -132,7 +249,7 @@ RUN_CORE: DI ; LD A,(BANKDOS) ; OUT (SLOT0),A ;DOS LOADED - IF UNIVERSAL_BOOT + ;IF UNIVERSAL_BOOT ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,(DRIVE+1) ; номер раздела LD L,A @@ -140,36 +257,39 @@ RUN_CORE: DI LD A,(DRIVE) ; номер устройства LD C,Dss.Version RST ToDSS - JP C,XFAIL.fail + JP C,FAIL.NULL ; - LD A,STARTDO - CALL DOSMESS + LD HL,MESSAGES.STARTDO + CALL MESSAGE + ; + XOR A + OUT (SYS_PORT.OFF),A ; LD A,(DRIVE) LD BC,Dss.BootDSK.Set RST ToDSS ; LD BC,Dss.BootDSK.Get - ELSE - IF ORIGINAL_DSS - LD C,Dss.Version - RST ToDSS - ELSE - LD A,(DRIVE) - LD C,Dss.Version - RST ToDSS - jp c,XFAIL.fail - LD C,Dss.BootDSK - ENDIF ; - LD A,STARTDO - CALL DOSMESS - IF ORIGINAL_DSS - LD A,(DRIVE) - LD BC,Dss.BootDSK.Set - RST ToDSS - LD BС,Dss.BootDSK.Get - ENDIF - ENDIF + ;ELSE + ; IF ORIGINAL_DSS + ; LD C,Dss.Version + ; RST ToDSS + ; ELSE + ; LD A,(DRIVE) + ; LD C,Dss.Version + ; RST ToDSS + ; JP C,FAIL.NULL + ; LD C,Dss.BootDSK + ; ENDIF ; + ; LD HL,MESSAGES.STARTDO + ; CALL MESSAGE + ; IF ORIGINAL_DSS + ; LD A,(DRIVE) + ; LD BC,Dss.BootDSK.Set + ; RST ToDSS + ; LD BС,Dss.BootDSK.Get + ; ENDIF + ;ENDIF ; RST ToDSS ; @@ -180,17 +300,28 @@ RUN_CORE: DI LD C,Dss.ChDir RST ToDSS ; - LD HL,PSHELL + LD HL,SHELL_NAME LD BC,Dss.Exec RST ToDSS -.NoShell: LD A,NOSHELL - ;JP XFAIL -XFAIL: CALL DOSMESS -.fail: LD A,FAILURE - CALL DOSMESS - DI - HALT -.halt: JR .halt + +.NoShell: JP NC,FAIL.NULL + LD HL,MESSAGES.NOSHELL + CP DSS_Error.sys.UNEXPECTED_APP_TRMN + JP NZ,FAIL + JP FAIL.NULL + +; .NoShell: LD HL,MESSAGES.NOSHELL +; JP C,FAIL +; LD HL,MESSAGES.FAILURE +; JP FAIL + + +; XFAIL: CALL DOSMESS +; .fail: LD HL,MESSAGES.FAILURE +; CALL DOSMESS +; DI +; HALT +; .halt: JR .halt ; ; @@ -202,38 +333,79 @@ INC_SECTOR_NUM: PUSH DE INC HL .no_inc: ; POP DE - CALL .set_stack - JP RUN_CORE -.set_stack: PUSH HL + LD BC,RUN_CORE + PUSH BC + PUSH HL JP LOAD_CORE.subload + +; CALL .set_stack +; JP RUN_CORE +; .set_stack: PUSH HL +; JP LOAD_CORE.subload ; ; PART_TB: PUSH BC - LD HL,(BOOT+510) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 - AND A + ;AND A + ; CF = 0 SBC HL,DE - JR NZ,.ERRP - LD IX,BOOT+#01BE - LD B,4 ;!HARDCODE счетчик записей партиций в MBR -.DOSAGA: LD A,(IX+4) - CP PartitionSysTypes.FAT16_LBA - JR Z,YEPDOS - CP PartitionSysTypes.FAT16 - JR Z,YEPDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,YEPDOS - CP PartitionSysTypes.FAT12 - JR Z,YEPDOS -.next: LD DE,#10 + SCF + RET NZ + LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE + LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) + ; +.part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) + ; ЕСЛИ добавится поддержка ещё одного типа ФС, то поменять 1 на 2 + ; 1 + CP PartitionSysTypes.FAT16_LBA + JR Z,YEPDOS + CP PartitionSysTypes.FAT16 + JR Z,YEPDOS + CP PartitionSysTypes.FAT16_32Mb + JR Z,YEPDOS + CP PartitionSysTypes.FAT12 + JR Z,YEPDOS + CP PartitionSysTypes.FAT32 + JR Z,YEPDOS + CP PartitionSysTypes.FAT32_LBA + JR Z,YEPDOS + ; + ; 2 + ;EXX + ;LD HL,SUPPORTED_PARTITIONS + ;LD BC,SUPPORTED_PARTITIONS.Size + ;CPIR + ;EXX + ;JR Z,YEPDOS + ; +.next: LD DE,_sMBR_PARTITION_RECORD ADD IX,DE - DJNZ .DOSAGA -.ERRP: LD A,ERRPART + DJNZ .part_loop + ; + LD HL,MESSAGES.ERRPART JP FAIL +; 2 + ; SUPPORTED_PARTITIONS: + ; ;.Empty DB #00 + ; .FAT12 DB #01 + ; .FAT16_32Mb DB #04 + ; ;.Extended DB #05 + ; .FAT16 DB #06 + ; ;.HPFS_NTFS DB #07 + ; .FAT32 DB #0B + ; .FAT32_LBA DB #0C + ; .FAT16_LBA DB #0E + ; ;.Win_Ext_LBA DB #0F + ; ;.Linux_swap DB #82 + ; ;.Linux DB #83 + ; ;.Linux_extended DB #85 + ; .Size EQU $-SUPPORTED_PARTITIONS ; -; + + YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,#80 CP (IX+0) @@ -246,12 +418,12 @@ YEPDOS: ;[ ] 17.12.2023 LD D,(IX+09) LD L,(IX+10) LD H,(IX+11) - LD XH,D - LD XL,E + PUSH DE + POP IX LD (DISKL),IX LD (DISKH),HL LD A,(DRIVE) - LD DE,BOOT + LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ RST ToBIOS_18 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого @@ -264,26 +436,12 @@ YEPDOS: ;[ ] 17.12.2023 RET ; -; -SET_PRM: PUSH BC - LD A,B - LD C,BIOS.DRV_GET_PAR - RST ToBIOS_18 - LD A,(BOOT.SectorsPerTrack) - LD L,A - POP AF - PUSH AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS_18 - POP BC - LD A,C - RET -; -; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +;/* GET_BPB: LD IX,#0000 LD HL,#0000 - LD DE,BOOT + LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 @@ -301,31 +459,47 @@ GET_BPB: LD IX,#0000 ; .NX1: CP #00 JR NZ,.NX2 - CALL SET_PRM ;FDD -.NX2: LD HL,(BOOT+510) + ; + ; SET_PRM if FDD + PUSH BC + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS_18 + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) + LD L,A + POP AF + ;PUSH AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS_18 + ;POP BC + ;LD A,C ; нахера? + ;RET + +.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 AND A SBC HL,DE SCF RET NZ - LD IY,BOOT ;Analysing Block Parametr BIOS + ; + LD IY,BOOT_BUFFER ;Analysing Block Parametr BIOS LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) CP #F0 RET C LD HL,0 ;calc. first sector FAT - LD (DIR_FRH),HL + LD (FatBuffer.RootDirFirstSector_H),HL ; LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) ADD HL,DE - LD (FAT_FRM),HL ;first sector FAT + LD (FatBuffer.FAT1_SEC_L),HL ;first sector FAT LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) - LD A,(BOOT.Number_of_FATs) ;amount FATs + LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ;amount FATs .C_DATA1: ADD HL,DE DEC A JR NZ,.C_DATA1 - LD (DIR_FRM),HL ;first sector DIR + LD (FatBuffer.RootDirFirstSector_L),HL ;first sector DIR EX DE,HL LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) @@ -336,21 +510,21 @@ GET_BPB: LD IX,#0000 ADD HL,HL LD A,H SRL A - LD (DIR_S_S),A ;Sectors per dir + LD (FatBuffer.DirSizeInSectors),A ;Sectors per dir LD L,A LD H,0 ADD HL,DE - LD (DAT_FRM),HL ;First sector data + LD (FatBuffer.FirstDataSector_L),HL ;First sector data ; LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) LD HL,0 - LD A,(BOOT.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) .NEXTAD3: ADD HL,BC ;calc. cluster size DEC A JR NZ,.NEXTAD3 - LD (CLU_LEN),HL - LD HL,BOOT.ID_FAT + LD (FatBuffer.BytesPerCluster),HL + LD HL,BOOT_BUFFER + BOOT_SECTOR.ID_FAT LD DE,FATMSG LD B,3 .R_BPBL1: LD A,(DE) @@ -368,29 +542,29 @@ GET_BPB: LD IX,#0000 RET NZ LD A,(HL) CP "6" ; FAT16 - LD HL,#FFFF + ;LD HL,#FFFF JR Z,.BPB_FAT CP "2" ; FAT12 SCF RET NZ - LD HL,#0FFF -.BPB_FAT: LD (FAT_TYP),A - LD (ENDCLUS),HL + ;LD HL,#0FFF +.BPB_FAT: LD (FatBuffer.FAT_TYPE),A + ;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ; LD IX,(DISKL) LD HL,(DISKH) - LD DE,(FAT_FRM) + LD DE,(FatBuffer.FAT1_SEC_L) LD BC,#0000 ADD IX,DE ADC HL,BC ;HL:IX - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER LD BC,3*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 RET C LD HL,0 - LD (FatCache),HL + LD (FatBuffer.CacheBlock),HL XOR A RET ; @@ -404,14 +578,470 @@ GET_BPB: LD IX,#0000 LD A,"2" LD HL,#0FFF JR .BPB_FAT +;*/ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +GET_BPB: LD IX,#0000 + LD HL,#0000 + LD DE,BOOT_BUFFER + LD BC,1*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + RET C + LD A,(DRIVE) + LD B,A + AND #F0 + LD C,A + CP #80 + JR NZ,.NX1 + CALL PART_TB ;HDD + RET C + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD (DRIVE+1),HL + ; +.NX1: CP #00 + JR NZ,.NX2 + ; + ; SET_PRM if FDD + PUSH BC + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS_18 + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) + LD L,A + POP AF + ;PUSH AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS_18 + ;POP BC + ;LD A,C ; нахера? + ;RET + +.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) + LD DE,#AA55 + AND A + SBC HL,DE + SCF + RET NZ + ; +;RD_BPB: ; CALL READ_BPB + ; JP C,DOS_X_Error.Not_ready + ; ; + ; LD DE,#AA55 ; сигнатура ;R05 + ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + ; ;R05 + ; AND A + ; SBC HL,DE + ; JP NZ,DOS_X_Error.UnknownBPB + ; + ; ;R08 ; [x] fat32 + ; LD HL,BOOT_BUFFER + ; LD DE,CORE_BUFFERS.BootSector + ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size + ; LDIR + ; + LD A,(BOOT_BUFFER + BOOT_SECTOR.DRIVE_TYPE) + CP #F0 + RET C + ; + ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + ; LD (FatBuffer.BytesPerSector),HL + ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + ; LD (FatBuffer.SectorsPerCluster),A + ; calc. first sector FAT + LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) + LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + ;LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ; fat32 + XOR A + LD B,A + LD C,A + 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.SectorsPerFAT_H),A ; fat32 + ; + ; + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) + LD A,E + OR D + JR NZ,.skip_high + ; + LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,C + LD (FatBuffer.SectorsPerFAT_H),A + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) +.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE + LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs + LD (FatBuffer.Number_Of_FATs),A + CP 1 + JR Z,.one_FAT + DEC A + ADD HL,DE + LD (FatBuffer.FAT2_SEC_L),HL + JR NC,.no_inc_BC + INC BC +.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC +.one_FAT: ;C_DATA1 +.loop1: ADD HL,DE + JR NC,.loop1_1 + INC BC +.loop1_1: DEC A + JR NZ,.loop1 + ; + LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + + ;LD BC,(FatBuffer.BytesPerSector) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD A,B + AND A + ; + RL C + RLA + RL C + RLA + RL C + RLA + ; + LD C,A + LD B,0 ; BC - File handels in sectors + ;;;; + IF COMPILE_UNUSED_CODE + LD (FatBuffer.FilesPerSector),A + ENDIF + ; + EX DE,HL + LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 + ; fat32 + LD A,H + OR L + JR Z,.skip_loop2 + ; + DEC HL + XOR A + ;NEXTAD2 +.loop2: INC A + RET C + SBC HL,BC + JR NC,.loop2 + ; +.skip_loop2: EX DE,HL + LD C,A ; A - sectors in DIR + LD B,0 + LD (FatBuffer.DirSizeInSectors),A + + ADD HL,BC ; Start DATA area + LD (FatBuffer.FirstDataSector_L),HL + ; B = 0 + ; + ;LD HL,(FatBuffer.BytesPerSector) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + ;LD A,(FatBuffer.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + ;!TODO FATcacheSize + ; calc. cluster size + XOR 1 + JR Z,.loop3.end + RRA +.loop3: ADD HL,HL + RRA + JP NC,.loop3 +.loop3.end: ; + LD (FatBuffer.BytesPerCluster),HL + ; fat32 + LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) + LD DE,(FatBuffer.FirstDataSector_L) + LD A,H + OR L + JP NZ,.HDDSMAL + ; + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low + AND A + SBC HL,DE + JP NC,.HDDBIG + DEC BC + JP .HDDBIG + ; +.HDDSMAL: ; CF = 0 + LD BC,0 + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low + SBC HL,DE + ; +.HDDBIG: CALL SectorToCluster +; LD A,(FatBuffer.SectorsPerCluster) +; 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 A,L + OR H + JR NZ,.no_inc_bc + INC BC +.no_inc_bc: LD (FatBuffer.MaxClusterHigh),BC + ; + XOR A + LD H,A + LD L,A + LD (FatBuffer.CacheBlock),HL + LD (FatBuffer.CacheUpdated),A + ; A = 0 + LD HL,(FatBuffer.SectorsPerFAT_H) + LD H,A + EX DE,HL + LD HL,(FatBuffer.SectorsPerFAT_L) + ; DE:HL = SectorsPerFAT + ; + LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) + LD B,A + DEC A + JR Z,.loop_mul_end + ; .Number_of_FATs * .SectorsPerFAT +.loop_mul: ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + DJNZ .loop_mul +.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD B,0 + LD A,(FatBuffer.DirSizeInSectors) + LD C,A + ADD HL,BC + JR NC,.no_inc_DE + INC DE +.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD BC,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) + ADD HL,BC + JR NC,.no_inc_de + INC DE +.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT) + AND A + LD B,D + LD C,E + POP DE ; Total Sectors low + EX DE,HL + SBC HL,DE + EX (SP),HL ; Total Sectors high + SBC HL,BC + POP DE ; Total Sectors low + ; HL:DE = DataSec + ; + ;LD A,(FatBuffer.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + ; выясняем разрядность FAT + LD A,D + OR E + JR NZ,.its_FAT32 + ; + LD HL,4084 + SBC HL,BC + JR NC,.its_FAT12 + ; + LD HL,65525 + SBC HL,BC + JR C,.its_FAT32 + ; + ; It's FAT16 + LD HL,#FFFF + LD A,FAT_TYPE.x16 +.set_vars: EXX + LD HL,0 + LD (FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (FatBuffer.RootDirStartCluster_L),HL + LD (FatBuffer.RootDirStartCluster_H),HL + LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT.LABEL + EXX + LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) + JR .SET_VARS + ; +.its_FAT12: LD HL,#0FFF + LD A,FAT_TYPE.x12 + JR .set_vars + ; +.its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber) + CP #80 + JR C,.mirrored_FATs ;если все копии FAT используются + ; используется только одна копия FAT + LD HL,(FatBuffer.FAT1_SEC_H) + LD DE,(FatBuffer.SectorsPerFAT_H) + LD D,0 + EXX + LD HL,(FatBuffer.FAT1_SEC_L) + LD DE,(FatBuffer.SectorsPerFAT_L) + AND #0F + JR Z,.first_FAT_active + LD B,A + ; +.fat_calc_loop: ADD HL,DE + EXX + ADC HL,DE + EXX + DJNZ .fat_calc_loop + ; +.first_FAT_active: + LD (FatBuffer.FAT1_SEC_L),HL + LD (FatBuffer.FAT2_SEC_L),HL + EXX + LD (FatBuffer.FAT1_SEC_H),HL + LD (FatBuffer.FAT2_SEC_H),HL + ; +.mirrored_FATs: ; + LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT32.LABEL + ; + EXX + LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) + LD (FatBuffer.RootDirStartCluster_L),HL + LD BC,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (FatBuffer.RootDirStartCluster_H),BC + ; + CALL CLUSTER_TO_SECTOR + LD (FatBuffer.RootDirFirstSector_L),HL + LD (FatBuffer.RootDirFirstSector_H),BC + ; + LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) + LD (FatBuffer.FSINFO_Sector),HL + ; + LD A,FAT_TYPE.x32 + LD HL,#0FFF + LD (FatBuffer.END_CHAIN_CLUSTER_H),HL + LD H,L + LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) + ; +.SET_VARS: LD (FatBuffer.FAT_TYPE),A + LD (FatBuffer.END_CHAIN_CLUSTER_L),HL + LD (FatBuffer.BPB_SERIAL_NUMBER),DE + LD (FatBuffer.BPB_SERIAL_NUMBER+2),BC + EXX + LD DE,FatBuffer.BPB_LABEL + LD BC,11 ;!HARDCODE + LDIR + ; + SET_PAGE_X FATPAGE + PUSH AF + LD DE,0 + CALL READ_FAT_TABLE + POP AF + 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 + ; +.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 - Cluster +SectorToCluster: + LD A,B + AND #0F + LD B,A + ;LD A,(FatBuffer.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + SCF +.loop: RRA + RET C + RR B + RR C + RR H + RR L + JP .loop ; +*/ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; поиск system.dos -GETROOT: LD HL,(DIR_FRH) - LD IX,(DIR_FRL) +GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) + LD IX,(FatBuffer.RootDirFirstSector_L) LD BC,(DISKL) LD DE,(DISKH) - LD A,(DIR_S_S) + LD A,(FatBuffer.DirSizeInSectors) .NEXTSEC: PUSH AF ADD IX,BC ADC HL,DE @@ -439,38 +1069,43 @@ GETROOT: LD HL,(DIR_FRH) ; SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 - LD IX,DIR - FAT_DIRECTORY_RECORD + LD IX, DIR - FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD ADD IX,DE DEC C RET Z - LD A,(IX+00) + ; + LD A,(IX+FAT_DIRECTORY_RECORD.NAME) OR A SCF RET Z + ; CP #E5 JR Z,.SKIPNAM - LD A,(IX+11) - AND #10 + ; + LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + AND FAT_ATTR.DIRECTORY JR NZ,.SKIPNAM - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 -.SEARCH2: LD A,(DE) + ; + LD DE,CORE_NAME + PUSH IX + POP HL + LD B,CORE_NAME.Size + ; +.loop: LD A,(DE) CP (HL) JR NZ,.SKIPNAM INC HL INC DE - DJNZ .SEARCH2 - LD D,XH - LD E,XL - LD HL,HANDBUF - EX DE,HL + DJNZ .loop + ; + PUSH IX + POP HL + LD DE,HANDBUF LD BC,FAT_DIRECTORY_RECORD LDIR - XOR A - INC A + ; ZF = 1, CF = 0, A != 0 + AND A ; на выходе ZF = CF = 0 RET ; ; HL - CLUSTER @@ -480,7 +1115,7 @@ LOAD_CORE: LD (READMEM),DE .loop: PUSH HL CALL NSECTOR LD DE,(READMEM) - LD A,(BOOT.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) .max_sectors+1: CP #20 JR C,.SMALL_CLUSTER ; @@ -492,7 +1127,7 @@ LOAD_CORE: LD (READMEM),DE LD A,(DRIVE) RST ToBIOS_18 POP HL - AND A + ;AND A RET ; .SMALL_CLUSTER: LD B,A @@ -503,7 +1138,7 @@ LOAD_CORE: LD (READMEM),DE RST ToBIOS_18 ; LD HL,(READMEM) - LD DE,(CLU_LEN) + LD DE,(FatBuffer.BytesPerCluster) ADD HL,DE LD (READMEM),HL POP HL @@ -527,7 +1162,7 @@ LOAD_CORE: LD (READMEM),DE ; .LD_FILE: PUSH HL ; system.dos first cluster ; CALL NSECTOR ; Cluster to Sector ; LD DE,(READMEM) -; LD A,(BOOT.SectorsPerCluster) +; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ; CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов ; LD C,BIOS.DRV_READ_LONG ; JR C,.SMALL_CLUSTER @@ -594,12 +1229,12 @@ LOAD_CORE: LD (READMEM),DE ; LD (BANKDOS),A ; LD HL,#C000 ; LD (READMEM),HL -; LD A,(BOOT.SectorsPerCluster) +; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ; SUB SUBLOAD_SIZE + 1 ; CCF ; RET NC ; LD A,SUBLOAD_SIZE -; LD (BOOT.SectorsPerCluster),A +; LD (BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster),A ; AND A ; RET @@ -611,7 +1246,7 @@ LOAD_CORE: LD (READMEM),DE NSECTOR: LD DE,0 DEC HL DEC HL - LD A,(BOOT.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -623,9 +1258,9 @@ NSECTOR: LD DE,0 JP NC,.loop ; .skip: EX DE,HL - LD XL,E - LD XH,D - LD DE,(DAT_FRM) ;first data sector + PUSH DE + POP IX + LD DE,(FatBuffer.FirstDataSector_L) ;first data sector XOR A ADD IX,DE LD D,A @@ -642,28 +1277,29 @@ NSECTOR: LD DE,0 ; HL - CLUSTER ; DE - (CLUSTER) R_F_FAT: PUSH HL - LD A,(FAT_TYP) + LD A,(FatBuffer.FAT_TYPE) 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 +.R_F_00H: INC A ; HL - CLUSTER ; [ ] fat32 тут счётчик в 32 бита нужен или 16, если страницу FF использовать 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 + LD BC,(FatBuffer.CacheBlock) ; A - ELEMENT OF CASH CP C CALL NZ,RE_FAT - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,#FFEF - XOR A + ; +.exit: XOR A SBC HL,DE POP HL RET @@ -676,7 +1312,7 @@ R_F_FAT: PUSH HL RR L PUSH AF EX DE,HL - LD HL,(BOOT.BytesPerSector) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD B,H LD C,L ADD HL,HL @@ -688,10 +1324,10 @@ R_F_FAT: PUSH HL JP NC,.R_F_00 ADD HL,DE DEC A - LD BC,(FatCache) + LD BC,(FatBuffer.CacheBlock) CP C CALL NZ,RE_FAT - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER ADD HL,DE POP AF LD E,(HL) @@ -701,7 +1337,7 @@ R_F_FAT: PUSH HL LD A,D AND #0F LD D,A - JP .R_F_F02 + JR .R_F_F02 ; .R_F_F01: LD A,E AND #F0 @@ -714,24 +1350,26 @@ R_F_FAT: PUSH HL RR D RRA LD E,A + ; .R_F_F02: LD HL,#0FEF - XOR A - SBC HL,DE - POP HL - RET + JR .exit + ; XOR A + ; SBC HL,DE + ; POP HL + ; RET ; ; RE_FAT: PUSH HL LD L,A LD H,0 - LD (FatCache),HL + LD (FatBuffer.CacheBlock),HL LD E,L LD D,H ADD HL,HL ADD HL,DE LD IX,0 - LD DE,(FAT_FRM) + LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE EX DE,HL JR NC,.NOINX @@ -747,7 +1385,7 @@ RE_FAT: PUSH HL PUSH DE POP IX POP HL - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER LD BC,3*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 @@ -755,158 +1393,47 @@ RE_FAT: PUSH HL RET ; -//////////////////////////////////////////////////////////////////////// -FAIL: CALL MESSAGE -.NULL: LD A,FAILURE - CALL MESSAGE - DI - HALT - JR $ -; - -; -DOSMESS: CALL FMESAGE - LD C,Dss.PChars - JP ToDSS -; - -; -FMESAGE: LD HL,MSG0 - LD BC,MSGE-MSG0 - INC A - EX AF,AF' - XOR A - EX AF,AF' -.NEXTMSG: EX AF,AF' - CPIR - RET PO - RET NZ - EX AF,AF' - DEC A - JR NZ,.NEXTMSG - RET -; - -; -MESSAGE: CALL FMESAGE - ;R01 Start -PRINTZ: LD A,(HL) ;R01 - INC HL - OR A - RET Z - CALL PRINTX - JR PRINTZ -; - -; -PRINTX: CP #0D - JR Z,.CR_ - CP #0A - JR Z,.LF_ - LD BC,1*256 + BIOS.LP_PRINT_SYM - RST ToBIOS_18 - RET -.CR_: LD C,BIOS.LP_GET_PLACE - RST ToBIOS_18 - LD E,0 - LD C,#84 - JP ToBIOS_18 - ;RET - ; -.LF_: LD C,BIOS.LP_GET_PLACE - RST ToBIOS_18 - LD A,#1F - CP D - JR NZ,.LF2 - PUSH DE - PUSH HL - LD DE,#0020 - LD BC,1*256 + BIOS.LP_SCROLL_UD - RST ToBIOS_18 - LD DE,#1F00 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS_18 - LD A," " - LD BC,#50 + BIOS.LP_PRINT_SYM - RST ToBIOS_18 - POP HL - POP DE - DEC D -.LF2: INC D - LD C,BIOS.LP_SET_PLACE - JP ToBIOS_18 - ;RET ;R01 -;R01 End - -FAILURE EQU 0 -INCORR EQU 1 -ERRPART EQU 2 -ERRIBPB EQU 3 -NO_SYS EQU 4 -NOSHELL EQU 5 -STARTDO EQU 6 -;a BIOS version that is incompatible with this version of DOS -; 0 10 20 30 40 50 60 70 80 -MSG0: DB 0 - DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0 - DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10 - DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0 - DB "Invalid partition table.",13,10,0 - DB "Invalid BOOT sector.",13,10,0 - DB "Can't open file SYSTEM.DOS...",13,10,0 - DB 13,10,"Starting DSS... ",13,10,13,10,0 -MSGE: DB 0 -; -PSHELL: DB '\SYSTEM.EXE /P',0 -ROOT: DB 'X:\',0 -MASKARE: DB "SYSTEM DOS" -FATMSG: DB "FAT" -//////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////// ; Area for boot sector [512Bytes] -BOOT _sBOOT_SECTOR_PARAMS = $ - -; BOOT EQU $ -; ID_NAME EQU BOOT+#03 ; +03 DOS NAME -; ; Block Parameters BIOS -; B_P_S EQU BOOT+#0B ; +0B BYTE PER SECTOR -; S_P_C EQU BOOT+#0D ; +0D SECTORS PER CLUSTER -; RESERVE EQU BOOT+#0E ; +0E RESERVE SECTORS -; FAT_NUM EQU BOOT+#10 ; +10 AMOUNT FATS -; F_P_DIR EQU BOOT+#11 ; +11 FILES IN DIRECTORY -; S_P_D EQU BOOT+#13 ; +13 ALL SECTORS ON DISK -; ID_FORM EQU BOOT+#15 ; +15 ID FORMAT -; S_P_F EQU BOOT+#16 ; +16 SIZE FAT IN SECTORS -; S_P_T EQU BOOT+#18 ; +18 SECTOR PER TRACK -; HEADS EQU BOOT+#1A ; +1A AMOUNT SIDES -; HIDDEN EQU BOOT+#1C ; +1C HIDDEN SECTORS -; ID_FAT EQU BOOT+#36 ; +36 FAT ID -; ; end boot sector +;BOOT _sBOOT_SECTOR_PARAMS = $ +BOOT_BUFFER EQU $ +DIR EQU BOOT_BUFFER+512 +; +FAT_SECTORS_BUFFER EQU DIR+512 +VALUE EQU 3*512+FAT_SECTORS_BUFFER +; +FatBuffer EQU VALUE +.CacheBlock EQU FatBuffer+0 ; FatCache +.FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT +.RootDirFirstSector_H EQU FatBuffer+4 ; DIR_FRH MSD_CAT_SEC first sector DIR +.RootDirFirstSector_L EQU FatBuffer+6 ; DIR_FRL MSD_CAT_SEC first sector DIR +.DirSizeInSectors EQU FatBuffer+8 ; DIR_S_S DIR_SEC_SIZE +.FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC +.FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) +.BytesPerCluster EQU FatBuffer+12; CLU_LEN +;.END_CHAIN_CLUSTER_L EQU FatBuffer+14; ENDCLUS -DIR EQU BOOT+512 -FAT EQU DIR+512 +; FatCache EQU VALUE+0 ; .CacheBlock +; FAT_FRM EQU FatCache+2 ; .FAT1_SEC_L MSD_FAT_SEC first sector FAT +; DIR_FRH EQU FatCache+4 ; .RootDirFirstSector_H MSD_CAT_SEC first sector DIR +; DIR_FRL EQU FatCache+6 ; .RootDirFirstSector_L MSD_CAT_SEC first sector DIR +; DIR_S_S EQU FatCache+8 ; .DirSizeInSectors DIR_SEC_SIZE +; DAT_FRM EQU FatCache+9 ; .FirstDataSector_L MSD_DAT_SEC +; FAT_TYP EQU FatCache+11; .FAT_TYPE ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) +; CLU_LEN EQU FatCache+12; .BytesPerCluster +; ENDCLUS EQU FatCache+14; .END_CHAIN_CLUSTER_L + -VALUE EQU 3*512+FAT -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 -DIR_FRM EQU VALUE+6 -DIR_S_S EQU VALUE+8 ; DIR_SEC_SIZE -DAT_FRM EQU VALUE+9 ; MSD_DAT_SEC -FAT_TYP EQU VALUE+11; TYPE FAT (#32 - 12bit, #36 - 16bit) -CLU_LEN EQU VALUE+12; CLASTER_LEN -ENDCLUS EQU VALUE+14 HANDBUF EQU VALUE+16 -FTIME EQU VALUE+16+22 -FDATE EQU VALUE+16+24 -FCLUSTR EQU VALUE+16+26 -FSIZE0 EQU VALUE+16+28 -FSIZE1 EQU VALUE+16+30 +FCLUSTER32 EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H +; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME +; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE +FCLUSTR EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L +FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE +FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 DISKH EQU VALUE+48 DISKL EQU VALUE+50 @@ -917,8 +1444,8 @@ BANKDOS EQU VALUE+55 ; EQU VALUE+56 ;----------------- - BLOCK #8600-$-3,0 - DB 'SPT' +; BLOCK #8600-$-3,0 +; DB 'SPT' ; BIGA EQU (($/256)+1)*256 ; BIGA2 EQU BIGA-$-2 ; DS BIGA2 diff --git a/BOOT/boot.asm b/BOOT/boot.asm index e26b06a..2849694 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -802,7 +802,7 @@ write_end: pop af ; code_loader: include 'dssboot.asm' ; универсальный загрузчик для старого и нового доса code_loader.size EQU $-code_loader - DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",code_loader.size/512 + DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",/D,(code_loader.size/512 + (code_loader.size mod 512)/(code_loader.size mod 512)) ; 512 байт, буфер boot-сектора diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 51214f3..fcb278b 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -769,9 +769,9 @@ RD_BPB: ; LD C,SLOT3 LD C,A LD B,0 ; BC - File handels in sectors ;;;; - IF COMPILE_UNUSED_CODE - LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A - ENDIF + IF COMPILE_UNUSED_CODE + LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A + ENDIF ; EX DE,HL LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 4a2ef37..a28b23a 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -97,7 +97,7 @@ .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 ; [ ] fat3 +.END_CHAIN_CLUSTER_H: WORD #0FFF .MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.) .MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.) .BytesPerSector WORD #0000 diff --git a/DSS/build.txt b/DSS/build.txt index be9c519..0272c1e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -986 \ No newline at end of file +987 \ No newline at end of file diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index b09accc..105a276 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -82,7 +82,7 @@ cmd_date: CALL ncopy_string ; ld de,MAIN_MSG.DATE ; индекс "Current date: %1" - jp MESSAGE ; вывести строку + jp ECHO_MESSAGE ; вывести строку ; .days: DB 0 DZ "Sunday" @@ -172,4 +172,4 @@ cmd_tm1:ld c,Dss.SysTime xor a ld (hl),a ; в конец строки ld de,MAIN_MSG.TIME ; индекс "Current time: %1" - jp MESSAGE ; вывести строку + jp ECHO_MESSAGE ; вывести строку diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index f1fcd6a..3115533 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -20,7 +20,7 @@ cmd_dir: push de and a jr z,.skip LD DE,MAIN_MSG.CALCULATING - CALL MESSAGE + CALL ECHO_MESSAGE ; 23/05/24 .skip: ;LD C,Dss.CurDisk ; узнать тек. диск ;RST ToDSS @@ -122,12 +122,12 @@ cmd_dir: push de dec a jr nz,.skip_wait ld de,MAIN_MSG.PAUSE - call MESSAGE ; вывести строку + call ECHO_MESSAGE ; вывести строку ld c,Dss.WaitKey rst ToDSS dec d ld de,MAIN_MSG.DIR_ESCAPE - jp z,MESSAGE ; закончить по ESC + jp z,ECHO_MESSAGE ; закончить по ESC ;jr nz,.skip_esc ;xor a ;ld (.key_p),a ; отменяем ESC @@ -228,7 +228,7 @@ cmd_dir: push de CALL PRN_DISK_SIZE ; ; ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" - CALL MESSAGE ; вывести строку + CALL ECHO_MESSAGE ; вывести строку ; ; [ ] 23/05/2024 ld hl,Buffers.work.buffer2 @@ -240,7 +240,7 @@ cmd_dir: push de ld a,(read_disk_info.full) and a ;ld de,MAIN_MSG.CRLF - ;jp z,MESSAGE + ;jp z,ECHO_MESSAGE RET Z ; ; free space @@ -252,7 +252,7 @@ cmd_dir: push de CALL PRN_DISK_SIZE ; ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" - jp MESSAGE + jp ECHO_MESSAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -312,7 +312,7 @@ Print_Header: ; %1 ; CALL copy_string ; скопир. строку (с нулем) ; ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." - JP MESSAGE ; вывести строку + JP ECHO_MESSAGE ; вывести строку ; ; Подготовить строку списка файлов/папок @@ -337,7 +337,7 @@ PRNNAME: dec hl call PRNDATE ; вывести в буфер дату файла/папки call PRNTIME ; вывести в буфер время файла/папки ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" - jp MESSAGE ; вывод строки + jp ECHO_MESSAGE ; вывод строки ; .set_small: ld d,h diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 7fc3418..a893a48 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -39,7 +39,7 @@ A862E: ld a,(echo_mode) ; фла ld de,PRM1 ; куда (аргумент %1) call ncopy_string ; скопир. строку (с нулем), макс.15 симв. ld de,MAIN_MSG.ECHO ; индекс "Echo is %1" - jp MESSAGE + jp ECHO_MESSAGE ; A864B: ld (echo_mode),a ; флаг echo-режима ret diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index 4d74175..0dbe14e 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -5,4 +5,4 @@ ;/////////////////////////////////////////////////// cmd_help: ld de,MAIN_MSG.HELP ; индекс "COMMANDS: ..." - jp MESSAGE + jp ECHO_MESSAGE diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 84cf4e3..55a48ce 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -5,7 +5,7 @@ ;/////////////////////////////////////////////////// cmd_pause: ld de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." - call MESSAGE ; вывод строки + call ECHO_MESSAGE ; вывод строки LD A,LF LD C,Dss.PutChar RST ToDSS diff --git a/SHELL/Commands/VER.ASM b/SHELL/Commands/VER.ASM index f0fc837..19ef652 100644 --- a/SHELL/Commands/VER.ASM +++ b/SHELL/Commands/VER.ASM @@ -17,7 +17,7 @@ cmd_version: CALL .Set_Ver_to_PRM ; set Shell version ;R13 LD DE,MAIN_MSG.VERSION - JP MESSAGE + JP ECHO_MESSAGE ; Вход: ; L - номер версии (0..9) diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM index 4b472db..100ca94 100644 --- a/SHELL/Procedures/Print.ASM +++ b/SHELL/Procedures/Print.ASM @@ -19,7 +19,7 @@ print_err_message: ;A850D: invalid_param: ld de,MAIN_MSG.INVALID ; индекс "Invalid parametr" - jr MESSAGE + jr ECHO_MESSAGE @@ -27,7 +27,7 @@ invalid_param: ; Вывод сообщения ошибки по индексу ; вход: de=индекс строки ;------------------------------------------------- -MESSAGE: +ECHO_MESSAGE: call FMESAGE ; найти строку по индексу jp PRINTZ ; формат. вывод строки ;jp A82CC ; узнать и уст. полож. курсора From 568806c67a3d18811e13ca2d797be94457f7d3c6 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 5 Jun 2024 03:06:29 +1000 Subject: [PATCH 137/219] boot.asm - bugfixes. dssboot.asm - support fat32. Core - bugfixes --- BOOT/DSSBOOT.ASM | 725 +++++++++++++++++++++++++++++++++---------- BOOT/boot.asm | 481 ++++++++++++++++------------ DSS/API/Execute.ASM | 34 +- DSS/API/diskINF.asm | 8 +- DSS/FS/FAT/FAT.asm | 19 +- DSS/FS/FAT/FAT_X.asm | 4 +- DSS/Structures.inc | 16 +- DSS/build.txt | 2 +- 8 files changed, 873 insertions(+), 416 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index e37d201..f922407 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -11,10 +11,12 @@ ; + System Bootstrap + ; + Initial revision 09 Nov 1998 + ; +------------------------------+ + MODULE DSS_Boot_Loader ; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление. DEFINE ORIGINAL_DSS 0 DEFINE UNIVERSAL_BOOT 1 +LOAD_SECTORS EQU SECTORS_OF_LOADER-1 DISP #8000 @@ -27,6 +29,9 @@ DRIVE: _mSYSID DI + ; ;!TEST 26/03/2024 + ; LD SP,#C000 + ; ; LD (DRIVE),A ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого XOR A @@ -171,18 +176,15 @@ FATMSG: DB "FAT" GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 - LD BC,2*256 + BIOS.DRV_READ ;!HARDCODE дозагрузка ещё двух секторов загрузчика + LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика LD A,(DRIVE) RST ToBIOS_18 JP C,FAIL.NULL ; ; CONTINUE - ;!TEST 26/03/2024 - ;LD SP,#C000 - ; LD HL,0 - LD (DISKL),HL - LD (DISKH),HL + LD (PARTITION_START_L),HL + LD (PARTITION_START_H),HL ; LD BC,1*256 + BIOS.GetMem RST ToBIOS_18 ;GET PAGE FOR DOS @@ -210,7 +212,10 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE OR A PUSH AF ; загрузка - LD HL,(FCLUSTR) + EXX + LD HL,(FCLUSTER_H) + EXX + LD HL,(FCLUSTR_L) LD DE,#C000 CALL LOAD_CORE ; [ ] загрузка system.dos больше #4000 байтов @@ -229,8 +234,12 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов 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 + EXX + EX DE,HL + EXX LD DE,#C000 CALL NC,LOAD_CORE .no_big_core: ; @@ -326,7 +335,7 @@ RUN_CORE: DI ; INC_SECTOR_NUM: PUSH DE - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD DE,#20 ;!HARDCODE количество прочитанных секторов ADD IX,DE JR NC,.no_inc @@ -335,7 +344,10 @@ INC_SECTOR_NUM: PUSH DE POP DE LD BC,RUN_CORE PUSH BC - PUSH HL + PUSH HL ; для баланса + ;EXX + PUSH HL ; для баланса + ;EXX JP LOAD_CORE.subload ; CALL .set_stack @@ -408,20 +420,20 @@ PART_TB: PUSH BC YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,#80 - CP (IX+0) + CP (IX + _sMBR_PARTITION_RECORD.isActive) JR NZ,PART_TB.next LD A,4 ;!HARDCODE счетчик записей партиций в MBR SUB B PUSH AF ; номер загрузочного раздела ; - LD E,(IX+08) - LD D,(IX+09) - LD L,(IX+10) - LD H,(IX+11) + LD E,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3) PUSH DE POP IX - LD (DISKL),IX - LD (DISKH),HL + LD (PARTITION_START_L),IX + LD (PARTITION_START_H),HL LD A,(DRIVE) LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ @@ -438,7 +450,7 @@ YEPDOS: ;[ ] 17.12.2023 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -;/* +/* GET_BPB: LD IX,#0000 LD HL,#0000 LD DE,BOOT_BUFFER @@ -551,8 +563,8 @@ GET_BPB: LD IX,#0000 .BPB_FAT: LD (FatBuffer.FAT_TYPE),A ;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ; - LD IX,(DISKL) - LD HL,(DISKH) + LD IX,(PARTITION_START_L) + LD HL,(PARTITION_START_H) LD DE,(FatBuffer.FAT1_SEC_L) LD BC,#0000 ADD IX,DE @@ -583,7 +595,7 @@ GET_BPB: LD IX,#0000 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* +;/* GET_BPB: LD IX,#0000 LD HL,#0000 LD DE,BOOT_BUFFER @@ -639,7 +651,7 @@ GET_BPB: LD IX,#0000 ; ; ;R08 ; [x] fat32 ; LD HL,BOOT_BUFFER - ; LD DE,CORE_BUFFERS.BootSector + ; LD DE,BootSector ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LDIR ; @@ -647,20 +659,21 @@ GET_BPB: LD IX,#0000 CP #F0 RET C ; - ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - ; LD (FatBuffer.BytesPerSector),HL - ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - ; LD (FatBuffer.SectorsPerCluster),A + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD (FatBuffer.BytesPerSector),HL + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD (FatBuffer.SectorsPerCluster),A ; calc. first sector FAT LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) 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 XOR A LD B,A LD C,A 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 ; ; @@ -692,9 +705,8 @@ GET_BPB: LD IX,#0000 JR NZ,.loop1 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - - ;LD BC,(FatBuffer.BytesPerSector) - LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD (FatBuffer.FirstDataSector_H),BC + LD BC,(FatBuffer.BytesPerSector) LD A,B AND A ; @@ -736,10 +748,10 @@ GET_BPB: LD IX,#0000 LD (FatBuffer.FirstDataSector_L),HL ; B = 0 ; - ;LD HL,(FatBuffer.BytesPerSector) - LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - ;LD A,(FatBuffer.SectorsPerCluster) - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD HL,(FatBuffer.BytesPerSector) + ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD A,(FatBuffer.SectorsPerCluster) + ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -774,17 +786,7 @@ GET_BPB: LD IX,#0000 SBC HL,DE ; .HDDBIG: CALL SectorToCluster -; LD A,(FatBuffer.SectorsPerCluster) -; SCF -; .loop7: RRA -; JR C,.loop7_exit -; RR B -; RR C -; RR H -; RR L -; JP .loop7 - ; -.loop7_exit: INC HL + INC HL LD (FatBuffer.MaxClusterLow),HL LD A,L OR H @@ -838,8 +840,8 @@ GET_BPB: LD IX,#0000 POP DE ; Total Sectors low ; HL:DE = DataSec ; - ;LD A,(FatBuffer.SectorsPerCluster) - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD A,(FatBuffer.SectorsPerCluster) + ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток CALL DIV_for_SPC ; выясняем разрядность FAT @@ -906,12 +908,12 @@ GET_BPB: LD IX,#0000 EXX LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD (FatBuffer.RootDirStartCluster_L),HL - LD BC,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (FatBuffer.RootDirStartCluster_H),BC + LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (FatBuffer.RootDirStartCluster_H),DE ; - CALL CLUSTER_TO_SECTOR - LD (FatBuffer.RootDirFirstSector_L),HL - LD (FatBuffer.RootDirFirstSector_H),BC + CALL CLUSTER_TO_SECTOR.no_prepare + LD (FatBuffer.RootDirFirstSector_L),IX + LD (FatBuffer.RootDirFirstSector_H),HL ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD (FatBuffer.FSINFO_Sector),HL @@ -931,89 +933,11 @@ GET_BPB: LD IX,#0000 LD DE,FatBuffer.BPB_LABEL LD BC,11 ;!HARDCODE LDIR - ; - SET_PAGE_X FATPAGE - PUSH AF LD DE,0 CALL READ_FAT_TABLE - POP AF - 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 + AND A 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 @@ -1022,8 +946,8 @@ SectorToCluster: LD A,B AND #0F LD B,A - ;LD A,(FatBuffer.SectorsPerCluster) - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD A,(FatBuffer.SectorsPerCluster) + ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) SCF .loop: RRA RET C @@ -1033,15 +957,85 @@ SectorToCluster: RR L 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 GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD IX,(FatBuffer.RootDirFirstSector_L) - LD BC,(DISKL) - LD DE,(DISKH) + LD BC,(PARTITION_START_L) + LD DE,(PARTITION_START_H) + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 LD A,(FatBuffer.DirSizeInSectors) + JR NZ,.NEXTSEC + ; + LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер файлов на FAT32 .NEXTSEC: PUSH AF ADD IX,BC ADC HL,DE @@ -1049,7 +1043,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) PUSH IX PUSH HL LD BC,1*256 + BIOS.DRV_READ - LD DE,DIR + LD DE,DIR_BUFFER LD A,(DRIVE) RST ToBIOS_18 CALL SEARCH @@ -1069,7 +1063,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) ; 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 ADD IX,DE DEC C @@ -1108,12 +1102,27 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 AND A ; на выходе ZF = CF = 0 RET -; ; HL - CLUSTER -; ; DE - ADDRESS -; ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +; HL - CLUSTER +; DE - ADDRESS +; !TODO сделать тут определение размера SYSTEM.DOS +; [ ] и возможность загрузить больше 1 страницы LOAD_CORE: LD (READMEM),DE .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 A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) .max_sectors+1: CP #20 @@ -1126,6 +1135,10 @@ LOAD_CORE: LD (READMEM),DE EX AF,AF' LD A,(DRIVE) RST ToBIOS_18 + + EXX + POP HL + EXX POP HL ;AND A RET @@ -1141,6 +1154,9 @@ LOAD_CORE: LD (READMEM),DE LD DE,(FatBuffer.BytesPerCluster) ADD HL,DE LD (READMEM),HL + EXX + POP HL + EXX POP HL CCF RET NC @@ -1150,8 +1166,12 @@ LOAD_CORE: LD (READMEM),DE LD (BIG_CORE),A RET Z ; - CALL R_F_FAT + CALL READ_FROM_FAT + ;CALL R_F_FAT RET C + EXX + EX DE,HL + EXX EX DE,HL JP .loop @@ -1240,7 +1260,7 @@ LOAD_CORE: LD (READMEM),DE ; - +/* ; --> HL - CLUSTER ; <-- HL:IX - SECTOR NSECTOR: LD DE,0 @@ -1267,13 +1287,260 @@ NSECTOR: LD DE,0 LD E,A ADC HL,DE ; - LD DE,(DISKL) + LD DE,(PARTITION_START_L) ADD IX,DE - LD DE,(DISKH) + LD DE,(PARTITION_START_H) ADC HL,DE RET +*/ + + +;------------------------------------------------------------------------------------------------ +; Прочитать из кеша 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. Раньше номер блока в рег. 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. Раньше номер блока в рег. 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 ; DE - (CLUSTER) R_F_FAT: PUSH HL @@ -1358,8 +1625,11 @@ R_F_FAT: PUSH HL ; POP HL ; RET ; +*/ +; ; +/* RE_FAT: PUSH HL LD L,A LD H,0 @@ -1374,10 +1644,10 @@ RE_FAT: PUSH HL EX DE,HL JR NC,.NOINX INC IX -.NOINX: LD HL,(DISKL) +.NOINX: LD HL,(PARTITION_START_L) ADD HL,DE EX DE,HL - LD BC,(DISKH) + LD BC,(PARTITION_START_H) JR NC,.NOINX2 INC IX .NOINX2: ADD IX,BC @@ -1391,18 +1661,123 @@ RE_FAT: PUSH HL RST ToBIOS_18 POP HL RET +*/ ; - - +;RE_FAT: +;RX01 +; Прочитать в кеш ХХ секторов 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] ;BOOT _sBOOT_SECTOR_PARAMS = $ BOOT_BUFFER EQU $ -DIR EQU BOOT_BUFFER+512 -; -FAT_SECTORS_BUFFER EQU DIR+512 -VALUE EQU 3*512+FAT_SECTORS_BUFFER +DIR_BUFFER EQU BOOT_BUFFER+512 ; +;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 .CacheBlock EQU FatBuffer+0 ; FatCache .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 .FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) .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 +*/ ; FatCache EQU VALUE+0 ; .CacheBlock @@ -1427,20 +1808,19 @@ FatBuffer EQU VALUE -HANDBUF EQU VALUE+16 -FCLUSTER32 EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H -; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME -; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE -FCLUSTR EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L -FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE -FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 - -DISKH EQU VALUE+48 -DISKL EQU VALUE+50 -READMEM EQU VALUE+52 -;SHEL_FM EQU VALUE+54 -BIG_CORE EQU VALUE+54 -BANKDOS EQU VALUE+55 +HANDBUF EQU VALUE + _sysFatBuffer +FCLUSTER_H EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H +; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME +; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE +FCLUSTR_L EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L +FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE +FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 +PARTITION_START_H EQU FSIZE1+2 +PARTITION_START_L EQU PARTITION_START_H+2 +READMEM EQU PARTITION_START_L+2 +BIG_CORE EQU READMEM+2 +BANKDOS EQU BIG_CORE+1 +;SHEL_FM EQU VALUE+54 ; EQU VALUE+56 ;----------------- @@ -1454,6 +1834,11 @@ BANKDOS EQU VALUE+55 ;STACK EQU (($/256)+2)*256 + DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER + DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER + DISPLAY "FatBuffer ",/H,FatBuffer + ENT + ENDMODULE OUTEND ;[]-----------------------------------------------------------[] diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 2849694..6dc232d 100644 --- a/BOOT/boot.asm +++ b/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/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/macros.z80' include 'shared_includes/structures/FileSystem.inc' + ;include 'DSS/structures.inc' include '../DSS/defines.inc' DEFINE EXEinfoMACRO 0 @@ -42,18 +82,19 @@ ; версия программы -major_version equ 1 ; ст. номер версии -minor_version equ 5 ; мл. номер +major_version equ 2 ; ст. номер версии +minor_version equ 0 ; мл. номер ;; +SECTORS_OF_LOADER EQU 4 -org_addr EQU #8000 + CLP_Buffer -code_addr EQU BEGIN -program_start EQU BEGIN -stack_point EQU #BFFE -Loader_length EQU 0 +org_addr EQU #8000 + CLP_Buffer +code_addr EQU BEGIN +program_start EQU BEGIN +stack_point EQU #BFFE +Loader_length EQU 0 ; -page_buffer equ #C000 ; буфер файлов +page_buffer equ #C000 ; буфер файлов ;; include 'Shared_Includes/constants/EXE_Header.z80' @@ -108,40 +149,40 @@ version_ok: xor a ; ld hl,root_path ; "X:\" корень диска add a,'A' ld (hl),a - ld c,1Dh ; смена каталога + ld c,Dss.ChDir ; смена каталога RST ToDSS ;-------------------------------------------- ; Чтение файла system.exe ;-------------------------------------------- ld hl,name2 ; имя файла call read_file ; вся работа по загрузке файла в страницы - jr nc,read_file1_ok + ;jr nc,read_file1_ok ; освоб. блок памяти -read_file_err: ld a,(id_blck) ; идентиф. блока памяти - ld c,3Eh - RST ToDSS - ld a,-1 ; код ошибки - jp exit - +;read_file_err: ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти +; ld c,Dss.FreeMem +; RST ToDSS + ;ld a,DSS_Error.sys.DISK_FULL ; код ошибки + jp c,exit ; сохр. раб. ячейки файла system.exe -read_file1_ok: ld hl,file_handle ; откуда - ld de,hFile1 ; куда - ld bc,6 +read_file1_ok: ld hl,FILE1_PARAMS ; откуда + ld de,FILE2_PARAMS ; куда + ld bc,FILE2_PARAMS.dataSize ldir ;-------------------------------------------- ; Чтение файла system.dos ;-------------------------------------------- ld hl,name1 ; имя файла 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 -file_err1: ld a,(id_mem) ; идентиф. блока памяти - ld c,3Eh - RST ToDSS - jr read_file_err ; освоб. блок памяти system.dos - -read_file2_ok: -confirm_flag+*: ld a,0 +; file_err1: ld a,(FILE2_PARAMS.id_blck); идентиф. блока памяти +; ld c,Dss.FreeMem +; RST ToDSS + ;jr read_file_err ; освоб. блок памяти system.dos +confirm_flag+1: ld a,0 or a jr z,no_confirm ld a,(boot_disk) ; сист. диск @@ -153,7 +194,7 @@ confirm_flag+*: ld a,0 ld (messages.lett2),a ld a,5 ; индекс строки "Insert destination disk..." call print_string - ld bc,3035h ; ждем нажатия клавиши + ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS no_confirm: ld a,2 ; индекс строки "Installing boot loader..." call print_string @@ -162,7 +203,7 @@ no_confirm: ld a,2 ; ld hl,root_path ; "X:\" строка пути add a,'A' ld (hl),a - ld c,1Dh ; смена тек. каталога + ld c,Dss.ChDir ; смена тек. каталога RST ToDSS ;-------------------------------------------- ; Записать boot-загрузчик @@ -174,29 +215,29 @@ no_confirm: ld a,2 ; ; Запись файла system.dos ld hl,name1 ; имя файла call write_file - jr nc,ok_write1 - jr file_err1 - ; + jr c,write_error ok_write1: ; освободить память - ld a,(id_blck) ; блок system.dos - ld c,3Eh - RST ToDSS + ; ld a,(FILE1_PARAMS.id_blck) ; блок system.dos + ; ld c,Dss.FreeMem + ; RST ToDSS ; ; загр. раб. ячейки - ld hl,hFile1 ; откуда - ld de,file_handle ; куда - ld bc,6 + ld hl,FILE2_PARAMS ; откуда + ld de,FILE1_PARAMS ; куда + ld bc,FILE1_PARAMS.dataSize ldir ; Запись файла system.exe ld hl,name2 ; имя файла call write_file ; освободить память - push af - ld a,(id_blck) ; блок system.exe - ld c,3Eh - RST ToDSS - pop af - jr c,exit ; ошибка + ; push af + ; ld a,(FILE1_PARAMS.id_blck) ; блок system.exe + ; ld c,Dss.FreeMem + ; RST ToDSS + ; pop af + ; + jr c,write_error + ;jr c,exit ; ошибка ; ld a,(disk) ; заданный номер диска add a,'A' @@ -209,25 +250,24 @@ ok_write1: ; ; запросить системный диск ld a,(boot_disk) ; сист. диск cp 2 - jr nc,exit-1 ; не дисководы + jr nc,.not_fdd ; не дисководы add a,'A' ld (messages.lett3),a ld a,6 ; индекс строки "Insert system disk..." call print_string - ld bc,3035h ; ждем нажатия клавиши + ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS - xor a ; код "Ok" +.not_fdd: xor a ; код "Ok" exit: push af call restore_path ; восст. тек. диск и путь port: ld a,-1 ; сохр. порт out (SLOT3),a pop af - ld c,41h ; выход в ДОС + ld c,Dss.Exit ; выход в ДОС ld b,a RST ToDSS jr $ - - + ; help: ld a,8 ; индекс строки "Invalid drive specification" call print_string ld a,4 ; индекс строки хэлпа @@ -255,8 +295,8 @@ name2: db "SYSTEM.EXE",0 ;------------------------------------------------- write_boot_loader: ld a,(disk) ; заданный номер диска - ld c,1 ; open device - rst 18h + ld c,Dss.DRV.Open ; open device + rst ToDSS.DRV ret c ld hl,close_device ; точка выхода push hl @@ -264,10 +304,10 @@ write_boot_loader: ld hl,0 ; ст. разряд лог. сектора ld ix,0 ; мл. разряд ld de,buffer ; куда - ld bc,0105h ; прочитать 1 сектор (boot) - rst 18h + ld bc,1*256 + Dss.DRV.Read ; прочитать 1 сектор (boot) + rst ToDSS.DRV ret c ; ошибка чтения - ld a,(buffer+21) ; байт формата + ld a,(buffer + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) cp #F0 ; 1.44Mb ret c ; незнакомый формат jr z,write_to_floppy @@ -285,8 +325,8 @@ write_boot_loader: ; закрыть девайс close_device: push af ; сохр. флаг ld a,(disk) ; заданный номер диска - ld c,2 ; close device - rst 18h + ld c,Dss.DRV.Close ; close device + rst ToDSS.DRV pop af ret @@ -298,38 +338,45 @@ close_device: push af ; ; выход: CF - при ошибке записи ;------------------------------------------------- write_to_floppy: - ld a,(buffer+16) ; число копий FAT-ов + ld a,(buffer + BOOT_SECTOR.Number_of_FATs) ; число копий FAT-ов or a scf - ret z ; ошибка - dec a ; --число копий - jr z,overwrite_floppy ; загрузчик уже записан, перезаписать его + ret z ; ошибка + dec a ; --число копий + jr z,overwrite_floppy ; загрузчик уже записан, перезаписать его ; настроить ячейки boot-сектора - ld (buffer+16),a ; число копий FAT-ов - ld hl,(buffer+14) ; зарезерв. секторов - ld bc,(buffer+22) ; секторов на FAT - ld a,b - or c - scf - ret z ; 0 секторов на FAT + ld (buffer + BOOT_SECTOR.Number_of_FATs),a ; число копий FAT-ов + ld hl,(buffer + BOOT_SECTOR.RESERVED_SECTORS) ; зарезерв. секторов + ld bc,(buffer + BOOT_SECTOR.SectorsPerFAT16) ; секторов на FAT + ; ld a,b + ; or c + ; scf + ; ret z ; 0 секторов на FAT + ; ; 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: ; записать boot-сектор назад - ld a,(disk) ; заданный номер диска - ld hl,0 ; ст. разряд лог. сектора - ld ix,0 ; мл. разряд - ld de,buffer ; откуда - ld bc,0106h ; записать 1 сектор - rst 18h - ret c ; ошибка записи + ld a,(disk) ; заданный номер диска + ld hl,0 ; ст. разряд лог. сектора + ld ix,0 ; мл. разряд + ld de,buffer ; откуда + ld bc,1*256 + Dss.DRV.Write ; записать 1 сектор + rst ToDSS.DRV + ret c ; ошибка записи ; записать загрузчик - ld a,(disk) ; заданный номер диска - ld hl,0 ; ст. разряд лог. сектора - ld ix,1 ; мл. разряд - ld de,code_loader ; откуда (код загрузчика) - ld bc,0306h ; записать 3 сектора (размер загр.) - rst 18h + ld a,(disk) ; заданный номер диска + ld hl,0 ; ст. разряд лог. сектора + ld ix,1 ; мл. разряд + ld de,code_loader ; откуда (код загрузчика) + ld bc,SECTORS_OF_LOADER*256 + Dss.DRV.Write ; записать 3 сектора (размер загр.) + rst ToDSS.DRV ret @@ -340,20 +387,20 @@ overwrite_floppy: ; выход: CF-ошибка записи ;------------------------------------------------- write_to_ram_disk: -write_to_: ld a,(disk) ; номер заданного диска +write_to_: ld a,(disk) ; номер заданного диска ld de,#55AA - ld bc,0 * 256 + 8 - rst #18 + ld bc,Dss.DRV.GenIOCTL.GetParams + rst ToDSS.DRV ex af,af' ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ld b,a inc c scf - ret z ; !TODO загрузка с расширенного раздела не поддерживается + ret z ; !TODO загрузка с расширенного раздела не поддерживается dec c - CP #80 ;!HARDCODE тип драйва - HDD + CP #80 ;!HARDCODE тип драйва - HDD 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 проверка на влезаемость загрузчика (чтоб не попортить фат) LD HL,0 LD IX,0 @@ -362,7 +409,7 @@ write_to_: ld a,(disk) ; RST ToBIOS POP BC LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) - LD DE,04 ;!HARDCODE минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) + LD DE,SECTORS_OF_LOADER + 1 ; минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) AND A SBC HL,DE RET C @@ -370,10 +417,10 @@ write_to_: ld a,(disk) ; .skip_FAT_check:; push bc ld a,b - ld hl,0 ; ст. разряд лог. сектора - ld ix,1 ; мл. разряд - ld de,code_loader ; откуда (код загрузчика) - ld bc,3*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) + ld hl,0 ; ст. разряд лог. сектора + ld ix,1 ; мл. разряд + ld de,code_loader ; откуда (код загрузчика) + ld bc,SECTORS_OF_LOADER*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) rst ToBIOS ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого pop bc @@ -396,7 +443,7 @@ write_to_hard_disk: LD BC,1*256 + BIOS.DRV_READ RST ToBIOS ; check signature - LD HL,(buffer+510) ;!HARDCODE Signature word + LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 AND A SBC HL,DE @@ -406,9 +453,9 @@ write_to_hard_disk: PUSH BC ; set active in buffer INC C - LD HL,buffer + #01BE + #30 ;!HARDCODE MBR: Offset of last record of partition table in the MBR - LD DE,#10 ; размер одной записи MBR - LD B,4 ;!HARDCODE MBR: Number of entries in the partition table + LD HL,buffer + _sBOOT_SECTOR.PARTITION_TABLE.Record_4 + LD DE,_sMBR_PARTITION_RECORD ; размер одной записи MBR + LD B,_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD; MBR: Number of entries in the partition table .loop: XOR A LD (HL),A ; @@ -434,6 +481,10 @@ write_to_hard_disk: JR Z,.next CP PartitionSysTypes.FAT16_LBA JR Z,.next + CP PartitionSysTypes.FAT32 + JR Z,.next + CP PartitionSysTypes.FAT32_LBA + JR Z,.next ; NOT SUPPORTED FS POP BC SCF @@ -448,8 +499,9 @@ write_to_hard_disk: ld hl,0 ; ст. разряд лог. сектора ld ix,0 ; мл. разряд ld de,buffer ; откуда (код загрузчика) - ld bc,1*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) - JP ToBIOS + ld bc,1*256 + BIOS.DRV_WRITE ; записать 1 сектор + RST ToBIOS + RET ; ;------------------------------------------------- ; Выделить заданный диск из ком-строки @@ -461,7 +513,7 @@ write_to_hard_disk: get_drive_letter: inc hl ; буфер строки ld de,buffer ; буфер для выдел. параметра - ld c,43h ; выделить параметр ком. строки + ld c,Dss.GSwitch ; выделить параметр ком. строки RST ToDSS ld de,buffer ld a,(de) @@ -480,7 +532,7 @@ get_drive_letter: jr c,get_drive_err cp 'z'+1 jr nc,get_drive_err - res 5,a + and %1101'1111 sub 'A' or a ret @@ -495,11 +547,11 @@ get_drive_err: scf ; ;---------------------------------------------------- ; сохр. тек. системный диск и путь ;---------------------------------------------------- -save_path: ld c,2 ; узнать диск +save_path: ld c,Dss.CurDisk ; узнать диск RST ToDSS ld (sys_disk),a ld hl,sys_path - ld c,1Eh ; узнать путь + ld c,Dss.CurDir ; узнать путь RST ToDSS ret @@ -508,38 +560,40 @@ save_path: ld c,2 ; узн ; восст. тек. системный диск и путь ;---------------------------------------------------- restore_path: ld a,(sys_disk) - ld c,1 ; смена диска + ld c,Dss.ChDisk ; смена диска RST ToDSS ld hl,sys_path - ld c,1Dh ; смена пути + ld c,Dss.ChDir ; смена пути RST ToDSS ret +; - - - - +; disk: db 0 ; номер заданного диска boot_disk: db 0 ; номер boot-диска системы - - ; раб. ячейки тек. файла ; ; чтение: system.exe, далее system.dos ; запись: system.dos, далее system.exe -file_handle: db -1 ; дескриптор файла -id_blck: db -1 ; идентиф. выдел. блока памяти +FILE1_PARAMS: +.handle: db -1 ; дескриптор файла +.id_blck: db -1 ; идентиф. выдел. блока памяти ; -lsize: dw 0 ; мл.разряд размера файла -hsize: dw 0 ; ст.разряд +.sizeLow: dw 0 ; мл.разряд размера файла +.sizeHigh: dw 0 ; ст.разряд +.dataSize EQU $-FILE1_PARAMS ; сохр. данные system.exe -hFile1: db -1 ; дескр. файла -id_mem: db -1 ; идентиф. блока +FILE2_PARAMS: +.handle: db -1 ; дескриптор файла +.id_blck: db -1 ; идентиф. выдел. блока памяти ; - dw 0 ; мл.разряд - dw 0 ; ст.разряд +.sizeLow: 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 major_version + '0','.' db (minor_version / 10) + '0',(minor_version % 10) + '0','.' - db "\r\n\nCopyright (c) 2006-2022 Vasil Ivanov." - db "\r\n\nCopyright (c) 2023 Sprinter Team." + db "\r\n\nCopyright (c) 2006 Vasil Ivanov." + db "\r\n\nCopyright (c) 2023-2024 Sprinter Team." db "\r\n\n",0 ; db "System successfully installed on disk " ;1 @@ -586,7 +640,7 @@ messages: db 0 ; Вывести строку по индексу ; вход: a=индекс строки print_string: call get_string ; поиск строки по ее индексу в 'a' - ld c,5Ch ; вывод строки + ld c,Dss.PChars ; вывод строки RST ToDSS ret @@ -616,33 +670,43 @@ get_loop: ex af,af' ; вход: hl=имя файла ; выход: CF-при ошибке ;==================================================== -read_file: ld a,1 ; на чтение - ld c,11h ; открыть файл +read_file: ld a,Dss.Open.R ; на чтение + ld c,Dss.Open ; открыть файл RST ToDSS - jr nc,ok ; без ошибок + jr nc,.ok ; без ошибок + ; + push af ld a,9 ; индекс "Can't open file" call print_string - scf - 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 + pop af 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" call print_string + pop af + or a scf + ret nz + ld a,DSS_Error.sys.NOT_ENOUGH_MEMORY ret @@ -652,9 +716,9 @@ not_enough: call close_file ; число страниц и выделить их. ; Выход: CF - при нехватке памяти ;---------------------------------------------------- -get_memory: ld hl,(hsize) ; ст.разряд размера файла - ld bc,(lsize) ; мл.разряд - ld de,4000h ; делитель (размер страницы) +get_memory: ld hl,(FILE1_PARAMS.sizeHigh) ; ст.разряд размера файла + ld bc,(FILE1_PARAMS.sizeLow) ; мл.разряд + ld de,#4000 ; делитель (размер страницы) xor a scf malloc1: rr d @@ -669,7 +733,7 @@ malloc1: rr d jr malloc1 ; malloc2: or a - jr z,$+3 + jr z,$+3 ;!FIXIT $ inc bc xor a cp b @@ -677,9 +741,9 @@ malloc2: or a ret nz ; выделить блок памяти ld b,c ; b=число страниц - ld c,3Dh + ld c,Dss.GetMem RST ToDSS - ld (id_blck),a ; идентиф. блока + ld (FILE1_PARAMS.id_blck),a ; идентиф. блока ret @@ -688,39 +752,38 @@ malloc2: or a ;---------------------------------------------------- file_to_bank: ld hl,0 ld ix,0 - ld a,(file_handle) ; дескр. файла - ld bc,0015h ; указатель на начало файла + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld bc,Dss.Move_FP.FrStart ; указатель на начало файла RST ToDSS - ld a,(id_blck) ; идентиф. блока памяти - ld b,0 ; лог. номер страницы в блоке - ld c,0C4h ; получить физ. номер страницы в блоке - rst 08h + ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти + ;ld b,0 ; лог. номер страницы в блоке + ld bc,0*256 + BIOS.GetMemPage; получить физ. номер страницы в блоке + rst ToBIOS ret c -loop_to_bank: push af +.loop: push af out (SLOT3),a ld hl,page_buffer ; #C000 куда - ld de,4000h ; сколько - ld a,(file_handle) ; дескр. файла - ld c,13h ; читать файл + ld de,#4000 ; сколько + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld c,Dss.Read ; читать файл RST ToDSS pop bc - jr nc,ok_to_bank - ld a,12 ; индекс "Reading error" + jr c,.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 scf 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=имя файла ; выход: CF-при ошибке ;==================================================== -write_file: ld a,20h ; атрибут "архивный" - ld c,0Ah ; создать файл +write_file: ld a,FAT_ATTR.ARCHIVE ; атрибут "архивный" + ld c,Dss.Create ; создать файл RST ToDSS - jr nc,create_ok ; без ошибок + jr nc,.create_ok ; без ошибок + push af ld a,13 ; индекс "Can't create file" call print_string - scf + pop af ret ; -create_ok: ld (file_handle),a ; дескр. файла - ld hl,close_file ; закр. файл +.create_ok: ld (FILE1_PARAMS.handle),a ; дескр. файла + ld hl,read_file.close_file ; закр. файл push hl ; точка выхода ; ; чтение файла из банок и запись на диск - ld a,(id_blck) ; идентиф. блока памяти - ld b,0 ; лог. номер страницы в блоке - ld c,0C4h ; получить физ. номер страницы в блоке - rst 08h + ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти + ;ld b,0 ; лог. номер страницы в блоке + ld bc,BIOS.GetMemPage ; получить физ. номер страницы в блоке + rst ToBIOS ret c -write_loop: push af +.loop: push af out (SLOT3),a - ld hl,(lsize) ; мл.разряд размера файла - ld de,(hsize) ; ст.разряд - ld bc,4000h + ld hl,(FILE1_PARAMS.sizeLow) ; мл.разряд размера файла + ld de,(FILE1_PARAMS.sizeHigh) ; ст.разряд + ld bc,#4000 xor a sbc hl,bc ld b,a ex de,hl sbc hl,bc ex de,hl - jr c,write_end ; записать остаток - ld (lsize),hl - ld (hsize),de + jr c,.write_end ; записать остаток + ld (FILE1_PARAMS.sizeLow),hl + ld (FILE1_PARAMS.sizeHigh),de ; ld hl,page_buffer ; #C000 откуда - ld de,4000h ; сколько - ld a,(file_handle) ; дескр. файла - ld c,14h ; запись файла + ld de,#4000 ; сколько + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld c,Dss.Write ; запись файла RST ToDSS pop bc - jr nc,write_ok - ld a,14 ; индекс "Writing error" - call print_string - scf - ret + jr c,.error ; -write_ok: cp -1 ; записано меньшее число байт ? +.write_ok: cp -1 ; записано меньшее число байт ? + ld a,DSS_Error.sys.DISK_FULL scf - ret z ; да, на диске нет места + jr nz,.error ; да, на диске нет места ld a,b ; a=физич. страница - ld c,0C7h ; получить номер след. физ. страницы блока - rst 08h + ld c,BIOS.GetMemPageNext ; получить номер след. физ. страницы блока + rst ToBIOS ret c - cp 255 - jr nz,write_loop ; не последняя страница + cp #FF + jr nz,.loop ; не последняя страница ret ; -write_end: pop af ; баланс стека - ld de,(lsize) ; сколько +.write_end: pop af ; баланс стека + ld de,(FILE1_PARAMS.sizeLow) ; сколько ld a,e or d ret z ; 0 байтов ld hl,page_buffer ; #C000 откуда - ld a,(file_handle) ; дескр. файла - ld c,14h ; запись файла + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld c,Dss.Write ; запись файла RST ToDSS + ret nc + ; +.error: push af + ld a,14 ; индекс "Writing error" + call print_string + pop af ret @@ -807,6 +874,6 @@ code_loader.size EQU $-code_loader ; 512 байт, буфер boot-сектора buffer equ $ -sys_disk equ buffer+513 ; диск системы +sys_disk equ buffer+512 ; диск системы sys_path equ sys_disk+1 ; путь системы diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 2060854..a29a028 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -544,23 +544,24 @@ EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ; LEAVE: LD A,B LD (ErrorLevel),A CALL FREE_PROCESS_MEMORY - LD SP,(EXSTACK) ;[x] 10/12/23 close EXE FMs CALL FREE_PROCESS_FMs - ; - _mDECTASK - ; - POP AF - POP HL - OUT (SLOT1),A - LD A,L - OUT (SLOT2),A - LD A,H - OUT (SLOT3),A - POP DE - POP HL - LD (EXSTACK),SP - LD SP,HL + ; + _mDECTASK + LD SP,(EXSTACK) + ; тут стек в нулевой странице! + POP AF + POP HL + OUT (SLOT1),A + LD A,L + OUT (SLOT2),A + LD A,H + OUT (SLOT3),A + POP DE + POP HL + LD (EXSTACK),SP + LD SP,HL + ; EX DE,HL LD A,(ErrorLevel) ;R12 @@ -572,6 +573,9 @@ LEAVE: LD A,B JP (HL) ; .norm_exit: AND A + ;!TEST + EI + ; JP (HL) ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 219ac33..7981773 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -81,15 +81,15 @@ DISKINF: LD C,B LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER 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 EXX PUSH DE PUSH HL 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 LD A,XH LD DE,Dss.DRV.GenIOCTL.Enter diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index fcb278b..851fa33 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -722,8 +722,9 @@ RD_BPB: ; LD C,SLOT3 LD C,A 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.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.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables ; ; LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) @@ -754,7 +755,8 @@ RD_BPB: ; LD C,SLOT3 JR NZ,.loop1 ; LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC + ; LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,B AND A @@ -979,18 +981,17 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL ; -.mirrored_FATs: ; - LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL +.mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL ; EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE ; - CALL CLUSTER_TO_SECTOR - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC + CALL CLUSTER_TO_SECTOR.no_prepare + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL ; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 45561f1..baefe86 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -968,17 +968,17 @@ GET_FAT12_CELL: ;[x] fat32 ;!TEST -;NSECTOR: +;CLUSTER_TO_SECTOR: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR CLUSTER_TO_SECTOR: - PUSH BC EXX PUSH HL EXX POP DE ; DE:HL - cluster ; +.no_prepare: PUSH BC LD BC,-2 ADD HL,BC JR C,.no_dec_de diff --git a/DSS/Structures.inc b/DSS/Structures.inc index a28b23a..fbaee5d 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -100,14 +100,14 @@ .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 +.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 не используются некоторые значения, но задумка неплохая))) diff --git a/DSS/build.txt b/DSS/build.txt index 0272c1e..a88135e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -987 \ No newline at end of file +988 \ No newline at end of file From 0c746fc0fc1e6937a7ed60b5f4388509ef725ea8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 6 Jun 2024 00:28:09 +1000 Subject: [PATCH 138/219] boot.asm - fixed bug with 720 kb floppy --- BOOT/boot.asm | 5 ++--- DSS/API/Execute.ASM | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 6dc232d..db16b5a 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -355,11 +355,10 @@ write_to_floppy: ; ; add hl,bc ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; зарезерв. секторов - ex hl,de - ld hl,SECTORS_OF_LOADER-1 + dec hl + ld de,SECTORS_OF_LOADER and a sbc hl,de - ccf ret c overwrite_floppy: ; записать boot-сектор назад diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index a29a028..7fe4321 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -404,7 +404,7 @@ _ret+1: JP 0 _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,#0080 + LD DE,#0080 ;!HARDCODE CLP_Buffer XOR A SBC HL,DE EX DE,HL From d653425a7f4e1de944fdd7eee7f432299e59e81c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 6 Jun 2024 00:28:44 +1000 Subject: [PATCH 139/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5797b0c..314ff5d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5797b0c5804320f86d263997f624cb8b6bb69385 +Subproject commit 314ff5dbefe8d537655601dde8236957e4ed39a7 From cac616722c131ed7f85a2dcee3146b9c11ebb7de Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 8 Jun 2024 01:39:30 +1000 Subject: [PATCH 140/219] ... --- SHELL/Commands/DATE.ASM | 6 ++--- SHELL/Commands/DIR.ASM | 50 ++++++++++++++++++++------------------ SHELL/Commands/ECHO.ASM | 2 +- SHELL/Commands/VER.ASM | 4 +-- SHELL/Procedures/Print.ASM | 25 +++++++++---------- SHELL/build.txt | 2 +- SHELL/structures.inc | 14 +++++++++++ 7 files changed, 58 insertions(+), 45 deletions(-) diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index 105a276..7392470 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -52,7 +52,7 @@ cmd_date: push ix push de ld a,d ; число - ld hl,PRM1 ; куда + ld hl,Buffers.bat_params.PRM1; куда call PUTB ; десят. вывод в буфер ld a,"." ld (hl),a @@ -78,7 +78,7 @@ cmd_date: LD BC,.days.size CALL LCPIR ; - LD DE,PRM2 + LD DE,Buffers.bat_params.PRM2 CALL ncopy_string ; ld de,MAIN_MSG.DATE ; индекс "Current date: %1" @@ -156,7 +156,7 @@ cmd_tm1:ld c,Dss.SysTime push bc push hl ld a,h ; число - ld hl,PRM1 ; куда + ld hl,Buffers.bat_params.PRM1; куда call PUTB ; десят. вывод в буфер ld a,":" ld (hl),a diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 3115533..cd4c2ff 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -81,18 +81,20 @@ cmd_dir: push de inc hl ld (hl),0 inc hl - ld de,PRM1 + ld de,Buffers.bat_params.PRM1 call ncopy_string ; сохраняем маску файла ; ld hl,Buffers.work.buffer1 ld c,Dss.ChDir rst ToDSS - ; - ld hl,PRM1 + ;ld a,DSS_Error.sys.NOT_READY + jp c,print_err_message +.no_error: ; + ld hl,Buffers.bat_params.PRM1 ld de,Buffers.work.free call ncopy_string ; восстанавливаем маску файла ; - ld a,(PRM1) + ld a,(Buffers.bat_params.PRM1) or a jr nz,.SkipMask ; @@ -197,7 +199,7 @@ cmd_dir: push de pop af ; баланс стека ; Десятичный вывод .print: ld hl,(FILES) - ld ix,PRM3 ; количество файлов + ld ix,Buffers.bat_params.PRM3; количество файлов call PDIGIT ; ld a,(S_HIGH) @@ -212,13 +214,13 @@ cmd_dir: push de ; [x] вывод количества папок ; [x] вывод общего количества свободного места ld hl,SIZE_BUFFER.high ; "000 000 000 000" - ld de,PRM1; + PRM2 ; размер файлов в каталоге + ld de,Buffers.bat_params.PRM1; + PRM2. размер файлов в каталоге ld bc,SIZE_BUFFER.bytes call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. ; ; Десятичный вывод ld hl,(dir_number) - ld ix,PRM4 ; кол-во каталогов в каталоге + ld ix,Buffers.bat_params.PRM4; кол-во каталогов в каталоге call PDIGIT ; full capacity ld a,(full_space_high) @@ -258,12 +260,12 @@ cmd_dir: push de PRN_DISK_SIZE: call PRINT_5BYTES ld hl,SIZE_BUFFER.high ; "000 000 000 000" - ld de,PRM5 ; and PRM6 ; куда + ld de,Buffers.bat_params.PRM5; and PRM6. куда ld bc,SIZE_BUFFER.bytes jp ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. ; Print_Header: ; %1 - ld hl,PRM1 + ld hl,Buffers.bat_params.PRM1 ld a,'"' ld (hl),a inc hl @@ -283,27 +285,27 @@ Print_Header: ; %1 ld (hl),0 ; %2 ld hl,serial_string ; строка серийного номера диска - ld de,PRM2 ; куда + ld de,Buffers.bat_params.PRM2; куда call ncopy_string ; скопир. строку (с нулем) ; %3..5 ;push hl ld hl,Buffers.work.free + 256 + 128 ; 128 - на всякий случай ld c,Dss.CurDir rst ToDSS - ld hl,PRM3 - ld a,(PRM1 + 1) + ld hl,Buffers.bat_params.PRM3 + ld a,(Buffers.bat_params.PRM1 + 1) ld (hl),a inc hl ld (hl),':' ; - ld hl,PRM3+2 - ld de,PRM3+2+1 + ld hl,Buffers.bat_params.PRM3 +2 + ld de,Buffers.bat_params.PRM3 +2 + 1 ld (hl),0 ld bc,16+16+16-1-2 ldir ; ld hl,Buffers.work.free + 256 + 128 ; сист. путь - ld de,PRM3 + 2 ;+PRM4..5 ; 2 + 48 байтов буфер + ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 байтов буфер call make_short_path ;pop hl @@ -323,11 +325,11 @@ PRNNAME: dec hl inc hl ; ld bc,8 - ld de,PRM1 ; буфер + ld de,Buffers.bat_params.PRM1 ldir xor a ld (de),a - ld de,PRM2 ; куда + ld de,Buffers.bat_params.PRM2; куда ldi ldi ldi @@ -395,7 +397,7 @@ PRNSIZE: ld a,(ix+32) ldi ld hl,SIZE_BUFFER.low ; "0 000 000 000" pop ix -.PRZ: ld de,PRM3 ; 16 буфер +.PRZ: ld de,Buffers.bat_params.PRM3; 16 буфер jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер дату файла/папки @@ -405,7 +407,7 @@ PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE) call MAKE_DATE ; вывод в буфер даты ld (hl),0 ld hl,SIZE_BUFFER.low ; "0 000 000 000" - ld de,PRM4 ; 16 куда + ld de,Buffers.bat_params.PRM4; 16 куда jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер время файла/папки @@ -415,7 +417,7 @@ PRNTIME: ld b,(ix+22) call MAKE_TIME ; скопир. в буфер время файла/папки ld (hl),0 ld hl,SIZE_BUFFER.low ; "0 000 000 000" - ld de,PRM5 ; 80 буфер строки + ld de,Buffers.bat_params.PRM5; 80 буфер строки jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; в буфер время файла/папки @@ -738,24 +740,24 @@ read_disk_info: OR #80 ; нет метки .no_volume_label:; %6 ld hl,volume_string_no ; строка - ld de,PRM6 ; куда + ld de,Buffers.bat_params.PRM6; куда call ncopy_string ; скопир. строку (с нулем) XOR A - LD (PRM7),A + LD (Buffers.bat_params.PRM7),A ret .good_label: POP HL PUSH HL ; толкаем лишнее ; есть метка volume_label: POP DE ; снимаем лишнее ; %7 - ld de,PRM7 + ld de,Buffers.bat_params.PRM7 ld bc,11 ;!HARDCODE длина метки ldir xor a ld (de),a ; %6 ld hl,volume_string_yes ; строка - ld de,PRM6 ; куда + ld de,Buffers.bat_params.PRM6; куда call ncopy_string ; скопир. строку (с нулем) ret ; diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index a893a48..183a51f 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -36,7 +36,7 @@ A862E: ld a,(echo_mode) ; фла jr nz,$+5 ; false ;!FIXIT $ ld de,MAIN_MSG.OFF ; индекс "off" call FMESAGE ; найти строку по индексу - ld de,PRM1 ; куда (аргумент %1) + ld de,Buffers.bat_params.PRM1; куда (аргумент %1) call ncopy_string ; скопир. строку (с нулем), макс.15 симв. ld de,MAIN_MSG.ECHO ; индекс "Echo is %1" jp ECHO_MESSAGE diff --git a/SHELL/Commands/VER.ASM b/SHELL/Commands/VER.ASM index 19ef652..443154d 100644 --- a/SHELL/Commands/VER.ASM +++ b/SHELL/Commands/VER.ASM @@ -8,12 +8,12 @@ cmd_version: RST ToDSS LD L,D LD H,E - LD DE,PRM1 + LD DE,Buffers.bat_params.PRM1 CALL .Set_Ver_to_PRM ; set DSS version ;R13 LD HL,256*CONSOLE_MODF + CONSOLE_VERS LD BC,CONSOLE_BUILD - LD DE,PRM2 + LD DE,Buffers.bat_params.PRM2 CALL .Set_Ver_to_PRM ; set Shell version ;R13 LD DE,MAIN_MSG.VERSION diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM index 100ca94..fc1d8a2 100644 --- a/SHELL/Procedures/Print.ASM +++ b/SHELL/Procedures/Print.ASM @@ -24,7 +24,7 @@ invalid_param: ;------------------------------------------------- -; Вывод сообщения ошибки по индексу +; Вывод сообщения по индексу ; вход: de=индекс строки ;------------------------------------------------- ECHO_MESSAGE: @@ -94,7 +94,7 @@ PRINTZ: ld a,(hl) LD L,A LD H,0 ; - ld bc,PRM1 ; буфер + ld bc,Buffers.bat_params.PRM1 add hl,bc ld c,Dss.PChars ; вывод строки RST ToDSS @@ -102,17 +102,14 @@ PRINTZ: ld a,(hl) jp PRINTZ - - -;!FIXIT перенести к общим буферам как у меня ; буферы аргументов командной строки -PRM1: BLOCK 16,0 ; аргумент %1 -PRM2: BLOCK 16,0 ; аргумент %2 -PRM3: BLOCK 16,0 ; аргумент %3 -PRM4: BLOCK 16,0 ; аргумент %4 -PRM5: BLOCK 16,0 ; аргумент %5 -PRM6: BLOCK 16,0 ; аргумент %6 -PRM7: BLOCK 16,0 ; аргумент %7 -PRM8: BLOCK 16,0 ; аргумент %8 -PRM9: BLOCK 16,0 ; аргумент %9 +; PRM1: BLOCK 16,0 ; аргумент %1 +; PRM2: BLOCK 16,0 ; аргумент %2 +; PRM3: BLOCK 16,0 ; аргумент %3 +; PRM4: BLOCK 16,0 ; аргумент %4 +; PRM5: BLOCK 16,0 ; аргумент %5 +; PRM6: BLOCK 16,0 ; аргумент %6 +; PRM7: BLOCK 16,0 ; аргумент %7 +; PRM8: BLOCK 16,0 ; аргумент %8 +; PRM9: BLOCK 16,0 ; аргумент %9 ; \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 50b04df..cdf1f34 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -402 \ No newline at end of file +403 \ No newline at end of file diff --git a/SHELL/structures.inc b/SHELL/structures.inc index 1826213..db0218f 100644 --- a/SHELL/structures.inc +++ b/SHELL/structures.inc @@ -14,7 +14,21 @@ .free BLOCK 3840,0 ENDS +; буферы аргументов командной строки + STRUCT BAT_PARAMS +.PRM1: BLOCK 16,0 ; аргумент %1 +.PRM2: BLOCK 16,0 ; аргумент %2 +.PRM3: BLOCK 16,0 ; аргумент %3 +.PRM4: BLOCK 16,0 ; аргумент %4 +.PRM5: BLOCK 16,0 ; аргумент %5 +.PRM6: BLOCK 16,0 ; аргумент %6 +.PRM7: BLOCK 16,0 ; аргумент %7 +.PRM8: BLOCK 16,0 ; аргумент %8 +.PRM9: BLOCK 16,0 ; аргумент %9 Buffers.bat_params. + ENDS + STRUCT Struc_Buffers +.bat_params BAT_PARAMS .screen_path BLOCK 2 + max_screen_path + 1, 0 ; db "A:" : BLOCK max_screen_path+1,0 .sys_path BLOCK 256,0 .input_line Input_Line From fda917aed8ec0ca696e1b55542343acd56f1915e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 8 Jun 2024 05:23:00 +1000 Subject: [PATCH 141/219] DSS boot loader: trying to optimize for size --- BOOT/DSSBOOT.ASM | 520 ++++++++++++++------------------------------- BOOT/boot.asm | 32 +-- DSS/API/Close.asm | 3 +- DSS/FS/FAT/FAT.asm | 7 +- DSS/VIDEO.ASM | 1 + 5 files changed, 182 insertions(+), 381 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index f922407..d6e8802 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -47,49 +47,28 @@ DRIVE: _mSYSID RET C ; goto FAIL LD A,(DRIVE) BIT 7,A - JP Z,GOOD_DRIVE + JR Z,GOOD_DRIVE EX DE,HL LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка SBC HL,DE LD HL,MESSAGES.INCORR RET C ; goto FAIL - JP GOOD_DRIVE + ; +GOOD_DRIVE: LD DE,#8200 ;!HARDCODE + LD HL,0 + LD IX,2 + LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика + LD A,(DRIVE) + RST ToBIOS_18 + JP NC,CONTINUE + JR FAIL.NULL //////////////////////////////////////////////////////////////////////// FAIL: CALL MESSAGE .NULL: LD HL,MESSAGES.FAILURE CALL MESSAGE - DI - HALT JR $ ; - -; -; DOSMESS: CALL FMESAGE -; LD C,Dss.PChars -; RST ToDSS -; RET -; - -; -; FMESAGE: LD HL,MSG0 -; LD BC,MSGE-MSG0 -; INC A -; EX AF,AF' -; XOR A -; EX AF,AF' -; .NEXTMSG: EX AF,AF' -; CPIR -; RET PO -; RET NZ -; EX AF,AF' -; DEC A -; JR NZ,.NEXTMSG -; RET -; - -; -MESSAGE: ;CALL FMESAGE - ;R01 Start +MESSAGE: ;R01 Start XOR A OUT (SYS_PORT.ON),A .loop: LD A,(HL) ;R01 @@ -124,9 +103,11 @@ PRINTX: CP "\r" ; LD DE,#0020 LD BC,1*256 + BIOS.LP_SCROLL_UD RST ToBIOS_18 + ; LD DE,#1F00 LD C,BIOS.LP_SET_PLACE RST ToBIOS_18 + ; LD A," " LD BC,#50 + BIOS.LP_PRINT_SYM RST ToBIOS_18 @@ -139,56 +120,30 @@ PRINTX: CP "\r" ; RET ;R01 ;R01 End -; FAILURE EQU 0 -; INCORR EQU 1 -; ERRPART EQU 2 -; ERRIBPB EQU 3 -; NO_SYS EQU 4 -; NOSHELL EQU 5 -; STARTDO EQU 6 -;a BIOS version that is incompatible with this version of DOS - MESSAGES:; 0 10 20 30 40 50 60 70 80 .FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0 -.INCORR: DB "\r\nUnsupported BIOS version! Update BIOS to run this version of DSS.\r\n",0 +.INCORR: DB "\r\nOld BIOS version.\r\n",0 .ERRPART: DB "\r\nUnknown partition table.",0 .ERRIBPB: DB "\r\nInvalid BOOT sector.",0 -.NO_SYS: DB "\r\nCan't open file SYSTEM.DOS...",0 -.NOSHELL: DB "\r\nCan't open file SYSTEM.EXE...",0 +.NO_SYS: DB "\r\nCan't open SYSTEM.DOS...",0 +.NOSHELL: DB "\r\nCan't open SYSTEM.EXE...",0 .STARTDO: DB "\r\nStarting DSS... \r\n\n",0 ; SHELL_NAME: DB '\SYSTEM.EXE /P',0 ROOT: DB 'X:\',0 CORE_NAME: DB "SYSTEM DOS" .Size EQU $-CORE_NAME -FATMSG: DB "FAT" -//////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////// ASSERT $<#8200, "Error!!! BIOS LOADING ONLY FIRST #200 BYTES" //////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////// -GOOD_DRIVE: LD DE,#8200 ;!HARDCODE - LD HL,0 - LD IX,2 - LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика - LD A,(DRIVE) - RST ToBIOS_18 - JP C,FAIL.NULL - ; - ; CONTINUE - LD HL,0 +CONTINUE: LD HL,0 LD (PARTITION_START_L),HL LD (PARTITION_START_H),HL ; LD BC,1*256 + BIOS.GetMem RST ToBIOS_18 ;GET PAGE FOR DOS - LD (BANKDOS),A + LD (LOAD_CORE.BANKDOS),A ; OUT (SLOT0),A ; @@ -196,6 +151,7 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,MESSAGES.ERRIBPB RET C ; goto FAIL CALL GETROOT + ; LD HL,MESSAGES.NO_SYS RET C ; goto FAIL ; [ ] загрузка system.dos больше #4000 байтов @@ -208,7 +164,7 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE SBC HL,DE JR NC,.set_no_size .set_size: LD A,#FF -.set_no_size: LD (BIG_CORE),A +.set_no_size: LD (LOAD_CORE.BIG_CORE),A OR A PUSH AF ; загрузка @@ -226,10 +182,10 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE JR C,.no_big_core ; IN A,(SLOT1) - LD (BANKDOS),A + LD (LOAD_CORE.BANKDOS),A LD A,SUBLOAD_SIZE LD (LOAD_CORE.max_sectors),A - LD (BIG_CORE),A ; теперь это счётчик оставшихся секторов + LD (LOAD_CORE.BIG_CORE),A ; теперь это счётчик оставшихся секторов ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов @@ -255,8 +211,6 @@ RUN_CORE: DI LD B,#1F ;1FFD OUT (C),A ; - ; LD A,(BANKDOS) - ; OUT (SLOT0),A ;DOS LOADED ;IF UNIVERSAL_BOOT ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого @@ -319,20 +273,6 @@ RUN_CORE: DI JP NZ,FAIL JP FAIL.NULL -; .NoShell: LD HL,MESSAGES.NOSHELL -; JP C,FAIL -; LD HL,MESSAGES.FAILURE -; JP FAIL - - -; XFAIL: CALL DOSMESS -; .fail: LD HL,MESSAGES.FAILURE -; CALL DOSMESS -; DI -; HALT -; .halt: JR .halt -; - ; INC_SECTOR_NUM: PUSH DE CALL CLUSTER_TO_SECTOR @@ -345,22 +285,14 @@ INC_SECTOR_NUM: PUSH DE LD BC,RUN_CORE PUSH BC PUSH HL ; для баланса - ;EXX PUSH HL ; для баланса - ;EXX JP LOAD_CORE.subload - -; CALL .set_stack -; JP RUN_CORE -; .set_stack: PUSH HL -; JP LOAD_CORE.subload ; ; PART_TB: PUSH BC LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 - ;AND A ; CF = 0 SBC HL,DE SCF @@ -368,21 +300,23 @@ PART_TB: PUSH BC LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; + LD HL,YEPDOS + PUSH HL .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) ; ЕСЛИ добавится поддержка ещё одного типа ФС, то поменять 1 на 2 ; 1 CP PartitionSysTypes.FAT16_LBA - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT16 - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT16_32Mb - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT12 - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT32 - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT32_LBA - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS ; ; 2 ;EXX @@ -416,8 +350,7 @@ PART_TB: PUSH BC ; .Size EQU $-SUPPORTED_PARTITIONS ; - - +; YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,#80 CP (IX + _sMBR_PARTITION_RECORD.isActive) @@ -426,13 +359,13 @@ YEPDOS: ;[ ] 17.12.2023 SUB B PUSH AF ; номер загрузочного раздела ; - LD E,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) + PUSH HL + LD (PARTITION_START_L),HL LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3) - PUSH DE POP IX - LD (PARTITION_START_L),IX LD (PARTITION_START_H),HL LD A,(DRIVE) LD DE,BOOT_BUFFER @@ -443,7 +376,6 @@ YEPDOS: ;[ ] 17.12.2023 POP BC LD L,A ; номер загрузочного раздела LD A,C - ;LD A,C ; RET ; @@ -596,8 +528,18 @@ GET_BPB: LD IX,#0000 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;/* -GET_BPB: LD IX,#0000 - LD HL,#0000 +GET_BPB: LD HL,#0000 + ; + LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 ; fat32 + LD (FatBuffer.RootDirFirstSector_H),HL + ;LD (FatBuffer.CacheBlock),HL + XOR A + LD (FatBuffer.SectorsPerFAT_H),A ; fat32 + ; + PUSH HL + POP IX + ; LD IX,#0000 + ; LD HL,#0000 LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) @@ -625,58 +567,28 @@ GET_BPB: LD IX,#0000 LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) LD L,A POP AF - ;PUSH AF LD C,BIOS.DRV_SET_PAR RST ToBIOS_18 - ;POP BC - ;LD A,C ; нахера? - ;RET - + ; .NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 - AND A + ;AND A SBC HL,DE SCF RET NZ ; -;RD_BPB: ; CALL READ_BPB - ; JP C,DOS_X_Error.Not_ready - ; ; - ; LD DE,#AA55 ; сигнатура ;R05 - ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 - ; ;R05 - ; AND A - ; SBC HL,DE - ; JP NZ,DOS_X_Error.UnknownBPB - ; - ; ;R08 ; [x] fat32 - ; LD HL,BOOT_BUFFER - ; LD DE,BootSector - ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size - ; LDIR - ; LD A,(BOOT_BUFFER + BOOT_SECTOR.DRIVE_TYPE) CP #F0 RET C ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - LD (FatBuffer.BytesPerSector),HL LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD (FatBuffer.SectorsPerCluster),A ; calc. first sector FAT LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 - ; fat32 - XOR A - LD B,A - LD C,A - 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.RootDirFirstSector_H),BC - LD (FatBuffer.SectorsPerFAT_H),A ; fat32 - ; ; + LD BC,0 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D @@ -688,16 +600,14 @@ GET_BPB: LD IX,#0000 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (FatBuffer.SectorsPerFAT_L),DE LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs - LD (FatBuffer.Number_Of_FATs),A CP 1 JR Z,.one_FAT DEC A ADD HL,DE - LD (FatBuffer.FAT2_SEC_L),HL JR NC,.no_inc_BC INC BC -.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC -.one_FAT: ;C_DATA1 +.no_inc_BC: ; +.one_FAT: ; .loop1: ADD HL,DE JR NC,.loop1_1 INC BC @@ -706,7 +616,7 @@ GET_BPB: LD IX,#0000 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (FatBuffer.FirstDataSector_H),BC - LD BC,(FatBuffer.BytesPerSector) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD A,B AND A ; @@ -719,10 +629,6 @@ GET_BPB: LD IX,#0000 ; LD C,A LD B,0 ; BC - File handels in sectors - ;;;; - IF COMPILE_UNUSED_CODE - LD (FatBuffer.FilesPerSector),A - ENDIF ; EX DE,HL LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 @@ -748,10 +654,8 @@ GET_BPB: LD IX,#0000 LD (FatBuffer.FirstDataSector_L),HL ; B = 0 ; - LD HL,(FatBuffer.BytesPerSector) - ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - LD A,(FatBuffer.SectorsPerCluster) - ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD A,(FatBuffer.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -762,47 +666,24 @@ GET_BPB: LD IX,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - ; fat32 LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) - LD DE,(FatBuffer.FirstDataSector_L) + LD BC,0 LD A,H OR L JP NZ,.HDDSMAL ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) LD BC,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) +.HDDSMAL: ; PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low - AND A - SBC HL,DE - JP NC,.HDDBIG - DEC BC - JP .HDDBIG - ; -.HDDSMAL: ; CF = 0 - LD BC,0 - PUSH BC ; Total Sectors high - PUSH HL ; Total Sectors low - SBC HL,DE - ; -.HDDBIG: CALL SectorToCluster - INC HL - LD (FatBuffer.MaxClusterLow),HL - LD A,L - OR H - JR NZ,.no_inc_bc - INC BC -.no_inc_bc: LD (FatBuffer.MaxClusterHigh),BC - ; XOR A - LD H,A - LD L,A - LD (FatBuffer.CacheBlock),HL - LD (FatBuffer.CacheUpdated),A + ;LD H,A + ;LD L,A + ;LD (FatBuffer.CacheBlock),HL ; A = 0 - LD HL,(FatBuffer.SectorsPerFAT_H) - LD H,A - EX DE,HL + LD DE,(FatBuffer.SectorsPerFAT_H) + LD D,A LD HL,(FatBuffer.SectorsPerFAT_L) ; DE:HL = SectorsPerFAT ; @@ -840,10 +721,31 @@ GET_BPB: LD IX,#0000 POP DE ; Total Sectors low ; HL:DE = DataSec ; - LD A,(FatBuffer.SectorsPerCluster) - ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD A,(FatBuffer.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток - CALL DIV_for_SPC + ;CALL DIV_for_SPC + LD C,A + DEC A + JR Z,.DIV_exit + ; + AND E + LD B,A ; остаток + LD A,C + RRCA + ; +.DIV_loop: SRL H + RR L + RR D + RR E + RRCA + JP NC,.DIV_loop + LD A,B +.DIV_exit: LD B,D + LD C,E + EX DE,HL + LD H,0 + LD L,A + ; ; выясняем разрядность FAT LD A,D OR E @@ -851,29 +753,13 @@ GET_BPB: LD IX,#0000 ; LD HL,4084 SBC HL,BC - JR NC,.its_FAT12 + LD A,FAT_TYPE.x12 + JR NC,.SET_VARS ; LD HL,65525 SBC HL,BC - JR C,.its_FAT32 - ; - ; It's FAT16 - LD HL,#FFFF LD A,FAT_TYPE.x16 -.set_vars: EXX - LD HL,0 - LD (FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (FatBuffer.RootDirStartCluster_L),HL - LD (FatBuffer.RootDirStartCluster_H),HL - LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT.LABEL - EXX - LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) - LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) - JR .SET_VARS - ; -.its_FAT12: LD HL,#0FFF - LD A,FAT_TYPE.x12 - JR .set_vars + JR NC,.SET_VARS ; .its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber) CP #80 @@ -883,104 +769,62 @@ GET_BPB: LD IX,#0000 LD DE,(FatBuffer.SectorsPerFAT_H) LD D,0 EXX - LD HL,(FatBuffer.FAT1_SEC_L) - LD DE,(FatBuffer.SectorsPerFAT_L) - AND #0F - JR Z,.first_FAT_active - LD B,A + LD HL,(FatBuffer.FAT1_SEC_L) + LD DE,(FatBuffer.SectorsPerFAT_L) + AND #0F + JR Z,.first_FAT_active + LD B,A ; -.fat_calc_loop: ADD HL,DE +.fat_calc_loop: ADD HL,DE EXX - ADC HL,DE + ADC HL,DE EXX - DJNZ .fat_calc_loop + DJNZ .fat_calc_loop ; .first_FAT_active: - LD (FatBuffer.FAT1_SEC_L),HL - LD (FatBuffer.FAT2_SEC_L),HL + LD (FatBuffer.FAT1_SEC_L),HL EXX LD (FatBuffer.FAT1_SEC_H),HL - LD (FatBuffer.FAT2_SEC_H),HL - ; .mirrored_FATs: ; - LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT32.LABEL + LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) + LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + CALL CLUSTER_TO_SECTOR.no_prepare + LD (FatBuffer.RootDirFirstSector_L),IX + LD (FatBuffer.RootDirFirstSector_H),HL + LD A,FAT_TYPE.x32 ; - EXX - LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) - LD (FatBuffer.RootDirStartCluster_L),HL - LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (FatBuffer.RootDirStartCluster_H),DE - ; - CALL CLUSTER_TO_SECTOR.no_prepare - LD (FatBuffer.RootDirFirstSector_L),IX - LD (FatBuffer.RootDirFirstSector_H),HL - ; - LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) - LD (FatBuffer.FSINFO_Sector),HL - ; - LD A,FAT_TYPE.x32 - LD HL,#0FFF - LD (FatBuffer.END_CHAIN_CLUSTER_H),HL - LD H,L - LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) - LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) - ; -.SET_VARS: LD (FatBuffer.FAT_TYPE),A - LD (FatBuffer.END_CHAIN_CLUSTER_L),HL - LD (FatBuffer.BPB_SERIAL_NUMBER),DE - LD (FatBuffer.BPB_SERIAL_NUMBER+2),BC - EXX - LD DE,FatBuffer.BPB_LABEL - LD BC,11 ;!HARDCODE - LDIR +.SET_VARS: LD (FatBuffer.FAT_TYPE),A LD DE,0 CALL READ_FAT_TABLE AND A RET ; ;;;;;;;; - -; --> BC:HL - Sector -; <-- BC:HL - Cluster -SectorToCluster: - LD A,B - AND #0F - LD B,A - LD A,(FatBuffer.SectorsPerCluster) - ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - SCF -.loop: RRA - RET C - RR B - RR C - RR H - RR L - 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 +; DIV_for_SPC: +; LD C,A +; DEC A +; JR Z,.DIV_exit +; ; +; AND E +; LD B,A ; остаток +; LD A,C +; RRCA +; ; +; .DIV_loop: SRL H +; RR L +; RR D +; RR E +; RRCA +; JP NC,.DIV_loop +; LD A,B +; .DIV_exit: LD B,D +; LD C,E +; EX DE,HL +; LD H,0 +; LD L,A +; RET ; ;NSECTOR: ; in: HL':HL - CLUSTER @@ -1009,11 +853,11 @@ CLUSTER_TO_SECTOR: RL D ; RRA - JP NC,.loop + JR NC,.loop ; .skip: EX DE,HL - LD XL,E - LD XH,D + PUSH DE + POP IX LD DE,(FatBuffer.FirstDataSector_L) ADD IX,DE LD DE,(FatBuffer.FirstDataSector_H) @@ -1038,8 +882,10 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер файлов на FAT32 .NEXTSEC: PUSH AF ADD IX,BC - ADC HL,DE - ;HL:IX + JR NC,.skip_inc + INC HL + ;ADC HL,DE +.skip_inc: ;HL:IX PUSH IX PUSH HL LD BC,1*256 + BIOS.DRV_READ @@ -1053,19 +899,17 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) RET C RET NZ LD A,B - LD DE,0 + ;LD DE,0 LD BC,1 DEC A JR NZ,.NEXTSEC SCF RET ; - -; SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD - ADD IX,DE +.SKIPNAM_DE: ADD IX,DE DEC C RET Z ; @@ -1075,11 +919,11 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 RET Z ; CP #E5 - JR Z,.SKIPNAM + JR Z,.SKIPNAM_DE ; LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) AND FAT_ATTR.DIRECTORY - JR NZ,.SKIPNAM + JR NZ,.SKIPNAM_DE ; LD DE,CORE_NAME PUSH IX @@ -1131,7 +975,7 @@ LOAD_CORE: LD (READMEM),DE .subload: LD A,(.max_sectors) LD B,A LD C,BIOS.DRV_READ_LONG - LD A,(BANKDOS) + LD A,(LOAD_CORE.BANKDOS) EX AF,AF' LD A,(DRIVE) RST ToBIOS_18 @@ -1140,12 +984,11 @@ LOAD_CORE: LD (READMEM),DE POP HL EXX POP HL - ;AND A RET ; .SMALL_CLUSTER: LD B,A LD C,BIOS.DRV_READ_LONG - LD A,(BANKDOS) +.BANKDOS+1: LD A,0 EX AF,AF' LD A,(DRIVE) RST ToBIOS_18 @@ -1161,9 +1004,10 @@ LOAD_CORE: LD (READMEM),DE CCF RET NC ; [ ] загрузка system.dos больше #4000 байтов - LD A,(BIG_CORE) + +.BIG_CORE+1: LD A,0 DEC A - LD (BIG_CORE),A + LD (.BIG_CORE),A RET Z ; CALL READ_FROM_FAT @@ -1306,9 +1150,7 @@ NSECTOR: LD DE,0 ; если DE':DE = 0, то кластер HL':HL свободен ; CF - конец цепочки ;------------------------------------------------------------------------------------------------ -READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER - RET C - PUSH HL +READ_FROM_FAT: PUSH HL ; IN A,(SLOT3) PUSH AF @@ -1433,8 +1275,6 @@ GET_FAT12_CELL: LD D,H ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. 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 @@ -1451,7 +1291,6 @@ GET_FAT12_CELL: LD D,H ;выход: 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 @@ -1464,8 +1303,6 @@ GET_FAT16_CELL: LD A,H ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. 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 @@ -1513,32 +1350,6 @@ GET_FAT32_CELL: ; 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 - ; /* ;----------------- ; HL - CLUSTER @@ -1677,12 +1488,14 @@ READ_FAT_TABLE: PUSH HL ; BC:HL - номер лог.сектора LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE - EX DE,HL - LD XH,D - LD XL,E + ; + ; EX DE,HL + ; LD XH,D + ; LD XL,E + PUSH HL + POP IX + ; LD HL,(FatBuffer.FAT1_SEC_H) - ; JR NC,.no_inc - ; INC HL .no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING ; @@ -1691,10 +1504,11 @@ READ_FAT_TABLE: PUSH HL 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 + ; + IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A ; LD A,(FatBuffer.FAT_TYPE) XOR FAT_TYPE.x32 @@ -1704,8 +1518,8 @@ READ_FAT_TABLE: PUSH HL .next: LD A,(DRIVE) RST ToBIOS_18 ; - POP AF - OUT (SLOT3),A + POP AF + OUT (SLOT3),A POP HL RET ; @@ -1810,29 +1624,15 @@ FatBuffer EQU VALUE HANDBUF EQU VALUE + _sysFatBuffer FCLUSTER_H EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H -; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME -; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE FCLUSTR_L EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 PARTITION_START_H EQU FSIZE1+2 PARTITION_START_L EQU PARTITION_START_H+2 READMEM EQU PARTITION_START_L+2 -BIG_CORE EQU READMEM+2 -BANKDOS EQU BIG_CORE+1 -;SHEL_FM EQU VALUE+54 -; EQU VALUE+56 +;BIG_CORE EQU READMEM+2 -;----------------- -; BLOCK #8600-$-3,0 -; DB 'SPT' -; BIGA EQU (($/256)+1)*256 -; BIGA2 EQU BIGA-$-2 -; DS BIGA2 -; DB "dp" -; E______ -;STACK EQU (($/256)+2)*256 DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER diff --git a/BOOT/boot.asm b/BOOT/boot.asm index db16b5a..326d357 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -19,18 +19,18 @@ ; ; STRUCT _sysFatBuffer -.DRIVE: BYTE #FF +;.DRIVE: BYTE #FF .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32 .CacheBlock: WORD #0000 -.CacheUpdated: BYTE #00 +;.CacheUpdated: BYTE #00 ;.SectorsPerBank: BYTE #00 -.RootDirStartCluster_L: WORD #0000 -.RootDirStartCluster_H: WORD #0000 ; fat32 +;.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 +;.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 @@ -39,15 +39,15 @@ .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 +;.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 +;.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 @@ -77,7 +77,7 @@ BYTE ' Anatoliy ' BYTE ' Belyanskiy. ' BYTE ' Sprinter Team, ' - BYTE ' 2023 ' + BYTE ' 2024 ' ENDM diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 64844b3..92f79ab 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -19,6 +19,7 @@ CLOSE_FN: RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) JR Z,.NOTMODF + ; LD E,(IY+_sFM.DIR_CLUSTER_L) LD D,(IY+_sFM.DIR_CLUSTER_L+1) PUSH DE @@ -81,7 +82,5 @@ CLOSE_FN: CALL SAVEDIR .NOTMODF: LD A,(.TMP) - ;CALL RES_FM JP RES_FM - ;RET ; \ No newline at end of file diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 851fa33..3a075e5 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -158,10 +158,10 @@ SEARCH: OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.next_record + JR Z,.next_record_DE LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) AND C - JR NZ,.next_record + JR NZ,.next_record_DE LD HL,MASKARE LD D,XH LD E,XL @@ -199,12 +199,13 @@ SEARCH: AND A RET .next_record: + LD DE,FAT_DIRECTORY_RECORD +.next_record_DE: ;!TEST 9/11/23 record index ; EXX ; INC DE ; EXX ; - LD DE,FAT_DIRECTORY_RECORD ADD IX,DE JR NC,.loop .error_too_many_files: diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 5ff6b09..3bae86b 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -98,6 +98,7 @@ PUTCHAR: RET Z DEC E JP LOCATE + ; .LF_: CALL CURSOR LD A,D CP #1F From f2eb4e47e332b5b39700c95c22a7953088601999 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 9 Jun 2024 04:22:07 +1000 Subject: [PATCH 142/219] =?UTF-8?q?boot.asm,=20dssboot.asm=20-=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B8/=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D1=87=D0=B8=D0=BA=D0=B0=20=D0=B2/=D0=B8=D0=B7=20?= =?UTF-8?q?=D0=BD=D1=83=D0=BB=D0=B5=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 903 ++++++++++++------------------------------- BOOT/boot.asm | 242 +++++++----- DSS/FS/FAT/FAT_X.asm | 2 +- 3 files changed, 379 insertions(+), 768 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index d6e8802..06cc957 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -1,6 +1,6 @@ -;--------------------------------------------------------------- +;------------------------------------------------------------------------------ ;Rev Date Name Decription -;--------------------------------------------------------------- +;------------------------------------------------------------------------------ ;R04 25-03-2023 BAO ; !FIXIT ;R03 23-01-2000 DNS OPTIMIZE NEW BOOTING PROCEDURE ;R02 08-01-2000 DNS NEW BOOTING PROCEDURE @@ -11,14 +11,24 @@ ; + System Bootstrap + ; + Initial revision 09 Nov 1998 + ; +------------------------------+ + MODULE DSS_Boot_Loader ; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление. - DEFINE ORIGINAL_DSS 0 - DEFINE UNIVERSAL_BOOT 1 -LOAD_SECTORS EQU SECTORS_OF_LOADER-1 - DISP #8000 + ; 0 - оригинальный вариант запуска DSS, 1 - вариант Саймана + DEFINE ORIGINAL_DSS 0 + ; 1 - будет грузить версию Саймана и основную. 0 - только основную. + DEFINE UNIVERSAL_BOOT 1 + +;------------------------------------------------------------------------------ +ORG_ADDRESS EQU #8000 +LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB +LOADER_IN_BPB: +.MAX_SIZE EQU 300 +;------------------------------------------------------------------------------ + + DISP ORG_ADDRESS OUTPUT 'build/DSSloader.bin' @@ -301,9 +311,10 @@ PART_TB: PUSH BC LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; LD HL,YEPDOS + ; PUSH HL .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) - ; ЕСЛИ добавится поддержка ещё одного типа ФС, то поменять 1 на 2 + ; ЕСЛИ добавится поддержка ещё нескольких типов ФС, то поменять 1fs на 2fs ; 1 CP PartitionSysTypes.FAT16_LBA RET Z ;JR Z,YEPDOS @@ -318,13 +329,13 @@ PART_TB: PUSH BC CP PartitionSysTypes.FAT32_LBA RET Z ;JR Z,YEPDOS ; - ; 2 - ;EXX - ;LD HL,SUPPORTED_PARTITIONS - ;LD BC,SUPPORTED_PARTITIONS.Size - ;CPIR - ;EXX - ;JR Z,YEPDOS + ; 2fs + ; EXX + ; LD HL,SUPPORTED_PARTITIONS + ; LD BC,SUPPORTED_PARTITIONS.Size + ; CPIR + ; EXX + ; RET Z ;JR Z,YEPDOS ; .next: LD DE,_sMBR_PARTITION_RECORD ADD IX,DE @@ -332,7 +343,7 @@ PART_TB: PUSH BC ; LD HL,MESSAGES.ERRPART JP FAIL -; 2 +; 2fs ; SUPPORTED_PARTITIONS: ; ;.Empty DB #00 ; .FAT12 DB #01 @@ -378,163 +389,16 @@ YEPDOS: ;[ ] 17.12.2023 LD A,C ; RET + ; + ; - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -GET_BPB: LD IX,#0000 - LD HL,#0000 - LD DE,BOOT_BUFFER - LD BC,1*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - RET C - LD A,(DRIVE) - LD B,A - AND #F0 - LD C,A - CP #80 - JR NZ,.NX1 - CALL PART_TB ;HDD - RET C - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD (DRIVE+1),HL - ; -.NX1: CP #00 - JR NZ,.NX2 - ; - ; SET_PRM if FDD - PUSH BC - LD A,B - LD C,BIOS.DRV_GET_PAR - RST ToBIOS_18 - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) - LD L,A - POP AF - ;PUSH AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS_18 - ;POP BC - ;LD A,C ; нахера? - ;RET - -.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) - LD DE,#AA55 - AND A - SBC HL,DE - SCF - RET NZ - ; - LD IY,BOOT_BUFFER ;Analysing Block Parametr BIOS - LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) - CP #F0 - RET C - LD HL,0 ;calc. first sector FAT - LD (FatBuffer.RootDirFirstSector_H),HL - ; - LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec - LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) - ADD HL,DE - LD (FatBuffer.FAT1_SEC_L),HL ;first sector FAT - LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT - LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) - LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ;amount FATs -.C_DATA1: ADD HL,DE - DEC A - JR NZ,.C_DATA1 - LD (FatBuffer.RootDirFirstSector_L),HL ;first sector DIR - EX DE,HL - LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel - LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD A,H - SRL A - LD (FatBuffer.DirSizeInSectors),A ;Sectors per dir - LD L,A - LD H,0 - ADD HL,DE - LD (FatBuffer.FirstDataSector_L),HL ;First sector data - ; - LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector - LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) - LD HL,0 - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) -.NEXTAD3: ADD HL,BC ;calc. cluster size - DEC A - JR NZ,.NEXTAD3 - LD (FatBuffer.BytesPerCluster),HL - LD HL,BOOT_BUFFER + BOOT_SECTOR.ID_FAT - LD DE,FATMSG - LD B,3 -.R_BPBL1: LD A,(DE) - CP (HL) - JP NZ,.IBMDOS_ - INC HL - INC DE - DJNZ .R_BPBL1 -.FID: LD A,(HL) - INC HL - CP " " - JR Z,.FID - CP "1" - SCF - RET NZ - LD A,(HL) - CP "6" ; FAT16 - ;LD HL,#FFFF - JR Z,.BPB_FAT - CP "2" ; FAT12 - SCF - RET NZ - ;LD HL,#0FFF -.BPB_FAT: LD (FatBuffer.FAT_TYPE),A - ;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL - ; - LD IX,(PARTITION_START_L) - LD HL,(PARTITION_START_H) - LD DE,(FatBuffer.FAT1_SEC_L) - LD BC,#0000 - ADD IX,DE - ADC HL,BC - ;HL:IX - LD DE,FAT_SECTORS_BUFFER - LD BC,3*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - RET C - LD HL,0 - LD (FatBuffer.CacheBlock),HL - XOR A - RET - ; -.IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) - CP #F0 - RET C - CP #F8 - LD A,"6" - LD HL,#FFFF - JR Z,.BPB_FAT - LD A,"2" - LD HL,#0FFF - JR .BPB_FAT -;*/ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -;/* GET_BPB: LD HL,#0000 ; - LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 ; fat32 + LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 LD (FatBuffer.RootDirFirstSector_H),HL ;LD (FatBuffer.CacheBlock),HL XOR A - LD (FatBuffer.SectorsPerFAT_H),A ; fat32 + LD (FatBuffer.SectorsPerFAT_H),A ; PUSH HL POP IX @@ -545,6 +409,12 @@ GET_BPB: LD HL,#0000 LD A,(DRIVE) RST ToBIOS_18 RET C + ; перекидывание части загрузчика из 0 сектора + LD HL,BOOT_BUFFER + (_sBOOT_SECTOR.PARTITION_TABLE - ZERO_SECTOR_OF_BPB.Size) + LD DE,ZERO_SECTOR_OF_BPB + LD BC,ZERO_SECTOR_OF_BPB.Size + LDIR + ; LD A,(DRIVE) LD B,A AND #F0 @@ -632,14 +502,12 @@ GET_BPB: LD HL,#0000 ; EX DE,HL LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 - ; fat32 - LD A,H - OR L - JR Z,.skip_loop2 + LD A,H + OR L + JR Z,.skip_loop2 ; DEC HL XOR A - ;NEXTAD2 .loop2: INC A RET C SBC HL,BC @@ -799,33 +667,8 @@ GET_BPB: LD HL,#0000 AND A RET ; -;;;;;;;; -; -; HL:DE / A => DE:BC, H=0, L - остаток -; DIV_for_SPC: -; LD C,A -; DEC A -; JR Z,.DIV_exit -; ; -; AND E -; LD B,A ; остаток -; LD A,C -; RRCA -; ; -; .DIV_loop: SRL H -; RR L -; RR D -; RR E -; RRCA -; JP NC,.DIV_loop -; LD A,B -; .DIV_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 @@ -865,9 +708,8 @@ CLUSTER_TO_SECTOR: ; POP BC RET -; -;*/ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ; + ; поиск system.dos GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) @@ -879,7 +721,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD A,(FatBuffer.DirSizeInSectors) JR NZ,.NEXTSEC ; - LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер файлов на FAT32 + LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32 .NEXTSEC: PUSH AF ADD IX,BC JR NC,.skip_inc @@ -1018,232 +860,9 @@ LOAD_CORE: LD (READMEM),DE EXX EX DE,HL JP .loop - -; HL - CLUSTER -; DE - ADDRESS -;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы -; FLOAD: LD (READMEM),DE -; .LD_FILE: PUSH HL ; system.dos first cluster -; CALL NSECTOR ; Cluster to Sector -; LD DE,(READMEM) -; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) -; CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов -; LD C,BIOS.DRV_READ_LONG -; JR C,.SMALL_CLUSTER -; LD A,(BANKDOS) -; EX AF,AF' -; ;LD BC,#20*256 + BIOS.DRV_READ_LONG -; LD B,#20 ; !HARDCODE кол-во загружаемых секторов -; .set_drv: LD A,(DRIVE) -; RST ToBIOS_18 -; JP C,GOOD_DRIVE.NoShell -; POP HL -; ; [ ] загрузка system.dos больше #4000 байтов -; ;AND A -; ;RET -; LD A,(BIG_SHELL) -; OR A -; RET Z -; ; -; XOR A -; LD (BIG_SHELL),A -; PUSH HL -; CALL NSECTOR -; LD DE,#20 ; !HARDCODE кол-во прочитанных секторов -; AND A -; ADD IX,DE -; JR NC,.no_inc_hl -; INC HL -; .no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE кол-во ДОзагружаемых секторов -; LD DE,#4000 -; JR .set_drv -; ; -; .SMALL_CLUSTER: LD B,A -; LD A,(BANKDOS) -; EX AF,AF' -; LD A,(DRIVE) -; RST ToBIOS_18 -; JP C,GOOD_DRIVE.NoShell -; ; -; LD HL,(READMEM) -; LD DE,(CLU_LEN) -; ADD HL,DE -; LD (READMEM),HL -; ; [ ] загрузка system.dos больше #4000 байтов -; ;POP HL -; ;RET C -; CALL C,.more_than_1 -; POP HL -; RET C -; ; -; CALL R_F_FAT ; next cluster in chain -; RET C -; EX DE,HL -; JP .LD_FILE -; ; [ ] загрузка system.dos больше #4000 байтов -; .more_than_1: LD A,(BIG_SHELL) -; OR A -; SCF -; RET Z -; IN A,(SLOT1) -; LD HL,BANKDOS -; CP (HL) -; CCF -; RET Z -; LD (BANKDOS),A -; LD HL,#C000 -; LD (READMEM),HL -; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) -; SUB SUBLOAD_SIZE + 1 -; CCF -; RET NC -; LD A,SUBLOAD_SIZE -; LD (BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster),A -; AND A -; RET + ; -; -/* -; --> HL - CLUSTER -; <-- HL:IX - SECTOR -NSECTOR: LD DE,0 - DEC HL - DEC HL - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - XOR 1 - JR Z,.skip - ; - RRA -.loop: ADD HL,HL - RL E - RL D - RRA - JP NC,.loop - ; -.skip: EX DE,HL - PUSH DE - POP IX - LD DE,(FatBuffer.FirstDataSector_L) ;first data sector - XOR A - ADD IX,DE - LD D,A - LD E,A - ADC HL,DE - ; - LD DE,(PARTITION_START_L) - ADD IX,DE - LD DE,(PARTITION_START_H) - ADC HL,DE - RET -*/ - - -;------------------------------------------------------------------------------------------------ -; Прочитать из кеша FAT-а номер след. кластера -; вход: hl - номер кластера (младшее слово) -; hl' - номер кластера (старшее слово. только для FAT32) -; выход: hl - номер кластера (младшее слово) -; hl' - номер кластера (старшее слово) -; de - номер след. кластера (младшее слово) -; de' - номер след. кластера (старшее слово) -; если DE':DE = 0, то кластер HL':HL свободен -; CF - конец цепочки -;------------------------------------------------------------------------------------------------ -READ_FROM_FAT: 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 - чётный/нечётный адрес кластера @@ -1302,177 +921,15 @@ GET_FAT16_CELL: LD A,H AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - 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 - ; -/* -;----------------- -; HL - CLUSTER -; DE - (CLUSTER) -R_F_FAT: PUSH HL - LD A,(FatBuffer.FAT_TYPE) - 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 ; [ ] fat32 тут счётчик в 32 бита нужен или 16, если страницу FF использовать - SBC HL,DE - JP NC,.R_F_00H - ADD HL,DE - ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - DEC A - LD BC,(FatBuffer.CacheBlock) ; A - ELEMENT OF CASH - CP C - CALL NZ,RE_FAT - LD DE,FAT_SECTORS_BUFFER - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) - LD HL,#FFEF - ; -.exit: XOR A - SBC HL,DE - POP HL - 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,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - 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 - LD BC,(FatBuffer.CacheBlock) - CP C - CALL NZ,RE_FAT - LD DE,FAT_SECTORS_BUFFER - ADD HL,DE - POP AF - LD E,(HL) - INC HL - LD D,(HL) - JP C,.R_F_F01 - LD A,D - AND #0F - LD D,A - JR .R_F_F02 - ; -.R_F_F01: LD A,E - AND #F0 - RR D ; вправо на 4 битa - RRA - RR D - RRA - RR D - RRA - RR D - RRA + LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + CP E LD E,A ; -.R_F_F02: LD HL,#0FEF - JR .exit - ; XOR A - ; SBC HL,DE - ; POP HL - ; RET -; -*/ -; - -; -/* -RE_FAT: PUSH HL - LD L,A - LD H,0 - LD (FatBuffer.CacheBlock),HL - LD E,L - LD D,H - ADD HL,HL - ADD HL,DE - LD IX,0 - LD DE,(FatBuffer.FAT1_SEC_L) - ADD HL,DE - EX DE,HL - JR NC,.NOINX - INC IX -.NOINX: LD HL,(PARTITION_START_L) - ADD HL,DE - EX DE,HL - LD BC,(PARTITION_START_H) - JR NC,.NOINX2 - INC IX -.NOINX2: ADD IX,BC - PUSH IX - PUSH DE - POP IX - POP HL - LD DE,FAT_SECTORS_BUFFER - LD BC,3*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - POP HL + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT RET -*/ + ; ; ;RE_FAT: ;RX01 @@ -1542,6 +999,198 @@ GET_SECTOR_OF_FAT: ; LD C,A RET + ; + + +; +; HL:DE / A => DE:BC, H=0, L - остаток +; DIV_for_SPC: +; LD C,A +; DEC A +; JR Z,.DIV_exit +; ; +; AND E +; LD B,A ; остаток +; LD A,C +; RRCA +; ; +; .DIV_loop: SRL H +; RR L +; RR D +; RR E +; RRCA +; JP NC,.DIV_loop +; LD A,B +; .DIV_exit: LD B,D +; LD C,E +; EX DE,HL +; LD H,0 +; LD L,A +; RET + + +//// //// //// //// //// //// //// //// //// + //// //// //// //// //// //// //// //// //// + DISPLAY "SECTORS 1..3 DATA ENDS: ",/H,$,". Size: ",/D,$-ORG_ADDRESS," b. Free: ",/D,512*3-($-ORG_ADDRESS)," b." +ZERO_SECTOR_OF_BPB: +.physical EQU $$$ +//// //// //// //// //// //// //// //// //// + //// //// //// //// //// //// //// //// //// +;вход: 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 + 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 + ; +;------------------------------------------------------------------------------------------------ +; Прочитать из кеша FAT-а номер след. кластера +; вход: hl - номер кластера (младшее слово) +; hl' - номер кластера (старшее слово. только для FAT32) +; выход: hl - номер кластера (младшее слово) +; hl' - номер кластера (старшее слово) +; de - номер след. кластера (младшее слово) +; de' - номер след. кластера (старшее слово) +; если DE':DE = 0, то кластер HL':HL свободен +; CF - конец цепочки +;------------------------------------------------------------------------------------------------ +READ_FROM_FAT: 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 + 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 + ; +//// //// //// //// //// //// //// //// //// + //// //// //// //// //// //// //// //// //// + DISPLAY "SECTORS 0 DATA ENDS:\t\t",/H,$,". Size: ",/D,$-ZERO_SECTOR_OF_BPB," b. Free: ",/D,LOADER_IN_BPB.MAX_SIZE-($-ZERO_SECTOR_OF_BPB)," b." + DISPLAY "_sBOOT_SECTOR.BOOT_CODE ", /H, _sBOOT_SECTOR.BOOT_CODE + DISPLAY "_sBOOT_SECTOR.PARTITION_TABLE ", /H, _sBOOT_SECTOR.PARTITION_TABLE + DISPLAY "_sBOOT_SECTOR.MBR_SIGNATURE ", /H, _sBOOT_SECTOR.MBR_SIGNATURE +ZERO_SECTOR_OF_BPB_END: +ZERO_SECTOR_OF_BPB.Size EQU ZERO_SECTOR_OF_BPB_END - ZERO_SECTOR_OF_BPB +//// //// //// //// //// //// //// //// //// + //// //// //// //// //// //// //// //// //// +; + +; //////////////////////////////////////////////////////////////////////// ; Area for boot sector [512Bytes] ;BOOT _sBOOT_SECTOR_PARAMS = $ @@ -1554,72 +1203,6 @@ 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 -.CacheBlock EQU FatBuffer+0 ; FatCache -.FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT -.RootDirFirstSector_H EQU FatBuffer+4 ; DIR_FRH MSD_CAT_SEC first sector DIR -.RootDirFirstSector_L EQU FatBuffer+6 ; DIR_FRL MSD_CAT_SEC first sector DIR -.DirSizeInSectors EQU FatBuffer+8 ; DIR_S_S DIR_SEC_SIZE -.FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC -.FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) -.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 -*/ - - -; FatCache EQU VALUE+0 ; .CacheBlock -; FAT_FRM EQU FatCache+2 ; .FAT1_SEC_L MSD_FAT_SEC first sector FAT -; DIR_FRH EQU FatCache+4 ; .RootDirFirstSector_H MSD_CAT_SEC first sector DIR -; DIR_FRL EQU FatCache+6 ; .RootDirFirstSector_L MSD_CAT_SEC first sector DIR -; DIR_S_S EQU FatCache+8 ; .DirSizeInSectors DIR_SEC_SIZE -; DAT_FRM EQU FatCache+9 ; .FirstDataSector_L MSD_DAT_SEC -; FAT_TYP EQU FatCache+11; .FAT_TYPE ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) -; CLU_LEN EQU FatCache+12; .BytesPerCluster -; ENDCLUS EQU FatCache+14; .END_CHAIN_CLUSTER_L - HANDBUF EQU VALUE + _sysFatBuffer diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 326d357..73d3e5d 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -1,6 +1,9 @@ //////////////////////////////////////////////////////////////////////// ; CHANGELOG -; [ ] - определение попытки сделать загрузочным не первый раздел +; [x] - загрузка с любого primary active раздела +; [x] - поддержка загрузки с FAT32 раздела +; [x] - загрузка с RAM диска +; [x] - bug fixes and optimizations))) //////////////////////////////////////////////////////////////////////// @@ -20,41 +23,41 @@ ; 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 +.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 +.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 +.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 +;.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 +;.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 ; количество секторов на цилиндре +;.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' @@ -85,7 +88,9 @@ major_version equ 2 ; ст. номер версии minor_version equ 0 ; мл. номер ;; -SECTORS_OF_LOADER EQU 4 +SECTORS_OF_LOADER EQU 4 ; секторов загрузчика +.IN_BPB EQU 1 +.AFTER_BPB EQU 3 org_addr EQU #8000 + CLP_Buffer code_addr EQU BEGIN @@ -110,7 +115,7 @@ BEGIN: in a,(SLOT3) ld de,#0146 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 and a sbc hl,de - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого ;jr nc,version_ok jr z,.check_build ; если номер версии 1.70 jr nc,version_ok ; если номер версии больше 1.70 @@ -120,7 +125,7 @@ BEGIN: in a,(SLOT3) call print_string ld a,-1 jp exit - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого .check_build: ld hl,810 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 sbc hl,bc jr nc,BEGIN.old_ver @@ -315,8 +320,6 @@ write_boot_loader: jr z,write_to_floppy cp #FA ; RAM disk jr z,write_to_ram_disk - ; pop hl ; восст. баланс стека - ; call close_device cp #F8 ; винт jp z,write_to_hard_disk scf ; незнакомый формат @@ -348,19 +351,20 @@ write_to_floppy: ld (buffer + BOOT_SECTOR.Number_of_FATs),a ; число копий FAT-ов ld hl,(buffer + BOOT_SECTOR.RESERVED_SECTORS) ; зарезерв. секторов ld bc,(buffer + BOOT_SECTOR.SectorsPerFAT16) ; секторов на FAT - ; ld a,b - ; or c - ; scf - ; ret z ; 0 секторов на FAT - ; ; add hl,bc ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; зарезерв. секторов dec hl - ld de,SECTORS_OF_LOADER + ld de,SECTORS_OF_LOADER.AFTER_BPB and a sbc hl,de - ret c + ret c overwrite_floppy: + ; перекидывание части загрузчика в 0 сектор + LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical + LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size) + LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size + LDIR + ; ; записать boot-сектор назад ld a,(disk) ; заданный номер диска ld hl,0 ; ст. разряд лог. сектора @@ -374,7 +378,7 @@ overwrite_floppy: ld hl,0 ; ст. разряд лог. сектора ld ix,1 ; мл. разряд ld de,code_loader ; откуда (код загрузчика) - ld bc,SECTORS_OF_LOADER*256 + Dss.DRV.Write ; записать 3 сектора (размер загр.) + ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+Dss.DRV.Write; записать 3 сектора (размер загр.) rst ToDSS.DRV ret @@ -386,69 +390,27 @@ overwrite_floppy: ; выход: CF-ошибка записи ;------------------------------------------------- write_to_ram_disk: -write_to_: ld a,(disk) ; номер заданного диска - ld de,#55AA - ld bc,Dss.DRV.GenIOCTL.GetParams - rst ToDSS.DRV - ex af,af' - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - ld b,a - inc c - scf - ret z ; !TODO загрузка с расширенного раздела не поддерживается - dec c - CP #80 ;!HARDCODE тип драйва - HDD - JR NC,.skip_FAT_check - push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR - ; [x] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) - LD HL,0 - LD IX,0 - LD DE,buffer - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP BC - LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) - LD DE,SECTORS_OF_LOADER + 1 ; минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) - AND A - SBC HL,DE - RET C + CALL write_no_BPB + RET C + ; buffer = sector 0 ; -.skip_FAT_check:; - push bc - ld a,b - ld hl,0 ; ст. разряд лог. сектора - ld ix,1 ; мл. разряд - ld de,code_loader ; откуда (код загрузчика) - ld bc,SECTORS_OF_LOADER*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) - rst ToBIOS - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - pop bc - ; - ret + JR write_to_BPB + write_to_hard_disk: ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - CALL write_to_ + CALL write_no_BPB RET C - ; проверка на РАМ-диск + ; buffer = sector 0 + ; + ; проверка на РАМ-диск (разделы на рамдиске пока не поддерживаются) LD A,B CP #80-1 ;!HARDCODE HDD number - CCF - RET NC + JR C,write_to_BPB ; - PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR - LD HL,0 - LD IX,0 - LD DE,buffer - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - ; check signature - LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE) - LD DE,#AA55 - AND A - SBC HL,DE - POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR - SCF + PUSH BC + CALL Read_MBR RET NZ + POP BC PUSH BC ; set active in buffer INC C @@ -464,7 +426,6 @@ write_to_hard_disk: ; LD A,#80 LD (HL),A - ;!FIXIT fat32 not supported PUSH HL INC HL INC HL @@ -492,16 +453,81 @@ write_to_hard_disk: .next: AND A SBC HL,DE DJNZ .loop - ; save buffer to disk - POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR - ld a,b - ld hl,0 ; ст. разряд лог. сектора - ld ix,0 ; мл. разряд - ld de,buffer ; откуда (код загрузчика) - ld bc,1*256 + BIOS.DRV_WRITE ; записать 1 сектор - RST ToBIOS - RET ; + JR write_to_BPB.no_push +write_to_BPB: PUSH BC + ; перекидывание части загрузчика в 0 сектор +.no_push: LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical + LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size) + LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size + LDIR + ; запись в 0 сектор куска загрузчика + pop af ; заданный номер диска + ld hl,0 ; ст. разряд лог. сектора + ld ix,0 ; мл. разряд + ld de,buffer ; откуда (код загрузчика) + ld bc,1*256 + BIOS.DRV_WRITE ; записать 1 сектор + RST ToBIOS + RET + ; + +; +write_no_BPB: ld a,(disk) ; номер заданного диска + ld de,#55AA + ld bc,Dss.DRV.GenIOCTL.GetParams + rst ToDSS.DRV + ex af,af' + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + ld b,a + inc c + scf + ret z ; !TODO загрузка с расширенного раздела не поддерживается + dec c + CP #80 ;!HARDCODE тип драйва - HDD + JR NC,.skip_FAT_check + PUSH BC + ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + ; A - PHISICAL DRIVE NUMBER + ; [x] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) + CALL Read_MBR + RET NZ + POP BC + LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) + ; минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) + LD DE,SECTORS_OF_LOADER.AFTER_BPB + 1 + AND A + SBC HL,DE + RET C + ; +.skip_FAT_check:; + push bc + ld a,b + ld hl,0 ; ст. разряд лог. сектора + ld ix,1 ; мл. разряд + ld de,code_loader ; откуда (код загрузчика) + ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+BIOS.DRV_WRITE; записать 3 сектора (размер загр.) + rst ToBIOS + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + pop bc + ; + ret + + +; in: a - drive +; out CF = 1. +; ZF = 1 - OK, +; ZF = 0 - error +Read_MBR: LD HL,0 + LD IX,0 + LD DE,buffer + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE) + LD DE,#AA55 + AND A + SBC HL,DE + SCF + RET ;------------------------------------------------- ; Выделить заданный диск из ком-строки ; @@ -867,6 +893,8 @@ write_file: ld a,FAT_ATTR.ARCHIVE ; ; ДОС-загрузчик code_loader: include 'dssboot.asm' ; универсальный загрузчик для старого и нового доса code_loader.size EQU $-code_loader + ASSERT SECTORS_OF_LOADER*512 >= (code_loader.size), "incorrect value of the SECTORS_OF_LOADER variable" + DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",/D,(code_loader.size/512 + (code_loader.size mod 512)/(code_loader.size mod 512)) diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index baefe86..b69ab5e 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -876,7 +876,7 @@ GET_FAT32_CELL: LD H,A ADD HL,HL ADD HL,HL - PUSH HL ; [ч] fat32 сохраняем на случай, если READ_FAT_TABLE испортит + PUSH HL ; [x] fat32 сохраняем на случай, если READ_FAT_TABLE испортит AND A ; EXX From 6cbff3cf53075cff4a87bc4919926808860514a4 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 9 Jun 2024 08:00:03 +1000 Subject: [PATCH 143/219] bugfixes --- BOOT/DSSBOOT.ASM | 119 ++++++++++++++++++++++---------------------- DSS/API/Create.asm | 2 +- DSS/API/Execute.ASM | 6 +-- DSS/FS/FAT/FAT.asm | 5 +- Shared_Includes | 2 +- 5 files changed, 66 insertions(+), 68 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 06cc957..b28f810 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -25,7 +25,7 @@ ORG_ADDRESS EQU #8000 LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB LOADER_IN_BPB: -.MAX_SIZE EQU 300 +.MAX_SIZE EQU _sBOOT_SECTOR.PARTITION_TABLE - _sBOOT_SECTOR_PARAMS_FAT32 ;------------------------------------------------------------------------------ DISP ORG_ADDRESS @@ -863,6 +863,64 @@ LOAD_CORE: LD (READMEM),DE ; +; +; HL:DE / A => DE:BC, H=0, L - остаток +; DIV_for_SPC: +; LD C,A +; DEC A +; JR Z,.DIV_exit +; ; +; AND E +; LD B,A ; остаток +; LD A,C +; RRCA +; ; +; .DIV_loop: SRL H +; RR L +; RR D +; RR E +; RRCA +; JP NC,.DIV_loop +; LD A,B +; .DIV_exit: LD B,D +; LD C,E +; EX DE,HL +; LD H,0 +; LD L,A +; RET + + +//// //// //// //// //// //// //// //// //// + //// //// //// //// //// //// //// //// //// + DISPLAY "SECTORS 1..3 DATA ENDS:\t",/H,$,". Size: ",/D,$-ORG_ADDRESS," b. Free: ",/D,512*3-($-ORG_ADDRESS)," b." +ZERO_SECTOR_OF_BPB: +.physical EQU $$$ +//// //// //// //// //// //// //// //// //// + //// //// //// //// //// //// //// //// //// + + +;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 + ; + + ;вход: HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE ; CF - чётный/нечётный адрес кластера @@ -979,63 +1037,7 @@ READ_FAT_TABLE: PUSH HL 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 - ; - -; -; HL:DE / A => DE:BC, H=0, L - остаток -; DIV_for_SPC: -; LD C,A -; DEC A -; JR Z,.DIV_exit -; ; -; AND E -; LD B,A ; остаток -; LD A,C -; RRCA -; ; -; .DIV_loop: SRL H -; RR L -; RR D -; RR E -; RRCA -; JP NC,.DIV_loop -; LD A,B -; .DIV_exit: LD B,D -; LD C,E -; EX DE,HL -; LD H,0 -; LD L,A -; RET - - -//// //// //// //// //// //// //// //// //// - //// //// //// //// //// //// //// //// //// - DISPLAY "SECTORS 1..3 DATA ENDS: ",/H,$,". Size: ",/D,$-ORG_ADDRESS," b. Free: ",/D,512*3-($-ORG_ADDRESS)," b." -ZERO_SECTOR_OF_BPB: -.physical EQU $$$ -//// //// //// //// //// //// //// //// //// - //// //// //// //// //// //// //// //// //// ;вход: HL':HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_CELL: ; двигаем влево HL':H @@ -1181,9 +1183,6 @@ READ_FROM_FAT: PUSH HL //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// DISPLAY "SECTORS 0 DATA ENDS:\t\t",/H,$,". Size: ",/D,$-ZERO_SECTOR_OF_BPB," b. Free: ",/D,LOADER_IN_BPB.MAX_SIZE-($-ZERO_SECTOR_OF_BPB)," b." - DISPLAY "_sBOOT_SECTOR.BOOT_CODE ", /H, _sBOOT_SECTOR.BOOT_CODE - DISPLAY "_sBOOT_SECTOR.PARTITION_TABLE ", /H, _sBOOT_SECTOR.PARTITION_TABLE - DISPLAY "_sBOOT_SECTOR.MBR_SIGNATURE ", /H, _sBOOT_SECTOR.MBR_SIGNATURE ZERO_SECTOR_OF_BPB_END: ZERO_SECTOR_OF_BPB.Size EQU ZERO_SECTOR_OF_BPB_END - ZERO_SECTOR_OF_BPB //// //// //// //// //// //// //// //// //// diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 88bfdea..85cdc5d 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -3,7 +3,7 @@ ; A - File attribute ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE: ;!TEST Current Dir ;[x] 15/10/23 +CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: PUSH HL LD C,A PUSH BC diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 7fe4321..a6bc6fe 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -562,6 +562,9 @@ LEAVE: LD A,B LD (EXSTACK),SP LD SP,HL ; + ;!TEST + EI + ; EX DE,HL LD A,(ErrorLevel) ;R12 @@ -573,9 +576,6 @@ LEAVE: LD A,B JP (HL) ; .norm_exit: AND A - ;!TEST - EI - ; JP (HL) ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 3a075e5..2e7ad33 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -158,10 +158,10 @@ SEARCH: OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.next_record_DE + JR Z,.next_record LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) AND C - JR NZ,.next_record_DE + JR NZ,.next_record LD HL,MASKARE LD D,XH LD E,XL @@ -200,7 +200,6 @@ SEARCH: RET .next_record: LD DE,FAT_DIRECTORY_RECORD -.next_record_DE: ;!TEST 9/11/23 record index ; EXX ; INC DE diff --git a/Shared_Includes b/Shared_Includes index 314ff5d..378f3fd 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 314ff5dbefe8d537655601dde8236957e4ed39a7 +Subproject commit 378f3fdd49601390b3aacfe51e45c6fceba25022 From 51c118ee62f7e34a56cf457730a668d0d180ac5e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 10 Jun 2024 01:29:44 +1000 Subject: [PATCH 144/219] bugfixes --- BOOT/DSSBOOT.ASM | 26 +++++++++++++------------- BOOT/boot.asm | 3 ++- SHELL/build.txt | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index b28f810..265a29d 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -300,34 +300,34 @@ INC_SECTOR_NUM: PUSH DE ; ; -PART_TB: PUSH BC - LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) +PART_TB: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 ; CF = 0 SBC HL,DE SCF RET NZ + ; + PUSH BC LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; LD HL,YEPDOS ; - PUSH HL .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) ; ЕСЛИ добавится поддержка ещё нескольких типов ФС, то поменять 1fs на 2fs ; 1 CP PartitionSysTypes.FAT16_LBA - RET Z ;JR Z,YEPDOS + JR Z,YEPDOS CP PartitionSysTypes.FAT16 - RET Z ;JR Z,YEPDOS + JR Z,YEPDOS CP PartitionSysTypes.FAT16_32Mb - RET Z ;JR Z,YEPDOS + JR Z,YEPDOS CP PartitionSysTypes.FAT12 - RET Z ;JR Z,YEPDOS + JR Z,YEPDOS CP PartitionSysTypes.FAT32 - RET Z ;JR Z,YEPDOS + JR Z,YEPDOS CP PartitionSysTypes.FAT32_LBA - RET Z ;JR Z,YEPDOS + JR Z,YEPDOS ; ; 2fs ; EXX @@ -724,10 +724,10 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32 .NEXTSEC: PUSH AF ADD IX,BC - JR NC,.skip_inc - INC HL - ;ADC HL,DE -.skip_inc: ;HL:IX + ;JR NC,.skip_inc + ;INC HL + ADC HL,DE +;.skip_inc: ;HL:IX PUSH IX PUSH HL LD BC,1*256 + BIOS.DRV_READ diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 73d3e5d..807fd47 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -105,7 +105,8 @@ page_buffer equ #C000 ; include 'Shared_Includes/constants/EXE_Header.z80' ORG org_addr -BEGIN: in a,(SLOT3) +BEGIN: ;di + in a,(SLOT3) ld (port+1),a ; сохр. порт push ix call save_path ; сохр. тек. диск и путь diff --git a/SHELL/build.txt b/SHELL/build.txt index cdf1f34..57db2e9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -403 \ No newline at end of file +404 \ No newline at end of file From e20a714f08cde5ac5fe94b8e1a11342f4ef542c4 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 15 Jun 2024 04:49:18 +1000 Subject: [PATCH 145/219] bugfixes --- BOOT/DSSBOOT.ASM | 6 +-- BOOT/boot.asm | 27 ++++++----- DSS/API/Attribute.asm | 11 ++++- DSS/API/ChDir.asm | 9 ++++ DSS/API/Create.asm | 20 ++++++++- DSS/API/Delete.asm | 10 ++++- DSS/API/Execute.ASM | 84 ++++++++++++++++++++++------------- DSS/API/Find.asm | 8 ++++ DSS/API/MkDir.asm | 9 +++- DSS/API/Open.asm | 9 +++- DSS/API/Read.asm | 17 +------ DSS/API/Rename.asm | 8 ++++ DSS/API/RmDir.asm | 7 +++ DSS/API/ScanDRV.asm | 22 ++++++++- DSS/API/Write.asm | 17 +------ DSS/API/curDisk.asm | 8 ++++ DSS/API/diskINF.asm | 14 ++++-- DSS/FS/FAT/FAT.asm | 4 +- DSS/FS/FAT/FAT_X.asm | 22 ++++----- DSS/Procedures.asm | 2 +- DSS/Structures.inc | 24 +++++----- DSS/VERSION.INC | 13 +++++- DSS/VIDEO.ASM | 25 ++++++----- DSS/build.txt | 2 +- DSS/defines.inc | 3 ++ DSS/drivers/media/ide-drv.asm | 14 +++--- 26 files changed, 263 insertions(+), 132 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 265a29d..11278c2 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -591,7 +591,7 @@ GET_BPB: LD HL,#0000 ; LD A,(FatBuffer.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток - ;CALL DIV_for_SPC + ;CALL DIV_by_Shifts LD C,A DEC A JR Z,.DIV_exit @@ -624,7 +624,7 @@ GET_BPB: LD HL,#0000 LD A,FAT_TYPE.x12 JR NC,.SET_VARS ; - LD HL,65525 + LD HL,65524 SBC HL,BC LD A,FAT_TYPE.x16 JR NC,.SET_VARS @@ -865,7 +865,7 @@ LOAD_CORE: LD (READMEM),DE ; ; HL:DE / A => DE:BC, H=0, L - остаток -; DIV_for_SPC: +; DIV_by_Shifts: ; LD C,A ; DEC A ; JR Z,.DIV_exit diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 807fd47..855099d 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -6,7 +6,6 @@ ; [x] - bug fixes and optimizations))) //////////////////////////////////////////////////////////////////////// - ; Программа записи на FDD/HDD boot-загрузчика и файлов системы. ; ; Загружает сист. файлы из корня диска, с которого была @@ -59,7 +58,7 @@ ;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DWORD #0000 ; количество секторов на цилиндре ENDS - + includelua 'Shared_includes/lua/Functions.lua' include 'shared_includes/constants/sp2000.inc' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' @@ -69,6 +68,15 @@ ;include 'DSS/structures.inc' include '../DSS/defines.inc' + LUA PASS1 + local date, month, year = Get_date_RU(sj.get_define("__DATE__")) + BuildDate = "'" .. date .. "." .. month .. "." .. year .. "'" + sj.insert_define("SYS_BUILD_DATE", BuildDate) + ENDLUA + LUA ALLPASS + sj.insert_define("SYS_BUILD_DATE", BuildDate) + ENDLUA + DEFINE EXEinfoMACRO 0 DEFINE App_EXE_Version 1 MACRO _mEXEinfo @@ -473,7 +481,7 @@ write_to_BPB: PUSH BC ; ; -write_no_BPB: ld a,(disk) ; номер заданного диска +write_no_BPB: ld a,(disk) ; номер заданного диска ld de,#55AA ld bc,Dss.DRV.GenIOCTL.GetParams rst ToDSS.DRV @@ -482,9 +490,9 @@ write_no_BPB: ld a,(disk) ; ld b,a inc c scf - ret z ; !TODO загрузка с расширенного раздела не поддерживается + ret z dec c - CP #80 ;!HARDCODE тип драйва - HDD + CP #80 ;!HARDCODE тип драйва - HDD JR NC,.skip_FAT_check PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR @@ -566,10 +574,6 @@ get_drive_letter: get_drive_err: scf ; ошибка ret - - - - ;---------------------------------------------------- ; сохр. тек. системный диск и путь ;---------------------------------------------------- @@ -630,8 +634,9 @@ messages: db 0 db "\r\nBoot and System files Installer v" ;0 db major_version + '0','.' db (minor_version / 10) + '0',(minor_version % 10) + '0','.' - db "\r\n\nCopyright (c) 2006 Vasil Ivanov." - db "\r\n\nCopyright (c) 2023-2024 Sprinter Team." + db "\r\nBuild date ",SYS_BUILD_DATE + db "\r\nCopyright (c) 2006 Vasil Ivanov." + db "\r\nCopyright (c) 2023-2024 Sprinter Team." db "\r\n\n",0 ; db "System successfully installed on disk " ;1 diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index a973978..f0dcb81 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -8,13 +8,22 @@ //////////////////////////////////////////////////////////////////////// ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD C,A + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ; + ENDIF + ; PUSH HL PUSH BC CALL DIR_PATH_CHECK POP BC POP HL RET C - LD A,C +.old_EXE: LD A,C ; ; INC B diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index daaec16..5a50614 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -11,6 +11,15 @@ //////////////////////////////////////////////////////////////////////// CHDIR_FN: ;!TEST Current Dir ;[x] 15/10/23 + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD A,(EXE_VERSION) + OR A + JR Z,CHDIR + ; + ENDIF + ; PUSH HL CALL DIR_PATH_CHECK POP HL diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 85cdc5d..6189a72 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -6,12 +6,20 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: PUSH HL LD C,A + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; PUSH BC CALL DIR_PATH_CHECK POP BC POP HL RET C - LD A,C +.old_EXE: LD A,C ; CALL .Prepare RET C @@ -33,12 +41,20 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: .NEW: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL LD C,A + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; PUSH BC CALL DIR_PATH_CHECK POP BC POP HL RET C - LD A,C +.old_EXE_: LD A,C ; CALL .Prepare RET C diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index d03c56f..25017f3 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -4,12 +4,20 @@ //////////////////////////////////////////////////////////////////////// DEL_FN: ;!TEST ;!TEST Current Dir ;[x] 15/10/23 + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; PUSH HL CALL DIR_PATH_CHECK POP HL RET C ; - CALL GETWORD ; тест на допуст. имя и настр. на диск +.old_EXE: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C CALL MASK RET C diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index a6bc6fe..7f22599 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -87,7 +87,7 @@ EXEC: LD (CMDLINE),HL ;LD HL,(CMDLINE) JR C,EXEC0_SHORT .VAR_2: CALL EXEC_1 - ;LD A,DSS_Error.sys.FILE_NOT_FOUND + LD A,DSS_Error.sys.FILE_NOT_FOUND SCF RET ; File not found - exit @@ -124,8 +124,11 @@ EXEC_1: ;LD (CMDLINE),HL ; ;SHORT NAME ;TRY TO FIND IN CURRENT DIRECTORY -EXEC0_SHORT: CALL EXEC_1 - RET C +EXEC0_SHORT: ; если убрать, то будет как в linux - короткое имя запускает EXE только из прописанных директорий, + ; а если нужно запустить файл из текущей директории, то так: ".\run.exe" + CALL EXEC_1 + RET C + ; ;FILE NOT FOUND, SEARCHING IN PATH ; GET PATH AND ETC. LD HL,ENVPATH @@ -149,7 +152,7 @@ COPYEXN: LD A,(HL) ; EXEC02: LD (EXE_FM),A LD HL,CORE_BUFFERS.EXEBUFF - LD DE,#0080 ;!#0200(512) ;R02 + LD DE,_sEXE_HEADER.UnUsedPoint ; #0080 ;!#0200(512) ;R02 LD A,(EXE_FM) CALL READ JP C,ERREXE @@ -169,6 +172,7 @@ EXEC02: LD (EXE_FM),A ;JP NZ,ERREXE LD A,MINIMUM_EXE_VERSION CP (IX + _sEXE_HEADER.VERSION) + LD A,DSS_Error.sys.UNKNOWN_EXE JP C,ERREXE ; ; @@ -300,20 +304,30 @@ _TST_PROC: CALL GETMEM POP DE ;снимаем со стека адрес возврата LD HL,#0000 ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE + LD SP,(EXSTACK) + ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать + PUSH HL ; +2 EXSTACK size for 1 task + PUSH DE ; +2 + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD A,(EXE_VERSION) + PUSH AF ; +2 + ; + ENDIF + ; IN A,(SLOT3) LD D,A IN A,(SLOT2) LD E,A IN A,(SLOT1) - PUSH DE - PUSH AF + PUSH DE ; +2 + PUSH AF ; +2 LD (EXSTACK),SP LD SP,HL + ; ; EXX - ; + ; ;!TEST 27/03/2024 LD DE,RAMMAP+3 LD A,(EXE_MEM) @@ -360,9 +374,9 @@ _TST_PROC: CALL GETMEM LD A,#80 ;!HARDCODE cmd line size SUB B LD (CORE_BUFFERS.SECTOR_BUFFER),A - ;R02 - LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; + LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER ;R02 + ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать LD A,SHARED_PAGE OUT (SLOT1),A OUT (SLOT2),A @@ -372,15 +386,9 @@ _TST_PROC: CALL GETMEM LD A,H AND #C0 ;!TEST - CP #80 - JR Z,FR8000 - JR NC,FRC000 - ;CP #40 - ;JR Z,FR4000 - ;CP #80 - ;JR Z,FR8000 - ;CP #C0 - ;JR Z,FRC000 + CP #80 + JR Z,FR8000 + JR NC,FRC000 ; FR4000: LD A,(DE) OUT (SLOT1),A @@ -397,9 +405,8 @@ FRC000: LD A,(DE) LD B,high Dss.Move_FP.FrStart LD A,(EXE_FM) CALL MOVE_FP - ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE - ; + ; + LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE _ret+1: JP 0 _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) @@ -418,6 +425,12 @@ _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) PUSH IX LD HL,CORE_BUFFERS.CurrentPath LD A,(CORE_BUFFERS.EXEBUFF.VERSION) + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD (EXE_VERSION),A + ; + ENDIF OR A JR NZ,.set_path CALL DIR_PATH_CHANGE.FullCurrent @@ -426,6 +439,7 @@ _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) ; RET ;----------------------------------------------------------------------- +; ! вызывается когда стек в нулевой странице! M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) DEC H LD D,H @@ -517,6 +531,10 @@ SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size ENVPATH: DB "PATH=",0 EXE_EXT: DB "EXE" TASK: DB #01 ; уровень текущей программы +; + IF OLD_DSS_FOR_OLD_EXE +EXE_VERSION: DB #01 ; [ ] 10/06/24 + ENDIF RAMMAP: DB #00,#00,#00,#00 ErrorLevel: DB #00 ; код завершения программы (процесса) EXE_FM: DB #00 ; дескр. файла @@ -550,20 +568,26 @@ LEAVE: LD A,B _mDECTASK LD SP,(EXSTACK) ; тут стек в нулевой странице! - POP AF - POP HL + POP AF ; -2 EXSTACK size for 1 task + POP HL ; -2 OUT (SLOT1),A LD A,L OUT (SLOT2),A LD A,H OUT (SLOT3),A - POP DE - POP HL + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + POP AF ; -2 + LD (EXE_VERSION),A + ENDIF + ; + POP DE ; -2 + POP HL ; -2 LD (EXSTACK),SP LD SP,HL ; ;!TEST - EI + ;EI ; EX DE,HL LD A,(ErrorLevel) @@ -650,7 +674,7 @@ CHECKPATH: ; !TODO сде RET Z ; CP '/' ;ALT SLASH ; RET Z - CP '!' + CP " "+1 JR NC,CHECKPATH RET ;----------------------------------------------------------------------- diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index b600da9..ae10617 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -20,9 +20,17 @@ F_FIRST: LD (.FNDMODE),A PUSH HL ;!TEST Current Dir ;[x] 15/10/23 + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; CALL DIR_PATH_CHECK RET C ; +.old_EXE: POP HL CALL GETWORD ;CALL LOADDIR diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index b0a290a..55b3a95 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -14,7 +14,14 @@ MKDIR: RET ; ; Entry point ;!TEST Current Dir ;[x] 15/10/23 -.B: PUSH HL +.B: ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.START + ENDIF + ; + PUSH HL CALL DIR_PATH_CHECK POP HL RET C diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 331fb20..d0393f2 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -15,11 +15,18 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO LD (.TMP),A + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; PUSH HL CALL DIR_PATH_CHECK.forceCheck POP HL RET C - ;JR .start +.old_EXE: ;JR .start ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; .start: CALL GETWORD diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index 77cd97b..9ca4bae 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -16,22 +16,7 @@ READ: LD (.R_POINT),HL CALL OPENDSK JP C,.ERR_1 CALL GET_OFFSET_IN_SECTORS - ; ;Расчёт смещения в секторах ;!HARDCODE sector size - ; LD H,0 ;!HARDCODE max file size = 8 gb - ; LD E,(IY+_sFM.F_POSITION+1) - ; LD D,(IY+_sFM.F_POSITION+2) - ; LD L,(IY+_sFM.F_POSITION+3) - ; LD A,E - ; AND #01 - ; LD B,A - ; LD C,(IY+_sFM.F_POSITION) - ; RR L - ; RR D - ; RR E - ; ;HL:DE FP (in sectors) - ; ;BC FP residue (in bytes) - ; ; - ; OR C + ; JP NZ,.ROV1 .ROV4: POP BC PUSH BC diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index cf18e26..df90e5d 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -10,6 +10,13 @@ ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// RENAME: ;!TEST Current Dir ;[x] 15/10/23 + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; PUSH HL PUSH DE CALL DIR_PATH_CHECK.forceCheck @@ -17,6 +24,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 POP HL RET C ; +.old_EXE: PUSH DE ;LD DE,MASKARE CALL MASK.name diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 84d5cbf..fc7a0b9 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -9,6 +9,13 @@ ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: ;!TEST Current Dir ;[x] 15/10/23 + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.START + ENDIF + ; PUSH HL CALL DIR_PATH_CHECK POP HL diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index 88663d4..9a43347 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -35,9 +35,17 @@ SCANDRV: ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 4. на всякий случай перечитываем дирректорию ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' CALL OPENDSK + ; LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR JR NC,.exit @@ -51,8 +59,20 @@ SCANDRV: EI RET ; +; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE +.old_EXE: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + CALL OPENDSK + ; + LD HL,CORE_BUFFERS.WorkDirectory + CALL CHDIR + JR NC,.exit + LD HL,CORE_BUFFERS.WorkDirectory + LD (HL),0 + JR .exit + ENDIF + .BOOT_DSK_LOST: DZ "Boot drive lost o_O" .BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ;/////////////////////////////////////////////////////////////////////// -; \ No newline at end of file diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index aa5b773..8a1473c 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -38,22 +38,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] CALL OPENDSK JR C,.ERR1 CALL GET_OFFSET_IN_SECTORS - ; ;Расчёт смещения в секторах ;!HARDCODE sector size - ; LD H,0 ;!HARDCODE max file size = 8 gb - ; LD E,(IY+_sFM.F_POSITION+1) - ; LD D,(IY+_sFM.F_POSITION+2) - ; LD L,(IY+_sFM.F_POSITION+3) - ; LD A,E - ; AND #01 - ; LD B,A - ; LD C,(IY+_sFM.F_POSITION) - ; RR L - ; RR D - ; RR E - ; ;HL:DE FP (in sectors) - ; ;BC FP residue (in bytes) - ; ; - ; OR C + ; JP NZ,.WOV1 ; .WOV4: POP BC diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index 3eb0638..a3e9f3b 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -6,6 +6,14 @@ ; C - номер последнего диска в системе ;///////////////////////////////////////////////////////////////////// CURDISK_FN: + ; + IF OLD_DSS_FOR_OLD_EXE + ; [ ] 10/06/24 + LD A,(EXE_VERSION) + OR A + JR Z,CURDISK + ; + ENDIF LD A,(LDRIVE) LD C,A LD A,(CORE_BUFFERS.CurrentPath) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 7981773..6693d13 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -122,11 +122,19 @@ DISKINF: LD C,B RET ; CP #FF ; !FIXIT WorkDirectory - ;!TEST Current Dir + ;!TEST !Current Dir ;JR Z,CURRDS ;R06 -.CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) +.CurrentDisk: ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + JR Z,.old_EXE + ENDIF + ; + LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' - LD HL,CORE_BUFFERS.FatBuffer.DRIVE +.old_EXE: LD HL,CORE_BUFFERS.FatBuffer.DRIVE CP (HL) JR Z,.CheckFreeSpace ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 2e7ad33..cebeac6 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -922,7 +922,7 @@ RD_BPB: ; LD C,SLOT3 ; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток - CALL DIV_for_SPC + CALL DIV_by_Shifts ; выясняем разрядность FAT LD A,D OR E @@ -932,7 +932,7 @@ RD_BPB: ; LD C,SLOT3 SBC HL,BC JR NC,.its_FAT12 ; - LD HL,65525 + LD HL,65524 SBC HL,BC JR C,.its_FAT32 ; diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index b69ab5e..0ee5739 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1027,8 +1027,8 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток - CALL DIV_for_SPC - PUSH HL ; остаток DIV_for_SPC + CALL DIV_by_Shifts + PUSH HL ; остаток DIV_by_Shifts ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE PUSH BC ; младшее слово номера кластера PUSH DE ; [x] fat32 старшее слово номера кластера @@ -1086,7 +1086,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX POP BC ; младшее слово номера кластера CALL SaveGotCluster ; - POP DE ; D = 0, E = остаток DIV_for_SPC + POP DE ; D = 0, E = остаток DIV_by_Shifts POP BC ; B - количество секторов для чтения, C - SectorsPerCluster ; (SP) = (RET) ; работа с остатком от деления @@ -1105,9 +1105,9 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX EXX PUSH HL ; номер кластера младшая часть PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения - PUSH DE ; D = 0, E = остаток DIV_for_SPC + PUSH DE ; D = 0, E = остаток DIV_by_Shifts CALL CLUSTER_TO_SECTOR - POP DE ; D = 0, E = остаток DIV_for_SPC + POP DE ; D = 0, E = остаток DIV_by_Shifts ADD IX,DE JR NC,.skip2 INC HL @@ -1200,7 +1200,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX ; ZF = 0 если первого кластера нет CHECK_FIRST_CLUSTER: EXX - LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) LD A,L OR H @@ -1222,8 +1222,8 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток - CALL DIV_for_SPC - PUSH HL ; остаток DIV_for_SPC + CALL DIV_by_Shifts + PUSH HL ; остаток DIV_by_Shifts ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE PUSH BC ; младшее слово номера кластера PUSH DE ; fat32 старшее слово номера кластера @@ -1310,7 +1310,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX POP BC CALL SaveGotCluster ; - POP DE ; D = 0, E = остаток DIV_for_SPC + POP DE ; D = 0, E = остаток DIV_by_Shifts POP BC ; B - количество секторов для чтения, C - SectorsPerCluster ; (SP) = (RET) ; @@ -1329,9 +1329,9 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX EXX PUSH HL ; номер кластера младшая часть PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения - PUSH DE ; D = 0, E = остаток DIV_for_SPC + PUSH DE ; D = 0, E = остаток DIV_by_Shifts CALL CLUSTER_TO_SECTOR - POP DE ; D = 0, E = остаток DIV_for_SPC + POP DE ; D = 0, E = остаток DIV_by_Shifts ADD IX,DE JR NC,.skip2 INC HL diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index 05d8222..c5db6f0 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -322,7 +322,7 @@ BC_Div_DE: ;----------------------------------------------------------------------; ; HL:DE / A => DE:BC, H=0, L - остаток -DIV_for_SPC: +DIV_by_Shifts: LD C,A DEC A JR Z,.exit diff --git a/DSS/Structures.inc b/DSS/Structures.inc index fbaee5d..593f5be 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -6,17 +6,19 @@ ; ; - STRUCT _sEXE_HEADER ; 512 bytes -.EXE_EXT TEXT 3,{"EX","E"} ; 0-2 EXE Сигнатура -.VERSION BYTE 0 ; 3 Version of EXE file -.OFFCOD1 WORD 00 ; 4-5 С какого смещения в файле будет грузиться код в -.OFFCOD2 WORD 00 ; 6-7 память по адресу (Code_addr) Low addr, High addr. -.LOADER WORD 00 ; 8-9 Размер первичного загрузчика или 0 -.RESERVED BLOCK 6,0 ; 10-15 Reserved -.LD_ADDR WORD 00 ; 16-17 Адрес расположения кода в памяти (#4100-#FFFF) -.PC_REG WORD 00 ; 18-19 Адрес в памяти с которого запустится код (Reg. PC) -.SP_REG WORD 00 ; 20-21 Адрес стека (Reg. SP) -.RESERVED2 BLOCK 490,0 ; 22-512 Можно использовать под текст для выпендрёжа или не использовать + STRUCT _sEXE_HEADER ; 512 bytes +.EXE_EXT TEXT 3,{"EX","E"} ; 0-2 EXE Сигнатура +.VERSION BYTE 0 ; 3 Version of EXE file +.OFFCOD1 WORD 00 ; 4-5 С какого смещения в файле будет грузиться код в +.OFFCOD2 WORD 00 ; 6-7 память по адресу (Code_addr) Low addr, High addr. +.LOADER WORD 00 ; 8-9 Размер первичного загрузчика или 0 +.RESERVED BLOCK 6,0 ; 10-15 Reserved +.LD_ADDR WORD 00 ; 16-17 Адрес расположения кода в памяти (#4100-#FFFF) +.PC_REG WORD 00 ; 18-19 Адрес в памяти с которого запустится код (Reg. PC) +.SP_REG WORD 00 ; 20-21 Адрес стека (Reg. SP) +.UnUsedPoint BYTE 0 ; 22 +; в .RESERVED2 нельзя прописать BLOCK 512-.UnUsedPoint,0; поэтому хардкод +.RESERVED2 BLOCK 512-23,0 ; 23-512 Можно использовать под текст для выпендрёжа или не использовать ENDS ; diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC index 583cb64..984fa6c 100644 --- a/DSS/VERSION.INC +++ b/DSS/VERSION.INC @@ -1,7 +1,18 @@ + IFNDEF INCREASE_BUILD + DEFINE INCREASE_BUILD 0 + ELSE + DEFINE+ INCREASE_BUILD 1 + ENDIF ;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] LUA PASS1 dss_date, dss_month, dss_year = Get_date_RU(sj.get_define("__DATE__")) - dss_build = increase_build("./DSS/build.txt") + + if sj.get_define("INCREASE_BUILD") > "0" then + dss_build = increase_build("./DSS/build.txt") + else + dss_build = get_build("./DSS/build.txt") + end + if dss_build > 999 then dss_build = 999 print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a") diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 3bae86b..b00b26e 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -113,6 +113,18 @@ PUTCHAR: .CR_: CALL CURSOR LD E,0 JP LOCATE + ; +.control_characters: + CP #0D + JR Z,.CR_ + CP #0A + JR Z,.LF_ + CP #09 + JR Z,.TB_ + CP #08 + JR Z,.BK_ + CP #07 ; [x] Beep in PChars/PUTCHAR + RET NZ ; [x] Beep in PChars/PUTCHAR .BELL: LD DE,1200 PUSH HL @@ -128,18 +140,7 @@ PUTCHAR: ._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM JP ToBIOS ; -.control_characters: - CP #0D - JR Z,.CR_ - CP #0A - JR Z,.LF_ - CP #09 - JR Z,.TB_ - CP #08 - JR Z,.BK_ - CP #07 - JR Z,.BELL ; [x] Beep in PChars/PUTCHAR - RET + ;-----[] ; ; diff --git a/DSS/build.txt b/DSS/build.txt index a88135e..40b9b19 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -988 \ No newline at end of file +990 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 4db938b..03662e3 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -102,6 +102,9 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - тормознее, но безопаснее DEFINE NON_REMOVABLE_FDD 0 + ; + DEFINE OLD_DSS_FOR_OLD_EXE 0 ; !TODO + ; ;-------------------[MEMORY]-------------------------; DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm index 59d8a11..306d487 100644 --- a/DSS/drivers/media/ide-drv.asm +++ b/DSS/drivers/media/ide-drv.asm @@ -348,13 +348,13 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - DRIVE/HEAD REGISTER PHISICAL DISK: +; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - DRIVE/HEAD REGISTER PHISICAL DISK: ; bit7 - reserved "1" ; bit6 - ADDRESSING MODE LBA/CHS ; bit5 - reserved "1" From c1da9a1af1045814fab15f2d7fc7e7d96a24d5fe Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 15 Jun 2024 04:49:59 +1000 Subject: [PATCH 146/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 378f3fd..399bf41 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 378f3fdd49601390b3aacfe51e45c6fceba25022 +Subproject commit 399bf41c5cbd12d2866204ee3ff1cc357a3d3a99 From 325d8d8aa259b73f07e03989f7ce0410f623697a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 15 Jun 2024 20:04:36 +1000 Subject: [PATCH 147/219] ... --- BOOT/DSSBOOT.ASM | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 11278c2..29f6a5a 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -1179,9 +1179,13 @@ READ_FROM_FAT: PUSH HL POP HL LD A,0 RET - ; +; ; ; + + + //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// + ASSERT ($-ZERO_SECTOR_OF_BPB) <= LOADER_IN_BPB.MAX_SIZE, "---< CRITICAL ERROR! Loader is too big >----" DISPLAY "SECTORS 0 DATA ENDS:\t\t",/H,$,". Size: ",/D,$-ZERO_SECTOR_OF_BPB," b. Free: ",/D,LOADER_IN_BPB.MAX_SIZE-($-ZERO_SECTOR_OF_BPB)," b." ZERO_SECTOR_OF_BPB_END: ZERO_SECTOR_OF_BPB.Size EQU ZERO_SECTOR_OF_BPB_END - ZERO_SECTOR_OF_BPB From e594217c8f93e6d891b88e4d7f3ba4a2f3bbdf43 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 20 Jun 2024 00:22:17 +1000 Subject: [PATCH 148/219] public beta 1.70.990 --- DSS/DSS-MAIN.ASM | 2 +- DSS/build.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f92c6ec..116b6cd 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -134,7 +134,7 @@ RST_0x30: PUSH AF POP AF RET ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; -; +; //////////////////////////////////////////////////////////////////////// ; <[MAIN INT]> diff --git a/DSS/build.txt b/DSS/build.txt index 40b9b19..8ced8f7 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -990 \ No newline at end of file +989 \ No newline at end of file From ccc868ee08a061adf3c32040d574cc160b65f750 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 20 Jun 2024 00:50:14 +1000 Subject: [PATCH 149/219] ... --- DSS/build.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DSS/build.txt b/DSS/build.txt index 8ced8f7..40b9b19 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -989 \ No newline at end of file +990 \ No newline at end of file From 3814444250f279d1382cc1e22765cbb5b55fe34b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 20 Jun 2024 01:07:19 +1000 Subject: [PATCH 150/219] Core: ibug in diskINF --- DSS/API/diskINF.asm | 4 +++- DSS/build.txt | 2 +- SHELL/build.txt | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 6693d13..25050c3 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -87,11 +87,13 @@ DISKINF: LD C,B PUSH HL EXX ;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + PUSH IX CALL GET_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP + POP AF PUSH DE - LD A,XH + ;LD A,XH LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams RST ToDSS.DRV diff --git a/DSS/build.txt b/DSS/build.txt index 40b9b19..b7e8805 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -990 \ No newline at end of file +991 \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 57db2e9..7b89b22 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -404 \ No newline at end of file +406 \ No newline at end of file From b45094a6f5502d3b1f53dfe3e6d1921ee3db9c0a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 22 Jun 2024 03:36:26 +1000 Subject: [PATCH 151/219] tst --- BOOT/DSSBOOT.ASM | 6 + DSS/DOS_Proc.asm | 137 ++++++++------- DSS/FS/FAT/FAT.asm | 115 ++++++------- DSS/defines.inc | 2 +- DSS/drivers/Input/MOUSE.ASM | 329 +++++++++++++++++++++--------------- SHELL/Commands/CHDIR.ASM | 2 +- SHELL/Commands/DIR.ASM | 12 +- SHELL/build.txt | 2 +- 8 files changed, 342 insertions(+), 263 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 29f6a5a..de7bf5c 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -534,6 +534,12 @@ GET_BPB: LD HL,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL + ; LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ; AND A + ; SBC HL,DE + ; CCF + ; RET C ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) + ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD BC,0 LD A,H diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 49a4799..108e827 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -180,66 +180,85 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; ; IN: A - drive number -OPENDSK:;!TEST DRV.Open обход R10 - LD C,A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - CP C - IF CHECK_DRIVE_CHANGE - JR NZ,.open - PUSH BC - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - POP BC - ENDIF - JR Z,.exit +OPENDSK: ;!TEST DRV.Open обход R10 + LD C,A + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + CP C + IF CHECK_DRIVE_CHANGE + JR NZ,.open + PUSH BC + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + POP BC + ENDIF + JR Z,.exit -.open: LD A,C - ; -.force: PUSH AF - LD C,Dss.DRV.Open - RST ToDSS.DRV - POP BC - JP C,.error - ;[x] 29/02/2024 fix "open drive error" - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD D,A - PUSH DE - ; - LD A,B - LD (CORE_BUFFERS.FatBuffer.DRIVE),A - ; - CALL RD_BPB - ;[x] 29/02/2024 fix "open drive error" - POP DE - LD A,D - JR C,.error_disk - ; RET C - ; -.exit: LD A,(LDRIVE) - AND A - RET - ; -.error: CP DSS_Error.sys.INVALID_DRIVE - SCF - RET Z - LD A,DSS_Error.sys.NOT_READY - RET - ;[x] 29/02/2024 fix "open drive error" -.error_disk: - CALL OPENDSK.force - LD A,(BOOTDSK.NUM) - CALL C,OPENDSK.force - ; проверка на ошибку - LD HL,.NOT_READY - LD E, +(80-.NOT_READY.size)/2 ; coord X - LD BC,.NOT_READY.size - JP C,KERNEL_PANIC - ; - LD A,DSS_Error.sys.NOT_READY - SCF - RET - ; -.NOT_READY: DZ "Boot drive not ready..." +.open: LD A,C + ; +.force: PUSH AF + LD C,Dss.DRV.Open + RST ToDSS.DRV + POP BC + JP C,.error + ;[x] 29/02/2024 fix "open drive error" + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD D,A + PUSH DE + ; + LD A,B + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + ; + CALL RD_BPB + ;[x] 29/02/2024 fix "open drive error" + POP DE + JR C,.error_bpb + ; RET C + ; +.exit: LD A,(LDRIVE) + AND A + RET + ; +.error: CP DSS_Error.sys.INVALID_DRIVE + SCF + RET Z + LD A,DSS_Error.sys.NOT_READY + RET +;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed +.error_bpb: PUSH AF ; сохраняем номер ошибки + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + CP D + JR Z,.next_check + ; + LD A,D + CP #FF + SCF + JR Z,.set_panic + ; + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + CALL OPENDSK.force + LD A,(BOOTDSK.NUM) + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + CALL C,OPENDSK.force + ; +.err_exit: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ADD 'A' + LD (CORE_BUFFERS.CurrentPath),A + POP AF + RET + ; +.next_check: LD A,(BOOTDSK.NUM) + CP D + SCF +.reBPB: CALL NZ,OPENDSK.force + ; проверка на ошибку +.set_panic: LD HL,.NOT_READY + LD E, +(80-.NOT_READY.size)/2 ; coord X + LD BC,.NOT_READY.size + JR NC,.err_exit + JP KERNEL_PANIC + ; +.errorCycle: DB 0 +.NOT_READY: DZ "Boot drive error..." .NOT_READY.size EQU $-.NOT_READY ;----------------------------------------------------------------------; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index cebeac6..7dff503 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -547,6 +547,10 @@ LOADDIR: ;!TODO optimize RET ;----------------------------------------------------------------------; + +;!TODO FAT procedures +;----------------------------------------------------------------------; + LOAD_SAVE_DIR_PREPARE: ;!TODO optimize XOR A ; FILE MANIPULATOR = 0 @@ -571,7 +575,56 @@ LOAD_SAVE_DIR_PREPARE: EX AF,AF' RET -;!TODO FAT procedures +;----------------------------------------------------------------------; +; скопировать запись в список диска (каталога) de ix iy +; и сбросить кеш каталога на диск +; вход: (HANDBUF) - запись каталога +WRT_HND: SET_PAGE_X DIRPAGE + EX AF,AF' + LD HL,DIRPAGE.buffer + ;!TEST 9/11/23 record index + ; EXX + ; LD DE,0 + ; EXX + ; + LD BC,FAT_DIRECTORY_RECORD +.loop: ;LD A,(IX+00) + LD A,(HL) + OR A + JR Z,.WRT_HN2 + CP #E5 + JR Z,.WRT_HN2 + ;ADD IX,BC + ADD HL,BC + JR NC,.loop ;!FIXIT количество записей каталога = страница + ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF + RET + ; +.WRT_HN2: ;LD D,XH + ;LD E,XL + EX DE,HL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR + EX AF,AF' + OUT (SLOT3),A + LD HL,DIRPAGE.buffer + LD BC,(SAVEDIR.DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + JR NC,SAVEDIR + LD HL,(SAVEDIR.DIRSIZE) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + ADD HL,BC + LD (SAVEDIR.DIRSIZE),HL + AND A + ;JP SAVEDIR ;----------------------------------------------------------------------; ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора @@ -619,62 +672,6 @@ SAVEDIR: ;!TODO optimize RET ;----------------------------------------------------------------------; - -;----------------------------------------------------------------------; -; скопировать запись в список диска (каталога) de ix iy -; и сбросить кеш каталога на диск -; вход: (HANDBUF) - запись каталога -WRT_HND: SET_PAGE_X DIRPAGE - EX AF,AF' - ; - ;LD IX,DIRPAGE.buffer - LD HL,DIRPAGE.buffer - ;!TEST 9/11/23 record index - ; EXX - ; LD DE,0 - ; EXX - ; - LD BC,FAT_DIRECTORY_RECORD -.loop: ;LD A,(IX+00) - LD A,(HL) - OR A - JR Z,.WRT_HN2 - CP #E5 - JR Z,.WRT_HN2 - ;ADD IX,BC - ADD HL,BC - JR NC,.loop ;!FIXIT количество записей каталога = страница - ; - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.ROOT_OVERFLOW - SCF - RET -.WRT_HN2: - ;LD D,XH - ;LD E,XL - EX DE,HL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR - EX AF,AF' - OUT (SLOT3),A - LD HL,DIRPAGE.buffer - LD BC,(SAVEDIR.DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - JP NC,SAVEDIR - LD HL,(SAVEDIR.DIRSIZE) - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) - ADD HL,BC - LD (SAVEDIR.DIRSIZE),HL - AND A - JP SAVEDIR -;----------------------------------------------------------------------; - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; [x] fat32 ;!TEST RD_BPB: ; LD C,SLOT3 @@ -811,6 +808,10 @@ RD_BPB: ; LD C,SLOT3 JP NC,.loop3 .loop3.end: ; LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL + ;LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ;AND A + ;SBC HL,DE + ;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) //////////////////////////////////////////////////////////////////////// ;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer ; EX DE,HL diff --git a/DSS/defines.inc b/DSS/defines.inc index 03662e3..db6a0e6 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -14,7 +14,7 @@ ; MOUSE DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B -;DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники + DEFINE MOUSE_READ_PORT_TIMEOUT 16*1024 ; Костыльный тайм-аут на ожидание байта от мышки. ; KEYBOARD DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A diff --git a/DSS/drivers/Input/MOUSE.ASM b/DSS/drivers/Input/MOUSE.ASM index 87506e2..64add82 100644 --- a/DSS/drivers/Input/MOUSE.ASM +++ b/DSS/drivers/Input/MOUSE.ASM @@ -7,6 +7,32 @@ PORT_MOUSE.Ctrl EQU Z84.SIO.Ch_B.Ctrl PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data +//////////////////////////////////////////////////////////////////////// + MACRO READ_MOUSE_PACKET + IF MOUSE_INT_ENABLED + IN A,(PORT_MOUSE.Ctrl) + RRCA + RET NC + ELSE + ;[x] mouse freeeeezzzz + ;LD BC,MOUSE_READ_PORT_TIMEOUT + ; +.READ_BYTE: IN A,(PORT_MOUSE.Ctrl) + RRCA + ;[x] mouse freeeeezzzz + ;JR C,.NEXT + ;DEC BC + ;LD A,B + ;OR C + ;JR NZ,.READ_BYTE + ;RET + JR NC,.READ_BYTE +.NEXT: ; + ENDIF + ENDM +//////////////////////////////////////////////////////////////////////// + + ; MOUSE SOFTWARE SPECIFICATION ;--------------------------------------------- ; COMMAND 00h (INITIALIZATION) @@ -633,146 +659,179 @@ MOUSE: LD A,(MODE_M) ;----------------------------------------------------------------------; CLEAR_MOUSE_BUFFER: - IN A,(Z84.SIO.Ch_B.Data) - IN A,(Z84.SIO.Ch_B.Ctrl) - RRCA - JR C,CLEAR_MOUSE_BUFFER - SCF - RET + IN A,(Z84.SIO.Ch_B.Data) + IN A,(Z84.SIO.Ch_B.Ctrl) + RRCA + IF MOUSE_INT_ENABLED + JR C,CLEAR_MOUSE_BUFFER + ; + XOR A + LD (READ_M.Step),A + RET + ELSE + ;RET NC + ;JR CLEAR_MOUSE_BUFFER + JR C,CLEAR_MOUSE_BUFFER + SCF + RET + ENDIF ;----------------------------------------------------------------------; -READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера - ; reg 1 - LD A,1 - OUT (PORT_MOUSE.Ctrl),A - IN A,(PORT_MOUSE.Ctrl) - AND %0010'0000 ; check receiver overrun error - ; JP NZ,.Receiver_Overrun - JR Z,.READ_FIRST_BYTE - ; reg 0 - error reset - LD A,%0011'0000 - OUT (Z84.SIO.Ch_B.Ctrl),A - JP CLEAR_MOUSE_BUFFER +READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера + ; reg 1 + LD A,1 + OUT (PORT_MOUSE.Ctrl),A + IN A,(PORT_MOUSE.Ctrl) + AND %0010'0000 ; check receiver overrun error + IF MOUSE_INT_ENABLED + JR Z,.Prepare + ELSE + JR Z,.READ_FIRST_BYTE + ENDIF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A + ; reg 0 - return from int + ;LD A,%0011'1000 + ;OUT (Z84.SIO.Ch_B.Ctrl),A + ; + JR CLEAR_MOUSE_BUFFER + ; + IF MOUSE_INT_ENABLED +.Prepare: LD HL,.Step + LD A,(HL) + OR A + JR Z,.READ_FIRST_BYTE + DEC A + JR Z,.READ_SECOND_BYTE + DEC A + JR Z,.READ_THIRD_BYTE + XOR A + LD (HL),A + ENDIF .READ_FIRST_BYTE: - IN A,(PORT_MOUSE.Ctrl) - RRCA - RET NC - ; AND 1 - ; RET Z - - IN A,(PORT_MOUSE.Data) - LD L,A - AND %0100'0000 - ;BIT 6,A - ;CCF - RET Z - - ;[x] mouse freeeeezzzz - ;LD BC,MOUSE_READ_PORT_TIMEOUT - ; -.READ_SECOND_BYTE: - IN A,(PORT_MOUSE.Ctrl) - RRCA - ;[x] mouse freeeeezzzz - ;JR C,.NXT_1 - ;DEC BC - ;LD A,B - ;OR C - ;JR NZ,.TST_01 - ;RET - JR NC,.READ_SECOND_BYTE - ; - -;.NXT_1: - IN A,(PORT_MOUSE.Data) - LD E,A - AND %0100'0000 - ;CCF - RET NZ - - ;[x] mouse freeeeezzzz - ;LD BC,MOUSE_READ_PORT_TIMEOUT - ; -.READ_LAST_BYTE: - IN A,(PORT_MOUSE.Ctrl) - RRCA - ;[x] mouse freeeeezzzz - ;JR C,.NXT_2 - ;DEC BC - ;LD A,B - ;OR C - ;JR NZ,.READ_LAST_BYTE - ;RET - JR NC,.READ_LAST_BYTE - ; -;.NXT_2: - IN A,(PORT_MOUSE.Data) - LD D,A - ;BIT 6,A - AND %0100'0000 - ;CCF - RET NZ - ; все три байта пакета прочитаны - ; - LD A,E - AND #3F - LD E,A - LD A,L - AND #03 - RRCA - RRCA - OR E - LD E,A - LD A,D - AND #3F - LD D,A - LD A,L - AND #0C - RRCA - RRCA - RRCA - RRCA - OR D - LD D,A - LD A,L - RLCA - RLCA - RLCA - RES 6,A - JR NC,.STBU - SET 6,A -.STBU: RLCA - RLCA - AND #03 - LD (MOUSE_BUTTONS),A - CALL SENSE - LD (MOUSE_COORDINATES),DE - ; LD A,E - ; LD (MX),A - ; LD A,D - ; LD (MY),A - SCF - RET -;[ ] 14/03/2024 проверка на переполнение буфера -/* -.Receiver_Overrun: - ; empty the buffer - IN A,(Z84.SIO.Ch_B.Data) - IN A,(Z84.SIO.Ch_B.Ctrl) - RRCA - JR C,.Receiver_Overrun - ; reg 0 - error reset - LD A,%0011'0000 - OUT (Z84.SIO.Ch_B.Ctrl),A - ;!TEST - ; reg 0 - return from int - ; LD A,%0011'1000 - ; OUT (Z84.SIO.Ch_B.Ctrl),A - ; - RET -*/ + IN A,(PORT_MOUSE.Ctrl) + RRCA + RET NC + IN A,(PORT_MOUSE.Data) + IF MOUSE_INT_ENABLED + LD (.Reg_L),A + ELSE + LD L,A + ENDIF + AND %0100'0000 + ;RET Z + JP Z,CLEAR_MOUSE_BUFFER + ; + IF MOUSE_INT_ENABLED + INC (HL) + ENDIF + ; +.READ_SECOND_BYTE: + READ_MOUSE_PACKET + ; + IN A,(PORT_MOUSE.Data) + IF MOUSE_INT_ENABLED + LD (.Reg_E),A + AND %0100'0000 + JR Z,.nxt1 + LD (HL),0 + JR .READ_FIRST_BYTE +.nxt1: ; + INC (HL) + ELSE + LD E,A + AND %0100'0000 + ;!TEST + RET NZ + ;JR Z,.READ_THIRD_BYTE + ;LD L,E + ;JR .READ_SECOND_BYTE + ENDIF + ; +.READ_THIRD_BYTE: + READ_MOUSE_PACKET + ; + IN A,(PORT_MOUSE.Data) + IF MOUSE_INT_ENABLED + LD (.Reg_D),A + AND %0100'0000 + JR Z,.nxt2 + LD (HL),0 + JR .READ_FIRST_BYTE +.nxt2: ; + LD (HL),0 + LD DE,(.Reg_E) + LD HL,(.Reg_L) + ELSE + LD D,A + AND %0100'0000 + ;!TEST + RET NZ + ;JR Z,.packet_end + ;LD L,D + ;JR .READ_SECOND_BYTE +.packet_end: ; + ENDIF + ; + ; все три байта пакета прочитаны + ; + LD A,E + AND #3F + LD E,A + LD A,L + AND #03 + RRCA + RRCA + OR E + LD E,A + LD A,D + AND #3F + LD D,A + LD A,L + AND #0C + RRCA + RRCA + RRCA + RRCA + OR D + LD D,A + ; +; LD A,L +; RLCA +; RLCA +; RLCA +; RES 6,A +; JR NC,.STBU +; SET 6,A +; .STBU: RLCA +; RLCA +; AND #03 + LD A,L + AND #30 + RRCA + RRCA + RRCA + RRCA + ; + LD (MOUSE_BUTTONS),A + CALL SENSE + LD (MOUSE_COORDINATES),DE + ; LD A,E + ; LD (MX),A + ; LD A,D + ; LD (MY),A + SCF + RET + ; + IF MOUSE_INT_ENABLED +.Reg_L: DB 0 +.Reg_E: DB 0 +.Reg_D: DB 0 +.Step: DB 0 + ENDIF MCORECT: LD HL,(PIX_X) diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index b1268e3..20f168c 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -21,7 +21,7 @@ cmd_chdir: dec hl .chdir: ld c,Dss.ChDir ; сменить тек. каталог RST ToDSS - jp c,print_err_message ; вывод сообщения + call c,print_err_message ; вывод сообщения jp Get_Path ; сохр. тек. диск и путь ; ; вывод сист. пути на экран ; ld c,8Eh ; узнать полож. курсора diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index cd4c2ff..606d367 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -304,16 +304,10 @@ Print_Header: ; %1 ld bc,16+16+16-1-2 ldir ; - ld hl,Buffers.work.free + 256 + 128 ; сист. путь - ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 байтов буфер + ld hl,Buffers.work.free + 256 + 128; сист. путь + ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 байтов буфер call make_short_path - ;pop hl - - ; ld hl,Buffers.screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным - ; ld de,PRM3 ;+PRM4 ; 32 байта буфер - ; CALL copy_string ; скопир. строку (с нулем) - ; - ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." + ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." JP ECHO_MESSAGE ; вывести строку ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 7b89b22..009bd2c 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -406 \ No newline at end of file +407 \ No newline at end of file From 35fbce127480fc6074943ab33e4bf3f4400a6a64 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 22 Jun 2024 04:02:37 +1000 Subject: [PATCH 152/219] tst2 --- DSS/drivers/Input/MOUSE.ASM | 63 +++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/DSS/drivers/Input/MOUSE.ASM b/DSS/drivers/Input/MOUSE.ASM index 64add82..60a978b 100644 --- a/DSS/drivers/Input/MOUSE.ASM +++ b/DSS/drivers/Input/MOUSE.ASM @@ -543,7 +543,7 @@ MOUSE: LD A,(MODE_M) IN A,(SLOT3) LD XL,A ; - LD A,#54 + LD A,#54 ;!HARDCODE video page ; CALL GET_SYMBOL_ADDR ; @@ -669,16 +669,16 @@ CLEAR_MOUSE_BUFFER: LD (READ_M.Step),A RET ELSE - ;RET NC - ;JR CLEAR_MOUSE_BUFFER - JR C,CLEAR_MOUSE_BUFFER - SCF - RET + RET NC + JR CLEAR_MOUSE_BUFFER + ; JR C,CLEAR_MOUSE_BUFFER + ; SCF + ; RET ENDIF ;----------------------------------------------------------------------; -READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера +READ_M: /*;[ ] 18/02/2024 проверка на переполнение буфера ; reg 1 LD A,1 OUT (PORT_MOUSE.Ctrl),A @@ -698,6 +698,7 @@ READ_M: ;[ ] 18/02/2024 ; JR CLEAR_MOUSE_BUFFER ; +*/ IF MOUSE_INT_ENABLED .Prepare: LD HL,.Step LD A,(HL) @@ -721,8 +722,8 @@ READ_M: ;[ ] 18/02/2024 LD L,A ENDIF AND %0100'0000 - ;RET Z - JP Z,CLEAR_MOUSE_BUFFER + RET Z + ;JP Z,CLEAR_MOUSE_BUFFER ; IF MOUSE_INT_ENABLED INC (HL) @@ -799,22 +800,22 @@ READ_M: ;[ ] 18/02/2024 OR D LD D,A ; -; LD A,L -; RLCA -; RLCA -; RLCA -; RES 6,A -; JR NC,.STBU -; SET 6,A -; .STBU: RLCA -; RLCA -; AND #03 LD A,L - AND #30 - RRCA - RRCA - RRCA - RRCA + RLCA + RLCA + RLCA + RES 6,A + JR NC,.STBU + SET 6,A +.STBU: RLCA + RLCA + AND #03 + ; LD A,L + ; AND #30 + ; RRCA + ; RRCA + ; RRCA + ; RRCA ; LD (MOUSE_BUTTONS),A CALL SENSE @@ -896,13 +897,13 @@ DECY: LD A,E SENSE: LD HL,(SENSEXY) LD A,L ; [x] 15/03/2024 теперь поправки чувствительности по координатам работают корректно - ;OR L - ;RET Z - ;DEC A - ;RET Z - CP 2 - CCF - JR NC,.check_Y + OR L + RET Z + DEC A + RET Z + ; CP 2 + ; CCF + ; JR NC,.check_Y ; LD A,E BIT 7,A From 7c9c4311a4743e42add71e2d56fb3fe339a7a99e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 23 Jun 2024 03:48:41 +1000 Subject: [PATCH 153/219] bug fixes --- DSS/DRV-MAIN.ASM | 40 +++++------------ DSS/DSS-MAIN.ASM | 87 +++++++++++++++++++++---------------- DSS/defines.inc | 16 +++---- DSS/drivers/Input/MOUSE.ASM | 64 ++++++++++++++------------- Shared_Includes | 2 +- 5 files changed, 102 insertions(+), 107 deletions(-) diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 9217369..9a1091a 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -115,36 +115,7 @@ RST_30: JP MOUSE_DRV.API //////////////////////////////////////////////////////////////////////// ; <[MAIN INT]> ; BLOCK #38-$,#C7 ; -A0038: ; -; JP RST_38 ; -; RST_38: ; -; INT_: PUSH AF ; -; EX AF,AF' ; -; PUSH AF ; -; PUSH BC ; -; PUSH DE ; -; PUSH HL ; -; EXX ; -; PUSH BC ; -; PUSH DE ; -; PUSH HL ; -; PUSH IX ; -; PUSH IY ; -; CALL KEYSCAN ; -; LD C,#80 ; -; RST ToDSS.Mouse ; -; POP IY ; -; POP IX ; -; POP HL ; -; POP DE ; -; POP BC ; -; EXX ; -; POP HL ; -; POP DE ; -; POP BC ; -; POP AF ; -; EX AF,AF' ; -; POP AF ; +/* ;!TEST SIO INT ; reg 0 - error reset IF KEYBOARD_INT_ENABLED && MOUSE_INT_ENABLED == 0 @@ -179,6 +150,15 @@ A0038: ; ENDIF EI ; RETI ; +*/ +RST_38_DRV: JP .Portal + BLOCK RST_38_IM1.Portal - $,0 +.Portal: PUSH AF + LD A,(DRV_PAGE.MAIN_PAGE_NUMBER) + OUT (SLOT0),A + POP AF + EI + RETI //////////////////////////////////////////////////////////////////////// diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 116b6cd..20360f7 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -139,53 +139,31 @@ RST_0x30: PUSH AF //////////////////////////////////////////////////////////////////////// ; <[MAIN INT]> _mInfoBLOCK #38-$,#FF -RST_38: ;для того, чтоб софты могли менять обработчик на свой. - JP RST_0x38 -RST_0x38: -INT_: PUSH AF - EX AF,AF' - PUSH AF - PUSH BC - PUSH DE - PUSH HL - EXX - PUSH BC - PUSH DE - PUSH HL - PUSH IX - PUSH IY - CALL KEYSCAN - LD C,Dss.Mouse.GetPackets - RST ToDSS.Mouse - ;CALL M_INT - IFN CLASSIC_CURSOR - CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL - ENDIF - POP IY - POP IX - POP HL - POP DE - POP BC - EXX - POP HL - POP DE - POP BC - POP AF - EX AF,AF' - POP AF - EI - RETI + ;для того, чтоб софты могли менять обработчик на свой. +RST_38_IM1: JP .Handler +.Handler: CALL INTx38_Handler + EI + RETI + ; +.Portal: PUSH AF + LD A,(RST_0x30.drv_page) + OUT (SLOT0),A + POP AF + CALL INTx38_Handler + JR .Portal + ; + //////////////////////////////////////////////////////////////////////// ; -NMI: RETN +;NMI: RETN ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[ NMI ]> ; _mInfoBLOCK #66-$,#FF ; -NMI_0x66: JP NMI ; +NMI_0x66: RETN ;JP NMI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -278,6 +256,39 @@ CLEAR_BUFFER_AND_INIT_PROC: JP VERSION + +INTx38_Handler: PUSH AF + EX AF,AF' + PUSH AF + PUSH BC + PUSH DE + PUSH HL + EXX + PUSH BC + PUSH DE + PUSH HL + PUSH IX + PUSH IY + CALL KEYSCAN + LD C,Dss.Mouse.GetPackets + RST ToDSS.Mouse + ;CALL M_INT + IFN CLASSIC_CURSOR + CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL + ENDIF + POP IY + POP IX + POP HL + POP DE + POP BC + EXX + POP HL + POP DE + POP BC + POP AF + EX AF,AF' + POP AF + RET ;R03 ;R07Allocate memory ; LD BC,#03C2 diff --git a/DSS/defines.inc b/DSS/defines.inc index db6a0e6..f53305f 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -7,24 +7,24 @@ ; ; - DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. + DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. DEFINE COMPILE_UNUSED_CODE 0 ; ; MOUSE - DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) - DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B - DEFINE MOUSE_READ_PORT_TIMEOUT 16*1024 ; Костыльный тайм-аут на ожидание байта от мышки. + DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) + DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B + DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Костыльный тайм-аут на ожидание байта от мышки. Если = 0, то лишний код не компилится ; KEYBOARD - DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A - DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift. - DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C + DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A + DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift. + DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C DEFINE USE_E1_SCANCODE 0 DEFINE CLASSIC_CURSOR 0 ; -;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе +;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 diff --git a/DSS/drivers/Input/MOUSE.ASM b/DSS/drivers/Input/MOUSE.ASM index 60a978b..93dda3a 100644 --- a/DSS/drivers/Input/MOUSE.ASM +++ b/DSS/drivers/Input/MOUSE.ASM @@ -14,20 +14,25 @@ PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data RRCA RET NC ELSE - ;[x] mouse freeeeezzzz - ;LD BC,MOUSE_READ_PORT_TIMEOUT + IF MOUSE_READ_PORT_TIMEOUT != 0 + ;[x] mouse bug + LD BC,MOUSE_READ_PORT_TIMEOUT ; + ENDIF .READ_BYTE: IN A,(PORT_MOUSE.Ctrl) RRCA - ;[x] mouse freeeeezzzz - ;JR C,.NEXT - ;DEC BC - ;LD A,B - ;OR C - ;JR NZ,.READ_BYTE - ;RET - JR NC,.READ_BYTE + IF MOUSE_READ_PORT_TIMEOUT != 0 + ;[x] mouse bug + JR C,.NEXT + DEC BC + LD A,B + OR C + JR NZ,.READ_BYTE + RET .NEXT: ; + ELSE + JR NC,.READ_BYTE + ENDIF ENDIF ENDM //////////////////////////////////////////////////////////////////////// @@ -678,7 +683,7 @@ CLEAR_MOUSE_BUFFER: ;----------------------------------------------------------------------; -READ_M: /*;[ ] 18/02/2024 проверка на переполнение буфера +READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера ; reg 1 LD A,1 OUT (PORT_MOUSE.Ctrl),A @@ -698,7 +703,6 @@ READ_M: /*;[ ] 18/02/2024 ; JR CLEAR_MOUSE_BUFFER ; -*/ IF MOUSE_INT_ENABLED .Prepare: LD HL,.Step LD A,(HL) @@ -722,8 +726,8 @@ READ_M: /*;[ ] 18/02/2024 LD L,A ENDIF AND %0100'0000 - RET Z - ;JP Z,CLEAR_MOUSE_BUFFER + ;RET Z + JP Z,CLEAR_MOUSE_BUFFER ; IF MOUSE_INT_ENABLED INC (HL) @@ -745,10 +749,10 @@ READ_M: /*;[ ] 18/02/2024 LD E,A AND %0100'0000 ;!TEST - RET NZ - ;JR Z,.READ_THIRD_BYTE - ;LD L,E - ;JR .READ_SECOND_BYTE + ;RET NZ + JR Z,.READ_THIRD_BYTE + LD L,E + JR .READ_SECOND_BYTE ENDIF ; .READ_THIRD_BYTE: @@ -769,10 +773,10 @@ READ_M: /*;[ ] 18/02/2024 LD D,A AND %0100'0000 ;!TEST - RET NZ - ;JR Z,.packet_end - ;LD L,D - ;JR .READ_SECOND_BYTE + ;RET NZ + JR Z,.packet_end + LD L,D + JR .READ_SECOND_BYTE .packet_end: ; ENDIF ; @@ -901,9 +905,9 @@ SENSE: LD HL,(SENSEXY) RET Z DEC A RET Z - ; CP 2 - ; CCF - ; JR NC,.check_Y + ; CP 2 + ; CCF + ; JR NC,.check_Y ; LD A,E BIT 7,A @@ -924,10 +928,10 @@ SENSE: LD HL,(SENSEXY) .next: LD E,B ; [x] 15/03/2024 теперь поправки чувствительности по координатам работают корректно .check_Y: - LD A,H - CP 2 - CCF - RET NC + ; LD A,H + ; CP 2 + ; CCF + ; RET NC ; LD A,D BIT 7,A @@ -1055,7 +1059,7 @@ MIN_Y: DW 0 MAX_Y: DW 255 SENSEXY: ; Сэн Сэкси .X: DB 0 -.Y: DB 2 +.Y: DB 0 XHOT_SP: DW 0 YHOT_SP: DW 0 diff --git a/Shared_Includes b/Shared_Includes index 399bf41..1cb8eb1 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 399bf41c5cbd12d2866204ee3ff1cc357a3d3a99 +Subproject commit 1cb8eb13fb8e8b20bba324a5ab9f4e18d6bf8b3c From 1fab8944098fde50ffdd1b6b50633181bdaef398 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 24 Jun 2024 02:22:58 +1000 Subject: [PATCH 154/219] sys: fixed bug with installing system files on drive core: fixed bug with stack in RST_38_IM1.Portal --- BOOT/boot.asm | 14 ++++++++------ DSS/DSS-MAIN.ASM | 14 ++++++++++++++ DSS/build.txt | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 855099d..43f21e3 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -94,7 +94,7 @@ ; версия программы major_version equ 2 ; ст. номер версии -minor_version equ 0 ; мл. номер +minor_version equ 1 ; мл. номер ;; SECTORS_OF_LOADER EQU 4 ; секторов загрузчика .IN_BPB EQU 1 @@ -837,7 +837,7 @@ write_file: ld a,FAT_ATTR.ARCHIVE ; push hl ; точка выхода ; ; чтение файла из банок и запись на диск - ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти + ld a,(FILE1_PARAMS.id_blck); идентиф. блока памяти ;ld b,0 ; лог. номер страницы в блоке ld bc,BIOS.GetMemPage ; получить физ. номер страницы в блоке rst ToBIOS @@ -864,11 +864,13 @@ write_file: ld a,FAT_ATTR.ARCHIVE ; RST ToDSS pop bc jr c,.error + ; write_ok + ; [ ] Fixed 24/06/2024 какой-то пережиток прошлого + ;cp -1 ; записано меньшее число байт ? + ;ld a,DSS_Error.sys.DISK_FULL + ;scf + ;jr nz,.error ; да, на диске нет места ; -.write_ok: cp -1 ; записано меньшее число байт ? - ld a,DSS_Error.sys.DISK_FULL - scf - jr nz,.error ; да, на диске нет места ld a,b ; a=физич. страница ld c,BIOS.GetMemPageNext ; получить номер след. физ. страницы блока rst ToBIOS diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 20360f7..f549401 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -148,10 +148,24 @@ RST_38_IM1: JP .Handler .Portal: PUSH AF LD A,(RST_0x30.drv_page) OUT (SLOT0),A + ;POP AF + PUSH HL + LD HL,(RST_38_IM1+1) + XOR A + CP H + JR NZ,.error + LD A,low .Handler + CP L + JR NZ,.error + POP HL POP AF CALL INTx38_Handler JR .Portal ; +.error: POP HL + POP AF + JR .Portal + ; //////////////////////////////////////////////////////////////////////// diff --git a/DSS/build.txt b/DSS/build.txt index b7e8805..6242099 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -991 \ No newline at end of file +992 \ No newline at end of file From 7bda57266b9dc6a7b1eff4178f12b81b885bff9f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 24 Jun 2024 03:06:52 +1000 Subject: [PATCH 155/219] fixed no interrupts enter to PAUSE command in BAT --- SHELL/Commands/PAUSE.ASM | 16 ++++++++++++---- SHELL/build.txt | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 55a48ce..c852082 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -4,11 +4,19 @@ ; ;/////////////////////////////////////////////////// cmd_pause: - ld de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." - call ECHO_MESSAGE ; вывод строки + LD de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." + CALL ECHO_MESSAGE ; вывод строки LD A,LF LD C,Dss.PutChar RST ToDSS - ld c,Dss.WaitKey ; ждем нажатия клавиши - JP ToDSS + LD A,R + PUSH AF + LD C,Dss.WaitKey ; ждем нажатия клавиши + EI + RST ToDSS + POP AF + DI + RET PO + EI + RET ;ret diff --git a/SHELL/build.txt b/SHELL/build.txt index 009bd2c..0ad1c6b 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -407 \ No newline at end of file +408 \ No newline at end of file From 4cebd03a1ae306d8073b616bea4e00362202f0a3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 25 Jun 2024 04:59:02 +1000 Subject: [PATCH 156/219] SHELL: new command "INFO"& Show FS in DIR. CORE: Some fixes with F_First --- DSS/API/Find.asm | 62 +++++----- DSS/API/diskINF.asm | 6 +- DSS/DSS-MAIN.ASM | 38 +++---- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 51 +++++---- SHELL/Commands/DIR.ASM | 205 +-------------------------------- SHELL/Commands/INFO.ASM | 75 ++++++++++++ SHELL/Messages/main_txt.asm | 14 ++- SHELL/Procedures/math.asm | 41 ++++--- SHELL/Procedures/shared.asm | 221 ++++++++++++++++++++++++++++++++++++ SHELL/SHELL.ASM | 4 +- SHELL/build.txt | 2 +- 12 files changed, 418 insertions(+), 303 deletions(-) create mode 100644 SHELL/Commands/INFO.ASM create mode 100644 SHELL/Procedures/shared.asm diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index ae10617..b25fa19 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -13,34 +13,32 @@ ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -F_FIRST: - LD (.TMP),A - LD (.DTABUF),DE - LD A,B - LD (.FNDMODE),A - PUSH HL - ;!TEST Current Dir ;[x] 15/10/23 - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; - CALL DIR_PATH_CHECK - RET C - ; -.old_EXE: - POP HL - CALL GETWORD - ;CALL LOADDIR - RET C - CALL MASK - RET C - LD A,(.TMP) - CALL SEARCH.Custom - RET C - LD HL,MASKARE +F_FIRST_FN: CALL F_FIRST.INIT_VARS + PUSH HL + ;!TEST Current Dir ;[x] 15/10/23 + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; + CALL DIR_PATH_CHECK + RET C + ; +.old_EXE: POP HL + JR F_FIRST.begin + ; +F_FIRST: CALL .INIT_VARS +.begin: CALL GETWORD + ;CALL LOADDIR + RET C + CALL MASK + RET C + LD A,(.TMP) + CALL SEARCH.Custom + RET C + LD HL,MASKARE .DTABUF+1: LD DE,0 LD BC,11 ;!HARDCODE @@ -78,7 +76,13 @@ F_FIRST: ; CALL GetName JR .exit - + ; +.INIT_VARS: + LD (.TMP),A + LD (.DTABUF),DE + LD A,B + LD (.FNDMODE),A + RET //////////////////////////////////////////////////////////////////////// ; ; diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 25050c3..bfc6cba 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -247,8 +247,10 @@ FAT_STRING: DB 'FAT12' GET_LABEL: PUSH DE LD HL,.LABEL_MASK ; "\*.*" имя метки LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома - LD BC,Dss.F_First.FATname ; f_first, формат 11 - RST ToDSS + LD B,high Dss.F_First.FATname + CALL F_FIRST + ;LD BC,Dss.F_First.FATname ; f_first, формат 11 + ;RST ToDSS POP DE LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL RET C diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f549401..8d69e39 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -335,16 +335,16 @@ GO_ZERO EQU #0000 ;FUNCTION ADDRESS ARRAY ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: -; 0 1 2 3 4 5 6 7 8 9 DEC HEX - DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D - DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 - DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B - DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 - DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F - DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 +; 0 1 2 3 4 5 6 7 8 9 DEC HEX + DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 + DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST_FN,low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D + DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 + DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B + DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 + DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F + DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F IFN SHORT_RSTx10_TABLE @@ -363,15 +363,15 @@ ADRST10: ;DS 512 ;,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: - DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN - DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY - DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 - DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH - DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY + DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK + DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST_FN,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN + DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY + DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY, high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 + DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH + DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT IFN SHORT_RSTx10_TABLE diff --git a/DSS/build.txt b/DSS/build.txt index 6242099..8b42f88 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -992 \ No newline at end of file +993 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 4392518..16f4265 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -493,34 +493,35 @@ EVALSTR: ld a,(hl) ; !! Не делать одну команду > 256 символов)) !! ; ; BAT-команды (не отделять от дос-команд) -BATLIST: DZ 'PAUSE' : DW cmd_pause ;CPAUSE - DZ 'REM' : DW cmd_rem ;CREM - DZ 'EXIT' : DW cmd_break ;break +BATLIST: DZ 'PAUSE' : DW cmd_pause + DZ 'REM' : DW cmd_rem + DZ 'EXIT' : DW cmd_break ; ; DSS-команды -CMDLIST: DZ 'CD' : DW cmd_chdir ;CCHDIR - DZ 'DIR' : DW cmd_dir ;DIR - DZ 'ECHO' : DW cmd_echo ;CECHO +CMDLIST: DZ 'CD' : DW cmd_chdir + DZ 'DIR' : DW cmd_dir + DZ 'ECHO' : DW cmd_echo DZ 'ECHO.' : DW cmd_echoLN - DZ 'PATH' : DW cmd_path ;CPATH - DZ 'MD' : DW cmd_mkdir ;CMKDIR - DZ 'REN' : DW cmd_rename ;CRENAM - DZ 'DEL' : DW cmd_del ;CDELET - DZ 'RD' : DW cmd_rmdir ;CRMDIR - DZ 'SET' : DW cmd_set ;CSET - DZ 'TIME' : DW cmd_time ;CTIME - DZ 'DATE' : DW cmd_date ;CDATE - DZ 'VER' : DW cmd_version ;VERS - DZ 'CLS' : DW cmd_cls ;CLS - DZ 'CHDIR' : DW cmd_chdir ;CCHDIR - DZ 'MKDIR' : DW cmd_mkdir ;CMKDIR - DZ 'RENAME' : DW cmd_rename ;CRENAM - DZ 'ERASE' : DW cmd_del ;CDELET - DZ 'RMDIR' : DW cmd_rmdir ;CRMDIR - DZ 'HELP' : DW cmd_help ;HELP - DZ 'VERSION' : DW cmd_version ;VERS - DZ 'EXIT' : DW cmd_exit ;CEXIT - DZ 'REBOOT' : DW cmd_reboot ;REBOOT + DZ 'PATH' : DW cmd_path + DZ 'MD' : DW cmd_mkdir + DZ 'REN' : DW cmd_rename + DZ 'DEL' : DW cmd_del + DZ 'RD' : DW cmd_rmdir + DZ 'INFO' : DW cmd_info + DZ 'SET' : DW cmd_set + DZ 'TIME' : DW cmd_time + DZ 'DATE' : DW cmd_date + DZ 'VER' : DW cmd_version + DZ 'CLS' : DW cmd_cls + DZ 'CHDIR' : DW cmd_chdir + DZ 'MKDIR' : DW cmd_mkdir + DZ 'RENAME' : DW cmd_rename + DZ 'ERASE' : DW cmd_del + DZ 'RMDIR' : DW cmd_rmdir + DZ 'HELP' : DW cmd_help + DZ 'VERSION' : DW cmd_version + DZ 'EXIT' : DW cmd_exit + DZ 'REBOOT' : DW cmd_reboot DB #00 diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 606d367..afdf8a5 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -106,8 +106,13 @@ cmd_dir: push de .SkipMask: LD C,Dss.CurDisk ; узнать тек. диск RST ToDSS CALL read_disk_info ; прочитать метку и серийный номер диска + JR NC,.NeXt + ; + CALL print_err_message + SCF + RET ; - CALL Print_Header +.NeXt: CALL Print_Header ; [ ] 01/10/23 ld hl,Buffers.work.free ; имя файла ld de,Buffers.work.buffer1 ; 80 буфер @@ -566,9 +571,6 @@ S_LOW: WORD 0 S_MED: WORD 0 S_HIGH: BYTE 0 dir_number: WORD 0 -free_space_low: WORD 0 -free_space_medium: WORD 0 -free_space_high: BYTE 0 ; full_space_low: WORD 0 full_space_medium: WORD 0 @@ -589,207 +591,12 @@ SIZE_BUFFER: db " " ; .bytes equ SIZE_BUFFER - $ ; -; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo -; иная логика получения метки тома - сначала ищется в корневой директории, -; если там нет, то берётся из BPB -read_disk_info: OR #80 - LD HL,Buffers.work.buffer -.full+1: LD B,0 - LD C,Dss.DskInfo - RST ToDSS - ; Файловая система - ; Серийный номер диска - ; Метка диска в BPB - ; - ; HL':HL - общее кол-во кластеров - ; DE':DE - свободных кластеров - ; A - размер кластера в секторах - ; BC - размер сектора в байтах - ; max sector (LBA28) #0FFF'FFFF - ; - EX AF,AF' - LD A,D - AND E - EXX - AND D - AND E - EXX - INC A - LD (.full),A - EX AF,AF' - ; - ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE - EXX - LD BC,0 - EXX - SRL B - RR C - RRCA - JR C,.loop2 - ; -.loop1: SLA L - RL H - EXX - RL L - RL H - RL B - EXX - ; - SLA E - RL D - EXX - RL E - RL D - RL C - EXX - ; - RRCA - JP NC,.loop1 - ; -.loop2: SLA L - RL H - EXX - RL L - RL H - RL B - EXX - ; - SLA E - RL D - EXX - RL E - RL D - RL C - EXX - ; - SRL B - RR C - JP NC,.loop2 - ; <-- B':HL'HL, C':DE':DE - EXX - LD A,C - LD (free_space_high),A - LD (free_space_medium),DE - ; - LD A,B - LD (full_space_high),A - LD (full_space_medium),HL - EXX - LD (free_space_low),DE - LD (full_space_low),HL - ; -.no_full_space_option: - ; parse - LD D,0 - LD HL,Buffers.work.buffer - ; тут в HL длина поля "Файловая система" - LD E,(HL) - ADD HL,DE - INC HL - ; длина поля "Серийный номер диска" - LD A,(HL) - LD E,A - ADD HL,DE - INC HL - PUSH HL ; указатель на длину поля "Метка диска" - CP 4 ;!HARDCODE длина поля серийного номера - JR NZ,unknown_serial - DEC HL - ; старшее слово серийника - LD D,(HL) - DEC HL - LD E,(HL) - DEC HL - PUSH HL - EX DE,HL - ld de,serial_string ; xxxx-xxxx - call hex16 - POP HL - ; - ld a,"-" - ld (de),a - INC DE - ; младшее слово серийника - LD A,(HL) - DEC HL - LD L,(HL) - LD H,A - call hex16 - ; -.get_label: ; тут в HL длина поля "Метка диска" - POP HL - LD A,(HL) - INC HL - AND A - jr z,.no_volume_label ; да - PUSH HL - LD B,A - LD A,' ' - ; -.loop: CP (HL) - JR NZ,.good_label - INC HL - DJNZ .loop - POP HL ; снимаем лишнее - ; нет метки -.no_volume_label:; %6 - ld hl,volume_string_no ; строка - ld de,Buffers.bat_params.PRM6; куда - call ncopy_string ; скопир. строку (с нулем) - XOR A - LD (Buffers.bat_params.PRM7),A - ret -.good_label: POP HL - PUSH HL ; толкаем лишнее - ; есть метка -volume_label: POP DE ; снимаем лишнее - ; %7 - ld de,Buffers.bat_params.PRM7 - ld bc,11 ;!HARDCODE длина метки - ldir - xor a - ld (de),a - ; %6 - ld hl,volume_string_yes ; строка - ld de,Buffers.bat_params.PRM6; куда - call ncopy_string ; скопир. строку (с нулем) - ret - ; -; если не удалось прочитать серийный номер диска или формат неизвестен -unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже - LD HL,serial_string - LD A,'?' - LD B,serial_string.Size -.loop: LD (HL),A - INC HL - DJNZ .loop - LD HL,serial_string+4 - LD (HL),'-' - ;POP HL ; лишнее - JP read_disk_info.get_label - ; - ;---------------; SlashMaskFname: db '\' ; ; маска файлов mask_fname: db "*.*",0 ;---------------; -; корень диска -;root_path: db 'X:\',0 - -; Серийный номер диска -serial_string: db "xxxx-xxxx" -.Size equ $-serial_string - db 0 ; закрывашка - -volume_string_no: - db "has no label",0 -volume_string_yes: - db "has label",0 -; has_not_full_info: -; db ' (?)',0 -; cmd_dir_options:; [x] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром) DB 'f' : DW cmd_dir_freeSpace DB 'p' : DW cmd_dir_pause diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM new file mode 100644 index 0000000..46be1ba --- /dev/null +++ b/SHELL/Commands/INFO.ASM @@ -0,0 +1,75 @@ +;[ ] 24/06/2024 +cmd_info: LD DE,MAIN_MSG.INFO_1 ; индекс "Drive Label Serial number Size" + CALL ECHO_MESSAGE + ; + LD HL,.Collect_Msg + LD C,Dss.PChars + RST ToDSS + ; + LD A,":" + LD (Buffers.bat_params.PRM9+1),A + XOR A + LD (Buffers.bat_params.PRM9+2),A ; Drive "X:",0 + LD (read_disk_info.full),A + ; + LD C,Dss.CurDisk + RST ToDSS + LD B,C + LD C,-1 + ; +.loop: INC C + PUSH BC + LD A,C + ADD "A" + LD (Buffers.bat_params.PRM9),A + LD A,C + CALL read_disk_info + JR C,.next_drv + ; %7 - Volume label + ; serial_string - Volume serial number string + ; full_space_high \ + ; full_space_medium - Partition size + ; full_space_low / + ; + LD HL,.Collect_Msg + LD C,Dss.PChars + RST ToDSS + ; + LD HL,serial_string + LD DE,Buffers.bat_params.PRM4 ; Volume serial number string + CALL ncopy_string + ; full capacity + ld a,(full_space_high) + ld hl,(full_space_medium) ; ст. разряд + exx + ld hl,(full_space_low) ; мл. разряд + CALL PRN_DISK_SIZE + ; %5..6 - Full size + ; + ; форматирование PRM5 + LD HL,Buffers.bat_params.PRM5 - 1 + LD DE,Buffers.bat_params.PRM5 +.clear_spaces: INC HL + LD A,(HL) + CP " " + JR Z,.clear_spaces + AND A + CALL NZ,copy_string + ; +.print_info_2: LD DE,MAIN_MSG.INFO_2 ; индекс "Drive Label Serial number Size" + CALL ECHO_MESSAGE + ; +.next_drv: POP BC + DJNZ .loop + RET + ; +.Collect_Msg: DZ "Please wait, information is being collected...\r" + +/* +0 1 2 3 4 5 6 7 +01234567890123456789012345678901234567890123456789012345678901234567890123456789; +Drive File System Label Serial number Size in bytes + C: FAT32 NO NAME xxxx-xxxx 147,102,629,888. + D: FAT16 SP_SYS xxxx-xxxx 147,102,629,888. + ; +*/ diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 8dd5dcd..ce06ba4 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -22,6 +22,8 @@ MAIN_MSG: .HELP EQU .HELP_ .CALCULATING EQU .CALC_ .CRLF EQU .CRLF_ +.INFO_1 EQU .INFO_1_ +.INFO_2 EQU .INFO_2_ ; !txtCounter DEFL 0 ; ; не сдвигать____ @@ -32,7 +34,7 @@ MAIN_MSG: ; 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; stN .DIR_1_ : db "Volume in drive %1 %6 %7\r\n" - db "Volume Serial Number is %2\r\n" + db "Volume Serial Number is %2, file sistem is %8\r\n" DZ "\r\nDirectory of %3\r\n\n" stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13 stN .DATE_ : DZ "Current date: %1, %2\r\n" ; [x] вывод дня недели 26/01/2023 @@ -48,11 +50,13 @@ MAIN_MSG: stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT stN .HELP_ : db "COMMANDS:\r\n" - db "DIR REN | RENAME PATH HELP \r\n" - db "CD | CHDIR DEL | ERASE SET VER | VERSION \r\n" - db "MD | MKDIR TIME ECHO EXIT \r\n" - DZ "RD | RMDIR DATE CLS REBOOT \r\n\n" + db "CLS INFO REN = RENAME PATH HELP \r\n" + db "CD = CHDIR DEL = ERASE SET VER = VERSION \r\n" + db "MD = MKDIR TIME ECHO EXIT \r\n" + DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" + stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" + stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5.\r\n" ; ;R11 db 0 DZ "Unknown command" diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm index 21ff29d..84ae18d 100644 --- a/SHELL/Procedures/math.asm +++ b/SHELL/Procedures/math.asm @@ -1,27 +1,26 @@ ;----------------------------------------------------------------------; ; Вывод HL в hex-формате -; de=буфер ; hl=число -hex16: ld a,h - call hex8 - ld a,l -; вывод "a" -hex8: push af - rrca - rrca - rrca - rrca - call .num - pop af - ; -.num: and %0000'1111 - add a,#90 - daa - adc a,#40 - daa - ld (de),a - inc de - ret +; de=буфер +hex16_to_str: ld a,h + call hex8_to_str + ld a,l +hex8_to_str: push af + rrca + rrca + rrca + rrca + call .num + pop af + ; +.num: and %0000'1111 + add a,#90 + daa + adc a,#40 + daa + ld (de),a + inc de + ret ;----------------------------------------------------------------------; diff --git a/SHELL/Procedures/shared.asm b/SHELL/Procedures/shared.asm new file mode 100644 index 0000000..b223c6c --- /dev/null +++ b/SHELL/Procedures/shared.asm @@ -0,0 +1,221 @@ +;----------------------------------------------------------------------; +; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo +; иная логика получения метки тома - сначала ищется в корневой директории, +; если там нет, то берётся из BPB +; Вход: выставить переменную read_disk_info.full: +; 0 - не считать свободное место, !0 - считать +; Выход: +; %7 - Volume label +; serial_string - Volume serial number string +; full_space_high \ +; full_space_medium - Partition size +; full_space_low / +; %6 - "has no label" or "has label" +; +read_disk_info: OR #80 + LD HL,Buffers.work.buffer +.full+1: LD B,0 + LD C,Dss.DskInfo + RST ToDSS + RET C + ; Файловая система + ; Серийный номер диска + ; Метка диска в BPB + ; Физический номер диска, номер раздела + ; + ; HL':HL - общее кол-во кластеров + ; DE':DE - свободных кластеров + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + ; max sector (LBA28) #0FFF'FFFF + ; + EX AF,AF' + LD A,D + AND E + EXX + AND D + AND E + EXX + INC A + LD (.full),A + ; + AND H + + EX AF,AF' + ; + ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE + EXX + LD BC,0 + EXX + SRL B + RR C + RRCA + JR C,.loop2 + ; +.loop1: SLA L + RL H + EXX + RL L + RL H + RL B + EXX + ; + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + ; + RRCA + JR NC,.loop1 + ; +.loop2: SLA L + RL H + EXX + RL L + RL H + RL B + EXX + ; + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + ; + SRL B + RR C + JR NC,.loop2 + ; <-- B':HL'HL, C':DE':DE + EXX + LD A,C + LD (free_space_high),A + LD (free_space_medium),DE + ; + LD A,B + LD (full_space_high),A + LD (full_space_medium),HL + EXX + LD (free_space_low),DE + LD (full_space_low),HL + ; +.no_full_space_option: + ; parse + ; copy FS type + LD HL,Buffers.work.buffer + LD DE,Buffers.bat_params.PRM8; куда + LD B,0 + LD C,(HL) ; тут в HL длина поля "Файловая система" + INC HL + LDIR + EX DE,HL + LD (HL),0 + EX DE,HL + ; + LD D,0 + ; ; тут в HL длина поля "Файловая система" + ; LD E,(HL) + ; ADD HL,DE + ; INC HL + ; длина поля "Серийный номер диска" + LD A,(HL) + LD E,A + ADD HL,DE + INC HL + PUSH HL ; указатель на длину поля "Метка диска" + CP 4 ;!HARDCODE длина поля серийного номера + JR NZ,.unknown_serial + DEC HL + ; старшее слово серийника + LD D,(HL) + DEC HL + LD E,(HL) + DEC HL + PUSH HL + EX DE,HL + LD DE,serial_string ; xxxx-xxxx + CALL hex16_to_str + POP HL + ; + LD A,"-" + LD (DE),A + INC DE + ; младшее слово серийника + LD A,(HL) + DEC HL + LD L,(HL) + LD H,A + CALL hex16_to_str + ; +.get_label: ; тут в HL длина поля "Метка диска" + POP HL + LD A,(HL) + INC HL + AND A + JR Z,.no_volume_label ; да + PUSH HL + LD B,A + LD A,' ' + ; +.loop: CP (HL) + JR NZ,.good_label + INC HL + DJNZ .loop + POP HL ; снимаем лишнее + ; нет метки +.no_volume_label:; %6 + LD HL,volume_string_no ; строка + LD DE,Buffers.bat_params.PRM6; куда + CALL ncopy_string ; скопир. строку (с нулем) + XOR A + LD (Buffers.bat_params.PRM7),A + RET + ; +.good_label: POP HL + PUSH HL ; толкаем лишнее + ; есть метка +.volume_label: POP DE ; снимаем лишнее + ; %7 + LD DE,Buffers.bat_params.PRM7 + LD BC,11 ;!HARDCODE длина метки + LDIR + XOR A + LD (DE),A + ; %6 + LD HL,volume_string_yes ; строка + LD DE,Buffers.bat_params.PRM6; куда + XOR A + JP ncopy_string ; скопир. строку (с нулем) + ; + ; если не удалось прочитать серийный номер диска или формат неизвестен +.unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже + LD HL,serial_string + LD A,'?' + LD B,serial_string.Size +.loop3: LD (HL),A + INC HL + DJNZ .loop3 + LD HL,serial_string+4 + LD (HL),'-' + JR read_disk_info.get_label + ; +/////////////////////////////////////////////////////////////////////// +free_space_low: WORD 0 +free_space_medium: WORD 0 +free_space_high: BYTE 0 +; Серийный номер диска +serial_string: db "xxxx-xxxx" +.Size equ $-serial_string + db 0 ; закрывашка +; +volume_string_no: db "has no label",0 +; +volume_string_yes: db "has label",0 +; +; has_not_full_info: db ' (?)',0 +/////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------; \ No newline at end of file diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 3e0f8b4..14b098d 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -381,7 +381,7 @@ ncopy_string: ldi ret po or a - jr nz,$-5 ;!FIXIT $ + jr nz,.start ret ; Скопир. строку (с нулем) @@ -532,6 +532,7 @@ T8C24: db "OFF",0 include 'messages/main_txt.asm' ; сообщения include 'procedures/parsers.asm' ; функции прочесывания и выбора include 'procedures/math.asm' ; функции математические + include 'procedures/shared.asm' ; функции разные ; include 'Commands/exit.asm' ; выход в родит. процесс include 'Commands/break.asm' ; выход из парсера bat @@ -541,6 +542,7 @@ T8C24: db "OFF",0 include 'Commands/cls.asm' ; очистка экрана include 'Commands/date.asm' ; вывод или установка даты/времени include 'Commands/dir.asm' ; вывод списка директории + include 'Commands/info.asm' ; вывод информации о дисках include 'Commands/chdir.asm' ; смена тек. каталога include 'Commands/mkdir.asm' ; создание каталога include 'Commands/rmdir.asm' ; удаление каталога diff --git a/SHELL/build.txt b/SHELL/build.txt index 0ad1c6b..3cf63f9 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -408 \ No newline at end of file +425 \ No newline at end of file From 3480195912d61c92311edfa92dd17bae3a52c77b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 26 Jun 2024 04:09:40 +1000 Subject: [PATCH 157/219] write protected partition with 64 kb cluster --- DSS/API/Attribute.asm | 4 + DSS/API/Create.asm | 6 +- DSS/API/Delete.asm | 4 + DSS/API/MkDir.asm | 8 +- DSS/API/Rename.asm | 149 +++++++++++++++++++----------------- DSS/API/RmDir.asm | 4 + DSS/API/SetDateTime.asm | 37 ++++----- DSS/API/Write.asm | 4 + DSS/DSS-MAIN.ASM | 17 +++- DSS/FS/FAT/FAT.asm | 3 +- DSS/build.txt | 2 +- SHELL/Messages/main_txt.asm | 2 +- SHELL/build.txt | 2 +- 13 files changed, 142 insertions(+), 100 deletions(-) diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index f0dcb81..8f07db9 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -76,6 +76,10 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C + ; [ ] 26/06/2024 + CALL CHECK_64kb_CLUSTER + RET C + ; CALL MASK RET C LD A,FAT_ATTR.NoVolID diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 6189a72..d41492b 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -108,8 +108,10 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: LD (.PATH0),HL CALL GETWORD RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE + ; [ ] 26/06/2024 + CALL CHECK_64kb_CLUSTER + RET C + ; JP MASK ; ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 25017f3..8c032f4 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -19,6 +19,10 @@ DEL_FN: ;!TEST ; .old_EXE: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C + ; [ ] 26/06/2024 + CALL CHECK_64kb_CLUSTER + RET C + ; CALL MASK RET C ; diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 55b3a95..581ec75 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -34,9 +34,11 @@ MKDIR: ; .START: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - ;LD HL,TMPNAME ; 8.3 имя - ;LD DE,MASKARE ; буфер имени 11 симв. формата - CALL MASK ; преобр. имя 8.3 -> 11 формат + ; [ ] 26/06/2024 + CALL CHECK_64kb_CLUSTER + RET C + ; + CALL MASK RET C ;!TEST optimization ранее GETWORD уже загрузил директорию ;CALL LOADDIR ; прочитать список каталога diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index df90e5d..03f8e1f 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -9,77 +9,82 @@ ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -RENAME: ;!TEST Current Dir ;[x] 15/10/23 - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; - PUSH HL - PUSH DE - CALL DIR_PATH_CHECK.forceCheck - POP DE - POP HL - RET C - ; -.old_EXE: - PUSH DE - ;LD DE,MASKARE - CALL MASK.name - POP DE - RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - PUSH DE - CALL LOADDIR ; прочитать список каталога - ;LD A,#33 - LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.Custom ; поиск записи в списке диска - POP HL - RET C - ;LD DE,MASKARE - CALL MASK.name - RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - PUSH IX - LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.Custom ; поиск записи в списке диска - POP IX - LD A,DSS_Error.sys.FILE_EXISTS - CCF - RET C +RENAME: ;!TEST Current Dir ;[x] 15/10/23 + ; [ ] 10/06/24 + IF OLD_DSS_FOR_OLD_EXE + LD A,(EXE_VERSION) + OR A + JR Z,.old_EXE + ENDIF + ; + PUSH HL + PUSH DE + CALL DIR_PATH_CHECK.forceCheck + POP DE + POP HL + RET C + ; +.old_EXE: ; + ; !TODO воткнуть тут GETWORD, чтоб можно было удалять по относительным путям? + ; + ; [ ] 26/06/2024 + CALL CHECK_64kb_CLUSTER + RET C + ; + PUSH DE + CALL MASK.name + POP DE + RET C + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + PUSH DE + CALL LOADDIR ; прочитать список каталога + ;LD A,#33 + LD A,FAT_ATTR.NoSYSnoVolID + CALL SEARCH.Custom ; поиск записи в списке диска + POP HL + RET C + ;LD DE,MASKARE + CALL MASK.name + RET C + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + PUSH IX + LD A,FAT_ATTR.NoSYSnoVolID + CALL SEARCH.Custom ; поиск записи в списке диска + POP IX + LD A,DSS_Error.sys.FILE_EXISTS + CCF + RET C SET_PAGE_X DIRPAGE - EX AF,AF' - ; - LD HL,MASKARE - LD D,XH - LD E,XL - LD BC,11 - LDIR - ; - CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN - ; - EX AF,AF' - OUT (SLOT3),A - JP SAVEDIR -; \ No newline at end of file + EX AF,AF' + ; + LD HL,MASKARE + LD D,XH + LD E,XL + LD BC,11 + LDIR + ; + CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN + ; + EX AF,AF' + OUT (SLOT3),A + JP SAVEDIR +; ; ; \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index fc7a0b9..4df8bfd 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -30,6 +30,10 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; .START: CALL GETWORD RET C + ; [ ] 26/06/2024 + CALL CHECK_64kb_CLUSTER + RET C + ; CALL MASK RET C ;!TEST optimization diff --git a/DSS/API/SetDateTime.asm b/DSS/API/SetDateTime.asm index 38aab39..ee36795 100644 --- a/DSS/API/SetDateTime.asm +++ b/DSS/API/SetDateTime.asm @@ -10,22 +10,23 @@ ; B - секунды ; выход: A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -PUT_D_T: - PUSH AF - CALL MK_TIME ; закодировать время/дату - POP AF ; дескриптор - PUSH DE - PUSH BC - CALL SET_FM - POP BC - POP DE - RET C - ; [ ] VFAT - LD (IY + _sFM.FS_REC.TIME),E - LD (IY + _sFM.FS_REC.TIME+1),D - LD (IY + _sFM.FS_REC.DATE),C - LD (IY + _sFM.FS_REC.DATE+1),B - SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла - AND A - RET + +;!FIXIT надо? CHECK_64kb_CLUSTER +PUT_D_T: PUSH AF + CALL MK_TIME ; закодировать время/дату + POP AF ; дескриптор + PUSH DE + PUSH BC + CALL SET_FM + POP BC + POP DE + RET C + ; [ ] VFAT + LD (IY + _sFM.FS_REC.TIME),E + LD (IY + _sFM.FS_REC.TIME+1),D + LD (IY + _sFM.FS_REC.DATE),C + LD (IY + _sFM.FS_REC.DATE+1),B + SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла + AND A + RET ; \ No newline at end of file diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 8a1473c..ec87280 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -37,6 +37,10 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] LD A,(IY + _sFM.DRIVE) CALL OPENDSK JR C,.ERR1 + ; [ ] 26/06/2024 + CALL CHECK_64kb_CLUSTER + RET C + ; CALL GET_OFFSET_IN_SECTORS ; JP NZ,.WOV1 diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 8d69e39..6b2f37a 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -166,9 +166,10 @@ RST_38_IM1: JP .Handler POP AF JR .Portal ; - //////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// ; ;NMI: RETN ; @@ -180,6 +181,7 @@ RST_38_IM1: JP .Handler NMI_0x66: RETN ;JP NMI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; +//////////////////////////////////////////////////////////////////////// ; RST_10: PUSH HL @@ -404,6 +406,19 @@ ADRST10: ;DS 512 ;,0 INCLUDE "Procedures.asm" INCLUDE "Kernel_Panic.asm" + +; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb +CHECK_64kb_CLUSTER: + LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + ; CF=0 + ADC HL,HL + LD A,DSS_Error.sys.WRITE_PROTECT + RET NZ + CCF + RET + ; + + ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 7dff503..18ee8d3 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -579,7 +579,8 @@ LOAD_SAVE_DIR_PREPARE: ; скопировать запись в список диска (каталога) de ix iy ; и сбросить кеш каталога на диск ; вход: (HANDBUF) - запись каталога -WRT_HND: SET_PAGE_X DIRPAGE +WRT_HND: + SET_PAGE_X DIRPAGE EX AF,AF' LD HL,DIRPAGE.buffer ;!TEST 9/11/23 record index diff --git a/DSS/build.txt b/DSS/build.txt index 8b42f88..1345866 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -993 \ No newline at end of file +994 \ No newline at end of file diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index ce06ba4..222c708 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -45,7 +45,7 @@ MAIN_MSG: stN .ECHO_ : DZ "Echo is %1\r\n" stN .ON_ : DZ "on" stN .OFF_ : DZ "off" - stN .DIR_2_ : db " %3 File(s)\r %1 byte(s)\r\n" + stN .DIR_2_ : db "\r\n %3 File(s)\r %1 byte(s)\r\n" DZ " %4 Dir(s)\r %5 byte(s) capacity\r\n" stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT diff --git a/SHELL/build.txt b/SHELL/build.txt index 3cf63f9..b872400 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -425 \ No newline at end of file +427 \ No newline at end of file From ca0bdc70490a8f1c5c267fc897a83330bed554af Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 27 Jun 2024 02:57:12 +1000 Subject: [PATCH 158/219] bugfixes SHELL: INFO shows unknown drives --- DSS/API/Rename.asm | 3 ++ SHELL/Commands/INFO.ASM | 62 +++++++++++++++++++++++++++++++------ SHELL/EXEC.ASM | 16 +++++----- SHELL/Messages/main_txt.asm | 2 +- SHELL/build.txt | 2 +- 5 files changed, 66 insertions(+), 19 deletions(-) diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index 03f8e1f..4acb58f 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -28,8 +28,11 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 ; !TODO воткнуть тут GETWORD, чтоб можно было удалять по относительным путям? ; ; [ ] 26/06/2024 + PUSH HL CALL CHECK_64kb_CLUSTER + POP HL RET C + ; PUSH DE CALL MASK.name diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index 46be1ba..ad333ed 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -1,5 +1,7 @@ ;[ ] 24/06/2024 -cmd_info: LD DE,MAIN_MSG.INFO_1 ; индекс "Drive Label Serial number Size" +cmd_info: CALL Get_Path + ; + LD DE,MAIN_MSG.INFO_1 ; индекс "Drive Label Serial number Size" CALL ECHO_MESSAGE ; LD HL,.Collect_Msg @@ -20,21 +22,24 @@ cmd_info: LD DE,MAIN_MSG.INFO_1 ; .loop: INC C PUSH BC LD A,C + LD (.patch_A),A ADD "A" LD (Buffers.bat_params.PRM9),A - LD A,C + LD (.Collect_Msg+1),A + ; + LD HL,.Collect_Msg + LD C,Dss.PChars + RST ToDSS + ; +.patch_A+1: LD A,0 CALL read_disk_info - JR C,.next_drv + JR C,.Unformatted_Partition ; %7 - Volume label ; serial_string - Volume serial number string ; full_space_high \ ; full_space_medium - Partition size ; full_space_low / ; - LD HL,.Collect_Msg - LD C,Dss.PChars - RST ToDSS - ; LD HL,serial_string LD DE,Buffers.bat_params.PRM4 ; Volume serial number string CALL ncopy_string @@ -43,7 +48,7 @@ cmd_info: LD DE,MAIN_MSG.INFO_1 ; ld hl,(full_space_medium) ; ст. разряд exx ld hl,(full_space_low) ; мл. разряд - CALL PRN_DISK_SIZE +.convert_hex: CALL PRN_DISK_SIZE ; %5..6 - Full size ; ; форматирование PRM5 @@ -61,9 +66,46 @@ cmd_info: LD DE,MAIN_MSG.INFO_1 ; ; .next_drv: POP BC DJNZ .loop - RET + JP RESTORE_ALL.path + ;RET ; -.Collect_Msg: DZ "Please wait, information is being collected...\r" +.Unformatted_Partition: + LD HL,.none_string + LD DE,Buffers.bat_params.PRM4 ; Volume serial number string + CALL ncopy_string + LD HL,.none_string + LD DE,Buffers.bat_params.PRM7 ; Volume label + CALL ncopy_string + LD HL,.Unknown_FS + LD DE,Buffers.bat_params.PRM8 ; Volume fikle system + CALL ncopy_string + ; + POP BC + PUSH BC + LD A,C + LD DE,#55AA + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + JR C,.next_drv + ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 + ; HL:DE * 512 = A:HL:H'L' + RL E + RL D + RL L + RL H + LD C,E + LD A,H + LD H,L + LD L,D + EXX + LD H,C + LD L,0 + JR .convert_hex + ; +.Collect_Msg: DZ " A: \r" ; патчится буква драйва в цикле +.Unknown_FS: DZ "unknown" +.none_string: DZ "none" + /* 0 1 2 3 4 5 6 7 diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 0aa1bf9..60b77cf 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -184,9 +184,15 @@ Ret_New_Line: jp newline RESTORE_ALL: - ;[x] 01/11/23 ;!TEST + ;[x] 01/11/23 ;!TEST CALL Get_Path - ; + CALL .path + ;R10 + CALL Restore_Screen + ;R10 + RET + ; +.path: ;[x] 01/11/23 ;!TEST LD A,(Buffers.screen_path) SUB 'A' LD C,Dss.ChDisk @@ -195,10 +201,6 @@ RESTORE_ALL: LD HL,Buffers.sys_path LD C,Dss.ChDir RST ToDSS + RET ; - ;R10 - CALL Restore_Screen - ;R10 - ; - RET ; \ No newline at end of file diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 222c708..4237a7e 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -56,7 +56,7 @@ MAIN_MSG: DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" - stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5.\r\n" + stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5\r\n" ; ;R11 db 0 DZ "Unknown command" diff --git a/SHELL/build.txt b/SHELL/build.txt index b872400..af40ff6 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -427 \ No newline at end of file +433 \ No newline at end of file From 8c1b27e2af4fc039f6402ff6648737411887997b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 28 Jun 2024 00:33:57 +1000 Subject: [PATCH 159/219] sys: fixed a bug in GETROOT reported by Roman Boykov. --- BOOT/DSSBOOT.ASM | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index de7bf5c..bee178c 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -311,7 +311,7 @@ PART_TB: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; - LD HL,YEPDOS + ;LD HL,YEPDOS ; .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) ; ЕСЛИ добавится поддержка ещё нескольких типов ФС, то поменять 1fs на 2fs @@ -722,6 +722,10 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD IX,(FatBuffer.RootDirFirstSector_L) LD BC,(PARTITION_START_L) LD DE,(PARTITION_START_H) + ; [x] 28/04/2024. Bug with incorrect reading root dir. Found Roman "Romychs" Boykov. + ADD IX,BC + ADC HL,DE + ; LD A,(FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 LD A,(FatBuffer.DirSizeInSectors) @@ -729,11 +733,10 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) ; LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32 .NEXTSEC: PUSH AF - ADD IX,BC - ;JR NC,.skip_inc - ;INC HL - ADC HL,DE -;.skip_inc: ;HL:IX + ; [x] 28/04/2024. Bug with incorrect reading root dir. Found Roman "Romychs" Boykov. + ;ADD IX,BC + ;ADC HL,DE + ; PUSH IX PUSH HL LD BC,1*256 + BIOS.DRV_READ @@ -747,8 +750,13 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) RET C RET NZ LD A,B - ;LD DE,0 + ; next sector LD BC,1 + ; [x] 28/04/2024. Bug with incorrect reading root dir. Found Roman "Romychs" Boykov. + ADD IX,BC + ADC HL,BC + DEC HL + ; DEC A JR NZ,.NEXTSEC SCF From eb3ee21087bd1d9b9b8175cd937f5c879e4d7798 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 28 Jun 2024 00:38:22 +1000 Subject: [PATCH 160/219] sys: fixed a bug in GETROOT reported by Roman Boykov. comment fixed --- BOOT/DSSBOOT.ASM | 170 +++++++++++++++++++++++------------------------ 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index bee178c..352abf2 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -14,11 +14,11 @@ MODULE DSS_Boot_Loader -; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление. +; BIOS 3.06 я┐╜я┐╜я┐╜я┐╜ужая┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ секя┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜чикя┐╜ я┐╜ я┐╜я┐╜редя┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜равя┐╜я┐╜я┐╜я┐╜я┐╜. - ; 0 - оригинальный вариант запуска DSS, 1 - вариант Саймана + ; 0 - я┐╜ригя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜риая┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ска DSS, 1 - я┐╜я┐╜риая┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ DEFINE ORIGINAL_DSS 0 - ; 1 - будет грузить версию Саймана и основную. 0 - только основную. + ; 1 - я┐╜удея┐╜ я┐╜я┐╜узия┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ я┐╜сноя┐╜я┐╜я┐╜я┐╜. 0 - только я┐╜сноя┐╜я┐╜я┐╜я┐╜. DEFINE UNIVERSAL_BOOT 1 ;------------------------------------------------------------------------------ @@ -43,7 +43,7 @@ DRIVE: _mSYSID ; LD SP,#C000 ; ; LD (DRIVE),A - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ XOR A LD (DRIVE+1),A ; @@ -59,7 +59,7 @@ DRIVE: _mSYSID BIT 7,A JR Z,GOOD_DRIVE EX DE,HL - LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка + LD DE,2*256 + 21 ;!HARDCODE я┐╜сли я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ 2.21, я┐╜ я┐╜шибя┐╜я┐╜ SBC HL,DE LD HL,MESSAGES.INCORR RET C ; goto FAIL @@ -67,7 +67,7 @@ DRIVE: _mSYSID GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 - LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика + LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜узкя┐╜ секя┐╜ров я┐╜я┐╜я┐╜я┐╜я┐╜чикя┐╜ LD A,(DRIVE) RST ToBIOS_18 JP NC,CONTINUE @@ -164,7 +164,7 @@ CONTINUE: LD HL,0 ; LD HL,MESSAGES.NO_SYS RET C ; goto FAIL - ; [ ] загрузка system.dos больше #4000 байтов + ; [ ] я┐╜я┐╜я┐╜я┐╜узкя┐╜ system.dos я┐╜я┐╜я┐╜я┐╜я┐╜ #4000 я┐╜я┐╜я┐╜тов LD HL,(FSIZE1) LD A,H OR L @@ -177,14 +177,14 @@ CONTINUE: LD HL,0 .set_no_size: LD (LOAD_CORE.BIG_CORE),A OR A PUSH AF - ; загрузка + ; я┐╜я┐╜я┐╜я┐╜узкя┐╜ EXX LD HL,(FCLUSTER_H) EXX LD HL,(FCLUSTR_L) LD DE,#C000 CALL LOAD_CORE - ; [ ] загрузка system.dos больше #4000 байтов + ; [ ] я┐╜я┐╜я┐╜я┐╜узкя┐╜ system.dos я┐╜я┐╜я┐╜я┐╜я┐╜ #4000 я┐╜я┐╜я┐╜тов EX AF,AF' POP AF JR Z,.no_big_core @@ -195,10 +195,10 @@ CONTINUE: LD HL,0 LD (LOAD_CORE.BANKDOS),A LD A,SUBLOAD_SIZE LD (LOAD_CORE.max_sectors),A - LD (LOAD_CORE.BIG_CORE),A ; теперь это счётчик оставшихся секторов + LD (LOAD_CORE.BIG_CORE),A ; тепя┐╜я┐╜я┐╜ я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜чик я┐╜я┐╜тавя┐╜я┐╜я┐╜я┐╜ секя┐╜ров ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов + CP #20 + 1 ; !HARDCODE я┐╜я┐╜я┐╜-я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ужая┐╜я┐╜я┐╜я┐╜ секя┐╜ров JP NC,INC_SECTOR_NUM ;CALL R_F_FAT ; next cluster in chain CALL READ_FROM_FAT ; next cluster in chain @@ -223,11 +223,11 @@ RUN_CORE: DI ; ;DOS LOADED ;IF UNIVERSAL_BOOT - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD A,(DRIVE+1) ; номер раздела + ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ + LD A,(DRIVE+1) ; я┐╜я┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜ LD L,A ; - LD A,(DRIVE) ; номер устройства + LD A,(DRIVE) ; я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ройя┐╜тва LD C,Dss.Version RST ToDSS JP C,FAIL.NULL @@ -260,7 +260,7 @@ RUN_CORE: DI ; LD A,(DRIVE) ; LD BC,Dss.BootDSK.Set ; RST ToDSS - ; LD BС,Dss.BootDSK.Get + ; LD Bя┐╜,Dss.BootDSK.Get ; ENDIF ;ENDIF ; @@ -286,7 +286,7 @@ RUN_CORE: DI ; INC_SECTOR_NUM: PUSH DE CALL CLUSTER_TO_SECTOR - LD DE,#20 ;!HARDCODE количество прочитанных секторов + LD DE,#20 ;!HARDCODE я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜тво я┐╜я┐╜я┐╜таня┐╜я┐╜я┐╜ секя┐╜ров ADD IX,DE JR NC,.no_inc INC HL @@ -294,8 +294,8 @@ INC_SECTOR_NUM: PUSH DE POP DE LD BC,RUN_CORE PUSH BC - PUSH HL ; для баланса - PUSH HL ; для баланса + PUSH HL ; я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ + PUSH HL ; я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ JP LOAD_CORE.subload ; @@ -314,7 +314,7 @@ PART_TB: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;LD HL,YEPDOS ; .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) - ; ЕСЛИ добавится поддержка ещё нескольких типов ФС, то поменять 1fs на 2fs + ; я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ржкя┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜скоя┐╜ькия┐╜ типя┐╜я┐╜ я┐╜я┐╜, я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ 1fs я┐╜я┐╜ 2fs ; 1 CP PartitionSysTypes.FAT16_LBA JR Z,YEPDOS @@ -362,13 +362,13 @@ PART_TB: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ; ; -YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого +YEPDOS: ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ LD A,#80 CP (IX + _sMBR_PARTITION_RECORD.isActive) JR NZ,PART_TB.next - LD A,4 ;!HARDCODE счетчик записей партиций в MBR + LD A,4 ;!HARDCODE я┐╜я┐╜я┐╜чик я┐╜я┐╜я┐╜я┐╜сей я┐╜я┐╜я┐╜я┐╜ций я┐╜ MBR SUB B - PUSH AF ; номер загрузочного раздела + PUSH AF ; я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜узочноя┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜ ; LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) @@ -382,10 +382,10 @@ YEPDOS: ;[ ] 17.12.2023 LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ RST ToBIOS_18 - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ POP AF POP BC - LD L,A ; номер загрузочного раздела + LD L,A ; я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜узочноя┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜ LD A,C ; RET @@ -409,7 +409,7 @@ GET_BPB: LD HL,#0000 LD A,(DRIVE) RST ToBIOS_18 RET C - ; перекидывание части загрузчика из 0 сектора + ; я┐╜я┐╜рекя┐╜я┐╜ывая┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜чикя┐╜ я┐╜я┐╜ 0 секя┐╜я┐╜ LD HL,BOOT_BUFFER + (_sBOOT_SECTOR.PARTITION_TABLE - ZERO_SECTOR_OF_BPB.Size) LD DE,ZERO_SECTOR_OF_BPB LD BC,ZERO_SECTOR_OF_BPB.Size @@ -423,7 +423,7 @@ GET_BPB: LD HL,#0000 JR NZ,.NX1 CALL PART_TB ;HDD RET C - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ LD (DRIVE+1),HL ; .NX1: CP #00 @@ -534,7 +534,7 @@ GET_BPB: LD HL,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - ; LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ; LD DE,#8001 ; я┐╜ровя┐╜рка я┐╜я┐╜ разя┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ 32 я┐╜я┐╜ - я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ржия┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ ; !TODO ; AND A ; SBC HL,DE ; CCF @@ -596,14 +596,14 @@ GET_BPB: LD HL,#0000 ; HL:DE = DataSec ; LD A,(FatBuffer.SectorsPerCluster) - ; HL:DE / A => DE:BC, H=0, L - остаток + ; HL:DE / A => DE:BC, H=0, L - я┐╜я┐╜я┐╜ток ;CALL DIV_by_Shifts LD C,A DEC A JR Z,.DIV_exit ; AND E - LD B,A ; остаток + LD B,A ; я┐╜я┐╜я┐╜ток LD A,C RRCA ; @@ -620,7 +620,7 @@ GET_BPB: LD HL,#0000 LD H,0 LD L,A ; - ; выясняем разрядность FAT + ; я┐╜я┐╜я┐╜я┐╜яем разя┐╜ядня┐╜я┐╜я┐╜я┐╜ FAT LD A,D OR E JR NZ,.its_FAT32 @@ -637,8 +637,8 @@ GET_BPB: LD HL,#0000 ; .its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber) CP #80 - JR C,.mirrored_FATs ;если все копии FAT используются - ; используется только одна копия FAT + JR C,.mirrored_FATs ;я┐╜сли я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ FAT я┐╜споя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ + ; я┐╜споя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ только я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ FAT LD HL,(FatBuffer.FAT1_SEC_H) LD DE,(FatBuffer.SectorsPerFAT_H) LD D,0 @@ -717,12 +717,12 @@ CLUSTER_TO_SECTOR: ; -; поиск system.dos +; я┐╜я┐╜я┐╜я┐╜ system.dos GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD IX,(FatBuffer.RootDirFirstSector_L) LD BC,(PARTITION_START_L) LD DE,(PARTITION_START_H) - ; [x] 28/04/2024. Bug with incorrect reading root dir. Found Roman "Romychs" Boykov. + ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. ADD IX,BC ADC HL,DE ; @@ -731,9 +731,9 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD A,(FatBuffer.DirSizeInSectors) JR NZ,.NEXTSEC ; - LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32 + LD A,(FatBuffer.SectorsPerCluster);!FIXIT я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ только я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜таля┐╜я┐╜я┐╜ я┐╜я┐╜ FAT32 .NEXTSEC: PUSH AF - ; [x] 28/04/2024. Bug with incorrect reading root dir. Found Roman "Romychs" Boykov. + ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. ;ADD IX,BC ;ADC HL,DE ; @@ -752,7 +752,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD A,B ; next sector LD BC,1 - ; [x] 28/04/2024. Bug with incorrect reading root dir. Found Roman "Romychs" Boykov. + ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. ADD IX,BC ADC HL,BC DEC HL @@ -799,13 +799,13 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD BC,FAT_DIRECTORY_RECORD LDIR ; ZF = 1, CF = 0, A != 0 - AND A ; на выходе ZF = CF = 0 + AND A ; я┐╜я┐╜ я┐╜я┐╜ходя┐╜ ZF = CF = 0 RET ; HL - CLUSTER ; DE - ADDRESS -; !TODO сделать тут определение размера SYSTEM.DOS -; [ ] и возможность загрузить больше 1 страницы +; !TODO сдея┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜редя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜ SYSTEM.DOS +; [ ] я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜узия┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ 1 я┐╜я┐╜раня┐╜я┐╜я┐╜ LOAD_CORE: LD (READMEM),DE .loop: PUSH HL EXX @@ -859,7 +859,7 @@ LOAD_CORE: LD (READMEM),DE POP HL CCF RET NC - ; [ ] загрузка system.dos больше #4000 байтов + ; [ ] я┐╜я┐╜я┐╜я┐╜узкя┐╜ system.dos я┐╜я┐╜я┐╜я┐╜я┐╜ #4000 я┐╜я┐╜я┐╜тов .BIG_CORE+1: LD A,0 DEC A @@ -878,14 +878,14 @@ LOAD_CORE: LD (READMEM),DE ; -; HL:DE / A => DE:BC, H=0, L - остаток +; HL:DE / A => DE:BC, H=0, L - я┐╜я┐╜я┐╜ток ; DIV_by_Shifts: ; LD C,A ; DEC A ; JR Z,.DIV_exit ; ; ; AND E -; LD B,A ; остаток +; LD B,A ; я┐╜я┐╜я┐╜ток ; LD A,C ; RRCA ; ; @@ -919,10 +919,10 @@ ZERO_SECTOR_OF_BPB: ; B = 0 GET_SECTOR_OF_FAT: LD A,(FatBuffer.FAT_TYPE) - LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную + LD B,FAT_CACHE.Degree_32 ;!FIXIT сдея┐╜я┐╜я┐╜я┐╜ я┐╜рез я┐╜я┐╜ремя┐╜я┐╜я┐╜я┐╜я┐╜ XOR FAT_TYPE.x32 JR Z,.next - LD B,FAT_CACHE.Degree ;!FIXIT сделать через переменную + LD B,FAT_CACHE.Degree ;!FIXIT сдея┐╜я┐╜я┐╜я┐╜ я┐╜рез я┐╜я┐╜ремя┐╜я┐╜я┐╜я┐╜я┐╜ XOR A .next: LD C,A ; @@ -935,18 +935,18 @@ GET_SECTOR_OF_FAT: ; -;вход: HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE -; CF - чётный/нечётный адрес кластера +;я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ +;я┐╜я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜ я┐╜ужня┐╜я┐╜ я┐╜чейя┐╜я┐╜ я┐╜ я┐╜я┐╜раня┐╜я┐╜ FATPAGE +; CF - я┐╜я┐╜я┐╜я┐╜/я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ GET_FAT12_CELL: LD D,H LD E,L SRL H - RR L ; сдвиг вправо через CF - PUSH AF ; сохр. флаг + RR L ; сдвя┐╜я┐╜ я┐╜я┐╜равя┐╜ я┐╜рез CF + PUSH AF ; я┐╜я┐╜я┐╜. флая┐╜ ADD HL,DE ; CLUSTER * 1.5 ; IF FAT_CACHE.Size_12 < #1800 - ;!FIXIT оптимизировать + ;!FIXIT я┐╜я┐╜тимя┐╜я┐╜я┐╜ровя┐╜я┐╜я┐╜ LD A,H LD B,H ; @@ -965,12 +965,12 @@ GET_FAT12_CELL: LD D,H AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; [ ] я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ход я┐╜ я┐╜я┐╜цедя┐╜я┐╜я┐╜ READ_FAT_TABLE. я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ рег. A я┐╜я┐╜редя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; - CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а + CALL NZ,READ_FAT_TABLE ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ я┐╜я┐╜я┐╜ 16 секя┐╜ров FAT-я┐╜ ENDIF ; LD DE,FATPAGE.cache @@ -978,8 +978,8 @@ GET_FAT12_CELL: LD D,H POP AF RET ; -;вход: HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE +;я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ +;я┐╜я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜ я┐╜ужня┐╜я┐╜ я┐╜чейя┐╜я┐╜ я┐╜ я┐╜я┐╜раня┐╜я┐╜ FATPAGE GET_FAT16_CELL: LD A,H LD B,H AND FAT_CACHE.Size_Mask_16 @@ -998,14 +998,14 @@ GET_FAT16_CELL: LD A,H LD E,A ; CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT + LD DE,FATPAGE.cache ; я┐╜я┐╜чаля┐╜ я┐╜я┐╜я┐╜ FAT-я┐╜ + ADD HL,DE ; я┐╜я┐╜ я┐╜чейя┐╜я┐╜ FAT RET ; ; ;RE_FAT: ;RX01 -; Прочитать в кеш ХХ секторов FAT-а +; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜ секя┐╜ров FAT-я┐╜ ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL ; @@ -1014,7 +1014,7 @@ READ_FAT_TABLE: PUSH HL ; CALL GET_SECTOR_OF_FAT ; - ; BC:HL - номер лог.сектора + ; BC:HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜.секя┐╜я┐╜ LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE ; @@ -1052,9 +1052,9 @@ READ_FAT_TABLE: PUSH HL POP HL RET -;вход: HL':HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE -GET_FAT32_CELL: ; двигаем влево HL':H +;я┐╜ход: HL':HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ +;я┐╜я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜ я┐╜ужня┐╜я┐╜ я┐╜чейя┐╜я┐╜ я┐╜ я┐╜я┐╜раня┐╜я┐╜ FATPAGE +GET_FAT32_CELL: ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ HL':H LD A,H EXX LD C,A @@ -1063,13 +1063,13 @@ GET_FAT32_CELL: ; LD H,A LD A,C ; - LD B,FAT_CACHE.Degree ; 4 сдвига + LD B,FAT_CACHE.Degree ; 4 сдвя┐╜я┐╜я┐╜ .loop_block: RLCA ; << H RL L ; << L' RL H ; << H' DJNZ .loop_block EXX - ; В итоге тут в HL' номер блока FAT + ; я┐╜ я┐╜тогя┐╜ я┐╜я┐╜я┐╜ я┐╜ HL' я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ FAT ; ; HL - FAT32 OFFSET (FROM CASH) LD A,H @@ -1086,20 +1086,20 @@ GET_FAT32_CELL: ; 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 + LD DE,FATPAGE.cache ; я┐╜я┐╜чаля┐╜ я┐╜я┐╜я┐╜ FAT-я┐╜ + ADD HL,DE ; я┐╜я┐╜ я┐╜чейя┐╜я┐╜ FAT RET ; ;------------------------------------------------------------------------------------------------ -; Прочитать из кеша FAT-а номер след. кластера -; вход: hl - номер кластера (младшее слово) -; hl' - номер кластера (старшее слово. только для FAT32) -; выход: hl - номер кластера (младшее слово) -; hl' - номер кластера (старшее слово) -; de - номер след. кластера (младшее слово) -; de' - номер след. кластера (старшее слово) -; если DE':DE = 0, то кластер HL':HL свободен -; CF - конец цепочки +; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜ я┐╜я┐╜я┐╜ FAT-я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ +; я┐╜ход: hl - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) +; hl' - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜шее слоя┐╜я┐╜. только я┐╜я┐╜я┐╜ FAT32) +; я┐╜я┐╜ход: hl - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) +; hl' - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) +; de - я┐╜я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) +; de' - я┐╜я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) +; я┐╜сли DE':DE = 0, я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ HL':HL своя┐╜я┐╜я┐╜я┐╜я┐╜ +; CF - я┐╜я┐╜я┐╜я┐╜я┐╜ цепя┐╜чки ;------------------------------------------------------------------------------------------------ READ_FROM_FAT: PUSH HL ; @@ -1112,18 +1112,18 @@ READ_FROM_FAT: PUSH HL CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 - ; fat16, просто читать след. номер + ; fat16, я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜ .FAT16: CALL GET_FAT16_CELL - LD E,(HL) ; прочитать номер кластера + LD E,(HL) ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ INC HL LD D,(HL) ; LD HL,SERVICE_SECTORS.FAT16 .exit: POP AF OUT (SLOT3),A - ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR + ; я┐╜я┐╜я┐╜я┐╜яем CF я┐╜ я┐╜я┐╜таня┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜шибя┐╜я┐╜ = DssErr.sys.NO_ERROR XOR A - ; проверка на служ. кластеры + ; я┐╜ровя┐╜рка я┐╜я┐╜ я┐╜я┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ SBC HL,DE POP HL EXX @@ -1143,7 +1143,7 @@ READ_FROM_FAT: PUSH HL JR NC,.Correct_2 .Correct_1: LD A,E AND #F0 - DUP 4 ; вправо на 4 битa + DUP 4 ; я┐╜я┐╜равя┐╜ я┐╜я┐╜ 4 я┐╜я┐╜я┐╜a RR D RRA EDUP @@ -1160,12 +1160,12 @@ READ_FROM_FAT: 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' @@ -1176,12 +1176,12 @@ READ_FROM_FAT: PUSH HL EX AF,AF' LD E,A EXX - ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR + ; я┐╜я┐╜я┐╜я┐╜яем 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 From 5448a82733313cbda9fd60ebbd301b253fdae193 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 28 Jun 2024 00:41:38 +1000 Subject: [PATCH 161/219] ... --- BOOT/DSSBOOT.ASM | 164 +++++++++++++++++++++++------------------------ 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 352abf2..00892ce 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -14,11 +14,11 @@ MODULE DSS_Boot_Loader -; BIOS 3.06 я┐╜я┐╜я┐╜я┐╜ужая┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ секя┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜чикя┐╜ я┐╜ я┐╜я┐╜редя┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜равя┐╜я┐╜я┐╜я┐╜я┐╜. +; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление. - ; 0 - я┐╜ригя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜риая┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ска DSS, 1 - я┐╜я┐╜риая┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ + ; 0 - оригинальный вариант запуска DSS, 1 - вариант Саймана DEFINE ORIGINAL_DSS 0 - ; 1 - я┐╜удея┐╜ я┐╜я┐╜узия┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ я┐╜сноя┐╜я┐╜я┐╜я┐╜. 0 - только я┐╜сноя┐╜я┐╜я┐╜я┐╜. + ; 1 - будет грузить версию Саймана и основную. 0 - только основную. DEFINE UNIVERSAL_BOOT 1 ;------------------------------------------------------------------------------ @@ -43,7 +43,7 @@ DRIVE: _mSYSID ; LD SP,#C000 ; ; LD (DRIVE),A - ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого XOR A LD (DRIVE+1),A ; @@ -59,7 +59,7 @@ DRIVE: _mSYSID BIT 7,A JR Z,GOOD_DRIVE EX DE,HL - LD DE,2*256 + 21 ;!HARDCODE я┐╜сли я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ 2.21, я┐╜ я┐╜шибя┐╜я┐╜ + LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка SBC HL,DE LD HL,MESSAGES.INCORR RET C ; goto FAIL @@ -67,7 +67,7 @@ DRIVE: _mSYSID GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 - LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜узкя┐╜ секя┐╜ров я┐╜я┐╜я┐╜я┐╜я┐╜чикя┐╜ + LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика LD A,(DRIVE) RST ToBIOS_18 JP NC,CONTINUE @@ -164,7 +164,7 @@ CONTINUE: LD HL,0 ; LD HL,MESSAGES.NO_SYS RET C ; goto FAIL - ; [ ] я┐╜я┐╜я┐╜я┐╜узкя┐╜ system.dos я┐╜я┐╜я┐╜я┐╜я┐╜ #4000 я┐╜я┐╜я┐╜тов + ; [ ] загрузка system.dos больше #4000 байтов LD HL,(FSIZE1) LD A,H OR L @@ -177,14 +177,14 @@ CONTINUE: LD HL,0 .set_no_size: LD (LOAD_CORE.BIG_CORE),A OR A PUSH AF - ; я┐╜я┐╜я┐╜я┐╜узкя┐╜ + ; загрузка EXX LD HL,(FCLUSTER_H) EXX LD HL,(FCLUSTR_L) LD DE,#C000 CALL LOAD_CORE - ; [ ] я┐╜я┐╜я┐╜я┐╜узкя┐╜ system.dos я┐╜я┐╜я┐╜я┐╜я┐╜ #4000 я┐╜я┐╜я┐╜тов + ; [ ] загрузка system.dos больше #4000 байтов EX AF,AF' POP AF JR Z,.no_big_core @@ -195,10 +195,10 @@ CONTINUE: LD HL,0 LD (LOAD_CORE.BANKDOS),A LD A,SUBLOAD_SIZE LD (LOAD_CORE.max_sectors),A - LD (LOAD_CORE.BIG_CORE),A ; тепя┐╜я┐╜я┐╜ я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜чик я┐╜я┐╜тавя┐╜я┐╜я┐╜я┐╜ секя┐╜ров + LD (LOAD_CORE.BIG_CORE),A ; теперь это счётчик оставшихся секторов ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - CP #20 + 1 ; !HARDCODE я┐╜я┐╜я┐╜-я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ужая┐╜я┐╜я┐╜я┐╜ секя┐╜ров + CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов JP NC,INC_SECTOR_NUM ;CALL R_F_FAT ; next cluster in chain CALL READ_FROM_FAT ; next cluster in chain @@ -223,11 +223,11 @@ RUN_CORE: DI ; ;DOS LOADED ;IF UNIVERSAL_BOOT - ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ - LD A,(DRIVE+1) ; я┐╜я┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜ + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,(DRIVE+1) ; номер раздела LD L,A ; - LD A,(DRIVE) ; я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ройя┐╜тва + LD A,(DRIVE) ; номер устройства LD C,Dss.Version RST ToDSS JP C,FAIL.NULL @@ -260,7 +260,7 @@ RUN_CORE: DI ; LD A,(DRIVE) ; LD BC,Dss.BootDSK.Set ; RST ToDSS - ; LD Bя┐╜,Dss.BootDSK.Get + ; LD BС,Dss.BootDSK.Get ; ENDIF ;ENDIF ; @@ -286,7 +286,7 @@ RUN_CORE: DI ; INC_SECTOR_NUM: PUSH DE CALL CLUSTER_TO_SECTOR - LD DE,#20 ;!HARDCODE я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜тво я┐╜я┐╜я┐╜таня┐╜я┐╜я┐╜ секя┐╜ров + LD DE,#20 ;!HARDCODE количество прочитанных секторов ADD IX,DE JR NC,.no_inc INC HL @@ -294,8 +294,8 @@ INC_SECTOR_NUM: PUSH DE POP DE LD BC,RUN_CORE PUSH BC - PUSH HL ; я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ - PUSH HL ; я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ + PUSH HL ; для баланса + PUSH HL ; для баланса JP LOAD_CORE.subload ; @@ -314,7 +314,7 @@ PART_TB: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;LD HL,YEPDOS ; .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) - ; я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ржкя┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜скоя┐╜ькия┐╜ типя┐╜я┐╜ я┐╜я┐╜, я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ 1fs я┐╜я┐╜ 2fs + ; ЕСЛИ добавится поддержка ещё нескольких типов ФС, то поменять 1fs на 2fs ; 1 CP PartitionSysTypes.FAT16_LBA JR Z,YEPDOS @@ -362,13 +362,13 @@ PART_TB: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ; ; -YEPDOS: ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ +YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,#80 CP (IX + _sMBR_PARTITION_RECORD.isActive) JR NZ,PART_TB.next - LD A,4 ;!HARDCODE я┐╜я┐╜я┐╜чик я┐╜я┐╜я┐╜я┐╜сей я┐╜я┐╜я┐╜я┐╜ций я┐╜ MBR + LD A,4 ;!HARDCODE счетчик записей партиций в MBR SUB B - PUSH AF ; я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜узочноя┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜ + PUSH AF ; номер загрузочного раздела ; LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) @@ -382,10 +382,10 @@ YEPDOS: ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜ LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ RST ToBIOS_18 - ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого POP AF POP BC - LD L,A ; я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜узочноя┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜ + LD L,A ; номер загрузочного раздела LD A,C ; RET @@ -409,7 +409,7 @@ GET_BPB: LD HL,#0000 LD A,(DRIVE) RST ToBIOS_18 RET C - ; я┐╜я┐╜рекя┐╜я┐╜ывая┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜чикя┐╜ я┐╜я┐╜ 0 секя┐╜я┐╜ + ; перекидывание части загрузчика из 0 сектора LD HL,BOOT_BUFFER + (_sBOOT_SECTOR.PARTITION_TABLE - ZERO_SECTOR_OF_BPB.Size) LD DE,ZERO_SECTOR_OF_BPB LD BC,ZERO_SECTOR_OF_BPB.Size @@ -423,7 +423,7 @@ GET_BPB: LD HL,#0000 JR NZ,.NX1 CALL PART_TB ;HDD RET C - ;[ ] 17.12.2023 я┐╜я┐╜я┐╜я┐╜узкя┐╜ я┐╜ я┐╜я┐╜тивя┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜я┐╜, я┐╜ я┐╜я┐╜ я┐╜ я┐╜я┐╜рвоя┐╜я┐╜ + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD (DRIVE+1),HL ; .NX1: CP #00 @@ -534,7 +534,7 @@ GET_BPB: LD HL,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - ; LD DE,#8001 ; я┐╜ровя┐╜рка я┐╜я┐╜ разя┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ 32 я┐╜я┐╜ - я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ржия┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ ; !TODO + ; LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO ; AND A ; SBC HL,DE ; CCF @@ -596,14 +596,14 @@ GET_BPB: LD HL,#0000 ; HL:DE = DataSec ; LD A,(FatBuffer.SectorsPerCluster) - ; HL:DE / A => DE:BC, H=0, L - я┐╜я┐╜я┐╜ток + ; HL:DE / A => DE:BC, H=0, L - остаток ;CALL DIV_by_Shifts LD C,A DEC A JR Z,.DIV_exit ; AND E - LD B,A ; я┐╜я┐╜я┐╜ток + LD B,A ; остаток LD A,C RRCA ; @@ -620,7 +620,7 @@ GET_BPB: LD HL,#0000 LD H,0 LD L,A ; - ; я┐╜я┐╜я┐╜я┐╜яем разя┐╜ядня┐╜я┐╜я┐╜я┐╜ FAT + ; выясняем разрядность FAT LD A,D OR E JR NZ,.its_FAT32 @@ -637,8 +637,8 @@ GET_BPB: LD HL,#0000 ; .its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber) CP #80 - JR C,.mirrored_FATs ;я┐╜сли я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ FAT я┐╜споя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ - ; я┐╜споя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ только я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ FAT + JR C,.mirrored_FATs ;если все копии FAT используются + ; используется только одна копия FAT LD HL,(FatBuffer.FAT1_SEC_H) LD DE,(FatBuffer.SectorsPerFAT_H) LD D,0 @@ -717,7 +717,7 @@ CLUSTER_TO_SECTOR: ; -; я┐╜я┐╜я┐╜я┐╜ system.dos +; поиск system.dos GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD IX,(FatBuffer.RootDirFirstSector_L) LD BC,(PARTITION_START_L) @@ -731,7 +731,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD A,(FatBuffer.DirSizeInSectors) JR NZ,.NEXTSEC ; - LD A,(FatBuffer.SectorsPerCluster);!FIXIT я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ только я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜таля┐╜я┐╜я┐╜ я┐╜я┐╜ FAT32 + LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32 .NEXTSEC: PUSH AF ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. ;ADD IX,BC @@ -799,13 +799,13 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD BC,FAT_DIRECTORY_RECORD LDIR ; ZF = 1, CF = 0, A != 0 - AND A ; я┐╜я┐╜ я┐╜я┐╜ходя┐╜ ZF = CF = 0 + AND A ; на выходе ZF = CF = 0 RET ; HL - CLUSTER ; DE - ADDRESS -; !TODO сдея┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜редя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ разя┐╜я┐╜я┐╜ SYSTEM.DOS -; [ ] я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜узия┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ 1 я┐╜я┐╜раня┐╜я┐╜я┐╜ +; !TODO сделать тут определение размера SYSTEM.DOS +; [ ] и возможность загрузить больше 1 страницы LOAD_CORE: LD (READMEM),DE .loop: PUSH HL EXX @@ -859,7 +859,7 @@ LOAD_CORE: LD (READMEM),DE POP HL CCF RET NC - ; [ ] я┐╜я┐╜я┐╜я┐╜узкя┐╜ system.dos я┐╜я┐╜я┐╜я┐╜я┐╜ #4000 я┐╜я┐╜я┐╜тов + ; [ ] загрузка system.dos больше #4000 байтов .BIG_CORE+1: LD A,0 DEC A @@ -878,14 +878,14 @@ LOAD_CORE: LD (READMEM),DE ; -; HL:DE / A => DE:BC, H=0, L - я┐╜я┐╜я┐╜ток +; HL:DE / A => DE:BC, H=0, L - остаток ; DIV_by_Shifts: ; LD C,A ; DEC A ; JR Z,.DIV_exit ; ; ; AND E -; LD B,A ; я┐╜я┐╜я┐╜ток +; LD B,A ; остаток ; LD A,C ; RRCA ; ; @@ -919,10 +919,10 @@ ZERO_SECTOR_OF_BPB: ; B = 0 GET_SECTOR_OF_FAT: LD A,(FatBuffer.FAT_TYPE) - LD B,FAT_CACHE.Degree_32 ;!FIXIT сдея┐╜я┐╜я┐╜я┐╜ я┐╜рез я┐╜я┐╜ремя┐╜я┐╜я┐╜я┐╜я┐╜ + LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную XOR FAT_TYPE.x32 JR Z,.next - LD B,FAT_CACHE.Degree ;!FIXIT сдея┐╜я┐╜я┐╜я┐╜ я┐╜рез я┐╜я┐╜ремя┐╜я┐╜я┐╜я┐╜я┐╜ + LD B,FAT_CACHE.Degree ;!FIXIT сделать через переменную XOR A .next: LD C,A ; @@ -935,18 +935,18 @@ GET_SECTOR_OF_FAT: ; -;я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ -;я┐╜я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜ я┐╜ужня┐╜я┐╜ я┐╜чейя┐╜я┐╜ я┐╜ я┐╜я┐╜раня┐╜я┐╜ FATPAGE -; CF - я┐╜я┐╜я┐╜я┐╜/я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +; CF - чётный/нечётный адрес кластера GET_FAT12_CELL: LD D,H LD E,L SRL H - RR L ; сдвя┐╜я┐╜ я┐╜я┐╜равя┐╜ я┐╜рез CF - PUSH AF ; я┐╜я┐╜я┐╜. флая┐╜ + RR L ; сдвиг вправо через CF + PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; IF FAT_CACHE.Size_12 < #1800 - ;!FIXIT я┐╜я┐╜тимя┐╜я┐╜я┐╜ровя┐╜я┐╜я┐╜ + ;!FIXIT оптимизировать LD A,H LD B,H ; @@ -965,12 +965,12 @@ GET_FAT12_CELL: LD D,H AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - ; [ ] я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ход я┐╜ я┐╜я┐╜цедя┐╜я┐╜я┐╜ READ_FAT_TABLE. я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ рег. A я┐╜я┐╜редя┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ + ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; - CALL NZ,READ_FAT_TABLE ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ я┐╜я┐╜я┐╜ 16 секя┐╜ров FAT-я┐╜ + CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а ENDIF ; LD DE,FATPAGE.cache @@ -978,8 +978,8 @@ GET_FAT12_CELL: LD D,H POP AF RET ; -;я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ -;я┐╜я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜ я┐╜ужня┐╜я┐╜ я┐╜чейя┐╜я┐╜ я┐╜ я┐╜я┐╜раня┐╜я┐╜ FATPAGE +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT16_CELL: LD A,H LD B,H AND FAT_CACHE.Size_Mask_16 @@ -998,14 +998,14 @@ GET_FAT16_CELL: LD A,H LD E,A ; CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache ; я┐╜я┐╜чаля┐╜ я┐╜я┐╜я┐╜ FAT-я┐╜ - ADD HL,DE ; я┐╜я┐╜ я┐╜чейя┐╜я┐╜ FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT RET ; ; ;RE_FAT: ;RX01 -; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜ я┐╜я┐╜я┐╜ я┐╜я┐╜ секя┐╜ров FAT-я┐╜ +; Прочитать в кеш ХХ секторов FAT-а ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL ; @@ -1014,7 +1014,7 @@ READ_FAT_TABLE: PUSH HL ; CALL GET_SECTOR_OF_FAT ; - ; BC:HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜.секя┐╜я┐╜ + ; BC:HL - номер лог.сектора LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE ; @@ -1052,9 +1052,9 @@ READ_FAT_TABLE: PUSH HL POP HL RET -;я┐╜ход: HL':HL - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ -;я┐╜я┐╜ход: HL - я┐╜я┐╜я┐╜я┐╜ я┐╜ужня┐╜я┐╜ я┐╜чейя┐╜я┐╜ я┐╜ я┐╜я┐╜раня┐╜я┐╜ FATPAGE -GET_FAT32_CELL: ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ HL':H +;вход: HL':HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +GET_FAT32_CELL: ; двигаем влево HL':H LD A,H EXX LD C,A @@ -1063,13 +1063,13 @@ GET_FAT32_CELL: ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ HL':H LD H,A LD A,C ; - LD B,FAT_CACHE.Degree ; 4 сдвя┐╜я┐╜я┐╜ + LD B,FAT_CACHE.Degree ; 4 сдвига .loop_block: RLCA ; << H RL L ; << L' RL H ; << H' DJNZ .loop_block EXX - ; я┐╜ я┐╜тогя┐╜ я┐╜я┐╜я┐╜ я┐╜ HL' я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ FAT + ; В итоге тут в HL' номер блока FAT ; ; HL - FAT32 OFFSET (FROM CASH) LD A,H @@ -1086,20 +1086,20 @@ GET_FAT32_CELL: ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ HL':H 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 + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT RET ; ;------------------------------------------------------------------------------------------------ -; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜ я┐╜я┐╜я┐╜ FAT-я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ -; я┐╜ход: hl - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) -; hl' - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜шее слоя┐╜я┐╜. только я┐╜я┐╜я┐╜ FAT32) -; я┐╜я┐╜ход: hl - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) -; hl' - я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) -; de - я┐╜я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) -; de' - я┐╜я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ (я┐╜я┐╜я┐╜шее слоя┐╜я┐╜) -; я┐╜сли DE':DE = 0, я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ HL':HL своя┐╜я┐╜я┐╜я┐╜я┐╜ -; CF - я┐╜я┐╜я┐╜я┐╜я┐╜ цепя┐╜чки +; Прочитать из кеша FAT-а номер след. кластера +; вход: hl - номер кластера (младшее слово) +; hl' - номер кластера (старшее слово. только для FAT32) +; выход: hl - номер кластера (младшее слово) +; hl' - номер кластера (старшее слово) +; de - номер след. кластера (младшее слово) +; de' - номер след. кластера (старшее слово) +; если DE':DE = 0, то кластер HL':HL свободен +; CF - конец цепочки ;------------------------------------------------------------------------------------------------ READ_FROM_FAT: PUSH HL ; @@ -1112,18 +1112,18 @@ READ_FROM_FAT: PUSH HL CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 - ; fat16, я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜ слея┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜ + ; fat16, просто читать след. номер .FAT16: CALL GET_FAT16_CELL - LD E,(HL) ; я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ + LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) ; LD HL,SERVICE_SECTORS.FAT16 .exit: POP AF OUT (SLOT3),A - ; я┐╜я┐╜я┐╜я┐╜яем CF я┐╜ я┐╜я┐╜таня┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜шибя┐╜я┐╜ = DssErr.sys.NO_ERROR + ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR XOR A - ; я┐╜ровя┐╜рка я┐╜я┐╜ я┐╜я┐╜. я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ + ; проверка на служ. кластеры SBC HL,DE POP HL EXX @@ -1143,7 +1143,7 @@ READ_FROM_FAT: PUSH HL JR NC,.Correct_2 .Correct_1: LD A,E AND #F0 - DUP 4 ; я┐╜я┐╜равя┐╜ я┐╜я┐╜ 4 я┐╜я┐╜я┐╜a + DUP 4 ; вправо на 4 битa RR D RRA EDUP @@ -1160,12 +1160,12 @@ READ_FROM_FAT: 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' @@ -1176,12 +1176,12 @@ READ_FROM_FAT: PUSH HL EX AF,AF' LD E,A EXX - ; я┐╜я┐╜я┐╜я┐╜яем CF я┐╜ я┐╜я┐╜таня┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜я┐╜ я┐╜я┐╜я┐╜ я┐╜шибя┐╜я┐╜ = DssErr.sys.NO_ERROR + ; обнуляем 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 From 36353e7d089b5713a5e133b0adaf74b090ed3f6e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 28 Jun 2024 00:43:36 +1000 Subject: [PATCH 162/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 1cb8eb1..d294e37 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 1cb8eb13fb8e8b20bba324a5ab9f4e18d6bf8b3c +Subproject commit d294e375826854d80b838ea40ca4afcf3730a141 From 61de8fd9a0ecb5537417f7863c7d0ef49147227c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 29 Jun 2024 02:44:01 +1000 Subject: [PATCH 163/219] ... --- BOOT/boot.asm | 2 +- DSS/API/bootDsk.asm | 4 +- DSS/FS/FAT/FAT.asm | 4 +- DSS/build.txt | 2 +- DSS/drivers/media/ReScanDRV.ASM | 2 +- DSS/drivers/media/fdd-drv.asm | 468 +++++++++++++++++-------------- DSS/drivers/media/shared-drv.asm | 6 +- SHELL/Commands/INFO.ASM | 20 +- SHELL/build.txt | 2 +- 9 files changed, 281 insertions(+), 229 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 43f21e3..77fc142 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -482,7 +482,7 @@ write_to_BPB: PUSH BC ; write_no_BPB: ld a,(disk) ; номер заданного диска - ld de,#55AA + ld de,Dss.DRV.GenIOCTL.Enter ld bc,Dss.DRV.GenIOCTL.GetParams rst ToDSS.DRV ex af,af' diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index b53de93..0361015 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -31,8 +31,8 @@ BOOTDSK: ; .loop: PUSH BC LD A,C - LD DE,#55AA - LD BC,256*0 + Dss.DRV.GenIOCTL + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams RST ToDSS.DRV ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD A,C ; номер партиции в MBR диска diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 18ee8d3..57399db 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -519,7 +519,9 @@ LOADDIR: ;!TODO optimize LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - LD HL,#4000 ;!HARDCODE размер директории + + ;LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог + LD HL,#4000 ; размер директории LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ; .read_dir: LD HL,DIRPAGE.buffer ; куда diff --git a/DSS/build.txt b/DSS/build.txt index 1345866..b92b677 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -994 \ No newline at end of file +995 \ No newline at end of file diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM index 8a81258..b2eea94 100644 --- a/DSS/drivers/media/ReScanDRV.ASM +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -44,7 +44,7 @@ ReScanDRV: ; [ищем что за драйв] EX DE,HL ; FDD? - LD HL,FDDRIVE + LD HL,FDD_DRV.API_TABLE AND A SBC HL,DE JR Z,.nextN ; пропуск FDD драйвов diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index 50104cf..d07437e 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -122,104 +122,130 @@ ; 12 (0Ch) - BUSY (DEVICE OPENED) ; 13 (0Dh) - RESERVED -R_COM EQU #0F ;Command/Status -R_TRK EQU #3F ;Track -R_SEC EQU #5F ;Sector -R_DAT EQU #7F ;Data -R_DSK EQU #FF ;Drive Control +; R_COM EQU #0F ;Command/Status +; R_TRK EQU #3F ;Track +; R_SEC EQU #5F ;Sector +; R_DAT EQU #7F ;Data +; R_DSK EQU #FF ;Drive Control +; COM_B EQU #1B + + + +//////////////////////////////////////////////////////////////////////// + MODULE FDD_DRV +//////////////////////////////////////////////////////////////////////// -COM_B EQU #1B ;------------------------------------------------- ; Обработчик FDD (rst 18h) ;------------------------------------------------- -FDDRIVE: - INC C - DEC C - JP Z,.INIT ;#00 - DEC C - JP Z,.RESE ;#01 - DEC C - JP Z,.STAT ;#02 - DEC C - JP Z,.CHEK ;#03 - DEC C - JP Z,.GBPB ;#04 - DEC C - JP Z,.READD ;#05 - DEC C - JP Z,.WRITED ;#06 - DEC C - JP Z,.REMOV_F ;#07 - DEC C - JP Z,.IOCTL_F ;#08 - DEC C - JP Z,.RESRV_F ;#09 -.RESRV_F: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -;Commands for restart #18 -.INIT: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? - AND A - RET - -.RESE: LD C,BIOS.DRV_RESET - RST ToBIOS - RET - -.STAT: XOR A - RET - -.CHEK: ;!FIXIT проверять ВГ93 когда это станет возможным - IF NON_REMOVABLE_FDD - XOR A - ELSE - LD A,#FF - OR A - ENDIF +API_TABLE: INC C + DEC C + JP Z,Init ;#00 Init + DEC C + JP Z,Open ;#01 Open + DEC C + JP Z,Close ;#02 Close + DEC C + JP Z,MediaCheck ;#03 MediaCheck + DEC C + JP Z,GetBPB ;#04 GetBPB + DEC C + JP Z,Read ;#05 Read + DEC C + JP Z,Write ;#06 Write + DEC C + JP Z,Removable ;#07 Removable + DEC C + JP Z,GenIOCTL ;#08 GenIOCTL + DEC C + JP Z,Reserved ;#09 + ; +Reserved: LD A,DSS_Error.drv.INVALID_COMMAND + SCF RET + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Commands for restart #18 ; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; +Init: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? + AND A + RET +; ; ; + +; +Open: LD C,BIOS.DRV_RESET + RST ToBIOS + RET +; ; ; + +; +Close: XOR A + RET +; ; ; + + +;!FIXIT проверять ВГ93 когда это станет возможным +MediaCheck: IF NON_REMOVABLE_FDD + XOR A + ELSE + LD A,#FF + OR A + ENDIF + RET +; ; ; + + ;DE - ADDRESS -.GBPB: LD IX,0 - LD HL,0 - PUSH DE - PUSH AF - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP DE - POP HL - RET C - LD BC,#0018 - ADD HL,BC - LD E,(HL) - PUSH DE - LD A,D - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - LD A,H - POP HL - PUSH HL - LD H,A - POP AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS - XOR A - RET -;READTR: - XOR A - RET +GetBPB: LD IX,0 + LD HL,0 + PUSH DE + PUSH AF + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP DE + POP HL + RET C + LD BC,#0018 + ADD HL,BC + LD E,(HL) + PUSH DE + LD A,D + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + LD A,H + POP HL + PUSH HL + LD H,A + POP AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS + XOR A + RET +; ; ; -.READD: LD C,BIOS.DRV_READ - RST ToBIOS - RET -.WRITED: - LD C,BIOS.DRV_WRITE - RST ToBIOS - RET +; !TODO read track? +;READTR: XOR A +; RET +; ; ; + +; +Read: LD C,BIOS.DRV_READ + RST ToBIOS + RET +; ; ; + +; +Write: LD C,BIOS.DRV_WRITE + RST ToBIOS + RET +; ; ; + ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK @@ -227,105 +253,120 @@ FDDRIVE: ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK -.IOCTL_F: - BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.FGETPRM -; DEC B -; JP Z,FRDTRAC -; DEC B -; JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -.O_CTL_F: - RES 7,B - INC B - DEC B - JP Z,.FSETPRM -; DEC B -; JP Z,FWRTRAC -; DEC B -; JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET +GenIOCTL: BIT 7,B + JR NZ,.O_CTL_F + INC B + DEC B + JP Z,.GetParams + ;!TODO + ;DEC B + ;JP Z,.ReadTrack + ;DEC B + ;JP Z,.TestTRK + ; + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + ; +.O_CTL_F: RES 7,B + INC B + DEC B + JP Z,.SetParams + ;!TODO + ;DEC B + ;JP Z,.WriteTRK + ;DEC B + ;JP Z,.FormatTRK + ; + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET +; ; ; -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.FGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - LD A,L - AND #0F - PUSH AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - JR C,.NONEF - PUSH HL - PUSH DE - LD A,H - LD H,0 -.MULL1 ADD HL,HL - DEC A - JR NZ,.MULL1 -; HL - SECTOR PER CYLLINDER - LD B,H - LD C,L - LD HL,0 - EX AF,AF' - XOR A -.MULL2 EX AF,AF' - ADD HL,BC - ADC A,0 - DEC DE - EX AF,AF' - LD A,D - OR E - JR NZ,.MULL2 - EX AF,AF' - LD E,A - EX DE,HL - EXX - POP DE - POP HL - POP AF - EX AF,AF' - LD A,B - LD C,L - LD B,0 - LD L,H - LD H,B - EX DE,HL - EXX - LD C,0 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - AND A - RET - -.NONEF POP AF - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET +; Вход: - A - Drive number +; Выход: +; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - EXTENDED INFORMATION +; D0...D3 - "0" RESERVED (MAY BE OTHER) +; D4 - DEVICE MASTER/SLAVE +; D5 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D7 - "1" RESERVED +.GetParams: EX DE,HL + LD BC,#55AA + AND #0F + SBC HL,BC + JR Z,.next + ; + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + ; +.next: PUSH AF + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + JR C,.NONE_FDD + PUSH HL + PUSH DE + LD A,H + LD H,0 + ; +.mull_loop1: ADD HL,HL + DEC A + JR NZ,.mull_loop1 + ; + ; HL - SECTOR PER CYLLINDER + ; A=0 ZF=0 CF=0 + LD B,H + LD C,L + ;LD HL,0 + ;XOR A + LD H,A + LD L,A + EX AF,AF' + ; +.mull_loop2: EX AF,AF' + ADD HL,BC + ADC A,0 + DEC DE + EX AF,AF' + LD A,D + OR E + JR NZ,.mull_loop2 + ; + ; A=0 ZF=0 CF=0 + EX AF,AF' + LD E,A + EX DE,HL + EXX + POP DE + POP HL + POP AF + EX AF,AF' + ; A=0 ZF=0 CF=0 + LD A,B + LD B,0 + LD C,L + LD L,H + LD H,B + EX DE,HL + EXX + ; A=0 ZF=0 CF=0 + LD C,0 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + AND A + RET + ; +.NONE_FDD: POP BC + LD A,DSS_Error.drv.INVALID_DRIVE + ; CF=1 + RET +; ; ; ; HL:DE - SECTORS ON LOGICAL DISK @@ -338,35 +379,40 @@ FDDRIVE: ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED -.FSETPRM: - PUSH AF - EXX - EX DE,HL - LD H,L - LD L,C - POP AF - AND #0F - PUSH AF - PUSH HL - PUSH DE - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP DE - POP HL - JR C,.NONEF - POP AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS - RET C - AND A - RET +.SetParams: PUSH AF + EXX + EX DE,HL + LD H,L + LD L,C + POP AF + AND #0F + PUSH AF + PUSH HL + PUSH DE + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP DE + POP HL + JR C,.NONE_FDD + POP AF + LD C,BIOS.DRV_SET_PAR + JP ToBIOS + ;RST ToBIOS + ;RET C + ;AND A + ;RET +; ; ; -.REMOV_F: - LD A,1 - AND A - RET + +Removable: ; LD A,1 + ; AND A + XOR A + INC A + RET +; ; ; ;============================================== + ENDMODULE ; FDD_DRV - +//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm index 9ff323a..97f01cc 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/shared-drv.asm @@ -132,9 +132,9 @@ INITDVC: XOR A LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 LDIR ; FDD девайсы - CALL FDDRIVE.INIT ; узнать число FDD-девайсов - LD DE,FDDRIVE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов + CALL FDD_DRV.Init ; узнать число FDD-девайсов + LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов ; HDD девайсы .if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET LD DE,HDDRIVE diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index ad333ed..4e4a9d8 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -76,20 +76,24 @@ cmd_info: CALL Get_Path LD HL,.none_string LD DE,Buffers.bat_params.PRM7 ; Volume label CALL ncopy_string - LD HL,.Unknown_FS - LD DE,Buffers.bat_params.PRM8 ; Volume fikle system + LD HL,.Unknown_str + LD DE,Buffers.bat_params.PRM8 ; Volume file system CALL ncopy_string ; POP BC PUSH BC LD A,C - LD DE,#55AA + LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - JR C,.next_drv - ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 + RST ToDSS.DRV ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 + JR NC,.calc_size + ; + LD HL,.Unknown_str + LD DE,Buffers.bat_params.PRM5 ; Drive size + CALL ncopy_string + JR .print_info_2 ; HL:DE * 512 = A:HL:H'L' - RL E +.calc_size: RL E RL D RL L RL H @@ -103,7 +107,7 @@ cmd_info: CALL Get_Path JR .convert_hex ; .Collect_Msg: DZ " A: \r" ; патчится буква драйва в цикле -.Unknown_FS: DZ "unknown" +.Unknown_str: DZ "unknown" .none_string: DZ "none" diff --git a/SHELL/build.txt b/SHELL/build.txt index af40ff6..1fde752 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -433 \ No newline at end of file +434 \ No newline at end of file From 2ac8d1308a5ded5b64bbb3de50c79dda430f387c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 3 Jul 2024 00:15:25 +1000 Subject: [PATCH 164/219] core: fixed a bug for FAT32 with an unusually large FAT size and added another bug --- BOOT/DSSBOOT.ASM | 59 ++++++++++++++++++++++++----------- DSS/API/ChnDisk.asm | 39 +++++++++++------------ DSS/DOS_Proc.asm | 14 ++++----- DSS/FS/FAT/FAT.asm | 57 ++++++++++++++++++++++++--------- DSS/build.txt | 2 +- DSS/drivers/media/fdd-drv.asm | 11 +++---- SHELL/Commands/INFO.ASM | 4 ++- SHELL/build.txt | 2 +- 8 files changed, 119 insertions(+), 69 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 00892ce..60c13f0 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -392,18 +392,15 @@ YEPDOS: ;[ ] 17.12.2023 ; ; -GET_BPB: LD HL,#0000 - ; +GET_BPB: XOR A + LD H,A + LD L,A LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 LD (FatBuffer.RootDirFirstSector_H),HL - ;LD (FatBuffer.CacheBlock),HL - XOR A LD (FatBuffer.SectorsPerFAT_H),A ; PUSH HL POP IX - ; LD IX,#0000 - ; LD HL,#0000 LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) @@ -458,34 +455,59 @@ GET_BPB: LD HL,#0000 LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 ; - LD BC,0 + XOR A + LD B,A + LD C,A + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX + ; + ;LD BC,0 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - LD A,C + EXX + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,E + EXX + ;LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + ;LD A,C LD (FatBuffer.SectorsPerFAT_H),A LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) + ; .skip_high: LD (FatBuffer.SectorsPerFAT_L),DE LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT DEC A ADD HL,DE - JR NC,.no_inc_BC - INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.no_inc_BC + ;INC BC .no_inc_BC: ; .one_FAT: ; .loop1: ADD HL,DE - JR NC,.loop1_1 - INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.loop1_1 + ;INC BC .loop1_1: DEC A JR NZ,.loop1 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD (FatBuffer.FirstDataSector_H),BC + EXX + ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. + LD (FatBuffer.FirstDataSector_H),HL + EXX + ;LD (FatBuffer.FirstDataSector_H),BC LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD A,B AND A @@ -534,11 +556,10 @@ GET_BPB: LD HL,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - ; LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO - ; AND A - ; SBC HL,DE - ; CCF - ; RET C ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) + ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ; ..... + ; +//////////////////////////////////////////////////////////////////////// ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD BC,0 diff --git a/DSS/API/ChnDisk.asm b/DSS/API/ChnDisk.asm index 9a8cc87..119846c 100644 --- a/DSS/API/ChnDisk.asm +++ b/DSS/API/ChnDisk.asm @@ -2,24 +2,23 @@ ; ; //////////////////////////////////////////////////////////////////////// -CHNDISK_FN: - CALL CHNDISK - RET C - PUSH AF - CALL DIR_PATH_CHANGE.FullCurrent - POP AF - RET -CHNDISK:;[x] более корректная смена диска - CALL OPENDSK - ; - ;R010 - RET C - LD HL,CORE_BUFFERS.WorkDirectory - LD (HL),0 - PUSH AF - CALL OPENDIR - POP BC - RET C - LD A,B - RET +CHNDISK_FN: CALL CHNDISK + RET C + PUSH AF + CALL DIR_PATH_CHANGE.FullCurrent + POP AF + RET +CHNDISK: ;[x] более корректная смена диска + CALL OPENDSK + ; + ;R010 + RET C + LD HL,CORE_BUFFERS.WorkDirectory + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B + RET ; \ No newline at end of file diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 108e827..0ff063e 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -184,13 +184,13 @@ OPENDSK: ;!TEST DRV.Open LD C,A LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP C - IF CHECK_DRIVE_CHANGE - JR NZ,.open - PUSH BC - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - POP BC - ENDIF + IF CHECK_DRIVE_CHANGE + JR NZ,.open + PUSH BC + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + POP BC + ENDIF JR Z,.exit .open: LD A,C diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 57399db..1c2fc22 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -534,7 +534,7 @@ LOADDIR: ;!TODO optimize RET ; .LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B @@ -727,15 +727,25 @@ RD_BPB: ; LD C,SLOT3 ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables ; ; + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - LD A,C + EXX + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,E + EXX + ; LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) + ; .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs LD (CORE_BUFFERS.FatBuffer.Number_Of_FATs),A @@ -744,18 +754,29 @@ RD_BPB: ; LD C,SLOT3 DEC A ADD HL,DE LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL - JR NC,.no_inc_BC - INC BC -.no_inc_BC: LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC -.one_FAT: ;C_DATA1 + EXX + ADC HL,DE + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + EXX + ;JR NC,.no_inc_BC + ;INC BC +.no_inc_BC:;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC +.one_FAT: ; .loop1: ADD HL,DE - JR NC,.loop1_1 - INC BC + ;JR NC,.loop1_1 + ;INC BC + EXX + ADC HL,DE + EXX .loop1_1: DEC A JR NZ,.loop1 ; LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC + EXX + ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),HL + EXX + ;LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC ; LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,B @@ -838,19 +859,27 @@ RD_BPB: ; LD C,SLOT3 //////////////////////////////////////////////////////////////////////// ; [ ] fat32 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + EXX + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low AND A SBC HL,DE - JP NC,.HDDBIG - DEC BC + EXX + SBC HL,DE + PUSH HL + EXX + POP BC + ;JP NC,.HDDBIG + ;DEC BC JP .HDDBIG ; .HDDSMAL: ; CF = 0 diff --git a/DSS/build.txt b/DSS/build.txt index b92b677..d8292c2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -995 \ No newline at end of file +996 \ No newline at end of file diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index d07437e..e196213 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -210,7 +210,7 @@ GetBPB: LD IX,0 POP DE POP HL RET C - LD BC,#0018 + LD BC,BOOT_SECTOR.SectorsPerTrack ADD HL,BC LD E,(HL) PUSH DE @@ -293,7 +293,7 @@ GenIOCTL: BIT 7,B ; BC' - SECTORS PER TRACK ON PHISICAL DISK ; A' - PHISICAL DRIVE NUMBER ; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) +; D1..D3 - "0" RESERVED (MAY BE OTHER) ; D4 - DEVICE MASTER/SLAVE ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS @@ -340,25 +340,24 @@ GenIOCTL: BIT 7,B OR E JR NZ,.mull_loop2 ; - ; A=0 ZF=0 CF=0 + ; A=0 DE=0 ZF=0 CF=0 EX AF,AF' LD E,A EX DE,HL + ; H=0 + LD C,H ;[x] 17.12.2023 загрузка с активного раздела, а не с первого EXX POP DE POP HL POP AF EX AF,AF' ; A=0 ZF=0 CF=0 - LD A,B LD B,0 LD C,L LD L,H LD H,B EX DE,HL EXX - ; A=0 ZF=0 CF=0 - LD C,0 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого AND A RET ; diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index 4e4a9d8..ec82682 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -83,11 +83,13 @@ cmd_info: CALL Get_Path POP BC PUSH BC LD A,C + CP "C" + JR C,.ItIsFDD LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams RST ToDSS.DRV ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 JR NC,.calc_size - ; +.ItIsFDD: ; LD HL,.Unknown_str LD DE,Buffers.bat_params.PRM5 ; Drive size CALL ncopy_string diff --git a/SHELL/build.txt b/SHELL/build.txt index 1fde752..5a40cf6 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -434 \ No newline at end of file +435 \ No newline at end of file From 08ab359af470039200f3f9bc3e0c78fb9d7d3a9f Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 3 Jul 2024 01:11:47 +1000 Subject: [PATCH 165/219] Core: fixed a bug for FAT32 with an unusually large FAT size --- DSS/FS/FAT/FAT.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 1c2fc22..4b99c59 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -866,10 +866,10 @@ RD_BPB: ; LD C,SLOT3 LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + PUSH HL ; Total Sectors high LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) - PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low AND A SBC HL,DE From 201fa03a29d6fb658f97450fa8c3d9e1f88d2fc4 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 4 Jul 2024 02:21:56 +1000 Subject: [PATCH 166/219] dssboot: +fixed bug with one cluster FAT32 rootdir search --- BOOT/DSSBOOT.ASM | 88 ++++++++++++++++++++++++++++++++++++------------ BOOT/boot.asm | 4 +-- SHELL/BATCH.ASM | 58 +++++++++++++++---------------- 3 files changed, 97 insertions(+), 53 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 60c13f0..54c0231 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -683,6 +683,8 @@ GET_BPB: XOR A .mirrored_FATs: ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (FatBuffer.RootDirStartCluster_L),HL + LD (FatBuffer.RootDirStartCluster_H),DE CALL CLUSTER_TO_SECTOR.no_prepare LD (FatBuffer.RootDirFirstSector_L),IX LD (FatBuffer.RootDirFirstSector_H),HL @@ -739,21 +741,49 @@ CLUSTER_TO_SECTOR: ; поиск system.dos -GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) - LD IX,(FatBuffer.RootDirFirstSector_L) - LD BC,(PARTITION_START_L) - LD DE,(PARTITION_START_H) - ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. - ADD IX,BC - ADC HL,DE - ; +GETROOT: LD HL,(FatBuffer.RootDirStartCluster_L) + PUSH HL + LD HL,(FatBuffer.RootDirStartCluster_H) + PUSH HL LD A,(FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 LD A,(FatBuffer.DirSizeInSectors) - JR NZ,.NEXTSEC + JR NZ,.load_and_search ; LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32 -.NEXTSEC: PUSH AF +.load_and_search: + LD HL,(FatBuffer.RootDirFirstSector_H) + LD IX,(FatBuffer.RootDirFirstSector_L) + ;LD BC,(PARTITION_START_L) + ;LD DE,(PARTITION_START_H) + ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. + ;ADD IX,BC + ;ADC HL,DE + ; +.NEXT_CLUSTER: CALL GET_ABSOLUTE_SECTOR + CALL .NEXT_SECTOR + ; + POP HL + EXX + POP HL + RET C + RET NZ + CALL READ_FROM_FAT + RET C + EX DE,HL + PUSH HL + EXX + EX DE,HL + PUSH HL + EXX + ; in: HL':HL - CLUSTER + ; out: HL:IX - SECTOR + CALL CLUSTER_TO_SECTOR + LD A,(FatBuffer.SectorsPerCluster) + JR .NEXT_CLUSTER + ; + ; +.NEXT_SECTOR: PUSH AF ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. ;ADD IX,BC ;ADC HL,DE @@ -779,10 +809,22 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) DEC HL ; DEC A - JR NZ,.NEXTSEC - SCF + JR NZ,.NEXT_SECTOR + RET + ; +; ; ; + +; вход: HL:IX - относительный сектор +; выход: HL:IX - абсолютный сектор +GET_ABSOLUTE_SECTOR: + LD DE,(PARTITION_START_L) + ADD IX,DE + LD DE,(PARTITION_START_H) + ADC HL,DE RET ; + + SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD @@ -838,11 +880,12 @@ LOAD_CORE: LD (READMEM),DE ;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 + ; + ;LD DE,(PARTITION_START_L) + ;ADD IX,DE + ;LD DE,(PARTITION_START_H) + ;ADC HL,DE + CALL GET_ABSOLUTE_SECTOR ;.skip_it: ; LD DE,(READMEM) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) @@ -881,7 +924,6 @@ LOAD_CORE: LD (READMEM),DE CCF RET NC ; [ ] загрузка system.dos больше #4000 байтов - .BIG_CORE+1: LD A,0 DEC A LD (.BIG_CORE),A @@ -1049,10 +1091,12 @@ READ_FAT_TABLE: PUSH 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,(PARTITION_START_L) + ;ADD IX,DE + ;LD DE,(PARTITION_START_H) + ;ADC HL,DE + CALL GET_ABSOLUTE_SECTOR + ; LD DE,FAT_SECTORS_BUFFER ; IN A,(SLOT3) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 77fc142..12a388e 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -26,8 +26,8 @@ .CacheBlock: WORD #0000 ;.CacheUpdated: BYTE #00 ;.SectorsPerBank: BYTE #00 -;.RootDirStartCluster_L: WORD #0000 -;.RootDirStartCluster_H: WORD #0000 ; fat32 +.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 diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 16f4265..a33e30c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -493,36 +493,36 @@ EVALSTR: ld a,(hl) ; !! Не делать одну команду > 256 символов)) !! ; ; BAT-команды (не отделять от дос-команд) -BATLIST: DZ 'PAUSE' : DW cmd_pause - DZ 'REM' : DW cmd_rem - DZ 'EXIT' : DW cmd_break +BATLIST: DZ 'PAUSE' : DW cmd_pause + DZ 'REM' : DW cmd_rem + DZ 'EXIT' : DW cmd_break ; - ; DSS-команды -CMDLIST: DZ 'CD' : DW cmd_chdir - DZ 'DIR' : DW cmd_dir - DZ 'ECHO' : DW cmd_echo - DZ 'ECHO.' : DW cmd_echoLN - DZ 'PATH' : DW cmd_path - DZ 'MD' : DW cmd_mkdir - DZ 'REN' : DW cmd_rename - DZ 'DEL' : DW cmd_del - DZ 'RD' : DW cmd_rmdir - DZ 'INFO' : DW cmd_info - DZ 'SET' : DW cmd_set - DZ 'TIME' : DW cmd_time - DZ 'DATE' : DW cmd_date - DZ 'VER' : DW cmd_version - DZ 'CLS' : DW cmd_cls - DZ 'CHDIR' : DW cmd_chdir - DZ 'MKDIR' : DW cmd_mkdir - DZ 'RENAME' : DW cmd_rename - DZ 'ERASE' : DW cmd_del - DZ 'RMDIR' : DW cmd_rmdir - DZ 'HELP' : DW cmd_help - DZ 'VERSION' : DW cmd_version - DZ 'EXIT' : DW cmd_exit - DZ 'REBOOT' : DW cmd_reboot - DB #00 + ; DSS-команды +CMDLIST: DZ 'CD' : DW cmd_chdir + DZ 'DIR' : DW cmd_dir + DZ 'ECHO' : DW cmd_echo + DZ 'ECHO.' : DW cmd_echoLN + DZ 'PATH' : DW cmd_path + DZ 'MD' : DW cmd_mkdir + DZ 'REN' : DW cmd_rename + DZ 'DEL' : DW cmd_del + DZ 'RD' : DW cmd_rmdir + DZ 'INFO' : DW cmd_info + DZ 'SET' : DW cmd_set + DZ 'TIME' : DW cmd_time + DZ 'DATE' : DW cmd_date + DZ 'VER' : DW cmd_version + DZ 'CLS' : DW cmd_cls + DZ 'CHDIR' : DW cmd_chdir + DZ 'MKDIR' : DW cmd_mkdir + DZ 'RENAME' : DW cmd_rename + DZ 'ERASE' : DW cmd_del + DZ 'RMDIR' : DW cmd_rmdir + DZ 'HELP' : DW cmd_help + DZ 'VERSION' : DW cmd_version + DZ 'EXIT' : DW cmd_exit + DZ 'REBOOT' : DW cmd_reboot + DB #00 IZERO DB "ZERO",0 From 6af1575f2b2b6932e3292f2a43747f0ed59b158a Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 5 Jul 2024 03:39:58 +1000 Subject: [PATCH 167/219] fixet bug with small partitions. Some small fixes --- DSS/API.asm | 1 + DSS/API/Print.asm | 74 ++++++++++++++++++++++++++++++ DSS/FS/FAT/FAT.asm | 4 +- DSS/Procedures.asm | 14 +++--- DSS/VIDEO.ASM | 89 +------------------------------------ DSS/build.txt | 2 +- DSS/drivers/Input/MOUSE.ASM | 2 +- SHELL/SHELL.ASM | 1 + SHELL/build.txt | 2 +- 9 files changed, 88 insertions(+), 101 deletions(-) create mode 100644 DSS/API/Print.asm diff --git a/DSS/API.asm b/DSS/API.asm index e2a7cc0..bded5af 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -66,6 +66,7 @@ include 'API/Environ.ASM' include 'API/Lib_Sub.asm' include "API/EXECUTE.ASM" + include "API/Print.asm" diff --git a/DSS/API/Print.asm b/DSS/API/Print.asm new file mode 100644 index 0000000..c8585f7 --- /dev/null +++ b/DSS/API/Print.asm @@ -0,0 +1,74 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #5F. Вывод символа на принтер без ожидания. +; +; Интерпретация байта состояния принтера: +; 0..2 - не используются, обычно уст. в "1" +; 3 - ошибка принтера - есть/нет (1/0) +; 4 - принтер подключен/не подключен (1/0) +; 5 - бумаги нет/есть (1/0) +; 6 - принтер готов/выводит очередной символ (1/0) +; 7 - принтер свободен/занят (1/0) +; +; вход: A - символ +; выход: B - символ +; CF - ошибка, A=байт состояния (биты 7..3) +;/////////////////////////////////////////////////////////////////////// +Z84_SP: +.LPT_A EQU Z84.SIO.Ch_B.Ctrl +.LPT_B EQU Z84.PIO.Port_A.Data +.LPT1_C EQU Z84.PIO.Port_A.Command +.LPT2_D EQU Z84.PIO.Port_B.Data +.LPT2_C EQU Z84.PIO.Port_B.Command +; +PRINT: AND A + LD B,A ; сохраняем символ + ; + LD A,R + DI + PUSH AF + ; reg 0 + XOR A + OUT (Z84_SP.LPT_A),A + LD A,%0001'0000 ; Reset EXT/STATUS interrupts + OUT (Z84_SP.LPT_A),A + XOR A + OUT (Z84_SP.LPT_A),A + IN A,(Z84_SP.LPT_A) ; IN (1Bh): bit 5 - busy, Bit 3 - Ack + LD C,A + BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select + JR NZ,.LPTBUSY + AND %11011000 + JR Z,.LPTBUSY + LD A,B ; восстанавливаем символ + OUT (Z84_SP.LPT_B),A + POP AF + RET PO + EI + RET + ; +.LPTBUSY: POP AF + LD A,C + SCF + RET PO + EI + RET +; ; ; + +; B - SYMBOL +; CF = 1 - PRINTER BUSY +PRINT_INIT: DI + LD A,#CF + ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан) + LD BC,Z84_SP.LPT2_C + OUT (C),A + ;[x] 29/9/23 + ;LD A,#63 + LD A,63 + ; + OUT (C),A + LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1) + OUT (Z84_SP.LPT2_D),A + LD A,#0F ; Init printer port for Out + OUT (Z84_SP.LPT1_C),A + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 4b99c59..c577793 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -790,7 +790,7 @@ RD_BPB: ; LD C,SLOT3 RLA ; LD C,A - LD B,0 ; BC - File handels in sectors + LD B,0 ; BC - File handels per sector ;;;; IF COMPILE_UNUSED_CODE LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A @@ -861,9 +861,9 @@ RD_BPB: ; LD C,SLOT3 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD A,H OR L + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) JP NZ,.HDDSMAL ; - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH HL ; Total Sectors high diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index c5db6f0..8356e6b 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -107,14 +107,7 @@ RMKTIME: ; E - месяц ; IX - год ; выход: H - день недели (1 - воскресенье) -CalcDayOfWeek: ;!FIXIT вычислять день недели - ; x = (14 ? месяц) / 12 - ; y = год ? x - ; m = месяц + 12 * x ? 2 - ; ДеньНедели = (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 - ; Все деления целочисленные (остаток отбрасывается). - ; - LD A,D +CalcDayOfWeek: LD A,D LD (.day),A ; x = (14 ? месяц) / 12 ; y = год ? x @@ -203,6 +196,11 @@ CalcDayOfWeek: ;!FIXIT LD H,L INC H RET +; x = (14 ? месяц) / 12 +; y = год ? x +; m = месяц + 12 * x ? 2 +; ДеньНедели = (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 +; Все деления целочисленные (остаток отбрасывается). ;----------------------------------------------------------------------; diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index b00b26e..9aa6285 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -690,94 +690,7 @@ BACKTXT: PUSH AF POP BC NOBACKT: POP AF RET - -;///////////////////////////////////////////////////////////////////// -; Функция #5F. Вывод символа на принтер без ожидания. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; -; Интерпретация байта состояния принтера: -; 0..2 - не используются, обычно уст. в "1" -; 3 - ошибка принтера - есть/нет (1/0) -; 4 - принтер подключен/не подключен (1/0) -; 5 - бумаги нет/есть (1/0) -; 6 - принтер готов/выводит очередной символ (1/0) -; 7 - принтер свободен/занят (1/0) -; -; вход: A - символ -; выход: B - символ -; CF - ошибка, A=байт состояния (биты 7..3) -;///////////////////////////////////////////////////////////////////// -;!FIXIT заменить на sp2000.inc -LPT_A EQU #1B -LPT_B EQU #1C - -PRINT: AND A - LD B,A ; сохраняем символ - ; - LD A,R - DI - PUSH AF - ; - XOR A - OUT (LPT_A),A - LD A,#10 - OUT (LPT_A),A - XOR A - OUT (LPT_A),A - IN A,(LPT_A) ; IN (1Bh): bit 5 - busy, Bit 3 - Ack - LD C,A - BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select - JR NZ,LPTBUSY - AND %11011000 - JR Z,LPTBUSY - LD A,B ; восстанавливаем символ - OUT (LPT_B),A - POP AF - RET PO - EI - RET -LPTBUSY: - POP AF - LD A,C - SCF - RET PO - EI - RET - -; B - SYMBOL -; CF = 1 - PRINTER BUSY -;!FIXIT заменить на sp2000.inc -LPT1_C EQU #1D -LPT2_D EQU #1E -LPT2_C EQU #1F -PRINT_INIT: - DI - LD A,#CF ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан) - LD BC,LPT2_C - OUT (C),A - ;[x] 29/9/23 - ;LD A,#63 - LD A,63 - ; - OUT (C),A - LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1) - OUT (LPT2_D),A - LD A,#0F ; Init printer port for Out - OUT (LPT1_C),A - - ; клава - XOR A ;LD A,0 - OUT (Z84.SIO.Ch_A.Ctrl),A - ;[x] 29/9/23 - INC A - OUT (Z84.SIO.Ch_A.Ctrl),A - DEC A - ; - OUT (Z84.SIO.Ch_A.Ctrl),A - - LD A,5 - OUT (Z84.SIO.Ch_A.Ctrl),A - LD A,#62 ; bit 7 - Direction for Bufer (0), Bit 1 - Bufer Enable (1) - OUT (Z84.SIO.Ch_A.Ctrl),A - RET ;//MODULE: VIDEO ;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index d8292c2..7ccfcb1 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -996 \ No newline at end of file +997 \ No newline at end of file diff --git a/DSS/drivers/Input/MOUSE.ASM b/DSS/drivers/Input/MOUSE.ASM index 93dda3a..cb915b2 100644 --- a/DSS/drivers/Input/MOUSE.ASM +++ b/DSS/drivers/Input/MOUSE.ASM @@ -1052,7 +1052,7 @@ MOUSE_COORDINATES: .Y: DB #00 MOUSE_BUTTONS: DB #00 -;MB_OLD DB #00 ; !FIXIT - не нужно? +;MB_OLD DB #00 MIN_X: DW 0 MAX_X: DW 319 MIN_Y: DW 0 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 14b098d..8908e4f 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -172,6 +172,7 @@ option_c: ; Можно выйти по EXIT, но не из запущенного boot-загрузчиком. ;--------------------------------------------------------------- FPRIMAR: + halt ld c,Dss.CTRLKey ; узнать сост. клавы в данный момент RST ToDSS ld hl,autoexec_fname ; имя файла "system.bat" diff --git a/SHELL/build.txt b/SHELL/build.txt index 5a40cf6..662d98c 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -435 \ No newline at end of file +436 \ No newline at end of file From f7ca5140ec92b1e7c09ca38f317f23f6c554f62d Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 6 Jul 2024 04:34:11 +1000 Subject: [PATCH 168/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index d294e37..bfc070c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d294e375826854d80b838ea40ca4afcf3730a141 +Subproject commit bfc070c1eeb661e952fe887862754b940b43aff5 From fd1dfed67f07361fe29031d4631c7ebe1dd923f8 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 6 Jul 2024 04:34:48 +1000 Subject: [PATCH 169/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index bfc070c..990f10e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit bfc070c1eeb661e952fe887862754b940b43aff5 +Subproject commit 990f10e80278825f071f5795a5ba459dec0f991f From 707c84ac70e91a499511e2fa6138db6019475411 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 8 Jul 2024 00:53:07 +1000 Subject: [PATCH 170/219] =?UTF-8?q?=D1=80=D1=8E=D1=88=D0=B5=D1=87=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SHELL/Commands/INFO.ASM | 8 ++++++-- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index ec82682..cb29be6 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -66,6 +66,10 @@ cmd_info: CALL Get_Path ; .next_drv: POP BC DJNZ .loop + ; + LD A,"\n" + LD C,Dss.PutChar + RST ToDSS JP RESTORE_ALL.path ;RET ; @@ -117,7 +121,7 @@ cmd_info: CALL Get_Path 0 1 2 3 4 5 6 7 01234567890123456789012345678901234567890123456789012345678901234567890123456789; Drive File System Label Serial number Size in bytes - C: FAT32 NO NAME xxxx-xxxx 147,102,629,888. - D: FAT16 SP_SYS xxxx-xxxx 147,102,629,888. + C: FAT32 NO NAME xxxx-xxxx 147,102,629,888 + D: FAT16 SP_SYS xxxx-xxxx 147,102,629,888 ; */ diff --git a/SHELL/build.txt b/SHELL/build.txt index 662d98c..3fa694f 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -436 \ No newline at end of file +437 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 990f10e..04aaef8 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 990f10e80278825f071f5795a5ba459dec0f991f +Subproject commit 04aaef8ac955971d913babd95921a62937b597ae From 4bba21f2d1a0e3d6584d850d28558c3b029a94b2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 19 Jul 2024 04:50:53 +1000 Subject: [PATCH 171/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 04aaef8..7e812bc 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 04aaef8ac955971d913babd95921a62937b597ae +Subproject commit 7e812bc0267db168c5a5b17780e567a7a01cd927 From 4dedfec9e955ce6000ba51ac55091886e4862640 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 7 Aug 2024 23:14:10 +1000 Subject: [PATCH 172/219] ... --- DSS/KNOWN.BUG | 2 +- Shared_Includes | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DSS/KNOWN.BUG b/DSS/KNOWN.BUG index 5f96bcc..e5f3ea4 100644 --- a/DSS/KNOWN.BUG +++ b/DSS/KNOWN.BUG @@ -9,5 +9,5 @@ FIXED: - игнорирование ошибок при записи системных областей FAT/DIR, невозможность отработать ошибку write-protect, так как она теряется при попытке записать измененный каталог на диск. Но возникает ошибка file not found так как сразу после создания система открывает файл. -- ошибка разбора допустимого имени файла, если оно состоит из "." так как подрузомевается пробелы точка пробелы. +- ошибка разбора допустимого имени файла, если оно состоит из "." так как подразумевается пробелы точка пробелы. diff --git a/Shared_Includes b/Shared_Includes index 7e812bc..eebde92 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7e812bc0267db168c5a5b17780e567a7a01cd927 +Subproject commit eebde92dd60cdf33588e34a7248413ec107edfe0 From d89a2b049fe7dd6b71fa67e701a346cb7d960b9a Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 18 Aug 2024 01:35:09 +1000 Subject: [PATCH 173/219] =?UTF-8?q?=D1=80=D0=B8=D1=81=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=20=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BB=20RAM=20DRIVE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/ScanDRV.asm | 10 +- DSS/Kernel_Panic.asm | 6 +- DSS/build.txt | 2 +- DSS/drivers/media/ReScanDRV.ASM | 2 +- DSS/drivers/media/ram_disk-drv.asm | 402 ++++++++++++++--------------- Shared_Includes | 2 +- 6 files changed, 206 insertions(+), 218 deletions(-) diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index 9a43347..b4a7788 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -16,7 +16,8 @@ SCANDRV: ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 2. узнаём букву бут-диска ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - CALL BOOTDSK.GET + LD A,(BOOTDSK.NUM) + ;CALL BOOTDSK.GET ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 3. вызываем рескан ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; @@ -44,9 +45,12 @@ SCANDRV: ; LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' - CALL OPENDSK + CALL OPENDSK.open + JR NC,.disk_norm + LD A,(BOOTDSK.NUM) + CALL OPENDSK.open ; - LD HL,CORE_BUFFERS.CurrentDirectory +.disk_norm: LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR JR NC,.exit LD HL,CORE_BUFFERS.CurrentDirectory diff --git a/DSS/Kernel_Panic.asm b/DSS/Kernel_Panic.asm index 4e26ab6..8c5c791 100644 --- a/DSS/Kernel_Panic.asm +++ b/DSS/Kernel_Panic.asm @@ -29,8 +29,8 @@ KERNEL_PANIC: LD A,1 OUT (SCREEN_SWITCH),A ; set scr-2 ; - PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.RED) - PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE) + PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED) + PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE) ; POP BC POP HL @@ -44,7 +44,7 @@ KERNEL_PANIC: RST ToBIOS ; LD HL,#A000 - LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE LD B,A LD C,BIOS.LP_PRINT_LINE3 RST ToBIOS diff --git a/DSS/build.txt b/DSS/build.txt index 7ccfcb1..f03187e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -997 \ No newline at end of file +998 \ No newline at end of file diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM index b2eea94..29d977b 100644 --- a/DSS/drivers/media/ReScanDRV.ASM +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -302,7 +302,7 @@ Find_Record: ; RST ToBIOS ; ; ; LD HL,#A000 -; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE +; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE ; LD B,A ; LD C,BIOS.LP_PRINT_LINE3 ; RST ToBIOS diff --git a/DSS/drivers/media/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm index 3c90bec..b9b5480 100644 --- a/DSS/drivers/media/ram_disk-drv.asm +++ b/DSS/drivers/media/ram_disk-drv.asm @@ -204,77 +204,77 @@ ; parser -RMDRIVE: - INC C - DEC C - JP Z,INIT_RD ; 0 - DEC C - JR Z,RESET_RD ; 1 - DEC C - JR Z,STATUS_RD ; 2 - DEC C - JR Z,CHEK_RD ; 3 - DEC C - JR Z,GBPB_RD ; 4 - DEC C - JR Z,READ_RD ; 5 - DEC C - JR Z,WRITE_RD ; 6 - DEC C - JR Z,REMOV_RD ; 7 - DEC C - JP Z,IOCTL_RD ; 8 - DEC C - JP Z,.error ; 9 RESR_H - DEC C - JP Z,LREAD_RD ; 10 - DEC C - JP Z,LWRITE_RD ; 11 +RMDRIVE: INC C + DEC C + JP Z,INIT_RD ; 0 + DEC C + JR Z,RESET_RD ; 1 + DEC C + JR Z,STATUS_RD ; 2 + DEC C + JR Z,CHEK_RD ; 3 + DEC C + JR Z,GBPB_RD ; 4 + DEC C + JR Z,READ_RD ; 5 + DEC C + JR Z,WRITE_RD ; 6 + DEC C + JR Z,REMOV_RD ; 7 + DEC C + JP Z,IOCTL_RD ; 8 + DEC C + JP Z,.error ; 9 RESR_H + DEC C + JP Z,LREAD_RD ; 10 + DEC C + JP Z,LWRITE_RD ; 11 .error: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET REMOV_RD: RESET_RD: -STATUS_RD: - XOR A - RET - +STATUS_RD: XOR A + RET + ;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение -CHEK_RD LD A,#FF - AND A - RET + ;!FIXIT как-то определять смену RMD? + ; [x] 18/08/2024 пока немного костыльно и опасно +CHEK_RD: ;LD A,#FF + ;AND A + XOR A + ; + RET ;DE - ADDRESS -GBPB_RD: - LD IX,0 - LD HL,0 - LD B,#01 +GBPB_RD: LD IX,0 + LD HL,0 + LD B,#01 ;JP READ_RD ;READ SECTORS ; HL:IX - SECTOR ; DE - ADDRESS ; B - COUNT ; A - DRIVE -READ_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_READ - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET +READ_RD: PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_READ + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET LREAD_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_READ_LONG - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET + PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_READ_LONG + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET ;WRITE SECTORS ; HL:IX - SECTOR @@ -282,24 +282,24 @@ LREAD_RD: ; B - COUNT ; A - DRIVE WRITE_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_WRITE - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET + PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_WRITE + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET LWRITE_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_WRITE_LONG - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET + PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_WRITE_LONG + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET ; ;; @@ -360,51 +360,49 @@ LWRITE_RD: ;S_P_P DB #00 INIT_RD: ; .SectorSize EQU 512 ;!HARDCODE -; LD HL,.SectorSize -; LD A,#80 +; LD HL,.SectorSize +; LD A,#80 ; .loop: SRL A -; RR H -; JR NC,.loop -; LD (S_P_P),A +; RR H +; JR NC,.loop +; LD (S_P_P),A - LD BC,0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk - LD DE,RAMDTBL -.initLoop: - PUSH BC - LD A,B - PUSH DE - RST ToBIOS - POP DE - OR A - JR Z,.noDRV - ; - INC DE - LD (DE),A - DEC DE - ; - POP BC - LD A,B - LD (DE),A - INC DE - INC DE - ; - JP 1F - ; -.noDRV: POP BC -1: INC B - LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry - CP B - JR NZ,.initLoop + LD BC,0*256+BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk + LD DE,RAMDTBL +.initLoop: PUSH BC + LD A,B + PUSH DE + RST ToBIOS + POP DE + OR A + JR Z,.noDRV + ; + INC DE + LD (DE),A + DEC DE + ; + POP BC + LD A,B + LD (DE),A + INC DE + INC DE + JP .skip_pop + ; +.noDRV: POP BC +.skip_pop: INC B + LD A,RAMDTBL.Size/RAMDTBL.TBL_Entry + CP B + JR NZ,.initLoop - LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL - EX DE,HL - AND A ;!FIXIT ---- - SBC HL,DE ;!FIXIT ADD HL,DE - SRL L - LD A,L -; LD HL,ENDDRVR - AND A - RET + LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL + EX DE,HL + AND A ;!FIXIT ---- + SBC HL,DE ;!FIXIT ADD HL,DE + SRL L + LD A,L + ; LD HL,ENDDRVR + AND A + RET ;----------------------------------------------------------------------;!TEST ;;; ;; @@ -428,32 +426,30 @@ INIT_RD: ; 81 - WRITE TRACK ; 82 - FORMAT TRACK IOCTL_RD: - BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.RGETPRM -; DEC B -; JP Z,FRDTRAC -; DEC B -; JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET + BIT 7,B + JR NZ,.O_CTL_F + INC B + DEC B + JP Z,.RGETPRM + ;DEC B + ;JP Z,FRDTRAC + ;DEC B + ;JP Z,FCHTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET -.O_CTL_F: - ; RES 7,B - ; INC B - ; DEC B - ; JP Z,.RSETPRM - -; DEC B -; JP Z,FWRTRAC -; DEC B -; JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET +.O_CTL_F: ;RES 7,B + ;INC B + ;DEC B + ;JP Z,.RSETPRM + ;DEC B + ;JP Z,FWRTRAC + ;DEC B + ;JP Z,FFRTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET ; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK @@ -467,83 +463,71 @@ IOCTL_RD: ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED -.RGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - +.RGETPRM: EX DE,HL + LD BC,#55AA + AND A + SBC HL,BC + LD L,A + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET NZ + ; + EX AF,AF' + LD A,L + CALL GET_RAMDRV_NUM + PUSH AF + PUSH AF + EX AF,AF' - EX AF,AF' - LD A,L - CALL GET_RAMDRV_NUM - PUSH AF - PUSH AF - EX AF,AF' + POP AF + LD C,BIOS.DRV_GET_PAR + RST ToBIOS - POP AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS + PUSH HL ;число головок, число секторов (на целиндр) + PUSH DE ;количество цилиндров + EXX + POP HL ;количество цилиндров + POP BC ;число секторов (на целиндр) + LD D,0 + LD E,B ;число головок + LD B,D + EXX - PUSH HL ;число головок, число секторов (на целиндр) - PUSH DE ;количество цилиндров - EXX - POP HL ;количество цилиндров - POP BC ;число секторов (на целиндр) - LD D,0 - LD E,B ;число головок - LD B,D - EXX + LD A,L - LD A,L + RRA + JR C,.end +.loopShift: SLA E + RL D + RRA + JR NC,.loopShift + ; +.end: EX AF,AF' + POP AF + EX AF,AF' + XOR A + LD L,A + LD H,L + LD C,A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,%10100000 + RET - RRA - JR C,.end -.loopShift: - SLA E - RL D - RRA - JR NC,.loopShift - ; -.end: EX AF,AF' - POP AF - EX AF,AF' - XOR A - LD L,A - LD H,L - LD C,A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD A,%10100000 - RET - ; !TODO ; !FIXIT -; .RSETPRM: -; AND A -; RET - -GET_RAMDRV_NUM: - LD BC,RAMDTBL -.skip_tbl: - ADD A,A - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - ;INC BC - LD A,(BC) - OR #60 ;!HARDCODE сделать номера разных устройств через метки - RET -; - -; -;TEST_DB_DEL_ME: DB 'Make here more than one page to load test' -; +; .RSETPRM: AND A +; RET +GET_RAMDRV_NUM: LD BC,RAMDTBL +.skip_tbl: ADD A,A + ADD A,C + LD C,A + LD A,0 + ADC A,B + LD B,A + ;INC BC + LD A,(BC) + OR #60 ;!HARDCODE сделать номера разных устройств через метки + RET ; ;ENDDRVR EQU $ ; \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index eebde92..e73e9f8 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit eebde92dd60cdf33588e34a7248413ec107edfe0 +Subproject commit e73e9f8d4f4e72de4f6b54abaec159684fdcebe1 From a6831e5ca3b9a3e9ab0e5cc3255e3bd3999931c3 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 27 Oct 2024 00:43:21 +1000 Subject: [PATCH 174/219] ... --- DSS/API/Find.asm | 83 ++++++++++++++++++--------------------- DSS/API/GetMem.asm | 2 - DSS/API/Read.asm | 2 + DSS/DSS-MAIN.ASM | 4 +- DSS/VIDEO.ASM | 4 +- SHELL/Commands/Reboot.asm | 2 +- Shared_Includes | 2 +- 7 files changed, 47 insertions(+), 52 deletions(-) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index b25fa19..6b06b7e 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -39,50 +39,45 @@ F_FIRST: CALL .INIT_VARS CALL SEARCH.Custom RET C LD HL,MASKARE -.DTABUF+1: - LD DE,0 - LD BC,11 ;!HARDCODE - LDIR -.TMP+1: LD A,0 - LD (DE),A -.FIND_S: - INC DE - ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes - LD BC,FAT_DIRECTORY_RECORD - ADD IX,BC - LD (F_NEXT.CURHND),IX - LD HL,HANDBUF+12 ;!HARDCODE - LD BC,HANDBUF.SIZE-12 ;????? метку вместо числа? - LDIR - LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) - LD (DE),A - INC DE - LD HL,HANDBUF -.FNDMODE+1: - LD A,0 - OR A - JR NZ,.FIND_M2 - LD BC,11 ;!HARDCODE - LDIR -.exit: LD A,F_NEXT.NO_NEXT.NO - LD (F_NEXT.NO_NEXT),A - XOR A - RET -.FIND_M2: - ;!TODO LFN - ;CP 2 - ;CALL NC,GetName_LFN - ;CALL C,GetName - ; - CALL GetName - JR .exit - ; -.INIT_VARS: - LD (.TMP),A - LD (.DTABUF),DE - LD A,B - LD (.FNDMODE),A - RET +.DTABUF+1: LD DE,0 + LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT + LDIR +.TMP+1: LD A,0 + LD (DE),A +.FIND_S: INC DE + ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes + LD BC,FAT_DIRECTORY_RECORD + ADD IX,BC + LD (F_NEXT.CURHND),IX + LD HL,HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT + LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT + LDIR + LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) + LD (DE),A + INC DE + LD HL,HANDBUF +.FNDMODE+1: LD A,0 + OR A + JR NZ,.FIND_M2 + LD BC,11 ;!HARDCODE + LDIR +.exit: LD A,F_NEXT.NO_NEXT.NO + LD (F_NEXT.NO_NEXT),A + XOR A + RET +.FIND_M2: ;!TODO LFN + ;CP 2 + ;CALL NC,GetName_LFN + ;CALL C,GetName + ; + CALL GetName + JR .exit + ; +.INIT_VARS: LD (.TMP),A + LD (.DTABUF),DE + LD A,B + LD (.FNDMODE),A + RET //////////////////////////////////////////////////////////////////////// ; ; diff --git a/DSS/API/GetMem.asm b/DSS/API/GetMem.asm index 9d30112..42e5ff3 100644 --- a/DSS/API/GetMem.asm +++ b/DSS/API/GetMem.asm @@ -11,11 +11,9 @@ GETMEM: LD C,BIOS.GetMem LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY RET C LD D,#00 - ;LD HL,MEMTAB ; массив списка выдел. страниц LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц ADD HL,DE LD A,(TASK) ; уровень текущей программы LD (HL),A LD A,E - ;AND A RET \ No newline at end of file diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index 9ca4bae..de82ab2 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -22,6 +22,7 @@ READ: LD (.R_POINT),HL PUSH BC SRL B JR Z,.ROV2 + ; чтение сразу в буфер пользователя LD (.SECTORH),HL LD (.SECTORL),DE .R_POINT+2: LD IX,0 @@ -49,6 +50,7 @@ READ: LD (.R_POINT),HL LD B,A OR C JP Z,.ROV6 + ; чтение через буфер DSS, если размер данных < 512 PUSH BC LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 6b2f37a..e3ba28f 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -421,10 +421,10 @@ CHECK_64kb_CLUSTER: ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS -BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE +BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE HANDBUF: BLOCK HANDBUF.SIZE,0 ; - +; ; FAT_DIRECTORY_RECORD ; !HARDCODE MASKARE: BLOCK 8,0 ; имя файла BLOCK 3,0 ; расш. BLOCK 21,0 ; 11+21=32 diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 9aa6285..f1bdb0a 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -658,7 +658,7 @@ BACKTXT: PUSH AF .VMODE+1: LD A,#00 ;BIT 7,A CP %1000'0000 - JR C,NOBACKT + JR C,.NOBACKT ; PUSH BC PUSH DE @@ -688,7 +688,7 @@ BACKTXT: PUSH AF POP HL POP DE POP BC -NOBACKT: POP AF +.NOBACKT: POP AF RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; diff --git a/SHELL/Commands/Reboot.asm b/SHELL/Commands/Reboot.asm index d2a8d66..334eca3 100644 --- a/SHELL/Commands/Reboot.asm +++ b/SHELL/Commands/Reboot.asm @@ -2,7 +2,7 @@ cmd_reboot: DI LD C,BIOS.FullInit RST ToBIOS - LD BC,2*256 + BIOS.REINIT + LD BC,BIOS.REINIT.SOFT_RESET RST ToBIOS DI diff --git a/Shared_Includes b/Shared_Includes index e73e9f8..45fe79a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e73e9f8d4f4e72de4f6b54abaec159684fdcebe1 +Subproject commit 45fe79a0873c933a549e7f1764a6f1f6607f6fb1 From 522450867982152709874ae6051b03b5e414d7b2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 27 Oct 2024 00:54:14 +1000 Subject: [PATCH 175/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 45fe79a..9da9ff9 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 45fe79a0873c933a549e7f1764a6f1f6607f6fb1 +Subproject commit 9da9ff91271f330acf2c2394fcda94c20c746276 From 5a191e709d00630b957719624c9dd75929fd9c7b Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 27 Oct 2024 02:18:01 +1000 Subject: [PATCH 176/219] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 9da9ff9..710aa4b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9da9ff91271f330acf2c2394fcda94c20c746276 +Subproject commit 710aa4b5dd4b651bcb01ef5e86150b99dfe739ee From f580b601109c6838d54769e959a551d5efda9fbf Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 4 Dec 2024 22:16:28 +1000 Subject: [PATCH 177/219] ... --- DSS/API/Find.asm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 6b06b7e..3aeef59 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -35,14 +35,15 @@ F_FIRST: CALL .INIT_VARS RET C CALL MASK RET C - LD A,(.TMP) + LD A,(.SEARCH_ATTRIBUT) CALL SEARCH.Custom RET C LD HL,MASKARE .DTABUF+1: LD DE,0 LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT LDIR -.TMP+1: LD A,0 +.SEARCH_ATTRIBUT+1: + LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT LD (DE),A .FIND_S: INC DE ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes @@ -73,7 +74,7 @@ F_FIRST: CALL .INIT_VARS CALL GetName JR .exit ; -.INIT_VARS: LD (.TMP),A +.INIT_VARS: LD (.SEARCH_ATTRIBUT),A LD (.DTABUF),DE LD A,B LD (.FNDMODE),A From c82b010f1e4feebcc29d498363f58773b7a34594 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 4 Dec 2024 22:18:39 +1000 Subject: [PATCH 178/219] prepare --- DSS/drivers/media/ATAPI/CDX.ASM | 524 +++++++++ DSS/drivers/media/ATAPI/CDX.TXT | 7 + DSS/drivers/media/ATAPI/CMDPARSE.ASM | 89 ++ DSS/drivers/media/ATAPI/COMMAND.ASM | 942 +++++++++++++++ DSS/drivers/media/ATAPI/Cd_dos.asm | 1212 ++++++++++++++++++++ DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM | 525 +++++++++ DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm | 372 ++++++ DSS/drivers/media/ATAPI/Hidden/Cdriver.asm | 356 ++++++ DSS/drivers/media/ATAPI/Hidden/DSS.INC | 104 ++ DSS/drivers/media/ATAPI/Hidden/DUMP.TXT | 6 + DSS/drivers/media/ReScanDRV.ASM | 495 -------- DSS/drivers/media/fdd-drv.asm | 417 ------- DSS/drivers/media/ide-drv.asm | 715 ------------ DSS/drivers/media/ram_disk-drv.asm | 533 --------- DSS/drivers/media/shared-drv.asm | 290 ----- 15 files changed, 4137 insertions(+), 2450 deletions(-) create mode 100644 DSS/drivers/media/ATAPI/CDX.ASM create mode 100644 DSS/drivers/media/ATAPI/CDX.TXT create mode 100644 DSS/drivers/media/ATAPI/CMDPARSE.ASM create mode 100644 DSS/drivers/media/ATAPI/COMMAND.ASM create mode 100644 DSS/drivers/media/ATAPI/Cd_dos.asm create mode 100644 DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM create mode 100644 DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm create mode 100644 DSS/drivers/media/ATAPI/Hidden/Cdriver.asm create mode 100644 DSS/drivers/media/ATAPI/Hidden/DSS.INC create mode 100644 DSS/drivers/media/ATAPI/Hidden/DUMP.TXT delete mode 100644 DSS/drivers/media/ReScanDRV.ASM delete mode 100644 DSS/drivers/media/fdd-drv.asm delete mode 100644 DSS/drivers/media/ide-drv.asm delete mode 100644 DSS/drivers/media/ram_disk-drv.asm delete mode 100644 DSS/drivers/media/shared-drv.asm diff --git a/DSS/drivers/media/ATAPI/CDX.ASM b/DSS/drivers/media/ATAPI/CDX.ASM new file mode 100644 index 0000000..cac2242 --- /dev/null +++ b/DSS/drivers/media/ATAPI/CDX.ASM @@ -0,0 +1,524 @@ +;[BEGIN] +; +; CDX.EXE [command] [-switches] [directory] +; +;commands: +; OPEN +; EJECT +; CLOSE +; COPY +; LIST +; DUMP +; COMMAND +; -h,? Help page + + DEFINE _MAME 1 + + +CR EQU 13 +LF EQU 10 + + INCLUDE "Shared_Includes/constants/BIOS_equ.inc" + INCLUDE "Shared_Includes/constants/dss_equ.inc" + INCLUDE "Shared_Includes/constants/Sp2000.inc" + + + ORG #8100-22 + + DB "EXE" ;EXE ID + DB #00 ;EXE VERSION + DW #0016 ;CODE OFFSET LOW + DW #0000 ;CODE OFFSET HIGH + DW #0000 ;END-BEG ;PRIMARY LOADER + DW #0000 ; + DW #0000 ;RESERVED + DW #0000 ; + DW START ;LOAD ADDRESS + DW START ;START ADDRESS + DW #BFFF ;STACK ADDRESS + ;DS 490 + +START: PUSH IX + ; + XOR A + ; + ; LD HL,BUF1 + ; LD (HL),A + ; LD DE,BUF1+1 + ; LD BC,BUFFERS_END-1 + ; LDIR + ; + LD HL,'\' ; + LD (DIRSPEC),HL + ; + LD HL,BUF1 + LD B,BUFERS_NUMBER +.initBuffersLoop: + LD (HL),A + INC H + DJNZ .initBuffersLoop + ; + + LD A,MSG_HELLO + CALL MESSAGE + ; + CALL INIT + JR NC,.next + ; + LD HL,PRM1 + LD (HL),0 + LD A,MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + ; +.next: LD C,Dss.Version + RST ToDSS ;GET DSS VERSION + EX DE,HL + AND A + LD DE,#0146 ;1.70 + SBC HL,DE ;CHECK DSS VERSION + POP HL + ; + JP C,OLD_DSS + LD IX,BUF_PTRS + CALL EX_COMMAND_LINE + + CALL MALLOC + JR C,QUIT + + ;CALL FIND_CDROM + LD A,(STOPMODE) + OR A + CALL Z,COMMAND + + CALL MDEALLOC +QUIT: CALL CRLF +.loop: LD BC,Dss.Exit + RST ToDSS + JP .loop + +OLD_DSS + LD A,MSG_OLD_DSS + CALL MESSAGE + JR QUIT + +HNDMEM DB #FF + +MALLOC + LD BC,2*256 + Dss.GetMem + RST ToDSS + JR NC,M_ALLOK + LD A,MSG_MEMERROR + CALL MESSAGE + SCF + RET +M_ALLOK + LD (HNDMEM),A + LD BC,1*256 + Dss.SetWin3 + RST ToDSS + LD HL,BANKTBL + LD C,BIOS.GetMemBlkPages + LD A,(HNDMEM) + JP ToBIOS + +MDEALLOC + LD A,(HNDMEM) + LD C,Dss.FreeMem + JP ToDSS + +; FIND_CDROM +; LD IX,DEV_CFG +; LD C,BIOS.DRV_LIST +; RST ToBIOS +; LD A,(IX+3) ;CDROM +; OR A +; JR Z,W_O_CD +; LD A,(CDDRIVE) +; INC A +; RET NZ +; LD A,SLAVE ;DEFAULT +; LD (CDDRIVE),A +; RET +; W_O_CD LD A,MSG_NO_CDROM +; CALL MESSAGE +; LD A,1 +; LD (STOPMODE),A +; SCF +; RET + +;BUF_PRINT +; LD HL,BUF_PTRS +;BUF_PL LD E,(HL) +; INC HL +; LD D,(HL) +; INC HL +; LD A,D +; OR E +; RET Z +; PUSH HL +; EX DE,HL +; LD C,Dss.PCHARS +; RST ToDSS +; CALL CRLF +; POP HL +; JR BUF_PL + +;OPEN_FILE +; LD HL,FILENAME +; XOR A +; LD C,Dss.OPEN +; RST ToDSS +; LD (FILEHND),A +; RET NC +; LD HL,FILENAME +; CALL PUTVAR +; LD A,MSG_CANT_OPEN +; CALL MESSAGE +; SCF +; RET + +;CLOSE_FILE +; LD A,(FILEHND) +; LD C,Dss.CLOSE +; RST ToDSS +; RET + +INIT: XOR A + LD (STOPMODE),A + DEC A + LD (CDDRIVE),A + ; + LD BC,+(#C0-1)*256 + BIOS.DRV_DETECT +.loop: INC B + LD A,B + CP #C4 + SCF + RET Z + PUSH BC + RST ToBIOS + POP BC + JR C,.loop + LD A,B + LD (CDDRIVE),A + RET + ; + ; LD C,BIOS.DRV_RESET + ; JP ToBIOS +; RET + +;VARIABLES + +; FILENAME DS 256 +; FILEHND DB #FF + +STOPMODE DB #00 + + INCLUDE "cmdparse.asm" + INCLUDE "command.asm" + INCLUDE "cd_dos.asm" + +CRLF: PUSH HL + LD HL,MSG0.crlf + LD C,Dss.PChars + ; LD A,#0D + ; LD C,Dss.PutChar + ; RST #10 + ; LD A,#0A + ; LD C,Dss.PutChar + RST ToDSS + POP HL + RET +; + +ERROR CP MAX_DSS_ERR + LD E,A + LD D,0 + JP C,ERR_MSG + LD E,D + JP ERR_MSG + +ERR_MSG PUSH DE + LD HL,ERRCDX + CALL PRINTZ + POP DE + CALL FMESAGE + CALL PRINTZ + CALL CRLF + JP CRLF + + +FMESAGE INC DE + LD HL,ERR0 + LD BC,ERR0.Size +LCPIR XOR A + CPIR + RET PO + RET NZ + DEC DE + LD A,D + OR E + JP NZ,LCPIR + RET + +MAX_DSS_ERR EQU 33 + +ERRCDX DB "CDX: ",0 + + include 'Shared_includes/constants/dss_errors.z80' +; ERR0 DB #00 +; DB "Unknown error",0 +; DB "Invalid function",0 +; DB "Invalid drive number",0 +; DB "File not found",0 +; DB "Path not found",0 +; DB "Invalid handle",0 +; DB "Extended error 6",0 +; DB "File exist",0 +; DB "File read only",0 +; DB "Root overflow",0 +; DB "No free space",0 +; DB "Directory not empty",0 +; DB "Can't delete current directory",0 +; DB "Invalid media",0 +; DB "Unknown operation",0 ;R02 +; DB "Directory exist",0 +; DB "Invalid filename",0 +; DB "Invalid EXE-file",0 +; DB "Not supported EXE-file",0 +; DB "Access denied",0 +; DB "Not ready",0 +; DB "Seek error",0 +; DB "Sector not found",0 +; DB "CRC error",0 +; DB "Write protect",0 +; DB "Read error",0 +; DB "Write error",0 +; DB "Drive failure",0 +; DB "Extended error 28",0 +; DB "Extended error 29",0 +; DB "No free memory",0 +; DB "Invalid memory block",0 +; DB "Extended error 32",0 +; DB "Extended error 33",0 +; DB "Extended error 34",0 +; DB "35",0 +; DB "36",0 +; DB "37",0 +; DB "38",0 +; DB "39",0 +; DB "40",0 +; DB "41",0 +; DB "42",0 +; DB "43",0 +; DB "44",0 +; DB "45",0 +; DB "46",0 +; DB "47",0 +; DB "48",0 +; DB "49",0 +; DB "50" +; DB 0 +; ERR1 + +;FIND_MESSAGE + ; LD E,A + ; LD D,0 + ; CALL MESAGE + ; RET +MESSAGE LD E,A + LD D,0 + CALL MESAGE + JP PRINTZ +; + +MESAGE INC DE + LD HL,MSG0 + LD BC,MSG1-MSG0 +LCPIR2 XOR A + CPIR + RET PO + RET NZ + DEC DE + LD A,D + OR E + JP NZ,LCPIR2 + RET + +PRINTZ LD A,(HL) + INC HL + OR A + RET Z + CP "%" + JR NZ,PRINTZ2 + LD A,(HL) + INC HL + SUB "1" + PUSH HL + LD L,A + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,PRM1 + ADD HL,BC + LD C,Dss.PChars + RST ToDSS + POP HL + JR PRINTZ +PRINTZ2 LD C,Dss.PutChar + RST ToDSS + JP PRINTZ + +PRINT_ LD BC,1*256 + BIOS.LP_PRINT_SYM + JP ToBIOS + +PUTVAR LD DE,PRM1 +PUTPRM LD BC,15 +PUTPRMA LD A,(HL) + LDI + RET PO + OR A + JR NZ,PUTPRMA + RET + +CDDRIVE DB #FF + +PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +MSG_HELLO EQU 0 +MSG_TRAY_OPEN EQU 1 +MSG_TRAY_CLOSE EQU 2 +MSG_USAGE EQU 3 +MSG_UNK_DEVICE_NUMBER EQU 4 +MSG_UNK_COMMAND EQU 5 +;MSG_DISABLED EQU 6 +;MSG_ENABLED EQU 7 +MSG_DONE EQU 6 ;8 +MSG_NO_CDROM EQU 7 ;9 +MSG_IO_ERROR EQU 8 ;10 +MSG_OLD_DSS EQU 9 ;11 +MSG_COPYFILE EQU 10 ;12 +MSG_DIRHEAD EQU 11 ;13 +MSG_DIRENTRY EQU 12 ;14 +MSG_MEMERROR EQU 13 ;15 +MSG_COPYTO EQU 14 ;16 +MSG_CD_READ_ERR EQU 15 ;17 +MSG_F_WRITE_ERR EQU 16 ;18 +MSG_FAILURE EQU 17 ;19 +MSG_ERR_DEST EQU 18 ;20 +MSG_COPYABORTED EQU 19 ;21 + +MSG0 BYTE 0 +;0 + BYTE "CDROM eXtension utility v1.01, 2023 (c) Sprinter Team",CR,LF + DZ "Type CDX.EXE -? for help.",CR,LF,CR,LF +;1 + DZ "Opening tray..." +;2 + DZ "Closing tray..." + ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 +;3 + BYTE ' Usage: CDX.EXE [-switches] [command] [param1] [param2]',CR,LF,CR,LF + BYTE 'Commands:',CR,LF + BYTE ' CDX.EXE OPEN - Open tray',CR,LF + BYTE ' CDX.EXE CLOSE - Close tray',CR,LF + BYTE ' CDX.EXE LIST [\cd_path\][pattern] - Show CDROM filelist',CR,LF + BYTE ' CDX.EXE COPY \source d:\destination\ - Copy file(s) from CDROM to another disk',CR,LF + BYTE ' CDX.EXE DUMP sector [offset] - Show sector dump from CDROM',CR,LF + BYTE CR,LF + BYTE 'Switches:',CR,LF + BYTE ' -1 CDROM installed as Primary IDE Master device',CR,LF + BYTE ' -2 CDROM installed as Primary IDE Slave device',CR,LF + BYTE ' -3 CDROM installed as Secondary IDE Master device',CR,LF + BYTE ' -4 CDROM installed as Secondary IDE Slave device',CR,LF + DZ ' -h,? Help page',CR,LF +;4 + DZ " Error: Unknown device number %1",CR,LF +;5 + DZ " Error: Unknown command: %1",CR,LF + ;6 + ;DZ "Disabled" + ;7 + ;DZ "Enabled" +;6 + DZ "Done!",CR,LF +;7 + DZ " Error: Can't find CDROM device %1",CR,LF +;8 + DZ " Error: I/O Error",CR,LF +;9 + DZ " Error: Need DSS version 1.70 or higher",CR,LF +;10 + DZ "Copying " +;11 + DZ "Directory of CDROM:" +;12 FILENAME EXT SIZE DATE TIME + DZ "%1 %2 %3 %4 %5",CR,LF +;13 + DZ " Error: Memory allocation error",CR,LF +;14 + DZ " to " +;15 + DZ " Error: Reading failure",CR,LF +;16 + DZ " Error: Writing failure",CR,LF +;17 + DZ "Failure!",CR,LF +;18 + DZ " Error: Can't open destination file",CR,LF +;19 + DZ "Copying aborted",CR,LF +;20 +.crlf: DZ CR,LF +;21 + BYTE 0 +MSG1 + +BUF_PTRS + DW BUF1,BUF2,BUF3,BUF4,0 + +;-------------------------------/BUFFERS\-------------------------------; +FF_STRUCT: + DB "12345678" + DB "123" + DB #00 + DW 0,0,0,0 +CDFPOSH DW 0 ;CLUSTER HIGH +CDFTIME DW 0 ;TIME +CDFDATE DW 0 ;DATE +CDFPOSL DW 0 ;CLUSTER +CDFSIZE DW 0,0 ;SIZE +CDFATTR DB #00 ;ATTR +CDFNAME DB "12345678123",0 +; +BUFFERS_START EQU $ + ;DS 256-($-FF_STRUCT) + +DIRSPEC: EQU FF_STRUCT+256 + ;DB '\',0 + ;DS 254 +BUF1 EQU DIRSPEC+256 +BUF2 EQU DIRSPEC+256+256 +BUF3 EQU DIRSPEC+256+256+256 +BUF4 EQU DIRSPEC+256+256+256+256 +ARGCBUF EQU DIRSPEC+256+256+256+256+256 +DUMPBUF EQU DIRSPEC+256+256+256+256+256+256 +BUFFERS_END EQU DUMPBUF+2048-BUFFERS_START +; +BUFERS_NUMBER EQU 6 +; + ASSERT (DUMPBUF+2048 < #C000), "NO FREE SPACE FOR BUFFERS" +;-----------------------------------------------------------------------; +DEV_CFG +;[END] diff --git a/DSS/drivers/media/ATAPI/CDX.TXT b/DSS/drivers/media/ATAPI/CDX.TXT new file mode 100644 index 0000000..92da5ac --- /dev/null +++ b/DSS/drivers/media/ATAPI/CDX.TXT @@ -0,0 +1,7 @@ + + CDROM eXtension utility version 1.01 + ------------------------------------------------ + + It's utility came for solving the problem with support CDROM in DSS ver 1.x. +It's allow browse and copy files that stored on your CD. Also utility has commands +for tray control. \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/CMDPARSE.ASM b/DSS/drivers/media/ATAPI/CMDPARSE.ASM new file mode 100644 index 0000000..0b23d08 --- /dev/null +++ b/DSS/drivers/media/ATAPI/CMDPARSE.ASM @@ -0,0 +1,89 @@ + +; HL - exe-prefix +; IX - pointers at work buffers +EX_COMMAND_LINE + INC HL +NEXTPR LD DE,ARGCBUF + LD BC,Dss.EX_Path.GSWITCH + RST ToDSS + PUSH AF + PUSH HL + LD A,(ARGCBUF) + OR A + JR Z,EOCL ;end of command line + CP "-" + JR Z,ITCKEY + CP "/" + JR Z,ITCKEY + LD HL,ARGCBUF + LD E,(IX+0) + LD D,(IX+1) + INC IX + INC IX + LD A,D + OR E + JR Z,CL_FAILURE +; LD A,1 +; LD (NAME_FLG),A +MOVNAME LD A,(HL) + LDI + OR A + JR NZ,MOVNAME +EOCL POP HL + POP AF + JR NC,NEXTPR + RET + +CL_FAILURE + POP HL + POP AF + RET + +ITCKEY: LD A,(ARGCBUF+1) + CP "5" + JR NC,.HELP + CP "1" + JR NC,.number + ; ERROR + LD HL,ARGCBUF+1 + CALL PUTVAR + LD A,MSG_UNK_DEVICE_NUMBER + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR EOCL + ; +.number:; + SUB A,'1' + OR #C0 + LD (CDDRIVE),A + LD C,BIOS.DRV_RESET + RST ToBIOS + JR NC,EOCL + ; + LD HL,ARGCBUF+1 + CALL PUTVAR + LD A,MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + SCF + JR CL_FAILURE + ; +.HELP: LD A,MSG_USAGE + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR EOCL + + + +; MAS_CD: +; ;LD A,MASTER +; ;LD (CDDRIVE),A +; JR EOCL + +; SLA_CD: +; ;LD A,SLAVE +; ;LD (CDDRIVE),A +; JR EOCL diff --git a/DSS/drivers/media/ATAPI/COMMAND.ASM b/DSS/drivers/media/ATAPI/COMMAND.ASM new file mode 100644 index 0000000..ccd493d --- /dev/null +++ b/DSS/drivers/media/ATAPI/COMMAND.ASM @@ -0,0 +1,942 @@ + +COMMAND LD HL,BUF1 + LD A,(HL) + OR A + RET Z + DEC HL +SKIPSP INC HL + LD A,(HL) + CP 9 + JR Z,SKIPSP + CP " " + JR Z,SKIPSP +COMP01 LD D,H + LD E,L + XOR A + LD BC,255 + CPIR + LD A,254 + SUB C + LD C,A + LD HL,CMDLIST +COMP004 PUSH BC + PUSH DE +COMP000 LD A,(DE) + CP #61 + JP C,COMP001 + CP #7B + JP NC,COMP001 + SUB #20 +COMP001 CP (HL) + JP NZ,COMP002 + INC HL + INC DE + DEC C + JP NZ,COMP000 + XOR A + CP (HL) + JP NZ,COMP002 + POP BC + POP BC + LD A,(DE) + CP " " + JR NZ,NOSPC + INC DE +NOSPC INC HL + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + JP (HL) + +COMP002 XOR A + LD C,#FF + CPI + JP NZ,$-2 + INC HL + INC HL + POP DE + POP BC + LD A,(HL) + OR A + JP NZ,COMP004 + LD HL,BUF1 + CALL PUTVAR + LD A,MSG_UNK_COMMAND + CALL MESSAGE + SCF + RET + +CMDLIST DB "CLOSE",0 + DW CCLOSE + DB "COPY",0 + DW CCOPY + DB "DUMP",0 + DW CDUMP + DB "EJECT",0 + DW COPEN + DB "HELP",0 + DW CHELP + DB "LIST",0 + DW CDIR + DB "OPEN",0 + DW COPEN + DB "SECTORDUMP",0 + DW CDUMP + DB 0 + +CHELP: LD A,MSG_USAGE + JP MESSAGE + +CCLOSE: LD A,MSG_TRAY_CLOSE + CALL MESSAGE + LD A,(CDDRIVE) + LD BC,BIOS.DRV_EXTENDED.CD_Close + RST ToBIOS + LD A,MSG_DONE + JP MESSAGE + +COPEN: LD A,MSG_TRAY_OPEN + CALL MESSAGE + LD A,(CDDRIVE) + LD BC,BIOS.DRV_EXTENDED.CD_Eject + RST ToBIOS + LD A,MSG_DONE + JP MESSAGE + + +CCOPY: CALL CHANGEDISK + JR NC,.CH2OK + JP ERROR +.CH2OK: CALL EX_COPY_PARAM + LD HL,BUF2 + LD DE,FF_STRUCT + LD A,FAT_ATTR.NoDIRnoVolID + LD B,1 + CALL F_FIRST + JP C,ERROR +.COPIER: + CALL MAKECOPY + RET C + LD A,(COPYMODE) + BIT DSTFILE,A + RET NZ +; + LD C,Dss.ScanKey + RST ToDSS + JR Z,.NONSTOP + LD HL,#011B ;ESC + AND A + SBC HL,DE + JR NZ,.NONSTOP + LD A,MSG_COPYABORTED + CALL MESSAGE + SCF + RET +.NONSTOP: + LD DE,FF_STRUCT + CALL F_NEXT + JR NC,.COPIER + XOR A + RET + +; IFNOTFOUND +; CALL ERROR +; RET + +;IFOK +MAKECOPY: + LD A,(COPYMODE) + BIT SRCPATT,A + JR NZ,.WITH_SRC_PATT + BIT DSTFILE,A + JR NZ,.WITH_DST_FILE +.WITH_SRC_PATT: + LD HL,CDFNAME +.YCR1: LD A,(HL) + CP "A" + JR C,.NCR1 + CP "Z"+1 + JR NC,.NCR1 + ADD A,#20 + LD (HL),A +.NCR1: OR A + INC HL + JR NZ,.YCR1 +; + LD HL,CDFNAME + LD DE,(SRC_PUT_ADR) +.CZSL2: LD A,(HL) + LDI + OR A + JR NZ,.CZSL2 +; + LD A,(COPYMODE) + BIT DSTFILE,A + JR NZ,.WITH_DST_FILE +; + LD HL,CDFNAME + LD DE,(DST_PUT_ADR) +.CZSL1: LD A,(HL) + LDI + OR A + JR NZ,.CZSL1 +; +.WITH_DST_FILE: + LD HL,BUF3 + LD A,(CDFATTR) + LD C,Dss.Create + RST ToDSS + JR NC,.OFOK + LD A,MSG_ERR_DEST + CALL MESSAGE + SCF + RET + ; +.OFOK: LD (FHND),A + LD A,MSG_COPYFILE + CALL MESSAGE + LD HL,BUF2 + LD C,Dss.PChars + RST ToDSS + LD A,MSG_COPYTO + CALL MESSAGE + LD HL,BUF3 + LD C,Dss.PChars + RST ToDSS + LD A," " + LD C,Dss.PutChar + RST ToDSS + LD IX,FF_STRUCT + + LD E,(IX+LEN1) + LD D,(IX+LEN2) + LD (CL_SIZE),DE + LD E,(IX+LEN3) + LD D,(IX+LEN4) + LD (CH_SIZE),DE + + LD E,(IX+CLU1) + LD D,(IX+CLU2) + LD (CL_OFFSET),DE + LD E,(IX+CLU3) + LD D,(IX+CLU4) + LD (CH_OFFSET),DE +.CDCOPY_LOOP: + CALL RCDFSB ;!!!!! + JR C,.COPY_FAULT + CALL WDATAB + JR C,.COPY_FAULT + JR NZ,.CDCOPY_LOOP +; + LD DE,(CDFTIME) + LD BC,(CDFDATE) + CALL RMKTIME + LD A,(FHND) + LD C,Dss.Put_D_T ;COPY DATE AND TIME + RST ToDSS +; + LD A,(FHND) + LD C,Dss.Close + RST ToDSS + LD A,MSG_DONE + CALL MESSAGE + AND A + RET +.COPY_FAULT: + LD A,(FHND) + LD C,Dss.Close + RST ToDSS + SCF + RET + +EX_COPY_PARAM + LD HL,BUF2 ;SOURCE + LD BC,255 + XOR A + CPIR + DEC HL + EX DE,HL + LD HL,256 + AND A + SBC HL,BC + LD B,H + LD C,L + EX DE,HL + LD A,'\' ; + CPDR + INC HL + INC HL + LD (SRC_PUT_ADR),HL +; + LD HL,BUF2 + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + AND #80 + LD A,(COPYMODE) + SET SRCPATT,A + JR NZ,.NOPATSR + RES SRCPATT,A +.NOPATSR: + LD (COPYMODE),A + LD HL,BUF3 ;DESTINATION + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + AND #81 ;PATTERN & FILENAME + CP #01 ;IF FILENAME=1 AND PATTERN=0 + LD A,(COPYMODE) + SET DSTFILE,A + JR Z,.SINGC1 + RES DSTFILE,A +.SINGC1: + LD (COPYMODE),A + RET Z + LD HL,BUF3 + LD BC,255 + XOR A + CPIR ;MOVE TO END OF STRING + DEC HL ;MOVE TO ZERO-CHAR + DEC HL ;MOVE TO LAST CHAR + LD A,(HL) ;GET LAST CHAR + INC HL ;MOVE TO ZERO-CHAR + CP '\' ;IS IT BACKSLASH? + LD (DST_PUT_ADR),HL ;SAVE END ADDRESS + RET Z + LD A,'\' ; + LD (HL),A ;PUT BACKSLASH TO THE END OF STRING + INC HL ;MOVE TO THE NEW END OF STRING + LD (DST_PUT_ADR),HL ;SAVE END ADDRESS + LD (HL),0 ;PUT ZERO CHAR + RET + +DSTFILE EQU 0 ;SPECIFIED DESTINATION FILENAME +SRCPATT EQU 3 ;SPECIFIED SOURCE PATTERN A??.* + +COPYMODE DB 0 + +SRC_PUT_ADR DW BUF2 +DST_PUT_ADR DW BUF3 + +CL_OFFSET DW 0 +CH_OFFSET DW 0 +CL_SIZE DW 0 +CH_SIZE DW 0 +BYTECOUNTER DW 0 + +WDATAB: LD DE,(BYTECOUNTER) + LD A,D + OR E + RET Z + LD HL,#C000 + LD A,(FHND) + LD C,Dss.Write + RST ToDSS + JR C,.WRDERR + XOR A + INC A + RET +.WRDERR: + LD A,MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,MSG_F_WRITE_ERR + CALL MESSAGE + XOR A + SCF + RET + +RCDFSB: LD HL,(CL_SIZE) + LD DE,(CH_SIZE) + LD A,H + OR L + OR D + OR E + LD BC,0 + LD (BYTECOUNTER),BC + RET Z ;SIZE = 0 + AND A + LD BC,#4000 ;BLOCKSIZE + SBC HL,BC + LD B,C + EX DE,HL + SBC HL,BC + EX DE,HL + LD BC,#4000 + JR NC,.RC_NOCAR +;CORRECT RESULT + ADD HL,BC + LD B,C + EX DE,HL + ADC HL,BC + EX DE,HL + LD B,H + LD C,L + LD HL,0 + LD DE,0 +.RC_NOCAR: + LD (CL_SIZE),HL + LD (CH_SIZE),DE + LD (BYTECOUNTER),BC + ; + LD A,B + SRL B + SRL B + SRL B + AND #07 + OR C + JR Z,.RC_EVEN_NUM + INC B +.RC_EVEN_NUM: + LD A,B + LD C,B + LD B,0 + ; + LD IX,(CL_OFFSET) + LD HL,(CH_OFFSET) + PUSH IX + PUSH HL + ADD IX,BC + LD C,B + ADC HL,BC + LD (CL_OFFSET),IX + LD (CH_OFFSET),HL + POP HL + POP IX + LD B,A + LD A,(CDDRIVE) + LD DE,#C000 + LD C,BIOS.DRV_READ + RST ToBIOS + LD BC,(BYTECOUNTER) + RET NC + LD A,MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,MSG_CD_READ_ERR + CALL MESSAGE + SCF + RET + + +FHND DB #FF + +;---------------------- +CDIR: CALL CHANGEDISK + JP C,ERROR + LD HL,BUF2 + LD A,(HL) + OR A + JR NZ,.NODEFD + LD HL,DEFDIR + JR .PATPRESNT +.NODEFD: + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + BIT 7,A ;PATTERN + LD HL,BUF2 + JR NZ,.PATPRESNT + ; + LD BC,255 + XOR A + CPIR ;MOVE TO END OF STRING + DEC HL ;MOVE TO ZERO-CHAR + DEC HL ;MOVE TO LAST CHAR + LD A,(HL) ;GET LAST CHAR + INC HL ;MOVE TO ZERO-CHAR + CP '\' ;IS IT BACKSLASH? + JR Z,.WITHSL9 + LD A,'\' ; + LD (HL),A ;PUT BACKSLASH TO THE END OF STRING + INC HL ;MOVE TO THE NEW END OF STRING +.WITHSL9: + LD A,"*" + LD (HL),A + INC HL + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD (HL),0 + LD HL,BUF2 +.PATPRESNT + LD DE,FF_STRUCT + LD A,FAT_ATTR.NoVolID + LD B,0 + CALL F_FIRST + JP C,ERROR +.CDIR_HEAD: + LD A,MSG_DIRHEAD + CALL MESSAGE + LD HL,DIRSPEC + LD C,Dss.PChars + RST ToDSS + CALL CRLF + CALL CRLF +.CDIR_LOOP: + LD HL,CDFNAME + CALL PNAME + LD DE,FF_STRUCT + CALL F_NEXT + JR NC,.CDIR_LOOP + RET + +; FF_STRUCT +; DB "12345678" +; DB "123" +; DB #00 +; DW 0,0,0,0 +; CDFPOSH DW 0 ;CLUSTER HIGH +; CDFTIME DW 0 ;TIME +; CDFDATE DW 0 ;DATE +; CDFPOSL DW 0 ;CLUSTER +; CDFSIZE DW 0,0 ;SIZE +; CDFATTR DB #00 ;ATTR +; CDFNAME DB "12345678123",0 +; ; DS 44 +; DS 256-($-FF_STRUCT) + +PNAME LD BC,8 + LD DE,PRM1 + LDIR + XOR A + LD (DE),A + LD DE,PRM2 + LDI + LDI + LDI + LD (DE),A + LD IX,FF_STRUCT + CALL PRNSIZE + CALL PRNDATE + CALL PRNTIME + LD A,MSG_DIRENTRY + JP MESSAGE + +PRNDATE LD B,(IX+25) + LD C,(IX+24) + LD HL,SIZEBFF + CALL DATE + LD (HL),0 + LD HL,SIZEBFF + LD DE,PRM4 + LD A,(HL) + CP "0" + JP NZ,PUTPRM + LD (HL),#20 + JP PUTPRM + +PRNTIME LD B,(IX+22) + LD C,(IX+23) + LD HL,SIZEBFF + CALL TIME + LD (HL),0 + LD HL,SIZEBFF + LD DE,PRM5 + LD A,(HL) + CP "0" + JP NZ,PUTPRM + LD (HL),#20 + JP PUTPRM + +TIME: SRL C + RR B + SRL C + RR B + SRL C + RR B + SRL B + SRL B + LD A,C + CALL NUMB + LD (HL),":" + INC HL + LD A,B + JP NUMB + +DATE: LD A,C + AND #1F + PUSH BC + CALL NUMB + LD (HL),"." + INC HL + POP BC + LD A,C + SRL B + RLA + RLA + RLA + RLA + AND #0F + CALL NUMB + LD (HL),"." + INC HL + LD A,B + ADD A,#50 + CP 100 + JP C,NUMB +.SUB100: + SUB 100 + CP 100 + JP C,NUMB + JR .SUB100 + +NUMB: LD C,#2F +.NUMB1: INC C + SUB 10 + JP NC,.NUMB1 + ADD A,10 + ADD A,#30 + LD (HL),C + INC HL + LD (HL),A + INC HL + RET + +PRNSIZE LD A,(IX+32) + LD HL,DIRIDD + AND #10 + JP NZ,.PRZ + LD L,(IX+28) + LD H,(IX+29) + EXX + LD L,(IX+30) + LD H,(IX+31) + EXX + PUSH IX + CALL MAKE_LN + LD HL,L32BIT_+9 + LD A,(HL) + CP #20 + JR NZ,.ALR + LD A,#30 + LD (HL),A +.ALR: LD DE,SIZEBFF + LD HL,L32BIT_;; +1 + LDI + LD A," " + LD (DE),A + INC DE + LDI + LDI + LDI + LD (DE),A + INC DE + LDI + LDI + LDI + LD (DE),A + INC DE + LDI + LDI + LDI + LD HL,SIZEBFF + POP IX +.PRZ: LD DE,PRM3 + JP PUTPRM + +MAKE_LN: + LD IX,L32BIT_ + EXX + LD DE,#3B9A ; 1000000000 + EXX + LD DE,#CA00 + CALL GET_DIG + EXX + LD DE,#05F5 ; 100000000 + EXX + LD DE,#E100 + CALL GET_DIG + EXX + LD DE,#0098 ; 10000000 + EXX + LD DE,#9680 + CALL GET_DIG + EXX + LD DE,#000F ; 1000000 + EXX + LD DE,#4240 + CALL GET_DIG + EXX + LD DE,#0001 ; 100000 + EXX + LD DE,#86A0 + CALL GET_DIG + EXX + LD DE,#0000 ; 10000 + EXX + LD DE,#2710 + CALL GET_DIG + EXX + LD DE,#0000 ; 1000 + EXX + LD DE,#03E8 + CALL GET_DIG + EXX + LD DE,#0000 ; 100 + EXX + LD DE,#0064 + CALL GET_DIG + EXX + LD DE,#0000 ; 10 + EXX + LD DE,#000A + CALL GET_DIG + LD A,L ; 1 + ADD A,#30 + LD (IX+0),A + INC IX + LD HL,L32BIT_ + LD DE,#2030 + ; +.KILLZ: LD A,(HL) + CP E + JR NZ,.KILLZ2 + LD (HL),D + INC HL + JP .KILLZ +.KILLZ2: + LD HL,L32BIT_+9 + LD A,(HL) + CP D + RET NZ + LD (HL),E + RET + +; HL:HL - DE:DE + +GET_DIG: + XOR A +.INC_DG: + INC A + SBC HL,DE + EXX + SBC HL,DE + EXX + JP NC,.INC_DG + ADD HL,DE + EXX + ADC HL,DE + EXX + DEC A + ADD A,#30 + LD (IX+0),A + INC IX + RET + +L32BIT_ DB "0000000000" + +DIRIDD DB " ",0 + +SIZEBFF DB "0 000 000 000",0,0 + +DEFDIR DB #5C,"*.*",0 + +;------------------------ + +CDUMP: LD HL,BUF2 + LD BC,#0000 + CALL GETNUM +; LD XL,C +; LD XH,0 +; LD HL,0 + LD A,(CDDRIVE) + LD DE,DUMPBUF + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + JR C,.DMPERR + ; + LD HL,BUF3 + CALL GETNUM + PUSH IX + POP BC + LD A,B + AND #07 + LD B,A + LD HL,2048-#01C0 + AND A + SBC HL,BC + JR NC,.GOODOFFS + LD BC,2048-#01C0 +.GOODOFFS: + LD HL,DUMPBUF + ADD HL,BC + ; + CALL DUMP + JP CRLF +.DMPERR: + LD A,MSG_IO_ERROR + JP MESSAGE + ; + +GETNUM: EXX + LD IX,0 + LD HL,0 + EXX +.GETNUM0: + LD A,(HL) + OR A + JR Z,.EGETN + INC HL + CP "0" + JR C,.GETNUM0 + CP "9"+1 + JR NC,.GETNUM0 + SUB "0" + ; + EXX + PUSH IX ; + PUSH HL + POP DE + POP BC ;LD DE:BC,HL:IX + ; + ADD IX,IX + ADC HL,HL ;x2 + ADD IX,IX + ADC HL,HL ;x4 + ADD IX,BC + ADC HL,DE ;x5 + ADD IX,IX + ADC HL,HL ;x10 + ; + LD C,A + LD B,0 + ADD IX,BC + LD C,B + ADC HL,BC + EXX + JR .GETNUM0 +.EGETN: EXX + ;PUSH IX + PUSH HL + EXX + POP HL + ;POP IX + RET +;;;;;;;;;;;;;;; +; LD A,(HL) +; OR A +; RET Z +; INC HL +; CP "0" +; JR C,GETNUM +; CP "9"+1 +; JR NC,GETNUM +; SUB "0" +; LD B,A +; +; LD A,C +; ADD A,A +; ADD A,A +; ADD A,C +; ADD A,A +; +; ADD A,B +; LD C,A +; JR GETNUM +;;;;;;;;;;;;;;;; + +UPDUMP: BYTE " +00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ",CR,LF + DZ " -------------------------------------------------- +----------------+" + + +DUMP: PUSH HL + LD HL,UPDUMP + LD C,Dss.PChars + RST ToDSS + POP HL + LD BC,#1C00 +.L1: PUSH BC + PUSH BC + CALL CRLF + ; + LD DE,DUMPBUF + AND A + SBC HL,DE + LD A,L + PUSH AF + LD A,H + ADD HL,DE + ; + CALL PHEX + POP AF + CALL PHEX + LD A,":" + CALL PRNCHAR + LD A," " + CALL PRNCHAR + LD A," " + CALL PRNCHAR + POP BC + PUSH HL + ; + LD B,#08 +.L2: PUSH BC + LD A,(HL) + INC HL + CALL PHEX + LD A," " + CALL PRNCHAR + POP BC + INC C + DJNZ .L2 + ; + LD A," " + CALL PRNCHAR + ; + LD B,#08 +.L2_00: PUSH BC + LD A,(HL) + INC HL + CALL PHEX + LD A," " + CALL PRNCHAR + POP BC + INC C + DJNZ .L2_00 + ; + LD A," " + CALL PRNCHAR + ; + LD A,"|" + CALL PRNCHAR + POP HL + LD B,#10 +.LLL: LD A,(HL) + INC HL + PUSH BC + CALL PRINT_ + POP BC + DJNZ .LLL + LD A,"|" + CALL PRNCHAR + ; + LD A,C + POP BC + LD C,A + DJNZ .L1 + RET + +PHEX: LD E,A + RRCA + RRCA + RRCA + RRCA + AND #0F + ADD A,#30 + CP #3A + JR C,.PHEX2 + ADD A,7 +.PHEX2: CALL PRINT_ + LD A,E + AND #0F + ADD A,#30 + CP #3A + JR C,.PHEX3 + ADD A,7 +.PHEX3: CALL PRINT_ + RET + +PRNCHAR: + LD C,Dss.PutChar + JP ToDSS +; \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/Cd_dos.asm b/DSS/drivers/media/ATAPI/Cd_dos.asm new file mode 100644 index 0000000..3dd5bc0 --- /dev/null +++ b/DSS/drivers/media/ATAPI/Cd_dos.asm @@ -0,0 +1,1212 @@ +PAGE0 EQU #82 ;WIN #0000-#3FFF +PAGE1 EQU #A2 ;WIN #4000-#7FFF +PAGE2 EQU #C2 ;WIN #8000-#BFFF +PAGE3 EQU #E2 ;WIN #C000-#FFFF + +DIR EQU #C000 + +DIRPAGE EQU 0 + +DAY EQU 19 +MONTH EQU 05 +YEAR EQU 2002 + +NAM EQU 0 +EXT EQU 8 +ATR EQU 11 + +CLU3 EQU 20 +CLU4 EQU 21 + +TIM1 EQU 22 +TIM2 EQU 23 +DAT1 EQU 24 +DAT2 EQU 25 +CLU1 EQU 26 +CLU2 EQU 27 +LEN1 EQU 28 +LEN2 EQU 29 +LEN3 EQU 30 +LEN4 EQU 31 +POS1 EQU 32 +POS2 EQU 33 +POS3 EQU 34 +POS4 EQU 35 +DIRCLU1 EQU 36 +DIRCLU2 EQU 37 +HND1 EQU 38 +HND2 EQU 39 +FDRV EQU 40 +AMODE EQU 41 +FTASK EQU 42 + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE + +;File Manipulator (FM) +FM_BUF DB ". " ;+00 NAME + DB " " ;+08 EXT + DB #10 ;+11 ATTRIBUT + DB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED + DW #0000 ;+22 TIME + DW #0000 ;+24 DATE + DW #0000 ;+26 START CLUSTER + DW #0000,#0000 ;+28 SIZE FILE + DW #0000,#0000 ;+32 FILE POSITION (FP) + DW #0000 ;+36 DIRECTORY CLUSTER + DW #0000 ;+38 HANDLE NUMBER + DB #00 ;+40 DRIVE OR CURRENT + DB #00 ;+41 ACCESS MODE + DB #00 ;+42 TASK + DB #00 ;+43 EMPTY +END_FM +;End of FM + DS 44*2 + +FM_SIZE EQU END_FM-FM_BUF + +SET_FM PUSH DE + INC A + LD IY,FM_BUF-FM_SIZE + LD DE,FM_SIZE +SET_FM1 ADD IY,DE + DEC A + JR NZ,SET_FM1 + POP DE + LD A,(IY+0) + OR A + LD A,0 + RET NZ + LD A,5 + SCF + RET + +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR + +MOVE_FP CALL SET_FM + RET C + INC B + DEC B + JP Z,MOVE_FA + DEC B + JP Z,MOVE_FB + DEC B + JP Z,MOVE_FC + LD A,1 + SCF + RET + +;from Start File +MOVE_FA LD BC,0 + LD DE,0 + JR MOVE_F1 + +;from End File +MOVE_FC LD C,(IY+28) + LD B,(IY+29) + LD E,(IY+30) + LD D,(IY+31) + JR MOVE_F1 + +;from Current Position +MOVE_FB LD C,(IY+32) + LD B,(IY+33) + LD E,(IY+34) + LD D,(IY+35) +MOVE_F1 ADD IX,BC + ADC HL,DE + LD D,XH + LD E,XL + LD (IY+32),E + LD (IY+33),D + LD (IY+34),L + LD (IY+35),H + XOR A + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE + +MOVE_CP LD L,(IY+28) + LD H,(IY+29) + LD E,(IY+32) + LD D,(IY+33) + AND A + SBC HL,DE + LD L,(IY+30) + LD H,(IY+31) + LD E,(IY+34) + LD D,(IY+35) + SBC HL,DE + RET + +CHANGEDISK + ;PUSH AF + LD A,(CDDRIVE) + LD C,BIOS.DRV_RESET + RST ToBIOS + ;POP BC + JP C,NDISK11 + ;LD A,B +; LD (DRIVE),A + CALL INITDISK + RET C +; LD A,(LDRIVE) + AND A + RET + +NDISK11 CP 2 + SCF +; RET Z + LD A,20 + SCF + RET + +INITDISK + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,4 +CD_I_LP PUSH BC + LD DE,DIR + LD A,(CDDRIVE) + LD HL,#0000 + LD IX,#0010 + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP BC + JR NC,CD_I_OK + DJNZ CD_I_LP +UNKCD POP AF + OUT (PAGE3),A + LD A,13 ;!HARDCODE sys error + SCF + RET + +CD_I_OK LD HL,DIR + LD A,(HL) + INC HL + CP #01 + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "C" + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "D" + JR NZ,UNKCD + LD HL,DIR+#009E + LD DE,ROOTDIR + LDI + LDI + LDI + LDI + LD HL,DIR+#00A6 + LD DE,ROOTLEN + LDI + LDI + LDI + LDI + POP AF + OUT (PAGE3),A +; LD HL,0 +; LD (FATCASH),HL + XOR A + RET + + +;---------------------------------------------- + +OPEN LD (ACCESS),A + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C +OPENEXE CALL SEARCH + RET C + LD A,1 ;; + CALL SET_FM ;; CALL GET_FM + RET C + LD A,C + EX AF,AF' + EXX + LD (IY+HND1),E + LD (IY+HND2),D + EXX + LD D,YH + LD E,YL + LD HL,HANDBUF + LD BC,#0020 + LDIR + LD A,(ACCESS) + LD (IY+AMODE),A +;; LD A,(TASK) + XOR A ;; + LD (IY+FTASK),A + XOR A + LD (IY+POS1),A + LD (IY+POS2),A + LD (IY+POS3),A + LD (IY+POS4),A +;; LD A,(DRIVE) +; XOR A ;; +; LD (IY+FDRV),A + LD HL,FM_BUF+CLU1 + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+DIRCLU1),E + LD (IY+DIRCLU2),D + + LD C,(IY+CLU1) + LD B,(IY+CLU2) + LD E,(IY+CLU3) + LD D,(IY+CLU4) + EX DE,HL + PUSH BC + POP IX + LD C,(IY+LEN1) + LD B,(IY+LEN2) + LD E,(IY+LEN3) + LD D,(IY+LEN4) + EX AF,AF' + AND A + RET + +;RET +; HL:IX - SECTOR +; DE:BC - SIZE IN BYTES + +;PATH0 DEFW #0000 + +ACCESS DEFB #00 + +HANDBUF DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +WRT_HND LD A,DIRPAGE + CALL BANK + PUSH AF + LD IX,DIR + EXX + LD DE,0 + EXX +WRT_HN1 LD A,(IX+00) + OR A + JR Z,WRT_HN2 + CP #E5 + JR Z,WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,WRT_HN1 + POP AF + OUT (PAGE3),A + LD A,9 + SCF + RET + +WRT_HN2 LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + LD HL,DIR + LD BC,(DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + RET NC + LD HL,(DIRSIZE) + LD BC,#0020 + ADD HL,BC + LD (DIRSIZE),HL + AND A + RET + +GETNAME LD BC,#08FF +GETN1 LD A,(HL) + CP " " + JR NZ,GETN3 +GETN2 INC HL + DJNZ GETN2 + JR GETN4 +GETN3 LDI + DJNZ GETN1 +GETN4 LD A,(HL) + CP " " + LD A,"." + JR NZ,GETN5 + LD A,#00 +GETN5 LD (DE),A + INC DE + RET Z + LD B,#03 +GETN6 LD A,(HL) + CP " " + RET Z + LDI + XOR A + LD (DE),A + DJNZ GETN6 + RET + +DTABUF DEFW #0000 +CURHND DEFW #0000 +NO_NEXT DEFB #00 +FNDMODE DEFB #00 + +F_FIRST LD (ACCESS),A + LD (DTABUF),DE + LD A,B + LD (FNDMODE),A + PUSH HL + CALL LOADDIR + POP HL + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + LD A,(ACCESS) + CALL ASEARCH + RET C + LD HL,MASKARE + LD DE,(DTABUF) + LD BC,11 + LDIR + LD A,(ACCESS) + LD (DE),A + INC DE +FIND_S LD BC,#0020 + ADD IX,BC + LD (CURHND),IX + LD HL,HANDBUF+12 + LD BC,20 + LDIR + LD A,(HANDBUF+11) + LD (DE),A + INC DE + LD HL,HANDBUF + LD A,(FNDMODE) + OR A + JR NZ,FIND_M2 + LD BC,11 + LDIR + LD A,#FF + LD (NO_NEXT),A + XOR A + RET +FIND_M2 CALL GETNAME + LD A,#FF + LD (NO_NEXT),A + XOR A + RET + +F_NEXT LD A,(NO_NEXT) + OR A + LD A,14 + SCF + RET Z + LD (DTABUF),DE + LD DE,MASKARE + LD HL,(DTABUF) + LD BC,11 + LDIR + LD A,(HL) + PUSH HL + CALL NSEARCH + POP DE + EX AF,AF' + XOR A + LD (NO_NEXT),A + EX AF,AF' + RET C + INC DE + JP FIND_S + +NSEARCH EX AF,AF' + LD A,DIRPAGE + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,(CURHND) + EXX + LD DE,0 + EXX + JP SEARCH1 + +DSEARCH LD A,#10 + CALL ASEARCH + RET NC + LD A,4 + RET + +SEARCH LD A,#23 +ASEARCH EX AF,AF' + LD A,DIRPAGE + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,DIR + EXX + LD DE,0 + EXX +SEARCH1 LD A,(IX+00) + OR A + JR Z,SEARCH4 + CP #E5 + JR Z,SEARCH3 + LD A,(IX+11) + AND C + JR NZ,SEARCH3 + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +SEARCH2 LD A,(DE) + CP "?" + JR Z,SEARCH5 + CP (HL) + JR NZ,SEARCH3 +SEARCH5 INC HL + INC DE + DJNZ SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + AND A + RET + +SEARCH3 EXX + INC DE + EXX + LD DE,#0020 + ADD IX,DE + JR NC,SEARCH1 +SEARCH4 POP AF + OUT (PAGE3),A + LD A,3 + SCF + RET + +GETWORD LD DE,TMPNAME + LD BC,#0DFF +GETWRD1 LD A,(HL) + INC HL + CP '\' ; + JR Z,DIRNAME + CP ":" + JR Z,DRVNAME + LD (DE),A + INC DE + CP #21 + CCF + RET NC + DJNZ GETWRD1 + LD A,16 + SCF + RET + +DIRNAME LD A,#00 + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + JP NC,GETWORD + RET + +DRVNAME LD A,(TMPNAME) + CP "a" + JR C,DRVN2 + CP "{" + JR NC,DRVN2 + SUB #20 +DRVN2 SUB "A" + PUSH HL +; CALL OPENDSK + POP HL + JP NC,GETWORD + RET + +TMPNAME DB " ",#00 + +OPENDIR XOR A + CALL SET_FM + LD A,(HL) + OR A + JP NZ,SUBDIR + + LD DE,(ROOTDIR+0) + LD (IY+CLU1),E + LD (IY+CLU2),D + LD DE,(ROOTDIR+2) + LD (IY+CLU3),E + LD (IY+CLU4),D + + LD DE,(ROOTLEN+0) + LD (IY+LEN1),E + LD (IY+LEN2),D + LD DE,(ROOTLEN+2) + LD (IY+LEN3),E + LD (IY+LEN4),D + + CALL LOADDIR + LD HL,DIRSPEC + LD (HL),'\' ; + INC HL + LD (HL),#00 + AND A + RET + +SUBDIR CP "." + JR NZ,SUBDIR2 + EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 + LD (HL),#20 + LDIR + EXX + LD DE,MASKARE +SUBDIR0 LDI + LD A,(HL) + OR A + JR NZ,SUBDIR0 + JR SUBDIR3 + +SUBDIR2 LD DE,MASKARE + CALL MASK + RET C +SUBDIR3 CALL FINDDIR + RET C + LD (IY+CLU1),E + LD (IY+CLU2),D + LD (IY+CLU3),C + LD (IY+CLU4),B + EXX + LD (IY+LEN1),E + LD (IY+LEN2),D + LD (IY+LEN3),C + LD (IY+LEN4),B + EXX + CALL LOADDIR + AND A + RET + + + +FINDD03 LD BC,#0020 + ADD IX,BC + JR NC,FINDD01 +FINDD04 POP AF + OUT (PAGE3),A + LD A,4 + SCF + RET + +; FIND "MASKAREA" IN DIRECTORY + +FINDDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD IX,DIR +FINDD01 LD A,(IX+00) + OR A + JR Z,FINDD04 + CP #E5 + JR Z,FINDD03 + LD A,(IX+11) + AND #10 + JR Z,FINDD03 + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 +FINDD02 LD A,(DE) + CP "?" + JR Z,FINDD05 + CP (HL) + JR NZ,FINDD03 +FINDD05 INC HL + INC DE + DJNZ FINDD02 + LD A,(IX+0) + CP "." + JP NZ,ADDSPEC + LD A,(IX+1) + CP "." + JP NZ,IT_DIR + LD HL,DIRSPEC + LD D,H + LD E,L + LD BC,#100 + XOR A + CPIR + LD BC,#100 + LD A,'\' ; + CPDR + INC HL + AND A + EX DE,HL + SBC HL,DE + EX DE,HL + JR NZ,ROTZ + INC HL +ROTZ LD (HL),0 +IT_DIR LD E,(IX+CLU1) + LD D,(IX+CLU2) + LD C,(IX+CLU3) + LD B,(IX+CLU4) + EXX + LD E,(IX+LEN1) + LD D,(IX+LEN2) + LD C,(IX+LEN3) + LD B,(IX+LEN4) + EXX + POP AF + OUT (PAGE3),A + AND A + RET + +ADDSPEC LD E,XL + LD D,XH + LD HL,DIRSPEC + LD BC,#FF + XOR A + CPIR + DEC HL + DEC HL + LD A,#5C ;"\" + CP (HL) + INC HL + JR Z,ADDSPE0 + LD (HL),A + INC HL +ADDSPE0 LD BC,#0820 +MM1 LD A,(DE) + INC DE + CP C + JR Z,MM2 + LD (HL),A + INC HL +MM2 DJNZ MM1 + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),A + INC HL + LD A,(DE) + CP C + JR Z,MM3 + LD (HL),A + INC HL +MM3 LD (HL),0 + JP IT_DIR + +CURRDIR EX DE,HL + LD HL,DIRSPEC +CURDIR1 LD A,(HL) + OR A + LDI + JP NZ,CURDIR1 + RET + +LOADDIR XOR A + LD HL,0 + LD IX,0 + LD B,0 + CALL MOVE_FP + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,3 +LOADFFF PUSH BC + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR +; LD A,(DRIVE) +; LD (IY+FDRV),A +; LD C,(IY+LEN1) + LD C,(IY+LEN2) + LD B,(IY+LEN3) + LD E,(IY+LEN4) + LD D,0 + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + LD E,(IY+CLU1) + LD D,(IY+CLU2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + LD XH,D + LD XL,E + LD B,C + LD A,B + OR A + JR Z,ERRLEND + CP #08 + JR C,NORLEND + LD B,8 +NORLEND + LD A,(CDDRIVE) + LD C,BIOS.DRV_READ + LD DE,DIR + RST ToBIOS + POP BC + JR NC,LOADMMM + DEC B + JP NZ,LOADFFF + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +ERRLEND POP BC + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +LOADMMM POP AF + OUT (PAGE3),A + CALL CORRDIR + AND A + RET + +CORRDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD HL,DIR + LD DE,DIR +CORRL1 PUSH DE + LD C,(HL) + LD B,0 + LD DE,ENTRYBF + LDIR + POP DE + PUSH HL + LD HL,FCDFLEN + LD C,(HL) + LD B,0 + ADD HL,BC + INC HL + LD (HL),0 + SBC HL,BC + PUSH DE + CALL MASK + POP HL + LD BC,11 + ADD HL,BC + LD A,(FCDFLAG) + BIT 1,A ;IS IT DIR? +; AND 2 + LD C,#01 ;ATTRIBUT FILE + JR Z,CORRL0 + LD C,#10 ;ATTRIBUT DIRECTORY +CORRL0 BIT 0,A ;IS IT HIDDEN + JR Z,CORRL00 + SET 1,C +CORRL00 + LD (HL),C + INC HL + XOR A + LD B,8 +FILLCDN LD (HL),A + INC HL + DJNZ FILLCDN + LD A,(FCDSEC+2) + LD (HL),A + INC HL + LD A,(FCDSEC+3) + LD (HL),A + INC HL +;MKDATE + PUSH HL + LD A,(FCDYEAR) + LD XL,A + LD XH,0 + LD DE,1900 + ADD IX,DE + LD A,(FCDMOUN) + LD E,A + LD A,(FCDDAY) + LD D,A + LD A,(FCDHOUR) + LD H,A + LD A,(FCDMIN) + LD L,A + LD A,(FCDSECN) + LD B,A + CALL MK_TIME + POP HL +; LD DE,#0000 ;TIME + LD (HL),E + INC HL + LD (HL),D + INC HL +; LD DE,#0000 ;DATE + LD (HL),C + INC HL + LD (HL),B + INC HL + + LD DE,(FCDSEC) + LD (HL),E + INC HL + LD (HL),D + INC HL + EX DE,HL + LD HL,FCDLEN + LDI + LDI + LDI + LDI + POP HL + BIT 7,H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 + LD L,0 + INC H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 +CORRL2 XOR A + LD (DE),A + LD DE,(ROOTDIR+0) + LD L,(IY+CLU1) + LD H,(IY+CLU2) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD DE,(ROOTDIR+2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + JR CORRL4 +CORRL6 LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + INC HL + LD (HL),"." +CORRL4 POP AF + OUT (PAGE3),A + AND A + RET + +;SYSTEM ATTRIBUTES +READONLY_ATR EQU %00000001 +HIDDEN_ATR EQU %00000010 +SYSTEM_ATR EQU %00000100 +ARCHIVE_ATR EQU %00100000 + +ENTRYBF + DEFB #00 ;Entry lenght + DEFB #00 ;XAR in LBN +FCDSEC DEFW #00,#00 ;Start sector (Intel) + DEFW #00,#00 ;Start sector (Motorola) +FCDLEN DEFW #00,#00 ;Lenght file (Intel) + DEFW #00,#00 ;Lenght file (Motorola) +FCDYEAR DEFB #00 ;Year +FCDMOUN DEFB #00 ;Mount +FCDDAY DEFB #00 ;Day +FCDHOUR DEFB #00 ;Hour +FCDMIN DEFB #00 ;Minute +FCDSECN DEFB #00 ;Second + DEFB #00 ;Reserve +FCDFLAG DEFB #00 ;Flag + DEFB #00 ;Interlive size + DEFB #00 ;Interlive skip factor + DEFW #0000 ;Volume Set Sequence (Intel) + DEFW #0000 ;Volume Set Sequence (Motorola) +FCDFLEN DEFB #00 +DEFSA EQU $-ENTRYBF +FCDNAME DEFS #100-DEFSA + +ROOTDIR DEFW 0,0 +ROOTLEN DEFW 0,0 + +DIRSIZE DEFW 0 + +BANK LD C,A + LD B,0 + LD HL,BANKTBL + ADD HL,BC + IN A,(PAGE3) + LD C,PAGE3 + OUTI + RET + +BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + +;HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +; DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +MASKARE + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION + +MASK PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),#20 + LD BC,10 + LDIR + POP DE + POP HL + LD A,(HL) + CP #21 + RET C + LD BC,#0902 +MASK1 LD A,(HL) + CP #21 + CCF + RET NC + CP #22 + JR Z,MASK7 + CP "*" + JR Z,MASK3 + CP "+" + JR Z,MASK7 + CP "," + JR Z,MASK7 + CP "." + JR Z,MASK5 + CP "/" + JR Z,MASK7 + CP ":" + JR Z,MASK7 + CP ";" + JR Z,MASK7 + CP "<" + JR Z,MASK7 + CP "=" + JR Z,MASK7 + CP ">" + JR Z,MASK7 + CP "[" + JR Z,MASK7 + CP '\' ; + JR Z,MASK7 + CP "]" + JR Z,MASK7 + CP "|" + JR Z,MASK7 + CP "a" + JR C,MASK2 + CP "{" + JR NC,MASK2 + SUB #20 +MASK2 LD (DE),A + INC HL + INC DE + DJNZ MASK1 +MASK7 LD A,16 + SCF + RET + +MASK3 LD A,"?" + INC HL + DJNZ MASK6 + LD A,16 + SCF + RET + +MASK6 LD (DE),A + INC DE + DJNZ MASK6 + LD B,1 + JR MASK1 + +MASK5 LD A," " + INC HL + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +MASK4 LD (DE),A + INC DE + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +SYSTIME LD DE,DAY*256+MONTH ;DAY/MONTH + LD HL,#0000 ;HOUR/MINUTE + LD BC,#0001 ;SECOND/WEEKDAY + LD IX,YEAR ;YEAR + AND A + RET + +;INPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) + +MK_TIME LD A,L + RLCA + RLCA + SLA A + RL H + SLA A + RL H + SLA A + RL H + SRL B + OR B + LD L,A + + LD BC,#F844 ;(-1980) + ADD IX,BC + LD A,E + RLCA + RLCA + RLCA + RLCA + AND #F0 + LD B,XL + SLA A + RL B + OR D + LD C,A + EX DE,HL + AND A + RET + +;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) +;OUTPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) + +RMKTIME EX DE,HL + LD A,C + AND #1F + LD D,A + SRL B + RR C + LD A,C + RRCA + RRCA + RRCA + RRCA + AND #0F + LD E,A + LD C,B + LD B,0 + LD IX,1980 + ADD IX,BC + LD A,L + AND #1F + ADD A,A + LD B,A + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL L + SRL L + AND A + RET + +; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 + +CHDIR CALL GETWORD + RET C + LD HL,TMPNAME + LD A,(HL) + OR A + CALL NZ,OPENDIR + RET +; \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM b/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM new file mode 100644 index 0000000..fd61bdf --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM @@ -0,0 +1,525 @@ + +NAM EQU 0 +EXT EQU 8 +ATR EQU 11 + +CLU3 EQU 20 +CLU4 EQU 21 + +TIM1 EQU 22 +TIM2 EQU 23 +DAT1 EQU 24 +DAT2 EQU 25 +CLU1 EQU 26 +CLU2 EQU 27 +LEN1 EQU 28 +LEN2 EQU 29 +LEN3 EQU 30 +LEN4 EQU 31 +POS1 EQU 32 +POS2 EQU 33 +POS3 EQU 34 +POS4 EQU 35 +DIRCLU1 EQU 36 +DIRCLU2 EQU 37 +HND1 EQU 38 +HND2 EQU 39 +FDRV EQU 40 +AMODE EQU 41 +FTASK EQU 42 + +DIR EQU #C000 + +DIRPAGE EQU 0 + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE + +;File Manipulator (FM) +FM_BUF DEFB ". " ;+00 NAME + DEFB " " ;+08 EXT + DEFB #10 ;+11 ATTRIBUT + DEFB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED + DEFW #0000 ;+22 TIME + DEFW #0000 ;+24 DATE + DEFW #0000 ;+26 START CLUSTER + DEFW #0000,#0000 ;+28 SIZE FILE + DEFW #0000,#0000 ;+32 FILE POSITION (FP) + DEFW #0000 ;+36 DIRECTORY CLUSTER + DEFW #0000 ;+38 HANDLE NUMBER + DEFB #00 ;+40 DRIVE OR CURRENT + DEFB #00 ;+41 ACCESS MODE + DEFB #00 ;+42 TASK + DEFB #00 ;+43 EMPTY +END_FM +;End of FM + DEFS 44*1,0 + +FM_SIZE EQU END_FM-FM_BUF + +SET_FM PUSH DE + INC A + LD IY,FM_BUF-FM_SIZE + LD DE,FM_SIZE +SET_FM1 ADD IY,DE + DEC A + JR NZ,SET_FM1 + POP DE + LD A,(IY+0) + OR A + LD A,0 + RET NZ + LD A,5 + SCF + RET + +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR + +MOVE_FP CALL SET_FM + RET C + INC B + DEC B + JP Z,MOVE_FA + DEC B + JP Z,MOVE_FB + DEC B + JP Z,MOVE_FC + LD A,1 + SCF + RET + +;from Start File +MOVE_FA LD BC,0 + LD DE,0 + JR MOVE_F1 + +;from End File +MOVE_FC LD C,(IY+28) + LD B,(IY+29) + LD E,(IY+30) + LD D,(IY+31) + JR MOVE_F1 + +;from Current Position +MOVE_FB LD C,(IY+32) + LD B,(IY+33) + LD E,(IY+34) + LD D,(IY+35) +MOVE_F1 ADD IX,BC + ADC HL,DE + LD D,HX + LD E,LX + LD (IY+32),E + LD (IY+33),D + LD (IY+34),L + LD (IY+35),H + XOR A + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE + +MOVE_CP LD L,(IY+28) + LD H,(IY+29) + LD E,(IY+32) + LD D,(IY+33) + AND A + SBC HL,DE + LD L,(IY+30) + LD H,(IY+31) + LD E,(IY+34) + LD D,(IY+35) + SBC HL,DE + RET + +INITDISK + LD B,4 +CD_I_LP PUSH BC + LD DE,DIR + LD HL,#0000 + LD IX,#0010 + LD BC,#0105 +; LD A,(DRIVE) + CALL CDCMD +; RST #18 + POP BC + JR NC,CD_I_OK + DJNZ CD_I_LP +UNKCD SCF + RET + +CD_I_OK LD HL,DIR + LD A,(HL) + INC HL + CP #01 + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "C" + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "D" + JR NZ,UNKCD + LD HL,DIR+#009E + LD DE,ROOTDIR + LDI + LDI + LDI + LDI + LD HL,DIR+#00A6 + LD DE,ROOTLEN + LDI + LDI + LDI + LDI +; POP AF +; OUT (PAGE3),A +; LD HL,0 +; LD (FATCASH),HL + XOR A + RET + + + + + +LOADDIR XOR A + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,3 +LOADFFF PUSH BC + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR +; LD A,(DRIVE) +; LD (IY+FDRV),A +;; LD C,(IY+LEN1) + LD C,(IY+LEN2) + LD B,(IY+LEN3) + LD E,(IY+LEN4) + LD D,0 + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + LD E,(IY+CLU1) + LD D,(IY+CLU2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + LD HX,D + LD LX,E + LD B,C + LD A,B + OR A + JR Z,ERRLEND + CP #08 + JR C,NORLEND + LD B,8 +NORLEND LD A,(DRIVE) + LD C,5 + LD DE,DIR + CALL CDCMD +; RST #18 + POP BC + JR NC,LOADMMM + DEC B + JP NZ,LOADFFF + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +ERRLEND POP BC + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +LOADMMM POP AF + OUT (PAGE3),A + CALL CORRDIR + AND A + RET + +CORRDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD HL,DIR + LD DE,DIR +CORRL1 PUSH DE + LD C,(HL) + LD B,0 + LD DE,ENTRYBF + LDIR + POP DE + PUSH HL + LD HL,FCDFLEN + LD C,(HL) + LD B,0 + ADD HL,BC + INC HL + LD (HL),0 + SBC HL,BC + PUSH DE + CALL MASK + POP HL + LD BC,11 + ADD HL,BC + LD A,(FCDFLAG) + AND 2 + LD A,#00 ;ATTRIBUT FILE + JR Z,CORRL0 + LD A,#10 ;ATTRIBUT DIRECTORY +CORRL0 LD (HL),A + INC HL + XOR A + LD B,8 +FILLCDN LD (HL),A + INC HL + DJNZ FILLCDN + LD A,(FCDSEC+2) + LD (HL),A + INC HL + LD A,(FCDSEC+3) + LD (HL),A + INC HL + LD DE,#0000 ;TIME + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,#0000 ;DATE + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,(FCDSEC) + LD (HL),E + INC HL + LD (HL),D + INC HL + EX DE,HL + LD HL,FCDLEN + LDI + LDI + LDI + LDI + POP HL + BIT 7,H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 + LD L,0 + INC H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 +CORRL2 XOR A + LD (DE),A + LD DE,(ROOTDIR+0) + LD L,(IY+CLU1) + LD H,(IY+CLU2) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD DE,(ROOTDIR+2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + JR CORRL4 +CORRL6 LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + INC HL + LD (HL),"." +CORRL4 POP AF + OUT (PAGE3),A + AND A + RET + +ENTRYBF + DEFB #00 ;Entry lenght + DEFB #00 ;XAR in LBN +FCDSEC DEFW #00,#00 ;Start sector (Intel) + DEFW #00,#00 ;Start sector (Motorola) +FCDLEN DEFW #00,#00 ;Lenght file (Intel) + DEFW #00,#00 ;Lenght file (Motorola) +FCDYEAR DEFB #00 ;Year +FCDMOUN DEFB #00 ;Month +FCDDAY DEFB #00 ;Day +FCDHOUR DEFB #00 ;Hour +FCDMIN DEFB #00 ;Minute +FCDSECN DEFB #00 ;Second + DEFB #00 ;Reserve +FCDFLAG DEFB #00 ;Flag + DEFB #00 ;Interlive size + DEFB #00 ;Interlive skip factor + DEFW #0000 ;Volume Set Sequence (Intel) + DEFW #0000 ;Volume Set Sequence (Motorola) +FCDFLEN DEFB #00 +DEFSA EQU $-ENTRYBF +FCDNAME DEFS #100-DEFSA + +ROOTDIR DEFW 0,0 +ROOTLEN DEFW 0,0 + +DIRSIZE DEFW 0 + +BANK LD C,A + LD B,0 + LD HL,BANKTBL + ADD HL,BC + IN A,(PAGE3) + LD C,PAGE3 + OUTI + RET + +BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + +HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +MASKARE + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION + +MASK PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),#20 + LD BC,10 + LDIR + POP DE + POP HL + LD A,(HL) + CP #21 + RET C + LD BC,#0902 +MASK1 LD A,(HL) + CP #21 + CCF + RET NC + CP #22 + JR Z,MASK7 + CP "*" + JR Z,MASK3 + CP "+" + JR Z,MASK7 + CP "," + JR Z,MASK7 + CP "." + JR Z,MASK5 + CP "/" + JR Z,MASK7 + CP ":" + JR Z,MASK7 + CP ";" + JR Z,MASK7 + CP "<" + JR Z,MASK7 + CP "=" + JR Z,MASK7 + CP ">" + JR Z,MASK7 + CP "[" + JR Z,MASK7 + CP '\' ; + JR Z,MASK7 + CP "]" + JR Z,MASK7 + CP "|" + JR Z,MASK7 + CP "a" + JR C,MASK2 + CP "{" + JR NC,MASK2 + SUB #20 +MASK2 LD (DE),A + INC HL + INC DE + DJNZ MASK1 +MASK7 LD A,16 + SCF + RET + +MASK3 LD A,"?" + INC HL + DJNZ MASK6 + LD A,16 + SCF + RET + +MASK6 LD (DE),A + INC DE + DJNZ MASK6 + LD B,1 + JR MASK1 + +MASK5 LD A," " + INC HL + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +MASK4 LD (DE),A + INC DE + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET diff --git a/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm b/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm new file mode 100644 index 0000000..02deff8 --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm @@ -0,0 +1,372 @@ +MASTER EQU 0 +SLAVE EQU 1 +;======================================================== +R170 EQU #0050 ;Data +R171 EQU #0051 ;Error +R172 EQU #0052 ;Direct +R173 EQU #0053 ;Reserve +R174 EQU #0054 ;Lenght block low +R175 EQU #0055 ;Lenght block high +R176 EQU #4052 ;Drive device +R177 EQU #4053 ;Status + +W170 EQU #0150 ;Data +W171 EQU #0151 ;???? +W172 EQU #0152 ;???? +W173 EQU #0153 ;Reserve +W174 EQU #0154 ;Lenght block low +W175 EQU #0155 ;Lenght block high +W176 EQU #4152 ;Drive device +W177 EQU #4153 ;Command + +BSY EQU 7 +DRQ EQU 3 +ERR EQU 0 + + +;-----------------------------------------------------------------------; +SIZESEC: DW #0800 + +PKTSIZE: DB 12 +;-----------------------------------------------------------------------; + + +CDCMD BIT 7,C + JP NZ,EXTCD + INC C + DEC C + JP Z,RESETCD ; 0 + DEC C + JP Z,RESETCD ; 1 + DEC C + JP Z,NOPCDC ; 2 + DEC C + JP Z,CHEK_C ; 3 + DEC C + JP Z,GBPB_C ; 4 ; [ ] перенести в DSS + DEC C + JP Z,READC ; 5 + DEC C + JP Z,NOPCDC ; 6 +NOPCDC LD A,1 + SCF + RET + +EXTCD RES 7,C + INC C + DEC C + JP Z,NOPCDC + DEC C + JP Z,OPENC + DEC C + JP Z,CLOSC + JP NOPCDC + + +RESETCD LD B,50 +RESECD PUSH BC + LD A,(CDDRIVE) + CALL CD_TEST + POP BC + RET NC + OR A + RET Z + EI + HALT + DJNZ RESECD + RET + +CHEK_C LD A,(CDDRIVE) + CALL CD_TEST + LD A,#FF + AND A + RET + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; [ ] перенести в DSS +GBPB_C LD HL,CD_BPB + LD BC,#0200 + LDIR + XOR A + RET +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +READC LD A,(CDDRIVE) + JP CD_READ + +OPENC LD A,(CDDRIVE) + JP CD_OPEN + +CLOSC LD A,(CDDRIVE) + JP CD_CLOS + +CD_TEST LD HL,CMDNOPP + LD DE,0 + JP AP_COM + +CD_OPEN LD HL,CMDOPEN + LD DE,0 + JP AP_COM + +CD_CLOS LD HL,CMDCLOS + LD DE,0 + JP AP_COM + +; HL:IX - SECTOR +; DE - ADDRESS +; B - SECTOR COUNT +; A - DRIVE +CD_READ: + LD C,A + LD A,H + LD (SECREAD+0),A + LD A,L + LD (SECREAD+1),A + LD A,XH + LD (SECREAD+2),A + LD A,XL + LD (SECREAD+3),A + LD A,B + LD (COUNT+1),A + LD HL,CMDREAD + LD A,C + CALL AP_COM + RET + +; INPUT: HL - AP paket (12bytes) +; RETURN: CF - ERROR +; 01h - RECOVERED ERROR +; 02h - NOT READY +; 03h - MEDIUM ERROR +; 04h - HARDWARE ERROR +; 05h - ILLEGAL REQUEST +; 06h - UNIT ATTETION +; 07h - DATA PROTECT +; 0Bh - ABORTED COMMAND +; 80h - TIME OUT + +AP_COM ;AND #01 + ;LD A,#A0 ;0 + ;JR Z,APCOM1 + ;LD A,#B0 +APCOM1 ;LD BC,W176 + ;OUT (C),A ;SELECT DRIVE + EXX + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + JR NC,CDREADY + LD BC,W177 + LD A,#08 + OUT (C),A + LD B,#80 + DJNZ $ + EXX + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + RET C +CDREADY XOR A + EXX + LD BC,W171 + OUT (C),A + LD DE,(SIZESEC) ;SIZE BLOCK + LD BC,W174 + OUT (C),E + LD BC,W175 + OUT (C),D + LD BC,W177 + LD A,#A0 ;ATAPI.Packet + OUT (C),A + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + RET C + EXX + LD DE,#0908 + LD BC,R177 + CALL WAITPRT + EXX + BIT ERR,A + JR NZ,CDERROR + JR NC,YEP_DRQ + LD A,#80 + RET + +YEP_DRQ LD BC,W170 + LD A,(PKTSIZE) + SRL A +OUTPKT OUTI + OUTI + DEC A + JR NZ,OUTPKT + LD B,#80 + DJNZ $ +AP_LOOP EXX + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + RET C + LD BC,R177 + IN A,(C) + BIT ERR,A + JR Z,NO_ERR +CDERROR LD BC,R171 ;ERROR + IN A,(C) + RRCA + RRCA + RRCA + RRCA + AND #0F + SCF + RET + +NO_ERR BIT DRQ,A + LD A,0 + RET Z ;NO DATA REQUEST + EX DE,HL + LD BC,R174 + IN E,(C) + LD BC,R175 + IN D,(C) ;TRANSFER BLOCK SIZE + LD A,D + OR E + RET Z ;BLOCK = 0 + LD BC,R172 + IN A,(C) + AND #02 + ;CP #02 + JP NZ,FROM_CD +TO_CD LD BC,R170 +WR_T_CD OUTI + OUTI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,WR_T_CD + EX DE,HL + JR AP_LOOP + +FROM_CD LD A,H + OR L + JR Z,NULL + LD BC,R170 +RD_F_CD INI + INI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_F_CD + EX DE,HL + JR AP_LOOP + +NULL LD BC,R170 +RD_N_CD IN A,(C) + DEC B + IN A,(C) + DEC B + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_N_CD +; DE = 0 !!! + JR AP_LOOP + +; E - Second * 10 + +PAUSE LD HL,#0000 +PAUSE1 DEC L + JR NZ,PAUSE1 + DEC H + JR NZ,PAUSE1 + DEC E + JR NZ,PAUSE1 + RET + +; D - MASK +; E - PATTERN +; BC - PORT + +WAITPRT LD A,100 + LD HL,#0000 +WAITPX EX AF,AF' +WAITP0 IN A,(C) + CP #FF + JR Z,WAITP1 + AND D + CP E + JR NZ,WAITP2 + AND A + RET + +WAITP2 DEC L + JR NZ,WAITP0 + DEC H + JR NZ,WAITP0 + EX AF,AF' + DEC A + JR NZ,WAITPX + EX AF,AF' +WAITP1 SCF + RET + +CMDNOPP DEFB #00 + DEFB 00,00,00 + DEFB #00 + DEFB 00,00,00 + DEFB 00,00,00 + DEFB #00 + +CMDOPEN DEFB #1B + DEFB #00,#00,#00 + DEFB #02 + DEFB #00,#00,#00,#00,#00,#00,#00 + +CMDCLOS DEFB #1B + DEFB #00,#00,#00 + DEFB #03 + DEFB #00,#00,#00,#00,#00,#00,#00 + +;CMDREAD DEFB #28,#00 +CMDREAD DEFB #28,#00 +SECREAD DEFB #00,#00,#00,#00 + DEFB #00 +COUNT DEFB #00,#01 + DEFB #00,#00,#00 + + +; Area for boot sector [512Bytes] +CD_BPB DB #00,#00,#00 ; +00 JMP + DB " " ; +03 DOS NAME + +; Block Parameters BIOS + + DW #0200 ; +0B BYTE PER SECTOR + DB 4 ; +0D SECTORS PER CLUSTER + DW 1 ; +0E RESERVE SECTORS + DB 1 ; +10 AMOUNT FATS + DW 512 ; +11 FILES IN DIRECTORY + DW 0 ; +13 ALL SECTORS ON DISK + DB #F8 ; +15 ID FORMAT + DW 1 ; +16 SIZE FAT IN SECTORS + DW 63 ; +18 SECTOR PER TRACK + DW 255 ; +1A AMOUNT SIDES + DW #0010 ; +1C HIDDEN SECTORS + + DS 24 + + DB "FAT16" ; +36 FAT ID + + DS 453 +; end boot sector +;======================================================== + + + diff --git a/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm b/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm new file mode 100644 index 0000000..aee4820 --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm @@ -0,0 +1,356 @@ +;CD ROM DRIVE DRIVER +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +; 02-08-2001 DNS Initial this module +;--------------------------------------------------------------- +;======================================================== +R170 EQU #0050 ;Data +R171 EQU #0051 ;Error +R172 EQU #0052 ;Direct +R173 EQU #0053 ;Reserve +R174 EQU #0054 ;Lenght block low +R175 EQU #0055 ;Lenght block high +R176 EQU #4052 ;Drive device +R177 EQU #4053 ;Status + +W170 EQU #0150 ;Data +W171 EQU #0151 ;???? +W172 EQU #0152 ;???? +W173 EQU #0153 ;Reserve +W174 EQU #0154 ;Lenght block low +W175 EQU #0155 ;Lenght block high +W176 EQU #4152 ;Drive device +W177 EQU #4153 ;Command + +RAM_ATAPI_PK EQU #FEE0 +RAM_ATAPI_READ EQU #FEF0 + + +; BSY EQU 7 +; DRQ EQU 3 +; ERR EQU 0 + +RESETC +RESETCD LD B,50 +RESECD PUSH BC + LD A,1 + CALL CD_TEST + POP BC + RET NC + EI + HALT + DJNZ RESECD + RET + +LREADC + +READC LD A,1 + JP CD_READ + +OPENC LD A,1 + JP CD_OPEN + +CLOSC LD A,1 + JP CD_CLOS + +SIZESEC EQU #0800 +PKTSIZE EQU 12 + +CD_TEST LD HL,CMDNOPP + LD DE,0 + CALL AP_COM + RET + +DETECTC + +CD_OPEN LD HL,CMDOPEN + LD DE,0 + CALL AP_COM + RET + +CD_CLOS LD HL,CMDCLOS + LD DE,0 + CALL AP_COM + RET + +; HL:IX - SECTOR +; DE - ADDRESS +; B - SECTOR COUNT +; A - DRIVE + +CD_READ LD C,A + EXX + LD C,PAGE3 + IN A,(C) + PUSH AF + LD A,SYSPAGE + OUT (C),A + LD HL,CMDREAD + LD DE,RAM_ATAPI_READ + LD BC,PKTSIZE + LDIR + EXX + LD A,H + LD (RAM_ATAPI_READ+SECREAD+0),A ;R01 + LD A,L + LD (RAM_ATAPI_READ+SECREAD+1),A ;R01 + LD A,XH + LD (RAM_ATAPI_READ+SECREAD+2),A ;R01 + LD A,XL + LD (RAM_ATAPI_READ+SECREAD+3),A ;R01 + LD A,B + LD (RAM_ATAPI_READ+COUNT+1),A ;R01 + POP AF + OUT (PAGE3),A +;R01 LD HL,CMDREAD + LD HL,RAM_ATAPI_READ + LD A,C + CALL AP_COM + RET + +; INPUT: HL - AP paket (12bytes) +; RETURN: CF - ERROR +; 01h - RECOVERED ERROR +; 02h - NOT READY +; 03h - MEDIUM ERROR +; 04h - HARDWARE ERROR +; 05h - ILLEGAL REQUEST +; 06h - UNIT ATTETION +; 07h - DATA PROTECT +; 0Bh - ABORTED COMMAND +; 80h - TIME OUT + +AP_COM AND #01 + LD A,#A0 + JR Z,APCOM1 + LD A,#B0 +APCOM1 LD BC,W176 + OUT (C),A ;SELECT DRIVE + EXX + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + JR NC,CDREADY + LD BC,W177 + LD A,#08 + OUT (C),A + LD B,#00 + DJNZ $ + EXX + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + RET C +CDREADY + LD C,PAGE3 + IN B,(C) + + PUSH DE + PUSH BC + + LD A,SYSPAGE + OUT (C),A + LD A,B + LD DE,RAM_ATAPI_PK + LD BC,PKTSIZE + LDIR + + POP BC + POP DE + OUT (C),B + + XOR A + EXX + OUT (C),A + XOR A + LD BC,W171 + OUT (C),A + LD DE,SIZESEC ;SIZE BLOCK + LD BC,W174 + OUT (C),E + LD BC,W175 + OUT (C),D + LD BC,W177 + LD A,#A0 + OUT (C),A + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + RET C + EXX + IF _MAME + LD DE,#0808 + ELSE + LD DE,#0908 + ENDIF + LD BC,R177 + CALL CWAITPRT + EXX + BIT ERR,A + JR NZ,CDERROR + JR NC,YEP_DRQ + LD A,#80 + RET + +YEP_DRQ LD C,PAGE3 + IN B,(C) + PUSH BC + LD A,SYSPAGE + OUT (PAGE3),A + LD HL,RAM_ATAPI_PK + LD BC,W170 + LD A,PKTSIZE + SRL A +OUTPKT OUTI + OUTI + DEC A + JR NZ,OUTPKT + POP BC + OUT (C),B + LD B,#80 + DJNZ $ +AP_LOOP EXX + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + RET C + LD BC,R177 + IN A,(C) + BIT ERR,A + JR Z,NO_ERR +CDERROR LD BC,R171 ;ERROR + IN A,(C) + RRCA + RRCA + RRCA + RRCA + AND #0F + SCF + RET + +NO_ERR BIT DRQ,A + LD A,0 + RET Z ;NO DATA REQUEST + EX DE,HL + LD BC,R174 + IN E,(C) + LD BC,R175 + IN D,(C) ;TRANSFER BLOCK SIZE + LD A,D + OR E + RET Z ;BLOCK = 0 + LD BC,R172 + IN A,(C) + AND #02 + CP #02 + JP Z,FROM_CD +TO_CD LD BC,R170 +WR_T_CD OUTI + OUTI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,WR_T_CD + EX DE,HL + JR AP_LOOP + +FROM_CD LD A,H + OR L + JR Z,NULL + LD BC,R170 +RD_F_CD INI + INI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_F_CD + EX DE,HL + JR AP_LOOP + +NULL LD BC,R170 +RD_N_CD IN A,(C) + DEC B + IN A,(C) + DEC B + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_N_CD +; DE = 0 !!! + JR AP_LOOP + +; E - Second * 10 + +PAUSE LD HL,#0000 +PAUSE1 DEC L + JR NZ,PAUSE1 + DEC H + JR NZ,PAUSE1 + DEC E + JR NZ,PAUSE1 + RET + +; D - MASK +; E - PATTERN +; BC - PORT + +CWAITPRT + LD A,100 + LD HL,#0000 +CWAITPX EX AF,AF' +CWAITP0 IN A,(C) + CP #FF + JR Z,CWAITP1 + AND D + CP E + JR NZ,CWAITP2 + AND A + RET + +CWAITP2 DEC L + JR NZ,CWAITP0 + DEC H + JR NZ,CWAITP0 + EX AF,AF' + DEC A + JR NZ,CWAITPX + EX AF,AF' +CWAITP1 SCF + RET + +CMDNOPP DEFB #00 + DEFB 00,00,00 + DEFB #00 + DEFB 00,00,00 + DEFB 00,00,00 + DEFB #00 + +CMDOPEN DEFB #1B + DEFB #00,#00,#00 + DEFB #02 + DEFB #00,#00,#00,#00,#00,#00,#00 + +CMDCLOS DEFB #1B + DEFB #00,#00,#00 + DEFB #03 + DEFB #00,#00,#00,#00,#00,#00,#00 + +CMDREAD DEFB #28,#00 +SECREAD EQU $-CMDREAD + DEFB #00,#00,#00,#00 + DEFB #00 +COUNT EQU $-CMDREAD + DEFB #00,#01 + DEFB #00,#00,#00 + +;======================================================== + + diff --git a/DSS/drivers/media/ATAPI/Hidden/DSS.INC b/DSS/drivers/media/ATAPI/Hidden/DSS.INC new file mode 100644 index 0000000..5197cee --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/DSS.INC @@ -0,0 +1,104 @@ + +DSS_VERSION EQU #00 +DSS_CHDISK EQU #01 +DSS_CURDISK EQU #02 +DSS_DSKINFO EQU #03 +;DSS_G_ENTRY EQU #04 +; EQU #05 +; EQU #06 +; EQU #07 +; EQU #08 +DSS_BOOTDSK EQU #09 +;File io +DSS_CREATE EQU #0A +DSS_CREAT_N EQU #0B +; EQU #0C +;DSS_ERASE EQU #0D +DSS_DELETE EQU #0E +;DSS_MOVE EQU #0F +DSS_RENAME EQU #10 +DSS_OPEN EQU #11 +DSS_CLOSE EQU #12 +DSS_READ EQU #13 +DSS_WRITE EQU #14 +DSS_MOVE_FP EQU #15 +DSS_ATTRIB EQU #16 +DSS_GET_D_T EQU #17 +DSS_PUT_D_T EQU #18 +DSS_F_FIRST EQU #19 +DSS_F_NEXT EQU #1A +DSS_MKDIR EQU #1B +DSS_RMDIR EQU #1C +DSS_CHDIR EQU #1D +DSS_CURDIR EQU #1E +; EQU #1F +; EQU #20 +DSS_SYSTIME EQU #21 +DSS_SETTIME EQU #22 +; EQU #23 +; EQU #24 +; EQU #25 +; EQU #26 +; EQU #27 +; EQU #28 +; EQU #29 +; EQU #2A +; EQU #2B +; EQU #2C +; EQU #2D +; EQU #2E +; EQU #2F +;Keyboard +DSS_WAITKEY EQU #30 +DSS_SCANKEY EQU #31 +DSS_ECHOKEY EQU #32 +DSS_CTRLKEY EQU #33 +;DSS_EDIT EQU #34 +DSS_K_CLEAR EQU #35 +DSS_K_SETUP EQU #36 +DSS_TESTKEY EQU #37 +;Memory +DSS_SETWIN EQU #38 +DSS_SETWIN1 EQU #39 +DSS_SETWIN2 EQU #3A +DSS_SETWIN3 EQU #3B +DSS_INFOMEM EQU #3C +DSS_GETMEM EQU #3D +DSS_FREEMEM EQU #3E +DSS_SETMEM EQU #3F +;Execution +DSS_EXEC EQU #40 +DSS_EXIT EQU #41 +DSS_WAIT EQU #42 + +DSS_GSWITCH EQU #43 +DSS_DOSNAME EQU #44 +DSS_EX_PATH EQU #45 +DSS_ENVIRON EQU #46 +DSS_APPINFO EQU #47 +; EQU #48 +; EQU #49 +; EQU #4A +; EQU #4B +; EQU #4C +; EQU #4D +; EQU #4E +; EQU #4F + +DSS_SETVMOD EQU #50 +DSS_GETVMOD EQU #51 +DSS_LOCATE EQU #52 +DSS_CURSOR EQU #53 +DSS_SELPAGE EQU #54 +DSS_SCROLL EQU #55 +DSS_CLEAR EQU #56 +DSS_RDCHAR EQU #57 +DSS_WRCHAR EQU #58 +DSS_WINCOPY EQU #59 +DSS_WINREST EQU #5A +DSS_PUTCHAR EQU #5B +DSS_PCHARS EQU #5C +;DSS_RES_PRN EQU #5D +;DSS_CTRLPRN EQU #5E +DSS_PRINT EQU #5F +; diff --git a/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT b/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT new file mode 100644 index 0000000..e88e42d --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT @@ -0,0 +1,6 @@ + +00000000 00 43 44 30 30 31 01 45 4c 20 54 4f 52 49 54 4f |.CD001.EL TORITO| +00000010 20 53 50 45 43 49 46 49 43 41 54 49 4f 4e 00 00 | SPECIFICATION..| +00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| +* +00000040 00 00 00 00 00 00 00 13 00 00 00 00 00 00 00 00 |................| diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM deleted file mode 100644 index 29d977b..0000000 --- a/DSS/drivers/media/ReScanDRV.ASM +++ /dev/null @@ -1,495 +0,0 @@ -;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC -ReScanDRV: -.NUMBER_OF_SUBTABLES EQU 2 ;количество таблиц второго уровня (LOGDRV, RMDRIVE) -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 0. запоминаем бут-диск -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,B - LD (.old_letter),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 1. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD HL,DEVICE - LD DE,OLD_TABLES.DEVICE - LD BC,OLD_TABLES.DEVICE - DEVICE - LDIR - ; - LD A,.NUMBER_OF_SUBTABLES - LD (Fill_if_Exists.tbl),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 2. вызываем инициализацию драйвов -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - CALL INITDVC_RET_DRIVE - LD (DRV_PAGE.LDRIVE),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 3. сравниваем записи старых таблиц с новыми: -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD HL,OLD_TABLES.DEVICE - LD B,DSS_MAX_DRIVES_AMOUNT -.tbl_scanNew_mainLoop: - PUSH BC - PUSH HL - ; получаем номер процедуры для этой буквы диска - LD A,(HL) - ; - CP #FF - JR Z,.nextN - ; - LD B,A - INC HL - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - ; [ищем что за драйв] - EX DE,HL - ; FDD? - LD HL,FDD_DRV.API_TABLE - AND A - SBC HL,DE - JR Z,.nextN ; пропуск FDD драйвов - ; HDD? - LD HL,HDDRIVE - AND A - SBC HL,DE - ; HDD! Сверка по таблице LOGDRV - JP Z,SCAN_TABLES.HARD_DRV - ; RD? - LD HL,RMDRIVE - AND A - SBC HL,DE - ; RAM Drive! Сверка по таблице RAMDTBL - JP Z,SCAN_TABLES.RAM_DRV - ; CD/DVD? - ;LD HL,CDDRIVE - ;AND A - ;SUB HL,DE - ; CD/DVD! - ; JR Z,SCAN_TABLES.CD_ROM - - ; следующий виток -.nextN: POP HL -.nextN2: - INC HL - INC HL - INC HL - POP BC - DJNZ .tbl_scanNew_mainLoop -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 4. сравниваем запись новых таблиц со старыми -; а. если драйв только в новой: -; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) -; -; ВХОД: IX - OLD_TABLES.DEVICE -; HL - OLD_TABLES.DEVICE.End -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - INC HL - LD (OLD_TABLES_CURRENT),HL - EXX - LD HL,OLD_TABLES.LOGDRV - LOGDRV - LD B,DSS_MAX_DRIVES_AMOUNT - EXX - ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало) - LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry - LD IY,LOGDRV - LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад - LD B,DSS_MAX_DRIVES_AMOUNT - ; -.loop1: LD A,#FF - CP (IX+0) - JR NZ,.loop2_start - ADD IX,DE - DJNZ .loop1 -.loop1_exit: - LD A,C ; закончили считать переменную LDRIVE - LD (DRV_PAGE.LDRIVE),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 5. проверяем, не грохнулся ли бут-диск. -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -.old_letter+1: - LD A,0 - _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE - LD A,(HL) - INC A - SCF - ;JP Z,ERROR_BOOTDRV_DIES - RET Z -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 6. заменяем новые таблицы на модифицированные старые -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD HL,OLD_TABLES.DEVICE - LD DE,DEVICE - LD BC,OLD_TABLES.DEVICE - DEVICE - LDIR - ; -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -;7. выход -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,(DRV_PAGE.LDRIVE) - AND A - RET -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -;-----------------------[] -.loop2_start: - LD C,B ; начинаем считать переменную LDRIVE - LD A,DSS_MAX_DRIVES_AMOUNT - SUB B ; сколько шагов вперёд по таблице осталось - LD B,A - ; -.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд - ADD IX,DE - ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов - PUSH IX - PUSH BC - CALL Fill_if_Exists - POP BC - POP IX - ; NC: - ; DE = адрес процедуры обработчика таблицы - ; A = логический номер устройства в таблице обработчика - ; - ; CF - нет больше новых записей - JR C,.loop1_exit - - LD (IX+0),A - LD (IX+1),E - LD (IX+2),D - ; - INC C ; добавили драйв - ; - DJNZ .loop2 - JR .loop1_exit -;-----------------------[] - -;-----------------------[] -Fill_if_Exists: -.tbl+1: LD B,ReScanDRV.NUMBER_OF_SUBTABLES - DJNZ 1F - ; B=1, RAMDTBL - LD A,RAMDTBL.TBL_Entry - LD IY,RAMDTBL - CALL .RUN - LD DE,RMDRIVE - RET NC - LD A,(.tbl) - DEC A ;!!!!! может быть переполнение - LD (.tbl),A - RET - ; -1: DJNZ 1F - ; B=2, LOGDRV - LD A,LOGDRV.TBL_Entry - LD IY,LOGDRV - CALL .RUN - LD DE,HDDRIVE - RET NC - ; переходим на другую таблицу - RAMDTBL - LD A,(.tbl) - DEC A ;!!!!! может быть переполнение - LD (.tbl),A - LD HL,OLD_TABLES.RAMDTBL - LD (OLD_TABLES_CURRENT),HL - EXX - LD B,MAX_RAMDRIVES - EXX - JR Fill_if_Exists - ; -1: SCF ; unknown table number - RET -; -.RUN: EXX - ; - LD D,0 - LD E,A - PUSH DE - ; - LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы - PUSH BC - CALL Find_Record.loop1 ; ищет в новой таблице новую запись - POP BC - JR NC,1F - ; - POP DE - EXX - RET - ; -1: PUSH IY ; сохраняем текущий адрес новой таблицы - ; - LD IY,(OLD_TABLES_CURRENT) - ; - LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы - LD C,D ; номер записи в таблице. D=0 - PUSH BC - CALL Find_Record.loop2 - LD A,C - POP BC - JR NC,1F - ; - POP DE - POP DE - EXX - RET - ; -1: EX (SP),IY ; переключение со старой на новую таблицу - PUSH IY - EXX - ; перекидываем запись из новой в старую - POP HL - POP DE - POP BC - LDIR - - LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы - AND A - RET -OLD_TABLES_CURRENT: WORD 0 -;-----------------------[] - -;-----------------------[] -; ВХОД: A - Маска для сравнения -; DE - Длина одной записи -; IY - Адрес данных в таблице -; ВЫХОД: NC: -; IY - начало подходящей записи -; C - номер новой записи в старой таблице -; CF - Не найдено, таблица закончилась -Find_Record: -.loop1: CP (IY) - RET NC - ADD IY,DE - INC C - DJNZ .loop1 - ; таблицу прошерстили - SCF - RET -.loop2: CP (IY) - RET Z - ADD IY,DE - INC C - DJNZ .loop2 - ; таблицу прошерстили - SCF - RET -;-----------------------[] - -;-----------------------[] -; ERROR_BOOTDRV_DIES: -; DI -; LD E,1 -; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default -; RST ToBIOS -; ; -; LD HL,#2050 -; LD DE,0 -; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN -; RST ToBIOS -; ; -; LD A,1 -; OUT (SCREEN_SWITCH),A ; set scr-2 -; ; -; LD HL,.ERROR_MSG -; LD DE,#A000 -; LD BC,.ERROR_MSG.size -; LD A,C -; LDIR -; ; -; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 -; LD C,BIOS.LP_SET_PLACE -; RST ToBIOS -; ; -; LD HL,#A000 -; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE -; LD B,A -; LD C,BIOS.LP_PRINT_LINE3 -; RST ToBIOS -; ; -; .loop: DI -; HALT -; JR .loop -; ; -; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -; .ERROR_MSG.size EQU $-.ERROR_MSG -;-----------------------[] - - -;-----------------------[] -; НЕ ГРОХАТЬ HL! -; а. если драйв есть в новой и старой, то затираем в новой -; таблице совпавший драйв -; б. если драйв есть только в старой, то: -; б1) грохаем файловые манипуляторы с его номером - MODULE SCAN_TABLES -; вход: B - лог.номер драйва, DE -RAM_DRV: - ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL - LD A,B - LD BC,OLD_TABLES.RAMDTBL - CALL GET_RAMDRV_NUM.skip_tbl - LD (.cur_drv),BC - AND #0F - LD C,A ; номер рамдиска - ; Ищем в новой такой же номер рамдиска - LD B,MAX_RAMDRIVES - LD DE,RAMDTBL -.loop: LD A,(DE) - SUB C - JR Z,.found - INC DE - INC DE - DJNZ .loop - ; ЗАПИСЬ НЕ НАЙДЕНА - ; Достаём положение в OLD_TABLES.DEVICE - POP HL - ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM - POP BC - PUSH BC - ; Грохаем ФМ и запись в OLD_TABLES.DEVICE - CALL KILL_FM - ; грохаем в старой RAMDTBL этот драйв - EX DE,HL -.cur_drv+1: - LD HL,0 - LD (HL),#FF - DEC HL - LD (HL),#FF - EX DE,HL - JP ReScanDRV.nextN2 - ; -.found: DEC A - ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (DE),A - DEC DE - LD (DE),A - JP ReScanDRV.nextN -;-----[] -HARD_DRV: - LD L,B - LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV - LD IX,LOGDRV - LD DE,LOGDRV.TBL_Entry - LD B,DSS_MAX_DRIVES_AMOUNT - ; -.loop: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) - ;CP #FF - ;JR Z,.skip - CP (IX+LOGDRV.PHISICAL_DRV_NUMBER) - JR NZ,.skip - ; - LD A,(IY+LOGDRV.SECTOR_OFFSET) - CP (IX+LOGDRV.SECTOR_OFFSET) - JR NZ,.skip - LD A,(IY+LOGDRV.SECTOR_OFFSET+1) - CP (IX+LOGDRV.SECTOR_OFFSET+1) - JR NZ,.skip - LD A,(IY+LOGDRV.SECTOR_OFFSET+2) - CP (IX+LOGDRV.SECTOR_OFFSET+2) - JR NZ,.skip - LD A,(IY+LOGDRV.SECTOR_OFFSET+3) - CP (IX+LOGDRV.SECTOR_OFFSET+3) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS) - CP (IX+LOGDRV.SIZE_IN_SECTORS) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS+1) - CP (IX+LOGDRV.SIZE_IN_SECTORS+1) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS+2) - CP (IX+LOGDRV.SIZE_IN_SECTORS+2) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS+3) - CP (IX+LOGDRV.SIZE_IN_SECTORS+3) - JR Z,.found - ; -.skip: ADD IX,DE - DJNZ .loop - ; ЗАПИСЬ НЕ НАЙДЕНА - ; Грохаем старую запись в OLD_TABLES.LOGDRV - LD A,#FF - LD (IY+LOGDRV.PHISICAL_DRV_NUMBER),A - ; Достаём положение в OLD_TABLES.DEVICE - POP HL - ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM - POP BC - PUSH BC - ; Грохаем ФМ и запись в OLD_TABLES.DEVICE - CALL KILL_FM - ; - JP ReScanDRV.nextN2 - ; -.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),#FF - JP ReScanDRV.nextN - ; -; CD_ROM: -; JP ReScanDRV.nextN -;-----[] -; ВХОД: HL - текущая запись в таблице DEVICE -; B - шаг общего цикла -KILL_FM:; - LD A,DSS_MAX_DRIVES_AMOUNT - SUB B - LD C,A - ; втыкаем страницу ядра с таблицей файловых манипуляторов - PUSH BC - LD A,(PORTAL.out_DRV.RETBANK) - LD B,A - LD C,SLOT3 - IN A,(SLOT3) - OUT (C),B - POP BC - PUSH AF - ; Шерстим манипуляторы на наличие в них грохнутого драйва - LD IY,CORE_BUFFERS.FM_BUF + #C000 ; - CORE_BUFFERS.FM_BUF.Size - LD B,FMCOUNT - 1 ; пропускаем служебный нулевой манипулятор - LD DE,CORE_BUFFERS.FM_BUF.Size -.loop_fm: - ADD IY,DE - LD A,(IY+_sFM.DRIVE) - CP C - JR NZ,.skip - XOR A - LD (IY+_sFM.FS_REC.NAME),A ; грохаем манипулятор -.skip: DJNZ .loop_fm - ; - POP AF - OUT (SLOT3),A - ; - ; грохаем в OLD_TABLES.DEVICE убитый драйв - LD (HL),#FF - ; - RET - ENDMODULE -;-----------------------[] - -/* -[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78+1 + 416 + 32 == 526 - -; логический номер устройства + адрес обработчика. -; Порядковый номер * 3 = буква диска + "A" -DEVICE EQU $ -.TBL_Entry EQU 3 -.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF -.Size EQU .End - $ - -;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -;+01 LONG SECTOR OFFSET -;+05 LONG SIZE IN SECTORS -;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO -;+13 WORD FREE -;+15 BYTE FREE -; Логический номер раздела. -;Номер группы = логический номер раздела HDD из DEVICE -LOGDRV EQU DEVICE + DEVICE.Size -.TBL_Entry EQU 16 -.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID -RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size -.TBL_Entry EQU 2 -.Size EQU .TBL_Entry * MAX_RAMDRIVES -*/ \ No newline at end of file diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm deleted file mode 100644 index e196213..0000000 --- a/DSS/drivers/media/fdd-drv.asm +++ /dev/null @@ -1,417 +0,0 @@ - -; Disk Driver Specification ver. 2.00 -;[]===========================================================[0] -;Procedure : Initialization -; -;Function : Initialization device(s) -; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver -;[]===========================================================[] -;[]===========================================================[1] -;Procedure : Open -; -;Function : Open disk -; -;Input : C = 01h -; A - Drive -;Output : None -; -;[]===========================================================[] -;[]===========================================================[2] -;Procedure : Close -; -;Function : Close disk -; -;Input : C = 02h -; A - Drive -;Output : None -; -;[]===========================================================[] -;[]===========================================================[3] -;Procedure : Media check -; -;Function : Checking change line -; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed -; -;[]===========================================================[] -;[]===========================================================[4] -;Procedure : Get BPB -; -;Function : Get Block Parameters BIOS -; -;Input : C = 04h -; DE - Address -;Output : None -; -;[]===========================================================[] -;[]===========================================================[5] -;Procedure : Input -; -;Function : Input from disk -; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[] -;[]===========================================================[6] -;Procedure : Output -; -;Function : Output to disk -; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[] -;[]===========================================================[7] -;Procedure : Removable -; -;Function : Checking change line -; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable -; -;[]===========================================================[] -;[]===========================================================[8] -;Procedure : Generic IOCTL -; -;Function : Generic Input Output Control -; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : -; -;[]===========================================================[] -; -; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED - -; R_COM EQU #0F ;Command/Status -; R_TRK EQU #3F ;Track -; R_SEC EQU #5F ;Sector -; R_DAT EQU #7F ;Data -; R_DSK EQU #FF ;Drive Control -; COM_B EQU #1B - - - -//////////////////////////////////////////////////////////////////////// - MODULE FDD_DRV -//////////////////////////////////////////////////////////////////////// - - - -;------------------------------------------------- -; Обработчик FDD (rst 18h) -;------------------------------------------------- -API_TABLE: INC C - DEC C - JP Z,Init ;#00 Init - DEC C - JP Z,Open ;#01 Open - DEC C - JP Z,Close ;#02 Close - DEC C - JP Z,MediaCheck ;#03 MediaCheck - DEC C - JP Z,GetBPB ;#04 GetBPB - DEC C - JP Z,Read ;#05 Read - DEC C - JP Z,Write ;#06 Write - DEC C - JP Z,Removable ;#07 Removable - DEC C - JP Z,GenIOCTL ;#08 GenIOCTL - DEC C - JP Z,Reserved ;#09 - ; -Reserved: LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - - -;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Commands for restart #18 ; -;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; -Init: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? - AND A - RET -; ; ; - -; -Open: LD C,BIOS.DRV_RESET - RST ToBIOS - RET -; ; ; - -; -Close: XOR A - RET -; ; ; - - -;!FIXIT проверять ВГ93 когда это станет возможным -MediaCheck: IF NON_REMOVABLE_FDD - XOR A - ELSE - LD A,#FF - OR A - ENDIF - RET -; ; ; - - -;DE - ADDRESS -GetBPB: LD IX,0 - LD HL,0 - PUSH DE - PUSH AF - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP DE - POP HL - RET C - LD BC,BOOT_SECTOR.SectorsPerTrack - ADD HL,BC - LD E,(HL) - PUSH DE - LD A,D - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - LD A,H - POP HL - PUSH HL - LD H,A - POP AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS - XOR A - RET -; ; ; - - -; !TODO read track? -;READTR: XOR A -; RET -; ; ; - -; -Read: LD C,BIOS.DRV_READ - RST ToBIOS - RET -; ; ; - -; -Write: LD C,BIOS.DRV_WRITE - RST ToBIOS - RET -; ; ; - - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -GenIOCTL: BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.GetParams - ;!TODO - ;DEC B - ;JP Z,.ReadTrack - ;DEC B - ;JP Z,.TestTRK - ; - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - ; -.O_CTL_F: RES 7,B - INC B - DEC B - JP Z,.SetParams - ;!TODO - ;DEC B - ;JP Z,.WriteTRK - ;DEC B - ;JP Z,.FormatTRK - ; - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET -; ; ; - - -; Вход: - A - Drive number -; Выход: -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D1..D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.GetParams: EX DE,HL - LD BC,#55AA - AND #0F - SBC HL,BC - JR Z,.next - ; - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - ; -.next: PUSH AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - JR C,.NONE_FDD - PUSH HL - PUSH DE - LD A,H - LD H,0 - ; -.mull_loop1: ADD HL,HL - DEC A - JR NZ,.mull_loop1 - ; - ; HL - SECTOR PER CYLLINDER - ; A=0 ZF=0 CF=0 - LD B,H - LD C,L - ;LD HL,0 - ;XOR A - LD H,A - LD L,A - EX AF,AF' - ; -.mull_loop2: EX AF,AF' - ADD HL,BC - ADC A,0 - DEC DE - EX AF,AF' - LD A,D - OR E - JR NZ,.mull_loop2 - ; - ; A=0 DE=0 ZF=0 CF=0 - EX AF,AF' - LD E,A - EX DE,HL - ; H=0 - LD C,H ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - EXX - POP DE - POP HL - POP AF - EX AF,AF' - ; A=0 ZF=0 CF=0 - LD B,0 - LD C,L - LD L,H - LD H,B - EX DE,HL - EXX - AND A - RET - ; -.NONE_FDD: POP BC - LD A,DSS_Error.drv.INVALID_DRIVE - ; CF=1 - RET -; ; ; - - -; HL:DE - SECTORS ON LOGICAL DISK -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.SetParams: PUSH AF - EXX - EX DE,HL - LD H,L - LD L,C - POP AF - AND #0F - PUSH AF - PUSH HL - PUSH DE - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP DE - POP HL - JR C,.NONE_FDD - POP AF - LD C,BIOS.DRV_SET_PAR - JP ToBIOS - ;RST ToBIOS - ;RET C - ;AND A - ;RET -; ; ; - - -Removable: ; LD A,1 - ; AND A - XOR A - INC A - RET -; ; ; - -;============================================== - - ENDMODULE ; FDD_DRV - -//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm deleted file mode 100644 index 306d487..0000000 --- a/DSS/drivers/media/ide-drv.asm +++ /dev/null @@ -1,715 +0,0 @@ -;!TODO привести к общему виду в одну инструкцию, проверить корректность -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R02 06-08-2001 DNS Secondary IDE -;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk -;--------------------------------------------------------------- -; -; Disk Driver Specification ver. 2.20 -;[]===========================================================[0] -;Procedure: Initialization -; -;Function: Initialization device(s) -; -;Input: C = #00 -; IX = Environment -; -;Output: A = Amount drive support -;[]===========================================================[0] - -;[]===========================================================[1] -;Procedure: Open -; -;Function: Open disk -; -;Input: C = #01 -; A = Drive -; -;Output: None -;[]===========================================================[1] - -;[]===========================================================[2] -;Procedure: Close -; -;Function: Close disk -; -;Input: C = #02 -; A = Drive -; -;Output: None -;[]===========================================================[2] - -;[]===========================================================[3] -;Procedure: Media check -; -;Function: Checking change line -; -;Input: C = #03 -; A = Drive -; -;Output: A = #00 disk no changed -; #FF disk changed -;[]===========================================================[3] - -;[]===========================================================[4] -;Procedure: Get BPB -; -;Function: Get Block Parameters BIOS -; -;Input: C = #04 -; A = Drive -; DE = Address -; -;Output: None -;[]===========================================================[4] - -;[]===========================================================[5] -;Procedure: Read -; -;Function: Read from disk -; -;Input: C = #05 -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A = Drive -; -;Output: None -;[]===========================================================[5] - -;[]===========================================================[6] -;Procedure: Write -; -;Function: Write to disk -; -;Input: C = #06 -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; -;Output: None -;[]===========================================================[6] - -;[]===========================================================[7] -;Procedure: Removable -; -;Function: Checking change line -; -;Input: C = #07 -; A = Drive -; -;Output: A = #00 Removable -; A = #FF Non-removable -;[]===========================================================[7] - -;[]===========================================================[8] -;Procedure: Generic IOCTL -; -;Function: Generic Input Output Control -; -;Input: C = #08 -; B = Subcommand -; DE = #55AA Magic Number -; A = Drive -; -;Subcommands: #00 - Get Device Parameters -; #01 - Read track -; #02 - Test track -; #80 - Set Device Parameters -; #81 - Write track -; #82 - Format track -;Output: -;[]===========================================================[8] - -;[]===========================================================[9] -;Procedure: Read Long -; -;Function: Reading sectors from disk -; -;Input: C = #0A -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A' = Page -; -;Output: A' = Next Page -; HL:IX = Next Logical Block (sector) -; DE = Next Address -;[]===========================================================[9] - -;[]===========================================================[10] -;Procedure: Write Long -; -;Function: Writing sectors to disk -; -;Input: C = #0B -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A' = Page -; -;Output: A' = Next Page -; HL:IX = Next Logical Block (sector) -; DE = Next Address -;[]===========================================================[10] - -; -; Errors: -; 0 (#00) - NO ERRORS -; 1 (#01) - BAD COMMAND -; 2 (#02) - BAD DRIVE NUMBER -; 3 (#03) - UNKNOW FORMAT -; 4 (#04) - NOT READY -; 5 (#05) - SEEK ERROR -; 6 (#06) - SECTOR NOT FOUND -; 7 (#07) - CRC ERROR -; 8 (#08) - WRITE PROTECT -; 9 (#09) - READ ERROR -; 10 (#0A) - WRITE ERROR -; 11 (#0B) - FAILURE -; 12 (#0C) - BUSY (DEVICE OPENED) -; 13 (#0D) - RESERVED - -; IDE0 EQU #0C1C0 -; IDE1 EQU #0C1C8 -PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR - -HDDRIVE: INC C - DEC C - JP Z,INIT_H ; c=0 Initialization - DEC C - JP Z,RESE_H ; c=1 open - DEC C - JP Z,STAT_H ; c=2 close - DEC C - JP Z,CHEK_H ; c=3 media check (смена носителя) - DEC C - JP Z,GBPB_H ; c=4 get BPB - DEC C - JP Z,READH ; c=5 read (чтение секторов) - DEC C - JP Z,WRITEH ; c=6 write (запись секторов) - DEC C - JP Z,REMOV_H ; c=7 Removable - DEC C - JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL - DEC C - JP Z,.Reserved ; c=9 Reserved - DEC C - JP Z,LREADH ; c=10 Read Long - DEC C - JP Z,LWRITEH ; c=11 Write Long - ; -.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - - -//////////////////////////////////////////////////////////////////////// -// Commands for restart #18 // -//////////////////////////////////////////////////////////////////////// - -;--------------------------------------------------------------------[v] -; c=0 Initialization -INIT_H: PUSH IY - ;!TEST ;[ ] для rescanDRV - XOR A - LD (DRVCLC.count),A - ; - LD HL,LOGDRV - LD (OFFSECT),HL - - LD IX,SYS_PAGE.TMP_BUFFER - LD C,BIOS.DRV_LIST - RST ToBIOS - ; DRV_LIST: - ; +0 LEN - ; +1 FDD COUNT - ; +2 HDD COUNT - ; +3 CDROM COUNT - ; +4 RESERVED (28) - ; - IN A,(SLOT3) - LD C,A - LD A,SYS_PAGE - OUT (SLOT3),A - XOR A - LD B,(IX+2) ;количество HDD для процедуры NX_DVCI - CP B - LD A,C - OUT (SLOT3),A - JR Z,NO_HARDS - LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT - -NX_DVCI: PUSH BC - LD A,C - LD (DRV_NUM),A - LD C,BIOS.DRV_DETECT - RST ToBIOS - ;JR C,.NO_DRIVE - CALL NC,DEFINE_PARTITIONS.BEGIN - POP BC - INC C - JR C,NX_DVCI - DJNZ NX_DVCI - ; -NO_HARDS: - POP IY - ;!TEST - ; LD HL,(OFFSECT) - ; LD DE,LOGDRV - ; XOR A - ; SBC HL,DE - ; RET Z - ; LD DE,LOGDRV.TBL_Entry -DRVCLC: ; INC A - ; SBC HL,DE - ; JR NZ,DRVCLC - ; -.count+1: LD A,0 - ; - AND A - RET -;---------------------------------------------------------------------[^] - -; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -; ;+01 DWORD SECTOR OFFSET -; ;+05 DWORD SIZE IN SECTORS -; ;+09 FREE -; ;+15 -; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 -; .TBL_Entry EQU 16 -; .Size EQU $-LOGDRV -SELHDD: PUSH DE - PUSH HL - ; - LD L,A - LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - ADD IX,DE - LD E,(IY+3) - LD D,(IY+4) - POP HL - ADC HL,DE - LD A,(IY+0) ;DRIVE NUMBER - POP DE - RET - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -IOCTL_H BIT 7,B - JR NZ,O_CTL_H - INC B - DEC B - JP Z,HGETPRM - DEC B - JP Z,HRDTRAC - DEC B - JP Z,HCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -O_CTL_H RES 7,B - INC B - DEC B - JP Z,HSETPRM - DEC B - JP Z,HWRTRAC - DEC B - JP Z,HFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -HCHTRAC LD B,L - CALL CHECKH - RET - -HSETPRM AND A - RET - -HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - DRIVE/HEAD REGISTER PHISICAL DISK: -; bit7 - reserved "1" -; bit6 - ADDRESSING MODE LBA/CHS -; bit5 - reserved "1" -; bit4 - DEVICE MASTER/SLAVE -; bit3 - reserved "0" (MAY BE OTHER) -; bit2 - reserved "0" (MAY BE OTHER) -; bit1 - reserved "0" (MAY BE OTHER) -; bit0 - Primary/Secondary Chanel -HGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - ; - PUSH IX - PUSH IY - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - PUSH IY - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP IY - LD A,DSS_Error.drv.INVALID_DRIVE - JR C,.error - ; перетасовка регистров с результатом от BIOS - EX DE,HL - LD C,E - LD E,D - LD D,0 - LD A,B - LD B,D - EXX - ; SECTORS ON LOGICAL DISK - LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) - LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) - LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) - LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) - ; - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска - ; - EX AF,AF' - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - EX AF,AF' - ; - AND A -.error: POP IY - POP IX - RET - -REMOV_H: - LD A,1 - AND A - RET - - - -RESE_H: XOR A - RET - -STAT_H: XOR A - RET - -CHEK_H: ;LD A,#FF - XOR A - ;AND A - RET - - -; DE - ADDRESS -; A - DRIVE -GBPB_H: PUSH IY - PUSH DE - LD L,A - ; - LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - LD L,(IY+3) - LD H,(IY+4) - LD XL,E - LD XH,D - LD A,(IY+0) - POP DE - POP IY - LD BC,1*256 + BIOS.DRV_READ - JP ToBIOS - - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A'- PAGE -; A - HDD LOG NUMBER -;READ SECTOR -LREADH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_READ_LONG - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A'- PAGE -; A - HDD LOG NUMBER -;WRITE SECTOR -LWRITEH: - PUSH IY - CALL SELHDD - LD C,BIOS.DRV_WRITE_LONG - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;WRITE SECTOR -WRITEH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_WRITE - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;READ SECTOR -READH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_READ - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;CHECK SECTOR -CHECKH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_VERIFY - RST ToBIOS - POP IY - RET - -;------------------------------[ PARTIT ]------------------------------; -DEFINE_PARTITIONS: -.FAT32_DOS: ; -.EASYDOS: ; -.MEDIDOS: ; -.HIGHDOS: ; - LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) - LD IX,(CURRENT_SECTOR_L) - ADD IX,DE - LD DE,(CURRENT_SECTOR_H) - ADC HL,DE - LD D,XH - LD E,XL - ;BPB SECTOR - LD IX,(OFFSECT) - LD (IX + LOGDRV.SECTOR_OFFSET + 0),E - LD (IX + LOGDRV.SECTOR_OFFSET + 1),D - LD (IX + LOGDRV.SECTOR_OFFSET + 2),L - LD (IX + LOGDRV.SECTOR_OFFSET + 3),H - LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) - ;SIZE DISK - LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E - LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D - LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L - LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -.ExtendedPartitionFlag+1: - LD A,0 - OR A ; !TODO загрузка с расширенного раздела не поддерживается - LD A,#FF - JR NZ,.not_supported ; если расширенный раздел, то облом - ; - POP BC - PUSH BC - LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table - SUB B -.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A - ; - ;!TEST Подстраховка от переполнения таблицы LOGDRV - LD A,(DRVCLC.count) - INC A - CP DSS_MAX_DRIVES_AMOUNT+1 - RET NC - LD (DRVCLC.count),A - ; - LD A,(DRV_NUM) - LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A - LD DE,LOGDRV.TBL_Entry ;DSKITEM - ADD IX,DE - LD (OFFSECT),IX - JP .NextPartition - ; -.NotExtended: CP PartitionSysTypes.FAT16 - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_LBA - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,.MEDIDOS - CP PartitionSysTypes.FAT12 - JR Z,.EASYDOS - ;[ ] fat32 - CP PartitionSysTypes.FAT32 - JP Z,.FAT32_DOS - CP PartitionSysTypes.FAT32_LBA - JP Z,.FAT32_DOS - ; - CP PartitionSysTypes.Win_Ext_LBA - JR Z,.SubLevel - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - ;OR A ;PartitionSysTypes.Empty - ;JR NZ,NXTPART - JR .NextPartition ; раздел не поддерживается - ;POP BC ; баланс стека - ;RET - ;POP BC - ;OR A - ;RET Z - ;NODEFIN: - ;SCF - ;RET - ; -.BEGIN: IN A,(SLOT3) - PUSH AF - LD A,SHARED_PAGE - OUT (SLOT3),A - CALL .Start - POP AF - OUT (SLOT3),A - RET -.Start: LD IX,0 - LD DE,0 - LD (EXTDOSL),DE ;R01 - LD (EXTDOSH),IX ;R01 - ; -.LOOP: LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - ; - LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) - LD DE,#AA55 - AND A - SBC HL,DE - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - ;JR NZ,NODEFIN - SCF - RET NZ - ; - LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR - LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table -.DOSAGA: PUSH BC - LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) - CP PartitionSysTypes.Extended - JR Z,.SubLevel - CP PartitionSysTypes.Win_Ext_LBA - JR NZ,.NotExtended - ; -.SubLevel: PUSH IY - LD DE,(CURRENT_SECTOR_L) - LD IX,(CURRENT_SECTOR_H) - PUSH DE - PUSH IX - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - INC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - CALL .ParseExtended - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - DEC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - POP IX - POP DE - LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - POP IY -.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry - ADD IY,DE - POP BC - DJNZ .DOSAGA - AND A - RET - ; -.ParseExtended: LD HL,(EXTDOSL) - LD DE,(EXTDOSH) - LD A,L - OR H - OR E - OR D - LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) - LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) - LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) - JP NZ,.ext_in_ext - LD (EXTDOSL),DE - LD (EXTDOSH),HL - PUSH DE - JR .set_regs - ; -.ext_in_ext: LD IX,(EXTDOSL) - ADD IX,DE - LD DE,(EXTDOSH) - ADC HL,DE - PUSH IX -.set_regs: PUSH HL - POP IX - POP DE - JP .LOOP - ; -.LOAD_SECTOR: PUSH IY - LD IX,(CURRENT_SECTOR_L) - LD HL,(CURRENT_SECTOR_H) - LD DE,PARTITION_BUFFER - LD A,(DRV_NUM) - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP IY - RET -;----------------------------------------------------------------------; -; - -;======================================================================= -; PHISICAL DRIVE NUMBER -; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв -DRV_NUM: DB #00 -CURRENT_SECTOR_L: DW #0000 -CURRENT_SECTOR_H: DW #0000 -EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE -EXTDOSH: DW #0000 -OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD -;======================================================================= \ No newline at end of file diff --git a/DSS/drivers/media/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm deleted file mode 100644 index b9b5480..0000000 --- a/DSS/drivers/media/ram_disk-drv.asm +++ /dev/null @@ -1,533 +0,0 @@ - - -; SYSPAGE EQU #FE -; SLOT1 EQU #A2 -; SLOT2 EQU #C2 -; SLOT3 EQU #E2 - -; ORG #3CDB -; Disk Driver Specification ver. 2.20 -;[]===========================================================[ 0] -;Procedure : Initialization -; -;Function : Initialization device(s) -; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver -;[]===========================================================[ 0] - - -;[]===========================================================[ 1] -;Procedure : Open -; -;Function : Open disk -; -;Input : C = 01h -; A - Drive -;Output : None -; -;[]===========================================================[ 1] - - -;[]===========================================================[ 2] -;Procedure : Close -; -;Function : Close disk -; -;Input : C = 02h -; A - Drive -;Output : None -; -;[]===========================================================[ 2] - - -;[]===========================================================[ 3] -;!TODO -;Procedure : Media check -; -;Function : Checking change line -; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed -; -;[]===========================================================[ 3] - - -;[]===========================================================[ 4] -;Procedure : Get BPB -; -;Function : Get Block Parameters BIOS -; -;Input : C = 04h -; DE - Address -;Output : None -; -;[]===========================================================[ 4] - - -;[]===========================================================[ 5] -;Procedure : Input -; -;Function : Input from disk -; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 5] - - -;[]===========================================================[ 6] -;Procedure : Output -; -;Function : Output to disk -; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 6] - - -;[]===========================================================[ 7] -;!TODO -;Procedure : Removable -; -;Function : Checking change line -; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable -; -;[]===========================================================[ 7] - - -;[]===========================================================[ 8] -;Procedure : Generic IOCTL -; -;Function : Generic Input Output Control -; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : -; -;[]===========================================================[ 8] - - -;[]===========================================================[ 9] -; RESERVED -;[]===========================================================[ 9] - - -;[]===========================================================[ 10] -;!TODO -;Procedure : Read Long -; -;Function : Reading sectors from disk -; -;Input : C = 0Ah -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 10] - - -;[]===========================================================[ 11] -;!TODO -;Procedure : Write Long -; -;Function : Writing sectors to disk -; -;Input : C = 0Bh -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 11] -; -; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED - - -; MACRO CALL GET_RAMDRV_NUM -; LD BC,RAMDTBL -; SLA A -; ADD A,C -; LD C,A -; LD A,0 -; ADC A,B -; LD B,A -; INC BC -; LD A,(BC) -; OR #60 ;!HARDCODE сделать номера разных устройств через метки -; ENDM - - -; parser -RMDRIVE: INC C - DEC C - JP Z,INIT_RD ; 0 - DEC C - JR Z,RESET_RD ; 1 - DEC C - JR Z,STATUS_RD ; 2 - DEC C - JR Z,CHEK_RD ; 3 - DEC C - JR Z,GBPB_RD ; 4 - DEC C - JR Z,READ_RD ; 5 - DEC C - JR Z,WRITE_RD ; 6 - DEC C - JR Z,REMOV_RD ; 7 - DEC C - JP Z,IOCTL_RD ; 8 - DEC C - JP Z,.error ; 9 RESR_H - DEC C - JP Z,LREAD_RD ; 10 - DEC C - JP Z,LWRITE_RD ; 11 -.error: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -REMOV_RD: -RESET_RD: -STATUS_RD: XOR A - RET - -;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение - ;!FIXIT как-то определять смену RMD? - ; [x] 18/08/2024 пока немного костыльно и опасно -CHEK_RD: ;LD A,#FF - ;AND A - XOR A - ; - RET - -;DE - ADDRESS -GBPB_RD: LD IX,0 - LD HL,0 - LD B,#01 - ;JP READ_RD -;READ SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -READ_RD: PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_READ - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET -LREAD_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_READ_LONG - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET - -;WRITE SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -WRITE_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_WRITE - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET - -LWRITE_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_WRITE_LONG - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET - -; -;; -;;; -;----------------------------------------------------------------------;!TEST -; ;S_P_P DB #00 -; INIT_RD: -; ; .SectorSize EQU 512 ;!HARDCODE -; ; LD HL,.SectorSize -; ; LD A,#80 -; ; .loop: SRL A -; ; RR H -; ; JR NC,.loop -; ; LD (S_P_P),A - -; LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk -; LD DE,RAMDTBL -; .initLoop: -; PUSH BC -; LD A,B -; PUSH DE -; RST ToBIOS -; POP DE -; OR A -; JR Z,.noDRV - -; LD (DE),A -; INC DE -; POP BC -; LD A,B -; LD (DE),A -; INC DE -; JP 1F -; .noDRV: POP BC -; 1: INC B -; LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry -; CP B -; JR NZ,.initLoop - -; LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL -; EX DE,HL -; AND A ;!FIXIT ---- -; SBC HL,DE ;!FIXIT ADD HL,DE -; SRL L -; LD A,L -; ; LD HL,ENDDRVR -; AND A -; RET -;----------------------------------------------------------------------;!TEST -;;; -;; -; - -; -;; -;;; -;----------------------------------------------------------------------;!TEST -;S_P_P DB #00 -INIT_RD: -; .SectorSize EQU 512 ;!HARDCODE -; LD HL,.SectorSize -; LD A,#80 -; .loop: SRL A -; RR H -; JR NC,.loop -; LD (S_P_P),A - - LD BC,0*256+BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk - LD DE,RAMDTBL -.initLoop: PUSH BC - LD A,B - PUSH DE - RST ToBIOS - POP DE - OR A - JR Z,.noDRV - ; - INC DE - LD (DE),A - DEC DE - ; - POP BC - LD A,B - LD (DE),A - INC DE - INC DE - JP .skip_pop - ; -.noDRV: POP BC -.skip_pop: INC B - LD A,RAMDTBL.Size/RAMDTBL.TBL_Entry - CP B - JR NZ,.initLoop - - LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL - EX DE,HL - AND A ;!FIXIT ---- - SBC HL,DE ;!FIXIT ADD HL,DE - SRL L - LD A,L - ; LD HL,ENDDRVR - AND A - RET -;----------------------------------------------------------------------;!TEST -;;; -;; -; - -; ; -; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -; RAMDTBL.TBL_Entry EQU 2 -; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry -; DB #FF -; EDUP -; .Size EQU $-RAMDTBL -; ; - - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -IOCTL_RD: - BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.RGETPRM - ;DEC B - ;JP Z,FRDTRAC - ;DEC B - ;JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -.O_CTL_F: ;RES 7,B - ;INC B - ;DEC B - ;JP Z,.RSETPRM - ;DEC B - ;JP Z,FWRTRAC - ;DEC B - ;JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL:DE - SECTORS ON LOGICAL DISK -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.RGETPRM: EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - ; - EX AF,AF' - LD A,L - CALL GET_RAMDRV_NUM - PUSH AF - PUSH AF - EX AF,AF' - - POP AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - - PUSH HL ;число головок, число секторов (на целиндр) - PUSH DE ;количество цилиндров - EXX - POP HL ;количество цилиндров - POP BC ;число секторов (на целиндр) - LD D,0 - LD E,B ;число головок - LD B,D - EXX - - LD A,L - - RRA - JR C,.end -.loopShift: SLA E - RL D - RRA - JR NC,.loopShift - ; -.end: EX AF,AF' - POP AF - EX AF,AF' - XOR A - LD L,A - LD H,L - LD C,A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD A,%10100000 - RET - -; !TODO -; !FIXIT -; .RSETPRM: AND A -; RET - -GET_RAMDRV_NUM: LD BC,RAMDTBL -.skip_tbl: ADD A,A - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - ;INC BC - LD A,(BC) - OR #60 ;!HARDCODE сделать номера разных устройств через метки - RET -; -;ENDDRVR EQU $ -; \ No newline at end of file diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm deleted file mode 100644 index 97f01cc..0000000 --- a/DSS/drivers/media/shared-drv.asm +++ /dev/null @@ -1,290 +0,0 @@ -;[BEGIN] -;//MODULE: Shared AUTHOR: Denis Parinov -;//CREATE: A LONG TIME AGO :) -;--------------------------------------------------------------- -;Rev Date Name Description -;R01 17-04-2023 BAO Добавлена процедура INITDVC_RET_DRIVE и изменена INTDISK для поддержки рескана драйвов -;--------------------------------------------------------------- - - - -; DISK DRIVER SPECIFICATION -; !FIXIT некорректная! -;--------------------------------------------- -; COMMAND 00h (INITIALIZATION) -; -; INPUT: A - DRIVE LETTER -; IX - ENVIRONMENT -; RETURN: A - AMOUNT DRIVE SUPPORT -; HL - LENGTH DRIVER -;--------------------------------------------- -; COMMAND 01h (OPEN) -; -; INPUT: A - DRIVE -; -;--------------------------------------------- -; COMMAND 02h (CLOSE) -; -; INPUT: A - DRIVE -; RETURN: A - -;--------------------------------------------- -; COMMAND 03h (MEDIA CHECK) -; -; INPUT: A - DRIVE -; RETURN: A - 00h - OLD DISK, 0FFh - NEW DISK -;--------------------------------------------- -; COMMAND 04h (GET BPB) -; -; INPUT: HL - ADDRESS -; A - DRIVE -;--------------------------------------------- -; COMMAND 05h (INPUT) -; -; INPUT: IX:DE - ABSOLUTE SECTOR -; HL - MEMORY ADDRESS -; B - SECTORS COUNT -; A - DRIVE -;--------------------------------------------- -; COMMAND 06h (OUTPUT) -; -; INPUT: IX:DE - ABSOLUTE SECTOR -; HL - MEMORY ADDRESS -; B - SECTORS COUNT -; A - DRIVE -;--------------------------------------------- -; COMMAND 07h (REMOVABLE) -; -; INPUT: A - DRIVE -; RETURN: A = 0 - REMOVABLE -; A = 1 - NONREMOVABLE -;--------------------------------------------- -; COMMAND 08h (GENERIC IOCTL) -; -; INPUT: A - DRIVE -; B - SUBCOMMAND -; DE - MAGIC NUMBER (55AAh) -; SUBCOMMAND -;---------------------- -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -;--------------------------------------------- -; -; ERRORS: -; 0 - NO ERRORS -; 1 - BAD COMMAND -; 2 - BAD DRIVE NUMBER -; 3 - UNKNOW FORMAT -; 4 - NOT READY -; 5 - SEEK ERROR -; 6 - SECTOR NOT FOUND -; 7 - CRC ERROR -; 8 - WRITE PROTECT -; 9 - READ ERROR -; 10 - WRITE ERROR -; 11 - FAILURE -; 12 - BUSY (DEVICE OPENED) -; 13 - RESERVED - -;INTDISK PUSH HL -; PUSH BC -; LD HL,DEVICE -; INC A -;INTD001 DEC A -; JP Z,YEP -; LD C,(HL) -; INC C -; INC HL -; INC HL -; INC HL -; JP NZ,INTD001 -; POP BC -; POP HL -; LD A,2 -; SCF -; RET - -;YEP LD A,(HL) -; INC HL -; LD C,(HL) -; INC HL -; LD H,(HL) -; LD L,C -; POP BC -; EX (SP),HL -; RET - - -;----------------------------------------------------------- -; Просканировать систему на FDD/HDD девайсы и RAM-диски -;----------------------------------------------------------- -INITDVC: XOR A - LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку - LD HL,DEVICE - LD (PDEVICE),HL ; восст. ячейку - ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] - LD HL,DEVICE - LD (HL),#FF - LD DE,DEVICE+1 - LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 - LDIR - ; FDD девайсы - CALL FDD_DRV.Init ; узнать число FDD-девайсов - LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы -.if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET - LD DE,HDDRIVE - CALL MAKEDVC - ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE - CALL MAKEDVC - XOR A - RET - -; Инициировать таблицу переходов девайса. -; вход: de=адрес обработчика девайса -; a=число девайсов (0=нет) -MAKEDVC: LD C,A - LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска - ADD A,(HL) - LD (HL),A - ;!TEST ;[ ] оптимизировать было лень - CP DSS_MAX_DRIVES_AMOUNT+1 - JR C,1F - LD (HL),DSS_MAX_DRIVES_AMOUNT - SUB DSS_MAX_DRIVES_AMOUNT - NEG - ADD C - JP 2F - ; -1: LD A,C - OR A - RET Z ; нет девайсов -2: LD C,0 ; сбр. - LD HL,(PDEVICE) ; тек. полож. в таблице -.loop: LD (HL),C ; номер лог.драйва этого устройства - INC HL - LD (HL),E ; de=адрес обработчика - INC HL - LD (HL),D - INC HL - INC C ; ++номер драйва - DEC A - JR NZ,.loop - LD (PDEVICE),HL - DEC A - LD (HL),A - RET - - -;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые -;------------------------------------------------- -; RST 18h. Вектор дисковых устройств -; вход: a=номер устройства (0-25) -;------------------------------------------------- -INTDISK: - ;R01 - CP #FF - JR NZ,.noNeedRescan - CP C - ;JR Z,INITDVC_RET_DRIVE - JR Z,ReScanDRV -.noNeedRescan: - ; - PUSH HL - PUSH BC - _CALC_DEVICE_ENTRY DEVICE - LD A,(HL) - CP #FF - JR Z,NODEV - INC HL - LD C,(HL) - INC HL - LD H,(HL) - LD L,C - POP BC - EX (SP),HL - RET -NODEV: POP BC - POP HL - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET - -PDEVICE DW DEVICE -; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF -; .Size: DB #FF -; .TBL_Entry EQU 3 - -FLOPPY EQU #0001 -FIXED EQU #0002 -CDROM EQU #0004 -NETWORK EQU #0008 - -;DISKS: DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"A:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #00 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"B:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #01 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FIXED ;DISK TYPE -; DB 2,"C:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT16 " -; DB #80 ;PHISICAL DRIVE NUMBER -; -; DB #00 ;END OF TABLE -;----------------------------------------------------------------------- - - ;R01 -; INITDVC_RET_DRIVE: -; CALL INITDVC -; LD A,(DRV_PAGE.LDRIVE) -; AND A -; RET - ; - - - -//////////////////////////////////////////////////////////////////////// -// NEW RESCAN // -//////////////////////////////////////////////////////////////////////// - INCLUDE 'ReScanDRV.ASM' -//////////////////////////////////////////////////////////////////////// - - -;DEVICE DB #00 -; DW FDDRIVE ; FDD A -; DB #01 -; DW FDDRIVE ; FDD B -; DB #00 -; DW HDDRIVE ; HDD C -; DB #01 -; DW HDDRIVE ; HDD D -; DB #02 -; DW HDDRIVE ; HDD E -; DB #03 -; DW HDDRIVE ; HDD F -; DB #04 -; DW HDDRIVE ; HDD G -; DB #05 -; DW HDDRIVE ; HDD H -; DB #06 -; DW HDDRIVE ; HDD I -; DB #07 -; DW HDDRIVE ; HDD J -; DB #FF \ No newline at end of file From 9d0d096208526052128949febe861932ff47412e Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 16 Dec 2024 22:14:32 +1000 Subject: [PATCH 179/219] .. --- DSS/API.asm | 26 +- DSS/API/Attribute.asm | 2 +- DSS/API/ChDir.asm | 2 +- DSS/API/Clear.asm | 14 + DSS/API/Create.asm | 2 +- DSS/API/Cursor.asm | 10 + DSS/API/Delete.asm | 2 +- DSS/API/Execute.ASM | 4 +- DSS/API/Find.asm | 2 +- DSS/API/GetVMod.asm | 14 + DSS/API/Locate.asm | 10 + DSS/API/MkDir.asm | 4 +- DSS/API/Move_FP.asm | 41 + DSS/API/Open.asm | 2 +- DSS/API/PChars.asm | 14 + DSS/API/PutChar.asm | 98 +++ DSS/API/RdChar.asm | 15 + DSS/API/Rename.asm | 2 +- DSS/API/RmDir.asm | 2 +- DSS/API/Scroll.asm | 105 +++ DSS/API/SelPage.asm | 20 + DSS/API/SetVMod.asm | 246 ++++++ DSS/API/Time.asm | 1 + DSS/API/WinCopy.asm | 23 + DSS/API/WinRest.asm | 23 + DSS/API/WrChar.asm | 23 + DSS/DOS_FM.ASM | 207 ----- DSS/DOS_Proc.asm | 158 +++- DSS/DSS-MAIN.ASM | 6 +- DSS/FS/CDFS.ASM | 3 + DSS/FS/{FAT/FAT_X.asm => FAT.asm} | 1208 +++++++++++++++++++++++++++- DSS/FS/FAT/FAT.asm | 1199 --------------------------- DSS/FS_Module.asm | 8 + DSS/Kernel_Panic.asm | 81 -- DSS/Procedures.asm | 86 +- DSS/VIDEO.ASM | 696 ---------------- DSS/drivers/media/ReScanDRV.ASM | 495 ++++++++++++ DSS/drivers/media/fdd-drv.asm | 417 ++++++++++ DSS/drivers/media/ide-drv.asm | 715 ++++++++++++++++ DSS/drivers/media/ram_disk-drv.asm | 533 ++++++++++++ DSS/drivers/media/shared-drv.asm | 290 +++++++ 41 files changed, 4572 insertions(+), 2237 deletions(-) create mode 100644 DSS/API/Clear.asm create mode 100644 DSS/API/Cursor.asm create mode 100644 DSS/API/GetVMod.asm create mode 100644 DSS/API/Locate.asm create mode 100644 DSS/API/Move_FP.asm create mode 100644 DSS/API/PChars.asm create mode 100644 DSS/API/PutChar.asm create mode 100644 DSS/API/RdChar.asm create mode 100644 DSS/API/Scroll.asm create mode 100644 DSS/API/SelPage.asm create mode 100644 DSS/API/SetVMod.asm create mode 100644 DSS/API/WinCopy.asm create mode 100644 DSS/API/WinRest.asm create mode 100644 DSS/API/WrChar.asm delete mode 100644 DSS/DOS_FM.ASM create mode 100644 DSS/FS/CDFS.ASM rename DSS/FS/{FAT/FAT_X.asm => FAT.asm} (56%) delete mode 100644 DSS/FS/FAT/FAT.asm create mode 100644 DSS/FS_Module.asm delete mode 100644 DSS/Kernel_Panic.asm delete mode 100644 DSS/VIDEO.ASM create mode 100644 DSS/drivers/media/ReScanDRV.ASM create mode 100644 DSS/drivers/media/fdd-drv.asm create mode 100644 DSS/drivers/media/ide-drv.asm create mode 100644 DSS/drivers/media/ram_disk-drv.asm create mode 100644 DSS/drivers/media/shared-drv.asm diff --git a/DSS/API.asm b/DSS/API.asm index bded5af..5cb89d0 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -11,9 +11,9 @@ ;R009 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) ;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 -;R008 - 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS -;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR -;R10 - 03-04-2003 DNS IMPROVED FN. VERSION +;R008 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS +;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR +;R10 03-04-2003 DNS IMPROVED FN. VERSION ;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. ;R007 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN FROM "." ".NAM" ;R006 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME @@ -21,6 +21,8 @@ ;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES ;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT ;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES +;R101 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) +;R102 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" ;R001 16-12-1999 DNS Y2K fix ;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS ;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR @@ -28,10 +30,23 @@ ;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) ;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" ;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" - ; ;--------------------------------------------------------------- - + ; VIDEO + include 'API/Clear.asm' + include 'API/PChars.asm' + include 'API/PutChar.asm' + include 'API/Locate.asm' + include 'API/Cursor.asm' + include 'API/RdChar.asm' + include 'API/WrChar.asm' + include 'API/WinCopy.asm' + include 'API/WinRest.asm' + include 'API/Scroll.asm' + include 'API/SelPage.asm' + include 'API/GetVMod.asm' + include 'API/SetVMod.asm' + ; include 'API/Version.asm' include 'API/bootDsk.asm' include 'API/curDisk.asm' @@ -67,6 +82,7 @@ include 'API/Lib_Sub.asm' include "API/EXECUTE.ASM" include "API/Print.asm" + include "API/Move_FP.asm" diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 8f07db9..27b8259 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -74,7 +74,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 .OPENATR: ;!TEST ;[x] 16/11/23 optimize get attribute ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) ; - CALL GETWORD ; тест на допуст. имя и настр. на диск + CALL SetPath_GetName ; тест на допуст. имя и настр. на диск RET C ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index 5a50614..ff2a5a4 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -34,7 +34,7 @@ CHDIR_FN: POP AF RET ; -CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск +CHDIR: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME LD A,(HL) diff --git a/DSS/API/Clear.asm b/DSS/API/Clear.asm new file mode 100644 index 0000000..85b994d --- /dev/null +++ b/DSS/API/Clear.asm @@ -0,0 +1,14 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #56. Очистить окно. +; +; вход: D - строка левого верхнего угла окна +; E - столбец левого верхнего угла окна +; H - высота окна +; L - ширина окна +; A - символ заполнитель +; B - атрибут заполнитель +; выход: нет +;/////////////////////////////////////////////////////////////////////// +CLEAR: LD C,BIOS.LP_CLS_WIN2 + JP ToBIOS +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index d41492b..05de412 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -106,7 +106,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: AND FAT_ATTR.NoDIRnoVolID LD (.TMP),A LD (.PATH0),HL - CALL GETWORD + CALL SetPath_GetName RET C ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER diff --git a/DSS/API/Cursor.asm b/DSS/API/Cursor.asm new file mode 100644 index 0000000..69354c4 --- /dev/null +++ b/DSS/API/Cursor.asm @@ -0,0 +1,10 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #53. Узнать положение курсора. +; +; вход: нет +; выход: D - строка курсора +; E - колонка курсора +;/////////////////////////////////////////////////////////////////////// +CURSOR: LD C,BIOS.LP_GET_PLACE + JP ToBIOS +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 8c032f4..7f4b863 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -17,7 +17,7 @@ DEL_FN: ;!TEST POP HL RET C ; -.old_EXE: CALL GETWORD ; тест на допуст. имя и настр. на диск +.old_EXE: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск RET C ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 7f22599..e663ac3 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -96,7 +96,7 @@ EXEC_1: ;LD (CMDLINE),HL LD HL,(CMDLINE) LD A,FAT_ATTR.READ_ONLY LD (OPEN_FN.TMP),A - CALL GETWORD + CALL SetPath_GetName RET C ; LD HL,TMPNAME ; LD DE,MASKARE @@ -407,7 +407,7 @@ FRC000: LD A,(DE) CALL MOVE_FP ; LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE -_ret+1: JP 0 +_ret+1: JP 0 ;EXEC02.RET1 или _RET_2 _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 3aeef59..398de00 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -30,7 +30,7 @@ F_FIRST_FN: CALL F_FIRST.INIT_VARS JR F_FIRST.begin ; F_FIRST: CALL .INIT_VARS -.begin: CALL GETWORD +.begin: CALL SetPath_GetName ;CALL LOADDIR RET C CALL MASK diff --git a/DSS/API/GetVMod.asm b/DSS/API/GetVMod.asm new file mode 100644 index 0000000..db35484 --- /dev/null +++ b/DSS/API/GetVMod.asm @@ -0,0 +1,14 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #51. Получить текущий режим экрана. +; +; вход: нет +; выход: A - текущий режим экрана +; B - страница экрана 0/1 +;/////////////////////////////////////////////////////////////////////// +GETVMOD: + IN A,(SCREEN_SWITCH) + LD B,A + LD A,(VMODE) + AND A + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Locate.asm b/DSS/API/Locate.asm new file mode 100644 index 0000000..b0c96a2 --- /dev/null +++ b/DSS/API/Locate.asm @@ -0,0 +1,10 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #52. Установить положение курсора. +; +; вход: D - строка курсора +; E - колонка курсора +; выход: нет +;/////////////////////////////////////////////////////////////////////// +LOCATE: LD C,BIOS.LP_SET_PLACE + JP ToBIOS +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 581ec75..d4a04e1 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -32,7 +32,7 @@ MKDIR: POP AF RET ; -.START: CALL GETWORD ; тест на допуст. имя и настр. на диск +.START: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск RET C ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER @@ -40,7 +40,7 @@ MKDIR: ; CALL MASK RET C - ;!TEST optimization ранее GETWORD уже загрузил директорию + ;!TEST optimization ранее SetPath_GetName уже загрузил директорию ;CALL LOADDIR ; прочитать список каталога ; CALL SEARCH.Dir ; поиск записи каталога в списке диска diff --git a/DSS/API/Move_FP.asm b/DSS/API/Move_FP.asm new file mode 100644 index 0000000..829277e --- /dev/null +++ b/DSS/API/Move_FP.asm @@ -0,0 +1,41 @@ +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR +MOVE_FP: CALL SET_FM + RET C + INC B + DJNZ .B_1 + ;from Start File + ; B=0 +.F_start: LD C,B + LD D,B + LD E,B + JP .DO + ; +.B_1: DJNZ .B_2 + ;from Current Position +.F_current: LD C,(IY+_sFM.F_POSITION) + LD B,(IY+_sFM.F_POSITION+1) + LD E,(IY+_sFM.F_POSITION+2) + LD D,(IY+_sFM.F_POSITION+3) +.DO: ADD IX,BC + ADC HL,DE + LD D,XH + LD E,XL + LD (IY+_sFM.F_POSITION),E + LD (IY+_sFM.F_POSITION+1),D + LD (IY+_sFM.F_POSITION+2),L + LD (IY+_sFM.F_POSITION+3),H + XOR A + RET + ; +.B_2: DJNZ .error + ;from End File +.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) + LD B,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.FS_REC.F_SIZE+2) + LD D,(IY + _sFM.FS_REC.F_SIZE+3) + JP .DO + ; B > 2 +.error: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index d0393f2..3972010 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -29,7 +29,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 .old_EXE: ;JR .start ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; -.start: CALL GETWORD +.start: CALL SetPath_GetName RET C CALL MASK RET C diff --git a/DSS/API/PChars.asm b/DSS/API/PChars.asm new file mode 100644 index 0000000..abad0f8 --- /dev/null +++ b/DSS/API/PChars.asm @@ -0,0 +1,14 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #5C. Вывод строки на экран. +; +; вход: HL - указатель на строку символов +; выход: HL - указатель на следующую строку символов +; PRINT NULL-TERMINATED CHARS STRING +;/////////////////////////////////////////////////////////////////////// +PCHARS: LD A,(HL) + INC HL + OR A + RET Z + CALL PUTCHAR + JP PCHARS +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/PutChar.asm b/DSS/API/PutChar.asm new file mode 100644 index 0000000..13cf58b --- /dev/null +++ b/DSS/API/PutChar.asm @@ -0,0 +1,98 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #5B. Вывод символа на экран в тек. позиции. +; +; вход: A - символ +; выход: нет +;/////////////////////////////////////////////////////////////////////// +PUTCHAR: ;CALL .NO_SCROLL + CP #0E + JR C,.control_characters + ; + LD BC,1*256 + BIOS.LP_PRINT_SYM + ;[x] CR+LF+SCROLL + RST ToBIOS + ; + ; проверка на переход курсора в самое начало (X:Y == 0:0) + CALL CURSOR + LD A,D + OR E + RET NZ + ; +.LFF: PUSH HL + LD BC,1*256 + BIOS.LP_SCROLL_UD + LD DE,#0020 + RST ToBIOS + LD DE,#1F00 + CALL LOCATE + LD A,' ' + LD BC,#50*256 + BIOS.LP_PRINT_SYM + RST ToBIOS + LD DE,#1F00 + CALL LOCATE + POP HL + RET +.TB_: CALL CURSOR + IF TABisSPACES + LD B,E + LD A,E + AND #F8 + ADD A,8 + SUB B + LD B,A + LD A,' ' + LD C,BIOS.LP_PRINT_SYM + JP ToBIOS + ELSE + LD A,E + ADD A,8 + AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти + LD E,A + JP LOCATE + ENDIF +.BK_: CALL CURSOR + XOR A + CP E + RET Z + DEC E + JP LOCATE + ; +.LF_: CALL CURSOR + LD A,D + CP #1F + JR NC,.LFF + INC D + IFN EnoughtOnly_LF + JP LOCATE + ELSE + CALL LOCATE + ; !!!! НЕ разрывать LF_ и CR_ !!!! + ENDIF +.CR_: CALL CURSOR + LD E,0 + JP LOCATE + ; +.control_characters: + CP "\r" + JR Z,.CR_ + CP "\n" + JR Z,.LF_ + CP "\t" ; tab + JR Z,.TB_ + CP "\b" ; backspace + JR Z,.BK_ + CP "\a" ; [x] Beep in PChars/PUTCHAR + RET NZ + ; [x] Beep in PChars/PUTCHAR +.BELL: LD DE,1200 + PUSH HL + LD HL,4 + CALL BEEP + POP HL + RET + ; +; [x] -bug with Vasil's version of cursor +.NO_SCROLL: CP #0E + JR C,.control_characters +._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM + JP ToBIOS +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/RdChar.asm b/DSS/API/RdChar.asm new file mode 100644 index 0000000..5619238 --- /dev/null +++ b/DSS/API/RdChar.asm @@ -0,0 +1,15 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #57. Прочитать символ с экрана. +; +; вход: D - строка +; E - колонка +; выход: A - символ +; B - атрибут +;/////////////////////////////////////////////////////////////////////// +RDCHAR: XOR A + LD C,BIOS.WIN_GET_SYM + RST ToBIOS + LD A,L + LD B,H + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index 4acb58f..2363f36 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -25,7 +25,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 RET C ; .old_EXE: ; - ; !TODO воткнуть тут GETWORD, чтоб можно было удалять по относительным путям? + ; !TODO воткнуть тут SetPath_GetName, чтоб можно было удалять по относительным путям? ; ; [ ] 26/06/2024 PUSH HL diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 4df8bfd..772e8f3 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -28,7 +28,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 POP AF RET ; -.START: CALL GETWORD +.START: CALL SetPath_GetName RET C ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER diff --git a/DSS/API/Scroll.asm b/DSS/API/Scroll.asm new file mode 100644 index 0000000..dd7793d --- /dev/null +++ b/DSS/API/Scroll.asm @@ -0,0 +1,105 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #55. Скроллинг экрана. +; +; вход: D - строка левого верхнего угла окна +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B = 1 - прокрутка вверх +; B = 2 - прокрутка вниз +; A = 0 - очищать строку +; выход: нет +;/////////////////////////////////////////////////////////////////////// +SCROLL: DJNZ .SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее + ;[x] 04/04/23 + ;LD B,A + ;LD C,H + ;PUSH BC + PUSH AF + ; + PUSH DE + PUSH HL + LD XH,D + LD XL,E + INC D + DEC H + LD C,BIOS.WIN_MOVE + ;[x] 29/9/23 + LD A,R + PUSH AF + ; + XOR A + DI ;[x] 29/9/23 + RST ToBIOS + ;[x] 29/9/23 + POP AF + JP PO,.skip_EI + EI +.skip_EI: + POP HL + POP DE + ;[x] 04/04/23 + ;POP BC + POP AF + ;XOR A + ;CP B + AND A + ; + RET NZ + LD A,D + ADD A,H + DEC A ;R101 + LD D,A +.print: PUSH DE ;R101 + CALL LOCATE + LD A,' ' + LD B,L + LD C,BIOS.LP_PRINT_SYM + RST ToBIOS + POP DE ;R101 + JP LOCATE ;R101 + ;AND A + ;RET +.SCR_DW: + DJNZ .SCR_ERR + ;[x] 04/04/23 + ;LD B,A + ;LD C,H + ;PUSH BC + PUSH AF + ; + PUSH DE + PUSH HL + LD XH,D + LD XL,E + INC XH + DEC H + LD C,BIOS.WIN_MOVE + ;[x] 29/9/23 + LD A,R + PUSH AF + ; + XOR A + DI ;[x] 29/9/23 + RST ToBIOS + ; [x] 29/9/23 + POP AF + JP PO,.skip2_EI: + EI +.skip2_EI: + POP HL + POP DE + ;[x] 29/9/23 + ;POP BC + POP AF + ;XOR A + ;CP B + AND A + ; + RET NZ + JP SCROLL.print +.SCR_ERR: + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/SelPage.asm b/DSS/API/SelPage.asm new file mode 100644 index 0000000..acb30ac --- /dev/null +++ b/DSS/API/SelPage.asm @@ -0,0 +1,20 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #54. Выбрать активную страницу экрана. +; +; вход: B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;/////////////////////////////////////////////////////////////////////// +SELPAGE: + LD A,(VMODE) + ;BIT 7,A + CP %1000'0000 + JR NC,.SEL2 + PUSH BC + LD C,A + CALL SETVMOD.TEXT_M + POP BC +.SEL2: LD A,B + AND #01 + OUT (SCREEN_SWITCH),A + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/SetVMod.asm b/DSS/API/SetVMod.asm new file mode 100644 index 0000000..aef9699 --- /dev/null +++ b/DSS/API/SetVMod.asm @@ -0,0 +1,246 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #50. Выбор режима экрана. +; +; вход: A - режим экрана +; #02 - текстовый 40x32x16 цветов +; #03 - текстовый 80x32x16 цветов +; #81 - графический 320x256x256 цветов +; #82 - графический 640x256x16 цветов +; B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;/////////////////////////////////////////////////////////////////////// +SETVMOD: CP %1000'0000 + LD C,A + JR NC,.GRAPH +.TEXT_M: LD IX,BACKTXT + PUSH IX + EX AF,AF' + LD A,(VMODE) + LD (BACKTXT.VMODE),A + EX AF,AF' + OR A + JR Z,.NOMODE + DEC A + JR Z,.NOMODE + DEC A + LD HL,TAB_40x32 + JR Z,.SET_TXT_MODE + DEC A + LD HL,TAB_80x32 + JR Z,.SET_TXT_MODE +.NOMODE: POP IX + LD A,DSS_Error.sys.INVALID_VIDEO_MODE + SCF + RET + +; Установка граф. режимов +.GRAPH: CALL SAVETXT + AND #7F + JR Z,.G320_16 ; !TODO ? - пока отрабатывает как ошибка + DEC A + JR Z,.G320_56 + DEC A + JR Z,.G640_16 + ;DEC A + ;JP Z,.G640_56 ; !TODO ? - пока отрабатывает как ошибка +.G320_16: LD A,DSS_Error.sys.INVALID_VIDEO_MODE + SCF + RET + ; +.SET_TXT_MODE: PUSH BC + LD A,B + RLCA + RLCA + RLCA + RLCA + OR B + AND #11 + XOR #10 + LD E,A +.SETMODE_END: CALL SETMODE + POP BC + LD A,C + LD (VMODE),A + LD A,B + AND #01 + OUT (SCREEN_SWITCH),A + LD A,(VMODE) + LD C,Dss.Mouse.SetVideoMode + RST ToDSS.Mouse + SAFE_PORTY + XOR A + RET + ; +.G320_56: PUSH BC + LD HL,TAB_320x256_0 + LD E,#11 + CALL SETMODE + LD HL,TAB_320x256_1 + LD E,#00 + JP .SETMODE_END + ; +.G640_16: PUSH BC + LD HL,TAB_640x256_0 + LD E,#11 + CALL SETMODE + LD HL,TAB_640x256_1 + LD E,#00 + JP .SETMODE_END + ; +VMODE: DB #03 + +;----------------------------------------------------------------------- +; Открыть окно +; вход: hl=описатель окна +; e=флаги окна +; +;02h - TEXT 40 x 32 (16 colors) +;03h - TEXT 80 x 32 (16 colors) +;80h - GRAF 320 x 256 (16 colors) +;81h - GRAF 320 x 256 (256 colors) +;82h - GRAF 640 x 256 (16 colors) +;83h - GRAF 640 x 256 (256 colors) UNUSED +;----------------------------------------------------------------------- +SETMODE: PUSH DE + LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса. + LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает + IN A,(SLOT3) ; на адрес ниже #C000 и вставляет в третью банку страницу #FE + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LDIR + EX AF,AF' + OUT (SLOT3),A +.skip_EI: POP DE + LD IX,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. + LD C,BIOS.WIN_OPEN + RST ToBIOS + SAFE_PORTY + XOR A + RET + +;IX+0 ;HORIZONTAL +;IX+1 ;VERTICAL +;IX+2 ;X - COORD +;IX+3 ;Y - COORD +;IX+4 ;MODE +;IX+5 ;EXT MODE +;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES) +;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES) + +; +;....................................................................... +;+0 X размер окна в знакоместах +;+1 Y размер окна в знакоместах +;+2 X полож. окна на экране +;+3 Y полож. окна на экране +;+4 режим знакоместа +;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) +;+6 X полож. в поле графики (в знакоместах) +;+7 Y полож. в поле графики (в знакоместах) +ScreenDescriptorTable EQU $ +; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген. +TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1 +; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген. +TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2 +; 640x256. графическое, 0-й экран +TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3 +; 320x256. графическое, 0-й экран +TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4 +; 640x256. графическое, 1-й экран +TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5 +; 320x256. графическое, 1-й экран +TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6 +ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 +;....................................................................... +; + +;----------------------------------------------------------------------- +; Сохранить экран текст. режима. +; Для буфера экрана исп. 2-я банка расширения ДОС. +SAVETXT: PUSH AF + LD A,(VMODE) + ;BIT 7,A + CP %1000'0000 + JR NC,.NOSAVET + SUB #02 + JR C,.NOSAVET + ; + PUSH BC + PUSH DE + PUSH HL + PUSH IX + ; + PUSH AF + LD C,BIOS.LP_GET_PLACE + RST ToBIOS + LD (BACKTXT.CURS),DE + POP AF + LD IX,#C000 + LD HL,#2050 + OR A + JR NZ,.SVTEXT1 + LD L,#28 +.SVTEXT1: LD (BACKTXT.WinMax),HL + LD DE,#0000 + LD A,(BANKTBL+TXTPAGE) + LD B,A + + LD C,BIOS.WIN_COPY + ;[x] 29/9/23 + LD A,R + PUSH AF + ; + XOR A + DI + RST ToBIOS + ;[x] 29/9/23 + POP AF + JP PO,.skip_EI + EI +.skip_EI: ; + POP IX + POP HL + POP DE + POP BC +.NOSAVET: POP AF + RET +;----------------------------------------------------------------------- + +BACKTXT: PUSH AF +.VMODE+1: LD A,#00 + ;BIT 7,A + CP %1000'0000 + JR C,.NOBACKT + ; + PUSH BC + PUSH DE + PUSH HL + PUSH IX + LD IX,#C000 +.WinMax+1: LD HL,#2050 + LD DE,#0000 + LD A,(BANKTBL+TXTPAGE) + LD B,A + LD C,BIOS.WIN_RESTORE + ;[x] 29/9/23 + LD A,R + PUSH AF + ; + XOR A + DI + RST ToBIOS + ;[x] 29/9/23 + POP AF + JP PO,.no_ei + EI +.no_ei: ; +.CURS+1: LD DE,#0000 + CALL LOCATE + POP IX + POP HL + POP DE + POP BC +.NOBACKT: POP AF + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Time.asm b/DSS/API/Time.asm index 5bad9af..65fc5dd 100644 --- a/DSS/API/Time.asm +++ b/DSS/API/Time.asm @@ -14,6 +14,7 @@ SYSTIME: LD C,BIOS.CMOS_TEST RST ToBIOS JP C,.NOCMOS + ; LD D,CMOS.Register.date CALL RCMOS PUSH AF diff --git a/DSS/API/WinCopy.asm b/DSS/API/WinCopy.asm new file mode 100644 index 0000000..dd59a68 --- /dev/null +++ b/DSS/API/WinCopy.asm @@ -0,0 +1,23 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #59. Сохранить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера, если IX >= #C000 +; IX - адрес буфера +; выход: нет +;/////////////////////////////////////////////////////////////////////// +WINCOPY: AND A + LD A,R ;R102 + PUSH AF ;R102 + XOR A + LD C,BIOS.WIN_COPY + DI ;R102 + RST ToBIOS + POP AF ;R102 + RET PO ;R102 + EI ;R102 + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/WinRest.asm b/DSS/API/WinRest.asm new file mode 100644 index 0000000..325dc97 --- /dev/null +++ b/DSS/API/WinRest.asm @@ -0,0 +1,23 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #5A. Восстановить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера, если IX >= #C000 +; IX - адрес буфера +; выход: нет +;/////////////////////////////////////////////////////////////////////// +WINREST: AND A + LD A,R ;R102 + PUSH AF ;R102 + XOR A + DI ;R102 + LD C,BIOS.WIN_RESTORE + RST ToBIOS + POP AF ;R102 + RET PO ;R102 + EI ;R102 + RET +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/WrChar.asm b/DSS/API/WrChar.asm new file mode 100644 index 0000000..3aeb172 --- /dev/null +++ b/DSS/API/WrChar.asm @@ -0,0 +1,23 @@ +;/////////////////////////////////////////////////////////////////////// +; Функция #58. Вывести символ на экран. +; Управляющие символы выводятся как обычные символы. +; +; вход: D - строка +; E - колонка +; A - символ +; B - атрибут +; выход: нет +;!FIXIT slow как без WIN_GET_SYM тут обойтись? +;/////////////////////////////////////////////////////////////////////// +WRCHAR: LD C,A + PUSH BC + PUSH DE + XOR A + LD C,BIOS.WIN_GET_SYM + RST ToBIOS + POP DE + POP HL + XOR A + LD C,BIOS.WIN_PUT_SYM + JP ToBIOS +;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM deleted file mode 100644 index 693bf5e..0000000 --- a/DSS/DOS_FM.ASM +++ /dev/null @@ -1,207 +0,0 @@ - -;[BEGIN] -;//MODULE: DOS_FM -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -; -;--------------------------------------------------------------- - -;FMS DB FMCOUNT - -;ACCESS MODE: -; 00 - READ/WRITE -; 01 - READ -; 02 - WRITE -;FM_BUF: -;File Manipulator (FM) - ; BYTE '. ' ;+00 NAME - ; BYTE ' ' ;+08 EXT - ; BYTE #10 ;+11 ATTRIBUT - ; BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения - ; BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи - ; BLOCK 8,0 ;+14 RESERVED - ; WORD #0000 ;+22 TIME - ; WORD #0000 ;+24 DATE - ; WORD #0000 ;+26 START CLUSTER - ; DWORD #0000 ;+28 SIZE FILE - ; DWORD #0000 ;+32 FILE POSITION (FP) - ; WORD #0000 ;+36 DIRECTORY CLUSTER - ; WORD #0000 ;+38 HANDLE NUMBER - ; BYTE #00 ;+40 DRIVE OR CURRENT - ; BYTE #00 ;+41 ACCESS MODE - ; BYTE #00 ;+42 TASK - ; BYTE #00 ;+43 EMPTY -/* -;!TEST -FM_BUF: _sFM -.Size EQU _sFM - BLOCK (FMCOUNT-1)*FM_BUF.Size, 0 -*/ - -; на выходе без ошибок IY указывает на файловый манипулятор -; MACRO _mFM_FIND -; CP FMCOUNT+1 -; CCF -; RET C -; PUSH DE - -; LD IY,CORE_BUFFERS.FM_BUF -; LD DE,CORE_BUFFERS.FM_BUF.Size -; AND A -; JR Z,.endLoop -; .loop: ADD IY,DE -; DEC A -; JR NZ,.loop -; .endLoop: -; POP DE -; ; A=0 -; OR (IY) ;+00 NAME -; RET -; ENDM -//////////////////////////////////////////////////////////////////////// - -; на выходе без ошибок IY указывает на файловый манипулятор -FM_FIND: CP FMCOUNT+1 - JR NC,.error - ; - PUSH DE - LD IY,CORE_BUFFERS.FM_BUF - LD DE,CORE_BUFFERS.FM_BUF.Size - AND A - JR Z,.endLoop -.loop: ADD IY,DE - DEC A - JR NZ,.loop -.endLoop: POP DE - ; A=0 - OR (IY) ;+00 NAME - RET - ; -.error: XOR A - LD A,DSS_Error.sys.INVALID_HANDLE - RET - -SET_FM: CALL FM_FIND - ; error - ;LD A,DSS_Error.sys.INVALID_HANDLE - ; CF = 1 - SCF - RET Z - ; no error - XOR A ;LD A,DSS_Error.sys.NO_ERROR - ; CF = 0 - RET - - -RES_FM: CALL FM_FIND - ; error - ; LD A,DSS_Error.sys.INVALID_HANDLE - SCF - RET Z - ; no error - XOR A - LD (IY + _sFM.FS_REC.NAME),A - RET -; -GET_FM: LD B,FMCOUNT - LD C,#FF - LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size - LD DE,CORE_BUFFERS.FM_BUF.Size -.loop: ADD IY,DE - INC C - LD A,(IY + _sFM.FS_REC.NAME) - OR A - RET Z - DJNZ .loop - LD A,DSS_Error.sys.NO_HANDLES - SCF - RET -/* - ;!TODO CHECK LOCKING 10/11/2023 -GET_FM: LD IY,0 - LD (.freeHandle),IY - ; - LD B,FMCOUNT - LD C,#FF - LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size - LD DE,CORE_BUFFERS.FM_BUF.Size -.loop: ADD IY,DE - INC C - ; CHECK LOCKING - - ; -.cont: LD A,(IY+0) - OR A - RET Z - DJNZ .loop - LD A,DSS_Error.sys.NO_HANDLES - SCF - RET -*/ - - -; HL:IX - OFFSET POINTER -; A - FILE MANIPULATOR -MOVE_FP: CALL SET_FM - RET C - INC B - DJNZ .B_1 - ;from Start File - ; B=0 -.F_start: LD C,B - LD D,B - LD E,B - JP .DO - ; -.B_1: DJNZ .B_2 - ;from Current Position -.F_current: LD C,(IY+_sFM.F_POSITION) - LD B,(IY+_sFM.F_POSITION+1) - LD E,(IY+_sFM.F_POSITION+2) - LD D,(IY+_sFM.F_POSITION+3) -.DO: ADD IX,BC - ADC HL,DE - LD D,XH - LD E,XL - LD (IY+_sFM.F_POSITION),E - LD (IY+_sFM.F_POSITION+1),D - LD (IY+_sFM.F_POSITION+2),L - LD (IY+_sFM.F_POSITION+3),H - XOR A - RET - ; -.B_2: DJNZ .error - ;from End File -.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) - LD B,(IY + _sFM.FS_REC.F_SIZE+1) - LD E,(IY + _sFM.FS_REC.F_SIZE+2) - LD D,(IY + _sFM.FS_REC.F_SIZE+3) - JP .DO - ; B > 2 -.error: LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -;;;;;;;;; - - - -;FP COMPARE -; CY - FILE POINTER > SIZE -; NC - FILE POINTER < SIZE -MOVE_CP: - LD L,(IY + _sFM.FS_REC.F_SIZE) - LD H,(IY + _sFM.FS_REC.F_SIZE+1) - LD E,(IY + _sFM.F_POSITION) - LD D,(IY + _sFM.F_POSITION+1) - AND A - SBC HL,DE - LD L,(IY + _sFM.FS_REC.F_SIZE+2) - LD H,(IY + _sFM.FS_REC.F_SIZE+3) - LD E,(IY + _sFM.F_POSITION+2) - LD D,(IY + _sFM.F_POSITION+3) - SBC HL,DE - RET -; \ No newline at end of file diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 0ff063e..8be4c0b 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -7,8 +7,8 @@ ;--------------------------------------------------------------- ;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) ;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 -;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR -;R10 - 03-04-2003 DNS IMPROVED FN. VERSION +;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR +;R10 03-04-2003 DNS IMPROVED FN. VERSION ;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. ;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET @@ -86,10 +86,12 @@ GetName: LD BC,#08FF ;!HARDCODE ;----------------------------------------------------------------------; +; old GETWORD ; Тест на допустимое имя и настроиться на диск. ; вход: hl=строка имени ; выход: (TMPNAME) -GETWORD: ; !TEST +SetPath_GetName: + ; !TEST INC HL LD A,(HL) DEC HL @@ -297,16 +299,17 @@ MASK: LD HL,TMPNAME CP ' '+1 CCF RET NC - CP '"' - JR Z,.MASK_ERR + ; CP '*' JR Z,.MASK3 + CP '.' + JR Z,.MASK5 + CP '"' + JR Z,.MASK_ERR CP '+' JR Z,.MASK_ERR CP ',' JR Z,.MASK_ERR - CP '.' - JR Z,.MASK5 CP '/' JR Z,.MASK_ERR CP ':' @@ -327,11 +330,6 @@ MASK: LD HL,TMPNAME JR Z,.MASK_ERR CP '|' JR Z,.MASK_ERR -; CP 'a' ;????? -; JR C,.MASK2 -; CP 'z' + 1 -; JR NC,.MASK2 -; SUB #20 CALL UPPER ; a..z -> A..Z .MASK2: LD (DE),A INC HL @@ -340,36 +338,34 @@ MASK: LD HL,TMPNAME .MASK_ERR: LD A,DSS_Error.sys.INVALID_NAME SCF - RET + RET + ; .MASK3: LD A,'?' INC HL DJNZ .MASK6 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET + JR .MASK_ERR + ; .MASK6: LD (DE),A INC DE DJNZ .MASK6 LD B,1 JR .MASK1 + ; .MASK5: LD A,' ' INC HL DJNZ .MASK4 LD B,4 DEC C - JP NZ,.MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET + JR NZ,.MASK1 + JR .MASK_ERR + ; .MASK4: LD (DE),A INC DE DJNZ .MASK4 LD B,4 DEC C - JP NZ,.MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET + JR NZ,.MASK1 + JR .MASK_ERR ;----------------------------------------------------------------------; @@ -445,7 +441,7 @@ DIR_PATH_CHECK: LD A,(HL) LD A,DSS_Error.sys.PATH_NOT_FOUND RET C LD HL,CORE_BUFFERS.CurrentPath - JP GETWORD + JP SetPath_GetName ; .end: CP (HL) RET Z @@ -469,3 +465,115 @@ CHECK_NAME: SCF RET ;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +;FMS DB FMCOUNT + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE +;FM_BUF: +;File Manipulator (FM) + ; BYTE '. ' ;+00 NAME + ; BYTE ' ' ;+08 EXT + ; BYTE #10 ;+11 ATTRIBUT + ; BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения + ; BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи + ; BLOCK 8,0 ;+14 RESERVED + ; WORD #0000 ;+22 TIME + ; WORD #0000 ;+24 DATE + ; WORD #0000 ;+26 START CLUSTER + ; DWORD #0000 ;+28 SIZE FILE + ; DWORD #0000 ;+32 FILE POSITION (FP) + ; WORD #0000 ;+36 DIRECTORY CLUSTER + ; WORD #0000 ;+38 HANDLE NUMBER + ; BYTE #00 ;+40 DRIVE OR CURRENT + ; BYTE #00 ;+41 ACCESS MODE + ; BYTE #00 ;+42 TASK + ; BYTE #00 ;+43 EMPTY +/* +;!TEST +FM_BUF: _sFM +.Size EQU _sFM + BLOCK (FMCOUNT-1)*FM_BUF.Size, 0 +*/ +//////////////////////////////////////////////////////////////////////// + +; на выходе без ошибок IY указывает на файловый манипулятор +FM_FIND: CP FMCOUNT+1 + JR NC,.error + ; + PUSH DE + LD IY,CORE_BUFFERS.FM_BUF + LD DE,CORE_BUFFERS.FM_BUF.Size + AND A + JR Z,.endLoop +.loop: ADD IY,DE + DEC A + JR NZ,.loop +.endLoop: POP DE + ; A=0 + OR (IY) ;+00 NAME + RET + ; +.error: XOR A + LD A,DSS_Error.sys.INVALID_HANDLE + RET + +SET_FM: CALL FM_FIND + ; error + ;LD A,DSS_Error.sys.INVALID_HANDLE + ; CF = 1 + SCF + RET Z + ; no error + XOR A ;LD A,DSS_Error.sys.NO_ERROR + ; CF = 0 + RET + + +RES_FM: CALL FM_FIND + ; error + ; LD A,DSS_Error.sys.INVALID_HANDLE + SCF + RET Z + ; no error + XOR A + LD (IY + _sFM.FS_REC.NAME),A + RET +; +;!TODO CHECK LOCKING +GET_FM: LD B,FMCOUNT + LD C,#FF + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size +.loop: ADD IY,DE + INC C + LD A,(IY + _sFM.FS_REC.NAME) + OR A + RET Z + DJNZ .loop + LD A,DSS_Error.sys.NO_HANDLES + SCF + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE +MOVE_CP: + LD L,(IY + _sFM.FS_REC.F_SIZE) + LD H,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.F_POSITION) + LD D,(IY + _sFM.F_POSITION+1) + AND A + SBC HL,DE + LD L,(IY + _sFM.FS_REC.F_SIZE+2) + LD H,(IY + _sFM.FS_REC.F_SIZE+3) + LD E,(IY + _sFM.F_POSITION+2) + LD D,(IY + _sFM.F_POSITION+3) + SBC HL,DE + RET +; +;----------------------------------------------------------------------; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index e3ba28f..51b6249 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -397,14 +397,10 @@ ADRST10: ;DS 512 ;,0 ;[INCLUDE] ;!TODO заменить по-максимому всё в KEYINTER.ASM на вызовы биоса INCLUDE "KEYINTER.ASM" - INCLUDE "VIDEO.ASM" INCLUDE "API.ASM" INCLUDE "DOS_Proc.asm" - INCLUDE "FS/FAT/FAT.ASM" - INCLUDE "FS/FAT/FAT_X.ASM" - INCLUDE "DOS_FM.ASM" + INCLUDE "FS_Module.asm" INCLUDE "Procedures.asm" - INCLUDE "Kernel_Panic.asm" ; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb diff --git a/DSS/FS/CDFS.ASM b/DSS/FS/CDFS.ASM new file mode 100644 index 0000000..f8dda64 --- /dev/null +++ b/DSS/FS/CDFS.ASM @@ -0,0 +1,3 @@ +; +; +; \ No newline at end of file diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT.asm similarity index 56% rename from DSS/FS/FAT/FAT_X.asm rename to DSS/FS/FAT.asm index 0ee5739..5f10e2d 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT.asm @@ -1,17 +1,1215 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; FAT 12-16-32 -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ;[BEGIN] -;//MODULE: FAT_X +;//MODULE: FAT ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION +;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;RY01 16-11-1999 DNS ERROR READING FAT CHAIN ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- +; [ ] RST_FS +;----------------------------------------------------------------------; + +SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + RET NZ + ; + LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) + OR A + RET Z + ; + ; Делаем FSInfo сектор + ; чистим сектор + LD HL,CORE_BUFFERS.SECTOR_BUFFER + LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 + LD (HL),0 + LD BC,512 - 1 ;!HARDCODE размер сектора + LDIR + ; LEAD_SIGNATURE + LD HL,#5252 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE),HL + LD HL,#4161 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE + 2),HL + ; DATA_SIGNATURE + LD HL,#7272 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE),HL + LD HL,#6141 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2),HL + ; SECTOR_SIGNATURE + LD HL,#AA55 + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL + ; FREE_CLUSTERS_COUNT + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL + LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL + ; FIRST_FREE_CLUSTER + LD HL,(G_CLUST.low) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL + LD HL,(G_CLUST.high) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL + ; Пишем его на винт + XOR A + LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + JR WRITE_FSinfo +; ; +; Прочитать BPB в SECTOR_BUFFER +READ_BPB: LD C,Dss.DRV.GetBPB + JR RW_SECTOR +; Записать FSinfo из SECTOR_BUFFER +WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) + LD HL,0 + ;JR WRITE_SECTOR +; Записать сектор из SECTOR_BUFFER +; Вход: HL:IX = Logical Block (sector) +WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write + JR RW_SECTOR +; Прочитать FSinfo в SECTOR_BUFFER +READ_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) + LD HL,0 +; Прочитать сектор в SECTOR_BUFFER +; Вход: HL:IX = Logical Block (sector) +READ_SECTOR: LD BC,1*256 + Dss.DRV.Read + ; +RW_SECTOR: IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + ; + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 + RST ToDSS.DRV + EX AF,AF' + ; + POP AF + OUT (SLOT3),A + EX AF,AF' + RET +; + +; [ ] удаление записи LFN +; +; вход: IX = текущая запись в странице с каталогом FAT для которой +; надо удалить записи LFS +DELETE_LFN_RECORDS: + PUSH IX + LD A,XH + AND #C0 + SUB 1 + LD C,A + ; В регистре C маска для определения выхода за пределы страницы + ; +.find_LFN: LD DE, -(FAT_DIRECTORY_RECORD) + LD A,FAT_ATTR.LFS_Entry + ; +.loop: ADD IX,DE + LD A,XH + CP C + JR Z,.beyond_boundaries + ; + LD A,FAT_ATTR.LFS_Entry + CP (IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + JR NZ,.exit + LD (IX+FAT_DIRECTORY_RECORD.NAME),#E5 + JR .loop + ; +.exit: AND A +.beyond_boundaries: ; !TODO подгрузка другой части каталога. пока заглушка + POP IX + RET +;----------------------------------------------------------------------; + + +; Поиск записи каталога в списке каталога +; +; вход: a = атрибут записи +; выход: de = индекс записи в списке каталога +; (HANDBUF) = file's direcory record +; CF - каталог не найден +SEARCH: +.Dir: ;LD A,FAT_ATTR.DIRECTORY + LD A,FAT_ATTR.HiddenSysDir + CALL .Custom + RET NC + CP DSS_Error.sys.PATH_NOT_FOUND + 1 + RET C + ; + SCF + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + RET + ; +.File: LD A,FAT_ATTR.NoDIRnoVolID +.Custom: EX AF,AF' ; A = 76ADLSHR + SET_PAGE_X DIRPAGE + ;PUSH AF + EX AF,AF' + ; + CPL + LD C,A + LD IX,DIRPAGE.buffer + ;!TEST 9/11/23 record index + ; оптимизация для индекса записи в списке каталога. + ; Понадобится вернуть для перебора каталога > #4000 байт + ; EXX + ; LD DE,0 + ; EXX + ; +.loop: LD A,(IX+FAT_DIRECTORY_RECORD.NAME) + OR A + JR Z,.error_file_not_found + CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены + JR Z,.next_record + LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + AND C + JR NZ,.next_record + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +.loop_compare: + LD A,(DE) + CP '?' + JR Z,.next_char + CP (HL) + JR NZ,.next_record +.next_char: + INC HL + INC DE + DJNZ .loop_compare + ; + LD D,XH + LD E,XL + ;!TEST 9/11/23 record index + ; EXX + ; PUSH DE + ; EXX + PUSH IX + ; + LD HL,HANDBUF + EX DE,HL + LD BC,HANDBUF.SIZE + LDIR + ;!TEST 9/11/23 record index + POP DE + ; + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + AND A + RET +.next_record: + LD DE,FAT_DIRECTORY_RECORD + ;!TEST 9/11/23 record index + ; EXX + ; INC DE + ; EXX + ; + ADD IX,DE + JR NC,.loop +.error_too_many_files: + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET + ; +.error_file_not_found: + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.FILE_NOT_FOUND + SCF + RET +;----------------------------------------------------------------------; + +; +;!TODO ? +;GHANDLE: +; PUSH DE +; PUSH HL +; PUSH IX +; CALL TESTDSK +; JP C,G_HAND1 +; CALL LOADDIR +; POP DE +; LD HL,DIR +; LD BC,FAT_DIRECTORY_RECORD +;G_HAND2: +; LD A,D +; OR E +; JP Z,G_HAND3 +; ADD HL,BC +; DEC DE +; JP G_HAND2 +;G_HAND3: +; EXX +; POP DE +; EXX +;G_HAND4: +; EX DE,HL +; LD A,DIRPAGE +; CALL BANK +; EX DE,HL +; LD DE,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; OUT (SLOT3),A +; LD HL,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; POP BC +; DEC BC +; LD A,B +; OR C +; RET Z +; PUSH BC +; JP G_HAND4 +;G_HAND1 POP IX +; POP HL +; POP DE +; RET +;HANDTA BLOCK 32,0 +; + +;----------------------------------------------------------------------; +; FIND "MASKAREA" IN DIRECTORY +; [x] fat32 ;!TEST +; выход: IY:DE - cluster number +FINDDIR: + SET_PAGE_X DIRPAGE + ; + PUSH AF + LD IX,DIRPAGE.buffer +.big_loop: + LD A,(IX + FAT_DIRECTORY_RECORD.NAME) + OR A + JR Z,.error + CP #E5 + JR Z,.next_step + LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT) + AND FAT_ATTR.DIRECTORY + JR Z,.next_step + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 ;!HARDCODE +.loop: LD A,(DE) + CP "?" + JR Z,.compared + CP (HL) + JR NZ,.next_step +.compared: + INC HL + INC DE + DJNZ .loop + ; + LD A,(IX + FAT_DIRECTORY_RECORD.NAME) + CP "." + JP NZ,.ADDSPEC + LD A,(IX + FAT_DIRECTORY_RECORD.NAME + 1) + CP "." + JP NZ,.IT_DIR + LD HL,CORE_BUFFERS.WorkDirectory + LD D,H + LD E,L + INC HL + LD BC,CORE_BUFFERS.WorkDirectory.DEPTH + XOR A + CPIR + JP PO,.error ;[x] 20/11/23 проверка на выход за границы + DEC HL ;R009 + DEC HL + LD BC,CORE_BUFFERS.WorkDirectory.DEPTH + LD A,'\' + CPDR + INC HL + EX DE,HL + ; CF = 0 + SBC HL,DE + EX DE,HL + JR NZ,.MM3 + INC HL +.MM3: LD (HL),0 + JP .IT_DIR + ; +.next_step: + LD BC,FAT_DIRECTORY_RECORD + ADD IX,BC + JR NC,.big_loop + ; +.error: POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.PATH_NOT_FOUND + SCF + RET + ; +.ADDSPEC: + LD HL,CORE_BUFFERS.WorkDirectory+1 + LD BC,CORE_BUFFERS.WorkDirectory.DEPTH-1 + CALL .CHECK_SLASH + JR C,.error + ;R011 + LD A,B + AND A + JR NZ,.nxt + LD A,C + CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение + JR C,.error +.nxt: ; + LD E,XL + LD D,XH + ; [x] оптимизация по размеру + EX DE,HL + CALL GetName + EX DE,HL + ; + +; LD BC,256*8 + ' ' ;!HARDCODE +; .MM1: LD A,(DE) +; INC DE +; CP C +; JR Z,.MM2 +; LD (HL),A +; INC HL +; .MM2 DJNZ .MM1 ;x42-40 50-55 +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),"." +; INC HL +; LD (HL),A +; INC HL +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),A +; INC HL +; LD A,(DE) +; CP C +; JR Z,.MM3 +; LD (HL),A +; .MM2_5: INC HL +; .MM3: LD (HL),0 +; ; JP IT_DIR + ; +.IT_DIR:; fat32 + LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD YH,D + LD YL,E + LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + POP AF + OUT (SLOT3),A + AND A + RET +.CHECK_SLASH: + XOR A + CPIR + ;[x] 20/11/23 проверка на выход за границы + SCF + RET PO + ; + DEC HL + DEC HL + LD A,'\' ; #5C + CP (HL) + INC HL + RET Z + LD (HL),A + INC HL + LD (HL),0 + ;INC HL + RET +;----------------------------------------------------------------------; + +CHECK_ROOT_CLUSTER: + EX DE,HL + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005 + LD A,L + OR H + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) + OR L + OR H + EX DE,HL + RET + +;----------------------------------------------------------------------; +; вход: HL - имя директории +; [x] fat32 ;!TEST + +OPENDIR: LD IY,CORE_BUFFERS.FM_BUF + LD A,(HL) + OR A + JR NZ,.SUBDIR + ; +.REROOT: LD DE,0 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE + CALL LOADDIR + ; CF=0 + LD HL,CORE_BUFFERS.WorkDirectory + LD (HL),'\' + INC HL + LD (HL),#00 + ;AND A + RET + ; +.SUBDIR: CP "." + JR NZ,.SUBDIR2 + ; fat32 + CALL CHECK_ROOT_CLUSTER + JR NZ,.no_root ;R005 + ; "cd ." or "cd .." + ;R005 + INC HL + LD A,(HL) + OR A + DEC HL + JR Z,.REROOT + ; +.no_root: EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 ;!HARDCODE + LD (HL),' ' + LDIR + EXX + LD DE,MASKARE +.loop: LDI + LD A,(HL) + OR A + JR NZ,.loop + JR .SUBDIR3 + ; +.SUBDIR2: CALL MASK.name + RET C + ; fat32 +.SUBDIR3: CALL FINDDIR + RET C + EX DE,HL + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32 + LD HL,#4000 ;!HARDCODE + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL +;-------------; EX DE,HL +; JP LOADDIR + +; Прочитать список каталога +; [x] fat32 ;!TEST +LOADDIR: ;!TODO optimize + CALL LOAD_SAVE_DIR_PREPARE + PUSH AF + EX AF,AF' + JR NZ,.read_dir + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.LoadRootDir + ; fat32 + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + + ;LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог + LD HL,#4000 ; размер директории ;!HARDCODE + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL + ; +.read_dir: LD HL,DIRPAGE.buffer ; куда + LD DE,#4000 ; сколько + XOR A ; дескриптор + CALL READ ; чтение из файла + LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов + POP AF + OUT (SLOT3),A + RET + ; +.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) + LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога + CP B + JR NC,.RTD1 + LD B,A ; число секторов +.RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD DE,DIRPAGE.buffer ; буфер + LD C,Dss.DRV.Read ; чтение секторов + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + RET +;----------------------------------------------------------------------; + + +;!TODO FAT procedures +;----------------------------------------------------------------------; + +LOAD_SAVE_DIR_PREPARE: + ;!TODO optimize + XOR A ; FILE MANIPULATOR = 0 + LD H,A + LD L,A + LD IX,0 + LD B,A ; от начала файла + CALL MOVE_FP + ; + SET_PAGE_X DIRPAGE + AND A + EX AF,AF' + ; + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + ;!FIXIT переделать на работу без IY + LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + ; + EX AF,AF' + RET + +;----------------------------------------------------------------------; + +; скопировать запись в список диска (каталога) de ix iy +; и сбросить кеш каталога на диск +; вход: (HANDBUF) - запись каталога +WRT_HND: + SET_PAGE_X DIRPAGE + EX AF,AF' + LD HL,DIRPAGE.buffer + ;!TEST 9/11/23 record index + ; EXX + ; LD DE,0 + ; EXX + ; + LD BC,FAT_DIRECTORY_RECORD +.loop: ;LD A,(IX+00) + LD A,(HL) + OR A + JR Z,.WRT_HN2 + CP #E5 + JR Z,.WRT_HN2 + ;ADD IX,BC + ADD HL,BC + JR NC,.loop ;!FIXIT количество записей каталога = страница + ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF + RET + ; +.WRT_HN2: ;LD D,XH + ;LD E,XL + EX DE,HL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR + EX AF,AF' + OUT (SLOT3),A + LD HL,DIRPAGE.buffer + LD BC,(SAVEDIR.DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + JR NC,SAVEDIR + LD HL,(SAVEDIR.DIRSIZE) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + ADD HL,BC + LD (SAVEDIR.DIRSIZE),HL + AND A + ;JP SAVEDIR +;----------------------------------------------------------------------; +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +; [x] fat32 ;!TEST +SAVEDIR: ;!TODO optimize + CALL LOAD_SAVE_DIR_PREPARE + PUSH AF + EX AF,AF' + JR NZ,.save_dir + ; + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.SaveRootDir + ; fat32 + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + ; +.save_dir: LD HL,DIRPAGE.buffer + ; размер списка каталога size_cash_directory + ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) + ; когда будет чтение кусками каталога в кэш, тут ещё счётчик прикрутить +.DIRSIZE+1: LD DE,0 + XOR A + CALL WRITE + POP AF + OUT (SLOT3),A + RET + ; +.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) + LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors + SUB B + JR NC,.RTD1S + ADD A,B + LD B,A +.RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD DE,DIRPAGE.buffer + LD C,Dss.DRV.Write + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + RET +;----------------------------------------------------------------------; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +; [x] fat32 ;!TEST +RD_BPB: ; LD C,SLOT3 + ; IN B,(C) + ; PUSH BC + ; IN A,(SLOT0) + ; OUT (SLOT3),A + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08 + ; LD C,Dss.DRV.GetBPB + ; RST ToDSS.DRV + ; POP BC + ; OUT (C),B + CALL READ_BPB + JP C,DOS_X_Error.Not_ready + ; + LD DE,#AA55 ; сигнатура ;R05 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + ;[ ] CDFS + ;R05 + AND A + SBC HL,DE + JP NZ,DOS_X_Error.UnknownBPB + ; + ; ;R08 ; [x] fat32 + ; LD HL,CORE_BUFFERS.SECTOR_BUFFER + ; LD DE,CORE_BUFFERS.BootSector + ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size + ; LDIR + ; + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) + CP #F0 + JP C,DOS_X_Error.UnknownBPB + ; + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector) + LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A + ; calc. first sector FAT + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ;[ ] fat32 + XOR A + LD B,A + LD C,A + 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.RootDirFirstSector_H),BC + LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 + ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + ; + ; + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) + LD A,E + OR D + JR NZ,.skip_high + ; + EXX + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,E + EXX + ; + LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) + ; +.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs + LD (CORE_BUFFERS.FatBuffer.Number_Of_FATs),A + CP 1 + JR Z,.one_FAT + DEC A + ADD HL,DE + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + EXX + ADC HL,DE + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + EXX + ;JR NC,.no_inc_BC + ;INC BC +.no_inc_BC:;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC +.one_FAT: ; +.loop1: ADD HL,DE + ;JR NC,.loop1_1 + ;INC BC + EXX + ADC HL,DE + EXX +.loop1_1: DEC A + JR NZ,.loop1 + ; + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + EXX + ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),HL + EXX + ;LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC + ; + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD A,B + AND A + ; + RL C + RLA + RL C + RLA + RL C + RLA + ; + LD C,A + LD B,0 ; BC - File handels per sector + ;;;; + IF COMPILE_UNUSED_CODE + LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A + ENDIF + ; + EX DE,HL + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 + ; [ ]fat32 ;!TEST + LD A,H + OR L + JR Z,.skip_loop2 + ; + DEC HL + XOR A + ;NEXTAD2 +.loop2: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,BC + JR NC,.loop2 + ; +.skip_loop2: EX DE,HL + LD C,A ; A - sectors in DIR + LD B,0 + LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A + + ADD HL,BC ; Start DATA area + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL + ; B = 0 + ; + LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + ;!TODO FATcacheSize + ; calc. cluster size + XOR 1 + JR Z,.loop3.end + RRA +.loop3: ADD HL,HL + RRA + JP NC,.loop3 +.loop3.end: ; + LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL + ;LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ;AND A + ;SBC HL,DE + ;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) +//////////////////////////////////////////////////////////////////////// +;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer +; EX DE,HL +; LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize +; XOR A +; ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится +;.loop4: INC A +; JP Z,DOS_X_Error.UnknownBPB +; SBC HL,DE +; JR NC,.loop4 +; LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) +; +; LD HL,0 +; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.HEADS) +;.BPB_L1: ; calc. sector per cylinder +; ADD HL,BC +; DEC A +; JR NZ,.BPB_L1 +; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL +//////////////////////////////////////////////////////////////////////// + ; [ ] fat32 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) + LD A,H + OR L + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + JP NZ,.HDDSMAL + ; + EXX + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + PUSH HL ; Total Sectors high + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + EXX + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) + PUSH HL ; Total Sectors low + AND A + SBC HL,DE + EXX + SBC HL,DE + PUSH HL + EXX + POP BC + ;JP NC,.HDDBIG + ;DEC BC + JP .HDDBIG + ; +.HDDSMAL: ; CF = 0 + LD BC,0 + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low + SBC HL,DE + ; +.HDDBIG: CALL SectorToCluster +; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) +; SCF +; .loop7: RRA +; JR C,.loop7_exit +; RR B +; RR C +; RR H +; RR L +; JP .loop7 + ; +.loop7_exit: INC HL + LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL + LD A,L + OR H + JR NZ,.no_inc_bc + INC BC +.no_inc_bc: LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC + ; + XOR A + LD H,A + LD L,A + LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ; A = 0 + LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD H,A + EX DE,HL + LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + ; DE:HL = SectorsPerFAT + ; + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) + LD B,A + DEC A + JR Z,.loop_mul_end + ; .Number_of_FATs * .SectorsPerFAT +.loop_mul: ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + DJNZ .loop_mul +.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD B,0 + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) + LD C,A + ADD HL,BC + JR NC,.no_inc_DE + INC DE +.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) + ADD HL,BC + JR NC,.no_inc_de + INC DE +.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT) + AND A + LD B,D + LD C,E + POP DE ; Total Sectors low + EX DE,HL + SBC HL,DE + EX (SP),HL ; Total Sectors high + SBC HL,BC + POP DE ; Total Sectors low + ; HL:DE = DataSec + ; + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_by_Shifts + ; выясняем разрядность FAT + LD A,D + OR E + JR NZ,.its_FAT32 + ; + LD HL,4084 + SBC HL,BC + JR NC,.its_FAT12 + ; + LD HL,65524 + SBC HL,BC + JR C,.its_FAT32 + ; + ; It's FAT16 + LD HL,#FFFF + LD A,FAT_TYPE.x16 +.set_vars: EXX + LD HL,0 + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),HL + LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL + EXX + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) + JR .SET_VARS + ; +.its_FAT12: LD HL,#0FFF + LD A,FAT_TYPE.x12 + JR .set_vars + ; +.its_FAT32: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MainFATnumber) + CP #80 + JR C,.mirrored_FATs ;если все копии FAT используются + ; используется только одна копия FAT + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD D,0 + EXX + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + AND #0F + JR Z,.first_FAT_active + LD B,A + ; +.fat_calc_loop: ADD HL,DE + EXX + ADC HL,DE + EXX + DJNZ .fat_calc_loop + ; +.first_FAT_active: + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + EXX + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + ; +.mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL + ; + EXX + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE + ; + CALL CLUSTER_TO_SECTOR.no_prepare + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL + ; + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) + LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL + ; + LD A,FAT_TYPE.x32 + LD HL,#0FFF + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD H,L + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) + ; +.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC + EXX + LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL + LD BC,11 ;!HARDCODE + LDIR + ; + SET_PAGE_X FATPAGE + PUSH AF + LD DE,0 + CALL READ_FAT_TABLE + POP AF + OUT (SLOT3),A + ; + ; Установить начальный кластер для чтения + LD A,(CORE_BUFFERS.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 (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + XOR A + RET + ; +.set_FSinfo: CALL READ_FSinfo + ; !FIXIT проверка на ошибку + ; + ; проверка одной из сотни сраных сигнатур + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE) + LD DE,(CORE_BUFFERS.SECTOR_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,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + LD DE,(CORE_BUFFERS.SECTOR_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 (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),BC + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),DE + ; + ; FIRST_FREE_CLUSTER + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) + LD DE,(CORE_BUFFERS.SECTOR_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 (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + RET Z + ;!TODO FREE_CLUSTERS_COUNT + ;LD HL,#FFFF + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + ;LD (CORE_BUFFERS.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,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + SBC HL,BC + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + SBC HL,DE + RET +;;;;;;;; + +; --> BC:HL - Sector +; <-- BC:HL - Cluster +SectorToCluster: + LD A,B + AND #0F + LD B,A + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + SCF +.loop: RRA + RET C + RR B + RR C + RR H + RR L + JP .loop +; + +DOS_X_Error: +.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET + ; +.Not_ready: LD A,DSS_Error.sys.NOT_READY + ; CF = 1 + RET +; +; +;!TODO к буферам! +/* +FatBuffer: +;.MSG: DB 'FAT' +.DRIVE: DB #FF +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 +.CacheBlock: DW #00 +.CacheUpdated: DB #00 +;.SectorsPerBank: DB #00 +.RootDirStartCluster_L: DW #0000 +.RootDirStartCluster_H: DW #0000 ; [ ] fat32 +.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) +.FAT1_SEC_H: DW #0000 ; [ ] fat32 +.FAT2_SEC_L: DW #0000 +.FAT2_SEC_H: DW #0000 ; [ ] fat32 +.SectorsPerFAT_L DW #0000 +.SectorsPerFAT_H DB #00 +.RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR +.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.DirSizeInSectors: DB #00 ; DIR_SEC_SIZE +.FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low +.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига +.BytesPerCluster: DW #0000 ; CLUSTER_LEN +.END_CHAIN_CLUSTER_L: DW #FFFF +.END_CHAIN_CLUSTER_H: DW #0FFF ; [ ] fat3 +.MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) +.MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) +; +.BytesPerSector DW #0000 +.SectorsPerCluster DB #00 +.BPB_SERIAL_NUMBER DW 0,0 +.BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS + IF COMPILE_UNUSED_CODE +.FilesPerSector: DB #00 ; число файловых записей в секторе +.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? + ENDIF +;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? +; +*/ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +;███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████; +; FAT_X 12-16-32 +;███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████; ; Удаляет запись в каталоге и освобождает занятую цепочку кластеров ; Вход: IX - указатель на удаляемую запись в DIRPAGE diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm deleted file mode 100644 index c577793..0000000 --- a/DSS/FS/FAT/FAT.asm +++ /dev/null @@ -1,1199 +0,0 @@ -;[BEGIN] -;//MODULE: FAT -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION -;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET -;--------------------------------------------------------------- -;----------------------------------------------------------------------; - -SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - RET NZ - ; - LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) - OR A - RET Z - ; - ; Делаем FSInfo сектор - ; чистим сектор - LD HL,CORE_BUFFERS.SECTOR_BUFFER - LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 - LD (HL),0 - LD BC,512 - 1 ;!HARDCODE размер сектора - LDIR - ; LEAD_SIGNATURE - LD HL,#5252 - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE),HL - LD HL,#4161 - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE + 2),HL - ; DATA_SIGNATURE - LD HL,#7272 - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE),HL - LD HL,#6141 - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2),HL - ; SECTOR_SIGNATURE - LD HL,#AA55 - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL - ; FREE_CLUSTERS_COUNT - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL - ; FIRST_FREE_CLUSTER - LD HL,(G_CLUST.low) - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL - LD HL,(G_CLUST.high) - LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL - ; Пишем его на винт - XOR A - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A - JR WRITE_FSinfo -; ; -; Прочитать BPB в SECTOR_BUFFER -READ_BPB: LD C,Dss.DRV.GetBPB - JR RW_SECTOR -; Записать FSinfo из SECTOR_BUFFER -WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) - LD HL,0 - ;JR WRITE_SECTOR -; Записать сектор из SECTOR_BUFFER -; Вход: HL:IX = Logical Block (sector) -WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write - JR RW_SECTOR -; Прочитать FSinfo в SECTOR_BUFFER -READ_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) - LD HL,0 -; Прочитать сектор в SECTOR_BUFFER -; Вход: HL:IX = Logical Block (sector) -READ_SECTOR: LD BC,1*256 + Dss.DRV.Read - ; -RW_SECTOR: IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 - RST ToDSS.DRV - EX AF,AF' - ; - POP AF - OUT (SLOT3),A - EX AF,AF' - RET -; - -; [ ] удаление записи LFN -; -; вход: IX = текущая запись в странице с каталогом FAT для которой -; надо удалить записи LFS -DELETE_LFN_RECORDS: - PUSH IX - LD A,XH - AND #C0 - SUB 1 - LD C,A - ; В регистре C маска для определения выхода за пределы страницы - ; -.find_LFN: LD DE, -(FAT_DIRECTORY_RECORD) - LD A,FAT_ATTR.LFS_Entry - ; -.loop: ADD IX,DE - LD A,XH - CP C - JR Z,.beyond_boundaries - ; - LD A,FAT_ATTR.LFS_Entry - CP (IX+FAT_DIRECTORY_RECORD.ATTRIBUT) - JR NZ,.exit - LD (IX+FAT_DIRECTORY_RECORD.NAME),#E5 - JR .loop - ; -.exit: AND A -.beyond_boundaries: ; !TODO подгрузка другой части каталога. пока заглушка - POP IX - RET -;----------------------------------------------------------------------; - - -; Поиск записи каталога в списке каталога -; -; вход: a = атрибут записи -; выход: de = индекс записи в списке каталога -; (HANDBUF) = file's direcory record -; CF - каталог не найден -SEARCH: -.Dir: ;LD A,FAT_ATTR.DIRECTORY - LD A,FAT_ATTR.HiddenSysDir - CALL .Custom - RET NC - CP DSS_Error.sys.PATH_NOT_FOUND + 1 - RET C - ; - SCF - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - RET - ; -.File: LD A,FAT_ATTR.NoDIRnoVolID -.Custom: EX AF,AF' ; A = 76ADLSHR - SET_PAGE_X DIRPAGE - ;PUSH AF - EX AF,AF' - ; - CPL - LD C,A - LD IX,DIRPAGE.buffer - ;!TEST 9/11/23 record index - ; оптимизация для индекса записи в списке каталога. - ; Понадобится вернуть для перебора каталога > #4000 байт - ; EXX - ; LD DE,0 - ; EXX - ; -.loop: LD A,(IX+FAT_DIRECTORY_RECORD.NAME) - OR A - JR Z,.error_file_not_found - CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.next_record - LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) - AND C - JR NZ,.next_record - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 - EX DE,HL -.loop_compare: - LD A,(DE) - CP '?' - JR Z,.next_char - CP (HL) - JR NZ,.next_record -.next_char: - INC HL - INC DE - DJNZ .loop_compare - ; - LD D,XH - LD E,XL - ;!TEST 9/11/23 record index - ; EXX - ; PUSH DE - ; EXX - PUSH IX - ; - LD HL,HANDBUF - EX DE,HL - LD BC,HANDBUF.SIZE - LDIR - ;!TEST 9/11/23 record index - POP DE - ; - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - AND A - RET -.next_record: - LD DE,FAT_DIRECTORY_RECORD - ;!TEST 9/11/23 record index - ; EXX - ; INC DE - ; EXX - ; - ADD IX,DE - JR NC,.loop -.error_too_many_files: - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - SCF - RET - ; -.error_file_not_found: - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.FILE_NOT_FOUND - SCF - RET -;----------------------------------------------------------------------; - -; -;!TODO ? -;GHANDLE: -; PUSH DE -; PUSH HL -; PUSH IX -; CALL TESTDSK -; JP C,G_HAND1 -; CALL LOADDIR -; POP DE -; LD HL,DIR -; LD BC,FAT_DIRECTORY_RECORD -;G_HAND2: -; LD A,D -; OR E -; JP Z,G_HAND3 -; ADD HL,BC -; DEC DE -; JP G_HAND2 -;G_HAND3: -; EXX -; POP DE -; EXX -;G_HAND4: -; EX DE,HL -; LD A,DIRPAGE -; CALL BANK -; EX DE,HL -; LD DE,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; OUT (SLOT3),A -; LD HL,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; POP BC -; DEC BC -; LD A,B -; OR C -; RET Z -; PUSH BC -; JP G_HAND4 -;G_HAND1 POP IX -; POP HL -; POP DE -; RET -;HANDTA BLOCK 32,0 -; - -;----------------------------------------------------------------------; -; FIND "MASKAREA" IN DIRECTORY -; [x] fat32 ;!TEST -; выход: IY:DE - cluster number -FINDDIR: - SET_PAGE_X DIRPAGE - ; - PUSH AF - LD IX,DIRPAGE.buffer -.big_loop: - LD A,(IX + FAT_DIRECTORY_RECORD.NAME) - OR A - JR Z,.error - CP #E5 - JR Z,.next_step - LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT) - AND FAT_ATTR.DIRECTORY - JR Z,.next_step - LD HL,MASKARE - LD D,XH - LD E,XL - EX DE,HL - LD B,11 ;!HARDCODE -.loop: LD A,(DE) - CP "?" - JR Z,.compared - CP (HL) - JR NZ,.next_step -.compared: - INC HL - INC DE - DJNZ .loop - ; - LD A,(IX + FAT_DIRECTORY_RECORD.NAME) - CP "." - JP NZ,.ADDSPEC - LD A,(IX + FAT_DIRECTORY_RECORD.NAME + 1) - CP "." - JP NZ,.IT_DIR - LD HL,CORE_BUFFERS.WorkDirectory - LD D,H - LD E,L - INC HL - LD BC,CORE_BUFFERS.WorkDirectory.DEPTH - XOR A - CPIR - JP PO,.error ;[x] 20/11/23 проверка на выход за границы - DEC HL ;R009 - DEC HL - LD BC,CORE_BUFFERS.WorkDirectory.DEPTH - LD A,'\' - CPDR - INC HL - EX DE,HL - ; CF = 0 - SBC HL,DE - EX DE,HL - JR NZ,.MM3 - INC HL -.MM3: LD (HL),0 - JP .IT_DIR - ; -.next_step: - LD BC,FAT_DIRECTORY_RECORD - ADD IX,BC - JR NC,.big_loop - ; -.error: POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.PATH_NOT_FOUND - SCF - RET - ; -.ADDSPEC: - LD HL,CORE_BUFFERS.WorkDirectory+1 - LD BC,CORE_BUFFERS.WorkDirectory.DEPTH-1 - CALL .CHECK_SLASH - JR C,.error - ;R011 - LD A,B - AND A - JR NZ,.nxt - LD A,C - CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение - JR C,.error -.nxt: ; - LD E,XL - LD D,XH - ; [x] оптимизация по размеру - EX DE,HL - CALL GetName - EX DE,HL - ; - -; LD BC,256*8 + ' ' ;!HARDCODE -; .MM1: LD A,(DE) -; INC DE -; CP C -; JR Z,.MM2 -; LD (HL),A -; INC HL -; .MM2 DJNZ .MM1 ;x42-40 50-55 -; LD A,(DE) -; INC DE -; CP C -; JR Z,.MM3 -; LD (HL),"." -; INC HL -; LD (HL),A -; INC HL -; LD A,(DE) -; INC DE -; CP C -; JR Z,.MM3 -; LD (HL),A -; INC HL -; LD A,(DE) -; CP C -; JR Z,.MM3 -; LD (HL),A -; .MM2_5: INC HL -; .MM3: LD (HL),0 -; ; JP IT_DIR - ; -.IT_DIR:; fat32 - LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) - LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) - LD YH,D - LD YL,E - LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) - LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - POP AF - OUT (SLOT3),A - AND A - RET -.CHECK_SLASH: - XOR A - CPIR - ;[x] 20/11/23 проверка на выход за границы - SCF - RET PO - ; - DEC HL - DEC HL - LD A,'\' ; #5C - CP (HL) - INC HL - RET Z - LD (HL),A - INC HL - LD (HL),0 - ;INC HL - RET -;----------------------------------------------------------------------; - -CHECK_ROOT_CLUSTER: - EX DE,HL - LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005 - LD A,L - OR H - LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) - OR L - OR H - EX DE,HL - RET - -;----------------------------------------------------------------------; -; вход: HL - имя директории -; [x] fat32 ;!TEST -OPENDIR: LD IY,CORE_BUFFERS.FM_BUF - LD A,(HL) - OR A - JR NZ,.SUBDIR - ; -.REROOT: LD DE,0 - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE - CALL LOADDIR - ; CF=0 - LD HL,CORE_BUFFERS.WorkDirectory - LD (HL),'\' - INC HL - LD (HL),#00 - ;AND A - RET - ; -.SUBDIR: CP "." - JR NZ,.SUBDIR2 - ; fat32 - CALL CHECK_ROOT_CLUSTER - JR NZ,.no_root ;R005 - ; "cd ." or "cd .." - ;R005 - INC HL - LD A,(HL) - OR A - DEC HL - JR Z,.REROOT - ; -.no_root: EXX - LD HL,MASKARE - LD DE,MASKARE+1 - LD BC,10 ;!HARDCODE - LD (HL),' ' - LDIR - EXX - LD DE,MASKARE -.loop: LDI - LD A,(HL) - OR A - JR NZ,.loop - JR .SUBDIR3 - ; -.SUBDIR2: CALL MASK.name - RET C - ; fat32 -.SUBDIR3: CALL FINDDIR - RET C - EX DE,HL - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32 - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32 - LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL -;-------------; EX DE,HL -; JP LOADDIR -; Прочитать список каталога -; [x] fat32 ;!TEST -LOADDIR: ;!TODO optimize - CALL LOAD_SAVE_DIR_PREPARE - PUSH AF - EX AF,AF' - JR NZ,.read_dir - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR NZ,.LoadRootDir - ; fat32 - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - - ;LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог - LD HL,#4000 ; размер директории - LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL - ; -.read_dir: LD HL,DIRPAGE.buffer ; куда - LD DE,#4000 ; сколько - XOR A ; дескриптор - CALL READ ; чтение из файла - LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов - POP AF - OUT (SLOT3),A - RET - ; -.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) - LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога - CP B - JR NC,.RTD1 - LD B,A ; число секторов -.RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска - LD DE,DIRPAGE.buffer ; буфер - LD C,Dss.DRV.Read ; чтение секторов - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - RET -;----------------------------------------------------------------------; - - -;!TODO FAT procedures -;----------------------------------------------------------------------; - -LOAD_SAVE_DIR_PREPARE: - ;!TODO optimize - XOR A ; FILE MANIPULATOR = 0 - LD H,A - LD L,A - LD IX,0 - LD B,A ; от начала файла - CALL MOVE_FP - ; - SET_PAGE_X DIRPAGE - AND A - EX AF,AF' - ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - ;!FIXIT переделать на работу без IY - LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) - ; - EX AF,AF' - RET - -;----------------------------------------------------------------------; -; скопировать запись в список диска (каталога) de ix iy -; и сбросить кеш каталога на диск -; вход: (HANDBUF) - запись каталога -WRT_HND: - SET_PAGE_X DIRPAGE - EX AF,AF' - LD HL,DIRPAGE.buffer - ;!TEST 9/11/23 record index - ; EXX - ; LD DE,0 - ; EXX - ; - LD BC,FAT_DIRECTORY_RECORD -.loop: ;LD A,(IX+00) - LD A,(HL) - OR A - JR Z,.WRT_HN2 - CP #E5 - JR Z,.WRT_HN2 - ;ADD IX,BC - ADD HL,BC - JR NC,.loop ;!FIXIT количество записей каталога = страница - ; - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.ROOT_OVERFLOW - SCF - RET - ; -.WRT_HN2: ;LD D,XH - ;LD E,XL - EX DE,HL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR - EX AF,AF' - OUT (SLOT3),A - LD HL,DIRPAGE.buffer - LD BC,(SAVEDIR.DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - JR NC,SAVEDIR - LD HL,(SAVEDIR.DIRSIZE) - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) - ADD HL,BC - LD (SAVEDIR.DIRSIZE),HL - AND A - ;JP SAVEDIR -;----------------------------------------------------------------------; -; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -; [x] fat32 ;!TEST -SAVEDIR: ;!TODO optimize - CALL LOAD_SAVE_DIR_PREPARE - PUSH AF - EX AF,AF' - JR NZ,.save_dir - ; - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR NZ,.SaveRootDir - ; fat32 - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - ; -.save_dir: LD HL,DIRPAGE.buffer - ; размер списка каталога size_cash_directory - ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) - ; когда будет чтение кусками каталога в кэш, тут ещё счётчик прикрутить -.DIRSIZE+1: LD DE,0 - XOR A - CALL WRITE - POP AF - OUT (SLOT3),A - RET - ; -.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) - LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors - SUB B - JR NC,.RTD1S - ADD A,B - LD B,A -.RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD DE,DIRPAGE.buffer - LD C,Dss.DRV.Write - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - RET -;----------------------------------------------------------------------; - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; [x] fat32 ;!TEST -RD_BPB: ; LD C,SLOT3 - ; IN B,(C) - ; PUSH BC - ; IN A,(SLOT0) - ; OUT (SLOT3),A - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08 - ; LD C,Dss.DRV.GetBPB - ; RST ToDSS.DRV - ; POP BC - ; OUT (C),B - CALL READ_BPB - JP C,DOS_X_Error.Not_ready - ; - LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 - ;R05 - AND A - SBC HL,DE - JP NZ,DOS_X_Error.UnknownBPB - ; - ; ;R08 ; [x] fat32 - ; LD HL,CORE_BUFFERS.SECTOR_BUFFER - ; LD DE,CORE_BUFFERS.BootSector - ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size - ; LDIR - ; - LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) - CP #F0 - JP C,DOS_X_Error.UnknownBPB - ; - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector) - LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL - LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) - LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A - ; calc. first sector FAT - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 - ;[ ] fat32 - XOR A - LD B,A - LD C,A - 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.RootDirFirstSector_H),BC - LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 - ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables - ; - ; - EXX - LD H,A - LD L,A - LD D,A - LD E,A - EXX - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) - LD A,E - OR D - JR NZ,.skip_high - ; - EXX - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - LD A,E - EXX - ; - LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) - ; -.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE - LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs - LD (CORE_BUFFERS.FatBuffer.Number_Of_FATs),A - CP 1 - JR Z,.one_FAT - DEC A - ADD HL,DE - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL - EXX - ADC HL,DE - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL - EXX - ;JR NC,.no_inc_BC - ;INC BC -.no_inc_BC:;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC -.one_FAT: ; -.loop1: ADD HL,DE - ;JR NC,.loop1_1 - ;INC BC - EXX - ADC HL,DE - EXX -.loop1_1: DEC A - JR NZ,.loop1 - ; - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - EXX - ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),HL - EXX - ;LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC - ; - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) - LD A,B - AND A - ; - RL C - RLA - RL C - RLA - RL C - RLA - ; - LD C,A - LD B,0 ; BC - File handels per sector - ;;;; - IF COMPILE_UNUSED_CODE - LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A - ENDIF - ; - EX DE,HL - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 - ; [ ]fat32 ;!TEST - LD A,H - OR L - JR Z,.skip_loop2 - ; - DEC HL - XOR A - ;NEXTAD2 -.loop2: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,BC - JR NC,.loop2 - ; -.skip_loop2: EX DE,HL - LD C,A ; A - sectors in DIR - LD B,0 - LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A - - ADD HL,BC ; Start DATA area - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL - ; B = 0 - ; - LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector) - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) - ;!TODO FATcacheSize - ; calc. cluster size - XOR 1 - JR Z,.loop3.end - RRA -.loop3: ADD HL,HL - RRA - JP NC,.loop3 -.loop3.end: ; - LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL - ;LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO - ;AND A - ;SBC HL,DE - ;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) -//////////////////////////////////////////////////////////////////////// -;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer -; EX DE,HL -; LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize -; XOR A -; ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -;.loop4: INC A -; JP Z,DOS_X_Error.UnknownBPB -; SBC HL,DE -; JR NC,.loop4 -; LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) -; -; LD HL,0 -; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track -; LD A,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.HEADS) -;.BPB_L1: ; calc. sector per cylinder -; ADD HL,BC -; DEC A -; JR NZ,.BPB_L1 -; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL -//////////////////////////////////////////////////////////////////////// - ; [ ] fat32 - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) - LD A,H - OR L - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) - JP NZ,.HDDSMAL - ; - EXX - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) - PUSH HL ; Total Sectors high - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) - EXX - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) - PUSH HL ; Total Sectors low - AND A - SBC HL,DE - EXX - SBC HL,DE - PUSH HL - EXX - POP BC - ;JP NC,.HDDBIG - ;DEC BC - JP .HDDBIG - ; -.HDDSMAL: ; CF = 0 - LD BC,0 - PUSH BC ; Total Sectors high - PUSH HL ; Total Sectors low - SBC HL,DE - ; -.HDDBIG: CALL SectorToCluster -; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) -; SCF -; .loop7: RRA -; JR C,.loop7_exit -; RR B -; RR C -; RR H -; RR L -; JP .loop7 - ; -.loop7_exit: INC HL - LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL - LD A,L - OR H - JR NZ,.no_inc_bc - INC BC -.no_inc_bc: LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC - ; - XOR A - LD H,A - LD L,A - LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A - ; A = 0 - LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) - LD H,A - EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) - ; DE:HL = SectorsPerFAT - ; - LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) - LD B,A - DEC A - JR Z,.loop_mul_end - ; .Number_of_FATs * .SectorsPerFAT -.loop_mul: ADD HL,HL - EX DE,HL - ADC HL,HL - EX DE,HL - DJNZ .loop_mul -.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT - LD B,0 - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) - LD C,A - ADD HL,BC - JR NC,.no_inc_DE - INC DE -.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) - ADD HL,BC - JR NC,.no_inc_de - INC DE -.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT) - AND A - LD B,D - LD C,E - POP DE ; Total Sectors low - EX DE,HL - SBC HL,DE - EX (SP),HL ; Total Sectors high - SBC HL,BC - POP DE ; Total Sectors low - ; HL:DE = DataSec - ; - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) - ; HL:DE / A => DE:BC, H=0, L - остаток - CALL DIV_by_Shifts - ; выясняем разрядность FAT - LD A,D - OR E - JR NZ,.its_FAT32 - ; - LD HL,4084 - SBC HL,BC - JR NC,.its_FAT12 - ; - LD HL,65524 - SBC HL,BC - JR C,.its_FAT32 - ; - ; It's FAT16 - LD HL,#FFFF - LD A,FAT_TYPE.x16 -.set_vars: EXX - LD HL,0 - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),HL - LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL - EXX - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) - JR .SET_VARS - ; -.its_FAT12: LD HL,#0FFF - LD A,FAT_TYPE.x12 - JR .set_vars - ; -.its_FAT32: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MainFATnumber) - CP #80 - JR C,.mirrored_FATs ;если все копии FAT используются - ; используется только одна копия FAT - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) - LD D,0 - EXX - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) - AND #0F - JR Z,.first_FAT_active - LD B,A - ; -.fat_calc_loop: ADD HL,DE - EXX - ADC HL,DE - EXX - DJNZ .fat_calc_loop - ; -.first_FAT_active: - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL - EXX - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL - ; -.mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL - ; - EXX - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE - ; - CALL CLUSTER_TO_SECTOR.no_prepare - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL - ; - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) - LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL - ; - LD A,FAT_TYPE.x32 - LD HL,#0FFF - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL - LD H,L - LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) - ; -.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC - EXX - LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL - LD BC,11 ;!HARDCODE - LDIR - ; - SET_PAGE_X FATPAGE - PUSH AF - LD DE,0 - CALL READ_FAT_TABLE - POP AF - OUT (SLOT3),A - ; - ; Установить начальный кластер для чтения - LD A,(CORE_BUFFERS.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 (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL - XOR A - RET - ; -.set_FSinfo: CALL READ_FSinfo - ; !FIXIT проверка на ошибку - ; - ; проверка одной из сотни сраных сигнатур - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE) - LD DE,(CORE_BUFFERS.SECTOR_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,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) - LD DE,(CORE_BUFFERS.SECTOR_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 (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),BC - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),DE - ; - ; FIRST_FREE_CLUSTER - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) - LD DE,(CORE_BUFFERS.SECTOR_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 (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A - RET Z - ;!TODO FREE_CLUSTERS_COUNT - ;LD HL,#FFFF - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - ;LD (CORE_BUFFERS.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,(CORE_BUFFERS.FatBuffer.MaxClusterLow) - SBC HL,BC - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) - SBC HL,DE - RET -;;;;;;;; - -; --> BC:HL - Sector -; <-- BC:HL - Cluster -SectorToCluster: - LD A,B - AND #0F - LD B,A - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) - SCF -.loop: RRA - RET C - RR B - RR C - RR H - RR L - JP .loop -; - -DOS_X_Error: -.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT - SCF - RET - ; -.Not_ready: LD A,DSS_Error.sys.NOT_READY - ; CF = 1 - RET -; -; -;!TODO к буферам! -/* -FatBuffer: -;.MSG: DB 'FAT' -.DRIVE: DB #FF -.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 -.CacheBlock: DW #00 -.CacheUpdated: DB #00 -;.SectorsPerBank: DB #00 -.RootDirStartCluster_L: DW #0000 -.RootDirStartCluster_H: DW #0000 ; [ ] fat32 -.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) -.FAT1_SEC_H: DW #0000 ; [ ] fat32 -.FAT2_SEC_L: DW #0000 -.FAT2_SEC_H: DW #0000 ; [ ] fat32 -.SectorsPerFAT_L DW #0000 -.SectorsPerFAT_H DB #00 -.RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR -.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется -.DirSizeInSectors: DB #00 ; DIR_SEC_SIZE -.FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low -.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига -.BytesPerCluster: DW #0000 ; CLUSTER_LEN -.END_CHAIN_CLUSTER_L: DW #FFFF -.END_CHAIN_CLUSTER_H: DW #0FFF ; [ ] fat3 -.MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) -.MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) -; -.BytesPerSector DW #0000 -.SectorsPerCluster DB #00 -.BPB_SERIAL_NUMBER DW 0,0 -.BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS - IF COMPILE_UNUSED_CODE -.FilesPerSector: DB #00 ; число файловых записей в секторе -.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? - ENDIF -;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) -;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? -; -*/ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/FS_Module.asm b/DSS/FS_Module.asm new file mode 100644 index 0000000..da9d44a --- /dev/null +++ b/DSS/FS_Module.asm @@ -0,0 +1,8 @@ + INCLUDE "FS/FAT.ASM" + INCLUDE "FS/CDFS.ASM" + +/* + +READ_BPB ; Прочитать BPB в SECTOR_BUFFER + +*/ \ No newline at end of file diff --git a/DSS/Kernel_Panic.asm b/DSS/Kernel_Panic.asm deleted file mode 100644 index 8c5c791..0000000 --- a/DSS/Kernel_Panic.asm +++ /dev/null @@ -1,81 +0,0 @@ -; - MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor - LD HL,txtString - LD BC,txtColor*256 + txtStringSize - LD DE,coordY * 256 + (80 - txtStringSize)/2 - CALL .PRINT_LINE - ENDM ; 12 bytes -; -;-----------------------[] -; HL - сообщение -; E - координата X на текстовом экране -; BC - длина сообщения -KERNEL_PANIC: - DI - ; - PUSH DE - PUSH HL - PUSH BC - ; - LD E,1 - LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default - RST ToBIOS - ; - LD HL,#2050 - LD DE,0 - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - RST ToBIOS - ; - LD A,1 - OUT (SCREEN_SWITCH),A ; set scr-2 - ; - PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED) - PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE) - ; - POP BC - POP HL - LD DE,#A000 - LD A,C - LDIR - ; - POP DE - LD D,15 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - ; - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - ; -.loop: DI - HALT - JR .loop - ; -.PRINT_LINE: - PUSH BC - PUSH DE - LD DE,#A000 - LD B,E - LD A,C - LDIR - ; - POP DE - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - ; - POP DE - LD E,D - LD HL,#A000 - LD D,L - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - JP ToBIOS - ; -.kernel_panic: DZ "KERNEL PANIC!" -.kernel_panic.size EQU $-.kernel_panic -; -.press_CAD: DZ "Press Ctrl+Alt+Del or RESET." -.press_CAD.size EQU $-.press_CAD -;-----------------------[] \ No newline at end of file diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index 8356e6b..cf7ecdd 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -265,7 +265,6 @@ BCD2HEX: ;!TODO hardware ;----------------------------------------------------------------------; -;!FIXIT переделать по доке на Даллас и запись в ячейки часов ; Запись регистров CMOS ; вход: d=номер регистра WCMOS: CALL HEX2BCD @@ -343,4 +342,87 @@ DIV_by_Shifts: LD H,0 LD L,A RET -;----------------------------------------------------------------------; \ No newline at end of file +;----------------------------------------------------------------------; + +;=============================================================================================================================== + MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor + LD HL,txtString + LD BC,txtColor*256 + txtStringSize + LD DE,coordY * 256 + (80 - txtStringSize)/2 + CALL .PRINT_LINE + ENDM ; 12 bytes +; +;-----------------------[] +; HL - сообщение +; E - координата X на текстовом экране +; BC - длина сообщения +KERNEL_PANIC: + DI + ; + PUSH DE + PUSH HL + PUSH BC + ; + LD E,1 + LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default + RST ToBIOS + ; + LD HL,#2050 + LD DE,0 + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + RST ToBIOS + ; + LD A,1 + OUT (SCREEN_SWITCH),A ; set scr-2 + ; + PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED) + PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE) + ; + POP BC + POP HL + LD DE,#A000 + LD A,C + LDIR + ; + POP DE + LD D,15 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + ; +.loop: DI + HALT + JR .loop + ; +.PRINT_LINE: + PUSH BC + PUSH DE + LD DE,#A000 + LD B,E + LD A,C + LDIR + ; + POP DE + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + POP DE + LD E,D + LD HL,#A000 + LD D,L + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + JP ToBIOS + ; +.kernel_panic: DZ "KERNEL PANIC!" +.kernel_panic.size EQU $-.kernel_panic +; +.press_CAD: DZ "Press Ctrl+Alt+Del or RESET." +.press_CAD.size EQU $-.press_CAD +;-----------------------[] +;=============================================================================================================================== \ No newline at end of file diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM deleted file mode 100644 index f1bdb0a..0000000 --- a/DSS/VIDEO.ASM +++ /dev/null @@ -1,696 +0,0 @@ - -;[BEGIN] -;//MODULE: VIDEO -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" -;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) -;--------------------------------------------------------------- - -;///////////////////////////////////////////////////////////////////// -; Функция #56. Очистить окно. -; -; вход: D - строка левого верхнего угла окна -; E - столбец левого верхнего угла окна -; H - высота окна -; L - ширина окна -; A - символ заполнитель -; B - атрибут заполнитель -; выход: нет -;///////////////////////////////////////////////////////////////////// -CLEAR: LD C,BIOS.LP_CLS_WIN2 - JP ToBIOS - ;AND A - ;RET -; -;///////////////////////////////////////////////////////////////////// -; Функция #5C. Вывод строки на экран. -; -; вход: HL - указатель на строку символов -; выход: HL - указатель на следующую строку символов -; PRINT NULL-TERMINATED CHARS STRING -;///////////////////////////////////////////////////////////////////// -PCHARS: LD A,(HL) - INC HL - OR A - RET Z - CALL PUTCHAR - JP PCHARS - -;///////////////////////////////////////////////////////////////////// -; Функция #5B. Вывод символа на экран в тек. позиции. -; -; вход: A - символ -; выход: нет -;///////////////////////////////////////////////////////////////////// -PUTCHAR: - ;CALL .NO_SCROLL - CP #0E - JR C,.control_characters - ; - LD BC,1*256 + BIOS.LP_PRINT_SYM - ;[x] CR+LF+SCROLL - RST ToBIOS - ; - ; проверка на переход курсора в самое начало (X:Y == 0:0) - CALL CURSOR - LD A,D - OR E - RET NZ - ; -.LFF: PUSH HL - LD BC,1*256 + BIOS.LP_SCROLL_UD - LD DE,#0020 - RST ToBIOS - LD DE,#1F00 - CALL LOCATE - LD A,' ' - LD BC,#50*256 + BIOS.LP_PRINT_SYM - RST ToBIOS - LD DE,#1F00 - CALL LOCATE - POP HL - RET -.TB_: CALL CURSOR - IF TABisSPACES - LD B,E - LD A,E - AND #F8 - ADD A,8 - SUB B - LD B,A - LD A,' ' - LD C,BIOS.LP_PRINT_SYM - JP ToBIOS - ELSE - LD A,E - ADD A,8 - AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти - LD E,A - JP LOCATE - ENDIF -.BK_: CALL CURSOR - XOR A - CP E - RET Z - DEC E - JP LOCATE - ; -.LF_: CALL CURSOR - LD A,D - CP #1F - JR NC,.LFF - INC D - IFN EnoughtOnly_LF - JP LOCATE - ELSE - CALL LOCATE - ; !!!! НЕ разрывать LF_ и CR_ !!!! - ENDIF -.CR_: CALL CURSOR - LD E,0 - JP LOCATE - ; -.control_characters: - CP #0D - JR Z,.CR_ - CP #0A - JR Z,.LF_ - CP #09 - JR Z,.TB_ - CP #08 - JR Z,.BK_ - CP #07 ; [x] Beep in PChars/PUTCHAR - RET NZ - ; [x] Beep in PChars/PUTCHAR -.BELL: LD DE,1200 - PUSH HL - LD HL,4 - CALL BEEP - POP HL - RET - ; -; [x] -bug with Vasil's version of cursor -.NO_SCROLL: - CP #0E - JR C,.control_characters -._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - JP ToBIOS - ; - -;-----[] -; -; - -;///////////////////////////////////////////////////////////////////// -; Функция #52. Установить положение курсора. -; -; вход: D - строка курсора -; E - колонка курсора -; выход: нет -;///////////////////////////////////////////////////////////////////// -LOCATE: LD C,BIOS.LP_SET_PLACE - JP ToBIOS - -;///////////////////////////////////////////////////////////////////// -; Функция #53. Узнать положение курсора. -; -; вход: нет -; выход: D - строка курсора -; E - колонка курсора -;///////////////////////////////////////////////////////////////////// -CURSOR: LD C,BIOS.LP_GET_PLACE - JP ToBIOS - -;///////////////////////////////////////////////////////////////////// -; Функция #57. Прочитать символ с экрана. -; -; вход: D - строка -; E - колонка -; выход: A - символ -; B - атрибут -;///////////////////////////////////////////////////////////////////// -RDCHAR: XOR A - LD C,BIOS.WIN_GET_SYM - RST ToBIOS - LD A,L - LD B,H - ;AND A - RET - -;///////////////////////////////////////////////////////////////////// -; Функция #58. Вывести символ на экран. -; Управляющие символы выводятся как обычные символы. -; -; вход: D - строка -; E - колонка -; A - символ -; B - атрибут -; выход: нет -;!FIXIT slow как без WIN_GET_SYM тут обойтись? -;///////////////////////////////////////////////////////////////////// -WRCHAR: LD C,A - PUSH BC - PUSH DE - XOR A - LD C,BIOS.WIN_GET_SYM - RST ToBIOS - POP DE - POP HL - XOR A - LD C,BIOS.WIN_PUT_SYM - JP ToBIOS - ;AND A - ;RET - -;///////////////////////////////////////////////////////////////////// -; Функция #59. Сохранить окно экрана. -; -; вход: D - строка -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B - страница буфера, если IX >= #C000 -; IX - адрес буфера -; выход: нет -;///////////////////////////////////////////////////////////////////// -WINCOPY: AND A - LD A,R ;R02 - PUSH AF ;R02 - XOR A - LD C,BIOS.WIN_COPY - DI ;R02 - RST ToBIOS - POP AF ;R02 - RET PO ;R02 - EI ;R02 - RET - -;///////////////////////////////////////////////////////////////////// -; Функция #5A. Восстановить окно экрана. -; -; вход: D - строка -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B - страница буфера, если IX >= #C000 -; IX - адрес буфера -; выход: нет -;///////////////////////////////////////////////////////////////////// -WINREST: AND A - LD A,R ;R02 - PUSH AF ;R02 - XOR A - DI ;R02 - LD C,BIOS.WIN_RESTORE - RST ToBIOS - POP AF ;R02 - RET PO ;R02 - EI ;R02 - RET -;///////////////////////////////////////////////////////////////////// -; Функция #55. Скроллинг экрана. -; -; вход: D - строка левого верхнего угла окна -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B = 1 - прокрутка вверх -; B = 2 - прокрутка вниз -; A = 0 - очищать строку -; выход: нет -;///////////////////////////////////////////////////////////////////// -SCROLL: DJNZ .SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее - ;[x] 04/04/23 - ;LD B,A - ;LD C,H - ;PUSH BC - PUSH AF - ; - PUSH DE - PUSH HL - LD XH,D - LD XL,E - INC D - DEC H - LD C,BIOS.WIN_MOVE - ;[x] 29/9/23 - LD A,R - PUSH AF - ; - XOR A - DI ;[x] 29/9/23 - RST ToBIOS - ;[x] 29/9/23 - POP AF - JP PO,.skip_EI - EI -.skip_EI: - POP HL - POP DE - ;[x] 04/04/23 - ;POP BC - POP AF - ;XOR A - ;CP B - AND A - ; - RET NZ - LD A,D - ADD A,H - DEC A ;R01 - LD D,A -.print: PUSH DE ;R01 - CALL LOCATE - LD A,' ' - LD B,L - LD C,BIOS.LP_PRINT_SYM - RST ToBIOS - POP DE ;R01 - JP LOCATE ;R01 - ;AND A - ;RET -.SCR_DW: - DJNZ .SCR_ERR - ;[x] 04/04/23 - ;LD B,A - ;LD C,H - ;PUSH BC - PUSH AF - ; - PUSH DE - PUSH HL - LD XH,D - LD XL,E - INC XH - DEC H - LD C,BIOS.WIN_MOVE - ;[x] 29/9/23 - LD A,R - PUSH AF - ; - XOR A - DI ;[x] 29/9/23 - RST ToBIOS - ; [x] 29/9/23 - POP AF - JP PO,.skip2_EI: - EI -.skip2_EI: - POP HL - POP DE - ;[x] 29/9/23 - ;POP BC - POP AF - ;XOR A - ;CP B - AND A - ; - RET NZ - JP SCROLL.print -.SCR_ERR: - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET - -;///////////////////////////////////////////////////////////////////// -; Функция #54. Выбрать активную страницу экрана. -; -; вход: B - страница экрана 0/1 -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -SELPAGE: - LD A,(VMODE) - ;BIT 7,A - CP %1000'0000 - JR NC,.SEL2 - PUSH BC - LD C,A - CALL SETVMOD.TEXT_M - POP BC -.SEL2: LD A,B - AND #01 - OUT (SCREEN_SWITCH),A - RET - -;///////////////////////////////////////////////////////////////////// -; Функция #51. Получить текущий режим экрана. -; -; вход: нет -; выход: A - текущий режим экрана -; B - страница экрана 0/1 -;///////////////////////////////////////////////////////////////////// -GETVMOD: - IN A,(SCREEN_SWITCH) - LD B,A - LD A,(VMODE) - AND A - RET - -;///////////////////////////////////////////////////////////////////// -; Функция #50. Выбор режима экрана. -; -; вход: A - режим экрана -; #02 - текстовый 40x32x16 цветов -; #03 - текстовый 80x32x16 цветов -; #81 - графический 320x256x256 цветов -; #82 - графический 640x256x16 цветов -; B - страница экрана 0/1 -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -SETVMOD:; - CP %1000'0000 - LD C,A - JR NC,GRAPH -.TEXT_M: LD IX,BACKTXT - PUSH IX - EX AF,AF' - LD A,(VMODE) - LD (BACKTXT.VMODE),A - EX AF,AF' - OR A - JR Z,.NOMODE - DEC A - JR Z,.NOMODE - DEC A - LD HL,TAB_40x32 - JR Z,T_40_32 - DEC A - LD HL,TAB_80x32 - JR Z,T_80_32 -.NOMODE: POP IX - LD A,DSS_Error.sys.INVALID_VIDEO_MODE - SCF - RET - -; Установка граф. режимов -GRAPH: CALL SAVETXT - AND #7F - JR Z,G320_16 ; !TODO ? - пока отрабатывает как ошибка - DEC A - JR Z,G320_56 - DEC A - JR Z,G640_16 -; DEC A -; JP Z,G640_56 ; !TODO ? - пока отрабатывает как ошибка -G320_16: LD A,DSS_Error.sys.INVALID_VIDEO_MODE - SCF - RET - -T_80_32: -T_40_32: PUSH BC -; LD HL,TAB2 - LD A,B - RLCA - RLCA - RLCA - RLCA - OR B - AND #11 - XOR #10 - LD E,A -GRAPH_NEXT: - CALL SETMODE - POP BC - LD A,C - LD (VMODE),A - LD A,B - AND #01 - OUT (SCREEN_SWITCH),A - LD A,(VMODE) - LD C,Dss.Mouse.SetVideoMode - RST ToDSS.Mouse - SAFE_PORTY - XOR A - RET - -; T_80_32 PUSH BC -; LD HL,TAB1 -; LD A,B -; RLCA -; RLCA -; RLCA -; RLCA -; OR B -; AND #11 -; XOR #10 -; LD E,A -; CALL SETMODE -; POP BC -; LD A,C -; LD (VMODE),A -; LD A,B -; AND #01 -; OUT (SCREEN_SWITCH),A -; LD A,(VMODE) -; LD C,#81 -; RST #30 -; SAFE_PORTY -; XOR A -; RET - -G320_56 PUSH BC - LD HL,TAB_320x256_0 - LD E,#11 - CALL SETMODE - LD HL,TAB_320x256_1 - LD E,#00 - JP GRAPH_NEXT - ; CALL SETMODE - ; POP BC - ; LD A,C - ; LD (VMODE),A - ; LD A,B - ; AND #01 - ; OUT (SCREEN_SWITCH),A - ; LD A,(VMODE) - ; LD C,#81 - ; RST #30 - ; SAFE_PORTY - ; XOR A - ; RET - -G640_16 PUSH BC - LD HL,TAB_640x256_0 - LD E,#11 - CALL SETMODE - LD HL,TAB_640x256_1 - LD E,#00 - JP GRAPH_NEXT - - ; CALL SETMODE - ; POP BC - ; LD A,C - ; LD (VMODE),A - ; LD A,B - ; AND #01 - ; OUT (SCREEN_SWITCH),A - ; LD A,(VMODE) - ; LD C,#81 - ; RST #30 - ; SAFE_PORTY - ; XOR A - ; RET -VMODE: DB #03 - -;----------------------------------------------------------------------- -; Открыть окно -; вход: hl=описатель окна -; e=флаги окна -; -;02h - TEXT 40 x 32 (16 colors) -;03h - TEXT 80 x 32 (16 colors) -;80h - GRAF 320 x 256 (16 colors) -;81h - GRAF 320 x 256 (256 colors) -;82h - GRAF 640 x 256 (16 colors) -;83h - GRAF 640 x 256 (256 colors) UNUSED -;----------------------------------------------------------------------- -SETMODE: PUSH DE - LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса. - LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает - IN A,(SLOT3) ; на адрес ниже #C000 и вставляет в третью банку страницу #FE - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LDIR - EX AF,AF' - OUT (SLOT3),A -.skip_EI: POP DE - LD IX,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. - LD C,BIOS.WIN_OPEN - RST ToBIOS - SAFE_PORTY - XOR A - RET - -;IX+0 ;HORIZONTAL -;IX+1 ;VERTICAL -;IX+2 ;X - COORD -;IX+3 ;Y - COORD -;IX+4 ;MODE -;IX+5 ;EXT MODE -;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES) -;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES) - -; -;....................................................................... -;+0 X размер окна в знакоместах -;+1 Y размер окна в знакоместах -;+2 X полож. окна на экране -;+3 Y полож. окна на экране -;+4 режим знакоместа -;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) -;+6 X полож. в поле графики (в знакоместах) -;+7 Y полож. в поле графики (в знакоместах) -ScreenDescriptorTable EQU $ -; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген. -TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1 -; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген. -TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2 -; 640x256. графическое, 0-й экран -TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3 -; 320x256. графическое, 0-й экран -TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4 -; 640x256. графическое, 1-й экран -TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5 -; 320x256. графическое, 1-й экран -TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6 -ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 -;....................................................................... -; - -;---------------------------------------------------------------------- -; Сохранить экран текст. режима. -; Для буфера экрана исп. 2-я банка расширения ДОС. -SAVETXT: PUSH AF - LD A,(VMODE) - ;BIT 7,A - CP %1000'0000 - JR NC,.NOSAVET - SUB #02 - JR C,.NOSAVET - ; - PUSH BC - PUSH DE - PUSH HL - PUSH IX - ; - PUSH AF - LD C,BIOS.LP_GET_PLACE - RST ToBIOS - LD (BACKTXT.CURS),DE - POP AF - LD IX,#C000 - LD HL,#2050 - OR A - JR NZ,.SVTEXT1 - LD L,#28 -.SVTEXT1: LD (BACKTXT.WinMax),HL - LD DE,#0000 - LD A,(BANKTBL+TXTPAGE) - LD B,A - - LD C,BIOS.WIN_COPY - ;[x] 29/9/23 - LD A,R - PUSH AF - ; - XOR A - DI - RST ToBIOS - ;[x] 29/9/23 - POP AF - JP PO,.skip_EI - EI -.skip_EI: ; - POP IX - POP HL - POP DE - POP BC -.NOSAVET: POP AF - RET -;---------------------------------------------------------------------- - -BACKTXT: PUSH AF -.VMODE+1: LD A,#00 - ;BIT 7,A - CP %1000'0000 - JR C,.NOBACKT - ; - PUSH BC - PUSH DE - PUSH HL - PUSH IX - LD IX,#C000 -.WinMax+1: LD HL,#2050 - LD DE,#0000 - LD A,(BANKTBL+TXTPAGE) - LD B,A - LD C,BIOS.WIN_RESTORE - ;[x] 29/9/23 - LD A,R - PUSH AF - ; - XOR A - DI - RST ToBIOS - ;[x] 29/9/23 - POP AF - JP PO,.no_ei - EI -.no_ei: ; -.CURS+1: LD DE,#0000 - CALL LOCATE - POP IX - POP HL - POP DE - POP BC -.NOBACKT: POP AF - RET -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -;//MODULE: VIDEO -;[END] \ No newline at end of file diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM new file mode 100644 index 0000000..29d977b --- /dev/null +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -0,0 +1,495 @@ +;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC +ReScanDRV: +.NUMBER_OF_SUBTABLES EQU 2 ;количество таблиц второго уровня (LOGDRV, RMDRIVE) +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 0. запоминаем бут-диск +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,B + LD (.old_letter),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 1. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,DEVICE + LD DE,OLD_TABLES.DEVICE + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; + LD A,.NUMBER_OF_SUBTABLES + LD (Fill_if_Exists.tbl),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 2. вызываем инициализацию драйвов +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + CALL INITDVC_RET_DRIVE + LD (DRV_PAGE.LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 3. сравниваем записи старых таблиц с новыми: +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + LD B,DSS_MAX_DRIVES_AMOUNT +.tbl_scanNew_mainLoop: + PUSH BC + PUSH HL + ; получаем номер процедуры для этой буквы диска + LD A,(HL) + ; + CP #FF + JR Z,.nextN + ; + LD B,A + INC HL + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + ; [ищем что за драйв] + EX DE,HL + ; FDD? + LD HL,FDD_DRV.API_TABLE + AND A + SBC HL,DE + JR Z,.nextN ; пропуск FDD драйвов + ; HDD? + LD HL,HDDRIVE + AND A + SBC HL,DE + ; HDD! Сверка по таблице LOGDRV + JP Z,SCAN_TABLES.HARD_DRV + ; RD? + LD HL,RMDRIVE + AND A + SBC HL,DE + ; RAM Drive! Сверка по таблице RAMDTBL + JP Z,SCAN_TABLES.RAM_DRV + ; CD/DVD? + ;LD HL,CDDRIVE + ;AND A + ;SUB HL,DE + ; CD/DVD! + ; JR Z,SCAN_TABLES.CD_ROM + + ; следующий виток +.nextN: POP HL +.nextN2: + INC HL + INC HL + INC HL + POP BC + DJNZ .tbl_scanNew_mainLoop +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 4. сравниваем запись новых таблиц со старыми +; а. если драйв только в новой: +; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) +; +; ВХОД: IX - OLD_TABLES.DEVICE +; HL - OLD_TABLES.DEVICE.End +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + INC HL + LD (OLD_TABLES_CURRENT),HL + EXX + LD HL,OLD_TABLES.LOGDRV - LOGDRV + LD B,DSS_MAX_DRIVES_AMOUNT + EXX + ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало) + LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry + LD IY,LOGDRV + LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop1: LD A,#FF + CP (IX+0) + JR NZ,.loop2_start + ADD IX,DE + DJNZ .loop1 +.loop1_exit: + LD A,C ; закончили считать переменную LDRIVE + LD (DRV_PAGE.LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 5. проверяем, не грохнулся ли бут-диск. +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +.old_letter+1: + LD A,0 + _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE + LD A,(HL) + INC A + SCF + ;JP Z,ERROR_BOOTDRV_DIES + RET Z +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 6. заменяем новые таблицы на модифицированные старые +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + LD DE,DEVICE + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;7. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,(DRV_PAGE.LDRIVE) + AND A + RET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;-----------------------[] +.loop2_start: + LD C,B ; начинаем считать переменную LDRIVE + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B ; сколько шагов вперёд по таблице осталось + LD B,A + ; +.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд + ADD IX,DE + ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов + PUSH IX + PUSH BC + CALL Fill_if_Exists + POP BC + POP IX + ; NC: + ; DE = адрес процедуры обработчика таблицы + ; A = логический номер устройства в таблице обработчика + ; + ; CF - нет больше новых записей + JR C,.loop1_exit + + LD (IX+0),A + LD (IX+1),E + LD (IX+2),D + ; + INC C ; добавили драйв + ; + DJNZ .loop2 + JR .loop1_exit +;-----------------------[] + +;-----------------------[] +Fill_if_Exists: +.tbl+1: LD B,ReScanDRV.NUMBER_OF_SUBTABLES + DJNZ 1F + ; B=1, RAMDTBL + LD A,RAMDTBL.TBL_Entry + LD IY,RAMDTBL + CALL .RUN + LD DE,RMDRIVE + RET NC + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + RET + ; +1: DJNZ 1F + ; B=2, LOGDRV + LD A,LOGDRV.TBL_Entry + LD IY,LOGDRV + CALL .RUN + LD DE,HDDRIVE + RET NC + ; переходим на другую таблицу - RAMDTBL + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + LD HL,OLD_TABLES.RAMDTBL + LD (OLD_TABLES_CURRENT),HL + EXX + LD B,MAX_RAMDRIVES + EXX + JR Fill_if_Exists + ; +1: SCF ; unknown table number + RET +; +.RUN: EXX + ; + LD D,0 + LD E,A + PUSH DE + ; + LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы + PUSH BC + CALL Find_Record.loop1 ; ищет в новой таблице новую запись + POP BC + JR NC,1F + ; + POP DE + EXX + RET + ; +1: PUSH IY ; сохраняем текущий адрес новой таблицы + ; + LD IY,(OLD_TABLES_CURRENT) + ; + LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы + LD C,D ; номер записи в таблице. D=0 + PUSH BC + CALL Find_Record.loop2 + LD A,C + POP BC + JR NC,1F + ; + POP DE + POP DE + EXX + RET + ; +1: EX (SP),IY ; переключение со старой на новую таблицу + PUSH IY + EXX + ; перекидываем запись из новой в старую + POP HL + POP DE + POP BC + LDIR + + LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы + AND A + RET +OLD_TABLES_CURRENT: WORD 0 +;-----------------------[] + +;-----------------------[] +; ВХОД: A - Маска для сравнения +; DE - Длина одной записи +; IY - Адрес данных в таблице +; ВЫХОД: NC: +; IY - начало подходящей записи +; C - номер новой записи в старой таблице +; CF - Не найдено, таблица закончилась +Find_Record: +.loop1: CP (IY) + RET NC + ADD IY,DE + INC C + DJNZ .loop1 + ; таблицу прошерстили + SCF + RET +.loop2: CP (IY) + RET Z + ADD IY,DE + INC C + DJNZ .loop2 + ; таблицу прошерстили + SCF + RET +;-----------------------[] + +;-----------------------[] +; ERROR_BOOTDRV_DIES: +; DI +; LD E,1 +; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default +; RST ToBIOS +; ; +; LD HL,#2050 +; LD DE,0 +; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN +; RST ToBIOS +; ; +; LD A,1 +; OUT (SCREEN_SWITCH),A ; set scr-2 +; ; +; LD HL,.ERROR_MSG +; LD DE,#A000 +; LD BC,.ERROR_MSG.size +; LD A,C +; LDIR +; ; +; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 +; LD C,BIOS.LP_SET_PLACE +; RST ToBIOS +; ; +; LD HL,#A000 +; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE +; LD B,A +; LD C,BIOS.LP_PRINT_LINE3 +; RST ToBIOS +; ; +; .loop: DI +; HALT +; JR .loop +; ; +; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +; .ERROR_MSG.size EQU $-.ERROR_MSG +;-----------------------[] + + +;-----------------------[] +; НЕ ГРОХАТЬ HL! +; а. если драйв есть в новой и старой, то затираем в новой +; таблице совпавший драйв +; б. если драйв есть только в старой, то: +; б1) грохаем файловые манипуляторы с его номером + MODULE SCAN_TABLES +; вход: B - лог.номер драйва, DE +RAM_DRV: + ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL + LD A,B + LD BC,OLD_TABLES.RAMDTBL + CALL GET_RAMDRV_NUM.skip_tbl + LD (.cur_drv),BC + AND #0F + LD C,A ; номер рамдиска + ; Ищем в новой такой же номер рамдиска + LD B,MAX_RAMDRIVES + LD DE,RAMDTBL +.loop: LD A,(DE) + SUB C + JR Z,.found + INC DE + INC DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; грохаем в старой RAMDTBL этот драйв + EX DE,HL +.cur_drv+1: + LD HL,0 + LD (HL),#FF + DEC HL + LD (HL),#FF + EX DE,HL + JP ReScanDRV.nextN2 + ; +.found: DEC A + ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (DE),A + DEC DE + LD (DE),A + JP ReScanDRV.nextN +;-----[] +HARD_DRV: + LD L,B + LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV + LD IX,LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) + ;CP #FF + ;JR Z,.skip + CP (IX+LOGDRV.PHISICAL_DRV_NUMBER) + JR NZ,.skip + ; + LD A,(IY+LOGDRV.SECTOR_OFFSET) + CP (IX+LOGDRV.SECTOR_OFFSET) + JR NZ,.skip + LD A,(IY+LOGDRV.SECTOR_OFFSET+1) + CP (IX+LOGDRV.SECTOR_OFFSET+1) + JR NZ,.skip + LD A,(IY+LOGDRV.SECTOR_OFFSET+2) + CP (IX+LOGDRV.SECTOR_OFFSET+2) + JR NZ,.skip + LD A,(IY+LOGDRV.SECTOR_OFFSET+3) + CP (IX+LOGDRV.SECTOR_OFFSET+3) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS) + CP (IX+LOGDRV.SIZE_IN_SECTORS) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+1) + CP (IX+LOGDRV.SIZE_IN_SECTORS+1) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+2) + CP (IX+LOGDRV.SIZE_IN_SECTORS+2) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+3) + CP (IX+LOGDRV.SIZE_IN_SECTORS+3) + JR Z,.found + ; +.skip: ADD IX,DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Грохаем старую запись в OLD_TABLES.LOGDRV + LD A,#FF + LD (IY+LOGDRV.PHISICAL_DRV_NUMBER),A + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; + JP ReScanDRV.nextN2 + ; +.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),#FF + JP ReScanDRV.nextN + ; +; CD_ROM: +; JP ReScanDRV.nextN +;-----[] +; ВХОД: HL - текущая запись в таблице DEVICE +; B - шаг общего цикла +KILL_FM:; + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B + LD C,A + ; втыкаем страницу ядра с таблицей файловых манипуляторов + PUSH BC + LD A,(PORTAL.out_DRV.RETBANK) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B + POP BC + PUSH AF + ; Шерстим манипуляторы на наличие в них грохнутого драйва + LD IY,CORE_BUFFERS.FM_BUF + #C000 ; - CORE_BUFFERS.FM_BUF.Size + LD B,FMCOUNT - 1 ; пропускаем служебный нулевой манипулятор + LD DE,CORE_BUFFERS.FM_BUF.Size +.loop_fm: + ADD IY,DE + LD A,(IY+_sFM.DRIVE) + CP C + JR NZ,.skip + XOR A + LD (IY+_sFM.FS_REC.NAME),A ; грохаем манипулятор +.skip: DJNZ .loop_fm + ; + POP AF + OUT (SLOT3),A + ; + ; грохаем в OLD_TABLES.DEVICE убитый драйв + LD (HL),#FF + ; + RET + ENDMODULE +;-----------------------[] + +/* +[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78+1 + 416 + 32 == 526 + +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE EQU $ +.TBL_Entry EQU 3 +.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF +.Size EQU .End - $ + +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO +;+13 WORD FREE +;+15 BYTE FREE +; Логический номер раздела. +;Номер группы = логический номер раздела HDD из DEVICE +LOGDRV EQU DEVICE + DEVICE.Size +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry + +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID +RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size +.TBL_Entry EQU 2 +.Size EQU .TBL_Entry * MAX_RAMDRIVES +*/ \ No newline at end of file diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm new file mode 100644 index 0000000..11c3129 --- /dev/null +++ b/DSS/drivers/media/fdd-drv.asm @@ -0,0 +1,417 @@ + +; Disk Driver Specification ver. 2.00 +;[]===========================================================[0] +;Procedure : Initialization +; +;Function : Initialization device(s) +; +;Input : C = 00h +; IX - Environment +;Output : A = Amount drive support +; HL = Size driver +;[]===========================================================[] +;[]===========================================================[1] +;Procedure : Open +; +;Function : Open disk +; +;Input : C = 01h +; A - Drive +;Output : None +; +;[]===========================================================[] +;[]===========================================================[2] +;Procedure : Close +; +;Function : Close disk +; +;Input : C = 02h +; A - Drive +;Output : None +; +;[]===========================================================[] +;[]===========================================================[3] +;Procedure : Media check +; +;Function : Checking change line +; +;Input : C = 03h +; A - Drive +;Output : A = 00h disk no changed +; A = 0FFh disk changed +; +;[]===========================================================[] +;[]===========================================================[4] +;Procedure : Get BPB +; +;Function : Get Block Parameters BIOS +; +;Input : C = 04h +; DE - Address +;Output : None +; +;[]===========================================================[] +;[]===========================================================[5] +;Procedure : Input +; +;Function : Input from disk +; +;Input : C = 05h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[] +;[]===========================================================[6] +;Procedure : Output +; +;Function : Output to disk +; +;Input : C = 06h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[] +;[]===========================================================[7] +;Procedure : Removable +; +;Function : Checking change line +; +;Input : C = 07h +; A - Drive +;Output : A = 00h Removable +; A = FFh Nonremovable +; +;[]===========================================================[] +;[]===========================================================[8] +;Procedure : Generic IOCTL +; +;Function : Generic Input Output Control +; +;Input : C = 08h +; B - Subcommand +; DE = 55AAh Magic Number +; Subcommand +;---------------------- +; 00h - Get Device Parameters +; 01h - Read track +; 02h - Test track +; 80h - Set Device Parameters +; 81h - Write track +; 82h - Format track +;Output : +; +;[]===========================================================[] +; +; Errors: +; 0 (00h) - NO ERRORS +; 1 (01h) - BAD COMMAND +; 2 (02h) - BAD DRIVE NUMBER +; 3 (03h) - UNKNOW FORMAT +; 4 (04h) - NOT READY +; 5 (05h) - SEEK ERROR +; 6 (06h) - SECTOR NOT FOUND +; 7 (07h) - CRC ERROR +; 8 (08h) - WRITE PROTECT +; 9 (09h) - READ ERROR +; 10 (0Ah) - WRITE ERROR +; 11 (0Bh) - FAILURE +; 12 (0Ch) - BUSY (DEVICE OPENED) +; 13 (0Dh) - RESERVED + +; R_COM EQU #0F ;Command/Status +; R_TRK EQU #3F ;Track +; R_SEC EQU #5F ;Sector +; R_DAT EQU #7F ;Data +; R_DSK EQU #FF ;Drive Control +; COM_B EQU #1B + + + +//////////////////////////////////////////////////////////////////////// + MODULE FDD_DRV +//////////////////////////////////////////////////////////////////////// + + + +;------------------------------------------------- +; Обработчик FDD (rst 18h) +;------------------------------------------------- +API_TABLE: INC C + DEC C + JP Z,Init ;#00 Init + DEC C + JP Z,Open ;#01 Open + DEC C + JP Z,Close ;#02 Close + DEC C + JP Z,MediaCheck ;#03 MediaCheck + DEC C + JP Z,GetBPB ;#04 GetBPB + DEC C + JP Z,Read ;#05 Read + DEC C + JP Z,Write ;#06 Write + DEC C + JP Z,Removable ;#07 Removable + DEC C + JP Z,GenIOCTL ;#08 GenIOCTL + DEC C + JP Z,Reserved ;#09 + ; +Reserved: LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Commands for restart #18 ; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; +Init: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? + AND A + RET +; ; ; + +; +Open: LD C,BIOS.DRV_RESET + RST ToBIOS + RET +; ; ; + +; +Close: XOR A + RET +; ; ; + + +;!FIXIT проверять ВГ93 когда это станет возможным +MediaCheck: IF NON_REMOVABLE_FDD + XOR A + ELSE + LD A,#FF + OR A + ENDIF + RET +; ; ; + + +;DE - ADDRESS +GetBPB: LD IX,0 + LD HL,0 + PUSH DE + PUSH AF + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP DE + POP HL + RET C + LD BC,BOOT_SECTOR.SectorsPerTrack + ADD HL,BC + LD E,(HL) + PUSH DE + LD A,D + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + LD A,H + POP HL + PUSH HL + LD H,A + POP AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS + XOR A + RET +; ; ; + + +; !TODO read track? +;READTR: XOR A +; RET +; ; ; + +; +Read: LD C,BIOS.DRV_READ + RST ToBIOS + RET +; ; ; + +; +Write: LD C,BIOS.DRV_WRITE + RST ToBIOS + RET +; ; ; + + +; 00 - GET DEVICE PARAMETERS +; 01 - READ TRACK +; 02 - TEST TRACK +; 80 - SET DEVICE PARAMETERS +; 81 - WRITE TRACK +; 82 - FORMAT TRACK +GenIOCTL: BIT 7,B + JR NZ,.O_CTL_F + INC B + DEC B + JP Z,.GetParams + ;!TODO + ;DEC B + ;JP Z,.ReadTrack + ;DEC B + ;JP Z,.TestTRK + ; + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + ; +.O_CTL_F: RES 7,B + INC B + DEC B + JP Z,.SetParams + ;!TODO + ;DEC B + ;JP Z,.WriteTRK + ;DEC B + ;JP Z,.FormatTRK + ; + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET +; ; ; + + +; Вход: - A - Drive number +; Выход: +; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - EXTENDED INFORMATION +; D1..D3 - "0" RESERVED (MAY BE OTHER) +; D4 - DEVICE MASTER/SLAVE +; D5 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D7 - "1" RESERVED +.GetParams: EX DE,HL + LD BC,#55AA + AND #0F + SBC HL,BC + JR Z,.next + ; + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + ; +.next: PUSH AF + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + JR C,.NONE_FDD + PUSH HL + PUSH DE + LD A,H + LD H,0 + ; +.mull_loop1: ADD HL,HL + DEC A + JR NZ,.mull_loop1 + ; + ; HL - SECTOR PER CYLLINDER + ; A=0 ZF=0 CF=0 + LD B,H + LD C,L + ;LD HL,0 + ;XOR A + LD H,A + LD L,A + EX AF,AF' + ; +.mull_loop2: EX AF,AF' + ADD HL,BC + ADC A,0 + DEC DE + EX AF,AF' + LD A,D + OR E + JR NZ,.mull_loop2 + ; + ; A=0 DE=0 ZF=0 CF=0 + EX AF,AF' + LD E,A + EX DE,HL + ; H=0 + LD C,H ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + EXX + POP DE + POP HL + POP AF + EX AF,AF' + ; A=0 ZF=0 CF=0 + LD B,0 + LD C,L + LD L,H + LD H,B + EX DE,HL + EXX + AND A + RET + ; +.NONE_FDD: POP BC + LD A,DSS_Error.drv.INVALID_DRIVE + ; CF=1 + RET +; ; ; + + +; HL:DE - SECTORS ON LOGICAL DISK +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - EXTENDED INFORMATION +; D0...D3 - "0" RESERVED (MAY BE OTHER) +; D4 - DEVICE MASTER/SLAVE +; D5 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D7 - "1" RESERVED +.SetParams: PUSH AF + EXX + EX DE,HL + LD H,L + LD L,C + POP AF + AND #0F + PUSH AF + PUSH HL + PUSH DE + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP DE + POP HL + JR C,.NONE_FDD + POP AF + LD C,BIOS.DRV_SET_PAR + JP ToBIOS + ;RST ToBIOS + ;RET C + ;AND A + ;RET +; ; ; + + +Removable: ; LD A,1 + ; AND A + XOR A + INC A + RET +; ; ; + +;============================================== + + ENDMODULE ; FDD_DRV + +//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm new file mode 100644 index 0000000..306d487 --- /dev/null +++ b/DSS/drivers/media/ide-drv.asm @@ -0,0 +1,715 @@ +;!TODO привести к общему виду в одну инструкцию, проверить корректность +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R02 06-08-2001 DNS Secondary IDE +;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk +;--------------------------------------------------------------- +; +; Disk Driver Specification ver. 2.20 +;[]===========================================================[0] +;Procedure: Initialization +; +;Function: Initialization device(s) +; +;Input: C = #00 +; IX = Environment +; +;Output: A = Amount drive support +;[]===========================================================[0] + +;[]===========================================================[1] +;Procedure: Open +; +;Function: Open disk +; +;Input: C = #01 +; A = Drive +; +;Output: None +;[]===========================================================[1] + +;[]===========================================================[2] +;Procedure: Close +; +;Function: Close disk +; +;Input: C = #02 +; A = Drive +; +;Output: None +;[]===========================================================[2] + +;[]===========================================================[3] +;Procedure: Media check +; +;Function: Checking change line +; +;Input: C = #03 +; A = Drive +; +;Output: A = #00 disk no changed +; #FF disk changed +;[]===========================================================[3] + +;[]===========================================================[4] +;Procedure: Get BPB +; +;Function: Get Block Parameters BIOS +; +;Input: C = #04 +; A = Drive +; DE = Address +; +;Output: None +;[]===========================================================[4] + +;[]===========================================================[5] +;Procedure: Read +; +;Function: Read from disk +; +;Input: C = #05 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A = Drive +; +;Output: None +;[]===========================================================[5] + +;[]===========================================================[6] +;Procedure: Write +; +;Function: Write to disk +; +;Input: C = #06 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; +;Output: None +;[]===========================================================[6] + +;[]===========================================================[7] +;Procedure: Removable +; +;Function: Checking change line +; +;Input: C = #07 +; A = Drive +; +;Output: A = #00 Removable +; A = #FF Non-removable +;[]===========================================================[7] + +;[]===========================================================[8] +;Procedure: Generic IOCTL +; +;Function: Generic Input Output Control +; +;Input: C = #08 +; B = Subcommand +; DE = #55AA Magic Number +; A = Drive +; +;Subcommands: #00 - Get Device Parameters +; #01 - Read track +; #02 - Test track +; #80 - Set Device Parameters +; #81 - Write track +; #82 - Format track +;Output: +;[]===========================================================[8] + +;[]===========================================================[9] +;Procedure: Read Long +; +;Function: Reading sectors from disk +; +;Input: C = #0A +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page +; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address +;[]===========================================================[9] + +;[]===========================================================[10] +;Procedure: Write Long +; +;Function: Writing sectors to disk +; +;Input: C = #0B +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page +; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address +;[]===========================================================[10] + +; +; Errors: +; 0 (#00) - NO ERRORS +; 1 (#01) - BAD COMMAND +; 2 (#02) - BAD DRIVE NUMBER +; 3 (#03) - UNKNOW FORMAT +; 4 (#04) - NOT READY +; 5 (#05) - SEEK ERROR +; 6 (#06) - SECTOR NOT FOUND +; 7 (#07) - CRC ERROR +; 8 (#08) - WRITE PROTECT +; 9 (#09) - READ ERROR +; 10 (#0A) - WRITE ERROR +; 11 (#0B) - FAILURE +; 12 (#0C) - BUSY (DEVICE OPENED) +; 13 (#0D) - RESERVED + +; IDE0 EQU #0C1C0 +; IDE1 EQU #0C1C8 +PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR + +HDDRIVE: INC C + DEC C + JP Z,INIT_H ; c=0 Initialization + DEC C + JP Z,RESE_H ; c=1 open + DEC C + JP Z,STAT_H ; c=2 close + DEC C + JP Z,CHEK_H ; c=3 media check (смена носителя) + DEC C + JP Z,GBPB_H ; c=4 get BPB + DEC C + JP Z,READH ; c=5 read (чтение секторов) + DEC C + JP Z,WRITEH ; c=6 write (запись секторов) + DEC C + JP Z,REMOV_H ; c=7 Removable + DEC C + JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL + DEC C + JP Z,.Reserved ; c=9 Reserved + DEC C + JP Z,LREADH ; c=10 Read Long + DEC C + JP Z,LWRITEH ; c=11 Write Long + ; +.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + + +//////////////////////////////////////////////////////////////////////// +// Commands for restart #18 // +//////////////////////////////////////////////////////////////////////// + +;--------------------------------------------------------------------[v] +; c=0 Initialization +INIT_H: PUSH IY + ;!TEST ;[ ] для rescanDRV + XOR A + LD (DRVCLC.count),A + ; + LD HL,LOGDRV + LD (OFFSECT),HL + + LD IX,SYS_PAGE.TMP_BUFFER + LD C,BIOS.DRV_LIST + RST ToBIOS + ; DRV_LIST: + ; +0 LEN + ; +1 FDD COUNT + ; +2 HDD COUNT + ; +3 CDROM COUNT + ; +4 RESERVED (28) + ; + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + XOR A + LD B,(IX+2) ;количество HDD для процедуры NX_DVCI + CP B + LD A,C + OUT (SLOT3),A + JR Z,NO_HARDS + LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT + +NX_DVCI: PUSH BC + LD A,C + LD (DRV_NUM),A + LD C,BIOS.DRV_DETECT + RST ToBIOS + ;JR C,.NO_DRIVE + CALL NC,DEFINE_PARTITIONS.BEGIN + POP BC + INC C + JR C,NX_DVCI + DJNZ NX_DVCI + ; +NO_HARDS: + POP IY + ;!TEST + ; LD HL,(OFFSECT) + ; LD DE,LOGDRV + ; XOR A + ; SBC HL,DE + ; RET Z + ; LD DE,LOGDRV.TBL_Entry +DRVCLC: ; INC A + ; SBC HL,DE + ; JR NZ,DRVCLC + ; +.count+1: LD A,0 + ; + AND A + RET +;---------------------------------------------------------------------[^] + +; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +; ;+01 DWORD SECTOR OFFSET +; ;+05 DWORD SIZE IN SECTORS +; ;+09 FREE +; ;+15 +; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 +; .TBL_Entry EQU 16 +; .Size EQU $-LOGDRV +SELHDD: PUSH DE + PUSH HL + ; + LD L,A + LOGDRV_ENTRY_FIND LOGDRV + ; !HARDCODE + LD E,(IY+1) + LD D,(IY+2) + ADD IX,DE + LD E,(IY+3) + LD D,(IY+4) + POP HL + ADC HL,DE + LD A,(IY+0) ;DRIVE NUMBER + POP DE + RET + +; 00 - GET DEVICE PARAMETERS +; 01 - READ TRACK +; 02 - TEST TRACK +; 80 - SET DEVICE PARAMETERS +; 81 - WRITE TRACK +; 82 - FORMAT TRACK +IOCTL_H BIT 7,B + JR NZ,O_CTL_H + INC B + DEC B + JP Z,HGETPRM + DEC B + JP Z,HRDTRAC + DEC B + JP Z,HCHTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +O_CTL_H RES 7,B + INC B + DEC B + JP Z,HSETPRM + DEC B + JP Z,HWRTRAC + DEC B + JP Z,HFRTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +HCHTRAC LD B,L + CALL CHECKH + RET + +HSETPRM AND A + RET + +HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - DRIVE/HEAD REGISTER PHISICAL DISK: +; bit7 - reserved "1" +; bit6 - ADDRESSING MODE LBA/CHS +; bit5 - reserved "1" +; bit4 - DEVICE MASTER/SLAVE +; bit3 - reserved "0" (MAY BE OTHER) +; bit2 - reserved "0" (MAY BE OTHER) +; bit1 - reserved "0" (MAY BE OTHER) +; bit0 - Primary/Secondary Chanel +HGETPRM: + EX DE,HL + LD BC,#55AA + AND A + SBC HL,BC + LD L,A + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET NZ + ; + PUSH IX + PUSH IY + ; + LOGDRV_ENTRY_FIND LOGDRV + ; + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + PUSH IY + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP IY + LD A,DSS_Error.drv.INVALID_DRIVE + JR C,.error + ; перетасовка регистров с результатом от BIOS + EX DE,HL + LD C,E + LD E,D + LD D,0 + LD A,B + LD B,D + EXX + ; SECTORS ON LOGICAL DISK + LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) + LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) + ; + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска + ; + EX AF,AF' + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + EX AF,AF' + ; + AND A +.error: POP IY + POP IX + RET + +REMOV_H: + LD A,1 + AND A + RET + + + +RESE_H: XOR A + RET + +STAT_H: XOR A + RET + +CHEK_H: ;LD A,#FF + XOR A + ;AND A + RET + + +; DE - ADDRESS +; A - DRIVE +GBPB_H: PUSH IY + PUSH DE + LD L,A + ; + LOGDRV_ENTRY_FIND LOGDRV + ; !HARDCODE + LD E,(IY+1) + LD D,(IY+2) + LD L,(IY+3) + LD H,(IY+4) + LD XL,E + LD XH,D + LD A,(IY+0) + POP DE + POP IY + LD BC,1*256 + BIOS.DRV_READ + JP ToBIOS + + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE +; A - HDD LOG NUMBER +;READ SECTOR +LREADH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_READ_LONG + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE +; A - HDD LOG NUMBER +;WRITE SECTOR +LWRITEH: + PUSH IY + CALL SELHDD + LD C,BIOS.DRV_WRITE_LONG + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;WRITE SECTOR +WRITEH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_WRITE + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;READ SECTOR +READH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_READ + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;CHECK SECTOR +CHECKH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_VERIFY + RST ToBIOS + POP IY + RET + +;------------------------------[ PARTIT ]------------------------------; +DEFINE_PARTITIONS: +.FAT32_DOS: ; +.EASYDOS: ; +.MEDIDOS: ; +.HIGHDOS: ; + LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) + LD IX,(CURRENT_SECTOR_L) + ADD IX,DE + LD DE,(CURRENT_SECTOR_H) + ADC HL,DE + LD D,XH + LD E,XL + ;BPB SECTOR + LD IX,(OFFSECT) + LD (IX + LOGDRV.SECTOR_OFFSET + 0),E + LD (IX + LOGDRV.SECTOR_OFFSET + 1),D + LD (IX + LOGDRV.SECTOR_OFFSET + 2),L + LD (IX + LOGDRV.SECTOR_OFFSET + 3),H + LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) + ;SIZE DISK + LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E + LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D + LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L + LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +.ExtendedPartitionFlag+1: + LD A,0 + OR A ; !TODO загрузка с расширенного раздела не поддерживается + LD A,#FF + JR NZ,.not_supported ; если расширенный раздел, то облом + ; + POP BC + PUSH BC + LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table + SUB B +.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A + ; + ;!TEST Подстраховка от переполнения таблицы LOGDRV + LD A,(DRVCLC.count) + INC A + CP DSS_MAX_DRIVES_AMOUNT+1 + RET NC + LD (DRVCLC.count),A + ; + LD A,(DRV_NUM) + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A + LD DE,LOGDRV.TBL_Entry ;DSKITEM + ADD IX,DE + LD (OFFSECT),IX + JP .NextPartition + ; +.NotExtended: CP PartitionSysTypes.FAT16 + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_LBA + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_32Mb + JR Z,.MEDIDOS + CP PartitionSysTypes.FAT12 + JR Z,.EASYDOS + ;[ ] fat32 + CP PartitionSysTypes.FAT32 + JP Z,.FAT32_DOS + CP PartitionSysTypes.FAT32_LBA + JP Z,.FAT32_DOS + ; + CP PartitionSysTypes.Win_Ext_LBA + JR Z,.SubLevel + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта + ;OR A ;PartitionSysTypes.Empty + ;JR NZ,NXTPART + JR .NextPartition ; раздел не поддерживается + ;POP BC ; баланс стека + ;RET + ;POP BC + ;OR A + ;RET Z + ;NODEFIN: + ;SCF + ;RET + ; +.BEGIN: IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A + CALL .Start + POP AF + OUT (SLOT3),A + RET +.Start: LD IX,0 + LD DE,0 + LD (EXTDOSL),DE ;R01 + LD (EXTDOSH),IX ;R01 + ; +.LOOP: LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + ; + LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) + LD DE,#AA55 + AND A + SBC HL,DE + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + ;JR NZ,NODEFIN + SCF + RET NZ + ; + LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR + LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table +.DOSAGA: PUSH BC + LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) + CP PartitionSysTypes.Extended + JR Z,.SubLevel + CP PartitionSysTypes.Win_Ext_LBA + JR NZ,.NotExtended + ; +.SubLevel: PUSH IY + LD DE,(CURRENT_SECTOR_L) + LD IX,(CURRENT_SECTOR_H) + PUSH DE + PUSH IX + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + INC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + CALL .ParseExtended + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + DEC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + POP IX + POP DE + LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + POP IY +.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry + ADD IY,DE + POP BC + DJNZ .DOSAGA + AND A + RET + ; +.ParseExtended: LD HL,(EXTDOSL) + LD DE,(EXTDOSH) + LD A,L + OR H + OR E + OR D + LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) + JP NZ,.ext_in_ext + LD (EXTDOSL),DE + LD (EXTDOSH),HL + PUSH DE + JR .set_regs + ; +.ext_in_ext: LD IX,(EXTDOSL) + ADD IX,DE + LD DE,(EXTDOSH) + ADC HL,DE + PUSH IX +.set_regs: PUSH HL + POP IX + POP DE + JP .LOOP + ; +.LOAD_SECTOR: PUSH IY + LD IX,(CURRENT_SECTOR_L) + LD HL,(CURRENT_SECTOR_H) + LD DE,PARTITION_BUFFER + LD A,(DRV_NUM) + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP IY + RET +;----------------------------------------------------------------------; +; + +;======================================================================= +; PHISICAL DRIVE NUMBER +; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв +DRV_NUM: DB #00 +CURRENT_SECTOR_L: DW #0000 +CURRENT_SECTOR_H: DW #0000 +EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE +EXTDOSH: DW #0000 +OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD +;======================================================================= \ No newline at end of file diff --git a/DSS/drivers/media/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm new file mode 100644 index 0000000..b9b5480 --- /dev/null +++ b/DSS/drivers/media/ram_disk-drv.asm @@ -0,0 +1,533 @@ + + +; SYSPAGE EQU #FE +; SLOT1 EQU #A2 +; SLOT2 EQU #C2 +; SLOT3 EQU #E2 + +; ORG #3CDB +; Disk Driver Specification ver. 2.20 +;[]===========================================================[ 0] +;Procedure : Initialization +; +;Function : Initialization device(s) +; +;Input : C = 00h +; IX - Environment +;Output : A = Amount drive support +; HL = Size driver +;[]===========================================================[ 0] + + +;[]===========================================================[ 1] +;Procedure : Open +; +;Function : Open disk +; +;Input : C = 01h +; A - Drive +;Output : None +; +;[]===========================================================[ 1] + + +;[]===========================================================[ 2] +;Procedure : Close +; +;Function : Close disk +; +;Input : C = 02h +; A - Drive +;Output : None +; +;[]===========================================================[ 2] + + +;[]===========================================================[ 3] +;!TODO +;Procedure : Media check +; +;Function : Checking change line +; +;Input : C = 03h +; A - Drive +;Output : A = 00h disk no changed +; A = 0FFh disk changed +; +;[]===========================================================[ 3] + + +;[]===========================================================[ 4] +;Procedure : Get BPB +; +;Function : Get Block Parameters BIOS +; +;Input : C = 04h +; DE - Address +;Output : None +; +;[]===========================================================[ 4] + + +;[]===========================================================[ 5] +;Procedure : Input +; +;Function : Input from disk +; +;Input : C = 05h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[ 5] + + +;[]===========================================================[ 6] +;Procedure : Output +; +;Function : Output to disk +; +;Input : C = 06h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[ 6] + + +;[]===========================================================[ 7] +;!TODO +;Procedure : Removable +; +;Function : Checking change line +; +;Input : C = 07h +; A - Drive +;Output : A = 00h Removable +; A = FFh Nonremovable +; +;[]===========================================================[ 7] + + +;[]===========================================================[ 8] +;Procedure : Generic IOCTL +; +;Function : Generic Input Output Control +; +;Input : C = 08h +; B - Subcommand +; DE = 55AAh Magic Number +; Subcommand +;---------------------- +; 00h - Get Device Parameters +; 01h - Read track +; 02h - Test track +; 80h - Set Device Parameters +; 81h - Write track +; 82h - Format track +;Output : +; +;[]===========================================================[ 8] + + +;[]===========================================================[ 9] +; RESERVED +;[]===========================================================[ 9] + + +;[]===========================================================[ 10] +;!TODO +;Procedure : Read Long +; +;Function : Reading sectors from disk +; +;Input : C = 0Ah +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[ 10] + + +;[]===========================================================[ 11] +;!TODO +;Procedure : Write Long +; +;Function : Writing sectors to disk +; +;Input : C = 0Bh +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[ 11] +; +; Errors: +; 0 (00h) - NO ERRORS +; 1 (01h) - BAD COMMAND +; 2 (02h) - BAD DRIVE NUMBER +; 3 (03h) - UNKNOW FORMAT +; 4 (04h) - NOT READY +; 5 (05h) - SEEK ERROR +; 6 (06h) - SECTOR NOT FOUND +; 7 (07h) - CRC ERROR +; 8 (08h) - WRITE PROTECT +; 9 (09h) - READ ERROR +; 10 (0Ah) - WRITE ERROR +; 11 (0Bh) - FAILURE +; 12 (0Ch) - BUSY (DEVICE OPENED) +; 13 (0Dh) - RESERVED + + +; MACRO CALL GET_RAMDRV_NUM +; LD BC,RAMDTBL +; SLA A +; ADD A,C +; LD C,A +; LD A,0 +; ADC A,B +; LD B,A +; INC BC +; LD A,(BC) +; OR #60 ;!HARDCODE сделать номера разных устройств через метки +; ENDM + + +; parser +RMDRIVE: INC C + DEC C + JP Z,INIT_RD ; 0 + DEC C + JR Z,RESET_RD ; 1 + DEC C + JR Z,STATUS_RD ; 2 + DEC C + JR Z,CHEK_RD ; 3 + DEC C + JR Z,GBPB_RD ; 4 + DEC C + JR Z,READ_RD ; 5 + DEC C + JR Z,WRITE_RD ; 6 + DEC C + JR Z,REMOV_RD ; 7 + DEC C + JP Z,IOCTL_RD ; 8 + DEC C + JP Z,.error ; 9 RESR_H + DEC C + JP Z,LREAD_RD ; 10 + DEC C + JP Z,LWRITE_RD ; 11 +.error: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +REMOV_RD: +RESET_RD: +STATUS_RD: XOR A + RET + +;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение + ;!FIXIT как-то определять смену RMD? + ; [x] 18/08/2024 пока немного костыльно и опасно +CHEK_RD: ;LD A,#FF + ;AND A + XOR A + ; + RET + +;DE - ADDRESS +GBPB_RD: LD IX,0 + LD HL,0 + LD B,#01 + ;JP READ_RD +;READ SECTORS +; HL:IX - SECTOR +; DE - ADDRESS +; B - COUNT +; A - DRIVE +READ_RD: PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_READ + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET +LREAD_RD: + PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_READ_LONG + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET + +;WRITE SECTORS +; HL:IX - SECTOR +; DE - ADDRESS +; B - COUNT +; A - DRIVE +WRITE_RD: + PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_WRITE + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET + +LWRITE_RD: + PUSH BC + CALL GET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_WRITE_LONG + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET + +; +;; +;;; +;----------------------------------------------------------------------;!TEST +; ;S_P_P DB #00 +; INIT_RD: +; ; .SectorSize EQU 512 ;!HARDCODE +; ; LD HL,.SectorSize +; ; LD A,#80 +; ; .loop: SRL A +; ; RR H +; ; JR NC,.loop +; ; LD (S_P_P),A + +; LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk +; LD DE,RAMDTBL +; .initLoop: +; PUSH BC +; LD A,B +; PUSH DE +; RST ToBIOS +; POP DE +; OR A +; JR Z,.noDRV + +; LD (DE),A +; INC DE +; POP BC +; LD A,B +; LD (DE),A +; INC DE +; JP 1F +; .noDRV: POP BC +; 1: INC B +; LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry +; CP B +; JR NZ,.initLoop + +; LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL +; EX DE,HL +; AND A ;!FIXIT ---- +; SBC HL,DE ;!FIXIT ADD HL,DE +; SRL L +; LD A,L +; ; LD HL,ENDDRVR +; AND A +; RET +;----------------------------------------------------------------------;!TEST +;;; +;; +; + +; +;; +;;; +;----------------------------------------------------------------------;!TEST +;S_P_P DB #00 +INIT_RD: +; .SectorSize EQU 512 ;!HARDCODE +; LD HL,.SectorSize +; LD A,#80 +; .loop: SRL A +; RR H +; JR NC,.loop +; LD (S_P_P),A + + LD BC,0*256+BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk + LD DE,RAMDTBL +.initLoop: PUSH BC + LD A,B + PUSH DE + RST ToBIOS + POP DE + OR A + JR Z,.noDRV + ; + INC DE + LD (DE),A + DEC DE + ; + POP BC + LD A,B + LD (DE),A + INC DE + INC DE + JP .skip_pop + ; +.noDRV: POP BC +.skip_pop: INC B + LD A,RAMDTBL.Size/RAMDTBL.TBL_Entry + CP B + JR NZ,.initLoop + + LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL + EX DE,HL + AND A ;!FIXIT ---- + SBC HL,DE ;!FIXIT ADD HL,DE + SRL L + LD A,L + ; LD HL,ENDDRVR + AND A + RET +;----------------------------------------------------------------------;!TEST +;;; +;; +; + +; ; +; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER +; RAMDTBL.TBL_Entry EQU 2 +; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry +; DB #FF +; EDUP +; .Size EQU $-RAMDTBL +; ; + + +; 00 - GET DEVICE PARAMETERS +; 01 - READ TRACK +; 02 - TEST TRACK +; 80 - SET DEVICE PARAMETERS +; 81 - WRITE TRACK +; 82 - FORMAT TRACK +IOCTL_RD: + BIT 7,B + JR NZ,.O_CTL_F + INC B + DEC B + JP Z,.RGETPRM + ;DEC B + ;JP Z,FRDTRAC + ;DEC B + ;JP Z,FCHTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +.O_CTL_F: ;RES 7,B + ;INC B + ;DEC B + ;JP Z,.RSETPRM + ;DEC B + ;JP Z,FWRTRAC + ;DEC B + ;JP Z,FFRTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +; HL:DE - SECTORS ON LOGICAL DISK +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - EXTENDED INFORMATION +; D0...D3 - "0" RESERVED (MAY BE OTHER) +; D4 - DEVICE MASTER/SLAVE +; D5 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D7 - "1" RESERVED +.RGETPRM: EX DE,HL + LD BC,#55AA + AND A + SBC HL,BC + LD L,A + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET NZ + ; + EX AF,AF' + LD A,L + CALL GET_RAMDRV_NUM + PUSH AF + PUSH AF + EX AF,AF' + + POP AF + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + + PUSH HL ;число головок, число секторов (на целиндр) + PUSH DE ;количество цилиндров + EXX + POP HL ;количество цилиндров + POP BC ;число секторов (на целиндр) + LD D,0 + LD E,B ;число головок + LD B,D + EXX + + LD A,L + + RRA + JR C,.end +.loopShift: SLA E + RL D + RRA + JR NC,.loopShift + ; +.end: EX AF,AF' + POP AF + EX AF,AF' + XOR A + LD L,A + LD H,L + LD C,A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,%10100000 + RET + +; !TODO +; !FIXIT +; .RSETPRM: AND A +; RET + +GET_RAMDRV_NUM: LD BC,RAMDTBL +.skip_tbl: ADD A,A + ADD A,C + LD C,A + LD A,0 + ADC A,B + LD B,A + ;INC BC + LD A,(BC) + OR #60 ;!HARDCODE сделать номера разных устройств через метки + RET +; +;ENDDRVR EQU $ +; \ No newline at end of file diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm new file mode 100644 index 0000000..97f01cc --- /dev/null +++ b/DSS/drivers/media/shared-drv.asm @@ -0,0 +1,290 @@ +;[BEGIN] +;//MODULE: Shared AUTHOR: Denis Parinov +;//CREATE: A LONG TIME AGO :) +;--------------------------------------------------------------- +;Rev Date Name Description +;R01 17-04-2023 BAO Добавлена процедура INITDVC_RET_DRIVE и изменена INTDISK для поддержки рескана драйвов +;--------------------------------------------------------------- + + + +; DISK DRIVER SPECIFICATION +; !FIXIT некорректная! +;--------------------------------------------- +; COMMAND 00h (INITIALIZATION) +; +; INPUT: A - DRIVE LETTER +; IX - ENVIRONMENT +; RETURN: A - AMOUNT DRIVE SUPPORT +; HL - LENGTH DRIVER +;--------------------------------------------- +; COMMAND 01h (OPEN) +; +; INPUT: A - DRIVE +; +;--------------------------------------------- +; COMMAND 02h (CLOSE) +; +; INPUT: A - DRIVE +; RETURN: A - +;--------------------------------------------- +; COMMAND 03h (MEDIA CHECK) +; +; INPUT: A - DRIVE +; RETURN: A - 00h - OLD DISK, 0FFh - NEW DISK +;--------------------------------------------- +; COMMAND 04h (GET BPB) +; +; INPUT: HL - ADDRESS +; A - DRIVE +;--------------------------------------------- +; COMMAND 05h (INPUT) +; +; INPUT: IX:DE - ABSOLUTE SECTOR +; HL - MEMORY ADDRESS +; B - SECTORS COUNT +; A - DRIVE +;--------------------------------------------- +; COMMAND 06h (OUTPUT) +; +; INPUT: IX:DE - ABSOLUTE SECTOR +; HL - MEMORY ADDRESS +; B - SECTORS COUNT +; A - DRIVE +;--------------------------------------------- +; COMMAND 07h (REMOVABLE) +; +; INPUT: A - DRIVE +; RETURN: A = 0 - REMOVABLE +; A = 1 - NONREMOVABLE +;--------------------------------------------- +; COMMAND 08h (GENERIC IOCTL) +; +; INPUT: A - DRIVE +; B - SUBCOMMAND +; DE - MAGIC NUMBER (55AAh) +; SUBCOMMAND +;---------------------- +; 00 - GET DEVICE PARAMETERS +; 01 - READ TRACK +; 02 - TEST TRACK +; 80 - SET DEVICE PARAMETERS +; 81 - WRITE TRACK +; 82 - FORMAT TRACK +;--------------------------------------------- +; +; ERRORS: +; 0 - NO ERRORS +; 1 - BAD COMMAND +; 2 - BAD DRIVE NUMBER +; 3 - UNKNOW FORMAT +; 4 - NOT READY +; 5 - SEEK ERROR +; 6 - SECTOR NOT FOUND +; 7 - CRC ERROR +; 8 - WRITE PROTECT +; 9 - READ ERROR +; 10 - WRITE ERROR +; 11 - FAILURE +; 12 - BUSY (DEVICE OPENED) +; 13 - RESERVED + +;INTDISK PUSH HL +; PUSH BC +; LD HL,DEVICE +; INC A +;INTD001 DEC A +; JP Z,YEP +; LD C,(HL) +; INC C +; INC HL +; INC HL +; INC HL +; JP NZ,INTD001 +; POP BC +; POP HL +; LD A,2 +; SCF +; RET + +;YEP LD A,(HL) +; INC HL +; LD C,(HL) +; INC HL +; LD H,(HL) +; LD L,C +; POP BC +; EX (SP),HL +; RET + + +;----------------------------------------------------------- +; Просканировать систему на FDD/HDD девайсы и RAM-диски +;----------------------------------------------------------- +INITDVC: XOR A + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку + LD HL,DEVICE + LD (PDEVICE),HL ; восст. ячейку + ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] + LD HL,DEVICE + LD (HL),#FF + LD DE,DEVICE+1 + LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 + LDIR + ; FDD девайсы + CALL FDD_DRV.Init ; узнать число FDD-девайсов + LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы +.if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET + LD DE,HDDRIVE + CALL MAKEDVC + ; RAM-диски + CALL INIT_RD + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET + +; Инициировать таблицу переходов девайса. +; вход: de=адрес обработчика девайса +; a=число девайсов (0=нет) +MAKEDVC: LD C,A + LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска + ADD A,(HL) + LD (HL),A + ;!TEST ;[ ] оптимизировать было лень + CP DSS_MAX_DRIVES_AMOUNT+1 + JR C,1F + LD (HL),DSS_MAX_DRIVES_AMOUNT + SUB DSS_MAX_DRIVES_AMOUNT + NEG + ADD C + JP 2F + ; +1: LD A,C + OR A + RET Z ; нет девайсов +2: LD C,0 ; сбр. + LD HL,(PDEVICE) ; тек. полож. в таблице +.loop: LD (HL),C ; номер лог.драйва этого устройства + INC HL + LD (HL),E ; de=адрес обработчика + INC HL + LD (HL),D + INC HL + INC C ; ++номер драйва + DEC A + JR NZ,.loop + LD (PDEVICE),HL + DEC A + LD (HL),A + RET + + +;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые +;------------------------------------------------- +; RST 18h. Вектор дисковых устройств +; вход: a=номер устройства (0-25) +;------------------------------------------------- +INTDISK: + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + ;JR Z,INITDVC_RET_DRIVE + JR Z,ReScanDRV +.noNeedRescan: + ; + PUSH HL + PUSH BC + _CALC_DEVICE_ENTRY DEVICE + LD A,(HL) + CP #FF + JR Z,NODEV + INC HL + LD C,(HL) + INC HL + LD H,(HL) + LD L,C + POP BC + EX (SP),HL + RET +NODEV: POP BC + POP HL + LD A,DSS_Error.drv.INVALID_DRIVE + SCF + RET + +PDEVICE DW DEVICE +; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +; .Size: DB #FF +; .TBL_Entry EQU 3 + +FLOPPY EQU #0001 +FIXED EQU #0002 +CDROM EQU #0004 +NETWORK EQU #0008 + +;DISKS: DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"A:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #00 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"B:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #01 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FIXED ;DISK TYPE +; DB 2,"C:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT16 " +; DB #80 ;PHISICAL DRIVE NUMBER +; +; DB #00 ;END OF TABLE +;----------------------------------------------------------------------- + + ;R01 +; INITDVC_RET_DRIVE: +; CALL INITDVC +; LD A,(DRV_PAGE.LDRIVE) +; AND A +; RET + ; + + + +//////////////////////////////////////////////////////////////////////// +// NEW RESCAN // +//////////////////////////////////////////////////////////////////////// + INCLUDE 'ReScanDRV.ASM' +//////////////////////////////////////////////////////////////////////// + + +;DEVICE DB #00 +; DW FDDRIVE ; FDD A +; DB #01 +; DW FDDRIVE ; FDD B +; DB #00 +; DW HDDRIVE ; HDD C +; DB #01 +; DW HDDRIVE ; HDD D +; DB #02 +; DW HDDRIVE ; HDD E +; DB #03 +; DW HDDRIVE ; HDD F +; DB #04 +; DW HDDRIVE ; HDD G +; DB #05 +; DW HDDRIVE ; HDD H +; DB #06 +; DW HDDRIVE ; HDD I +; DB #07 +; DW HDDRIVE ; HDD J +; DB #FF \ No newline at end of file From 46b0cabbab9126a7e4211cf290abfe37bf1648bf Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 26 Dec 2024 03:34:57 +1000 Subject: [PATCH 180/219] fix for atapi --- DSS/DRV-MAIN.ASM | 3 +- DSS/FS/CDFS.ASM | 15 +- DSS/FS/FAT.asm | 3 +- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- DSS/drivers/media/ATAPI/Cd_dos.asm | 2 +- DSS/drivers/media/atapi-drv.asm | 729 +++++++++++++++++++++++++++++ DSS/drivers/media/ide-drv.asm | 6 +- Shared_Includes | 2 +- 9 files changed, 752 insertions(+), 12 deletions(-) create mode 100644 DSS/drivers/media/atapi-drv.asm diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 9a1091a..c271642 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -233,7 +233,8 @@ INITDVC_RET_DRIVE: RET INCLUDE 'dss/Drivers/media/shared-drv.asm' - INCLUDE 'dss/Drivers/media/ide-drv.asm' + INCLUDE 'dss/Drivers/media/atapi-drv.asm' + ;INCLUDE 'dss/Drivers/media/ide-drv.asm' INCLUDE 'dss/Drivers/media/fdd-drv.asm' INCLUDE 'dss/Drivers/media/ram_disk-drv.asm' INCLUDE "dss/Drivers/input/MOUSE.ASM" diff --git a/DSS/FS/CDFS.ASM b/DSS/FS/CDFS.ASM index f8dda64..9a75097 100644 --- a/DSS/FS/CDFS.ASM +++ b/DSS/FS/CDFS.ASM @@ -1,3 +1,12 @@ -; -; -; \ No newline at end of file +; INITDISK - инициализация буквы диска +; LOADDIR - загрузка с CDFS директории и адаптация под FAT +; +/* +Сделать проверку на фат: +CHECK_ROOT_CLUSTER + + +NEW RST: +LOADDIR + +*/ \ No newline at end of file diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 5f10e2d..5b0f282 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -416,7 +416,8 @@ FINDDIR: POP AF OUT (SLOT3),A AND A - RET + RET + ; .CHECK_SLASH: XOR A CPIR diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 593f5be..52827e7 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -105,7 +105,7 @@ .BytesPerSector: WORD #0000 .SectorsPerCluster: BYTE #00 .FSINFO_Sector: WORD #01 -.BPB_SERIAL_NUMBER: DWORD #00000000 +.BPB_SERIAL_NUMBER: DWORD 0 .BPB_LABEL: BLOCK 11,' ' ; 11 для FAT, 31 для CDFS .UPD_FSINFO: BYTE 0 .FREE_CLUSTERS_COUNT_L: WORD #FFFF diff --git a/DSS/build.txt b/DSS/build.txt index f03187e..cf5106d 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -998 \ No newline at end of file +999 \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/Cd_dos.asm b/DSS/drivers/media/ATAPI/Cd_dos.asm index 3dd5bc0..2a16b23 100644 --- a/DSS/drivers/media/ATAPI/Cd_dos.asm +++ b/DSS/drivers/media/ATAPI/Cd_dos.asm @@ -170,7 +170,7 @@ INITDISK LD A,DIRPAGE CALL BANK PUSH AF - LD B,4 + LD B,4 ; попыток на чтение CD_I_LP PUSH BC LD DE,DIR LD A,(CDDRIVE) diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/atapi-drv.asm new file mode 100644 index 0000000..a43af79 --- /dev/null +++ b/DSS/drivers/media/atapi-drv.asm @@ -0,0 +1,729 @@ +;!TODO привести к общему виду в одну инструкцию, проверить корректность +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R02 06-08-2001 DNS Secondary IDE +;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk +;--------------------------------------------------------------- +; +; Disk Driver Specification ver. 2.20 +;[]===========================================================[0] +;Procedure: Initialization +; +;Function: Initialization device(s) +; +;Input: C = #00 +; IX = Environment +; +;Output: A = Amount drive support +;[]===========================================================[0] + +;[]===========================================================[1] +;Procedure: Open +; +;Function: Open disk +; +;Input: C = #01 +; A = Drive +; +;Output: None +;[]===========================================================[1] + +;[]===========================================================[2] +;Procedure: Close +; +;Function: Close disk +; +;Input: C = #02 +; A = Drive +; +;Output: None +;[]===========================================================[2] + +;[]===========================================================[3] +;Procedure: Media check +; +;Function: Checking change line +; +;Input: C = #03 +; A = Drive +; +;Output: A = #00 disk no changed +; #FF disk changed +;[]===========================================================[3] + +;[]===========================================================[4] +;Procedure: Get BPB +; +;Function: Get Block Parameters BIOS +; +;Input: C = #04 +; A = Drive +; DE = Address +; +;Output: None +;[]===========================================================[4] + +;[]===========================================================[5] +;Procedure: Read +; +;Function: Read from disk +; +;Input: C = #05 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A = Drive +; +;Output: None +;[]===========================================================[5] + +;[]===========================================================[6] +;Procedure: Write +; +;Function: Write to disk +; +;Input: C = #06 +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; +;Output: None +;[]===========================================================[6] + +;[]===========================================================[7] +;Procedure: Removable +; +;Function: Checking change line +; +;Input: C = #07 +; A = Drive +; +;Output: A = #00 Removable +; A = #FF Non-removable +;[]===========================================================[7] + +;[]===========================================================[8] +;Procedure: Generic IOCTL +; +;Function: Generic Input Output Control +; +;Input: C = #08 +; B = Subcommand +; DE = #55AA Magic Number +; A = Drive +; +;Subcommands: #00 - Get Device Parameters +; #01 - Read track +; #02 - Test track +; #80 - Set Device Parameters +; #81 - Write track +; #82 - Format track +;Output: +;[]===========================================================[8] + +;[]===========================================================[9] +;Procedure: Read Long +; +;Function: Reading sectors from disk +; +;Input: C = #0A +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page +; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address +;[]===========================================================[9] + +;[]===========================================================[10] +;Procedure: Write Long +; +;Function: Writing sectors to disk +; +;Input: C = #0B +; HL:IX = Logical Block (sector) +; DE = Address +; B = Sector count +; A' = Page +; +;Output: A' = Next Page +; HL:IX = Next Logical Block (sector) +; DE = Next Address +;[]===========================================================[10] + +; +; Errors: +; 0 (#00) - NO ERRORS +; 1 (#01) - BAD COMMAND +; 2 (#02) - BAD DRIVE NUMBER +; 3 (#03) - UNKNOW FORMAT +; 4 (#04) - NOT READY +; 5 (#05) - SEEK ERROR +; 6 (#06) - SECTOR NOT FOUND +; 7 (#07) - CRC ERROR +; 8 (#08) - WRITE PROTECT +; 9 (#09) - READ ERROR +; 10 (#0A) - WRITE ERROR +; 11 (#0B) - FAILURE +; 12 (#0C) - BUSY (DEVICE OPENED) +; 13 (#0D) - RESERVED + +; IDE0 EQU #0C1C0 +; IDE1 EQU #0C1C8 + +; MODULE ATAPI_DRV + +PARTITION_BUFFER _sBOOT_SECTOR = #C000 +ATAPI_BUFFER _sCDFS_PRIMARY_VOLUME_DESCRIPTOR = #C000 + +HDDRIVE: INC C + DEC C + JP Z,INIT_H ; [ ] ; c=0 Initialization + DEC C + JP Z,RESE_H ; [ ] ; c=1 open + DEC C + JP Z,STAT_H ; [ ] ; c=2 close + DEC C + JP Z,CHEK_H ; [ ] ; c=3 media check (смена носителя) + DEC C + JP Z,GBPB_H ; [ ] ; c=4 get BPB + DEC C + JP Z,READH ; [ ] ; c=5 read (чтение секторов) + DEC C + JP Z,WRITEH ; [ ] ; c=6 write (запись секторов) + DEC C + JP Z,REMOV_H ; [ ] ; c=7 Removable + DEC C + JP Z,IOCTL_H ; [ ] ; c=8 узнать геометрию диска Generic IOCTL + DEC C + JP Z,.Reserved ; [ ] ; c=9 Reserved + DEC C + JP Z,LREADH ; [ ] ; c=10 Read Long + DEC C + JP Z,LWRITEH ; [ ] ; c=11 Write Long + ; +.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + + +//////////////////////////////////////////////////////////////////////// +// Commands for restart #18 // +//////////////////////////////////////////////////////////////////////// + +;--------------------------------------------------------------------[v] +; c=0 Initialization +INIT_H: PUSH IY + ;!TEST ;[ ] для rescanDRV + XOR A + LD (.count),A + ; + LD HL,LOGDRV + LD (OFFSECT),HL + + LD IX,SYS_PAGE.TMP_BUFFER + LD C,BIOS.DRV_LIST + RST ToBIOS + ; DRV_LIST: + ; +0 LEN + ; +1 FDD COUNT + ; +2 ATA COUNT + ; +3 ATAPI COUNT + ; +4 RESERVED (14) + ; + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(IX+3) ;количество ATAPI для процедуры NX_DVCI + AND A + PUSH AF + XOR A + LD B,(IX+2) ;количество ATA для процедуры NX_DVCI + CP B + LD A,C + OUT (SLOT3),A + JR Z,.NO_HARDS + LD C,#80 ;!HARDCODE - ID ATA для процедуры BIOS.DRV_DETECT + CALL .NX_DVCI + ; + +.NO_HARDS: POP AF + JR Z,.skip_atapi + ; + LD B,A + LD C,#C0 ;!HARDCODE - ID ATAPI для процедуры BIOS.DRV_DETECT + CALL .NX_DVCI + ; +.skip_atapi: POP IY +.count+1: LD A,0 + ; + AND A + RET + ; +.NX_DVCI: PUSH BC + LD A,C + LD (DRV_NUM),A + LD C,BIOS.DRV_DETECT + RST ToBIOS + CALL NC,DEFINE_PARTITIONS.BEGIN + POP BC + INC C + JR C,.NX_DVCI + DJNZ .NX_DVCI + RET +;---------------------------------------------------------------------[^] + +; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +; ;+01 DWORD SECTOR OFFSET +; ;+05 DWORD SIZE IN SECTORS +; ;+09 FREE +; ;+15 +; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 +; .TBL_Entry EQU 16 +; .Size EQU $-LOGDRV +SELHDD: PUSH DE + PUSH HL + ; + LD L,A + LOGDRV_ENTRY_FIND LOGDRV + ; !HARDCODE + LD E,(IY+1) + LD D,(IY+2) + ADD IX,DE + LD E,(IY+3) + LD D,(IY+4) + POP HL + ADC HL,DE + LD A,(IY+0) ;DRIVE NUMBER + POP DE + RET + +; 00 - GET DEVICE PARAMETERS +; 01 - READ TRACK +; 02 - TEST TRACK +; 80 - SET DEVICE PARAMETERS +; 81 - WRITE TRACK +; 82 - FORMAT TRACK +IOCTL_H BIT 7,B + JR NZ,O_CTL_H + INC B + DEC B + JP Z,HGETPRM + DEC B + JP Z,HRDTRAC + DEC B + JP Z,HCHTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +O_CTL_H RES 7,B + INC B + DEC B + JP Z,HSETPRM + DEC B + JP Z,HWRTRAC + DEC B + JP Z,HFRTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +HCHTRAC LD B,L + CALL CHECKH + RET + +HSETPRM AND A + RET + +HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - DRIVE/HEAD REGISTER PHISICAL DISK: +; bit7 - reserved "1" +; bit6 - ADDRESSING MODE LBA/CHS +; bit5 - reserved "1" +; bit4 - DEVICE MASTER/SLAVE +; bit3 - reserved "0" (MAY BE OTHER) +; bit2 - reserved "0" (MAY BE OTHER) +; bit1 - reserved "0" (MAY BE OTHER) +; bit0 - Primary/Secondary Chanel +HGETPRM: + EX DE,HL + LD BC,#55AA + AND A + SBC HL,BC + LD L,A + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET NZ + ; + PUSH IX + PUSH IY + ; + LOGDRV_ENTRY_FIND LOGDRV + ; + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + PUSH IY + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP IY + LD A,DSS_Error.drv.INVALID_DRIVE + JR C,.error + ; перетасовка регистров с результатом от BIOS + EX DE,HL + LD C,E + LD E,D + LD D,0 + LD A,B + LD B,D + EXX + ; SECTORS ON LOGICAL DISK + LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) + LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) + ; + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска + ; + EX AF,AF' + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + EX AF,AF' + ; + AND A +.error: POP IY + POP IX + RET + +REMOV_H: + LD A,1 + AND A + RET + + + +RESE_H: XOR A + RET + +STAT_H: XOR A + RET + +CHEK_H: ;LD A,#FF + XOR A + ;AND A + RET + + +; DE - ADDRESS +; A - DRIVE +GBPB_H: PUSH IY + PUSH DE + LD L,A + ; + LOGDRV_ENTRY_FIND LOGDRV + ; !HARDCODE + LD E,(IY+1) + LD D,(IY+2) + LD L,(IY+3) + LD H,(IY+4) + LD XL,E + LD XH,D + LD A,(IY+0) + POP DE + POP IY + LD BC,1*256 + BIOS.DRV_READ + JP ToBIOS + + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE +; A - HDD LOG NUMBER +;READ SECTOR +LREADH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_READ_LONG + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE +; A - HDD LOG NUMBER +;WRITE SECTOR +LWRITEH: + PUSH IY + CALL SELHDD + LD C,BIOS.DRV_WRITE_LONG + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;WRITE SECTOR +WRITEH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_WRITE + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;READ SECTOR +READH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_READ + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;CHECK SECTOR +CHECKH: PUSH IY + CALL SELHDD + LD C,BIOS.DRV_VERIFY + RST ToBIOS + POP IY + RET + +;------------------------------[ PARTIT ]------------------------------; +DEFINE_PARTITIONS: +.FAT32_DOS: ; +.EASYDOS: ; +.MEDIDOS: ; +.HIGHDOS: ; + LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) + LD IX,(CURRENT_SECTOR_L) + ADD IX,DE + LD DE,(CURRENT_SECTOR_H) + ADC HL,DE + LD D,XH + LD E,XL + ;BPB SECTOR + LD IX,(OFFSECT) + LD (IX + LOGDRV.SECTOR_OFFSET + 0),E + LD (IX + LOGDRV.SECTOR_OFFSET + 1),D + LD (IX + LOGDRV.SECTOR_OFFSET + 2),L + LD (IX + LOGDRV.SECTOR_OFFSET + 3),H + LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) + ;SIZE DISK + LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E + LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D + LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L + LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +.ExtendedPartitionFlag+1: + LD A,0 + OR A ; !TODO загрузка с расширенного раздела не поддерживается + LD A,#FF + JR NZ,.not_supported ; если расширенный раздел, то облом + ; + POP BC + PUSH BC + LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table + SUB B +.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A + ; + CALL INC_DRV_COUNT + RET NC + ; + LD A,(DRV_NUM) + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A + LD DE,LOGDRV.TBL_Entry ;DSKITEM + ADD IX,DE + LD (OFFSECT),IX + JP .NextPartition + ; +.NotExtended: CP PartitionSysTypes.FAT16 + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_LBA + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_32Mb + JR Z,.MEDIDOS + CP PartitionSysTypes.FAT12 + JR Z,.EASYDOS + ;[ ] fat32 + CP PartitionSysTypes.FAT32 + JP Z,.FAT32_DOS + CP PartitionSysTypes.FAT32_LBA + JP Z,.FAT32_DOS + ; + CP PartitionSysTypes.Win_Ext_LBA + JR Z,.SubLevel + JR .NextPartition ; раздел не поддерживается + +.ATAPI_TST: ;!FIXIT CDFS + SCF + RET + +.BEGIN: ;CP IDE.Device.HDD + ;RET NZ + IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A + CALL .Start + POP AF + OUT (SLOT3),A + RET +.Start: LD IX,0 + LD DE,0 + LD (EXTDOSL),DE ;R01 + LD (EXTDOSH),IX ;R01 + ; +.LOOP: LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + RET C + ; + LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) + LD DE,#AA55 + AND A + SBC HL,DE + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + ;JR NZ,NODEFIN + + ; [ ] CDFS + JR NZ,.ATAPI_TST + ;SCF + ;RET NZ + ; + ; [ ] если ATAPI, то пробуем прочесть 0 сектор как-будто нет MBR + ;LD A,(DRV_NUM) + ;CP DRIVE_CODES.SPRINTER.CDROM + + ; + LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR + LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table +.DOSAGA: PUSH BC + LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) + CP PartitionSysTypes.Extended + JR Z,.SubLevel + CP PartitionSysTypes.Win_Ext_LBA + JR NZ,.NotExtended + ; +.SubLevel: PUSH IY + LD DE,(CURRENT_SECTOR_L) + LD IX,(CURRENT_SECTOR_H) + PUSH DE + PUSH IX + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + INC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + CALL .ParseExtended + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + DEC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + POP IX + POP DE + LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + POP IY +.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry + ADD IY,DE + POP BC + DJNZ .DOSAGA + AND A + RET + ; +.ParseExtended: LD HL,(EXTDOSL) + LD DE,(EXTDOSH) + LD A,L + OR H + OR E + OR D + LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) + JP NZ,.ext_in_ext + LD (EXTDOSL),DE + LD (EXTDOSH),HL + PUSH DE + JR .set_regs + ; +.ext_in_ext: LD IX,(EXTDOSL) + ADD IX,DE + LD DE,(EXTDOSH) + ADC HL,DE + PUSH IX +.set_regs: PUSH HL + POP IX + POP DE + JP .LOOP + ; +.LOAD_SECTOR: PUSH IY + LD IX,(CURRENT_SECTOR_L) + LD HL,(CURRENT_SECTOR_H) + LD DE,PARTITION_BUFFER + LD A,(DRV_NUM) + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP IY + RET +;----------------------------------------------------------------------; +; + +;!TEST Подстраховка от переполнения таблицы LOGDRV +INC_DRV_COUNT: LD A,(INIT_H.count) + INC A + CP DSS_MAX_DRIVES_AMOUNT+1 + RET NC + LD (INIT_H.count),A + RET + +;======================================================================= +; PHISICAL DRIVE NUMBER +; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв +DRV_NUM: DB #00 +CURRENT_SECTOR_L: DW #0000 +CURRENT_SECTOR_H: DW #0000 +EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE +EXTDOSH: DW #0000 +OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD +;======================================================================= + +; ENDMODULE \ No newline at end of file diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm index 306d487..2856e7b 100644 --- a/DSS/drivers/media/ide-drv.asm +++ b/DSS/drivers/media/ide-drv.asm @@ -173,7 +173,7 @@ ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 -PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR +PARTITION_BUFFER _sBOOT_SECTOR = #C000 HDDRIVE: INC C DEC C @@ -226,8 +226,8 @@ INIT_H: PUSH IY ; DRV_LIST: ; +0 LEN ; +1 FDD COUNT - ; +2 HDD COUNT - ; +3 CDROM COUNT + ; +2 ATA COUNT + ; +3 ATAPI COUNT ; +4 RESERVED (28) ; IN A,(SLOT3) diff --git a/Shared_Includes b/Shared_Includes index 710aa4b..ab51192 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 710aa4b5dd4b651bcb01ef5e86150b99dfe739ee +Subproject commit ab51192affb0fbcb8cc9df8e463044e33613c35a From 883bbf0aeb543ab14c7aa6cde4332c39102f5ecd Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 27 Dec 2024 00:49:35 +1000 Subject: [PATCH 181/219] =?UTF-8?q?ATAPI=20=D1=83=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20=D0=B2=D1=81=D0=B5=D0=B3=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B1=D1=83=D0=BA=D0=B2=D1=83,=20=D0=B4=D0=B0=D0=B6=D0=B5=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=B7=20=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/drivers/media/atapi-drv.asm | 50 ++++++++++++++++++++++++++------- Shared_Includes | 2 +- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/atapi-drv.asm index a43af79..3d03c86 100644 --- a/DSS/drivers/media/atapi-drv.asm +++ b/DSS/drivers/media/atapi-drv.asm @@ -247,7 +247,7 @@ INIT_H: PUSH IY LD A,C OUT (SLOT3),A JR Z,.NO_HARDS - LD C,#80 ;!HARDCODE - ID ATA для процедуры BIOS.DRV_DETECT + LD C,DRIVE_CODES.SPRINTER.ATA CALL .NX_DVCI ; @@ -255,7 +255,7 @@ INIT_H: PUSH IY JR Z,.skip_atapi ; LD B,A - LD C,#C0 ;!HARDCODE - ID ATAPI для процедуры BIOS.DRV_DETECT + LD C,DRIVE_CODES.SPRINTER.ATAPI CALL .NX_DVCI ; .skip_atapi: POP IY @@ -588,11 +588,38 @@ DEFINE_PARTITIONS: ; CP PartitionSysTypes.Win_Ext_LBA JR Z,.SubLevel - JR .NextPartition ; раздел не поддерживается - -.ATAPI_TST: ;!FIXIT CDFS + JP .NextPartition ; раздел не поддерживается + ; + +.ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS + ;SCF + ;RET +.check_atapi: LD A,(DRV_NUM) + AND #F0 + CP DRIVE_CODES.SPRINTER.ATAPI SCF - RET + RET NZ + ; + ; No Media + XOR A + ;BPB SECTOR + LD IX,(OFFSECT) + LD (IX + LOGDRV.SECTOR_OFFSET + 0),A + LD (IX + LOGDRV.SECTOR_OFFSET + 1),A + LD (IX + LOGDRV.SECTOR_OFFSET + 2),A + LD (IX + LOGDRV.SECTOR_OFFSET + 3),A + ;SIZE DISK + LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),A + LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),A + LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),A + LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),A + ; для правильного выхода из парсера разделов + LD B,1 + PUSH BC + ;загрузка с активного раздела, а не с первого + DEC A + JR .not_supported + ; .BEGIN: ;CP IDE.Device.HDD ;RET NZ @@ -603,7 +630,10 @@ DEFINE_PARTITIONS: CALL .Start POP AF OUT (SLOT3),A - RET + RET + ; + + ; .Start: LD IX,0 LD DE,0 LD (EXTDOSL),DE ;R01 @@ -612,9 +642,9 @@ DEFINE_PARTITIONS: .LOOP: LD (CURRENT_SECTOR_L),DE LD (CURRENT_SECTOR_H),IX CALL .LOAD_SECTOR - RET C + JR C,.check_atapi ; - LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) +.check_sign: LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) LD DE,#AA55 AND A SBC HL,DE @@ -638,7 +668,7 @@ DEFINE_PARTITIONS: CP PartitionSysTypes.Extended JR Z,.SubLevel CP PartitionSysTypes.Win_Ext_LBA - JR NZ,.NotExtended + JP NZ,.NotExtended ; .SubLevel: PUSH IY LD DE,(CURRENT_SECTOR_L) diff --git a/Shared_Includes b/Shared_Includes index ab51192..6f28f9f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit ab51192affb0fbcb8cc9df8e463044e33613c35a +Subproject commit 6f28f9f83e4737733b76053891bd9be121aed186 From 22f9ae494c2fa55a40e4e529a1754e8be4e7d2a5 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 4 Jan 2025 23:24:37 +1000 Subject: [PATCH 182/219] ... --- DSS/API/MkDir.asm | 4 +- DSS/API/Read.asm | 2 +- DSS/API/Write.asm | 2 +- DSS/DRV-MAIN.ASM | 10 ++- DSS/FS/FAT.asm | 18 +---- DSS/VERSION.INC | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 3 +- DSS/drivers/media/atapi-drv.asm | 113 +++++++++++++++++++++++++------ DSS/drivers/media/fdd-drv.asm | 8 +-- DSS/drivers/media/ide-drv.asm | 33 +++++++-- DSS/drivers/media/shared-drv.asm | 65 +++++++++--------- SHELL/Commands/INFO.ASM | 10 +-- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 15 files changed, 183 insertions(+), 93 deletions(-) diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index d4a04e1..703b016 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -163,7 +163,7 @@ MKDIR: LD E,L INC DE LD (HL),0 - LD BC,512-65 ;!HARDCODE sector size + LD BC,512-65 ;!HARDCODE ;!FIXIT ; [ ] sector size LDIR ; POP HL ; старший номер сектора @@ -197,7 +197,7 @@ MKDIR: JR Z,.skip_clean ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 - LD BC,511 ;!HARDCODE sector size + LD BC,511 ;!HARDCODE ;!FIXIT ; [ ] sector size LD (HL),0 LDIR .skip_clean: ; diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index de82ab2..f3b537b 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -110,7 +110,7 @@ READ: LD (.R_POINT),HL ; EXX POP DE - LD HL,512 ;!HARDCODE sector size! + LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size AND A SBC HL,DE LD B,H diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index ec87280..93df482 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -152,7 +152,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] EXX POP DE JP C,.ERR1 - LD HL,512 ;!HARDCODE sector size! + LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size AND A SBC HL,DE LD B,H diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index c271642..08e4811 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -254,8 +254,9 @@ DEVICE EQU $ ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 BYTE PARTITION RECORD NUMBER (in drive MBR) -;+09 FREE -;+15 +;+10 WORD Sector Size +;+12 FREE +; LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU 16 .Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry @@ -264,6 +265,11 @@ LOGDRV EQU DEVICE + DEVICE.End .SECTOR_OFFSET EQU 1 .SIZE_IN_SECTORS EQU 5 .PARTITION_RECORD_NUM EQU 9 +.SECTOR_SIZE EQU 10 ; word +.RemovableMedia EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved +.Reserved_1 EQU 13 +.Reserved_1 EQU 14 +.Reserved_1 EQU 15 ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи ; ПОРТИТ: HL, IY. HL<-->DE diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 5b0f282..e74d536 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -1599,7 +1599,7 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: JR Z,.set_region ; .loop: SLA H - AND A + ;AND A SUB L JR NZ,.loop ; @@ -1676,20 +1676,16 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; INC HL ; номер кластера LD (HL),D .exit: ; - IF FAST_FAT_CASHE ; [ ] ускорение работы с кэшем FAT CALL SET_FAT32_CACHE_BLOCK_CHANGED_REGION ; - ENDIF POP AF ; восст. порт POP HL OUT (SLOT3),A - IFN FAST_FAT_CASHE ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,#FF - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;LD A,#FF + ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; - ENDIF ; CF = 0 RET ; @@ -1862,7 +1858,6 @@ WRITE_FAT_TABLE: LD B,E ; MAX число секторов для чтения в кэш LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) LD (.sub_A),A - ;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) AND A LD A,C @@ -1970,17 +1965,14 @@ WRITE_FAT_TABLE: LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) - IF FAST_FAT_CASHE CP #FF JR NZ,.SAVE_NOT_ALL_BLOCK - ENDIF ; LD DE,FATPAGE.cache ; откуда LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV ; - IF FAST_FAT_CASHE .SAVE_NOT_ALL_BLOCK: ; A = CORE_BUFFERS.FatBuffer.CacheUpdated ; HL:IX - смещение внутри раздела на начало нужного блока FAT @@ -2042,9 +2034,6 @@ WRITE_FAT_TABLE: POP DE POP AF RET - ; DJNZ .region_loop - ; RET - ENDIF ;----------------------------------------------------------------------- ; ;[x] fat32 ;!TEST @@ -2390,7 +2379,6 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX ; .ECL1: AND A RET - ;----------------------------------------------------------------------- ; [x] fat32 diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC index 984fa6c..eaffa57 100644 --- a/DSS/VERSION.INC +++ b/DSS/VERSION.INC @@ -31,7 +31,7 @@ ; номер версии (0..9) VERS EQU 1 ; номер модификации (0..99) -MODF EQU 70 +MODF EQU 71 ; номер билда (0..999) BUILD EQU lua_BUILD ; diff --git a/DSS/build.txt b/DSS/build.txt index cf5106d..c227083 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -999 \ No newline at end of file +0 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f53305f..95a0251 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -28,7 +28,6 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 - DEFINE FAST_FAT_CASHE 1 SERVICE_SECTORS: .FAT12 EQU #0FEF @@ -94,6 +93,8 @@ FAT_CACHE: ;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ; + DEFINE DSS_MAX_SECTOR_SIZE 512 + DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE MAX_RAMDRIVES 16 DEFINE NeedSafePort_Y 1 diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/atapi-drv.asm index 3d03c86..c4ca9b1 100644 --- a/DSS/drivers/media/atapi-drv.asm +++ b/DSS/drivers/media/atapi-drv.asm @@ -289,16 +289,26 @@ SELHDD: PUSH DE PUSH HL ; LD L,A + ; LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) + ; + ; [ ] custorm sector size + CALL CHECK_IDE_SECTOR_SIZE + RLA + ; + ; + LD E,(IY+LOGDRV.SECTOR_OFFSET) + LD D,(IY+LOGDRV.SECTOR_OFFSET+1) ADD IX,DE - LD E,(IY+3) - LD D,(IY+4) + LD E,(IY+LOGDRV.SECTOR_OFFSET+2) + LD D,(IY+LOGDRV.SECTOR_OFFSET+3) POP HL ADC HL,DE - LD A,(IY+0) ;DRIVE NUMBER + ; [ ] custom sector size + ;JR C,.exit + RRA + ; +.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) POP DE RET @@ -367,6 +377,16 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE ; bit2 - reserved "0" (MAY BE OTHER) ; bit1 - reserved "0" (MAY BE OTHER) ; bit0 - Primary/Secondary Chanel +; B - ;[ ] sector size ;!TODO +; 00 - undefined +; 01 - 128 bytes +; 02 - 256 bytes +; 04 - 512 bytes +; 08 - 1024 bytes +; 16 - 2048 bytes +; 32 - 4096 bytes +; 64 - 8192 bytes +; 128 - 16384 bytes HGETPRM: EX DE,HL LD BC,#55AA @@ -397,6 +417,13 @@ HGETPRM: LD A,B LD B,D EXX + ;[ ] 04/01/2025 возвращение размера сектора + EX AF,AF' + LD A,XH + LD E,XL + RL E + RLA + ; ; SECTORS ON LOGICAL DISK LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) @@ -406,7 +433,19 @@ HGETPRM: ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; - EX AF,AF' + ;[ ] 04/01/2025 возвращение размера сектора + ; 00 - undefined + ; 01 - 128 bytes + ; 02 - 256 bytes + ; 04 - 512 bytes + ; 08 - 1024 bytes + ; 16 - 2048 bytes + ; 32 - 4096 bytes + ; 64 - 8192 bytes + ; 128 - 16384 bytes + ;EX AF,AF' + LD B,A + ; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; @@ -434,6 +473,16 @@ CHEK_H: ;LD A,#FF RET +; [ ] custorm sector size +CHECK_IDE_SECTOR_SIZE: + LD E,(IY+LOGDRV.SECTOR_SIZE) + LD D,(IY+LOGDRV.SECTOR_SIZE+1) + LD HL,DSS_MAX_SECTOR_SIZE + AND A + SBC HL,DE + RET +; + ; DE - ADDRESS ; A - DRIVE GBPB_H: PUSH IY @@ -441,20 +490,27 @@ GBPB_H: PUSH IY LD L,A ; LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - LD L,(IY+3) - LD H,(IY+4) + ; + ; [ ] custorm sector size + CALL CHECK_IDE_SECTOR_SIZE + JR C,.error + ; + LD E,(IY+LOGDRV.SECTOR_OFFSET) + LD D,(IY+LOGDRV.SECTOR_OFFSET+1) + LD L,(IY+LOGDRV.SECTOR_OFFSET+2) + LD H,(IY+LOGDRV.SECTOR_OFFSET+3) LD XL,E LD XH,D - LD A,(IY+0) + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) POP DE POP IY LD BC,1*256 + BIOS.DRV_READ JP ToBIOS - - + ; +.error: POP DE + POP IY + LD A,DSS_Error.drv.UNKNOWN_FORMAT + RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER @@ -463,9 +519,10 @@ GBPB_H: PUSH IY ;READ SECTOR LREADH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_READ_LONG RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -477,9 +534,10 @@ LREADH: PUSH IY LWRITEH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_WRITE_LONG RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -489,9 +547,10 @@ LWRITEH: ;WRITE SECTOR WRITEH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_WRITE RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -501,9 +560,10 @@ WRITEH: PUSH IY ;READ SECTOR READH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_READ RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -595,12 +655,23 @@ DEFINE_PARTITIONS: ;SCF ;RET .check_atapi: LD A,(DRV_NUM) + LD B,A AND #F0 CP DRIVE_CODES.SPRINTER.ATAPI SCF RET NZ ; ; No Media + ;!TODO sector size + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + JR NC,.no_err + ; + LD IX,#FFFF +.no_err: LD D,XH + LD E,XL + ; XOR A ;BPB SECTOR LD IX,(OFFSECT) @@ -613,6 +684,10 @@ DEFINE_PARTITIONS: LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),A + ; [ ] sector size + LD (IX + LOGDRV.SECTOR_SIZE),E + LD (IX + LOGDRV.SECTOR_SIZE + 1),D + ; ; для правильного выхода из парсера разделов LD B,1 PUSH BC diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index 11c3129..e1d65f6 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -293,11 +293,11 @@ GenIOCTL: BIT 7,B ; BC' - SECTORS PER TRACK ON PHISICAL DISK ; A' - PHISICAL DRIVE NUMBER ; A - EXTENDED INFORMATION -; D1..D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D5 - "1" RESERVED +; D4 - DEVICE MASTER/SLAVE +; D1..D3 - "0" RESERVED (MAY BE OTHER) .GetParams: EX DE,HL LD BC,#55AA AND #0F diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm index 2856e7b..025caae 100644 --- a/DSS/drivers/media/ide-drv.asm +++ b/DSS/drivers/media/ide-drv.asm @@ -393,6 +393,13 @@ HGETPRM: LD A,B LD B,D EXX + ;[ ] 04/01/2025 возвращение размера сектора + EX AF,AF' + LD A,XH + LD E,XL + RL E + RLA + ; ; SECTORS ON LOGICAL DISK LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) @@ -402,7 +409,19 @@ HGETPRM: ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; - EX AF,AF' + ;[ ] 04/01/2025 возвращение размера сектора + ; 00 - undefined + ; 01 - 128 bytes + ; 02 - 256 bytes + ; 04 - 512 bytes + ; 08 - 1024 bytes + ; 16 - 2048 bytes + ; 32 - 4096 bytes + ; 64 - 8192 bytes + ; 128 - 16384 bytes + ;EX AF,AF' + LD B,A + ; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; @@ -437,14 +456,14 @@ GBPB_H: PUSH IY LD L,A ; LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - LD L,(IY+3) - LD H,(IY+4) + ; + LD E,(IY+LOGDRV.SECTOR_OFFSET) + LD D,(IY+LOGDRV.SECTOR_OFFSET+1) + LD L,(IY+LOGDRV.SECTOR_OFFSET+2) + LD H,(IY+LOGDRV.SECTOR_OFFSET+3) LD XL,E LD XH,D - LD A,(IY+0) + LD A,(IY+LOGDRV.SECTOR_OFFSET.PHISICAL_DRV_NUMBER) POP DE POP IY LD BC,1*256 + BIOS.DRV_READ diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm index 97f01cc..7e9fa1e 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/shared-drv.asm @@ -149,37 +149,37 @@ INITDVC: XOR A ; Инициировать таблицу переходов девайса. ; вход: de=адрес обработчика девайса ; a=число девайсов (0=нет) -MAKEDVC: LD C,A - LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска - ADD A,(HL) - LD (HL),A - ;!TEST ;[ ] оптимизировать было лень - CP DSS_MAX_DRIVES_AMOUNT+1 - JR C,1F - LD (HL),DSS_MAX_DRIVES_AMOUNT - SUB DSS_MAX_DRIVES_AMOUNT - NEG - ADD C - JP 2F - ; -1: LD A,C - OR A - RET Z ; нет девайсов -2: LD C,0 ; сбр. - LD HL,(PDEVICE) ; тек. полож. в таблице -.loop: LD (HL),C ; номер лог.драйва этого устройства - INC HL - LD (HL),E ; de=адрес обработчика - INC HL - LD (HL),D - INC HL - INC C ; ++номер драйва - DEC A - JR NZ,.loop - LD (PDEVICE),HL - DEC A - LD (HL),A - RET +MAKEDVC: LD C,A + LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска + ADD A,(HL) + LD (HL),A + ;!TEST ;[ ] оптимизировать было лень + CP DSS_MAX_DRIVES_AMOUNT+1 + JR C,1F + LD (HL),DSS_MAX_DRIVES_AMOUNT + SUB DSS_MAX_DRIVES_AMOUNT + NEG + ADD C + JP 2F + ; +1: LD A,C + OR A + RET Z ; нет девайсов +2: LD C,0 ; сбр. + LD HL,(PDEVICE) ; тек. полож. в таблице +.loop: LD (HL),C ; номер лог.драйва этого устройства + INC HL + LD (HL),E ; de=адрес обработчика + INC HL + LD (HL),D + INC HL + INC C ; ++номер драйва + DEC A + JR NZ,.loop + LD (PDEVICE),HL + DEC A + LD (HL),A + RET ;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые @@ -192,10 +192,9 @@ INTDISK: CP #FF JR NZ,.noNeedRescan CP C - ;JR Z,INITDVC_RET_DRIVE JR Z,ReScanDRV -.noNeedRescan: ; +.noNeedRescan: PUSH HL PUSH BC _CALC_DEVICE_ENTRY DEVICE diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index cb29be6..501b2b5 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -87,7 +87,7 @@ cmd_info: CALL Get_Path POP BC PUSH BC LD A,C - CP "C" + CP "C" - "A" JR C,.ItIsFDD LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams @@ -98,18 +98,20 @@ cmd_info: CALL Get_Path LD DE,Buffers.bat_params.PRM5 ; Drive size CALL ncopy_string JR .print_info_2 - ; HL:DE * 512 = A:HL:H'L' + ; HL:DE * 512 = A:H'L':HL ;!HARDCODE sector size .calc_size: RL E RL D RL L RL H - LD C,E LD A,H + EX AF,AF + LD A,E LD H,L LD L,D EXX - LD H,C + LD H,A LD L,0 + EX AF,AF JR .convert_hex ; .Collect_Msg: DZ " A: \r" ; патчится буква драйва в цикле diff --git a/SHELL/build.txt b/SHELL/build.txt index 3fa694f..cb856a4 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -437 \ No newline at end of file +444 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 6f28f9f..7ef1dd9 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6f28f9f83e4737733b76053891bd9be121aed186 +Subproject commit 7ef1dd98b491068d5a9ded34f5ff51430b7fa7e7 From d4911f7c45876707ca9e03d4ae35fcc0b13986b2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:27:59 +1000 Subject: [PATCH 183/219] not working --- DSS/DRV-MAIN.ASM | 4 +- DSS/drivers/media/ReScanDRV.ASM | 4 +- DSS/drivers/media/atapi-drv.asm | 518 +++++++++++++++++-------------- DSS/drivers/media/shared-drv.asm | 48 +-- Shared_Includes | 2 +- 5 files changed, 314 insertions(+), 262 deletions(-) diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 08e4811..4ae29fb 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -268,8 +268,8 @@ LOGDRV EQU DEVICE + DEVICE.End .SECTOR_SIZE EQU 10 ; word .RemovableMedia EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Reserved_1 EQU 13 -.Reserved_1 EQU 14 -.Reserved_1 EQU 15 +.Reserved_2 EQU 14 +.Reserved_3 EQU 15 ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи ; ПОРТИТ: HL, IY. HL<-->DE diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM index 29d977b..f88ebdd 100644 --- a/DSS/drivers/media/ReScanDRV.ASM +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -49,7 +49,7 @@ ReScanDRV: SBC HL,DE JR Z,.nextN ; пропуск FDD драйвов ; HDD? - LD HL,HDDRIVE + LD HL,IDE_DRV.API_TABLE AND A SBC HL,DE ; HDD! Сверка по таблице LOGDRV @@ -185,7 +185,7 @@ Fill_if_Exists: LD A,LOGDRV.TBL_Entry LD IY,LOGDRV CALL .RUN - LD DE,HDDRIVE + LD DE,IDE_DRV.API_TABLE RET NC ; переходим на другую таблицу - RAMDTBL LD A,(.tbl) diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/atapi-drv.asm index c4ca9b1..7831101 100644 --- a/DSS/drivers/media/atapi-drv.asm +++ b/DSS/drivers/media/atapi-drv.asm @@ -174,36 +174,38 @@ ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 -; MODULE ATAPI_DRV + MODULE IDE_DRV + + PARTITION_BUFFER _sBOOT_SECTOR = #C000 ATAPI_BUFFER _sCDFS_PRIMARY_VOLUME_DESCRIPTOR = #C000 -HDDRIVE: INC C +API_TABLE: INC C DEC C - JP Z,INIT_H ; [ ] ; c=0 Initialization + JP Z,Init ; [ ] ; c=0 Initialization DEC C - JP Z,RESE_H ; [ ] ; c=1 open + JP Z,Open ; [ ] ; c=1 open DEC C - JP Z,STAT_H ; [ ] ; c=2 close + JP Z,Close ; [ ] ; c=2 close DEC C - JP Z,CHEK_H ; [ ] ; c=3 media check (смена носителя) + JP Z,MediaCheck ; [ ] ; c=3 media check (смена носителя) DEC C - JP Z,GBPB_H ; [ ] ; c=4 get BPB + JP Z,GetBPB ; [ ] ; c=4 get BPB DEC C - JP Z,READH ; [ ] ; c=5 read (чтение секторов) + JP Z,Read ; [ ] ; c=5 read (чтение секторов) DEC C - JP Z,WRITEH ; [ ] ; c=6 write (запись секторов) + JP Z,Write ; [ ] ; c=6 write (запись секторов) DEC C - JP Z,REMOV_H ; [ ] ; c=7 Removable + JP Z,Removable ; [ ] ; c=7 Removable DEC C - JP Z,IOCTL_H ; [ ] ; c=8 узнать геометрию диска Generic IOCTL + JP Z,GenIOCTL ; [ ] ; c=8 узнать геометрию диска Generic IOCTL DEC C JP Z,.Reserved ; [ ] ; c=9 Reserved DEC C - JP Z,LREADH ; [ ] ; c=10 Read Long + JP Z,ReadLong ; [ ] ; c=10 Read Long DEC C - JP Z,LWRITEH ; [ ] ; c=11 Write Long + JP Z,WriteLong ; [ ] ; c=11 Write Long ; .Reserved: LD A,DSS_Error.drv.INVALID_COMMAND SCF @@ -216,7 +218,7 @@ HDDRIVE: INC C ;--------------------------------------------------------------------[v] ; c=0 Initialization -INIT_H: PUSH IY +Init: PUSH IY ;!TEST ;[ ] для rescanDRV XOR A LD (.count),A @@ -285,32 +287,34 @@ INIT_H: PUSH IY ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV -SELHDD: PUSH DE - PUSH HL - ; - LD L,A - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - ; [ ] custorm sector size - CALL CHECK_IDE_SECTOR_SIZE - RLA - ; - ; - LD E,(IY+LOGDRV.SECTOR_OFFSET) - LD D,(IY+LOGDRV.SECTOR_OFFSET+1) - ADD IX,DE - LD E,(IY+LOGDRV.SECTOR_OFFSET+2) - LD D,(IY+LOGDRV.SECTOR_OFFSET+3) - POP HL - ADC HL,DE - ; [ ] custom sector size - ;JR C,.exit - RRA - ; -.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) - POP DE - RET +SelectDrive: PUSH DE + PUSH HL + ; + LD L,A + ; + LOGDRV_ENTRY_FIND LOGDRV + ; + ; [ ] custorm sector size + CALL CHECK_IDE_SECTOR_SIZE + RLA + ; + ; + LD E,(IY+LOGDRV.SECTOR_OFFSET) + LD D,(IY+LOGDRV.SECTOR_OFFSET+1) + ADD IX,DE + LD E,(IY+LOGDRV.SECTOR_OFFSET+2) + LD D,(IY+LOGDRV.SECTOR_OFFSET+3) + POP HL + ADC HL,DE + ; [ ] custom sector size + ;JR C,.exit + RRA + ; +.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) + POP DE + RET NC + LD A,DSS_Error.drv.UNKNOWN_FORMAT + RET ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK @@ -318,49 +322,54 @@ SELHDD: PUSH DE ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK -IOCTL_H BIT 7,B - JR NZ,O_CTL_H - INC B - DEC B - JP Z,HGETPRM - DEC B - JP Z,HRDTRAC - DEC B - JP Z,HCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET +GenIOCTL: BIT 7,B + JR NZ,.Set + INC B + DEC B + JR Z,GetParams + DEC B + JR Z,.error ;ReadTrack + DEC B + JR Z,TestTRK + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + ; +.Set: RES 7,B + INC B + DEC B + RET Z ;SetParams + DEC B + JR Z,.error ;WriteTrack + DEC B + JR Z,.error + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + ; +.error: LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET -O_CTL_H RES 7,B - INC B - DEC B - JP Z,HSETPRM - DEC B - JP Z,HWRTRAC - DEC B - JP Z,HFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;CHECK SECTOR +TestTRK: LD C,BIOS.DRV_VERIFY + JP Exec_BIOS + ;LD B,L + ;CALL CHECKH + ;RET -HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET -HCHTRAC LD B,L - CALL CHECKH - RET +; HSETPRM: AND A +; RET -HSETPRM AND A - RET -HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET +; HFRTRAC: LD A,DSS_Error.drv.GENERAL_FAILURE +; SCF +; RET ; HL:DE - SECTORS ON LOGICAL DISK ; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого @@ -387,143 +396,173 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE ; 32 - 4096 bytes ; 64 - 8192 bytes ; 128 - 16384 bytes -HGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - ; - PUSH IX - PUSH IY - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - PUSH IY - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP IY - LD A,DSS_Error.drv.INVALID_DRIVE - JR C,.error - ; перетасовка регистров с результатом от BIOS - EX DE,HL - LD C,E - LD E,D - LD D,0 - LD A,B - LD B,D - EXX - ;[ ] 04/01/2025 возвращение размера сектора - EX AF,AF' - LD A,XH - LD E,XL - RL E - RLA - ; - ; SECTORS ON LOGICAL DISK - LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) - LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) - LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) - LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) - ; - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска - ; - ;[ ] 04/01/2025 возвращение размера сектора - ; 00 - undefined - ; 01 - 128 bytes - ; 02 - 256 bytes - ; 04 - 512 bytes - ; 08 - 1024 bytes - ; 16 - 2048 bytes - ; 32 - 4096 bytes - ; 64 - 8192 bytes - ; 128 - 16384 bytes - ;EX AF,AF' - LD B,A - ; - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - EX AF,AF' - ; - AND A -.error: POP IY - POP IX - RET - -REMOV_H: - LD A,1 - AND A - RET +GetParams: EX DE,HL + LD BC,#55AA + AND A + SBC HL,BC + LD L,A + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET NZ + ; + PUSH IX + PUSH IY + ; + LOGDRV_ENTRY_FIND LOGDRV + ; + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + PUSH IY + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP IY + LD A,DSS_Error.drv.INVALID_DRIVE + JR C,.error + ; перетасовка регистров с результатом от BIOS + EX DE,HL + LD C,E + LD E,D + LD D,0 + LD A,B + LD B,D + EXX + ;[ ] 04/01/2025 возвращение размера сектора + EX AF,AF' + LD A,XH + LD E,XL + RL E + RLA + ; + ; SECTORS ON LOGICAL DISK + LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) + LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) + ; + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска + ; + ;[ ] 04/01/2025 возвращение размера сектора + ; 00 - undefined + ; 01 - 128 bytes + ; 02 - 256 bytes + ; 04 - 512 bytes + ; 08 - 1024 bytes + ; 16 - 2048 bytes + ; 32 - 4096 bytes + ; 64 - 8192 bytes + ; 128 - 16384 bytes + ;EX AF,AF' + LD B,A + ; + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + EX AF,AF' + ; + AND A +.error: POP IY + POP IX + RET -RESE_H: XOR A - RET +Removable: XOR A + INC A + RET -STAT_H: XOR A - RET +Open: XOR A + RET -CHEK_H: ;LD A,#FF - XOR A - ;AND A - RET +Close: XOR A + RET + + ;[ ] media changed - bios 5x DETECT +; выход A=#FF - changed, A=0 - not changed, ZF=1 - not changed +MediaCheck: PUSH IY + CALL SelectDrive + JR C,.exit + ; + LD A,#FF + BIT 1,(IY + LOGDRV.RemovableMedia) + JR NZ,.exit + ; + LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) + LD C,BIOS.DRV_DETECT + RST ToBIOS + AND %0000'0010 + JR Z,.norm_exit + ; + ld + ; реинит драйва + ; +.norm_exit: XOR A +.exit: POP IY + RET ; [ ] custorm sector size CHECK_IDE_SECTOR_SIZE: - LD E,(IY+LOGDRV.SECTOR_SIZE) - LD D,(IY+LOGDRV.SECTOR_SIZE+1) - LD HL,DSS_MAX_SECTOR_SIZE - AND A - SBC HL,DE - RET + LD E,(IY+LOGDRV.SECTOR_SIZE) + LD D,(IY+LOGDRV.SECTOR_SIZE+1) + LD HL,DSS_MAX_SECTOR_SIZE + AND A + SBC HL,DE + RET ; + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;READ SECTOR + ; DE - ADDRESS ; A - DRIVE -GBPB_H: PUSH IY - PUSH DE - LD L,A - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - ; [ ] custorm sector size - CALL CHECK_IDE_SECTOR_SIZE - JR C,.error - ; - LD E,(IY+LOGDRV.SECTOR_OFFSET) - LD D,(IY+LOGDRV.SECTOR_OFFSET+1) - LD L,(IY+LOGDRV.SECTOR_OFFSET+2) - LD H,(IY+LOGDRV.SECTOR_OFFSET+3) - LD XL,E - LD XH,D - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) - POP DE - POP IY - LD BC,1*256 + BIOS.DRV_READ - JP ToBIOS - ; -.error: POP DE - POP IY - LD A,DSS_Error.drv.UNKNOWN_FORMAT - RET +GetBPB: ; !FIXIT выбирать значения исходя из типа драйва или ещё чего-нибудь + LD HL,0 + LD IX,0 + JR Read + +; PUSH IY +; PUSH DE +; LD L,A +; ; +; LOGDRV_ENTRY_FIND LOGDRV +; ; +; ; [ ] custorm sector size +; CALL CHECK_IDE_SECTOR_SIZE +; JR C,.error +; ; +; LD E,(IY+LOGDRV.SECTOR_OFFSET) +; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) +; LD L,(IY+LOGDRV.SECTOR_OFFSET+2) +; LD H,(IY+LOGDRV.SECTOR_OFFSET+3) +; LD XL,E +; LD XH,D +; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) +; POP DE +; POP IY +; LD BC,1*256 + BIOS.DRV_READ +; JP ToBIOS +; ; +; .error: POP DE +; POP IY +; LD A,DSS_Error.drv.UNKNOWN_FORMAT +; RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A'- PAGE ; A - HDD LOG NUMBER ;READ SECTOR -LREADH: PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_READ_LONG - RST ToBIOS -.error: POP IY - RET +ReadLong: LD C,BIOS.DRV_READ_LONG + JP Exec_BIOS +; PUSH IY +; CALL SelectDrive +; JR C,.error ; [ ] custorm sector size +; LD C,BIOS.DRV_READ_LONG +; RST ToBIOS +; .error: POP IY +; RET ;HL:IX - SECTOR ; DE - ADDRESS @@ -531,53 +570,66 @@ LREADH: PUSH IY ; A'- PAGE ; A - HDD LOG NUMBER ;WRITE SECTOR -LWRITEH: - PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_WRITE_LONG - RST ToBIOS -.error: POP IY - RET +WriteLong: LD C,BIOS.DRV_WRITE_LONG + JP Exec_BIOS +; PUSH IY +; CALL SelectDrive +; JR C,.error ; [ ] custorm sector size +; LD C,BIOS.DRV_WRITE_LONG +; RST ToBIOS +; .error: POP IY +; RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A - HDD LOG NUMBER ;WRITE SECTOR -WRITEH: PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_WRITE - RST ToBIOS -.error: POP IY - RET +Write: LD C,BIOS.DRV_WRITE + JP Exec_BIOS +; PUSH IY +; CALL SelectDrive +; JR C,.error ; [ ] custorm sector size +; LD C,BIOS.DRV_WRITE +; RST ToBIOS +; .error: POP IY +; RET -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;READ SECTOR -READH: PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_READ - RST ToBIOS -.error: POP IY - RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A - HDD LOG NUMBER ;CHECK SECTOR -CHECKH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_VERIFY - RST ToBIOS - POP IY - RET +; CHECKH: PUSH IY +; CALL SelectDrive +; LD C,BIOS.DRV_VERIFY +; RST ToBIOS +; POP IY +; RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;READ SECTOR +Read: LD C,BIOS.DRV_READ + ; +Exec_BIOS: PUSH IY + CALL .exec + POP IY + RET + +.exec: CALL SelectDrive + RET C + RST ToBIOS + RET NC + CP BIOS.Error.ATAPI.UnitAttention + SCF + RET NZ + SET 1,(IY + LOGDRV.RemovableMedia) + RET ;------------------------------[ PARTIT ]------------------------------; DEFINE_PARTITIONS: .FAT32_DOS: ; @@ -647,7 +699,7 @@ DEFINE_PARTITIONS: JP Z,.FAT32_DOS ; CP PartitionSysTypes.Win_Ext_LBA - JR Z,.SubLevel + JP Z,.SubLevel JP .NextPartition ; раздел не поддерживается ; @@ -813,11 +865,11 @@ DEFINE_PARTITIONS: ; ;!TEST Подстраховка от переполнения таблицы LOGDRV -INC_DRV_COUNT: LD A,(INIT_H.count) +INC_DRV_COUNT: LD A,(Init.count) INC A CP DSS_MAX_DRIVES_AMOUNT+1 RET NC - LD (INIT_H.count),A + LD (Init.count),A RET ;======================================================================= @@ -831,4 +883,4 @@ EXTDOSH: DW #0000 OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD ;======================================================================= -; ENDMODULE \ No newline at end of file + ENDMODULE \ No newline at end of file diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm index 7e9fa1e..5b4d88e 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/shared-drv.asm @@ -121,30 +121,30 @@ ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски ;----------------------------------------------------------- -INITDVC: XOR A - LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку - LD HL,DEVICE - LD (PDEVICE),HL ; восст. ячейку - ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] - LD HL,DEVICE - LD (HL),#FF - LD DE,DEVICE+1 - LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 - LDIR - ; FDD девайсы - CALL FDD_DRV.Init ; узнать число FDD-девайсов - LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы -.if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET - LD DE,HDDRIVE - CALL MAKEDVC - ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE - CALL MAKEDVC - XOR A - RET +INITDVC: XOR A + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку + LD HL,DEVICE + LD (PDEVICE),HL ; восст. ячейку + ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] + LD HL,DEVICE + LD (HL),#FF + LD DE,DEVICE+1 + LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 + LDIR + ; FDD девайсы + CALL FDD_DRV.Init ; узнать число FDD-девайсов + LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы +.if_old: CALL IDE_DRV.Init ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET + LD DE,IDE_DRV.API_TABLE + CALL MAKEDVC + ; RAM-диски + CALL INIT_RD + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET ; Инициировать таблицу переходов девайса. ; вход: de=адрес обработчика девайса diff --git a/Shared_Includes b/Shared_Includes index 7ef1dd9..857938d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7ef1dd98b491068d5a9ded34f5ff51430b7fa7e7 +Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa From a35f7e81f21ef6aefa8cda6805b09b4b6297db7b Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 17 Jan 2025 23:17:05 +1000 Subject: [PATCH 184/219] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B2=20=D0=B4?= =?UTF-8?q?=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=20ATAPI=20=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=B0=D1=82?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F=20=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 85 +- DSS/API/diskINF.asm | 10 +- DSS/DOS_Proc.asm | 20 +- DSS/DRV-MAIN.ASM | 16 +- DSS/FS/FAT.asm | 11 +- DSS/build.txt | 2 +- DSS/defines.inc | 1 - .../media/{shared-drv.asm => Shared.asm} | 2 +- .../{atapi-drv.asm => ata_atapi-drv.asm} | 323 ++++---- DSS/drivers/media/ide-drv.asm | 734 ------------------ SHELL/Commands/INFO.ASM | 68 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 13 files changed, 305 insertions(+), 971 deletions(-) rename DSS/drivers/media/{shared-drv.asm => Shared.asm} (95%) rename DSS/drivers/media/{atapi-drv.asm => ata_atapi-drv.asm} (81%) delete mode 100644 DSS/drivers/media/ide-drv.asm diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 54c0231..eff0e54 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -200,7 +200,6 @@ CONTINUE: LD HL,0 LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов JP NC,INC_SECTOR_NUM - ;CALL R_F_FAT ; next cluster in chain CALL READ_FROM_FAT ; next cluster in chain EX DE,HL EXX @@ -222,7 +221,6 @@ RUN_CORE: DI OUT (C),A ; ;DOS LOADED - ;IF UNIVERSAL_BOOT ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,(DRIVE+1) ; номер раздела LD L,A @@ -243,27 +241,6 @@ RUN_CORE: DI RST ToDSS ; LD BC,Dss.BootDSK.Get - ;ELSE - ; IF ORIGINAL_DSS - ; LD C,Dss.Version - ; RST ToDSS - ; ELSE - ; LD A,(DRIVE) - ; LD C,Dss.Version - ; RST ToDSS - ; JP C,FAIL.NULL - ; LD C,Dss.BootDSK - ; ENDIF ; - ; LD HL,MESSAGES.STARTDO - ; CALL MESSAGE - ; IF ORIGINAL_DSS - ; LD A,(DRIVE) - ; LD BC,Dss.BootDSK.Set - ; RST ToDSS - ; LD BС,Dss.BootDSK.Get - ; ENDIF - ;ENDIF - ; RST ToDSS ; ADD A,"A" @@ -455,28 +432,28 @@ GET_BPB: XOR A LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 ; - XOR A - LD B,A - LD C,A - EXX - LD H,A - LD L,A - LD D,A - LD E,A - EXX + XOR A + LD B,A + LD C,A + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX ; - ;LD BC,0 + ;LD BC,0 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - EXX - LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - LD A,E - EXX - ;LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - ;LD A,C + EXX + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,E + EXX + ;LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + ;LD A,C LD (FatBuffer.SectorsPerFAT_H),A LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) ; @@ -486,28 +463,28 @@ GET_BPB: XOR A JR Z,.one_FAT DEC A ADD HL,DE - EXX - ADC HL,DE - EXX - ;JR NC,.no_inc_BC - ;INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.no_inc_BC + ;INC BC .no_inc_BC: ; .one_FAT: ; .loop1: ADD HL,DE - EXX - ADC HL,DE - EXX - ;JR NC,.loop1_1 - ;INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.loop1_1 + ;INC BC .loop1_1: DEC A JR NZ,.loop1 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - EXX - ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. - LD (FatBuffer.FirstDataSector_H),HL - EXX - ;LD (FatBuffer.FirstDataSector_H),BC + EXX + ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. + LD (FatBuffer.FirstDataSector_H),HL + EXX + ;LD (FatBuffer.FirstDataSector_H),BC LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD A,B AND A diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index bfc6cba..e5e2e7a 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -59,8 +59,8 @@ DISKINF: LD C,B ;;;; ; EX DE,HL - LD HL,FAT_STRING - LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + LD HL,FAT_STRING ;!HARDCODE FAT FS + LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) @@ -114,12 +114,16 @@ DISKINF: LD C,B LD (DE),A ;номер раздела диска INC DE ; -.error_drv: XOR A +.error_drv: EX AF,AF' + XOR A LD (DE),A ;;;; POP BC POP AF POP DE + EX AF,AF' + JR C,.error + EX AF,AF' .error: POP HL RET ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 8be4c0b..ffc901b 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -186,15 +186,13 @@ OPENDSK: ;!TEST DRV.Open LD C,A LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP C - IF CHECK_DRIVE_CHANGE - JR NZ,.open - PUSH BC - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - POP BC - ENDIF + JR NZ,.open + PUSH BC + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + POP BC JR Z,.exit - + ; .open: LD A,C ; .force: PUSH AF @@ -226,7 +224,7 @@ OPENDSK: ;!TEST DRV.Open LD A,DSS_Error.sys.NOT_READY RET ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed -.error_bpb: PUSH AF ; сохраняем номер ошибки +.error_bpb: PUSH AF ; сохраняем номер ошибки LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP D JR Z,.next_check @@ -238,9 +236,11 @@ OPENDSK: ;!TEST DRV.Open ; LD (CORE_BUFFERS.FatBuffer.DRIVE),A CALL OPENDSK.force + JR NC,.err_exit + ; LD A,(BOOTDSK.NUM) LD (CORE_BUFFERS.FatBuffer.DRIVE),A - CALL C,OPENDSK.force + CALL OPENDSK.force ; .err_exit: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 4ae29fb..a87e8e5 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -232,15 +232,14 @@ INITDVC_RET_DRIVE: AND A RET - INCLUDE 'dss/Drivers/media/shared-drv.asm' - INCLUDE 'dss/Drivers/media/atapi-drv.asm' - ;INCLUDE 'dss/Drivers/media/ide-drv.asm' + INCLUDE 'dss/Drivers/media/shared.asm' + INCLUDE 'dss/Drivers/media/ata_atapi-drv.asm' INCLUDE 'dss/Drivers/media/fdd-drv.asm' INCLUDE 'dss/Drivers/media/ram_disk-drv.asm' INCLUDE "dss/Drivers/input/MOUSE.ASM" /////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\; ; -;------------------------[shared-drv.asm table]------------------------; +;--------------------------[shared.asm table]--------------------------; DEVICE EQU $ .TBL_Entry EQU 3 .Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry @@ -249,13 +248,14 @@ DEVICE EQU $ ; ; -;-------------------------[ IDE-DRV.ASM table]-------------------------; +;--------------------------[shared.asm table]--------------------------; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 BYTE PARTITION RECORD NUMBER (in drive MBR) ;+10 WORD Sector Size -;+12 FREE +;+12 BYTE Removable Media Byte flags +;+13_15 FREE ; LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU 16 @@ -307,7 +307,7 @@ RAMDTBL EQU LOGDRV + LOGDRV.Size ///////////////////////// [ DRIVE TABLES COPY] \\\\\\\\\\\\\\\\\\\\\\\\\; MODULE OLD_TABLES ; -;------------------------[shared-drv.asm table]------------------------; +;--------------------------[shared.asm table]--------------------------; DEVICE EQU @RAMDTBL + @RAMDTBL.Size .TBL_Entry EQU @DEVICE.TBL_Entry .Size: EQU @DEVICE.Size @@ -316,7 +316,7 @@ DEVICE EQU @RAMDTBL + @RAMDTBL.Size ; ; -;-------------------------[ IDE-DRV.ASM table]-------------------------; +;--------------------------[shared.asm table]--------------------------; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index e74d536..69ce24f 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -696,7 +696,8 @@ RD_BPB: ; LD C,SLOT3 ; POP BC ; OUT (C),B CALL READ_BPB - JP C,DOS_X_Error.Not_ready + ;JP C,DOS_X_Error.Not_ready + RET C ; LD DE,#AA55 ; сигнатура ;R05 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 @@ -1159,9 +1160,9 @@ DOS_X_Error: SCF RET ; -.Not_ready: LD A,DSS_Error.sys.NOT_READY - ; CF = 1 - RET +; .Not_ready: LD A,DSS_Error.sys.NOT_READY +; ; CF = 1 +; RET ; ; ;!TODO к буферам! @@ -2446,7 +2447,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX CALL SET_NEW_FREE_CLUSTERS ; CALL WRITE_TO_FAT - ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ; 02/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;PUSH HL ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ;POP HL diff --git a/DSS/build.txt b/DSS/build.txt index c227083..e440e5c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -0 \ No newline at end of file +3 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 95a0251..761506b 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -101,7 +101,6 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 - DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - тормознее, но безопаснее DEFINE NON_REMOVABLE_FDD 0 ; DEFINE OLD_DSS_FOR_OLD_EXE 0 ; !TODO diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/Shared.asm similarity index 95% rename from DSS/drivers/media/shared-drv.asm rename to DSS/drivers/media/Shared.asm index 5b4d88e..abda541 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/Shared.asm @@ -135,7 +135,7 @@ INITDVC: XOR A CALL FDD_DRV.Init ; узнать число FDD-девайсов LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы + ; IDE девайсы .if_old: CALL IDE_DRV.Init ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET LD DE,IDE_DRV.API_TABLE CALL MAKEDVC diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm similarity index 81% rename from DSS/drivers/media/atapi-drv.asm rename to DSS/drivers/media/ata_atapi-drv.asm index 7831101..eb918a5 100644 --- a/DSS/drivers/media/atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -183,11 +183,11 @@ ATAPI_BUFFER _sCDFS_PRIMARY_VOLUME_DESCRIPTOR = #C000 API_TABLE: INC C DEC C - JP Z,Init ; [ ] ; c=0 Initialization + JP Z,Init ; [ ] ; c=0 Initialization DEC C - JP Z,Open ; [ ] ; c=1 open + JP Z,Open ; [ ] ; c=1 open DEC C - JP Z,Close ; [ ] ; c=2 close + JP Z,Close ; [ ] ; c=2 close DEC C JP Z,MediaCheck ; [ ] ; c=3 media check (смена носителя) DEC C @@ -224,7 +224,7 @@ Init: PUSH IY LD (.count),A ; LD HL,LOGDRV - LD (OFFSECT),HL + LD (LOGDRV_OFFSET),HL LD IX,SYS_PAGE.TMP_BUFFER LD C,BIOS.DRV_LIST @@ -268,10 +268,10 @@ Init: PUSH IY ; .NX_DVCI: PUSH BC LD A,C - LD (DRV_NUM),A + LD (CURRENT_DRIVE.Number),A LD C,BIOS.DRV_DETECT RST ToBIOS - CALL NC,DEFINE_PARTITIONS.BEGIN + CALL NC,DEFINE_PARTITIONS POP BC INC C JR C,.NX_DVCI @@ -279,14 +279,13 @@ Init: PUSH IY RET ;---------------------------------------------------------------------[^] -; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -; ;+01 DWORD SECTOR OFFSET -; ;+05 DWORD SIZE IN SECTORS -; ;+09 FREE -; ;+15 -; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 -; .TBL_Entry EQU 16 -; .Size EQU $-LOGDRV +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 BYTE PARTITION RECORD NUMBER (in drive MBR) +;+10 WORD Sector Size +;+12 BYTE Removable Media Byte flags +;+13_15 FREE SelectDrive: PUSH DE PUSH HL ; @@ -358,19 +357,8 @@ GenIOCTL: BIT 7,B ;CHECK SECTOR TestTRK: LD C,BIOS.DRV_VERIFY JP Exec_BIOS - ;LD B,L - ;CALL CHECKH - ;RET -; HSETPRM: AND A -; RET - - -; HFRTRAC: LD A,DSS_Error.drv.GENERAL_FAILURE -; SCF -; RET - ; HL:DE - SECTORS ON LOGICAL DISK ; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого ; HL' - CYLINDERS ON PHISICAL DISK @@ -415,8 +403,36 @@ GetParams: EX DE,HL LD C,BIOS.DRV_GET_PAR RST ToBIOS POP IY + JR NC,.next + ; + CP BIOS.Error.ATAPI.NotReady + SCF + LD A,DSS_Error.drv.NOT_READY + JR Z,.error LD A,DSS_Error.drv.INVALID_DRIVE - JR C,.error + JR .error + ; [ ] media change +.next: EX AF,AF + JR C,.NoMediaChange + CP BIOS.Error.ATAPI.UnitAttention + JR NZ,.NoMediaChange + ; + PUSH IX + PUSH IY + PUSH HL + PUSH DE + PUSH BC + LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) + LD (CURRENT_DRIVE.Number),A + LD (LOGDRV_OFFSET),IY + CALL DEFINE_PARTITIONS + POP BC + POP DE + POP HL + POP IY + POP IX + ; +.NoMediaChange: ;EX AF,AF ; перетасовка регистров с результатом от BIOS EX DE,HL LD C,E @@ -468,34 +484,53 @@ Removable: XOR A INC A RET -Open: XOR A - RET + + Close: XOR A RET + +;!TODO пока Open ничего не делает кроме проверки MediaCheck +Open: ;CALL MediaCheck + ;RET +; JP MediaCheck +; ;[ ] media changed - bios 5x DETECT ; выход A=#FF - changed, A=0 - not changed, ZF=1 - not changed MediaCheck: PUSH IY CALL SelectDrive JR C,.exit ; - LD A,#FF - BIT 1,(IY + LOGDRV.RemovableMedia) - JR NZ,.exit - ; + ; [ ] media changed LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD C,BIOS.DRV_DETECT + PUSH IY RST ToBIOS - AND %0000'0010 - JR Z,.norm_exit + POP IY + JR NC,.next_check ; - ld - ; реинит драйва + CP BIOS.Error.ATAPI.UnitAttention + JR Z,.Reinit + JR .exit ; -.norm_exit: XOR A +.next_check: BIT 1,(IY + LOGDRV.RemovableMedia) + JR NZ,.Reinit + ; + XOR A .exit: POP IY - RET + RET + ; +.Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) + LD (CURRENT_DRIVE.Number),A + LD (LOGDRV_OFFSET),IY + ;RES 1,(IY + LOGDRV.RemovableMedia) + CALL DEFINE_PARTITIONS + LD A,#FF ;!HARDCODE drive changed + OR A + POP IY + RET + ; [ ] custorm sector size @@ -520,8 +555,8 @@ CHECK_IDE_SECTOR_SIZE: GetBPB: ; !FIXIT выбирать значения исходя из типа драйва или ещё чего-нибудь LD HL,0 LD IX,0 + LD B,1 JR Read - ; PUSH IY ; PUSH DE ; LD L,A @@ -548,6 +583,9 @@ GetBPB: ; !FIXIT ; POP IY ; LD A,DSS_Error.drv.UNKNOWN_FORMAT ; RET + + + ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER @@ -556,13 +594,7 @@ GetBPB: ; !FIXIT ;READ SECTOR ReadLong: LD C,BIOS.DRV_READ_LONG JP Exec_BIOS -; PUSH IY -; CALL SelectDrive -; JR C,.error ; [ ] custorm sector size -; LD C,BIOS.DRV_READ_LONG -; RST ToBIOS -; .error: POP IY -; RET + ;HL:IX - SECTOR ; DE - ADDRESS @@ -572,13 +604,7 @@ ReadLong: LD C,BIOS.DRV_READ_LONG ;WRITE SECTOR WriteLong: LD C,BIOS.DRV_WRITE_LONG JP Exec_BIOS -; PUSH IY -; CALL SelectDrive -; JR C,.error ; [ ] custorm sector size -; LD C,BIOS.DRV_WRITE_LONG -; RST ToBIOS -; .error: POP IY -; RET + ;HL:IX - SECTOR ; DE - ADDRESS @@ -587,27 +613,8 @@ WriteLong: LD C,BIOS.DRV_WRITE_LONG ;WRITE SECTOR Write: LD C,BIOS.DRV_WRITE JP Exec_BIOS -; PUSH IY -; CALL SelectDrive -; JR C,.error ; [ ] custorm sector size -; LD C,BIOS.DRV_WRITE -; RST ToBIOS -; .error: POP IY -; RET -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;CHECK SECTOR -; CHECKH: PUSH IY -; CALL SelectDrive -; LD C,BIOS.DRV_VERIFY -; RST ToBIOS -; POP IY -; RET - ;HL:IX - SECTOR ; DE - ADDRESS @@ -620,7 +627,7 @@ Exec_BIOS: PUSH IY CALL .exec POP IY RET - + ; .exec: CALL SelectDrive RET C RST ToBIOS @@ -630,24 +637,36 @@ Exec_BIOS: PUSH IY RET NZ SET 1,(IY + LOGDRV.RemovableMedia) RET + + ;------------------------------[ PARTIT ]------------------------------; +; вход: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved DEFINE_PARTITIONS: -.FAT32_DOS: ; -.EASYDOS: ; -.MEDIDOS: ; -.HIGHDOS: ; + IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A + CALL .Start + POP AF + OUT (SLOT3),A + RET + ; +.FAT32_DOS: +.EASYDOS: +.MEDIDOS: +.HIGHDOS: LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) - LD IX,(CURRENT_SECTOR_L) + LD IX,(CURRENT_SECTOR.Low) ADD IX,DE - LD DE,(CURRENT_SECTOR_H) + LD DE,(CURRENT_SECTOR.High) ADC HL,DE LD D,XH LD E,XL ;BPB SECTOR - LD IX,(OFFSECT) + LD IX,(LOGDRV_OFFSET) LD (IX + LOGDRV.SECTOR_OFFSET + 0),E LD (IX + LOGDRV.SECTOR_OFFSET + 1),D LD (IX + LOGDRV.SECTOR_OFFSET + 2),L @@ -661,6 +680,13 @@ DEFINE_PARTITIONS: LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H + ; [ ] sector size + CALL GetSectorSize + LD IX,(LOGDRV_OFFSET) + LD (IX + LOGDRV.SECTOR_SIZE),C + LD (IX + LOGDRV.SECTOR_SIZE + 1),B + LD A,(CURRENT_DRIVE.Removable) + LD (IX + LOGDRV.RemovableMedia),A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого .ExtendedPartitionFlag+1: LD A,0 @@ -677,21 +703,21 @@ DEFINE_PARTITIONS: CALL INC_DRV_COUNT RET NC ; - LD A,(DRV_NUM) + LD A,(CURRENT_DRIVE.Number) LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE - LD (OFFSECT),IX + LD (LOGDRV_OFFSET),IX JP .NextPartition ; .NotExtended: CP PartitionSysTypes.FAT16 JR Z,.HIGHDOS CP PartitionSysTypes.FAT16_LBA - JR Z,.HIGHDOS + JP Z,.HIGHDOS CP PartitionSysTypes.FAT16_32Mb - JR Z,.MEDIDOS + JP Z,.MEDIDOS CP PartitionSysTypes.FAT12 - JR Z,.EASYDOS + JP Z,.EASYDOS ;[ ] fat32 CP PartitionSysTypes.FAT32 JP Z,.FAT32_DOS @@ -706,68 +732,50 @@ DEFINE_PARTITIONS: .ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS ;SCF ;RET -.check_atapi: LD A,(DRV_NUM) - LD B,A +.check_atapi: LD A,(CURRENT_DRIVE.Number) + ;LD B,A AND #F0 CP DRIVE_CODES.SPRINTER.ATAPI SCF RET NZ ; - ; No Media - ;!TODO sector size - LD A,B - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - JR NC,.no_err - ; - LD IX,#FFFF -.no_err: LD D,XH - LD E,XL - ; + CALL GetSectorSize + ;BPB SECTOR ;!TODO если CD-ROM, то другой номер сектора + LD IX,(LOGDRV_OFFSET) + LD A,(CURRENT_DRIVE.Removable) + LD (IX + LOGDRV.RemovableMedia),A XOR A - ;BPB SECTOR - LD IX,(OFFSECT) LD (IX + LOGDRV.SECTOR_OFFSET + 0),A LD (IX + LOGDRV.SECTOR_OFFSET + 1),A LD (IX + LOGDRV.SECTOR_OFFSET + 2),A LD (IX + LOGDRV.SECTOR_OFFSET + 3),A - ;SIZE DISK - LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),A - LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),A - LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),A - LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),A + ; [ ] SIZE DISK + LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E + LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D + LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L + LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H ; [ ] sector size - LD (IX + LOGDRV.SECTOR_SIZE),E - LD (IX + LOGDRV.SECTOR_SIZE + 1),D + LD (IX + LOGDRV.SECTOR_SIZE),C + LD (IX + LOGDRV.SECTOR_SIZE + 1),B ; ; для правильного выхода из парсера разделов LD B,1 PUSH BC ;загрузка с активного раздела, а не с первого DEC A - JR .not_supported - ; - -.BEGIN: ;CP IDE.Device.HDD - ;RET NZ - IN A,(SLOT3) - PUSH AF - LD A,SHARED_PAGE - OUT (SLOT3),A - CALL .Start - POP AF - OUT (SLOT3),A - RET - ; - + JP .not_supported ; +; вход: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Start: LD IX,0 LD DE,0 - LD (EXTDOSL),DE ;R01 - LD (EXTDOSH),IX ;R01 + LD A,B + AND %1111'1101 + LD (CURRENT_DRIVE.Removable),A + LD (EXT_Partition.Low),DE ;R01 + LD (EXT_Partition.High),IX ;R01 ; -.LOOP: LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX +.LOOP: LD (CURRENT_SECTOR.Low),DE + LD (CURRENT_SECTOR.High),IX CALL .LOAD_SECTOR JR C,.check_atapi ; @@ -784,7 +792,7 @@ DEFINE_PARTITIONS: ;RET NZ ; ; [ ] если ATAPI, то пробуем прочесть 0 сектор как-будто нет MBR - ;LD A,(DRV_NUM) + ;LD A,(CURRENT_DRIVE.Number) ;CP DRIVE_CODES.SPRINTER.CDROM ; @@ -798,8 +806,8 @@ DEFINE_PARTITIONS: JP NZ,.NotExtended ; .SubLevel: PUSH IY - LD DE,(CURRENT_SECTOR_L) - LD IX,(CURRENT_SECTOR_H) + LD DE,(CURRENT_SECTOR.Low) + LD IX,(CURRENT_SECTOR.High) PUSH DE PUSH IX ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов @@ -815,8 +823,8 @@ DEFINE_PARTITIONS: ; POP IX POP DE - LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX + LD (CURRENT_SECTOR.Low),DE + LD (CURRENT_SECTOR.High),IX CALL .LOAD_SECTOR POP IY .NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry @@ -826,8 +834,8 @@ DEFINE_PARTITIONS: AND A RET ; -.ParseExtended: LD HL,(EXTDOSL) - LD DE,(EXTDOSH) +.ParseExtended: LD HL,(EXT_Partition.Low) + LD DE,(EXT_Partition.High) LD A,L OR H OR E @@ -837,14 +845,14 @@ DEFINE_PARTITIONS: LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) JP NZ,.ext_in_ext - LD (EXTDOSL),DE - LD (EXTDOSH),HL + LD (EXT_Partition.Low),DE + LD (EXT_Partition.High),HL PUSH DE JR .set_regs ; -.ext_in_ext: LD IX,(EXTDOSL) +.ext_in_ext: LD IX,(EXT_Partition.Low) ADD IX,DE - LD DE,(EXTDOSH) + LD DE,(EXT_Partition.High) ADC HL,DE PUSH IX .set_regs: PUSH HL @@ -853,14 +861,28 @@ DEFINE_PARTITIONS: JP .LOOP ; .LOAD_SECTOR: PUSH IY - LD IX,(CURRENT_SECTOR_L) - LD HL,(CURRENT_SECTOR_H) + LD IX,(CURRENT_SECTOR.Low) + LD HL,(CURRENT_SECTOR.High) LD DE,PARTITION_BUFFER - LD A,(DRV_NUM) + LD A,(CURRENT_DRIVE.Number) LD BC,1*256 + BIOS.DRV_READ RST ToBIOS POP IY - RET + RET + + +GetSectorSize: PUSH IY + LD A,(CURRENT_DRIVE.Number) + ; sector size + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + JR NC,.no_err + ; + LD IX,#FFFF +.no_err: LD B,XH + LD C,XL + POP IY + RET ;----------------------------------------------------------------------; ; @@ -875,12 +897,19 @@ INC_DRV_COUNT: LD A,(Init.count) ;======================================================================= ; PHISICAL DRIVE NUMBER ; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв -DRV_NUM: DB #00 -CURRENT_SECTOR_L: DW #0000 -CURRENT_SECTOR_H: DW #0000 -EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE -EXTDOSH: DW #0000 -OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD +CURRENT_DRIVE: +.Number: DB #00 +.Removable: DB #00 +; +CURRENT_SECTOR: +.Low: DW #0000 +.High: DW #0000 +; +EXT_Partition: ;CURRENT PARTITION TABLE +.Low: DW #0000 +.High: DW #0000 +; +LOGDRV_OFFSET: DW LOGDRV ;POINTER ON CURRENT DISK RECORD ;======================================================================= ENDMODULE \ No newline at end of file diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm deleted file mode 100644 index 025caae..0000000 --- a/DSS/drivers/media/ide-drv.asm +++ /dev/null @@ -1,734 +0,0 @@ -;!TODO привести к общему виду в одну инструкцию, проверить корректность -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R02 06-08-2001 DNS Secondary IDE -;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk -;--------------------------------------------------------------- -; -; Disk Driver Specification ver. 2.20 -;[]===========================================================[0] -;Procedure: Initialization -; -;Function: Initialization device(s) -; -;Input: C = #00 -; IX = Environment -; -;Output: A = Amount drive support -;[]===========================================================[0] - -;[]===========================================================[1] -;Procedure: Open -; -;Function: Open disk -; -;Input: C = #01 -; A = Drive -; -;Output: None -;[]===========================================================[1] - -;[]===========================================================[2] -;Procedure: Close -; -;Function: Close disk -; -;Input: C = #02 -; A = Drive -; -;Output: None -;[]===========================================================[2] - -;[]===========================================================[3] -;Procedure: Media check -; -;Function: Checking change line -; -;Input: C = #03 -; A = Drive -; -;Output: A = #00 disk no changed -; #FF disk changed -;[]===========================================================[3] - -;[]===========================================================[4] -;Procedure: Get BPB -; -;Function: Get Block Parameters BIOS -; -;Input: C = #04 -; A = Drive -; DE = Address -; -;Output: None -;[]===========================================================[4] - -;[]===========================================================[5] -;Procedure: Read -; -;Function: Read from disk -; -;Input: C = #05 -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A = Drive -; -;Output: None -;[]===========================================================[5] - -;[]===========================================================[6] -;Procedure: Write -; -;Function: Write to disk -; -;Input: C = #06 -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; -;Output: None -;[]===========================================================[6] - -;[]===========================================================[7] -;Procedure: Removable -; -;Function: Checking change line -; -;Input: C = #07 -; A = Drive -; -;Output: A = #00 Removable -; A = #FF Non-removable -;[]===========================================================[7] - -;[]===========================================================[8] -;Procedure: Generic IOCTL -; -;Function: Generic Input Output Control -; -;Input: C = #08 -; B = Subcommand -; DE = #55AA Magic Number -; A = Drive -; -;Subcommands: #00 - Get Device Parameters -; #01 - Read track -; #02 - Test track -; #80 - Set Device Parameters -; #81 - Write track -; #82 - Format track -;Output: -;[]===========================================================[8] - -;[]===========================================================[9] -;Procedure: Read Long -; -;Function: Reading sectors from disk -; -;Input: C = #0A -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A' = Page -; -;Output: A' = Next Page -; HL:IX = Next Logical Block (sector) -; DE = Next Address -;[]===========================================================[9] - -;[]===========================================================[10] -;Procedure: Write Long -; -;Function: Writing sectors to disk -; -;Input: C = #0B -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A' = Page -; -;Output: A' = Next Page -; HL:IX = Next Logical Block (sector) -; DE = Next Address -;[]===========================================================[10] - -; -; Errors: -; 0 (#00) - NO ERRORS -; 1 (#01) - BAD COMMAND -; 2 (#02) - BAD DRIVE NUMBER -; 3 (#03) - UNKNOW FORMAT -; 4 (#04) - NOT READY -; 5 (#05) - SEEK ERROR -; 6 (#06) - SECTOR NOT FOUND -; 7 (#07) - CRC ERROR -; 8 (#08) - WRITE PROTECT -; 9 (#09) - READ ERROR -; 10 (#0A) - WRITE ERROR -; 11 (#0B) - FAILURE -; 12 (#0C) - BUSY (DEVICE OPENED) -; 13 (#0D) - RESERVED - -; IDE0 EQU #0C1C0 -; IDE1 EQU #0C1C8 -PARTITION_BUFFER _sBOOT_SECTOR = #C000 - -HDDRIVE: INC C - DEC C - JP Z,INIT_H ; c=0 Initialization - DEC C - JP Z,RESE_H ; c=1 open - DEC C - JP Z,STAT_H ; c=2 close - DEC C - JP Z,CHEK_H ; c=3 media check (смена носителя) - DEC C - JP Z,GBPB_H ; c=4 get BPB - DEC C - JP Z,READH ; c=5 read (чтение секторов) - DEC C - JP Z,WRITEH ; c=6 write (запись секторов) - DEC C - JP Z,REMOV_H ; c=7 Removable - DEC C - JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL - DEC C - JP Z,.Reserved ; c=9 Reserved - DEC C - JP Z,LREADH ; c=10 Read Long - DEC C - JP Z,LWRITEH ; c=11 Write Long - ; -.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - - -//////////////////////////////////////////////////////////////////////// -// Commands for restart #18 // -//////////////////////////////////////////////////////////////////////// - -;--------------------------------------------------------------------[v] -; c=0 Initialization -INIT_H: PUSH IY - ;!TEST ;[ ] для rescanDRV - XOR A - LD (DRVCLC.count),A - ; - LD HL,LOGDRV - LD (OFFSECT),HL - - LD IX,SYS_PAGE.TMP_BUFFER - LD C,BIOS.DRV_LIST - RST ToBIOS - ; DRV_LIST: - ; +0 LEN - ; +1 FDD COUNT - ; +2 ATA COUNT - ; +3 ATAPI COUNT - ; +4 RESERVED (28) - ; - IN A,(SLOT3) - LD C,A - LD A,SYS_PAGE - OUT (SLOT3),A - XOR A - LD B,(IX+2) ;количество HDD для процедуры NX_DVCI - CP B - LD A,C - OUT (SLOT3),A - JR Z,NO_HARDS - LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT - -NX_DVCI: PUSH BC - LD A,C - LD (DRV_NUM),A - LD C,BIOS.DRV_DETECT - RST ToBIOS - ;JR C,.NO_DRIVE - CALL NC,DEFINE_PARTITIONS.BEGIN - POP BC - INC C - JR C,NX_DVCI - DJNZ NX_DVCI - ; -NO_HARDS: - POP IY - ;!TEST - ; LD HL,(OFFSECT) - ; LD DE,LOGDRV - ; XOR A - ; SBC HL,DE - ; RET Z - ; LD DE,LOGDRV.TBL_Entry -DRVCLC: ; INC A - ; SBC HL,DE - ; JR NZ,DRVCLC - ; -.count+1: LD A,0 - ; - AND A - RET -;---------------------------------------------------------------------[^] - -; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -; ;+01 DWORD SECTOR OFFSET -; ;+05 DWORD SIZE IN SECTORS -; ;+09 FREE -; ;+15 -; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 -; .TBL_Entry EQU 16 -; .Size EQU $-LOGDRV -SELHDD: PUSH DE - PUSH HL - ; - LD L,A - LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - ADD IX,DE - LD E,(IY+3) - LD D,(IY+4) - POP HL - ADC HL,DE - LD A,(IY+0) ;DRIVE NUMBER - POP DE - RET - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -IOCTL_H BIT 7,B - JR NZ,O_CTL_H - INC B - DEC B - JP Z,HGETPRM - DEC B - JP Z,HRDTRAC - DEC B - JP Z,HCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -O_CTL_H RES 7,B - INC B - DEC B - JP Z,HSETPRM - DEC B - JP Z,HWRTRAC - DEC B - JP Z,HFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -HCHTRAC LD B,L - CALL CHECKH - RET - -HSETPRM AND A - RET - -HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - DRIVE/HEAD REGISTER PHISICAL DISK: -; bit7 - reserved "1" -; bit6 - ADDRESSING MODE LBA/CHS -; bit5 - reserved "1" -; bit4 - DEVICE MASTER/SLAVE -; bit3 - reserved "0" (MAY BE OTHER) -; bit2 - reserved "0" (MAY BE OTHER) -; bit1 - reserved "0" (MAY BE OTHER) -; bit0 - Primary/Secondary Chanel -HGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - ; - PUSH IX - PUSH IY - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - PUSH IY - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP IY - LD A,DSS_Error.drv.INVALID_DRIVE - JR C,.error - ; перетасовка регистров с результатом от BIOS - EX DE,HL - LD C,E - LD E,D - LD D,0 - LD A,B - LD B,D - EXX - ;[ ] 04/01/2025 возвращение размера сектора - EX AF,AF' - LD A,XH - LD E,XL - RL E - RLA - ; - ; SECTORS ON LOGICAL DISK - LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) - LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) - LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) - LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) - ; - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска - ; - ;[ ] 04/01/2025 возвращение размера сектора - ; 00 - undefined - ; 01 - 128 bytes - ; 02 - 256 bytes - ; 04 - 512 bytes - ; 08 - 1024 bytes - ; 16 - 2048 bytes - ; 32 - 4096 bytes - ; 64 - 8192 bytes - ; 128 - 16384 bytes - ;EX AF,AF' - LD B,A - ; - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - EX AF,AF' - ; - AND A -.error: POP IY - POP IX - RET - -REMOV_H: - LD A,1 - AND A - RET - - - -RESE_H: XOR A - RET - -STAT_H: XOR A - RET - -CHEK_H: ;LD A,#FF - XOR A - ;AND A - RET - - -; DE - ADDRESS -; A - DRIVE -GBPB_H: PUSH IY - PUSH DE - LD L,A - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - LD E,(IY+LOGDRV.SECTOR_OFFSET) - LD D,(IY+LOGDRV.SECTOR_OFFSET+1) - LD L,(IY+LOGDRV.SECTOR_OFFSET+2) - LD H,(IY+LOGDRV.SECTOR_OFFSET+3) - LD XL,E - LD XH,D - LD A,(IY+LOGDRV.SECTOR_OFFSET.PHISICAL_DRV_NUMBER) - POP DE - POP IY - LD BC,1*256 + BIOS.DRV_READ - JP ToBIOS - - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A'- PAGE -; A - HDD LOG NUMBER -;READ SECTOR -LREADH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_READ_LONG - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A'- PAGE -; A - HDD LOG NUMBER -;WRITE SECTOR -LWRITEH: - PUSH IY - CALL SELHDD - LD C,BIOS.DRV_WRITE_LONG - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;WRITE SECTOR -WRITEH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_WRITE - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;READ SECTOR -READH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_READ - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;CHECK SECTOR -CHECKH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_VERIFY - RST ToBIOS - POP IY - RET - -;------------------------------[ PARTIT ]------------------------------; -DEFINE_PARTITIONS: -.FAT32_DOS: ; -.EASYDOS: ; -.MEDIDOS: ; -.HIGHDOS: ; - LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) - LD IX,(CURRENT_SECTOR_L) - ADD IX,DE - LD DE,(CURRENT_SECTOR_H) - ADC HL,DE - LD D,XH - LD E,XL - ;BPB SECTOR - LD IX,(OFFSECT) - LD (IX + LOGDRV.SECTOR_OFFSET + 0),E - LD (IX + LOGDRV.SECTOR_OFFSET + 1),D - LD (IX + LOGDRV.SECTOR_OFFSET + 2),L - LD (IX + LOGDRV.SECTOR_OFFSET + 3),H - LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) - ;SIZE DISK - LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E - LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D - LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L - LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -.ExtendedPartitionFlag+1: - LD A,0 - OR A ; !TODO загрузка с расширенного раздела не поддерживается - LD A,#FF - JR NZ,.not_supported ; если расширенный раздел, то облом - ; - POP BC - PUSH BC - LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table - SUB B -.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A - ; - ;!TEST Подстраховка от переполнения таблицы LOGDRV - LD A,(DRVCLC.count) - INC A - CP DSS_MAX_DRIVES_AMOUNT+1 - RET NC - LD (DRVCLC.count),A - ; - LD A,(DRV_NUM) - LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A - LD DE,LOGDRV.TBL_Entry ;DSKITEM - ADD IX,DE - LD (OFFSECT),IX - JP .NextPartition - ; -.NotExtended: CP PartitionSysTypes.FAT16 - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_LBA - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,.MEDIDOS - CP PartitionSysTypes.FAT12 - JR Z,.EASYDOS - ;[ ] fat32 - CP PartitionSysTypes.FAT32 - JP Z,.FAT32_DOS - CP PartitionSysTypes.FAT32_LBA - JP Z,.FAT32_DOS - ; - CP PartitionSysTypes.Win_Ext_LBA - JR Z,.SubLevel - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - ;OR A ;PartitionSysTypes.Empty - ;JR NZ,NXTPART - JR .NextPartition ; раздел не поддерживается - ;POP BC ; баланс стека - ;RET - ;POP BC - ;OR A - ;RET Z - ;NODEFIN: - ;SCF - ;RET - ; -.BEGIN: IN A,(SLOT3) - PUSH AF - LD A,SHARED_PAGE - OUT (SLOT3),A - CALL .Start - POP AF - OUT (SLOT3),A - RET -.Start: LD IX,0 - LD DE,0 - LD (EXTDOSL),DE ;R01 - LD (EXTDOSH),IX ;R01 - ; -.LOOP: LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - ; - LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) - LD DE,#AA55 - AND A - SBC HL,DE - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - ;JR NZ,NODEFIN - SCF - RET NZ - ; - LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR - LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table -.DOSAGA: PUSH BC - LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) - CP PartitionSysTypes.Extended - JR Z,.SubLevel - CP PartitionSysTypes.Win_Ext_LBA - JR NZ,.NotExtended - ; -.SubLevel: PUSH IY - LD DE,(CURRENT_SECTOR_L) - LD IX,(CURRENT_SECTOR_H) - PUSH DE - PUSH IX - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - INC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - CALL .ParseExtended - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - DEC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - POP IX - POP DE - LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - POP IY -.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry - ADD IY,DE - POP BC - DJNZ .DOSAGA - AND A - RET - ; -.ParseExtended: LD HL,(EXTDOSL) - LD DE,(EXTDOSH) - LD A,L - OR H - OR E - OR D - LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) - LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) - LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) - JP NZ,.ext_in_ext - LD (EXTDOSL),DE - LD (EXTDOSH),HL - PUSH DE - JR .set_regs - ; -.ext_in_ext: LD IX,(EXTDOSL) - ADD IX,DE - LD DE,(EXTDOSH) - ADC HL,DE - PUSH IX -.set_regs: PUSH HL - POP IX - POP DE - JP .LOOP - ; -.LOAD_SECTOR: PUSH IY - LD IX,(CURRENT_SECTOR_L) - LD HL,(CURRENT_SECTOR_H) - LD DE,PARTITION_BUFFER - LD A,(DRV_NUM) - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP IY - RET -;----------------------------------------------------------------------; -; - -;======================================================================= -; PHISICAL DRIVE NUMBER -; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв -DRV_NUM: DB #00 -CURRENT_SECTOR_L: DW #0000 -CURRENT_SECTOR_H: DW #0000 -EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE -EXTDOSH: DW #0000 -OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD -;======================================================================= \ No newline at end of file diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index 501b2b5..f168532 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -91,18 +91,50 @@ cmd_info: CALL Get_Path JR C,.ItIsFDD LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 + RST ToDSS.DRV JR NC,.calc_size + ; .ItIsFDD: ; LD HL,.Unknown_str LD DE,Buffers.bat_params.PRM5 ; Drive size CALL ncopy_string JR .print_info_2 - ; HL:DE * 512 = A:H'L':HL ;!HARDCODE sector size -.calc_size: RL E + +/* +312 585 200 + A H L D E +0000 0000. 0001 0010. 1010 0001. 1010 1011. 1111 0000. +0000 1001. 0101 0000. 1101 0101. 1111 1000. 0000 0000. 128 +0001 0010. 1010 256 +0010 0101. 512 +1001 0101 2048 + +*/ +; максимальный размер сектора для перевода в байты - 2048; !FIXIT ; [ ] sector size +; HL:DE * sector_size = A:H'L':HL +.calc_size: LD A,B + CP #FF + JR Z,.ItIsFDD + AND A + JR Z,.ItIsFDD + ; + RRA + JR C,.s128 + RRA + JR C,.set_regs + ; +.RL_LOOP: RL E RL D RL L RL H + RRA + JR NC,.RL_LOOP + ;XOR A + ; +.set_regs: EXX + LD L,A + EXX + ; LD A,H EX AF,AF LD A,E @@ -110,9 +142,35 @@ cmd_info: CALL Get_Path LD L,D EXX LD H,A - LD L,0 EX AF,AF - JR .convert_hex + JP .convert_hex + ; +.s128: ; A = 0 + SRL H + RR L + RR D + RR E + RRA + JR .set_regs + + + + +; ; HL:DE * 512 = A:H'L':HL ;!HARDCODE sector size +; .calc_size: RL E +; RL D +; RL L +; RL H +; LD A,H +; EX AF,AF +; LD A,E +; LD H,L +; LD L,D +; EXX +; LD H,A +; LD L,0 +; EX AF,AF +; JR .convert_hex ; .Collect_Msg: DZ " A: \r" ; патчится буква драйва в цикле .Unknown_str: DZ "unknown" diff --git a/SHELL/build.txt b/SHELL/build.txt index cb856a4..4991210 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -444 \ No newline at end of file +451 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 857938d..171e479 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa +Subproject commit 171e4791a80462627c5876e095a042dc3e3b9eac From 371e93f6baf949fae443c0473f3c7624b10d958e Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:43:46 +1000 Subject: [PATCH 185/219] ... --- DSS/DRV-MAIN.ASM | 2 +- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 49 +++++++++++++++++++---------- Shared_Includes | 2 +- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index a87e8e5..0b53a17 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -266,7 +266,7 @@ LOGDRV EQU DEVICE + DEVICE.End .SIZE_IN_SECTORS EQU 5 .PARTITION_RECORD_NUM EQU 9 .SECTOR_SIZE EQU 10 ; word -.RemovableMedia EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved +.MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Reserved_1 EQU 13 .Reserved_2 EQU 14 .Reserved_3 EQU 15 diff --git a/DSS/build.txt b/DSS/build.txt index e440e5c..301160a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -3 \ No newline at end of file +8 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index eb918a5..86764f5 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -269,14 +269,22 @@ Init: PUSH IY .NX_DVCI: PUSH BC LD A,C LD (CURRENT_DRIVE.Number),A - LD C,BIOS.DRV_DETECT + LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT RST ToBIOS + CALL C,.check_error CALL NC,DEFINE_PARTITIONS - POP BC +.skip: POP BC INC C JR C,.NX_DVCI DJNZ .NX_DVCI RET + ; +.check_error: XOR BIOS.Error.BadNumber + RET NZ + SCF + RET + + ;---------------------------------------------------------------------[^] ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... @@ -293,7 +301,7 @@ SelectDrive: PUSH DE ; LOGDRV_ENTRY_FIND LOGDRV ; - ; [ ] custorm sector size + ; [ ] custom sector size CALL CHECK_IDE_SECTOR_SIZE RLA ; @@ -405,15 +413,24 @@ GetParams: EX DE,HL POP IY JR NC,.next ; - CP BIOS.Error.ATAPI.NotReady - SCF - LD A,DSS_Error.drv.NOT_READY - JR Z,.error - LD A,DSS_Error.drv.INVALID_DRIVE - JR .error + ;CP BIOS.Error.ATAPI.NotReady + ;SCF + ;LD A,DSS_Error.drv.NOT_READY + ;JR Z,.error + ;LD A,DSS_Error.drv.INVALID_DRIVE + ;JR .error + ; + CP BIOS.Error.BadNumber + SCF + LD A,DSS_Error.drv.INVALID_DRIVE + JR Z,.error + LD A,DSS_Error.drv.NOT_READY + JR .error + + ; [ ] media change .next: EX AF,AF - JR C,.NoMediaChange + JR NC,.NoMediaChange CP BIOS.Error.ATAPI.UnitAttention JR NZ,.NoMediaChange ; @@ -504,7 +521,7 @@ MediaCheck: PUSH IY ; ; [ ] media changed LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) - LD C,BIOS.DRV_DETECT + LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT PUSH IY RST ToBIOS POP IY @@ -514,7 +531,7 @@ MediaCheck: PUSH IY JR Z,.Reinit JR .exit ; -.next_check: BIT 1,(IY + LOGDRV.RemovableMedia) +.next_check: BIT 1,(IY + LOGDRV.MediaParameters) JR NZ,.Reinit ; XOR A @@ -524,7 +541,7 @@ MediaCheck: PUSH IY .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD (CURRENT_DRIVE.Number),A LD (LOGDRV_OFFSET),IY - ;RES 1,(IY + LOGDRV.RemovableMedia) + ;RES 1,(IY + LOGDRV.MediaParameters) CALL DEFINE_PARTITIONS LD A,#FF ;!HARDCODE drive changed OR A @@ -635,7 +652,7 @@ Exec_BIOS: PUSH IY CP BIOS.Error.ATAPI.UnitAttention SCF RET NZ - SET 1,(IY + LOGDRV.RemovableMedia) + SET 1,(IY + LOGDRV.MediaParameters) RET @@ -686,7 +703,7 @@ DEFINE_PARTITIONS: LD (IX + LOGDRV.SECTOR_SIZE),C LD (IX + LOGDRV.SECTOR_SIZE + 1),B LD A,(CURRENT_DRIVE.Removable) - LD (IX + LOGDRV.RemovableMedia),A + LD (IX + LOGDRV.MediaParameters),A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого .ExtendedPartitionFlag+1: LD A,0 @@ -743,7 +760,7 @@ DEFINE_PARTITIONS: ;BPB SECTOR ;!TODO если CD-ROM, то другой номер сектора LD IX,(LOGDRV_OFFSET) LD A,(CURRENT_DRIVE.Removable) - LD (IX + LOGDRV.RemovableMedia),A + LD (IX + LOGDRV.MediaParameters),A XOR A LD (IX + LOGDRV.SECTOR_OFFSET + 0),A LD (IX + LOGDRV.SECTOR_OFFSET + 1),A diff --git a/Shared_Includes b/Shared_Includes index 171e479..b3224fc 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 171e4791a80462627c5876e095a042dc3e3b9eac +Subproject commit b3224fc3afac71c6b1d461ff54049e58657bbe5a From 4bde8c738c12cab6657caa531d10a124f4cb3e7e Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 6 Feb 2025 03:34:12 +1000 Subject: [PATCH 186/219] =?UTF-8?q?DSSBOOT:=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=BE=D0=B9=20=D1=8F=D0=B4=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 1 + DSS/DOS_Proc.asm | 8 +- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 113 +++++++++++++++++++++++----- SHELL/build.txt | 2 +- 5 files changed, 104 insertions(+), 22 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index eff0e54..d451e3a 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -263,6 +263,7 @@ RUN_CORE: DI ; INC_SECTOR_NUM: PUSH DE CALL CLUSTER_TO_SECTOR + CALL GET_ABSOLUTE_SECTOR LD DE,#20 ;!HARDCODE количество прочитанных секторов ADD IX,DE JR NC,.no_inc diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index ffc901b..b50e811 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -192,6 +192,7 @@ OPENDSK: ;!TEST DRV.Open RST ToDSS.DRV POP BC JR Z,.exit + JR .skip_open ;!FIXIT когда DRV.MediaCheck и DRV.Open будут отличаться ; .open: LD A,C ; @@ -201,7 +202,7 @@ OPENDSK: ;!TEST DRV.Open POP BC JP C,.error ;[x] 29/02/2024 fix "open drive error" - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.skip_open: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD D,A PUSH DE ; @@ -217,12 +218,13 @@ OPENDSK: ;!TEST DRV.Open .exit: LD A,(LDRIVE) AND A RET - ; + ; !FIXIT костыль для Flex Navigator ; [ ] media change .error: CP DSS_Error.sys.INVALID_DRIVE SCF RET Z LD A,DSS_Error.sys.NOT_READY - RET + RET + ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed .error_bpb: PUSH AF ; сохраняем номер ошибки LD A,(CORE_BUFFERS.FatBuffer.DRIVE) diff --git a/DSS/build.txt b/DSS/build.txt index 301160a..f11c82a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -8 \ No newline at end of file +9 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 86764f5..55aeb65 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -294,16 +294,49 @@ Init: PUSH IY ;+10 WORD Sector Size ;+12 BYTE Removable Media Byte flags ;+13_15 FREE +; SelectDrive: PUSH DE +; PUSH HL +; ; +; LD L,A +; ; +; LOGDRV_ENTRY_FIND LOGDRV +; ; +; ; [ ] custorm sector size +; CALL CHECK_IDE_SECTOR_SIZE +; RLA +; ; +; ; +; LD E,(IY+LOGDRV.SECTOR_OFFSET) +; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) +; ADD IX,DE +; LD E,(IY+LOGDRV.SECTOR_OFFSET+2) +; LD D,(IY+LOGDRV.SECTOR_OFFSET+3) +; POP HL +; ADC HL,DE +; ; [ ] custom sector size +; ;JR C,.exit +; RRA +; ; +; .exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) +; POP DE +; RET NC +; LD A,DSS_Error.drv.UNKNOWN_FORMAT +; RET +; переделать тут проверку на размер сектора? SelectDrive: PUSH DE PUSH HL ; LD L,A + ADD 0 - DSS_MAX_DRIVES_AMOUNT - 1 + LD A,DSS_Error.sys.INVALID_DRIVE + JR C,.error_pop ; LOGDRV_ENTRY_FIND LOGDRV ; ; [ ] custom sector size CALL CHECK_IDE_SECTOR_SIZE - RLA + LD A,DSS_Error.drv.UNKNOWN_FORMAT + JR C,.error_pop ; ; LD E,(IY+LOGDRV.SECTOR_OFFSET) @@ -313,15 +346,17 @@ SelectDrive: PUSH DE LD D,(IY+LOGDRV.SECTOR_OFFSET+3) POP HL ADC HL,DE - ; [ ] custom sector size - ;JR C,.exit - RRA - ; -.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) POP DE - RET NC - LD A,DSS_Error.drv.UNKNOWN_FORMAT - RET + LD A,DSS_Error.drv.SECTOR_NOT_FOUND + RET C + ; + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) + RET + ; +.error_pop: POP HL + POP DE + RET + ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK @@ -509,17 +544,55 @@ Close: XOR A ;!TODO пока Open ничего не делает кроме проверки MediaCheck -Open: ;CALL MediaCheck - ;RET -; JP MediaCheck +Open: CALL MediaCheck + ;!TODO + ;RET С + ;CALL READ_PARTITION_PARAMETERS + RET ; ;[ ] media changed - bios 5x DETECT ; выход A=#FF - changed, A=0 - not changed, ZF=1 - not changed +; MediaCheck: PUSH IY +; CALL SelectDrive +; JR C,.exit +; ; +; ; [ ] media changed +; LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) +; LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT +; PUSH IY +; RST ToBIOS +; POP IY +; JR NC,.next_check +; ; +; CP BIOS.Error.ATAPI.UnitAttention +; JR Z,.Reinit +; JR .exit +; ; +; .next_check: BIT 1,(IY + LOGDRV.MediaParameters) +; JR NZ,.Reinit +; ; +; XOR A +; .exit: POP IY +; RET +; ; +; .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) +; LD (CURRENT_DRIVE.Number),A +; LD (LOGDRV_OFFSET),IY +; ;RES 1,(IY + LOGDRV.MediaParameters) +; CALL DEFINE_PARTITIONS +; LD A,#FF ;!HARDCODE drive changed +; OR A +; POP IY +; RET MediaCheck: PUSH IY CALL SelectDrive - JR C,.exit + JR NC,.next_step ; + CP DSS_Error.drv.UNKNOWN_FORMAT + SCF + JR NZ,.exit ; [ ] media changed +.next_step: PUSH AF ; Сохраняем CF и код ошибки UNKNOWN_FORMAT, если CF=1 LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT PUSH IY @@ -529,13 +602,18 @@ MediaCheck: PUSH IY ; CP BIOS.Error.ATAPI.UnitAttention JR Z,.Reinit - JR .exit + SCF + POP BC ; Баланс стека +.exit: POP IY + RET ; .next_check: BIT 1,(IY + LOGDRV.MediaParameters) JR NZ,.Reinit ; + POP AF ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 + POP IY + RET C XOR A -.exit: POP IY RET ; .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) @@ -543,13 +621,14 @@ MediaCheck: PUSH IY LD (LOGDRV_OFFSET),IY ;RES 1,(IY + LOGDRV.MediaParameters) CALL DEFINE_PARTITIONS + POP AF + POP IY + RET C ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 LD A,#FF ;!HARDCODE drive changed OR A - POP IY RET - ; [ ] custorm sector size CHECK_IDE_SECTOR_SIZE: LD E,(IY+LOGDRV.SECTOR_SIZE) diff --git a/SHELL/build.txt b/SHELL/build.txt index 4991210..812799a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -451 \ No newline at end of file +452 \ No newline at end of file From a93bbd76ad76c05fa937de03164a06efaf276829 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 8 Feb 2025 01:28:18 +1000 Subject: [PATCH 187/219] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D1=82=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=81=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=83=20=D0=B4=D0=B8=D1=81=D0=BA=D0=B0=20ATAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Close.asm | 5 ++ DSS/DOS_Proc.asm | 19 +++++ DSS/DRV-MAIN.ASM | 2 +- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 126 ++++++++++++++++++++-------- SHELL/Commands/DIR.ASM | 10 ++- SHELL/Commands/MKDIR.ASM | 22 ++--- SHELL/Commands/REN.ASM | 4 - SHELL/Commands/RMDIR.ASM | 25 +++--- SHELL/EXEC.ASM | 15 +++- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 12 files changed, 165 insertions(+), 69 deletions(-) diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 92f79ab..e39e794 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -31,6 +31,7 @@ CLOSE_FN: ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD A,(IY+_sFM.DRIVE) CALL OPENDSK + JR C,.error ; XOR A CALL SET_FM @@ -83,4 +84,8 @@ CLOSE_FN: .NOTMODF: LD A,(.TMP) JP RES_FM + ; +.error: POP DE + POP DE + RET ; \ No newline at end of file diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index b50e811..264b838 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -222,8 +222,27 @@ OPENDSK: ;!TEST DRV.Open .error: CP DSS_Error.sys.INVALID_DRIVE SCF RET Z + ; + CP DSS_Error.sys.MEDIA_CHANGED + SCF + RET Z + ; + CP DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET Z + ; LD A,DSS_Error.sys.NOT_READY RET + +/* +0000 0010 02 +0001 1100 1c +0000 1101 0d + +0001 0011 +*/ + + ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed .error_bpb: PUSH AF ; сохраняем номер ошибки diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 0b53a17..3ea33ff 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -266,7 +266,7 @@ LOGDRV EQU DEVICE + DEVICE.End .SIZE_IN_SECTORS EQU 5 .PARTITION_RECORD_NUM EQU 9 .SECTOR_SIZE EQU 10 ; word -.MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved +.MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Reserved_1 EQU 13 .Reserved_2 EQU 14 .Reserved_3 EQU 15 diff --git a/DSS/build.txt b/DSS/build.txt index f11c82a..3cacc0b 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -9 \ No newline at end of file +12 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 55aeb65..59f0fc0 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -335,7 +335,7 @@ SelectDrive: PUSH DE ; ; [ ] custom sector size CALL CHECK_IDE_SECTOR_SIZE - LD A,DSS_Error.drv.UNKNOWN_FORMAT + LD A,DSS_Error.sys.UNKNOWN_FORMAT JR C,.error_pop ; ; @@ -463,7 +463,7 @@ GetParams: EX DE,HL JR .error - ; [ ] media change + ; [ ] media change - убрать ;!FIXIT .next: EX AF,AF JR NC,.NoMediaChange CP BIOS.Error.ATAPI.UnitAttention @@ -545,9 +545,15 @@ Close: XOR A ;!TODO пока Open ничего не делает кроме проверки MediaCheck Open: CALL MediaCheck - ;!TODO - ;RET С + RET Z + RET C + ;!TODO ??? ;CALL READ_PARTITION_PARAMETERS + ; + INC A + RET NZ + LD A,DSS_Error.sys.MEDIA_CHANGED + SCF RET ; ;[ ] media changed - bios 5x DETECT @@ -588,23 +594,25 @@ MediaCheck: PUSH IY CALL SelectDrive JR NC,.next_step ; - CP DSS_Error.drv.UNKNOWN_FORMAT - SCF + CP DSS_Error.sys.UNKNOWN_FORMAT JR NZ,.exit + AND A ; сброс ZF + SCF ; [ ] media changed .next_step: PUSH AF ; Сохраняем CF и код ошибки UNKNOWN_FORMAT, если CF=1 LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) - LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT + LD C,BIOS.DRV_GET_PAR ;[ ] media change переделать логику тут и в биос? ; !FIXIT PUSH IY RST ToBIOS POP IY + EX AF,AF' JR NC,.next_check ; CP BIOS.Error.ATAPI.UnitAttention JR Z,.Reinit - SCF POP BC ; Баланс стека -.exit: POP IY +.exit: SCF + POP IY RET ; .next_check: BIT 1,(IY + LOGDRV.MediaParameters) @@ -619,12 +627,12 @@ MediaCheck: PUSH IY .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD (CURRENT_DRIVE.Number),A LD (LOGDRV_OFFSET),IY - ;RES 1,(IY + LOGDRV.MediaParameters) + ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS CALL DEFINE_PARTITIONS POP AF POP IY RET C ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 - LD A,#FF ;!HARDCODE drive changed + LD A,#FF ;!HARDCODE drive changed OR A RET @@ -633,9 +641,11 @@ MediaCheck: PUSH IY CHECK_IDE_SECTOR_SIZE: LD E,(IY+LOGDRV.SECTOR_SIZE) LD D,(IY+LOGDRV.SECTOR_SIZE+1) - LD HL,DSS_MAX_SECTOR_SIZE - AND A - SBC HL,DE + ; LD HL,DSS_MAX_SECTOR_SIZE + ; AND A + ; SBC HL,DE + LD HL,-DSS_MAX_SECTOR_SIZE - 1 + ADD HL,DE RET ; @@ -725,7 +735,7 @@ Exec_BIOS: PUSH IY RET ; .exec: CALL SelectDrive - RET C + RET C ;!FIXIT переделать номер ошибки с драйвера на дос RST ToBIOS RET NC CP BIOS.Error.ATAPI.UnitAttention @@ -799,11 +809,7 @@ DEFINE_PARTITIONS: CALL INC_DRV_COUNT RET NC ; - LD A,(CURRENT_DRIVE.Number) - LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A - LD DE,LOGDRV.TBL_Entry ;DSKITEM - ADD IX,DE - LD (LOGDRV_OFFSET),IX + CALL .set_drv_tbl JP .NextPartition ; .NotExtended: CP PartitionSysTypes.FAT16 @@ -824,8 +830,14 @@ DEFINE_PARTITIONS: JP Z,.SubLevel JP .NextPartition ; раздел не поддерживается ; - -.ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS +.set_drv_tbl: LD A,(CURRENT_DRIVE.Number) + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A + LD DE,LOGDRV.TBL_Entry ;DSKITEM + ADD IX,DE + LD (LOGDRV_OFFSET),IX + RET + ; +.CDFS_TST: ;JR .check_atapi ;!FIXIT CDFS ;SCF ;RET .check_atapi: LD A,(CURRENT_DRIVE.Number) @@ -833,10 +845,22 @@ DEFINE_PARTITIONS: AND #F0 CP DRIVE_CODES.SPRINTER.ATAPI SCF - RET NZ + ;RET NZ + PUSH AF ; CALL GetSectorSize - ;BPB SECTOR ;!TODO если CD-ROM, то другой номер сектора + CALL .set_LOGDRV + POP AF + RET NZ ; результат CP DRIVE_CODES.SPRINTER.ATAPI + ; для правильного выхода из парсера разделов + LD B,1 + PUSH BC + ;загрузка с активного раздела, а не с первого + LD A,#FF ; для пропуска .tst_zipNoMBR и записи в LOGDRV.PARTITION_RECORD_NUM + LD (CURRENT_SECTOR.Low),A + JP .not_supported + ; +.set_LOGDRV: ;BPB SECTOR ;!TODO если CD-ROM, то другой номер сектора LD IX,(LOGDRV_OFFSET) LD A,(CURRENT_DRIVE.Removable) LD (IX + LOGDRV.MediaParameters),A @@ -851,15 +875,9 @@ DEFINE_PARTITIONS: LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H ; [ ] sector size - LD (IX + LOGDRV.SECTOR_SIZE),C - LD (IX + LOGDRV.SECTOR_SIZE + 1),B - ; - ; для правильного выхода из парсера разделов - LD B,1 - PUSH BC - ;загрузка с активного раздела, а не с первого - DEC A - JP .not_supported + LD (IX + LOGDRV.SECTOR_SIZE),C + LD (IX + LOGDRV.SECTOR_SIZE + 1),B + RET ; ; вход: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Start: LD IX,0 @@ -883,7 +901,7 @@ DEFINE_PARTITIONS: ;JR NZ,NODEFIN ; [ ] CDFS - JR NZ,.ATAPI_TST + JR NZ,.CDFS_TST ;SCF ;RET NZ ; @@ -927,7 +945,43 @@ DEFINE_PARTITIONS: ADD IY,DE POP BC DJNZ .DOSAGA - AND A + ; +.tst_zipNoMBR: ; [ ] zip no MBR + ; только для Removable media + LD A,(CURRENT_DRIVE.Removable) + AND %0000'0001 + RET Z + ; только для ATAPI + LD A,(CURRENT_DRIVE.Number) + LD B,A + AND #F0 + CP DRIVE_CODES.SPRINTER.ATAPI + JR NZ,.exit + ; + XOR A + LD HL,(CURRENT_SECTOR.Low) + OR H + OR L + LD HL,(CURRENT_SECTOR.High) + OR H + OR L + RET NZ + ; + PUSH IY + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP IY + ; + LD B,XH + LD C,XL + CALL .set_LOGDRV + LD A,(CURRENT_DRIVE.Removable) + LD (IX + LOGDRV.MediaParameters),A + LD (IX + LOGDRV.PARTITION_RECORD_NUM),#FF + CALL .set_drv_tbl + ; +.exit: AND A RET ; .ParseExtended: LD HL,(EXT_Partition.Low) @@ -970,7 +1024,7 @@ DEFINE_PARTITIONS: GetSectorSize: PUSH IY LD A,(CURRENT_DRIVE.Number) ; sector size - LD C,BIOS.DRV_GET_PAR + LD C,BIOS.DRV_GET_PAR ; [ ] media change заменить на drv_detect ? RST ToBIOS JR NC,.no_err ; diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index afdf8a5..1944926 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -87,7 +87,15 @@ cmd_dir: push de ld hl,Buffers.work.buffer1 ld c,Dss.ChDir rst ToDSS - ;ld a,DSS_Error.sys.NOT_READY + jr nc,.no_error + ; + cp DSS_Error.sys.MEDIA_CHANGED + jp nz,print_err_message + call print_err_message + ; + ld hl,Buffers.work.buffer1 + ld c,Dss.ChDir + rst ToDSS jp c,print_err_message .no_error: ; ld hl,Buffers.bat_params.PRM1 diff --git a/SHELL/Commands/MKDIR.ASM b/SHELL/Commands/MKDIR.ASM index a01c513..141c4d1 100644 --- a/SHELL/Commands/MKDIR.ASM +++ b/SHELL/Commands/MKDIR.ASM @@ -4,14 +4,16 @@ ; ;/////////////////////////////////////////////////// cmd_mkdir: - ex de,hl - ;ld de,T9186 ; буфер - ld de,Buffers.work.buffer1; - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - ;ld hl,T9186 ; имя папки - ld hl,Buffers.work.buffer1; ld c,Dss.MkDir ; создать папку - RST ToDSS - call c,print_err_message ; вывод сообщения - ret + push bc + jp cmd_rmdir.shared + + ; ex de,hl + ; ld de,Buffers.work.buffer1; + ; ld c,Dss.GSwitch ; выделить параметр ком-строки + ; RST ToDSS + ; ld hl,Buffers.work.buffer1 ; имя папки + ; ld c,Dss.MkDir ; создать папку + ; RST ToDSS + ; call c,print_err_message ; вывод сообщения + ; ret diff --git a/SHELL/Commands/REN.ASM b/SHELL/Commands/REN.ASM index 7df2136..4e6c82f 100644 --- a/SHELL/Commands/REN.ASM +++ b/SHELL/Commands/REN.ASM @@ -5,16 +5,12 @@ ;/////////////////////////////////////////////////// cmd_rename: ex de,hl - ;ld de,T9186 ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS - ;ld de,T9206 ld de,Buffers.work.buffer+256; ld c,Dss.GSwitch RST ToDSS - ;ld hl,T9186 - ;ld de,T9206 ld hl,Buffers.work.buffer1; ld de,Buffers.work.buffer+256; ld c,Dss.Rename diff --git a/SHELL/Commands/RMDIR.ASM b/SHELL/Commands/RMDIR.ASM index 86ef838..62b4867 100644 --- a/SHELL/Commands/RMDIR.ASM +++ b/SHELL/Commands/RMDIR.ASM @@ -3,15 +3,16 @@ ; RD, RMDIR. Удалить папку ; ;/////////////////////////////////////////////////// -cmd_rmdir: - ex de,hl - ;ld de,T9186 ; буфер - ld de,Buffers.work.buffer1; - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - ;ld hl,T9186 ; имя папки - ld hl,Buffers.work.buffer1; - ld c,Dss.RmDir ; удалить папку - RST ToDSS - call c,print_err_message ; вывод сообщения - ret +cmd_rmdir: ld c,Dss.RmDir ; создать папку + push bc + ; +.shared: ex de,hl + ld de,Buffers.work.buffer1; + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ld hl,Buffers.work.buffer1 ; имя папки + POP BC + RST ToDSS + ret nc + JP print_err_message ; вывод сообщения +; diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 60b77cf..00aa701 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -60,10 +60,21 @@ COMP: call EVALCMD ; (batch.asm) jr nc,.NOUP and #5F ; a..z -> A..Z .NOUP: sub "A" ; номер диска + ld (.dsk),a ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS - jp c,print_err_message ; вывод сообщения - + jr nc,.no_err + ; + cp DSS_Error.sys.MEDIA_CHANGED + jp nz,print_err_message + ; + call print_err_message +.dsk+1: ld a,0 + ld c,Dss.ChDisk ; сменить тек. диск + RST ToDSS + jp c,print_err_message + ; +.no_err: ;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре ;!TODO доставать Buffers.sys_path отдельно для каждого диска (или в ядре сделать?) ; тест на существование папки на целевом диске diff --git a/SHELL/build.txt b/SHELL/build.txt index 812799a..ee2b836 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -452 \ No newline at end of file +456 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b3224fc..aa0c67b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b3224fc3afac71c6b1d461ff54049e58657bbe5a +Subproject commit aa0c67b6b30b02b1302145cd4d57b708130e2e0a From 5f493aec7ceca21d1fac5bff1bb1ed7b3864a57a Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 22 Feb 2025 06:02:11 +1000 Subject: [PATCH 188/219] -bug in FREE_PROCESS_FMs -bug in Check_0_BPB --- DSS/API/Attribute.asm | 8 ---- DSS/API/ChDir.asm | 8 ---- DSS/API/Create.asm | 14 ------- DSS/API/Delete.asm | 11 +---- DSS/API/Execute.ASM | 22 +--------- DSS/API/Find.asm | 7 ---- DSS/API/MkDir.asm | 9 +--- DSS/API/Open.asm | 7 ---- DSS/API/Rename.asm | 7 ---- DSS/API/RmDir.asm | 7 ---- DSS/API/ScanDRV.asm | 20 --------- DSS/API/Write.asm | 4 +- DSS/API/curDisk.asm | 8 ---- DSS/API/diskINF.asm | 10 +---- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 - DSS/drivers/media/ata_atapi-drv.asm | 64 ++++++++++++----------------- Shared_Includes | 2 +- 19 files changed, 37 insertions(+), 177 deletions(-) diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 27b8259..32d7e02 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -9,14 +9,6 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD C,A ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ; - ENDIF - ; PUSH HL PUSH BC CALL DIR_PATH_CHECK diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index ff2a5a4..68a61d9 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -11,14 +11,6 @@ //////////////////////////////////////////////////////////////////////// CHDIR_FN: ;!TEST Current Dir ;[x] 15/10/23 - ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD A,(EXE_VERSION) - OR A - JR Z,CHDIR - ; - ENDIF ; PUSH HL CALL DIR_PATH_CHECK diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 05de412..e978370 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -7,13 +7,6 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: PUSH HL LD C,A ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; PUSH BC CALL DIR_PATH_CHECK POP BC @@ -42,13 +35,6 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: PUSH HL LD C,A ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; PUSH BC CALL DIR_PATH_CHECK POP BC diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 7f4b863..d11adf1 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -2,16 +2,7 @@ //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -DEL_FN: ;!TEST - ;!TEST Current Dir ;[x] 15/10/23 - ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; +DEL_FN: ;Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index e663ac3..abd4928 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -309,13 +309,6 @@ _TST_PROC: CALL GETMEM PUSH HL ; +2 EXSTACK size for 1 task PUSH DE ; +2 ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD A,(EXE_VERSION) - PUSH AF ; +2 - ; - ENDIF - ; IN A,(SLOT3) LD D,A IN A,(SLOT2) @@ -426,11 +419,6 @@ _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) LD HL,CORE_BUFFERS.CurrentPath LD A,(CORE_BUFFERS.EXEBUFF.VERSION) ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD (EXE_VERSION),A - ; - ENDIF OR A JR NZ,.set_path CALL DIR_PATH_CHANGE.FullCurrent @@ -532,9 +520,6 @@ ENVPATH: DB "PATH=",0 EXE_EXT: DB "EXE" TASK: DB #01 ; уровень текущей программы ; - IF OLD_DSS_FOR_OLD_EXE -EXE_VERSION: DB #01 ; [ ] 10/06/24 - ENDIF RAMMAP: DB #00,#00,#00,#00 ErrorLevel: DB #00 ; код завершения программы (процесса) EXE_FM: DB #00 ; дескр. файла @@ -575,11 +560,6 @@ LEAVE: LD A,B OUT (SLOT2),A LD A,H OUT (SLOT3),A - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - POP AF ; -2 - LD (EXE_VERSION),A - ENDIF ; POP DE ; -2 POP HL ; -2 @@ -655,7 +635,9 @@ FREE_PROCESS_FMs: PUSH DE LD A,FMCOUNT+1 SUB B + PUSH BC CALL CLOSE_FN + POP BC POP DE POP IY .skip: POP AF diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 398de00..1b3466e 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -16,13 +16,6 @@ F_FIRST_FN: CALL F_FIRST.INIT_VARS PUSH HL ;!TEST Current Dir ;[x] 15/10/23 - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; CALL DIR_PATH_CHECK RET C ; diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 703b016..f10fdca 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -14,14 +14,7 @@ MKDIR: RET ; ; Entry point ;!TEST Current Dir ;[x] 15/10/23 -.B: ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.START - ENDIF - ; - PUSH HL +.B: PUSH HL CALL DIR_PATH_CHECK POP HL RET C diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 3972010..4d97c24 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -15,13 +15,6 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO LD (.TMP),A - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; PUSH HL CALL DIR_PATH_CHECK.forceCheck POP HL diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index 2363f36..00769dd 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -10,13 +10,6 @@ ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// RENAME: ;!TEST Current Dir ;[x] 15/10/23 - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; PUSH HL PUSH DE CALL DIR_PATH_CHECK.forceCheck diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 772e8f3..1c40407 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -9,13 +9,6 @@ ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: ;!TEST Current Dir ;[x] 15/10/23 - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.START - ENDIF - ; PUSH HL CALL DIR_PATH_CHECK POP HL diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index b4a7788..fc4b8b2 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -36,13 +36,6 @@ SCANDRV: ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 4. на всякий случай перечитываем дирректорию ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - JR Z,.old_EXE - ENDIF - ; LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' CALL OPENDSK.open @@ -62,19 +55,6 @@ SCANDRV: RET PO EI RET - ; -; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE -.old_EXE: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - CALL OPENDSK - ; - LD HL,CORE_BUFFERS.WorkDirectory - CALL CHDIR - JR NC,.exit - LD HL,CORE_BUFFERS.WorkDirectory - LD (HL),0 - JR .exit - ENDIF .BOOT_DSK_LOST: DZ "Boot drive lost o_O" .BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 93df482..966b006 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -58,11 +58,11 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] JR C,.ERR3 LD C,B LD HL,(.R_POINT) - LD DE,#0200 ;!HARDCODE + LD DE,#0200 ;!HARDCODE sector size .WOV5: ADD HL,DE DJNZ .WOV5 ; B=0 - LD (.R_POINT),HL + LD (.R_POINT),HL ;!FIXIT это значение уже расcчитывается перед выходом в BLOK_WRITE? ;LD B,0 POP HL ADD HL,BC diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index a3e9f3b..3eb0638 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -6,14 +6,6 @@ ; C - номер последнего диска в системе ;///////////////////////////////////////////////////////////////////// CURDISK_FN: - ; - IF OLD_DSS_FOR_OLD_EXE - ; [ ] 10/06/24 - LD A,(EXE_VERSION) - OR A - JR Z,CURDISK - ; - ENDIF LD A,(LDRIVE) LD C,A LD A,(CORE_BUFFERS.CurrentPath) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index e5e2e7a..3e9c421 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -130,15 +130,7 @@ DISKINF: LD C,B CP #FF ; !FIXIT WorkDirectory ;!TEST !Current Dir ;JR Z,CURRDS ;R06 -.CurrentDisk: ; [ ] 10/06/24 - IF OLD_DSS_FOR_OLD_EXE - LD A,(EXE_VERSION) - OR A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - JR Z,.old_EXE - ENDIF - ; - LD A,(CORE_BUFFERS.CurrentPath) +.CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' .old_EXE: LD HL,CORE_BUFFERS.FatBuffer.DRIVE CP (HL) diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 52827e7..7d09fd0 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -24,7 +24,7 @@ ;File Manipulator (FM) ;[ ] fat32 - STRUCT _sFM ; 51 bytes + STRUCT _sFM ; 54 bytes ; from FAT ; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME ; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT diff --git a/DSS/build.txt b/DSS/build.txt index 3cacc0b..3f10ffe 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -12 \ No newline at end of file +15 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 761506b..aec6456 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -102,8 +102,6 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE EnoughtOnly_LF 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 DEFINE NON_REMOVABLE_FDD 0 - ; - DEFINE OLD_DSS_FOR_OLD_EXE 0 ; !TODO ; ;-------------------[MEMORY]-------------------------; diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 59f0fc0..61484db 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -752,7 +752,16 @@ DEFINE_PARTITIONS: PUSH AF LD A,SHARED_PAGE OUT (SLOT3),A + LD A,(Init.count) ; [ ] for ZIP disk A: + PUSH AF ; [ ] for ZIP disk A: CALL .Start + ; [ ] for ZIP disk A: + LD A,(Init.count) + LD B,A + POP AF + CP B + CALL Z,.Check_0_BPB + ; POP AF OUT (SLOT3),A RET @@ -945,42 +954,6 @@ DEFINE_PARTITIONS: ADD IY,DE POP BC DJNZ .DOSAGA - ; -.tst_zipNoMBR: ; [ ] zip no MBR - ; только для Removable media - LD A,(CURRENT_DRIVE.Removable) - AND %0000'0001 - RET Z - ; только для ATAPI - LD A,(CURRENT_DRIVE.Number) - LD B,A - AND #F0 - CP DRIVE_CODES.SPRINTER.ATAPI - JR NZ,.exit - ; - XOR A - LD HL,(CURRENT_SECTOR.Low) - OR H - OR L - LD HL,(CURRENT_SECTOR.High) - OR H - OR L - RET NZ - ; - PUSH IY - LD A,B - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP IY - ; - LD B,XH - LD C,XL - CALL .set_LOGDRV - LD A,(CURRENT_DRIVE.Removable) - LD (IX + LOGDRV.MediaParameters),A - LD (IX + LOGDRV.PARTITION_RECORD_NUM),#FF - CALL .set_drv_tbl - ; .exit: AND A RET ; @@ -1019,7 +992,24 @@ DEFINE_PARTITIONS: RST ToBIOS POP IY RET - + ; +.Check_0_BPB: LD A,(CURRENT_DRIVE.Number) + CP DRIVE_CODES.SPRINTER.ATAPI + RET C + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + RET C + ; + LD B,XH + LD C,XL + CALL .set_LOGDRV + LD A,(CURRENT_DRIVE.Removable) + LD (IX + LOGDRV.MediaParameters),A + LD (IX + LOGDRV.PARTITION_RECORD_NUM),#FF + CALL .set_drv_tbl + JP INC_DRV_COUNT + ; +; ; ; GetSectorSize: PUSH IY LD A,(CURRENT_DRIVE.Number) diff --git a/Shared_Includes b/Shared_Includes index aa0c67b..2b1e30c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit aa0c67b6b30b02b1302145cd4d57b708130e2e0a +Subproject commit 2b1e30c6108f0a5c271f84558e1e5f804a6d623a From dd2a134ad316c9dd04d01b4964584079a84cdea9 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 25 Feb 2025 02:31:27 +1000 Subject: [PATCH 189/219] =?UTF-8?q?EXEC:=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B5=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=B0=20EXE=20=D0=B1=D0=B5=D0=B7=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D1=87=D0=B8=D0=BA=D0=B0=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Attribute.asm | 2 +- DSS/API/Create.asm | 8 ++++++-- DSS/API/Delete.asm | 2 +- DSS/API/Execute.ASM | 7 ++++--- DSS/API/Find.asm | 2 +- DSS/API/Open.asm | 1 - DSS/API/Rename.asm | 1 - DSS/API/diskINF.asm | 2 +- DSS/build.txt | 2 +- 9 files changed, 15 insertions(+), 12 deletions(-) diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 32d7e02..41343d6 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -15,7 +15,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 POP BC POP HL RET C -.old_EXE: LD A,C + LD A,C ; ; INC B diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index e978370..acf7260 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -12,7 +12,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: POP BC POP HL RET C -.old_EXE: LD A,C + LD A,C ; CALL .Prepare RET C @@ -40,7 +40,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: POP BC POP HL RET C -.old_EXE_: LD A,C + LD A,C ; CALL .Prepare RET C @@ -98,6 +98,10 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: CALL CHECK_64kb_CLUSTER RET C ; + ; [ ] 25/02/2025 - файл не создастся, если нет свободного манипулятора + CALL GET_FM + RET C + ; JP MASK ; ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index d11adf1..e5e92f0 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -8,7 +8,7 @@ DEL_FN: ;Current Dir ;[x] 15/10/23 POP HL RET C ; -.old_EXE: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск + CALL SetPath_GetName ; тест на допуст. имя и настр. на диск RET C ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index abd4928..71264ef 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -219,6 +219,7 @@ EXEC02: LD (EXE_FM),A LD (_ret),HL JP _TST_PROC ; +; Запуск без загрузчика .RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) XOR A LD H,A @@ -228,9 +229,8 @@ EXEC02: LD (EXE_FM),A LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла - ;!TEST ;[x] no close source EXE file before start 08/11/23 - ; LD A,(EXE_FM) ; дескр. файла - ; CALL CLOSE ; закрыть файл + LD A,(EXE_FM) ; дескр. файла + CALL CLOSE_FN ; закрыть файл ; JP _TST_PROC_2 ; @@ -291,6 +291,7 @@ NOINK2: LD HL,_RET_2 LD (_ret),HL JR _TST_PROC ; +; Запуск с загрузчиком _RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт LD A,(EXE_FM) ; дескр. файла diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 1b3466e..ece270c 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -19,7 +19,7 @@ F_FIRST_FN: CALL F_FIRST.INIT_VARS CALL DIR_PATH_CHECK RET C ; -.old_EXE: POP HL + POP HL JR F_FIRST.begin ; F_FIRST: CALL .INIT_VARS diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 4d97c24..1380eb9 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -19,7 +19,6 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 CALL DIR_PATH_CHECK.forceCheck POP HL RET C -.old_EXE: ;JR .start ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; .start: CALL SetPath_GetName diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index 00769dd..928356c 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -17,7 +17,6 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 POP HL RET C ; -.old_EXE: ; ; !TODO воткнуть тут SetPath_GetName, чтоб можно было удалять по относительным путям? ; ; [ ] 26/06/2024 diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 3e9c421..f802a6d 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -132,7 +132,7 @@ DISKINF: LD C,B ;JR Z,CURRDS ;R06 .CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' -.old_EXE: LD HL,CORE_BUFFERS.FatBuffer.DRIVE + LD HL,CORE_BUFFERS.FatBuffer.DRIVE CP (HL) JR Z,.CheckFreeSpace ; diff --git a/DSS/build.txt b/DSS/build.txt index 3f10ffe..19c7bdb 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -15 \ No newline at end of file +16 \ No newline at end of file From 1fa6c70b51087f251762a4288fc0d087ab72551c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 26 Feb 2025 05:31:35 +1000 Subject: [PATCH 190/219] =?UTF-8?q?-bug=20in=20=5FTST=5FPROC=5F2=20-=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B3=20=D0=B7=D0=B0=D0=BB=D0=B5=D0=B7=D1=82=D1=8C?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=B2=20=D1=82=D1=83=20=D0=BF=D0=B0=D0=BF?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D0=BA=D0=BE=D0=BC=20=D0=BF=D1=80=D0=B8=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=20=D1=84=D0=BB?= =?UTF-8?q?=D0=B0=D0=B3=D0=BE=D0=BC=20CurrentDIr=20=3D=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Execute.ASM | 1 + DSS/DSS-MAIN.ASM | 2 ++ DSS/build.txt | 2 +- SHELL/build.txt | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 71264ef..c4c9fc6 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -423,6 +423,7 @@ _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) OR A JR NZ,.set_path CALL DIR_PATH_CHANGE.FullCurrent + LD HL,CORE_BUFFERS.CurrentPath .set_path: CALL CHDIR_FN POP IX ; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 51b6249..0b896b7 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -514,6 +514,8 @@ CLEAR_ZONE.size EQU _sBuffers EXPORT CORE_BUFFERS.BUFFER EXPORT CORE_BUFFERS.SECTOR_BUFFER EXPORT CORE_BUFFERS.MemoryTable + EXPORT CORE_BUFFERS.CurrentDirectory + EXPORT CORE_BUFFERS.WorkDirectory /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FM_BUF _sFM=$ diff --git a/DSS/build.txt b/DSS/build.txt index 19c7bdb..8e2afd3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -16 \ No newline at end of file +17 \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index ee2b836..2da4325 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -456 \ No newline at end of file +457 \ No newline at end of file From 29df4ae54f0d2553ed10531823480aae30132ed6 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 1 Mar 2025 06:48:37 +1000 Subject: [PATCH 191/219] bugs... --- DSS/API/Open.asm | 1 + DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 70 +++++++++++++++++++++-------- 3 files changed, 54 insertions(+), 19 deletions(-) diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 1380eb9..7d58a86 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -50,6 +50,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.ACCESS_MODE),A LD A,(TASK) LD (IY+_sFM.TASK_NUM),A + ;!FIXIT оптимизнуть тут зануление XOR A LD (IY+_sFM.OptimizedClusters),A LD (IY+_sFM.KnownCluster_L),A diff --git a/DSS/build.txt b/DSS/build.txt index 8e2afd3..8fdd954 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -17 \ No newline at end of file +22 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 61484db..03e7307 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -322,7 +322,12 @@ Init: PUSH IY ; RET NC ; LD A,DSS_Error.drv.UNKNOWN_FORMAT ; RET +; ; переделать тут проверку на размер сектора? +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER SelectDrive: PUSH DE PUSH HL ; @@ -333,19 +338,21 @@ SelectDrive: PUSH DE ; LOGDRV_ENTRY_FIND LOGDRV ; - ; [ ] custom sector size - CALL CHECK_IDE_SECTOR_SIZE - LD A,DSS_Error.sys.UNKNOWN_FORMAT - JR C,.error_pop - ; - ; - LD E,(IY+LOGDRV.SECTOR_OFFSET) - LD D,(IY+LOGDRV.SECTOR_OFFSET+1) - ADD IX,DE - LD E,(IY+LOGDRV.SECTOR_OFFSET+2) - LD D,(IY+LOGDRV.SECTOR_OFFSET+3) + ; ; [ ] custom sector size + ; CALL CHECK_IDE_SECTOR_SIZE + ; LD A,DSS_Error.sys.UNKNOWN_FORMAT + ; JR C,.error_pop + ; ; + ; ; + ; LD E,(IY+LOGDRV.SECTOR_OFFSET) + ; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) + ; ADD IX,DE + ; LD E,(IY+LOGDRV.SECTOR_OFFSET+2) + ; LD D,(IY+LOGDRV.SECTOR_OFFSET+3) POP HL - ADC HL,DE + CALL .get_data + JR C,.error_pop2 + ; POP DE LD A,DSS_Error.drv.SECTOR_NOT_FOUND RET C @@ -354,8 +361,23 @@ SelectDrive: PUSH DE RET ; .error_pop: POP HL - POP DE +.error_pop2: POP DE RET + ; +.get_data: ; [ ] custom sector size + CALL CHECK_IDE_SECTOR_SIZE + LD A,DSS_Error.sys.UNKNOWN_FORMAT + RET C + ; + LD E,(IY+LOGDRV.SECTOR_OFFSET) + LD D,(IY+LOGDRV.SECTOR_OFFSET+1) + ADD IX,DE + LD E,(IY+LOGDRV.SECTOR_OFFSET+2) + LD D,(IY+LOGDRV.SECTOR_OFFSET+3) + ADC HL,DE + LD A,DSS_Error.sys.SECTOR_NOT_FOUND + RET + ; 00 - GET DEVICE PARAMETERS @@ -620,19 +642,29 @@ MediaCheck: PUSH IY ; POP AF ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 POP IY - RET C + RET C XOR A RET ; -.Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) +.Reinit: LD A,DSS_MAX_DRIVES_AMOUNT - 1 ; ограничитель, чтоб не детектить больше 1 раздела + LD (Init.count),A + LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD (CURRENT_DRIVE.Number),A LD (LOGDRV_OFFSET),IY ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS + PUSH IY CALL DEFINE_PARTITIONS - POP AF POP IY - RET C ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 - LD A,#FF ;!HARDCODE drive changed + POP AF ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 + CALL C,SelectDrive.get_data + POP IY + JR NC,.no_errors + ; + CP DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET Z + ; +.no_errors: LD A,#FF ;!HARDCODE drive changed OR A RET @@ -644,8 +676,10 @@ CHECK_IDE_SECTOR_SIZE: ; LD HL,DSS_MAX_SECTOR_SIZE ; AND A ; SBC HL,DE + PUSH HL LD HL,-DSS_MAX_SECTOR_SIZE - 1 ADD HL,DE + POP HL RET ; From d47e126730c5631c36c9a0ad72e47bb62b137bd3 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 2 Mar 2025 23:24:40 +1000 Subject: [PATCH 192/219] ... --- DSS/API/Open.asm | 3 ++- DSS/DOS_Proc.asm | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 2 +- SHELL/EXEC.ASM | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 7d58a86..f077c71 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -21,7 +21,8 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 RET C ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; -.start: CALL SetPath_GetName +;.start: ; + CALL SetPath_GetName RET C CALL MASK RET C diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 264b838..696efd3 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -103,7 +103,7 @@ SetPath_GetName: JR C,.next CP 'z'+1 JR NC,.next - SUB #20 + SUB %0010'0000 .next: SUB 'A' INC HL INC HL diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 03e7307..4c97955 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -670,7 +670,7 @@ MediaCheck: PUSH IY ; [ ] custorm sector size -CHECK_IDE_SECTOR_SIZE: +CHECK_IDE_SECTOR_SIZE: ;RET LD E,(IY+LOGDRV.SECTOR_SIZE) LD D,(IY+LOGDRV.SECTOR_SIZE+1) ; LD HL,DSS_MAX_SECTOR_SIZE diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 00aa701..70f520f 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -39,6 +39,7 @@ COMP: call EVALCMD ; (batch.asm) .start: call RUN_COMMAND jr nc,.skip ; NC если не найдена команда jp (hl) + ; .skip: ; Не дос-команды. Тест на задание диска и запуск файла ld h,d ld l,e From c19ce52143220e235b1331d61f474e82f0ef1f1a Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 6 Mar 2025 03:31:14 +1000 Subject: [PATCH 193/219] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS_Proc.asm | 10 ------- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 45 ++++++++++++++++------------- SHELL/Commands/DIR.ASM | 8 +++-- SHELL/Commands/PAUSE.ASM | 2 +- SHELL/Messages/main_txt.asm | 6 +++- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 8 files changed, 40 insertions(+), 37 deletions(-) diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 696efd3..191715f 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -233,16 +233,6 @@ OPENDSK: ;!TEST DRV.Open ; LD A,DSS_Error.sys.NOT_READY RET - -/* -0000 0010 02 -0001 1100 1c -0000 1101 0d - -0001 0011 -*/ - - ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed .error_bpb: PUSH AF ; сохраняем номер ошибки diff --git a/DSS/build.txt b/DSS/build.txt index 8fdd954..cabf43b 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -22 \ No newline at end of file +24 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 4c97955..8934286 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -323,11 +323,16 @@ Init: PUSH IY ; LD A,DSS_Error.drv.UNKNOWN_FORMAT ; RET ; -; переделать тут проверку на размер сектора? -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER + + +; A - HDD LOG NUMBER +SelectDrive.NoSector: + LD HL,0 + LD IX,0 + ;HL:IX - SECTOR + ; DE - ADDRESS + ; B - COUNTER + ; A - HDD LOG NUMBER SelectDrive: PUSH DE PUSH HL ; @@ -354,8 +359,8 @@ SelectDrive: PUSH DE JR C,.error_pop2 ; POP DE - LD A,DSS_Error.drv.SECTOR_NOT_FOUND - RET C + ; LD A,DSS_Error.sys.SECTOR_NOT_FOUND + ; RET C ; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) RET @@ -496,10 +501,7 @@ GetParams: EX DE,HL PUSH HL PUSH DE PUSH BC - LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) - LD (CURRENT_DRIVE.Number),A - LD (LOGDRV_OFFSET),IY - CALL DEFINE_PARTITIONS + CALL ReDEFINE_PARTITIONS POP BC POP DE POP HL @@ -613,7 +615,7 @@ Open: CALL MediaCheck ; POP IY ; RET MediaCheck: PUSH IY - CALL SelectDrive + CALL SelectDrive.NoSector JR NC,.next_step ; CP DSS_Error.sys.UNKNOWN_FORMAT @@ -646,14 +648,8 @@ MediaCheck: PUSH IY XOR A RET ; -.Reinit: LD A,DSS_MAX_DRIVES_AMOUNT - 1 ; ограничитель, чтоб не детектить больше 1 раздела - LD (Init.count),A - LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) - LD (CURRENT_DRIVE.Number),A - LD (LOGDRV_OFFSET),IY - ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS - PUSH IY - CALL DEFINE_PARTITIONS +.Reinit: PUSH IY + CALL ReDEFINE_PARTITIONS POP IY POP AF ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 CALL C,SelectDrive.get_data @@ -683,6 +679,15 @@ CHECK_IDE_SECTOR_SIZE: ;RET RET ; +ReDEFINE_PARTITIONS: + LD A,DSS_MAX_DRIVES_AMOUNT - 1 ; ограничитель, чтоб не детектить больше 1 раздела + LD (Init.count),A + LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) + LD (CURRENT_DRIVE.Number),A + LD (LOGDRV_OFFSET),IY + ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS + JP DEFINE_PARTITIONS + ;HL:IX - SECTOR ; DE - ADDRESS diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 1944926..1a03623 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -136,13 +136,17 @@ cmd_dir: push de .key_p+1: and #ff dec a jr nz,.skip_wait - ld de,MAIN_MSG.PAUSE + ld de,MAIN_MSG.DIRPAUSE call ECHO_MESSAGE ; вывести строку ld c,Dss.WaitKey rst ToDSS + PUSH DE + ld de,MAIN_MSG.CLSLINE + call ECHO_MESSAGE + POP DE dec d ld de,MAIN_MSG.DIR_ESCAPE - jp z,ECHO_MESSAGE ; закончить по ESC + jp z,ECHO_MESSAGE ; закончить по ESC ;jr nz,.skip_esc ;xor a ;ld (.key_p),a ; отменяем ESC diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index c852082..0c39baf 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -4,7 +4,7 @@ ; ;/////////////////////////////////////////////////// cmd_pause: - LD de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." + LD de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." CALL ECHO_MESSAGE ; вывод строки LD A,LF LD C,Dss.PutChar diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 4237a7e..f274f7d 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -24,6 +24,8 @@ MAIN_MSG: .CRLF EQU .CRLF_ .INFO_1 EQU .INFO_1_ .INFO_2 EQU .INFO_2_ +.DIRPAUSE EQU .DIRPAUSE_ +.CLSLINE EQU .CLSLINE_ ; !txtCounter DEFL 0 ; ; не сдвигать____ @@ -40,7 +42,7 @@ MAIN_MSG: stN .DATE_ : DZ "Current date: %1, %2\r\n" ; [x] вывод дня недели 26/01/2023 stN .TIME_ : DZ "Current time: %1\r\n" stN .PAUSE_ : DZ "Press any key to continue . . .\r" - stN .DIR_ESC_ : DZ "Command 'DIR' aborted by user \r\n\n" + stN .DIR_ESC_ : DZ "Command 'DIR' cancelled by user\r\n\n" stN .INV_ : DZ "Invalid parametr\r\n" stN .ECHO_ : DZ "Echo is %1\r\n" stN .ON_ : DZ "on" @@ -57,6 +59,8 @@ MAIN_MSG: stN .CALC_ : DZ "Calculating free space...\r" stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5\r\n" + stN .DIRPAUSE_ : DZ "Press ESC to cancel or any other key to continue . . .\r" + stN .CLSLINE_ : DZ " \r" ; ;R11 db 0 DZ "Unknown command" diff --git a/SHELL/build.txt b/SHELL/build.txt index 2da4325..4754f24 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -457 \ No newline at end of file +461 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 2b1e30c..60b5ff6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 2b1e30c6108f0a5c271f84558e1e5f804a6d623a +Subproject commit 60b5ff6a74b57614b1f54fbe5611585cd46582ab From 78c229e75a9b03b78930e1f3312b9f9ffcfeca7c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 7 Mar 2025 23:09:47 +1000 Subject: [PATCH 194/219] =?UTF-8?q?DiskINF:=20=D0=BA=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8B=D0=BB=D1=8C=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D1=82=D1=80?= =?UTF-8?q?=D0=B8=D0=B1=D1=83=D1=82=D0=B0=200.=20=D0=9D=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=8F=D0=BB=20=D0=A1=D0=B0=D0=B2=D0=B5=D0=BB=D0=B8=D0=B9?= =?UTF-8?q?))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Execute.ASM | 26 +++++-- DSS/API/diskINF.asm | 10 ++- DSS/FS/FAT.asm | 182 ++++++++++++++++++++++---------------------- DSS/build.txt | 2 +- Shared_Includes | 2 +- 5 files changed, 119 insertions(+), 103 deletions(-) diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index c4c9fc6..def5b39 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -540,19 +540,26 @@ EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ; ; ; Выход из EXE-файла: ; -; 1) Освобождаются все блоки памяти которые выделялась данному приложению. -; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. -; 3) Вспоминается стек. -; 4) В регистр A помещается код возврата и выполняется RET. +; 1) Освобождаются все блоки памяти которые выделялись данному приложению. +; 2) Закрываются все файлы открытые приложением +; 3) Восстанавливаются страницы которые были подключены до запуска EXE-файла. +; 4) Вспоминается стек. +; 5) В регистр A помещается код возврата и выполняется RET. ; ;///////////////////////////////////////////////////////////////////// -LEAVE: LD A,B +LEAVE: LD A,R + PUSH AF ; INT ON/OFF + DI + ; + LD A,B LD (ErrorLevel),A CALL FREE_PROCESS_MEMORY ;[x] 10/12/23 close EXE FMs CALL FREE_PROCESS_FMs ; - _mDECTASK + _mDECTASK + ; + POP DE ; INT ON/OFF LD SP,(EXSTACK) ; тут стек в нулевой странице! POP AF ; -2 EXSTACK size for 1 task @@ -563,14 +570,17 @@ LEAVE: LD A,B LD A,H OUT (SLOT3),A ; + LD A,E ; INT ON/OFF POP DE ; -2 POP HL ; -2 LD (EXSTACK),SP LD SP,HL ; ;!TEST - ;EI - ; + AND %0000'0100 ; PO/PE flag + JR Z,.no_ei + EI +.no_ei: ; EX DE,HL LD A,(ErrorLevel) ;R12 diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index f802a6d..12e9bc9 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -245,11 +245,17 @@ GET_LABEL: PUSH DE LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома LD B,high Dss.F_First.FATname CALL F_FIRST - ;LD BC,Dss.F_First.FATname ; f_first, формат 11 - ;RST ToDSS POP DE LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL RET C + ; [ ] 07/03/2025 костыль для атрибута 0. Настоял Савелий)) + LD HL,BUFFER_FIND.REC_Attr + ADD HL,DE + LD A,(HL) + OR A + SCF + RET Z + ; LD HL,BUFFER_FIND.REC_Name ADD HL,DE RET diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 69ce24f..f353292 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -130,99 +130,99 @@ DELETE_LFN_RECORDS: ; (HANDBUF) = file's direcory record ; CF - каталог не найден SEARCH: -.Dir: ;LD A,FAT_ATTR.DIRECTORY - LD A,FAT_ATTR.HiddenSysDir - CALL .Custom - RET NC - CP DSS_Error.sys.PATH_NOT_FOUND + 1 - RET C - ; - SCF - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - RET - ; -.File: LD A,FAT_ATTR.NoDIRnoVolID -.Custom: EX AF,AF' ; A = 76ADLSHR - SET_PAGE_X DIRPAGE - ;PUSH AF - EX AF,AF' - ; - CPL - LD C,A - LD IX,DIRPAGE.buffer - ;!TEST 9/11/23 record index - ; оптимизация для индекса записи в списке каталога. - ; Понадобится вернуть для перебора каталога > #4000 байт - ; EXX - ; LD DE,0 - ; EXX - ; -.loop: LD A,(IX+FAT_DIRECTORY_RECORD.NAME) - OR A - JR Z,.error_file_not_found - CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.next_record - LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) - AND C - JR NZ,.next_record - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 - EX DE,HL -.loop_compare: - LD A,(DE) - CP '?' - JR Z,.next_char - CP (HL) - JR NZ,.next_record -.next_char: - INC HL - INC DE - DJNZ .loop_compare - ; - LD D,XH - LD E,XL - ;!TEST 9/11/23 record index - ; EXX - ; PUSH DE - ; EXX - PUSH IX - ; - LD HL,HANDBUF - EX DE,HL - LD BC,HANDBUF.SIZE - LDIR - ;!TEST 9/11/23 record index - POP DE - ; - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - AND A - RET -.next_record: - LD DE,FAT_DIRECTORY_RECORD - ;!TEST 9/11/23 record index - ; EXX - ; INC DE - ; EXX - ; - ADD IX,DE - JR NC,.loop +.Dir: ;LD A,FAT_ATTR.DIRECTORY + LD A,FAT_ATTR.HiddenSysDir + CALL .Custom + RET NC + CP DSS_Error.sys.PATH_NOT_FOUND + 1 + RET C + ; + SCF + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + RET + ; +.File: LD A,FAT_ATTR.NoDIRnoVolID +.Custom: EX AF,AF' ; A = 76ADLSHR + SET_PAGE_X DIRPAGE + ;PUSH AF + EX AF,AF' + ; + CPL + LD C,A + LD IX,DIRPAGE.buffer + ;!TEST 9/11/23 record index + ; оптимизация для индекса записи в списке каталога. + ; Понадобится вернуть для перебора каталога > #4000 байт + ; EXX + ; LD DE,0 + ; EXX + ; +.loop: LD A,(IX+FAT_DIRECTORY_RECORD.NAME) + OR A + JR Z,.error_file_not_found + CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены + JR Z,.next_record + LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + AND C + JR NZ,.next_record + ; +.not_zero_attr: LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +.loop_compare: LD A,(DE) + CP '?' + JR Z,.next_char + CP (HL) + JR NZ,.next_record + ; +.next_char: INC HL + INC DE + DJNZ .loop_compare + ; + LD D,XH + LD E,XL + ;!TEST 9/11/23 record index + ; EXX + ; PUSH DE + ; EXX + PUSH IX + ; + LD HL,HANDBUF + EX DE,HL + LD BC,HANDBUF.SIZE + LDIR + ;!TEST 9/11/23 record index + POP DE + ; + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + AND A + RET + ; +.next_record: LD DE,FAT_DIRECTORY_RECORD + ;!TEST 9/11/23 record index + ; EXX + ; INC DE + ; EXX + ; + ADD IX,DE + JR NC,.loop .error_too_many_files: - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - SCF - RET - ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET + ; .error_file_not_found: - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.FILE_NOT_FOUND - SCF - RET + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.FILE_NOT_FOUND + SCF + RET ;----------------------------------------------------------------------; ; diff --git a/DSS/build.txt b/DSS/build.txt index cabf43b..978b4e8 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -24 \ No newline at end of file +26 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 60b5ff6..d22e7b9 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 60b5ff6a74b57614b1f54fbe5611585cd46582ab +Subproject commit d22e7b9aae7efe3d24bdf767e057abc51e37ea2d From 82638cabee2e8b102c781f68eda77d78fbb502a6 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 14 Mar 2025 01:19:42 +1000 Subject: [PATCH 195/219] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=87=D0=B8=20=D1=88=D1=80=D0=B8=D1=84=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=84=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BE=D0=BA=D0=BD=D0=B0=20=D0=B2=20=D1=81=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=20(=D1=81=D0=BF=D0=B5=D0=BA=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BC=D0=BE=D0=B2=D1=81=D0=BA=D0=BE=D0=B9)=20=D0=B0=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D1=8D?= =?UTF-8?q?=D0=BA=D1=80=D0=B0=D0=BD=D0=B5=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/SetVMod.asm | 35 ++++++++++++++++++++--------------- DSS/KEYINTER.ASM | 14 ++++++++------ DSS/build.txt | 2 +- Shared_Includes | 2 +- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/DSS/API/SetVMod.asm b/DSS/API/SetVMod.asm index aef9699..1a85fa6 100644 --- a/DSS/API/SetVMod.asm +++ b/DSS/API/SetVMod.asm @@ -36,14 +36,14 @@ SETVMOD: CP %1000'0000 ; Установка граф. режимов .GRAPH: CALL SAVETXT AND #7F - JR Z,.G320_16 ; !TODO ? - пока отрабатывает как ошибка + JR Z,.G320_16c ; !TODO заменить на существующий режим DEC A - JR Z,.G320_56 + JR Z,.G320_256c DEC A - JR Z,.G640_16 + JR Z,.G640_16c ;DEC A - ;JP Z,.G640_56 ; !TODO ? - пока отрабатывает как ошибка -.G320_16: LD A,DSS_Error.sys.INVALID_VIDEO_MODE + ;JP Z,.G640_256c ; !TODO заменить на существующий режим +.G320_16c: LD A,DSS_Error.sys.INVALID_VIDEO_MODE SCF RET ; @@ -71,7 +71,7 @@ SETVMOD: CP %1000'0000 XOR A RET ; -.G320_56: PUSH BC +.G320_256c: PUSH BC LD HL,TAB_320x256_0 LD E,#11 CALL SETMODE @@ -79,7 +79,7 @@ SETVMOD: CP %1000'0000 LD E,#00 JP .SETMODE_END ; -.G640_16: PUSH BC +.G640_16c: PUSH BC LD HL,TAB_640x256_0 LD E,#11 CALL SETMODE @@ -96,10 +96,10 @@ VMODE: DB #03 ; ;02h - TEXT 40 x 32 (16 colors) ;03h - TEXT 80 x 32 (16 colors) -;80h - GRAF 320 x 256 (16 colors) +;80h - GRAF 320 x 256 (16 colors) ;!TODO занять другим ;81h - GRAF 320 x 256 (256 colors) ;82h - GRAF 640 x 256 (16 colors) -;83h - GRAF 640 x 256 (256 colors) UNUSED +;83h - GRAF 640 x 256 (256 colors) ;!TODO занять другим ;----------------------------------------------------------------------- SETMODE: PUSH DE LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса. @@ -140,20 +140,25 @@ SETMODE: PUSH DE ;+7 Y полож. в поле графики (в знакоместах) ScreenDescriptorTable EQU $ ; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген. -TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1 +TAB_80x32 DB 40,32,0,0,%0001'1011,0,0,0 ;1 ; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген. -TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2 +TAB_40x32 DB 40,32,0,0,%0011'1011,0,0,0 ;2 ; 640x256. графическое, 0-й экран -TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3 +TAB_640x256_0 DB 40,32,0,0,%0000'0000,0,0,0 ;3 ; 320x256. графическое, 0-й экран -TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4 +TAB_320x256_0 DB 40,32,0,0,%0010'0000,0,0,0 ;4 ; 640x256. графическое, 1-й экран -TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5 +TAB_640x256_1 DB 40,32,0,0,%0100'0000,0,40,0 ;5 ; 320x256. графическое, 1-й экран -TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6 +TAB_320x256_1 DB 40,32,0,0,%0110'0000,0,40,0 ;6 ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 ;....................................................................... ; +/* +PIC_320X256_1: + DB 40,32,0,0,32,0,8,0 + DB 0, 0,0,0, 0,0,0,0 +*/ ;----------------------------------------------------------------------- ; Сохранить экран текст. режима. diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 18535e4..ab2b08b 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -184,11 +184,13 @@ ECHOKEY: ;R01 ELSE ;------------------------------; -delay_curs: EQU 11 ; частота мигания курсора -INS_CUR_ZG: EQU #19 -CURSOR_ZG: EQU #1A -NORM_ZG: EQU #1B +;------; !FIXIT брать значения для знакогенератора из биоса? +delay_curs: EQU 11 ; частота мигания курсора +INS_CUR_ZG: EQU #9B ; [x] 14/03/2025 был баг для графических экранов режима спектрума +CURSOR_ZG: EQU #5B ; [x] 14/03/2025 был баг для графических экранов режима спектрума +NORM_ZG: EQU #1B +;------; ECHOKEY: CALL Cursor_On ; вкл. курсор, установить фокус на "Input Line" EI @@ -314,8 +316,8 @@ SETUP_CURSORS: ldir ld de,.buffer ; знакоген. ld c,BIOS.WIN_SET_ZG ; уст. знакоген. - rst ToBIOS - ret + jp ToBIOS + ;ret ; ENDIF ;------------------------------; diff --git a/DSS/build.txt b/DSS/build.txt index 978b4e8..a5c750f 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -26 \ No newline at end of file +27 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index d22e7b9..7c03abc 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d22e7b9aae7efe3d24bdf767e057abc51e37ea2d +Subproject commit 7c03abc82040df54cec2bc6701b0f602fa08fd26 From ec748f630cad49ced5bdaabddeee356e84890b19 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 24 Mar 2025 01:31:46 +1000 Subject: [PATCH 196/219] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20HELP=20?= =?UTF-8?q?=D0=B2=20SHELL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SHELL/Messages/main_txt.asm | 12 ++++++------ SHELL/build.txt | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index f274f7d..c9c7b0c 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -50,11 +50,12 @@ MAIN_MSG: stN .DIR_2_ : db "\r\n %3 File(s)\r %1 byte(s)\r\n" DZ " %4 Dir(s)\r %5 byte(s) capacity\r\n" stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" - stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT + stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT + ;!TODO печатать не через ECHO_MESSAGE stN .HELP_ : db "COMMANDS:\r\n" - db "CLS INFO REN = RENAME PATH HELP \r\n" - db "CD = CHDIR DEL = ERASE SET VER = VERSION \r\n" - db "MD = MKDIR TIME ECHO EXIT \r\n" + db "SET INFO REN = RENAME PATH CLS [ink] " + db "CD = CHDIR DEL = ERASE HELP VER = VERSION " + db "MD = MKDIR TIME ECHO EXIT " DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" @@ -68,5 +69,4 @@ MAIN_MSG: .TABLE.Size EQU $-.TABLE ; !txtCounter=0 -; - ; \ No newline at end of file +; \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 4754f24..88101bc 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -461 \ No newline at end of file +465 \ No newline at end of file From e17ef7d91889849c475613fdee15f79d344d2e4a Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 25 Mar 2025 01:05:24 +1000 Subject: [PATCH 197/219] =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D0=B2=D0=BC?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BA?= =?UTF-8?q?=D1=83=D1=80=D1=81=D0=BE=D1=80=D0=B0=20=D1=81=20txt=2040x32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/SetVMod.asm | 8 +++++++- DSS/KEYINTER.ASM | 42 ++++++++++++++++++++++++++++-------------- DSS/build.txt | 2 +- SHELL/build.txt | 2 +- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/DSS/API/SetVMod.asm b/DSS/API/SetVMod.asm index 1a85fa6..46b49fc 100644 --- a/DSS/API/SetVMod.asm +++ b/DSS/API/SetVMod.asm @@ -139,16 +139,22 @@ SETMODE: PUSH DE ;+6 X полож. в поле графики (в знакоместах) ;+7 Y полож. в поле графики (в знакоместах) ScreenDescriptorTable EQU $ + ; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген. TAB_80x32 DB 40,32,0,0,%0001'1011,0,0,0 ;1 + ; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген. TAB_40x32 DB 40,32,0,0,%0011'1011,0,0,0 ;2 + ; 640x256. графическое, 0-й экран TAB_640x256_0 DB 40,32,0,0,%0000'0000,0,0,0 ;3 + ; 320x256. графическое, 0-й экран TAB_320x256_0 DB 40,32,0,0,%0010'0000,0,0,0 ;4 + ; 640x256. графическое, 1-й экран TAB_640x256_1 DB 40,32,0,0,%0100'0000,0,40,0 ;5 + ; 320x256. графическое, 1-й экран TAB_320x256_1 DB 40,32,0,0,%0110'0000,0,40,0 ;6 ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 @@ -182,7 +188,7 @@ SAVETXT: PUSH AF LD (BACKTXT.CURS),DE POP AF LD IX,#C000 - LD HL,#2050 + LD HL,#2050 ;!FIXIT если текстовое 40x32? OR A JR NZ,.SVTEXT1 LD L,#28 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index ab2b08b..934dbf9 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -186,7 +186,7 @@ ECHOKEY: ;R01 ;------; !FIXIT брать значения для знакогенератора из биоса? -delay_curs: EQU 11 ; частота мигания курсора +delay_curs: EQU 11 ; частота мигания курсора INS_CUR_ZG: EQU #9B ; [x] 14/03/2025 был баг для графических экранов режима спектрума CURSOR_ZG: EQU #5B ; [x] 14/03/2025 был баг для графических экранов режима спектрума NORM_ZG: EQU #1B @@ -210,7 +210,7 @@ ECHOKEY: CALL Cursor_On ; AND A RET -Cursor: +Cursor: ;!TODO логичнее курсором моргать и шрифты менять из биоса же? .Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть CPL LD (.Flag),A @@ -221,17 +221,26 @@ Cursor_On: LD C,BIOS.LP_GET_PLACE ; узн XOR A LD C,BIOS.WIN_GET_SYM ; получить символ RST ToBIOS + ; + LD A,%0010'0000 + AND B + LD (.char_size),A ; [ ] 24/03/2025 сохраняем тип квадратика 80/40 символов + ; LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран LD A,(Cursor.Flag) OR A - JR Z,.put_ + JR Z,.put LD B,INS_CUR_ZG ; блок LD A,(KEYFLAG) ; флаги клавы AND 1< Date: Fri, 28 Mar 2025 03:23:22 +1000 Subject: [PATCH 198/219] tests --- DSS/API/SetVMod.asm | 3 +-- DSS/KEYINTER.ASM | 34 +++++++++++++++++----------------- SHELL/Commands/HELP.ASM | 20 +++++++++++++++++--- SHELL/Messages/main_txt.asm | 14 +++++++------- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 6 files changed, 44 insertions(+), 31 deletions(-) diff --git a/DSS/API/SetVMod.asm b/DSS/API/SetVMod.asm index 46b49fc..da58ae6 100644 --- a/DSS/API/SetVMod.asm +++ b/DSS/API/SetVMod.asm @@ -171,7 +171,6 @@ PIC_320X256_1: ; Для буфера экрана исп. 2-я банка расширения ДОС. SAVETXT: PUSH AF LD A,(VMODE) - ;BIT 7,A CP %1000'0000 JR NC,.NOSAVET SUB #02 @@ -188,7 +187,7 @@ SAVETXT: PUSH AF LD (BACKTXT.CURS),DE POP AF LD IX,#C000 - LD HL,#2050 ;!FIXIT если текстовое 40x32? + LD HL,#2050 OR A JR NZ,.SVTEXT1 LD L,#28 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 934dbf9..c3efc03 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -1096,29 +1096,29 @@ K_SND_W: ;DJNZ K_RESET_BUFFER ;. [ ] 31/03/2024 subfunc 3 ; ; ;----------------------------------------------------------------------- - +;!FIXIT есть в биосе +; DE - частота +; HL - продолжительность BEEP: LD A,#10 - OUT (ZX_Beeper),A - LD B,D - LD C,E -.loop1: DEC BC - LD A,B - OR C - JR NZ,.loop1 - XOR A ;LD A,#00 - OUT (ZX_Beeper),A - LD B,D - LD C,E -.loop2: DEC BC - LD A,B - OR C - JR NZ,.loop2 + CALL .beep_loop + ; A = 0 + CALL .beep_loop + ; DEC HL LD A,H OR L JR NZ,BEEP RET -; + ; +.beep_loop: OUT (ZX_Beeper),A + LD B,D + LD C,E + ; +.loop: DEC BC + LD A,B + OR C + JR NZ,.loop + RET KEYBOARD_INIT: DI ; reg 0 diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index 0dbe14e..b6e2535 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -3,6 +3,20 @@ ; HELP. Вывод экрана помощи ; ;/////////////////////////////////////////////////// -cmd_help: - ld de,MAIN_MSG.HELP ; индекс "COMMANDS: ..." - jp ECHO_MESSAGE +cmd_help: LD HL,.help_txt + LD A,(color_screen) + EX AF,AF' + XOR A + LD BC,BIOS.LP_PR_LINE_DIR + JP ToBIOS ;!FIXIT тестовый вариант, переделать на DSS + ;JP ECHO_MESSAGE + +; 1 2 3 4 5 6 7 8 +; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; +.help_txt: DB "COMMANDS:\r\n" + DB "SET INFO REN = RENAME PATH CLS [ink]\r\n" + DB "CD = CHDIR DEL = ERASE HELP VER = VERSION\r\n" + DB "MD = MKDIR TIME ECHO EXIT\r\n" + DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f]\r\n\n" +; ; ; ; ; ; ; ; ; ; ; ; ; +; \ No newline at end of file diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index c9c7b0c..a28b21f 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -19,7 +19,7 @@ MAIN_MSG: .DIR_2 EQU .DIR_2_ .DIR_3 EQU .DIR_3_ .DIR_4 EQU .DIR_4_ -.HELP EQU .HELP_ +;.HELP EQU .HELP_ .CALCULATING EQU .CALC_ .CRLF EQU .CRLF_ .INFO_1 EQU .INFO_1_ @@ -51,12 +51,12 @@ MAIN_MSG: DZ " %4 Dir(s)\r %5 byte(s) capacity\r\n" stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT - ;!TODO печатать не через ECHO_MESSAGE - stN .HELP_ : db "COMMANDS:\r\n" - db "SET INFO REN = RENAME PATH CLS [ink] " - db "CD = CHDIR DEL = ERASE HELP VER = VERSION " - db "MD = MKDIR TIME ECHO EXIT " - DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" +; ;!TODO печатать не через ECHO_MESSAGE +; stN .HELP_ : db "COMMANDS:\r\n" +; db "SET INFO REN = RENAME PATH CLS [ink] " +; db "CD = CHDIR DEL = ERASE HELP VER = VERSION " +; db "MD = MKDIR TIME ECHO EXIT " +; DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5\r\n" diff --git a/SHELL/build.txt b/SHELL/build.txt index a6d80d5..941d0e5 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -466 \ No newline at end of file +479 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 7c03abc..9143dcb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7c03abc82040df54cec2bc6701b0f602fa08fd26 +Subproject commit 9143dcb7f8fd9cd3ae0bc179b94fced5efd8667f From eae2582230f59e639f39e248b6d158abd28933a4 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 2 Apr 2025 01:14:36 +1000 Subject: [PATCH 199/219] =?UTF-8?q?=20CORE:=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=BA=D0=B0=20PutChar=20=D0=B8=20PChars=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20BIOS=20LP=5FPR=5FLINE=5FDIR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API.asm | 2 +- DSS/API/Clear.asm | 10 +- DSS/API/Execute.ASM | 6 +- DSS/API/MkDir.asm | 4 +- DSS/API/Open.asm | 2 +- DSS/API/PChars.asm | 30 ++- DSS/API/PutChar.asm | 201 ++++++++++-------- DSS/API/RmDir.asm | 4 +- DSS/API/WrChar.asm | 20 +- DSS/API/Write.asm | 2 +- DSS/API/curDisk.asm | 2 +- DSS/API/diskINF.asm | 28 +-- DSS/DOS_Proc.asm | 41 +++- DSS/DSS-MAIN.ASM | 93 +++++---- DSS/FS/CDFS.ASM | 5 +- DSS/FS/FAT.asm | 397 ++++++++++++++++++------------------ DSS/KEYINTER.ASM | 209 +++++++++++-------- DSS/Structures.inc | 10 +- DSS/build.txt | 2 +- DSS/defines.inc | 18 +- SHELL/Commands/CLS.ASM | 7 +- SHELL/Commands/HELP.ASM | 26 ++- SHELL/EDLINE.ASM | 6 +- SHELL/Messages/main_txt.asm | 7 - SHELL/Procedures/Print.ASM | 44 +++- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 27 files changed, 671 insertions(+), 509 deletions(-) diff --git a/DSS/API.asm b/DSS/API.asm index 5cb89d0..b5e5b61 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -96,7 +96,7 @@ ; POP BC ; JP C,NDISK11 ; LD A,B - ; LD (CORE_BUFFERS.FatBuffer.DRIVE),A + ; LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; CALL RD_BPB ; RET C ; LD A,(LDRIVE) diff --git a/DSS/API/Clear.asm b/DSS/API/Clear.asm index 85b994d..fe801f7 100644 --- a/DSS/API/Clear.asm +++ b/DSS/API/Clear.asm @@ -9,6 +9,12 @@ ; B - атрибут заполнитель ; выход: нет ;/////////////////////////////////////////////////////////////////////// -CLEAR: LD C,BIOS.LP_CLS_WIN2 - JP ToBIOS +CLEAR: LD C,A + LD A,B + LD (.shell_color),A + LD A,C + LD C,BIOS.LP_CLS_WIN2 + JP ToBIOS + ; +.shell_color: DB COLORS.CGA.INK.LGRAY ;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index def5b39..1371678 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -363,11 +363,11 @@ _TST_PROC: CALL GETMEM ; ; LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 + LD DE,CORE_BUFFERS.BUFFER+1 CALL SCOPYS LD A,#80 ;!HARDCODE cmd line size SUB B - LD (CORE_BUFFERS.SECTOR_BUFFER),A + LD (CORE_BUFFERS.BUFFER),A ; LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER ;R02 ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать @@ -445,7 +445,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) EX DE,HL LD XH,D LD XL,E - LD HL,CORE_BUFFERS.SECTOR_BUFFER + LD HL,CORE_BUFFERS.BUFFER LD C,(HL) INC C LDIR diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index f10fdca..bd3c466 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -163,7 +163,7 @@ MKDIR: EXX POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; секторов на кластер + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора @@ -173,7 +173,7 @@ MKDIR: ; IN A,(SLOT0) ; OUT (SLOT3),A ; ; - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ; LD BC,1*256 + Dss.DRV.Write ; RST ToDSS.DRV diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index f077c71..02bac41 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -68,7 +68,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+2),A LD (IY+_sFM.F_POSITION+3),A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD (IY+_sFM.DRIVE),A ; fat32 LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H diff --git a/DSS/API/PChars.asm b/DSS/API/PChars.asm index abad0f8..a9c3bbe 100644 --- a/DSS/API/PChars.asm +++ b/DSS/API/PChars.asm @@ -5,10 +5,26 @@ ; выход: HL - указатель на следующую строку символов ; PRINT NULL-TERMINATED CHARS STRING ;/////////////////////////////////////////////////////////////////////// -PCHARS: LD A,(HL) - INC HL - OR A - RET Z - CALL PUTCHAR - JP PCHARS -;/////////////////////////////////////////////////////////////////////// \ No newline at end of file +; PCHARS: LD A,(HL) +; INC HL +; OR A +; RET Z +; CALL PUTCHAR +; JP PCHARS +;/////////////////////////////////////////////////////////////////////// +PCHARS: XOR A ; no attr-mode + LD A,(CLEAR.shell_color) + LD B,A + EX AF,AF' + XOR A ; no XY-mode + LD C,BIOS.LP_PR_LINE_DIR + LD IY,0 ; YH = YL = B + JP ToBIOS +;/////////////////////////////////////////////////////////////////////// +; A - атрибуты выводимого символа если CF' +; CF - XY-mode +; DE - место символа в окне, если CF=1 +; HL - адрес с выводимой строкой +; B - цвет консоли (используется при скролле и очистке окна) +; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны +; CF' - выводить символ с атрибутами \ No newline at end of file diff --git a/DSS/API/PutChar.asm b/DSS/API/PutChar.asm index 13cf58b..49e9f79 100644 --- a/DSS/API/PutChar.asm +++ b/DSS/API/PutChar.asm @@ -4,95 +4,124 @@ ; вход: A - символ ; выход: нет ;/////////////////////////////////////////////////////////////////////// -PUTCHAR: ;CALL .NO_SCROLL - CP #0E - JR C,.control_characters +; PUTCHAR: ;CALL .NO_SCROLL +; CP #0E +; JR C,.control_characters +; ; +; LD BC,1*256 + BIOS.LP_PRINT_SYM +; ;[x] CR+LF+SCROLL +; RST ToBIOS +; ; +; ; проверка на переход курсора в самое начало (X:Y == 0:0) +; CALL CURSOR +; LD A,D +; OR E +; RET NZ +; ; +; .LFF: PUSH HL +; LD BC,1*256 + BIOS.LP_SCROLL_UD +; LD DE,#0020 +; RST ToBIOS +; LD DE,#1F00 +; CALL LOCATE +; LD A,' ' +; LD BC,#50*256 + BIOS.LP_PRINT_SYM +; RST ToBIOS +; LD DE,#1F00 +; CALL LOCATE +; POP HL +; RET +; .TB_: CALL CURSOR +; IF TABisSPACES +; LD B,E +; LD A,E +; AND #F8 +; ADD A,8 +; SUB B +; LD B,A +; LD A,' ' +; LD C,BIOS.LP_PRINT_SYM +; JP ToBIOS +; ELSE +; LD A,E +; ADD A,8 +; AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти +; LD E,A +; JP LOCATE +; ENDIF +; .BK_: CALL CURSOR +; XOR A +; CP E +; RET Z +; DEC E +; JP LOCATE +; ; +; .LF_: CALL CURSOR +; LD A,D +; CP #1F +; JR NC,.LFF +; INC D +; IFN EnoughtOnly_LF +; JP LOCATE +; ELSE +; CALL LOCATE +; ; !!!! НЕ разрывать LF_ и CR_ !!!! +; ENDIF +; .CR_: CALL CURSOR +; LD E,0 +; JP LOCATE +; ; +; .control_characters: +; CP "\r" +; JR Z,.CR_ +; CP "\n" +; JR Z,.LF_ +; CP "\t" ; tab +; JR Z,.TB_ +; CP "\b" ; backspace +; JR Z,.BK_ +; CP "\a" ; [x] Beep in PChars/PUTCHAR +; RET NZ +; ; [x] Beep in PChars/PUTCHAR +; .BELL: LD DE,1200 +; PUSH HL +; LD HL,4 +; CALL BEEP +; POP HL +; RET +; ; +; ; [x] -bug with Vasil's version of cursor +; .NO_SCROLL: CP #0E +; JR C,.control_characters +; LD BC,1*256 + BIOS.LP_PRINT_SYM +; JP ToBIOS +;/////////////////////////////////////////////////////////////////////// + + + +;/////////////////////////////////////////////////////////////////////// +PUTCHAR: PUSH HL ; - LD BC,1*256 + BIOS.LP_PRINT_SYM - ;[x] CR+LF+SCROLL - RST ToBIOS - ; - ; проверка на переход курсора в самое начало (X:Y == 0:0) - CALL CURSOR - LD A,D - OR E - RET NZ + LD L,A + XOR A ; no attr-mode + LD H,A + PUSH HL ; кладём на стек печатаемый символ + LD L,A + ADD HL,SP ; -.LFF: PUSH HL - LD BC,1*256 + BIOS.LP_SCROLL_UD - LD DE,#0020 + LD A,(CLEAR.shell_color) + LD B,A + EX AF,AF' + XOR A ; no XY-mode + LD C,BIOS.LP_PR_LINE_DIR + LD IY,0 ; YH = YL = B RST ToBIOS - LD DE,#1F00 - CALL LOCATE - LD A,' ' - LD BC,#50*256 + BIOS.LP_PRINT_SYM - RST ToBIOS - LD DE,#1F00 - CALL LOCATE + POP HL ; восстанавливаем стек + ; POP HL RET -.TB_: CALL CURSOR - IF TABisSPACES - LD B,E - LD A,E - AND #F8 - ADD A,8 - SUB B - LD B,A - LD A,' ' - LD C,BIOS.LP_PRINT_SYM - JP ToBIOS - ELSE - LD A,E - ADD A,8 - AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти - LD E,A - JP LOCATE - ENDIF -.BK_: CALL CURSOR - XOR A - CP E - RET Z - DEC E - JP LOCATE - ; -.LF_: CALL CURSOR - LD A,D - CP #1F - JR NC,.LFF - INC D - IFN EnoughtOnly_LF - JP LOCATE - ELSE - CALL LOCATE - ; !!!! НЕ разрывать LF_ и CR_ !!!! - ENDIF -.CR_: CALL CURSOR - LD E,0 - JP LOCATE - ; -.control_characters: - CP "\r" - JR Z,.CR_ - CP "\n" - JR Z,.LF_ - CP "\t" ; tab - JR Z,.TB_ - CP "\b" ; backspace - JR Z,.BK_ - CP "\a" ; [x] Beep in PChars/PUTCHAR - RET NZ - ; [x] Beep in PChars/PUTCHAR -.BELL: LD DE,1200 - PUSH HL - LD HL,4 - CALL BEEP - POP HL - RET - ; -; [x] -bug with Vasil's version of cursor -.NO_SCROLL: CP #0E - JR C,.control_characters -._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - JP ToBIOS + +; .NO_SCROLL: + +; .CHAR: DZ "X" ;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 1c40407..d85e693 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -55,7 +55,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL EXX CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) LD B,A ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: ;PUSH AF @@ -70,7 +70,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; ; ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ; LD BC,1*256 + Dss.DRV.Read - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; RST ToDSS.DRV ; POP AF ; OUT (SLOT3),A diff --git a/DSS/API/WrChar.asm b/DSS/API/WrChar.asm index 3aeb172..63d71f9 100644 --- a/DSS/API/WrChar.asm +++ b/DSS/API/WrChar.asm @@ -9,15 +9,17 @@ ; выход: нет ;!FIXIT slow как без WIN_GET_SYM тут обойтись? ;/////////////////////////////////////////////////////////////////////// -WRCHAR: LD C,A - PUSH BC - PUSH DE +WRCHAR: ;LD C,A + ;PUSH BC + ;PUSH DE + ;XOR A + ;LD C,BIOS.WIN_GET_SYM + ;RST ToBIOS + ;POP DE + ;POP HL + LD L,A + LD H,B XOR A - LD C,BIOS.WIN_GET_SYM - RST ToBIOS - POP DE - POP HL - XOR A - LD C,BIOS.WIN_PUT_SYM + LD BC,BIOS.WIN_PUT_SYM.NoChangeZG JP ToBIOS ;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 966b006..e6c2888 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -18,7 +18,7 @@ WRITE.RD_ONLY: WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF - LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index 3eb0638..70d838e 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -16,7 +16,7 @@ CURDISK_FN: CURDISK: LD A,(LDRIVE) LD C,A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) AND A RET ; \ No newline at end of file diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 12e9bc9..5ddf0bd 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -63,7 +63,7 @@ DISKINF: LD C,B LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.next_prm ; @@ -77,7 +77,7 @@ DISKINF: LD C,B .put_char: LD (DE),A POP DE ; -.next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER +.next_prm: LD HL,CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; @@ -86,7 +86,7 @@ DISKINF: LD C,B PUSH DE PUSH HL EXX - ;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + ;LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL PUSH IX CALL GET_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL @@ -132,7 +132,7 @@ DISKINF: LD C,B ;JR Z,CURRDS ;R06 .CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' - LD HL,CORE_BUFFERS.FatBuffer.DRIVE + LD HL,CORE_BUFFERS.FS_Buffer.DRIVE CP (HL) JR Z,.CheckFreeSpace ; @@ -144,9 +144,9 @@ DISKINF: LD C,B .CheckFreeSpace:; если GetFreeSpace не вызывается XOR A OR B - LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L) EXX - LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H) EXX CALL NZ,GetFreeSpace ; @@ -155,24 +155,24 @@ DISKINF: LD C,B ; LD H,B LD L,C - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL EX DE,HL EXX LD H,B LD L,C - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL EX DE,HL EXX - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow) DEC HL ; fat 32 EXX - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) JR NC,.skip_dec_hl DEC HL .skip_dec_hl: EXX - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) AND A RET ; @@ -187,7 +187,7 @@ DISKINF: LD C,B ; ; GetFreeSpace: LD A,1 - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A LD HL,2 ; fat32 номер кластера от которого считать XOR A ; fat32 @@ -246,7 +246,7 @@ GET_LABEL: PUSH DE LD B,high Dss.F_First.FATname CALL F_FIRST POP DE - LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL RET C ; [ ] 07/03/2025 костыль для атрибута 0. Настоял Савелий)) LD HL,BUFFER_FIND.REC_Attr diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 191715f..21dc66b 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -184,7 +184,7 @@ TMPNAME: DZ ' ' ; 12 ; IN: A - drive number OPENDSK: ;!TEST DRV.Open обход R10 LD C,A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) CP C JR NZ,.open PUSH BC @@ -202,12 +202,12 @@ OPENDSK: ;!TEST DRV.Open POP BC JP C,.error ;[x] 29/02/2024 fix "open drive error" -.skip_open: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.skip_open: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD D,A PUSH DE ; LD A,B - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; CALL RD_BPB ;[x] 29/02/2024 fix "open drive error" @@ -236,7 +236,7 @@ OPENDSK: ;!TEST DRV.Open ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed .error_bpb: PUSH AF ; сохраняем номер ошибки - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) CP D JR Z,.next_check ; @@ -245,15 +245,15 @@ OPENDSK: ;!TEST DRV.Open SCF JR Z,.set_panic ; - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A CALL OPENDSK.force JR NC,.err_exit ; LD A,(BOOTDSK.NUM) - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A CALL OPENDSK.force ; -.err_exit: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.err_exit: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' LD (CORE_BUFFERS.CurrentPath),A POP AF @@ -384,7 +384,7 @@ MASK: LD HL,TMPNAME ;----------------------------------------------------------------------; ;!TEST Current Dir ;[x] 15/10/23 DIR_PATH_CHANGE: -.FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.FullCurrent: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' LD (CORE_BUFFERS.CurrentPath),A ; @@ -393,7 +393,7 @@ DIR_PATH_CHANGE: ; .FullWork: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; .Work: LD HL,CORE_BUFFERS.WorkDirectory JP CURRDIR_FN @@ -419,7 +419,7 @@ DIR_PATH_CHECK: LD A,(HL) JR Z,.checkDir ; LD HL,CORE_BUFFERS.CurrentPath - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' CP (HL) JR NZ,.gotoPath @@ -459,7 +459,7 @@ DIR_PATH_CHECK: LD A,(HL) JR .gotoPath ; .checkDrive: LD HL,CORE_BUFFERS.CurrentPath - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' CP (HL) RET @@ -587,4 +587,23 @@ MOVE_CP: SBC HL,DE RET ; +;----------------------------------------------------------------------; +; [x] fat32 ; [ ] CDFS +; !TODO перенести потом в FS module +RD_BPB: CALL READ_BPB + RET C + ; + LD DE,#AA55 ; сигнатура ;R05 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + ; + AND A + SBC HL,DE + JP Z,FAT_BPB + ; + ; CDFS check + ; + ; +.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET ;----------------------------------------------------------------------; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 0b896b7..af5b6c7 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -72,7 +72,7 @@ RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12 ; <[BIOS API]> ; _mInfoBLOCK 8-$,#FF ; RST_0x08: PUSH AF ; - LD A,SYS_PORT.PAGE8; + LD A,SYS_PORT.BIOS ; OUT (SYS_PORT.ON),A ; POP AF ; RET ; @@ -190,14 +190,14 @@ RST_10: PUSH HL IF SHORT_RSTx10_TABLE ;[ ] R09 LD H,A - LD A,#5F + LD A,+(DSS_API_TABLE.low_short) SUB C JR C,.error LD A,H ;[ ] R09 ENDIF - LD H,high ADRST10 + LD H,high DSS_API_TABLE LD C,(HL) INC H LD H,(HL) @@ -254,7 +254,7 @@ CLEAR_BUFFER_AND_INIT_PROC: LD (CORE_BUFFERS.WorkDirectory),A ; LD A,#FF - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; ;R07 ;R11 ;R11 @@ -265,9 +265,9 @@ CLEAR_BUFFER_AND_INIT_PROC: ;R02 ;LD B,#FF ;INIT ENVIRONMENT CALL INITENV - IFN CLASSIC_CURSOR +; IFN CLASSIC_CURSOR CALL SETUP_CURSORS - ENDIF +; ENDIF ;R02 JP VERSION @@ -289,9 +289,9 @@ INTx38_Handler: PUSH AF LD C,Dss.Mouse.GetPackets RST ToDSS.Mouse ;CALL M_INT - IFN CLASSIC_CURSOR +; IFN CLASSIC_CURSOR CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL - ENDIF +; ENDIF POP IY POP IX POP HL @@ -335,7 +335,7 @@ INTx38_Handler: PUSH AF ;------------------------------------------------------------------------------------------------------------------------; GO_ZERO EQU #0000 ;FUNCTION ADDRESS ARRAY -ADRST10: ;DS 512 ;,0 +DSS_API_TABLE: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 @@ -347,21 +347,23 @@ ADRST10: ;DS 512 ;,0 DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 - DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F + DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F +;[ ] R09 +.low_short EQU $ - DSS_API_TABLE IFN SHORT_RSTx10_TABLE - ;[ ] R09 - DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63 - DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D + ; + DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63 + DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D DUP 13 - DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO; 110-239 6E-EF + DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 110-239 6E-EF EDUP - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9 - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF - + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9 + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF + ; ELSE ;!TODO free space - _mInfoBLOCK ADRST10+#100 - $,0 + _mInfoBLOCK DSS_API_TABLE+#100 - $,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: @@ -376,19 +378,21 @@ ADRST10: ;DS 512 ;,0 DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT +;[ ] R09 +.high_short EQU $ - DSS_API_TABLE - .low_short IFN SHORT_RSTx10_TABLE - ;[ ] R09 - DB high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO + ; + DB high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO DUP 13 - DB high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO + DB high GO_ZERO, high GO_ZERO, high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO EDUP - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END - + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END + ; ELSE ;!TODO free space - ;_mInfoBLOCK ADRST10+#200 - $,0 + ;_mInfoBLOCK DSS_API_TABLE+#200 - $,0 ;[ ] R09 ENDIF ; DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT, low NOPS, low NOPS, low NOPS, low NOPS ; 9 5A..63 @@ -405,7 +409,7 @@ ADRST10: ;DS 512 ;,0 ; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb CHECK_64kb_CLUSTER: - LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; CF=0 ADC HL,HL LD A,DSS_Error.sys.WRITE_PROTECT @@ -458,7 +462,7 @@ BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size -FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer +FS_Buffer _sFS_Buffer = BUFFERSplace.FS_Buffer EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK _sStack = BUFFERSplace.Stack .Spoint EQU XSTACK + _sStack @@ -492,8 +496,8 @@ CLEAR_ZONE.size EQU _sBuffers DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize - DISPLAY " FatBuffer ", /H, CORE_BUFFERS.FatBuffer - DISPLAY " FatBuffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer + DISPLAY " FS_Buffer ", /H, CORE_BUFFERS.FS_Buffer + DISPLAY " FS_Buffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FS_Buffer DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK @@ -508,7 +512,7 @@ CLEAR_ZONE.size EQU _sBuffers EXPORT CORE_BUFFERS.BUFFERSplace EXPORT CORE_BUFFERS.FM_BUF - EXPORT CORE_BUFFERS.FatBuffer + EXPORT CORE_BUFFERS.FS_Buffer EXPORT CORE_BUFFERS.EXEBUFF EXPORT CORE_BUFFERS.XSTACK EXPORT CORE_BUFFERS.BUFFER @@ -567,18 +571,19 @@ F_START: DI ; ;R12 - LD C,BIOS.DRV_VERSION + LD HL,0 ; писать в никуда + LD C,BIOS.FN_VERSION RST ToBIOS JR C,.err_oldBIOS EX DE,HL LD DE,MINIMUM_BIOS_VERSION SBC HL,DE - JR NC,.good - LD A,(.saveDRV+1) - CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 - JR NC,.err_oldBIOS - LD HL,#C9AF ; XOR A : RET opcodes - LD (DRV_CONTENT + INITDVC.if_old),HL ;!!!!!! + JR C,.err_oldBIOS + ; LD A,(.saveDRV+1) + ; CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 + ; JR NC,.err_oldBIOS + ; LD HL,#C9AF ; XOR A : RET opcodes + ; LD (DRV_CONTENT + INITDVC.if_old),HL ; .good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения @@ -608,7 +613,7 @@ F_START: DI ; EI ;Set new address fn. VERSION - LD HL,ADRST10 + LD HL,DSS_API_TABLE LD (HL),low VERSION ;R03 INC H LD (HL),high VERSION ;R03 @@ -616,14 +621,18 @@ F_START: DI ; ;R12 .err_oldBIOS: - LD HL,.err_oldBIOS_message + IN A,(SLOT0) + OUT (SLOT3),A + LD HL,.err_oldBIOS_message + SLOT3.MEM_ADDR ;LD C,Dss.PChars ;RST ToDSS CALL PCHARS SCF RET .err_oldBIOS_message: - DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." + DB "\r\nWARNING! This version of DSS requires BIOS v" + DB STR_MINIMUM_BIOS_VERSION + DZ " or later to boot from IDE." ; DEPLOY: ;Allocate memory @@ -678,6 +687,7 @@ DEPLOY: ;Allocate memory ; C_OSTYPE ;--- --- --- --- --- --- --- --- --- --- --- ---; + DISPLAY "FAT MODULE SIZE: ",/A,FAT_MODULE_SIZE DISPLAY "DEPLOY end address: ",/H,$ ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." @@ -689,7 +699,6 @@ DRV_CONTENT.SIZE EQU $-DRV_CONTENT BIN_END_ADDRESS EQU $ - DISPLAY "END ADDRESS: ",/H,BIN_END_ADDRESS DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512 ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!'; diff --git a/DSS/FS/CDFS.ASM b/DSS/FS/CDFS.ASM index 9a75097..bd1cc34 100644 --- a/DSS/FS/CDFS.ASM +++ b/DSS/FS/CDFS.ASM @@ -1,4 +1,4 @@ -; INITDISK - инициализация буквы диска +; INITDISK - инициализация буквы диска - перенести кусок в RD_BPB ; LOADDIR - загрузка с CDFS директории и адаптация под FAT ; /* @@ -6,7 +6,8 @@ CHECK_ROOT_CLUSTER -NEW RST: +-= RST ToDSS.FS =- +RD_BPB - shared_fs.asm - брать сигнатуру #AA55 или из CDFS.RD_BPB и далее уже RST_FS LOADDIR */ \ No newline at end of file diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index f353292..bcaa5d0 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -12,12 +12,14 @@ ;--------------------------------------------------------------- ; [ ] RST_FS ;----------------------------------------------------------------------; +FAT_MODULE_START EQU $ -SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + +SET_FSInfo: LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 RET NZ ; - LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) + LD A,(CORE_BUFFERS.FS_Buffer.UPD_FSINFO) OR A RET Z ; @@ -42,9 +44,9 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD HL,#AA55 LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL ; FREE_CLUSTERS_COUNT - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL ; FIRST_FREE_CLUSTER LD HL,(G_CLUST.low) @@ -53,14 +55,14 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL ; Пишем его на винт XOR A - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A JR WRITE_FSinfo ; ; ; Прочитать BPB в SECTOR_BUFFER READ_BPB: LD C,Dss.DRV.GetBPB JR RW_SECTOR ; Записать FSinfo из SECTOR_BUFFER -WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) +WRITE_FSinfo: LD IX,(CORE_BUFFERS.FS_Buffer.FSINFO_Sector) LD HL,0 ;JR WRITE_SECTOR ; Записать сектор из SECTOR_BUFFER @@ -68,7 +70,7 @@ WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write JR RW_SECTOR ; Прочитать FSinfo в SECTOR_BUFFER -READ_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) +READ_FSinfo: LD IX,(CORE_BUFFERS.FS_Buffer.FSINFO_Sector) LD HL,0 ; Прочитать сектор в SECTOR_BUFFER ; Вход: HL:IX = Logical Block (sector) @@ -79,7 +81,7 @@ RW_SECTOR: IN A,(SLOT3) IN A,(SLOT0) OUT (SLOT3),A ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 RST ToDSS.DRV EX AF,AF' @@ -458,7 +460,7 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF OR A JR NZ,.SUBDIR ; -.REROOT: LD DE,0 +.REROOT: LD DE,0 ; !FIXIT ; [ ] CDFS - брать первый кластер из переменной LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE CALL LOADDIR @@ -517,16 +519,16 @@ LOADDIR: ;!TODO optimize PUSH AF EX AF,AF' JR NZ,.read_dir - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.LoadRootDir ; fat32 - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - ;LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог + ;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог LD HL,#4000 ; размер директории ;!HARDCODE LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ; @@ -539,14 +541,14 @@ LOADDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) +.LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 + LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 LD B,A ; число секторов -.RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска +.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV @@ -572,7 +574,7 @@ LOAD_SAVE_DIR_PREPARE: AND A EX AF,AF' ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD (IY+_sFM.DRIVE),A ;!FIXIT переделать на работу без IY LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) @@ -630,7 +632,7 @@ WRT_HND: SBC HL,DE JR NC,SAVEDIR LD HL,(SAVEDIR.DIRSIZE) - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ADD HL,BC LD (SAVEDIR.DIRSIZE),HL AND A @@ -645,13 +647,13 @@ SAVEDIR: ;!TODO optimize EX AF,AF' JR NZ,.save_dir ; - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.SaveRootDir ; fat32 - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL ; .save_dir: LD HL,DIRPAGE.buffer @@ -665,15 +667,15 @@ SAVEDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) +.SaveRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 + LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) + LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors SUB B JR NC,.RTD1S ADD A,B LD B,A -.RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.RTD1S: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD DE,DIRPAGE.buffer LD C,Dss.DRV.Write RST ToDSS.DRV @@ -683,29 +685,17 @@ SAVEDIR: ;!TODO optimize ;----------------------------------------------------------------------; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; [x] fat32 ;!TEST -RD_BPB: ; LD C,SLOT3 - ; IN B,(C) - ; PUSH BC - ; IN A,(SLOT0) - ; OUT (SLOT3),A - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08 - ; LD C,Dss.DRV.GetBPB - ; RST ToDSS.DRV - ; POP BC - ; OUT (C),B - CALL READ_BPB - ;JP C,DOS_X_Error.Not_ready - RET C - ; - LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 - ;[ ] CDFS - ;R05 - AND A - SBC HL,DE - JP NZ,DOS_X_Error.UnknownBPB +; [x] fat32 +; RD_BPB: CALL READ_BPB +; RET C +; ; +; LD DE,#AA55 ; сигнатура ;R05 +; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 +; ;[ ] CDFS +; ;R05 +; AND A +; SBC HL,DE +; JP NZ,DOS_X_Error.UnknownBPB ; ; ;R08 ; [x] fat32 ; LD HL,CORE_BUFFERS.SECTOR_BUFFER @@ -713,27 +703,27 @@ RD_BPB: ; LD C,SLOT3 ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LDIR ; - LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) +FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) CP #F0 - JP C,DOS_X_Error.UnknownBPB + JP C,RD_BPB.UnknownBPB ; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector) - LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL + LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) - LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A + LD (CORE_BUFFERS.FS_Buffer.SectorsPerCluster),A ; calc. first sector FAT LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ;[ ] fat32 XOR A LD B,A LD C,A - 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.RootDirFirstSector_H),BC - LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 - ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),BC + LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A ; [ ] fat32 + ;LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables ; ; EXX @@ -752,24 +742,24 @@ RD_BPB: ; LD C,SLOT3 LD A,E EXX ; - LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A + LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) ; -.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE +.skip_high: LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L),DE LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs - LD (CORE_BUFFERS.FatBuffer.Number_Of_FATs),A + LD (CORE_BUFFERS.FS_Buffer.Number_Of_FATs),A CP 1 JR Z,.one_FAT DEC A ADD HL,DE - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL EXX ADC HL,DE - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL EXX ;JR NC,.no_inc_BC ;INC BC -.no_inc_BC:;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC +.no_inc_BC:;LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC .one_FAT: ; .loop1: ADD HL,DE ;JR NC,.loop1_1 @@ -780,14 +770,14 @@ RD_BPB: ; LD C,SLOT3 .loop1_1: DEC A JR NZ,.loop1 ; - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L),HL ; first sector DIR EXX ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),HL + LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_H),HL EXX - ;LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC + ;LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_H),BC ; - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) LD A,B AND A ; @@ -802,7 +792,7 @@ RD_BPB: ; LD C,SLOT3 LD B,0 ; BC - File handels per sector ;;;; IF COMPILE_UNUSED_CODE - LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A + LD (CORE_BUFFERS.FS_Buffer.FilesPerSector),A ENDIF ; EX DE,HL @@ -816,21 +806,21 @@ RD_BPB: ; LD C,SLOT3 XOR A ;NEXTAD2 .loop2: INC A - JP Z,DOS_X_Error.UnknownBPB + JP Z,RD_BPB.UnknownBPB SBC HL,BC JR NC,.loop2 ; .skip_loop2: EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A + LD (CORE_BUFFERS.FS_Buffer.DirSizeInSectors),A ADD HL,BC ; Start DATA area - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL + LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_L),HL ; B = 0 ; - LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector) - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerSector) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -840,13 +830,13 @@ RD_BPB: ; LD C,SLOT3 RRA JP NC,.loop3 .loop3.end: ; - LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL + LD (CORE_BUFFERS.FS_Buffer.BytesPerCluster),HL ;LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO ;AND A ;SBC HL,DE ;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) //////////////////////////////////////////////////////////////////////// -;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer +;!TODO не используется значения вычисляемые и сохраняемые в FS_Buffer ; EX DE,HL ; LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize ; XOR A @@ -855,7 +845,7 @@ RD_BPB: ; LD C,SLOT3 ; JP Z,DOS_X_Error.UnknownBPB ; SBC HL,DE ; JR NC,.loop4 -; LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) +; LD (CORE_BUFFERS.FS_Buffer.ClustersPerBank),A ; A - Clusters per bank (16k) ; ; LD HL,0 ; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track @@ -864,19 +854,19 @@ RD_BPB: ; LD C,SLOT3 ; ADD HL,BC ; DEC A ; JR NZ,.BPB_L1 -; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL +; LD (CORE_BUFFERS.FS_Buffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// ; [ ] fat32 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD A,H OR L - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_L) JP NZ,.HDDSMAL ; EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH HL ; Total Sectors high - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_H) EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) PUSH HL ; Total Sectors low @@ -898,7 +888,7 @@ RD_BPB: ; LD C,SLOT3 SBC HL,DE ; .HDDBIG: CALL SectorToCluster -; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) +; LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; SCF ; .loop7: RRA ; JR C,.loop7_exit @@ -909,23 +899,23 @@ RD_BPB: ; LD C,SLOT3 ; JP .loop7 ; .loop7_exit: INC HL - LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL + LD (CORE_BUFFERS.FS_Buffer.MaxClusterLow),HL LD A,L OR H JR NZ,.no_inc_bc INC BC -.no_inc_bc: LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC +.no_inc_bc: LD (CORE_BUFFERS.FS_Buffer.MaxClusterHigh),BC ; XOR A LD H,A LD L,A - LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FS_Buffer.CacheBlock),HL + LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A ; A = 0 - LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD H,A EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) ; DE:HL = SectorsPerFAT ; LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) @@ -940,7 +930,7 @@ RD_BPB: ; LD C,SLOT3 DJNZ .loop_mul .loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT LD B,0 - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) + LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) LD C,A ADD HL,BC JR NC,.no_inc_DE @@ -962,7 +952,7 @@ RD_BPB: ; LD C,SLOT3 POP DE ; Total Sectors low ; HL:DE = DataSec ; - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток CALL DIV_by_Shifts ; выясняем разрядность FAT @@ -983,9 +973,9 @@ RD_BPB: ; LD C,SLOT3 LD A,FAT_TYPE.x16 .set_vars: EXX LD HL,0 - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),HL + LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H),HL LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL EXX LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) @@ -1000,12 +990,12 @@ RD_BPB: ; LD C,SLOT3 CP #80 JR C,.mirrored_FATs ;если все копии FAT используются ; используется только одна копия FAT - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD D,0 EXX - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) AND #0F JR Z,.first_FAT_active LD B,A @@ -1017,40 +1007,40 @@ RD_BPB: ; LD C,SLOT3 DJNZ .fat_calc_loop ; .first_FAT_active: - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL EXX - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL ; .mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL ; EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L),HL LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H),DE ; CALL CLUSTER_TO_SECTOR.no_prepare - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L),IX + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),HL ; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) - LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL + LD (CORE_BUFFERS.FS_Buffer.FSINFO_Sector),HL ; LD A,FAT_TYPE.x32 LD HL,#0FFF - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),HL LD H,L LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) ; -.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC +.SET_VARS: LD (CORE_BUFFERS.FS_Buffer.FAT_TYPE),A + LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L),HL + LD (CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER),DE + LD (CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER+2),BC EXX - LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL + LD DE,CORE_BUFFERS.FS_Buffer.BPB_LABEL LD BC,11 ;!HARDCODE LDIR ; @@ -1062,7 +1052,7 @@ RD_BPB: ; LD C,SLOT3 OUT (SLOT3),A ; ; Установить начальный кластер для чтения - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR Z,.set_FSinfo ; @@ -1072,8 +1062,8 @@ RD_BPB: ; LD C,SLOT3 LD (G_CLUST.high),HL ; DEC HL - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL XOR A RET ; @@ -1102,8 +1092,8 @@ RD_BPB: ; LD C,SLOT3 LD D,B LD E,B ; -.skip_FFFF: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),BC - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),DE +.skip_FFFF: LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),BC + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),DE ; ; FIRST_FREE_CLUSTER LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) @@ -1115,12 +1105,12 @@ RD_BPB: ; LD C,SLOT3 LD (G_CLUST.high),DE LD (G_CLUST.low),BC XOR A -.error: LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A +.error: LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A RET Z ;!TODO FREE_CLUSTERS_COUNT ;LD HL,#FFFF - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + ;LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL + ;LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL ; XOR A LD H,A @@ -1131,9 +1121,9 @@ RD_BPB: ; LD C,SLOT3 RET ; ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? -.check_cluster: LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) +.check_cluster: LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow) SBC HL,BC - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) SBC HL,DE RET ;;;;;;;; @@ -1144,7 +1134,7 @@ SectorToCluster: LD A,B AND #0F LD B,A - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) SCF .loop: RRA RET C @@ -1155,10 +1145,10 @@ SectorToCluster: JP .loop ; -DOS_X_Error: -.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT - SCF - RET +; DOS_X_Error: +; .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT +; SCF +; RET ; ; .Not_ready: LD A,DSS_Error.sys.NOT_READY ; ; CF = 1 @@ -1167,7 +1157,7 @@ DOS_X_Error: ; ;!TODO к буферам! /* -FatBuffer: +FS_Buffer: ;.MSG: DB 'FAT' .DRIVE: DB #FF .FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 @@ -1298,7 +1288,7 @@ SET_NEW_FREE_CLUSTER: ; EXX ; XOR A ; INC A - ; LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + ; LD (CORE_BUFFERS.FS_Buffer.RESET_FSINFO),A ; RET ; @@ -1338,7 +1328,7 @@ G_CLUST: ; LD (G_CLUST.high),HL EXX INC A - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A RET ; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров @@ -1349,11 +1339,11 @@ SET_NEW_FREE_CLUSTERS: EXX PUSH HL PUSH DE - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H) LD A,H AND L EXX - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L) AND H AND L INC A @@ -1374,11 +1364,11 @@ SET_NEW_FREE_CLUSTERS: EXX ; .set_new: LD A,1 - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A ; - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL EXX - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL .no_change: POP DE POP HL EXX @@ -1453,13 +1443,13 @@ INC_FAT: PUSH HL ; тек ; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster ; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) CHECK_CLUSTER_IS_SMALLER: - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) XOR FAT_TYPE.x32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера ; проверяем старшее слово номера кластера EXX EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) ; CF = 0 SBC HL,DE EX DE,HL @@ -1469,7 +1459,7 @@ CHECK_CLUSTER_IS_SMALLER: RET NZ ; проверяем младшее слово номера кластера .low: EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow) SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL @@ -1496,7 +1486,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; PUSH HL PUSH AF - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -1588,7 +1578,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Портить только HL и A SET_FAT32_CACHE_BLOCK_CHANGED_REGION: ;DEC HL - ;LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + ;LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) ;CP FAT_TYPE.x16 + 1 ;JR C,.start ;DEC HL @@ -1604,16 +1594,16 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: SUB L JR NZ,.loop ; -.set_region: LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) +.set_region: LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) OR H - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A RET ; ; [x] fat32 ;!TEST ; ; !TODO optimize -; при записи в кэш значения отмечать через OR в ячейке FatBuffer.SectorOfCacheBlock +; при записи в кэш значения отмечать через OR в ячейке FS_Buffer.SectorOfCacheBlock ; бит соответствующий куску в странице кэша, который был изменён и потом скидывать на диск ; только те куски, которые были изменены. ; |--------------------| @@ -1640,9 +1630,9 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: ; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера +WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L) ; номер кластера EXX - LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера + LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H) ; номер кластера EXX .Custom: PUSH DE EXX @@ -1664,9 +1654,9 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; PUSH DE ; младший номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,1 - ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A ; - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -1685,7 +1675,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,#FF - ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A ; ; CF = 0 RET @@ -1755,7 +1745,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; ; out: C:HL - logical number ; B = 0 GET_SECTOR_OF_FAT: - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную XOR FAT_TYPE.x32 JR Z,.next @@ -1778,7 +1768,7 @@ GET_SECTOR_OF_FAT: ; ADC A,C ; EDUP ; LD C,A -; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) +; LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) ; CP FAT_TYPE.x32 ; RET NZ ; ADD HL,HL ;x2 @@ -1795,34 +1785,34 @@ GET_SECTOR_OF_FAT: ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL PUSH DE - LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE.Start POP DE ; EX DE,HL - LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL + LD (CORE_BUFFERS.FS_Buffer.CacheBlock),HL ; CALL GET_SECTOR_OF_FAT ; ; BC:HL - номер лог.сектора - LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) ADD HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) ; JR NC,.no_inc ; INC HL .no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) XOR FAT_TYPE.x32 LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE JR NZ,.next LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE .next: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска RST ToDSS.DRV POP HL RET @@ -1839,13 +1829,13 @@ WRITE_FAT_TABLE: RET ; Запись кеша FAT-а на диск .Start: CALL SET_FSInfo - LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) + LD HL,(CORE_BUFFERS.FS_Buffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока LD (.pop_offset_HL),HL LD DE,FAT_CACHE.Sectors_32 - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR Z,.next LD DE,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде @@ -1857,9 +1847,9 @@ WRITE_FAT_TABLE: ; ; конец блока выходит за пределы таблицы? LD B,E ; MAX число секторов для чтения в кэш - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD (.sub_A),A - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) AND A LD A,C SBC HL,DE @@ -1880,8 +1870,8 @@ WRITE_FAT_TABLE: .pop_offset_HL+1: LD HL,0 ; B = число секторов - LD IX,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD IX,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) PUSH BC ; сохраняем первую копию FAT. Вход IX:DE - начало таблицы FAT ; C:HL - смещение внутри таблицы @@ -1889,31 +1879,31 @@ WRITE_FAT_TABLE: CALL .SAVE_FAT_XX ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 POP BC ; B = число секторов, C = старший байт смещения в секторах - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H) AND A SBC HL,DE JR NZ,.not_one_FAT - LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) - LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) ; CF = 0 SBC HL,DE JR Z,.only_one_FAT ; -.not_one_FAT: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) +.not_one_FAT: LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.fat_num_2 ; - LD A,(CORE_BUFFERS.FatBuffer.Number_Of_FATs) + LD A,(CORE_BUFFERS.FS_Buffer.Number_Of_FATs) CP 2 JR Z,.fat_num_2 ; сохраняем больше двух копий FAT - LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD D,0 EXX - LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) DEC A .many_fat_loop: EXX PUSH HL @@ -1928,10 +1918,10 @@ WRITE_FAT_TABLE: POP BC POP HL ; - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) ADD HL,DE EXX - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) POP HL ADC HL,DE EXX @@ -1940,14 +1930,14 @@ WRITE_FAT_TABLE: JR .norm_exit ; ; сохраняем вторую копию FAT -.fat_num_2: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) +.fat_num_2: LD IX,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L) LD HL,(.pop_offset_HL) CALL .SAVE_FAT_XX .norm_exit: AND A ;!TODO нет контроля ошибок .only_one_FAT: ; .ERR: LD A,0 - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A RET ; Вход: IX:DE - начало таблицы FAT в секторах ; C:HL - смещение в таблице в секторах @@ -1965,17 +1955,17 @@ WRITE_FAT_TABLE: LD XH,D LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT - LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) CP #FF JR NZ,.SAVE_NOT_ALL_BLOCK ; LD DE,FATPAGE.cache ; откуда - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV ; .SAVE_NOT_ALL_BLOCK: - ; A = CORE_BUFFERS.FatBuffer.CacheUpdated + ; A = CORE_BUFFERS.FS_Buffer.CacheUpdated ; HL:IX - смещение внутри раздела на начало нужного блока FAT ; B = максимальное число блоков для записи EXX @@ -2019,7 +2009,7 @@ WRITE_FAT_TABLE: EXX LD B,E ; кол-во секторов POP DE ; Адрес в странице КЭШа - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD C,Dss.DRV.Write RST ToDSS.DRV ; HL:IX = Sector + Sector counter @@ -2070,7 +2060,7 @@ GET_FAT32_CELL: ; EXX EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD HL,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH SBC HL,DE CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT POP HL @@ -2096,9 +2086,9 @@ GET_FAT16_CELL: ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -2139,9 +2129,9 @@ GET_FAT12_CELL: ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -2174,7 +2164,7 @@ CLUSTER_TO_SECTOR: DEC DE .no_dec_de: ; cluster = cluster - 2 ; - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -2189,13 +2179,13 @@ CLUSTER_TO_SECTOR: .skip: EX DE,HL LD XL,E LD XH,D - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_L) ; [x] fat32 ;XOR A ; ADD IX,DE ; [x] fat32 - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_H) ;LD D,A ;LD E,A ; @@ -2212,7 +2202,7 @@ CLUSTER_TO_SECTOR: ; IX - buffer in RAM ; B - количество секторов для чтения BLOCK_READ: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -2301,7 +2291,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR NC,.skip2 INC HL .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -2309,7 +2299,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR C,.Error POP BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) ;!TEST LD A,B LD B,C @@ -2325,7 +2315,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.loop4: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster +.loop4: LD HL,CORE_BUFFERS.FS_Buffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -2353,7 +2343,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX PUSH BC CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -2361,7 +2351,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX ; POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -2406,7 +2396,7 @@ CHECK_FIRST_CLUSTER: ; IY - FM ; B - количество секторов для записи BLOK_WRITE: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -2525,7 +2515,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX INC HL ; DOUBLE 1 .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -2534,7 +2524,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) ; LD A,B LD B,C @@ -2551,7 +2541,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.big_loop: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster +.big_loop: LD HL,CORE_BUFFERS.FS_Buffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -2584,7 +2574,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX CALL CLUSTER_TO_SECTOR ; DOUBLE 1 LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -2592,7 +2582,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -2758,5 +2748,6 @@ GET_OFFSET_IN_SECTORS: RET ;----------------------------------------------------------------------; -;//MODULE: FAT_X +FAT_MODULE_SIZE EQU $-FAT_MODULE_START +;//MODULE: FAT ;[END] \ No newline at end of file diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index c3efc03..a36feed 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -129,60 +129,60 @@ SCANKEY LD HL,HOST ; ; - IF CLASSIC_CURSOR ;------------------------------; +; IF CLASSIC_CURSOR ;------------------------------; -ECHOKEY: ;R01 -.CURCOUNT+1: LD A,#FF - INC A - LD (.CURCOUNT),A - AND #FF - JR NZ,.NOTUR -.CURSYM+1: LD A,#00 - XOR #01 - LD (.CURSYM),A +; ECHOKEY: ;R01 +; .CURCOUNT+1: LD A,#FF +; INC A +; LD (.CURCOUNT),A +; AND #FF +; JR NZ,.NOTUR +; .CURSYM+1: LD A,#00 +; XOR #01 +; LD (.CURSYM),A - CALL CURSOR - PUSH DE +; CALL CURSOR +; PUSH DE - LD A," " - JR Z,.CURSKI - LD A,"_" -.CURSKI: CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor +; LD A," " +; JR Z,.CURSKI +; LD A,"_" +; .CURSKI: CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor - POP DE - CALL LOCATE - ;LD A,8 ; BACKSPACE - ;CALL PUTCHAR -.NOTUR: CALL SCANKEY - JR Z,ECHOKEY - PUSH DE - PUSH BC - PUSH AF +; POP DE +; CALL LOCATE +; ;LD A,8 ; BACKSPACE +; ;CALL PUTCHAR +; .NOTUR: CALL SCANKEY +; JR Z,ECHOKEY +; PUSH DE +; PUSH BC +; PUSH AF - CALL CURSOR - PUSH DE +; CALL CURSOR +; PUSH DE - LD A," " - CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor +; LD A," " +; CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor - ;LD A,8 ; BACKSPACE - ;CALL PUTCHAR - POP DE - POP AF - PUSH DE - ;R01 [v] - CALL PUTCHAR.NO_SCROLL ; [x] -bug with Vasil's version of cursor +; ;LD A,8 ; BACKSPACE +; ;CALL PUTCHAR +; POP DE +; POP AF +; PUSH DE +; ;R01 [v] +; CALL PUTCHAR.NO_SCROLL ; [x] -bug with Vasil's version of cursor - POP DE - CALL LOCATE +; POP DE +; CALL LOCATE - POP BC - POP DE - LD A,E - AND A - RET +; POP BC +; POP DE +; LD A,E +; AND A +; RET - ELSE ;------------------------------; +; ELSE ;------------------------------; ;------; !FIXIT брать значения для знакогенератора из биоса? @@ -203,7 +203,7 @@ ECHOKEY: CALL Cursor_On ; POP AF OR A ; [x] -bug with Vasil's version of cursor - CALL NZ,PUTCHAR.NO_SCROLL ; добавил вывод "a" на экран + CALL NZ,PUTCHAR;.NO_SCROLL ; добавил вывод "a" на экран POP BC POP DE LD A,E @@ -294,46 +294,87 @@ cursor_interrupt: ; Настройка знакогенератора курсора черточкой SETUP_CURSORS: -.buffer EQU #C000 - ; - in a,(SLOT3) - push af ; сохр. порт - ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС - out (SLOT3),a - ; получить сист. знакоген. - ld de,.buffer ;!HARDCODE буфер для 2048 байт данных - push de - ld c,BIOS.WIN_GET_ZG ; получить знакоген. - rst ToBIOS - ; заполнить кодом #FF 2 нижние линии - ld hl,.buffer+(2048-(2*256)) ;!HARDCODE последние 512 байт - ld bc,511 - ld a,CURSOR_ZG; ; номер знакоген. "черточка" - call .fill_data_font - pop hl - ; заполнить остальные 6 линий (полный блок) - ld bc,2048-513 ;!HARDCODE - ld a,INS_CUR_ZG ; номер знакоген. "блок" - call .fill_data_font - pop af - out (SLOT3),a ; восст. порт - ret -; Настройка знакоген. и его регистрация -; вход: a=номер знакоген. -; hl=данные -; bc=размер данных -.fill_data_font: - ld e,l - ld d,h - ld (hl),#FF - inc de - ldir - ld de,.buffer ; знакоген. - ld c,BIOS.WIN_SET_ZG ; уст. знакоген. - jp ToBIOS - ;ret +.buffer EQU #C000 +.buffer.size EQU 2048 + ; + in a,(SLOT3) + push af ; сохр. порт + ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС + out (SLOT3),a + +; ; получить сист. знакоген. +; ld de,.buffer ;!HARDCODE буфер для 2048 байт данных +; push de +; ld c,BIOS.WIN_GET_ZG ; получить знакоген. +; rst ToBIOS +; ; заполнить кодом #FF 2 нижние линии +; ld hl,.buffer+(2048-(2*256)) ;!HARDCODE последние 512 байт +; ld bc,511 +; ld a,CURSOR_ZG; ; номер знакоген. "черточка" +; call .fill_data_font +; pop hl +; ; заполнить остальные 6 линий (полный блок) +; ld bc,2048-513 ;!HARDCODE +; ld a,INS_CUR_ZG ; номер знакоген. "блок" +; call .fill_data_font +; pop af +; out (SLOT3),a ; восст. порт +; ret +; ; Настройка знакоген. и его регистрация +; ; вход: a=номер знакоген. +; ; hl=данные +; ; bc=размер данных +; .fill_data_font: +; ld e,l +; ld d,h +; ld (hl),#FF +; inc de +; ldir +; .set: ld de,.buffer ; знакоген. +; ld c,BIOS.WIN_SET_ZG ; уст. знакоген. +; jp ToBIOS ; - ENDIF ;------------------------------; + ; [ ] 31/03/2025 + ; получить сист. знакоген. + call .get_font + ; заполнить кодом #FF 2 нижние линии + ld hl,.buffer+(.buffer.size - (2*256)) ; последние 512 байт + ld e,l + ld d,h + ld bc,512-1 + ld (hl),#FF + inc de + ldir + ld a,CURSOR_ZG; ; номер знакоген. "черточка" + call .set_font + ; получить сист. знакоген. + call .get_font + ; инвертируем фонт + ld hl,.buffer + ld bc,.buffer.size +.loop_font: ld a,(hl) + cpl + ld (hl),a + cpi + jp pe,.loop_font + ; + ld a,INS_CUR_ZG ; номер знакоген. "блок" + call .set_font + ; + pop af + out (SLOT3),a ; восст. порт + ret + ; +.set_font: ld c,BIOS.WIN_SET_ZG ; уст. знакоген. + jr ._font + ; +.get_font: ld c,BIOS.WIN_GET_ZG ; получить знакоген. +._font: ld de,.buffer ; буфер для 2048 байт данных + jp ToBIOS + + +; +; ENDIF ;------------------------------; diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 7d09fd0..fdabc66 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -26,7 +26,7 @@ ;[ ] fat32 STRUCT _sFM ; 54 bytes ; from FAT -; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME +; .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 @@ -35,8 +35,8 @@ ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED -; .TIME: WORD #0000 ;+ #16 +22 TIME -; .DATE: WORD #0000 ;+ #18 +24 DATE +; .TIME: WORD #0000 ;+ #16 +22 TIME +; .DATE: WORD #0000 ;+ #18 +24 DATE ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE .FS_REC FAT_DIRECTORY_RECORD @@ -77,7 +77,7 @@ ; LEN3 EQU 30 ; FTASK EQU 42 ; - STRUCT _sFatBuffer + STRUCT _sFS_Buffer .DRIVE: BYTE #FF .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32 .CacheBlock: WORD #0000 @@ -121,7 +121,7 @@ STRUCT _sBuffers .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; -.FatBuffer _sFatBuffer +.FS_Buffer _sFS_Buffer ;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .EXE_Header _sEXE_HEADER ; 512 bytes .Stack _sStack ; 256 bytes diff --git a/DSS/build.txt b/DSS/build.txt index 368f89c..d99e90e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -28 \ No newline at end of file +29 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index aec6456..7ffd5d8 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -21,7 +21,7 @@ DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift. DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C DEFINE USE_E1_SCANCODE 0 - DEFINE CLASSIC_CURSOR 0 +; DEFINE CLASSIC_CURSOR 0 ; ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе @@ -92,16 +92,16 @@ FAT_CACHE: ;.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1) ;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// + DEFINE NeedSafePort_Y 1 +; DEFINE TABisSPACES 0 +; DEFINE EnoughtOnly_LF 0 + DEFINE NON_REMOVABLE_FDD 0 ; - DEFINE DSS_MAX_SECTOR_SIZE 512 - +DSS_MAX_SECTOR_SIZE EQU 512 DSS_MAX_DRIVES_AMOUNT EQU 26 - DEFINE MAX_RAMDRIVES 16 - DEFINE NeedSafePort_Y 1 - DEFINE TABisSPACES 0 - DEFINE EnoughtOnly_LF 0 - DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 - DEFINE NON_REMOVABLE_FDD 0 +MAX_RAMDRIVES EQU 16 +MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 2.55 + DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10 ; ;-------------------[MEMORY]-------------------------; diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 11e9c0c..432fc70 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -39,9 +39,10 @@ cmd_cls: ex de,hl ; hl= cls_clear: ld a,b ld (color_screen),a ; атрибут ld de,0 ; Y/X полож. - ld hl,#2050 ; Y/X размер - ld c,BIOS.LP_CLS_WIN ; очистить окно (выводом пробелов) - RST ToBIOS + ld hl,#2050 ; Y/X размер ;!HARDCODE win size + ld a," " + ld c,Dss.Clear ; очистить окно + RST ToDSS ; уст. курсор в Home ld de,0 ; Y/X полож. ld c,Dss.Locate diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index b6e2535..df431b4 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -4,14 +4,17 @@ ; ;/////////////////////////////////////////////////// cmd_help: LD HL,.help_txt - LD A,(color_screen) - EX AF,AF' - XOR A - LD BC,BIOS.LP_PR_LINE_DIR - JP ToBIOS ;!FIXIT тестовый вариант, переделать на DSS + JP PRINTZ + ; LD A,(color_screen) + ; AND A ; no attr-mode + ; EX AF,AF' + ; XOR A ; no XY-mode + ; LD BC,BIOS.LP_PR_LINE_DIR + ; LD IY,0 ; YH = YL = B + ; JP ToBIOS ;JP ECHO_MESSAGE -; 1 2 3 4 5 6 7 8 +; 1 2\ 3 4 5 6 7 8 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; .help_txt: DB "COMMANDS:\r\n" DB "SET INFO REN = RENAME PATH CLS [ink]\r\n" @@ -19,4 +22,13 @@ cmd_help: LD HL,.help_txt DB "MD = MKDIR TIME ECHO EXIT\r\n" DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f]\r\n\n" ; ; ; ; ; ; ; ; ; ; ; ; ; -; \ No newline at end of file +; +;LP_PR_LINE_DIR: +; A - атрибуты выводимого символа если ZF=0 +; CF - XY-mode +; DE - место символа в окне, если CF=1 +; HL - адрес с выводимой строкой +; B - разделитель +; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны +; A' - цвет консоли (используется при скролле и очистке окна) +; CF' - выводить символ с атрибутами \ No newline at end of file diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index e22a51a..fc778ee 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -83,12 +83,12 @@ print_compath: ; очистить экран. строку ld de,(cursor_position) ; Y/X полож. ld e,0 - ld hl,#0150 ; Y/X размер + ld hl,#0150 ; Y/X размер ;!HARDCODE win size ld a,(color_screen) ; атрибут ld b,a ld a," " ; символ очистки - ld c,BIOS.LP_CLS_WIN2 ; очистить окно - RST ToBIOS + ld c,Dss.Clear ; очистить окно + RST ToDSS pop bc ; вывести экран. путь ld hl,Buffers.screen_path ; экран. путь diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index a28b21f..28a686b 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -19,7 +19,6 @@ MAIN_MSG: .DIR_2 EQU .DIR_2_ .DIR_3 EQU .DIR_3_ .DIR_4 EQU .DIR_4_ -;.HELP EQU .HELP_ .CALCULATING EQU .CALC_ .CRLF EQU .CRLF_ .INFO_1 EQU .INFO_1_ @@ -51,12 +50,6 @@ MAIN_MSG: DZ " %4 Dir(s)\r %5 byte(s) capacity\r\n" stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT -; ;!TODO печатать не через ECHO_MESSAGE -; stN .HELP_ : db "COMMANDS:\r\n" -; db "SET INFO REN = RENAME PATH CLS [ink] " -; db "CD = CHDIR DEL = ERASE HELP VER = VERSION " -; db "MD = MKDIR TIME ECHO EXIT " -; DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5\r\n" diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM index fc1d8a2..d843bd9 100644 --- a/SHELL/Procedures/Print.ASM +++ b/SHELL/Procedures/Print.ASM @@ -56,6 +56,48 @@ LCPIR: xor a .no_mess: INC HL RET + +;----------------------------------------------------------------------; +; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 +; вход: hl=буфер строки +;----------------------------------------------------------------------; +PRINTZ: ld a,(hl) + inc hl + or a + ret z + ; + cp '%' + jr z,.check_PRM +.char: ld c,Dss.PutChar + RST ToDSS + jp PRINTZ + ; +.bad_PRM: ld a,'%' + jp .char + ; +.check_PRM: ld a,(hl) + cp '9'+1 + jr nc,.bad_PRM + ; + inc hl + sub '1' + push hl + ADD A + ADD A + ADD A + ADD A + LD L,A + LD H,0 + ; + ld bc,Buffers.bat_params.PRM1 + add hl,bc + ld c,Dss.PChars ; вывод строки + RST ToDSS + pop hl + jp PRINTZ + + +/* ;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована ;----------------------------------------------------------------------; ; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 @@ -100,7 +142,7 @@ PRINTZ: ld a,(hl) RST ToDSS pop hl jp PRINTZ - +*/ ; буферы аргументов командной строки ; PRM1: BLOCK 16,0 ; аргумент %1 diff --git a/SHELL/build.txt b/SHELL/build.txt index 941d0e5..e1170b6 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -479 \ No newline at end of file +489 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 9143dcb..a9f5915 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9143dcb7f8fd9cd3ae0bc179b94fced5efd8667f +Subproject commit a9f5915a3275f5ffbafa0994bb97c5846aab826c From cc65c4ba24b9c6bce775c0a0be1af50de8e44213 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 14 Apr 2025 01:19:45 +1000 Subject: [PATCH 200/219] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=20OPENDSK=20-=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B1=D1=8B?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=B8=D0=B7=D0=BD=D0=B0=D0=BA=20media=20c?= =?UTF-8?q?hanged,=20=D1=82=D0=BE=20=D0=BD=D0=B5=20=D1=82=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=8B=D1=82=D0=B0=D0=BB=D0=BE=D1=81=D1=8C=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D1=80=D1=8B=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/MkDir.asm | 12 ------------ DSS/DOS_Proc.asm | 6 +++--- DSS/DSS-MAIN.ASM | 4 ++-- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index bd3c466..6bf4046 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -168,18 +168,6 @@ MKDIR: PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора ; - ; IN A,(SLOT3) - ; PUSH AF - ; IN A,(SLOT0) - ; OUT (SLOT3),A - ; ; - ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 - ; LD BC,1*256 + Dss.DRV.Write - ; RST ToDSS.DRV - ; ; - ; POP AF - ; OUT (SLOT3),A CALL WRITE_SECTOR ; !FIXIT нет проверки на ошибку ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 21dc66b..1bc60db 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -183,9 +183,9 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; ; IN: A - drive number OPENDSK: ;!TEST DRV.Open обход R10 - LD C,A + LD B,A LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - CP C + CP B JR NZ,.open PUSH BC LD C,Dss.DRV.MediaCheck @@ -194,7 +194,7 @@ OPENDSK: ;!TEST DRV.Open JR Z,.exit JR .skip_open ;!FIXIT когда DRV.MediaCheck и DRV.Open будут отличаться ; -.open: LD A,C +.open: LD A,B ; .force: PUSH AF LD C,Dss.DRV.Open diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index af5b6c7..a3057e0 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -607,8 +607,8 @@ F_START: DI ;LD A,H ;LD A,0 ; - LD B,1 - CALL BOOTDSK + ;LD B,1 + CALL BOOTDSK.SET RET C ; EI From a51e56090b3f8852f7b20de4b6239ed71a56a0d7 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 15 Apr 2025 04:36:35 +1000 Subject: [PATCH 201/219] =?UTF-8?q?-bug=20fdd-drv.asm:=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B1=D1=83=D0=B4=D0=B5=D1=82=20=D1=87=D0=B8=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80=20=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D1=88=D0=B5=20DSS=5FMAX=5FSECTOR=5FSIZE.=20-bug=20?= =?UTF-8?q?OPENDSK:=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=20Dss.DRV.MediaCheck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS_Proc.asm | 1 + DSS/build.txt | 2 +- DSS/drivers/media/Shared.asm | 1 - DSS/drivers/media/ata_atapi-drv.asm | 4 +--- DSS/drivers/media/fdd-drv.asm | 23 +++++++++++++++++++---- Shared_Includes | 2 +- 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 1bc60db..8720dd6 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -192,6 +192,7 @@ OPENDSK: ;!TEST DRV.Open RST ToDSS.DRV POP BC JR Z,.exit + JR C,.error JR .skip_open ;!FIXIT когда DRV.MediaCheck и DRV.Open будут отличаться ; .open: LD A,B diff --git a/DSS/build.txt b/DSS/build.txt index d99e90e..8580e7b 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -29 \ No newline at end of file +30 \ No newline at end of file diff --git a/DSS/drivers/media/Shared.asm b/DSS/drivers/media/Shared.asm index abda541..9a4a8ad 100644 --- a/DSS/drivers/media/Shared.asm +++ b/DSS/drivers/media/Shared.asm @@ -182,7 +182,6 @@ MAKEDVC: LD C,A RET -;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые ;------------------------------------------------- ; RST 18h. Вектор дисковых устройств ; вход: a=номер устройства (0-25) diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 8934286..b6be0c5 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -620,6 +620,7 @@ MediaCheck: PUSH IY ; CP DSS_Error.sys.UNKNOWN_FORMAT JR NZ,.exit + ; A != 0 AND A ; сброс ZF SCF ; [ ] media changed @@ -669,9 +670,6 @@ MediaCheck: PUSH IY CHECK_IDE_SECTOR_SIZE: ;RET LD E,(IY+LOGDRV.SECTOR_SIZE) LD D,(IY+LOGDRV.SECTOR_SIZE+1) - ; LD HL,DSS_MAX_SECTOR_SIZE - ; AND A - ; SBC HL,DE PUSH HL LD HL,-DSS_MAX_SECTOR_SIZE - 1 ADD HL,DE diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index e1d65f6..5ba7d07 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -178,8 +178,21 @@ Init: LD A,2 ; ; ; ; ; -Open: LD C,BIOS.DRV_RESET +Open: PUSH AF + LD C,BIOS.DRV_RESET RST ToBIOS + POP BC + RET C + ; + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + LD DE,-DSS_MAX_SECTOR_SIZE - 1 ; [ ] 15/04/25 не будет читать сектор больше DSS_MAX_SECTOR_SIZE + ; ZF = 0 + LD A,DSS_Error.sys.UNKNOWN_FORMAT + OR A + ; + ADD IX,DE ; если размер сектора больше, то облом RET ; ; ; @@ -190,7 +203,9 @@ Close: XOR A ;!FIXIT проверять ВГ93 когда это станет возможным -MediaCheck: IF NON_REMOVABLE_FDD +MediaCheck: CALL Open + RET C + IF NON_REMOVABLE_FDD XOR A ELSE LD A,#FF @@ -234,13 +249,13 @@ GetBPB: LD IX,0 ; RET ; ; ; -; +; !FIXIT может умереть на размере сектора больше 512 байтов Read: LD C,BIOS.DRV_READ RST ToBIOS RET ; ; ; -; +; !FIXIT может умереть на размере сектора больше 512 байтов Write: LD C,BIOS.DRV_WRITE RST ToBIOS RET diff --git a/Shared_Includes b/Shared_Includes index a9f5915..bd4546a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a9f5915a3275f5ffbafa0994bb97c5846aab826c +Subproject commit bd4546a854905998edab6144547b79aa673404f6 From 1430dec04555f8fd2c40b95cb0e8514fa26d9e8c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 16 Apr 2025 04:49:07 +1000 Subject: [PATCH 202/219] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20DSS=5FMAX=5FSECTOR=5FSIZE=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20FDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/build.txt | 2 +- DSS/drivers/media/ATAPI/CDX.ASM | 4 +- DSS/drivers/media/ReScanDRV.ASM | 6 +-- DSS/drivers/media/Shared.asm | 4 +- DSS/drivers/media/ata_atapi-drv.asm | 37 ++-------------- DSS/drivers/media/fdd-drv.asm | 20 ++++----- DSS/drivers/media/ram_disk-drv.asm | 60 +++++++++++++------------- SHELL/Procedures/Print.ASM | 65 ++++++++++++++++------------- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 10 files changed, 86 insertions(+), 116 deletions(-) diff --git a/DSS/build.txt b/DSS/build.txt index 8580e7b..b74e882 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -30 \ No newline at end of file +31 \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/CDX.ASM b/DSS/drivers/media/ATAPI/CDX.ASM index cac2242..e0be89b 100644 --- a/DSS/drivers/media/ATAPI/CDX.ASM +++ b/DSS/drivers/media/ATAPI/CDX.ASM @@ -249,8 +249,8 @@ ERR_MSG PUSH DE FMESAGE INC DE - LD HL,ERR0 - LD BC,ERR0.Size + LD HL,SYS_ERRORS + LD BC,SYS_ERRORS.Size LCPIR XOR A CPIR RET PO diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM index f88ebdd..201c18e 100644 --- a/DSS/drivers/media/ReScanDRV.ASM +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -55,7 +55,7 @@ ReScanDRV: ; HDD! Сверка по таблице LOGDRV JP Z,SCAN_TABLES.HARD_DRV ; RD? - LD HL,RMDRIVE + LD HL,RAMDSK_DRV.API_TABLE AND A SBC HL,DE ; RAM Drive! Сверка по таблице RAMDTBL @@ -173,7 +173,7 @@ Fill_if_Exists: LD A,RAMDTBL.TBL_Entry LD IY,RAMDTBL CALL .RUN - LD DE,RMDRIVE + LD DE,RAMDSK_DRV.API_TABLE RET NC LD A,(.tbl) DEC A ;!!!!! может быть переполнение @@ -328,7 +328,7 @@ RAM_DRV: ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL LD A,B LD BC,OLD_TABLES.RAMDTBL - CALL GET_RAMDRV_NUM.skip_tbl + CALL RAMDSK_DRV.GET_RAMDRV_NUM.skip_tbl LD (.cur_drv),BC AND #0F LD C,A ; номер рамдиска diff --git a/DSS/drivers/media/Shared.asm b/DSS/drivers/media/Shared.asm index 9a4a8ad..4ea4497 100644 --- a/DSS/drivers/media/Shared.asm +++ b/DSS/drivers/media/Shared.asm @@ -140,8 +140,8 @@ INITDVC: XOR A LD DE,IDE_DRV.API_TABLE CALL MAKEDVC ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE + CALL RAMDSK_DRV.Init + LD DE,RAMDSK_DRV.API_TABLE CALL MAKEDVC XOR A RET diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index b6be0c5..1dd9d8d 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -580,40 +580,9 @@ Open: CALL MediaCheck SCF RET ; - ;[ ] media changed - bios 5x DETECT -; выход A=#FF - changed, A=0 - not changed, ZF=1 - not changed -; MediaCheck: PUSH IY -; CALL SelectDrive -; JR C,.exit -; ; -; ; [ ] media changed -; LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) -; LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT -; PUSH IY -; RST ToBIOS -; POP IY -; JR NC,.next_check -; ; -; CP BIOS.Error.ATAPI.UnitAttention -; JR Z,.Reinit -; JR .exit -; ; -; .next_check: BIT 1,(IY + LOGDRV.MediaParameters) -; JR NZ,.Reinit -; ; -; XOR A -; .exit: POP IY -; RET -; ; -; .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) -; LD (CURRENT_DRIVE.Number),A -; LD (LOGDRV_OFFSET),IY -; ;RES 1,(IY + LOGDRV.MediaParameters) -; CALL DEFINE_PARTITIONS -; LD A,#FF ;!HARDCODE drive changed -; OR A -; POP IY -; RET + + +;[ ] media changed - bios 5x DETECT MediaCheck: PUSH IY CALL SelectDrive.NoSector JR NC,.next_step diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index 5ba7d07..f72dfac 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -172,7 +172,7 @@ Reserved: LD A,DSS_Error.drv.INVALID_COMMAND ;;;;;;;;;;;;;;;;;;;;;;;;;;; ; -Init: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? +Init: LD A,2 ;количество FDD в компе AND A RET ; ; ; @@ -190,9 +190,9 @@ Open: PUSH AF LD DE,-DSS_MAX_SECTOR_SIZE - 1 ; [ ] 15/04/25 не будет читать сектор больше DSS_MAX_SECTOR_SIZE ; ZF = 0 LD A,DSS_Error.sys.UNKNOWN_FORMAT - OR A + OR A ; убираем ZF, если есть ; - ADD IX,DE ; если размер сектора больше, то облом + ADD IX,DE ; если размер сектора больше, то облом RET ; ; ; @@ -202,7 +202,7 @@ Close: XOR A ; ; ; -;!FIXIT проверять ВГ93 когда это станет возможным +;!FIXIT проверять ВГ93 когда (если) это станет возможным MediaCheck: CALL Open RET C IF NON_REMOVABLE_FDD @@ -249,13 +249,13 @@ GetBPB: LD IX,0 ; RET ; ; ; -; !FIXIT может умереть на размере сектора больше 512 байтов + Read: LD C,BIOS.DRV_READ RST ToBIOS RET ; ; ; -; !FIXIT может умереть на размере сектора больше 512 байтов + Write: LD C,BIOS.DRV_WRITE RST ToBIOS RET @@ -411,16 +411,10 @@ GenIOCTL: BIT 7,B POP AF LD C,BIOS.DRV_SET_PAR JP ToBIOS - ;RST ToBIOS - ;RET C - ;AND A - ;RET ; ; ; -Removable: ; LD A,1 - ; AND A - XOR A +Removable: XOR A INC A RET ; ; ; diff --git a/DSS/drivers/media/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm index b9b5480..9dfb64f 100644 --- a/DSS/drivers/media/ram_disk-drv.asm +++ b/DSS/drivers/media/ram_disk-drv.asm @@ -202,54 +202,57 @@ ; OR #60 ;!HARDCODE сделать номера разных устройств через метки ; ENDM + MODULE RAMDSK_DRV ; parser -RMDRIVE: INC C +API_TABLE: INC C DEC C - JP Z,INIT_RD ; 0 + JP Z,Init ; 0 DEC C - JR Z,RESET_RD ; 1 + JR Z,Open ; 1 DEC C - JR Z,STATUS_RD ; 2 + JR Z,Close ; 2 DEC C - JR Z,CHEK_RD ; 3 + JR Z,MediaCheck ; 3 DEC C - JR Z,GBPB_RD ; 4 + JR Z,GetBPB ; 4 DEC C - JR Z,READ_RD ; 5 + JR Z,Read ; 5 DEC C - JR Z,WRITE_RD ; 6 + JR Z,Write ; 6 DEC C - JR Z,REMOV_RD ; 7 + JR Z,Removable ; 7 DEC C - JP Z,IOCTL_RD ; 8 + JP Z,GenIOCTL ; 8 DEC C JP Z,.error ; 9 RESR_H DEC C - JP Z,LREAD_RD ; 10 + JP Z,ReadLong ; 10 DEC C - JP Z,LWRITE_RD ; 11 -.error: - LD A,DSS_Error.drv.INVALID_COMMAND + JP Z,WriteLong ; 11 + ; +.error: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET -REMOV_RD: -RESET_RD: -STATUS_RD: XOR A +; +Removable: +Open: +Close: XOR A RET +; ;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение ;!FIXIT как-то определять смену RMD? ; [x] 18/08/2024 пока немного костыльно и опасно -CHEK_RD: ;LD A,#FF +MediaCheck: ;LD A,#FF ;AND A XOR A ; RET ;DE - ADDRESS -GBPB_RD: LD IX,0 +GetBPB: LD IX,0 LD HL,0 LD B,#01 ;JP READ_RD @@ -258,7 +261,7 @@ GBPB_RD: LD IX,0 ; DE - ADDRESS ; B - COUNT ; A - DRIVE -READ_RD: PUSH BC +Read: PUSH BC CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_READ @@ -266,8 +269,7 @@ READ_RD: PUSH BC ; RST ToBIOS ; XOR A ; RET -LREAD_RD: - PUSH BC +ReadLong: PUSH BC CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_READ_LONG @@ -281,8 +283,7 @@ LREAD_RD: ; DE - ADDRESS ; B - COUNT ; A - DRIVE -WRITE_RD: - PUSH BC +Write: PUSH BC CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_WRITE @@ -291,8 +292,7 @@ WRITE_RD: ; XOR A ; RET -LWRITE_RD: - PUSH BC +WriteLong: PUSH BC CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_WRITE_LONG @@ -358,7 +358,7 @@ LWRITE_RD: ;;; ;----------------------------------------------------------------------;!TEST ;S_P_P DB #00 -INIT_RD: +Init: ; .SectorSize EQU 512 ;!HARDCODE ; LD HL,.SectorSize ; LD A,#80 @@ -425,8 +425,7 @@ INIT_RD: ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK -IOCTL_RD: - BIT 7,B +GenIOCTL: BIT 7,B JR NZ,.O_CTL_F INC B DEC B @@ -530,4 +529,5 @@ GET_RAMDRV_NUM: LD BC,RAMDTBL RET ; ;ENDDRVR EQU $ -; \ No newline at end of file + ENDMODULE ;RAMDSK_DRV +; diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM index d843bd9..b56412f 100644 --- a/SHELL/Procedures/Print.ASM +++ b/SHELL/Procedures/Print.ASM @@ -3,16 +3,23 @@ ; вход: a=номер ошибки ;------------------------------------------------- print_err_message: - ld e,a - ld d,0 - inc de - ld hl,ERR0 ; массив строк - ld bc,ERR0.Size ; размер массива - call LCPIR ; найти строку - call PRINTZ ; формат. вывод строки -; call newline - jp newline - + ld hl,SYS_ERRORS ; массив строк + ld bc,SYS_ERRORS.Size ; размер массива + ;cp %1000'0000 + RLA + jr nc,.set_de + ; + ;and %0111'1111 + ld hl,DRV_ERRORS ; массив строк + ld bc,DRV_ERRORS.Size ; размер массива + ; +.set_de: SRL A + ld e,a + ld d,0 + inc de + call LCPIR ; найти строку + call PRINTZ ; формат. вывод строки + jp newline ; Вывод строки ошибки @@ -36,25 +43,25 @@ ECHO_MESSAGE: ; Найти строку по индексу ; вход: de=индекс строки ; выход: hl=строка -FMESAGE: inc de - ld hl,MAIN_MSG.TABLE ; начало массива строк - ld bc,MAIN_MSG.TABLE.Size ; размер массива -LCPIR: xor a - cpir - ret po - ret nz - ;R11 - XOR A - CP (HL) - JR Z,.no_mess - ; - dec de - ld a,d - or e - jr nz,LCPIR - ret -.no_mess: INC HL - RET +FMESAGE: inc de + ld hl,MAIN_MSG.TABLE ; начало массива строк + ld bc,MAIN_MSG.TABLE.Size ; размер массива +LCPIR: xor a + cpir + ret po + ret nz + ;R11 + XOR A + CP (HL) + JR Z,.no_mess + ; + dec de + ld a,d + or e + jr nz,LCPIR + ret +.no_mess: INC HL + RET ;----------------------------------------------------------------------; diff --git a/SHELL/build.txt b/SHELL/build.txt index e1170b6..473995f 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -489 \ No newline at end of file +494 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index bd4546a..f533c03 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit bd4546a854905998edab6144547b79aa673404f6 +Subproject commit f533c03f52f53e581c794c1017b7b0d61d39dfbf From fb13b0231b856662c8cc699b99a0cb488003bc32 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 18 Apr 2025 05:46:36 +1000 Subject: [PATCH 203/219] =?UTF-8?q?=D0=BB=D1=83=D1=87=D1=88=D0=B5=20=D0=B1?= =?UTF-8?q?=D1=8B=20=D1=8F=20=D1=8D=D1=82=D0=BE=D0=B3=D0=BE=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API.asm | 6 +- DSS/API/ChDisk.asm | 24 ++++++ DSS/API/ChnDisk.asm | 4 +- DSS/API/Execute.ASM | 15 +--- DSS/API/diskINF.asm | 2 +- DSS/DOS_Proc.asm | 31 ++++--- DSS/DRV-MAIN.ASM | 23 +++--- DSS/DSS-MAIN.ASM | 4 +- DSS/build.txt | 2 +- DSS/drivers/media/ReScanDRV.ASM | 40 --------- DSS/drivers/media/Shared.asm | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 122 ++++++---------------------- DSS/drivers/media/fdd-drv.asm | 12 +-- DSS/drivers/media/ram_disk-drv.asm | 10 +-- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 16 files changed, 108 insertions(+), 193 deletions(-) create mode 100644 DSS/API/ChDisk.asm diff --git a/DSS/API.asm b/DSS/API.asm index b5e5b61..d24b0a1 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -59,7 +59,7 @@ include 'API/Open.asm' include 'API/Close.asm' include 'API/Find.asm' - include 'API/ChnDisk.asm' + include 'API/ChDisk.asm' include 'API/CurrDir.asm' include 'API/Time.asm' include 'API/GetDateTime.asm' @@ -88,8 +88,8 @@ ;R09 - ;Дубль - CHNDISK = OPENDSK - ;CHNDISK: + ;Дубль - CHDISK = OPENDSK + ;CHDISK: ; PUSH AF ; LD C,Dss.DRV.Open ; RST ToDSS.DRV diff --git a/DSS/API/ChDisk.asm b/DSS/API/ChDisk.asm new file mode 100644 index 0000000..7cd2664 --- /dev/null +++ b/DSS/API/ChDisk.asm @@ -0,0 +1,24 @@ +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// +CHDISK_FN: CALL CHDISK + RET C + PUSH AF + CALL DIR_PATH_CHANGE.FullCurrent + POP AF + RET +CHDISK: ;[x] более корректная смена диска + CALL OPENDSK + ; + ;R010 + RET C + LD HL,CORE_BUFFERS.WorkDirectory + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B + RET +; \ No newline at end of file diff --git a/DSS/API/ChnDisk.asm b/DSS/API/ChnDisk.asm index 119846c..dc099b0 100644 --- a/DSS/API/ChnDisk.asm +++ b/DSS/API/ChnDisk.asm @@ -2,13 +2,13 @@ ; ; //////////////////////////////////////////////////////////////////////// -CHNDISK_FN: CALL CHNDISK +CHDISK_FN: CALL CHDISK RET C PUSH AF CALL DIR_PATH_CHANGE.FullCurrent POP AF RET -CHNDISK: ;[x] более корректная смена диска +CHDISK: ;[x] более корректная смена диска CALL OPENDSK ; ;R010 diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 1371678..b830d56 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -103,7 +103,6 @@ EXEC_1: ;LD (CMDLINE),HL CALL MASK RET C CALL TST_EXT - ;LD A,DSS_Error.sys.FILE_NOT_FOUND RET C _mINCTASK ;R08 CALL OPEN_FN.FILE @@ -164,17 +163,11 @@ EXEC02: LD (EXE_FM),A LD A,DSS_Error.sys.INVALID_EXE SCF JP NZ,ERREXE - ;!TEST - ;LD A,(CORE_BUFFERS.EXEBUFF.VERSION) - ;OR A - ;LD A,DSS_Error.sys.UNKNOWN_EXE - ;SCF - ;JP NZ,ERREXE - LD A,MINIMUM_EXE_VERSION - CP (IX + _sEXE_HEADER.VERSION) - LD A,DSS_Error.sys.UNKNOWN_EXE - JP C,ERREXE ; + LD A,MINIMUM_EXE_VERSION + CP (IX + _sEXE_HEADER.VERSION) + LD A,DSS_Error.sys.UNKNOWN_EXE + JP C,ERREXE ; LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) LD A,E diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 5ddf0bd..95edd5e 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -137,7 +137,7 @@ DISKINF: LD C,B JR Z,.CheckFreeSpace ; .CustomDisk: PUSH BC - CALL CHNDISK ;R06 + CALL CHDISK ;R06 POP BC RET C ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 8720dd6..8e45be8 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -108,7 +108,7 @@ SetPath_GetName: INC HL INC HL PUSH HL - CALL CHNDISK + CALL CHDISK ;CALL OPENDSK POP HL RET C @@ -164,9 +164,9 @@ SetPath_GetName: ; SUB #20 ; .next: SUB 'A' ; PUSH HL -; ;!TEST CHNDISK OPENDSK +; ;!TEST CHDISK OPENDSK ; ;CALL OPENDSK -; CALL CHNDISK +; CALL CHDISK ; ; ; POP HL ; RET C @@ -220,19 +220,24 @@ OPENDSK: ;!TEST DRV.Open AND A RET ; !FIXIT костыль для Flex Navigator ; [ ] media change -.error: CP DSS_Error.sys.INVALID_DRIVE - SCF - RET Z - ; - CP DSS_Error.sys.MEDIA_CHANGED - SCF - RET Z - ; - CP DSS_Error.sys.UNKNOWN_FORMAT +.error: CALL .error_convert + LD A,C SCF + RET + ; +.error_convert: CP DSS_Error.drv.INVALID_DRIVE + LD C,DSS_Error.sys.INVALID_DRIVE RET Z ; - LD A,DSS_Error.sys.NOT_READY + CP DSS_Error.drv.ATAPI.UnitAttention + LD C,DSS_Error.sys.MEDIA_CHANGED + RET Z + ; + CP DSS_Error.drv.UNKNOWN_FORMAT + LD C,DSS_Error.sys.UNKNOWN_FORMAT + RET Z + ; + LD C,DSS_Error.sys.NOT_READY RET ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 3ea33ff..aadbf45 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -34,7 +34,7 @@ A0000: JP RST_00 ; RST_00: - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET ; @@ -83,7 +83,7 @@ A0020: JP DRV_PAGE.RST_20 ; DRV_PAGE.RST_20: - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET ; @@ -98,7 +98,7 @@ A0028: JP DRV_PAGE.RST_28 ; DRV_PAGE.RST_28: - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET ; @@ -195,16 +195,19 @@ A0066: JP DRV_PAGE.NMI ; //////////////////////////////////////////////////////////////////////// ; <[DRIVE PAGE SWITCH]> ; BLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 -PORTAL.out_DRV: PUSH BC ; +PORTAL.out_DRV: PUSH BC .RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV использует это значение -.switch: OUT (C),B ; +.switch: OUT (C),B ASSERT $!=84,'-> Portal error!'; ;Entry point from DSS main page - LD (.RETBANK),A ; - POP BC ; - POP AF ; -.ADCALL+1: CALL DISPATCH ; патчится на INTDISK - JP PORTAL.out_DRV ; + LD (.RETBANK),A + POP BC + POP AF +.ADCALL+1: CALL DISPATCH ; патчится на INTDISK + JR NC,PORTAL.out_DRV + XOR DSS_Error.DRV_MASK + SCF + JP PORTAL.out_DRV //////////////////////////////////////////////////////////////////////// diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index a3057e0..f1328f4 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -338,7 +338,7 @@ GO_ZERO EQU #0000 DSS_API_TABLE: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX - DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 + DB low F_START, low CHDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST_FN,low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 @@ -367,7 +367,7 @@ DSS_API_TABLE: ;DS 512 ;,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: - DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK + DB high F_START, high CHDISK_FN, high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST_FN,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS diff --git a/DSS/build.txt b/DSS/build.txt index b74e882..dc7b54a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -31 \ No newline at end of file +33 \ No newline at end of file diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM index 201c18e..ea9edcd 100644 --- a/DSS/drivers/media/ReScanDRV.ASM +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -276,46 +276,6 @@ Find_Record: RET ;-----------------------[] -;-----------------------[] -; ERROR_BOOTDRV_DIES: -; DI -; LD E,1 -; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default -; RST ToBIOS -; ; -; LD HL,#2050 -; LD DE,0 -; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN -; RST ToBIOS -; ; -; LD A,1 -; OUT (SCREEN_SWITCH),A ; set scr-2 -; ; -; LD HL,.ERROR_MSG -; LD DE,#A000 -; LD BC,.ERROR_MSG.size -; LD A,C -; LDIR -; ; -; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 -; LD C,BIOS.LP_SET_PLACE -; RST ToBIOS -; ; -; LD HL,#A000 -; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE -; LD B,A -; LD C,BIOS.LP_PRINT_LINE3 -; RST ToBIOS -; ; -; .loop: DI -; HALT -; JR .loop -; ; -; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -; .ERROR_MSG.size EQU $-.ERROR_MSG -;-----------------------[] - - ;-----------------------[] ; НЕ ГРОХАТЬ HL! ; а. если драйв есть в новой и старой, то затираем в новой diff --git a/DSS/drivers/media/Shared.asm b/DSS/drivers/media/Shared.asm index 4ea4497..6b19888 100644 --- a/DSS/drivers/media/Shared.asm +++ b/DSS/drivers/media/Shared.asm @@ -210,7 +210,7 @@ INTDISK: RET NODEV: POP BC POP HL - LD A,DSS_Error.drv.INVALID_DRIVE + LD A,BIOS.Error.BadNumber SCF RET diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 1dd9d8d..7b62967 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -207,7 +207,7 @@ API_TABLE: INC C DEC C JP Z,WriteLong ; [ ] ; c=11 Write Long ; -.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND +.Reserved: LD A,BIOS.Error.InvalidSubFunction SCF RET @@ -279,7 +279,7 @@ Init: PUSH IY DJNZ .NX_DVCI RET ; -.check_error: XOR BIOS.Error.BadNumber +.check_error: XOR BIOS.Error.BadNumber ; так надо RET NZ SCF RET @@ -294,34 +294,6 @@ Init: PUSH IY ;+10 WORD Sector Size ;+12 BYTE Removable Media Byte flags ;+13_15 FREE -; SelectDrive: PUSH DE -; PUSH HL -; ; -; LD L,A -; ; -; LOGDRV_ENTRY_FIND LOGDRV -; ; -; ; [ ] custorm sector size -; CALL CHECK_IDE_SECTOR_SIZE -; RLA -; ; -; ; -; LD E,(IY+LOGDRV.SECTOR_OFFSET) -; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) -; ADD IX,DE -; LD E,(IY+LOGDRV.SECTOR_OFFSET+2) -; LD D,(IY+LOGDRV.SECTOR_OFFSET+3) -; POP HL -; ADC HL,DE -; ; [ ] custom sector size -; ;JR C,.exit -; RRA -; ; -; .exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) -; POP DE -; RET NC -; LD A,DSS_Error.drv.UNKNOWN_FORMAT -; RET ; @@ -338,30 +310,16 @@ SelectDrive: PUSH DE ; LD L,A ADD 0 - DSS_MAX_DRIVES_AMOUNT - 1 - LD A,DSS_Error.sys.INVALID_DRIVE + LD A,BIOS.Error.UnknownDevice JR C,.error_pop ; LOGDRV_ENTRY_FIND LOGDRV ; - ; ; [ ] custom sector size - ; CALL CHECK_IDE_SECTOR_SIZE - ; LD A,DSS_Error.sys.UNKNOWN_FORMAT - ; JR C,.error_pop - ; ; - ; ; - ; LD E,(IY+LOGDRV.SECTOR_OFFSET) - ; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) - ; ADD IX,DE - ; LD E,(IY+LOGDRV.SECTOR_OFFSET+2) - ; LD D,(IY+LOGDRV.SECTOR_OFFSET+3) POP HL CALL .get_data JR C,.error_pop2 ; POP DE - ; LD A,DSS_Error.sys.SECTOR_NOT_FOUND - ; RET C - ; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) RET ; @@ -371,7 +329,7 @@ SelectDrive: PUSH DE ; .get_data: ; [ ] custom sector size CALL CHECK_IDE_SECTOR_SIZE - LD A,DSS_Error.sys.UNKNOWN_FORMAT + LD A,BIOS.Error.UnknownDevice RET C ; LD E,(IY+LOGDRV.SECTOR_OFFSET) @@ -380,7 +338,7 @@ SelectDrive: PUSH DE LD E,(IY+LOGDRV.SECTOR_OFFSET+2) LD D,(IY+LOGDRV.SECTOR_OFFSET+3) ADC HL,DE - LD A,DSS_Error.sys.SECTOR_NOT_FOUND + LD A,BIOS.Error.SectorNotFound RET @@ -400,7 +358,7 @@ GenIOCTL: BIT 7,B JR Z,.error ;ReadTrack DEC B JR Z,TestTRK - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET ; @@ -412,11 +370,11 @@ GenIOCTL: BIT 7,B JR Z,.error ;WriteTrack DEC B JR Z,.error - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET ; -.error: LD A,DSS_Error.drv.GENERAL_FAILURE +.error: LD A,BIOS.Error.Failure SCF RET @@ -459,7 +417,7 @@ GetParams: EX DE,HL AND A SBC HL,BC LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE + LD A,BIOS.Error.Failure SCF RET NZ ; @@ -475,21 +433,12 @@ GetParams: EX DE,HL POP IY JR NC,.next ; - ;CP BIOS.Error.ATAPI.NotReady - ;SCF - ;LD A,DSS_Error.drv.NOT_READY - ;JR Z,.error - ;LD A,DSS_Error.drv.INVALID_DRIVE - ;JR .error - ; - CP BIOS.Error.BadNumber - SCF - LD A,DSS_Error.drv.INVALID_DRIVE - JR Z,.error - LD A,DSS_Error.drv.NOT_READY - JR .error - - + CP BIOS.Error.BadNumber + SCF + JR Z,.error + LD A,BIOS.Error.NotReady + JR .error + ; ; [ ] media change - убрать ;!FIXIT .next: EX AF,AF JR NC,.NoMediaChange @@ -576,7 +525,7 @@ Open: CALL MediaCheck ; INC A RET NZ - LD A,DSS_Error.sys.MEDIA_CHANGED + LD A,BIOS.Error.ATAPI.UnitAttention SCF RET ; @@ -587,7 +536,7 @@ MediaCheck: PUSH IY CALL SelectDrive.NoSector JR NC,.next_step ; - CP DSS_Error.sys.UNKNOWN_FORMAT + CP BIOS.Error.UnknownDevice JR NZ,.exit ; A != 0 AND A ; сброс ZF @@ -604,7 +553,15 @@ MediaCheck: PUSH IY ; CP BIOS.Error.ATAPI.UnitAttention JR Z,.Reinit + ;!FIXIT заглушка/костыль из-за пересечения номеров ошибок POP BC ; Баланс стека + /* + BIOS.Error.BadNumber + BIOS.Error.Failure + BIOS.Error.Busy + BIOS.Error.ATAPI.TimeOut + */ + ;LD A,BIOS.Error.Busy .exit: SCF POP IY RET @@ -626,7 +583,7 @@ MediaCheck: PUSH IY POP IY JR NC,.no_errors ; - CP DSS_Error.sys.UNKNOWN_FORMAT + CP BIOS.Error.UnknownDevice SCF RET Z ; @@ -669,33 +626,6 @@ GetBPB: ; !FIXIT LD IX,0 LD B,1 JR Read -; PUSH IY -; PUSH DE -; LD L,A -; ; -; LOGDRV_ENTRY_FIND LOGDRV -; ; -; ; [ ] custorm sector size -; CALL CHECK_IDE_SECTOR_SIZE -; JR C,.error -; ; -; LD E,(IY+LOGDRV.SECTOR_OFFSET) -; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) -; LD L,(IY+LOGDRV.SECTOR_OFFSET+2) -; LD H,(IY+LOGDRV.SECTOR_OFFSET+3) -; LD XL,E -; LD XH,D -; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) -; POP DE -; POP IY -; LD BC,1*256 + BIOS.DRV_READ -; JP ToBIOS -; ; -; .error: POP DE -; POP IY -; LD A,DSS_Error.drv.UNKNOWN_FORMAT -; RET - ;HL:IX - SECTOR diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index f72dfac..db7cb0a 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -162,7 +162,7 @@ API_TABLE: INC C DEC C JP Z,Reserved ;#09 ; -Reserved: LD A,DSS_Error.drv.INVALID_COMMAND +Reserved: LD A,BIOS.Error.InvalidSubFunction SCF RET @@ -189,7 +189,7 @@ Open: PUSH AF RST ToBIOS LD DE,-DSS_MAX_SECTOR_SIZE - 1 ; [ ] 15/04/25 не будет читать сектор больше DSS_MAX_SECTOR_SIZE ; ZF = 0 - LD A,DSS_Error.sys.UNKNOWN_FORMAT + LD A,BIOS.Error.UnknownDevice OR A ; убираем ZF, если есть ; ADD IX,DE ; если размер сектора больше, то облом @@ -279,7 +279,7 @@ GenIOCTL: BIT 7,B ;DEC B ;JP Z,.TestTRK ; - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET ; @@ -293,7 +293,7 @@ GenIOCTL: BIT 7,B ;DEC B ;JP Z,.FormatTRK ; - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET ; ; ; @@ -319,7 +319,7 @@ GenIOCTL: BIT 7,B SBC HL,BC JR Z,.next ; - LD A,DSS_Error.drv.GENERAL_FAILURE + LD A,BIOS.Error.Failure SCF RET ; @@ -377,7 +377,7 @@ GenIOCTL: BIT 7,B RET ; .NONE_FDD: POP BC - LD A,DSS_Error.drv.INVALID_DRIVE + LD A,BIOS.Error.BadNumber ; CF=1 RET ; ; ; diff --git a/DSS/drivers/media/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm index 9dfb64f..3687f03 100644 --- a/DSS/drivers/media/ram_disk-drv.asm +++ b/DSS/drivers/media/ram_disk-drv.asm @@ -172,7 +172,7 @@ ; ;[]===========================================================[ 11] ; -; Errors: +; Errors: ;!FIXIT неправильные значения ; 0 (00h) - NO ERRORS ; 1 (01h) - BAD COMMAND ; 2 (02h) - BAD DRIVE NUMBER @@ -231,7 +231,7 @@ API_TABLE: INC C DEC C JP Z,WriteLong ; 11 ; -.error: LD A,DSS_Error.drv.INVALID_COMMAND +.error: LD A,BIOS.Error.InvalidSubFunction SCF RET @@ -434,7 +434,7 @@ GenIOCTL: BIT 7,B ;JP Z,FRDTRAC ;DEC B ;JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET @@ -446,7 +446,7 @@ GenIOCTL: BIT 7,B ;JP Z,FWRTRAC ;DEC B ;JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND + LD A,BIOS.Error.InvalidSubFunction SCF RET @@ -467,7 +467,7 @@ GenIOCTL: BIT 7,B AND A SBC HL,BC LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE + LD A,BIOS.Error.Failure SCF RET NZ ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 473995f..0316458 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -494 \ No newline at end of file +503 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index f533c03..5a36cbe 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit f533c03f52f53e581c794c1017b7b0d61d39dfbf +Subproject commit 5a36cbee9ca6df7f7c1008fed7f242d0a505bc50 From fba891fcf541f81cba24e6b2229f9d1abb0266f9 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 19 Apr 2025 03:46:13 +1000 Subject: [PATCH 204/219] BOOT: Fixed a bug that caused the inability to boot from a FAT32 partition. --- BOOT/DSSBOOT.ASM | 7 +-- BOOT/boot.asm | 10 ++-- DSS/DRV-MAIN.ASM | 2 +- DSS/DSS-MAIN.ASM | 3 +- DSS/build.txt | 2 +- DSS/drivers/DRV_TO_SYS_ERRORS.ASM | 76 +++++++++++++++++++++++++++++++ SHELL/build.txt | 2 +- Shared_Includes | 2 +- 8 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 DSS/drivers/DRV_TO_SYS_ERRORS.ASM diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index d451e3a..3c9381e 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -40,7 +40,7 @@ LOADER_IN_BPB: DRIVE: _mSYSID DI ; ;!TEST 26/03/2024 - ; LD SP,#C000 + LD SP,#C000 ; ; LD (DRIVE),A ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого @@ -131,9 +131,9 @@ PRINTX: CP "\r" ; ;R01 End MESSAGES:; 0 10 20 30 40 50 60 70 80 -.FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0 .INCORR: DB "\r\nOld BIOS version.\r\n",0 .ERRPART: DB "\r\nUnknown partition table.",0 +.FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0 .ERRIBPB: DB "\r\nInvalid BOOT sector.",0 .NO_SYS: DB "\r\nCan't open SYSTEM.DOS...",0 .NOSHELL: DB "\r\nCan't open SYSTEM.EXE...",0 @@ -401,7 +401,8 @@ GET_BPB: XOR A ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD (DRIVE+1),HL ; -.NX1: CP #00 +.NX1: ;CP #00 + AND A JR NZ,.NX2 ; ; SET_PRM if FDD diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 12a388e..b71bbbb 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -80,6 +80,7 @@ DEFINE EXEinfoMACRO 0 DEFINE App_EXE_Version 1 MACRO _mEXEinfo + IF EXEinfoMACRO BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX BYTE ' Bootloader ' BYTE ' installer ' @@ -88,13 +89,14 @@ BYTE ' Anatoliy ' BYTE ' Belyanskiy. ' BYTE ' Sprinter Team, ' - BYTE ' 2024 ' + BYTE ' 2025 ' + ENDIF ENDM ; версия программы -major_version equ 2 ; ст. номер версии -minor_version equ 1 ; мл. номер +major_version equ 3 ; ст. номер версии +minor_version equ 0 ; мл. номер ;; SECTORS_OF_LOADER EQU 4 ; секторов загрузчика .IN_BPB EQU 1 @@ -636,7 +638,7 @@ messages: db 0 db (minor_version / 10) + '0',(minor_version % 10) + '0','.' db "\r\nBuild date ",SYS_BUILD_DATE db "\r\nCopyright (c) 2006 Vasil Ivanov." - db "\r\nCopyright (c) 2023-2024 Sprinter Team." + db "\r\nCopyright (c) 2023-2025 Sprinter Team." db "\r\n\n",0 ; db "System successfully installed on disk " ;1 diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index aadbf45..f8ea974 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -205,7 +205,7 @@ PORTAL.out_DRV: PUSH BC POP AF .ADCALL+1: CALL DISPATCH ; патчится на INTDISK JR NC,PORTAL.out_DRV - XOR DSS_Error.DRV_MASK + OR DSS_Error.DRV_MASK SCF JP PORTAL.out_DRV //////////////////////////////////////////////////////////////////////// diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f1328f4..3c84133 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -186,7 +186,6 @@ NMI_0x66: RETN ;JP NMI ; ; RST_10: PUSH HL LD L,C - IF SHORT_RSTx10_TABLE ;[ ] R09 LD H,A @@ -405,7 +404,7 @@ DSS_API_TABLE: ;DS 512 ;,0 INCLUDE "DOS_Proc.asm" INCLUDE "FS_Module.asm" INCLUDE "Procedures.asm" - + ;INCLUDE "drivers/drv_to_sys_errors.asm" ; !TODO ; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb CHECK_64kb_CLUSTER: diff --git a/DSS/build.txt b/DSS/build.txt index dc7b54a..3e932fe 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -33 \ No newline at end of file +34 \ No newline at end of file diff --git a/DSS/drivers/DRV_TO_SYS_ERRORS.ASM b/DSS/drivers/DRV_TO_SYS_ERRORS.ASM new file mode 100644 index 0000000..437136e --- /dev/null +++ b/DSS/drivers/DRV_TO_SYS_ERRORS.ASM @@ -0,0 +1,76 @@ +; 19/04/2025 автоперевод номера ошибки DRV/BIOS в SYS +DRV_ERROR_TO_SYS: + RET NC + RLA + JR NC,.no_correction + ; + PUSH HL + PUSH AF + ; + SRL A + CP .Size + LD HL,.TABLE + ADD A,L + JR NC,.no_inc + ; + INC H +.no_inc: LD L,A + LD L,(HL) + POP AF + LD A,L + POP HL + RET + ; +.no_correction: RRA + RET + +.TABLE: DB DSS_Error.sys.Unknown_Error ;BIOS.Error.NoErrors ; 0 + DB DSS_Error.sys.INVALID_FUNCTION ;BIOS.Error.InvalidSubFunction ; 1 + DB DSS_Error.sys.INVALID_DRIVE ;BIOS.Error.BadNumber ; 2 + DB DSS_Error.sys.UNKNOWN_FORMAT ;BIOS.Error.UnknownDevice ; 3 + DB DSS_Error.sys.NOT_READY ;BIOS.Error.NotReady ; 4 + DB DSS_Error.sys.SEEK_ERROR ;BIOS.Error.Seek ; 5 + DB DSS_Error.sys.SECTOR_NOT_FOUND ;BIOS.Error.SectorNotFound ; 6 + DB DSS_Error.sys.CRC_ERROR ;BIOS.Error.CRC ; 7 + DB DSS_Error.sys.WRITE_PROTECT ;BIOS.Error.WriteProtect ; 8 + DB DSS_Error.sys.READ_ERROR ;BIOS.Error.Read ; 9 + DB DSS_Error.sys.WRITE_ERROR ;BIOS.Error.Write ; 10 + DB DSS_Error.sys.DRIVE_FAILURE ;BIOS.Error.Failure ; 11 + DB DSS_Error.sys.BUSY_NO_MEDIA ;BIOS.Error.Busy ; 12 + DB DSS_Error.sys.Unknown_Error ;#8D ; 13 + DB DSS_Error.sys.Unknown_Error ;#8E ; 14 + DB DSS_Error.sys.Unknown_Error ;#8F ; 15 + DB DSS_Error.sys.Unknown_Error ;#90 ; 16 + DB DSS_Error.sys.Unknown_Error ;#91 ; 17 + DB DSS_Error.sys.Unknown_Error ;#92 ; 18 + DB DSS_Error.sys.Unknown_Error ;#93 ; 19 + DB DSS_Error.sys.Unknown_Error ;#94 ; 20 + DB DSS_Error.sys.Unknown_Error ;#95 ; 21 + DB DSS_Error.sys.Unknown_Error ;#96 ; 22 + DB DSS_Error.sys.Unknown_Error ;#97 ; 23 + DB DSS_Error.sys.Unknown_Error ;#98 ; 24 + DB DSS_Error.sys.Unknown_Error ;#99 ; 25 + DB DSS_Error.sys.Unknown_Error ;#9A ; 26 + DB DSS_Error.sys.Unknown_Error ;#9B ; 27 + DB DSS_Error.sys.Unknown_Error ;#9C ; 28 + DB DSS_Error.sys.Unknown_Error ;#9D ; 29 + DB DSS_Error.sys.Unknown_Error ;#9E ; 30 + DB DSS_Error.sys.NOT_SUPPORTED ;BIOS.Error.NotSupported ; 31 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI.NoSence ; 32 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI.RecoveredError; 33 + DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.NotReady ; 34 + DB DSS_Error.sys.BUSY_NO_MEDIA ;BIOS.Error.ATAPI.MediumError ; 35 + DB DSS_Error.sys.DRIVE_FAILURE ;BIOS.Error.ATAPI.HardwareError ; 36 + DB DSS_Error.sys.INVALID_ACCESS ;BIOS.Error.ATAPI.IllegalRequest; 37 + DB DSS_Error.sys.MEDIA_CHANGED ;BIOS.Error.ATAPI.UnitAttention ; 38 + DB DSS_Error.sys.ACCESS_DENIED ;BIOS.Error.ATAPI.DataProtect ; 39 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 40 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 41 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 42 + DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.AbortedCommand; 43 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 44 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 45 + DB DSS_Error.sys.WRITE_ERROR ;BIOS.Error.ATAPI.Miscompare ; 46 + DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 47 + DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.TimeOut ; 48 +.Size EQU .TABLE - $ \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 0316458..fc42ce4 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -503 \ No newline at end of file +504 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 5a36cbe..040541d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5a36cbee9ca6df7f7c1008fed7f242d0a505bc50 +Subproject commit 040541dcbc42338505524aae36b43aecca4dee47 From 02b4f7b39f7fb865620943d087f309ec3fe22388 Mon Sep 17 00:00:00 2001 From: Tolik Date: Sun, 20 Apr 2025 05:38:13 +1000 Subject: [PATCH 205/219] =?UTF-8?q?SYS.EXE:=20-bug=20FatBuffer.RootDirStar?= =?UTF-8?q?tCluster=20=D0=BD=D0=B5=20=D0=BE=D0=B1=D0=BD=D1=83=D0=BB=D1=8F?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=B4=D0=BB=D1=8F=20FAT12/16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 4 +++- BOOT/boot.asm | 18 +++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 3c9381e..58e9b84 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -624,7 +624,9 @@ GET_BPB: XOR A LD A,D OR E JR NZ,.its_FAT32 - ; + ; DE=0 + LD (FatBuffer.RootDirStartCluster_L),DE + LD (FatBuffer.RootDirStartCluster_H),DE LD HL,4084 SBC HL,BC LD A,FAT_TYPE.x12 diff --git a/BOOT/boot.asm b/BOOT/boot.asm index b71bbbb..de0d349 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -58,15 +58,15 @@ ;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DWORD #0000 ; количество секторов на цилиндре ENDS - includelua 'Shared_includes/lua/Functions.lua' - include 'shared_includes/constants/sp2000.inc' - include 'shared_includes/constants/bios_equ.inc' - include 'shared_includes/constants/dss_equ.inc' - include 'shared_includes/macroses/accelerator.z80' - include 'shared_includes/macroses/macros.z80' - include 'shared_includes/structures/FileSystem.inc' - ;include 'DSS/structures.inc' - include '../DSS/defines.inc' + includelua 'Shared_includes/lua/Functions.lua' + include 'shared_includes/constants/sp2000.inc' + include 'shared_includes/constants/bios_equ.inc' + include 'shared_includes/constants/dss_equ.inc' + include 'shared_includes/macroses/accelerator.z80' + include 'shared_includes/macroses/macros.z80' + include 'shared_includes/structures/FileSystem.inc' + ;include 'DSS/structures.inc' + include '../DSS/defines.inc' LUA PASS1 local date, month, year = Get_date_RU(sj.get_define("__DATE__")) From a8d7de85179f4ca0bb4cbb2ca880fe84e26ee22c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 21 Apr 2025 01:50:31 +1000 Subject: [PATCH 206/219] =?UTF-8?q?SYS.EXE:=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BD=D0=B5=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B1=D0=B0=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=81=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B8=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8.=20LOADDIR:=20fix=20=D0=BC=D1=83=D1=81=D0=BE=D1=80=20?= =?UTF-8?q?=D0=B2=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0,=20=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=20=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B5=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 60 +++++++++++++++++++++++++++++++++--------------- BOOT/boot.asm | 4 ++-- DSS/FS/FAT.asm | 12 ++++++++-- DSS/build.txt | 2 +- DSS/defines.inc | 1 - Shared_Includes | 2 +- 6 files changed, 55 insertions(+), 26 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 58e9b84..1a71a5a 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -22,10 +22,11 @@ DEFINE UNIVERSAL_BOOT 1 ;------------------------------------------------------------------------------ -ORG_ADDRESS EQU #8000 -LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB +ORG_ADDRESS EQU #8000 +MAX_SECTORS_PER_PAGE EQU #20 ;максимальное кол-во секторов в странице ;!TODO а если сектор больше 512? +LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB LOADER_IN_BPB: -.MAX_SIZE EQU _sBOOT_SECTOR.PARTITION_TABLE - _sBOOT_SECTOR_PARAMS_FAT32 +.MAX_SIZE EQU _sBOOT_SECTOR.PARTITION_TABLE - _sBOOT_SECTOR_PARAMS_FAT32 ;------------------------------------------------------------------------------ DISP ORG_ADDRESS @@ -154,7 +155,6 @@ CONTINUE: LD HL,0 LD BC,1*256 + BIOS.GetMem RST ToBIOS_18 ;GET PAGE FOR DOS LD (LOAD_CORE.BANKDOS),A - ; OUT (SLOT0),A ; CALL GET_BPB ;READ BPB @@ -183,6 +183,10 @@ CONTINUE: LD HL,0 EXX LD HL,(FCLUSTR_L) LD DE,#C000 + ; -bug: счётчик для .SMALL_CLUSTER, баг отрепортил Vasil Ivanov + ; LD A,MAX_SECTORS_PER_PAGE + ; LD (LOAD_CORE.BIG_CORE),A + ; CALL LOAD_CORE ; [ ] загрузка system.dos больше #4000 байтов EX AF,AF' @@ -193,12 +197,12 @@ CONTINUE: LD HL,0 ; IN A,(SLOT1) LD (LOAD_CORE.BANKDOS),A - LD A,SUBLOAD_SIZE + LD A,SUBLOAD_SIZE + 1 LD (LOAD_CORE.max_sectors),A LD (LOAD_CORE.BIG_CORE),A ; теперь это счётчик оставшихся секторов ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов + CP MAX_SECTORS_PER_PAGE + 1 ; кол-во загружаемых секторов JP NC,INC_SECTOR_NUM CALL READ_FROM_FAT ; next cluster in chain EX DE,HL @@ -209,6 +213,11 @@ CONTINUE: LD HL,0 CALL NC,LOAD_CORE .no_big_core: ; RUN_CORE: DI + ; + LD A,(READ_FAT_TABLE.FAT_PAGE) + LD C,BIOS.FreeMem + RST ToBIOS_18 + ; XOR A OUT (SYS_PORT.OFF),A ; @@ -264,7 +273,7 @@ RUN_CORE: DI INC_SECTOR_NUM: PUSH DE CALL CLUSTER_TO_SECTOR CALL GET_ABSOLUTE_SECTOR - LD DE,#20 ;!HARDCODE количество прочитанных секторов + LD DE,MAX_SECTORS_PER_PAGE ; количество прочитанных секторов ADD IX,DE JR NC,.no_inc INC HL @@ -371,11 +380,17 @@ YEPDOS: ;[ ] 17.12.2023 ; GET_BPB: XOR A + LD HL,FatBuffer + LD B,_sysFatBuffer +.loop_clear: LD (HL),A + INC HL + DJNZ .loop_clear + LD H,A LD L,A - LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 - LD (FatBuffer.RootDirFirstSector_H),HL - LD (FatBuffer.SectorsPerFAT_H),A + ; LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 + ; LD (FatBuffer.RootDirFirstSector_H),HL + ; LD (FatBuffer.SectorsPerFAT_H),A ; PUSH HL POP IX @@ -390,6 +405,12 @@ GET_BPB: XOR A LD BC,ZERO_SECTOR_OF_BPB.Size LDIR ; + ; -bug: пересечение буферов FAT и SYSTEM.DOS, баг отрепортил Vasil Ivanov + LD BC,1*256 + BIOS.GetMem + RST ToBIOS_18 ;GET PAGE FOR DOS + LD (READ_FAT_TABLE.FAT_PAGE),A + ; + ; LD A,(DRIVE) LD B,A AND #F0 @@ -427,7 +448,7 @@ GET_BPB: XOR A CP #F0 RET C ; - LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD (FatBuffer.SectorsPerCluster),A ; calc. first sector FAT @@ -625,8 +646,8 @@ GET_BPB: XOR A OR E JR NZ,.its_FAT32 ; DE=0 - LD (FatBuffer.RootDirStartCluster_L),DE - LD (FatBuffer.RootDirStartCluster_H),DE + ; LD (FatBuffer.RootDirStartCluster_L),DE + ; LD (FatBuffer.RootDirStartCluster_H),DE LD HL,4084 SBC HL,BC LD A,FAT_TYPE.x12 @@ -786,9 +807,9 @@ GETROOT: LD HL,(FatBuffer.RootDirStartCluster_L) LD BC,1 ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. ADD IX,BC - ADC HL,BC - DEC HL - ; + JR NC,.no_inc_HL + INC HL +.no_inc_HL: ; DEC A JR NZ,.NEXT_SECTOR RET @@ -870,7 +891,7 @@ LOAD_CORE: LD (READMEM),DE ;.skip_it: ; LD DE,(READMEM) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) -.max_sectors+1: CP #20 +.max_sectors+1: CP MAX_SECTORS_PER_PAGE JR C,.SMALL_CLUSTER ; .subload: LD A,(.max_sectors) @@ -1082,7 +1103,7 @@ READ_FAT_TABLE: PUSH HL ; IN A,(SLOT3) PUSH AF - LD A,SHARED_PAGE +.FAT_PAGE+1: LD A,0 OUT (SLOT3),A ; LD A,(FatBuffer.FAT_TYPE) @@ -1151,7 +1172,7 @@ READ_FROM_FAT: PUSH HL ; IN A,(SLOT3) PUSH AF - LD A,SHARED_PAGE + LD A,(READ_FAT_TABLE.FAT_PAGE) OUT (SLOT3),A ; LD A,(FatBuffer.FAT_TYPE) @@ -1277,6 +1298,7 @@ PARTITION_START_H EQU FSIZE1+2 PARTITION_START_L EQU PARTITION_START_H+2 READMEM EQU PARTITION_START_L+2 ;BIG_CORE EQU READMEM+2 +;FAT_PAGE EQU READMEM+2 diff --git a/BOOT/boot.asm b/BOOT/boot.asm index de0d349..7ddae5f 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -637,8 +637,8 @@ messages: db 0 db major_version + '0','.' db (minor_version / 10) + '0',(minor_version % 10) + '0','.' db "\r\nBuild date ",SYS_BUILD_DATE - db "\r\nCopyright (c) 2006 Vasil Ivanov." - db "\r\nCopyright (c) 2023-2025 Sprinter Team." + ;db "\r\nCopyright (c) 2006 Vasil Ivanov." + db "\r\nCopyright (c) Sprinter Team." db "\r\n\n",0 ; db "System successfully installed on disk " ;1 diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index bcaa5d0..90e021d 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -548,11 +548,19 @@ LOADDIR: ;!TODO optimize CP B JR NC,.RTD1 LD B,A ; число секторов -.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска +.RTD1: PUSH AF ; 21/04/2025 fix мусор в странице каталога, если каталог меньше страницы + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV - POP AF + ; !FIXIT нет проверки на ошибку + ; 21/04/2025 fix мусор в странице каталога, если каталог меньше страницы + POP AF + JR NC,.exit + XOR A + LD (DE),A + ; +.exit: POP AF OUT (SLOT3),A RET ;----------------------------------------------------------------------; diff --git a/DSS/build.txt b/DSS/build.txt index 3e932fe..597975b 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -34 \ No newline at end of file +35 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 7ffd5d8..d5fd64f 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -156,6 +156,5 @@ MOUSE_BAUD: ; ;----------------------------------------------------; -; Внимание, стек хранится в той же странице! SUBLOAD_SIZE EQU 2 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу ;----------------------------------------------------; diff --git a/Shared_Includes b/Shared_Includes index 040541d..e0dd54c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 040541dcbc42338505524aae36b43aecca4dee47 +Subproject commit e0dd54cb5615a23ea55bd217578aab57481fcf77 From abe98890123efb9cda9192a796206937e906757b Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 25 Apr 2025 23:21:55 +1000 Subject: [PATCH 207/219] =?UTF-8?q?BOOT:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D0=B0=20x86=20=D0=B2=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=D0=B5=20JMP=20$=20=D1=87=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=20=D0=BD=D0=B0=20PC=20=D0=B2=D1=81=D1=91=20=D0=B7=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BB=D0=BE=20=D0=B5=D1=81=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=20=D0=B7=D0=B0=D1=85=D0=BE=D1=87=D0=B5=D1=82?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8=D1=82=D1=8C=D1=81?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 39 ++++++++++++++++++++++++++++----------- DSS/CHANGES.LOG | 14 +++++++++++++- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 7ddae5f..3514291 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -370,12 +370,13 @@ write_to_floppy: sbc hl,de ret c overwrite_floppy: - ; перекидывание части загрузчика в 0 сектор - LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical - LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size) - LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size - LDIR - ; + CALL SETUP_ZERO_SECTOR + ;; перекидывание части загрузчика в 0 сектор + ;LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical + ;LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size) + ;LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size + ;LDIR + ;; ; записать boot-сектор назад ld a,(disk) ; заданный номер диска ld hl,0 ; ст. разряд лог. сектора @@ -467,11 +468,15 @@ write_to_hard_disk: ; JR write_to_BPB.no_push write_to_BPB: PUSH BC - ; перекидывание части загрузчика в 0 сектор -.no_push: LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical - LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size) - LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size - LDIR +.no_push: CALL SETUP_ZERO_SECTOR + ;; перекидывание части загрузчика в 0 сектор + ;LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical + ;LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size) + ;LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size + ;LDIR + ;; защита от бакланизма (загрузка с этого диска на PC приведет к зависанию. JMP $) + ;LD HL,#FEEB ; opcode jmp $ + ;LD (buffer),HL ; запись в 0 сектор куска загрузчика pop af ; заданный номер диска ld hl,0 ; ст. разряд лог. сектора @@ -539,6 +544,18 @@ Read_MBR: LD HL,0 SBC HL,DE SCF RET + + +SETUP_ZERO_SECTOR: + ; перекидывание части загрузчика в 0 сектор + LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical + LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size) + LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size + LDIR + ; защита от бакланизма (загрузка с этого диска на PC приведет к зависанию. JMP $) + LD HL,#FEEB ; opcode jmp $ + LD (buffer),HL + RET ;------------------------------------------------- ; Выделить заданный диск из ком-строки ; diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index 4ea1f7b..4ac6f67 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -14,11 +14,23 @@ [ ] блокировка файлов в файловых манипуляторах (чтоб не открывать на запись уже открытый на запись файл, например) Среднее: [x] перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле -[ ] начать работать с функциями REMOVABLE и MEDIA CHECK rst #18. Возвращать значение #FF, если порядок букв изменился +[?] начать работать с функциями REMOVABLE и MEDIA CHECK rst #18. Возвращать значение #FF, если порядок букв изменился Вообще не важное: [ ] исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255 ----------------------------------------------------------------------------------------------------------------------------------------------- +DSS 1.71.35 +Изменения после версии 1.70.2 +- дос и биос могут устанавливать зачем-то режим txt 40x32 и нормально в нём выводить текст +- LOADDIR:fix мусор в странице каталога, если каталог меньше страницы +- DiskINF: костыль для атрибута 0. Настоял Савелий)). Если в корне раньше метки диска попадался файл с атрибутом 0, то функция возвращала его имя как метку диска +- процедура запуска EXE могла залезть не в ту папку перед передачей управления запускаемому приложению с версией EXE = 0 в заголовке +- ATAPI устройство всегда получает букву, даже без носителя +- Обрабатывается ошибка "смена носителя" +- файл не создастся, если нет свободного манипулятора +- поменял квадратик курсора в консоли для режима OVR (который после нажатия на Ins) +- Мелкие правки, рюшечки, багфиксы неупомянутые в этом списке по причине амнезии и халатности + DSS 1.70.2 Изменения после версии 1.70 From 73c7ab5f6b587320bc22fa1aac0dca7b079ebcb8 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 26 Apr 2025 02:56:36 +1000 Subject: [PATCH 208/219] =?UTF-8?q?+=20K=5FSETUP:=20=D0=B4=D0=B2=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF=D0=BE=D0=B4=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=BA=D0=BB/=D0=B2=D1=8B=D0=BA=D0=BB=20=D0=BA=D1=83=D1=80?= =?UTF-8?q?=D1=81=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/KEYINTER.ASM | 57 +++++++++++++++++++++++++++++++++--------------- DSS/build.txt | 2 +- Shared_Includes | 2 +- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index a36feed..f97b49b 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -110,22 +110,23 @@ UNCODE DW 0 ; -WAITKEY LD HL,HOST - LD A,(HEAD) - CP (HL) - JR Z,WAITKEY - CALL GETSYM - LD A,E - AND A - RET +WAITKEY: LD HL,HOST + LD A,(HEAD) + CP (HL) + JR Z,WAITKEY + CALL GETSYM + LD A,E + AND A + RET +; -SCANKEY LD HL,HOST - LD A,(HEAD) - CP (HL) - RET Z - CALL GETSYM - LD A,E - RET +SCANKEY: LD HL,HOST + LD A,(HEAD) + CP (HL) + RET Z + CALL GETSYM + LD A,E + RET ; ; @@ -209,6 +210,7 @@ ECHOKEY: CALL Cursor_On ; LD A,E AND A RET +; Cursor: ;!TODO логичнее курсором моргать и шрифты менять из биоса же? .Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть @@ -219,7 +221,7 @@ Cursor_On: LD C,BIOS.LP_GET_PLACE ; узн RST ToBIOS LD (Cursor_Off.pos),DE XOR A - LD C,BIOS.WIN_GET_SYM ; получить символ + LD C,BIOS.WIN_GET_SYM ; получить символ RST ToBIOS ; LD A,%0010'0000 @@ -1011,12 +1013,31 @@ K_SND_R: DJNZ K_SND_W AND A RET ; subfunc 2 -K_SND_W: ;DJNZ K_RESET_BUFFER ;. [ ] 31/03/2024 subfunc 3 нужна ли? - DJNZ K_SETUP.ERROR +K_SND_W: ;DJNZ K_RESET_BUFFER ; [ ] 31/03/2024 subfunc 3 нужна ли? + DJNZ K_CURSOR_ON ; [ ] 26/04/2025 управление видимостью курсора ; LD (SOUND_K),A AND A RET +; + + ; [ ] 26/04/2025 управление видимостью курсора +K_CURSOR_ON: DJNZ K_CURSOR_OFF + LD A,(VMODE) + RLA + JP NC,Cursor_On + RET +; + + ; [ ] 26/04/2025 управление видимостью курсора +K_CURSOR_OFF: DJNZ K_SETUP.ERROR + LD A,(VMODE) + RLA + JP NC,Cursor_Off + RET +; + + ; ; ;. [ ] 31/03/2024 subfunc 3 нужна ли? ; K_RESET_BUFFER: DJNZ K_SETUP.ERROR diff --git a/DSS/build.txt b/DSS/build.txt index 597975b..dce6588 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -35 \ No newline at end of file +36 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index e0dd54c..a6c50f5 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e0dd54cb5615a23ea55bd217578aab57481fcf77 +Subproject commit a6c50f572424e88f6199d639fa8109d53b71142c From cd4271f9949bf956e56f1414e00d954915e9f935 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 2 May 2025 04:11:42 +1000 Subject: [PATCH 209/219] =?UTF-8?q?=D0=B8=D0=B3=D1=80=D1=8B=20=D1=81=20ZIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 120 ++++++++++++++++++++-------- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 91 ++++++++++----------- SHELL/Commands/INFO.ASM | 21 +++-- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 6 files changed, 150 insertions(+), 88 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 3514291..ce707cc 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -117,7 +117,7 @@ page_buffer equ #C000 ; ORG org_addr BEGIN: ;di in a,(SLOT3) - ld (port+1),a ; сохр. порт + ld (port),a ; сохр. порт push ix call save_path ; сохр. тек. диск и путь ld c,Dss.Version ; узнать версию ДОС @@ -134,7 +134,7 @@ BEGIN: ;di .old_ver: pop hl ld a,11 ; индекс строки "Error: Need DSS version 1.70..." call print_string - ld a,-1 + ld a,DSS_Error.sys.COMMON_ERROR jp exit ;[x] 17.12.2023 загрузка с активного раздела, а не с первого .check_build: ld hl,810 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 @@ -153,11 +153,11 @@ version_ok: xor a ; RST ToDSS ld (boot_disk),a ; диск (A=0,B=1,..) ; проверить на совпадение дисков - ld hl,disk +same_fdd: ld hl,disk cp (hl) jr nz,.next - ld hl,confirm_flag - ld (hl),1 ; уст. флаг + ld hl,read_sys_files.swap_flag +.flag+1: ld (hl),0 ; уст. флаг ; ; Чтение в банки файлов системы ; @@ -170,6 +170,11 @@ version_ok: xor a ; ;-------------------------------------------- ; Чтение файла system.exe ;-------------------------------------------- +read_sys_files: ; +.noFiles+1: ld a,0 + or a + jr nz,.write_boot + ; ld hl,name2 ; имя файла call read_file ; вся работа по загрузке файла в страницы ;jr nc,read_file1_ok @@ -180,7 +185,7 @@ version_ok: xor a ; ;ld a,DSS_Error.sys.DISK_FULL ; код ошибки jp c,exit ; сохр. раб. ячейки файла system.exe -read_file1_ok: ld hl,FILE1_PARAMS ; откуда +.read_file1_ok: ld hl,FILE1_PARAMS ; откуда ld de,FILE2_PARAMS ; куда ld bc,FILE2_PARAMS.dataSize ldir @@ -198,12 +203,12 @@ read_file1_ok: ld hl,FILE1_PARAMS ; ; ld c,Dss.FreeMem ; RST ToDSS ;jr read_file_err ; освоб. блок памяти system.dos -confirm_flag+1: ld a,0 +.swap_flag+1: ld a,1 or a - jr z,no_confirm + jr nz,.no_confirm ld a,(boot_disk) ; сист. диск cp 2 - jr nc,no_confirm ; не дисководы + jr nc,.no_confirm ; не дисководы ; запросить целевой диск ld a,(disk) ; заданный номер диска add a,'A' @@ -212,9 +217,8 @@ confirm_flag+1: ld a,0 call print_string ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS -no_confirm: ld a,2 ; индекс строки "Installing boot loader..." - call print_string - ; Уст. целевой диск/путь + ; +.no_confirm: ; Уст. целевой диск/путь ld a,(disk) ; целевой диск ld hl,root_path ; "X:\" строка пути add a,'A' @@ -222,17 +226,13 @@ no_confirm: ld a,2 ; ld c,Dss.ChDir ; смена тек. каталога RST ToDSS ;-------------------------------------------- - ; Записать boot-загрузчик - call write_boot_loader - jr c,write_error ; ошибка работы с девайсом - ; ld a,3 ; индекс строки "Writing system files..." call print_string ; Запись файла system.dos ld hl,name1 ; имя файла call write_file jr c,write_error -ok_write1: ; освободить память +.ok_write1: ; освободить память ; ld a,(FILE1_PARAMS.id_blck) ; блок system.dos ; ld c,Dss.FreeMem ; RST ToDSS @@ -255,14 +255,21 @@ ok_write1: ; jr c,write_error ;jr c,exit ; ошибка ; + ; Записать boot-загрузчик +.write_boot: ld a,2 ; индекс строки "Installing boot loader..." + call print_string + call write_boot_loader + jr c,write_error ; ошибка работы с девайсом + ; ld a,(disk) ; заданный номер диска add a,'A' ld (messages.lett1),a ld a,1 ; индекс строки "System installed on disk " call print_string - ld a,(confirm_flag) + ; + ld a,(read_sys_files.swap_flag) or a - jr z,exit + jr nz,.not_fdd ; запросить системный диск ld a,(boot_disk) ; сист. диск cp 2 @@ -274,9 +281,10 @@ ok_write1: ; ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS .not_fdd: xor a ; код "Ok" + ; exit: push af call restore_path ; восст. тек. диск и путь -port: ld a,-1 ; сохр. порт +port+1: ld a,-1 ; сохр. порт out (SLOT3),a pop af ld c,Dss.Exit ; выход в ДОС @@ -288,7 +296,7 @@ help: ld a,8 ; call print_string ld a,4 ; индекс строки хэлпа err_mes: call print_string - ld a,1 ; код ошибки + ld a,DSS_Error.sys.COMMON_ERROR jr exit write_error: ld a,7 ; индекс строки "Can't install boot on this disk" @@ -564,35 +572,78 @@ SETUP_ZERO_SECTOR: ; CF-при ошибке ;------------------------------------------------- get_drive_letter: + ; зачистка буфера + xor a + ld (buffer+1),a + ; inc hl ; буфер строки ld de,buffer ; буфер для выдел. параметра ld c,Dss.GSwitch ; выделить параметр ком. строки RST ToDSS + ; + rra + rl b ; признак конца параметров + ; ld de,buffer ld a,(de) inc de ld c,a ; сохр. 'a' ld a,(de) - inc de cp ':' - jr nz,get_drive_err ; диск не задан - ld a,(de) + jr nz,.get_drive_err ; диск не задан inc de + ld a,(de) or a - jr nz,get_drive_err ; > 1 параметра - ld a,c ; восст. 'a' - cp 'A' - jr c,get_drive_err - cp 'z'+1 - jr nc,get_drive_err + jr nz,.get_drive_err ; неправильные параметры + ; + rr b ; признак конца параметров + jr c,.checkChar + ; + push bc + ld de,buffer ; буфер для выдел. параметра + ld c,Dss.GSwitch ; выделить параметр ком. строки + RST ToDSS + pop bc + jr nc,.get_drive_err ; неправильные параметры + ; + ld de,buffer ; буфер для выдел. параметра + ld a,(de) + cp "0" + ret c ; неправильные параметры + cp "4" + jr nc,.get_drive_err ; неправильные параметры + ; + ld b,a + inc de + ld a,(de) + or a + jr nz,.get_drive_err ; неправильные параметры + ; + ld a,b + ;0 - standart + ;1 - silent + ;2 - no_files + ;3 - no_files+silent + sub "0" + jr z,.checkChar + rra + ld (read_sys_files.noFiles),a + ld (same_fdd.flag),a + rla + and 1 + ld (print_string.silentMode),a + ; проверяем букву +.checkChar: ld a,c ; восст. 'a' and %1101'1111 + cp 'A' + ret c ; ошибка + cp 'Z'+1 + jr nc,.get_drive_err sub 'A' - or a ret ; -get_drive_err: scf ; ошибка +.get_drive_err: scf ; ошибка ret - ;---------------------------------------------------- ; сохр. тек. системный диск и путь ;---------------------------------------------------- @@ -690,6 +741,9 @@ messages: db 0 ; Вывести строку по индексу ; вход: a=индекс строки print_string: call get_string ; поиск строки по ее индексу в 'a' +.silentMode+1: ld a,0 + or a + ret nz ld c,Dss.PChars ; вывод строки RST ToDSS ret diff --git a/DSS/build.txt b/DSS/build.txt index dce6588..d2e1cef 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -36 \ No newline at end of file +44 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 7b62967..148864f 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -440,12 +440,13 @@ GetParams: EX DE,HL JR .error ; ; [ ] media change - убрать ;!FIXIT -.next: EX AF,AF +.next: EX AF,AF' JR NC,.NoMediaChange CP BIOS.Error.ATAPI.UnitAttention + SCF JR NZ,.NoMediaChange ; - PUSH IX +.ReDEFINE: PUSH IX PUSH IY PUSH HL PUSH DE @@ -457,52 +458,51 @@ GetParams: EX DE,HL POP IY POP IX ; -.NoMediaChange: ;EX AF,AF - ; перетасовка регистров с результатом от BIOS - EX DE,HL - LD C,E - LD E,D - LD D,0 - LD A,B - LD B,D - EXX +.NoMediaChange: ; перетасовка регистров с результатом от BIOS + EX DE,HL + LD C,E + LD E,D + LD D,0 + LD A,B + LD B,D + EXX ;[ ] 04/01/2025 возвращение размера сектора - EX AF,AF' - LD A,XH - LD E,XL - RL E - RLA + EX AF,AF' + LD A,XH + LD E,XL + RL E + RLA ; ; SECTORS ON LOGICAL DISK - LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) - LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) - LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) - LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) + LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) + LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) ; ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; ;[ ] 04/01/2025 возвращение размера сектора - ; 00 - undefined - ; 01 - 128 bytes - ; 02 - 256 bytes - ; 04 - 512 bytes - ; 08 - 1024 bytes - ; 16 - 2048 bytes - ; 32 - 4096 bytes - ; 64 - 8192 bytes - ; 128 - 16384 bytes - ;EX AF,AF' - LD B,A + ; 00 - undefined + ; 01 - 128 bytes + ; 02 - 256 bytes + ; 04 - 512 bytes + ; 08 - 1024 bytes + ; 16 - 2048 bytes + ; 32 - 4096 bytes + ; 64 - 8192 bytes + ; 128 - 16384 bytes + ;EX AF,AF' + LD B,A ; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; - AND A -.error: POP IY - POP IX - RET - + ;AND A +.error: POP IY + POP IX + RET + ; Removable: XOR A @@ -553,15 +553,7 @@ MediaCheck: PUSH IY ; CP BIOS.Error.ATAPI.UnitAttention JR Z,.Reinit - ;!FIXIT заглушка/костыль из-за пересечения номеров ошибок POP BC ; Баланс стека - /* - BIOS.Error.BadNumber - BIOS.Error.Failure - BIOS.Error.Busy - BIOS.Error.ATAPI.TimeOut - */ - ;LD A,BIOS.Error.Busy .exit: SCF POP IY RET @@ -584,8 +576,10 @@ MediaCheck: PUSH IY JR NC,.no_errors ; CP BIOS.Error.UnknownDevice + JR NZ,.no_errors + AND A ; сброс ZF SCF - RET Z + RET ; .no_errors: LD A,#FF ;!HARDCODE drive changed OR A @@ -604,12 +598,15 @@ CHECK_IDE_SECTOR_SIZE: ;RET ; ReDEFINE_PARTITIONS: + EX AF,AF' + LD B,A ; HDD_INIT_TABLE.RemovableMedia LD A,DSS_MAX_DRIVES_AMOUNT - 1 ; ограничитель, чтоб не детектить больше 1 раздела LD (Init.count),A LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD (CURRENT_DRIVE.Number),A LD (LOGDRV_OFFSET),IY ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS + ;LD B,%0000'0011 ;!HARDCODE drive changed, removable media JP DEFINE_PARTITIONS @@ -831,7 +828,7 @@ DEFINE_PARTITIONS: AND %1111'1101 LD (CURRENT_DRIVE.Removable),A LD (EXT_Partition.Low),DE ;R01 - LD (EXT_Partition.High),IX ;R01 + LD (EXT_Partition.High),DE ;R01 ; .LOOP: LD (CURRENT_SECTOR.Low),DE LD (CURRENT_SECTOR.High),IX diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index f168532..b20b2f9 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -33,14 +33,21 @@ cmd_info: CALL Get_Path ; .patch_A+1: LD A,0 CALL read_disk_info - JR C,.Unformatted_Partition + JR NC,.info_ok + ; + CP DSS_Error.sys.MEDIA_CHANGED + JR NZ,.Unsupported_Partition + ; + LD A,(.patch_A) + CALL read_disk_info + JR C,.Unsupported_Partition ; %7 - Volume label ; serial_string - Volume serial number string ; full_space_high \ ; full_space_medium - Partition size ; full_space_low / ; - LD HL,serial_string +.info_ok: LD HL,serial_string LD DE,Buffers.bat_params.PRM4 ; Volume serial number string CALL ncopy_string ; full capacity @@ -73,7 +80,7 @@ cmd_info: CALL Get_Path JP RESTORE_ALL.path ;RET ; -.Unformatted_Partition: +.Unsupported_Partition: LD HL,.none_string LD DE,Buffers.bat_params.PRM4 ; Volume serial number string CALL ncopy_string @@ -89,13 +96,17 @@ cmd_info: CALL Get_Path LD A,C CP "C" - "A" JR C,.ItIsFDD + ; LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams RST ToDSS.DRV - JR NC,.calc_size + JR C,.noMedia + LD A,H + AND %1111'0000 ; проверка на номер сектора > 28bit = нет носителя + JR Z,.calc_size ; .ItIsFDD: ; - LD HL,.Unknown_str +.noMedia: LD HL,.Unknown_str LD DE,Buffers.bat_params.PRM5 ; Drive size CALL ncopy_string JR .print_info_2 diff --git a/SHELL/build.txt b/SHELL/build.txt index fc42ce4..88bc40f 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -504 \ No newline at end of file +513 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index a6c50f5..68e156a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a6c50f572424e88f6199d639fa8109d53b71142c +Subproject commit 68e156a69e848e7b01656cdf67122022999d75ee From 1fcfce3619f7f4e9bafc5b4b61bc5f25bd40c3f7 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 5 May 2025 05:39:34 +1000 Subject: [PATCH 210/219] =?UTF-8?q?-bug:=20=D0=9E=D0=BF=D1=8F=D1=82=D1=8C?= =?UTF-8?q?=20=D0=A1=D0=B0=D0=B2=D0=B5=D0=BB=D0=B8=D0=B9=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=88=D0=B5=D0=BB.=20=D0=9E=D0=BF=D1=8F=D1=82=D1=8C=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B3=20=D1=81=20=D0=BC=D0=B5=D1=82=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=D0=B0))=20-fix:=20=D0=A2=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=20=D0=BE=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=BB=D1=8F=D1=82=D1=8C=20=D0=B4=D0=BB=D1=8F=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B0=20=D1=81=20=D0=B0=D1=82=D1=80=D0=B8?= =?UTF-8?q?=D0=B1=D1=83=D1=82=D0=BE=D0=BC=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/diskINF.asm | 6 +++--- DSS/FS/FAT.asm | 10 +++++++++- DSS/build.txt | 2 +- Shared_Includes | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 95edd5e..8fb2559 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -242,11 +242,11 @@ FAT_STRING: DB 'FAT12' ; DE - буфер GET_LABEL: PUSH DE LD HL,.LABEL_MASK ; "\*.*" имя метки - LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома + LD A,FAT_ATTR.ItIsVolID ; атрибут метки тома LD B,high Dss.F_First.FATname CALL F_FIRST POP DE - LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL +.from_BPB: LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL RET C ; [ ] 07/03/2025 костыль для атрибута 0. Настоял Савелий)) LD HL,BUFFER_FIND.REC_Attr @@ -254,7 +254,7 @@ GET_LABEL: PUSH DE LD A,(HL) OR A SCF - RET Z + JR Z,.from_BPB ; LD HL,BUFFER_FIND.REC_Name ADD HL,DE diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 90e021d..4a76892 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -165,10 +165,18 @@ SEARCH: CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены JR Z,.next_record LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + LD D,A AND C JR NZ,.next_record ; -.not_zero_attr: LD HL,MASKARE + LD A,C + INC A + JR NZ,.found_attr + ; A=0 + OR D + JR NZ,.next_record + ; +.found_attr: LD HL,MASKARE LD D,XH LD E,XL LD B,11 diff --git a/DSS/build.txt b/DSS/build.txt index d2e1cef..abc4eff 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -44 \ No newline at end of file +46 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 68e156a..89efc04 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 68e156a69e848e7b01656cdf67122022999d75ee +Subproject commit 89efc04ac63ae8b6a3b79c4a0e521fc967636a64 From 14638c333d2c1e90976c15de8b733973ad687eb0 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 22 May 2025 22:52:08 +1000 Subject: [PATCH 211/219] =?UTF-8?q?=D0=B2=D1=80=D0=BE=D0=B4=D0=B5=20=D0=BE?= =?UTF-8?q?=D0=BF=D1=8F=D1=82=D1=8C=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D1=81=20media=20chan?= =?UTF-8?q?ged?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 2 +- DSS/API/RmDir.asm | 21 ++------------ DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 44 ++++++++++++++++++++--------- Shared_Includes | 2 +- 5 files changed, 36 insertions(+), 35 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index ce707cc..97f03a2 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -581,7 +581,7 @@ get_drive_letter: ld c,Dss.GSwitch ; выделить параметр ком. строки RST ToDSS ; - rra + ;rra rl b ; признак конца параметров ; ld de,buffer diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index d85e693..906f904 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -62,25 +62,13 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH BC PUSH HL PUSH IX - ; - ; IN A,(SLOT3) - ; PUSH AF - ; IN A,(SLOT0) - ; OUT (SLOT3),A - ; ; - ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 - ; LD BC,1*256 + Dss.DRV.Read - ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - ; RST ToDSS.DRV - ; POP AF - ; OUT (SLOT3),A CALL READ_SECTOR ; !FIXIT нет проверки на ошибку ; - ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + ;!HARDCODE sector size. 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD B,16 LD HL,CORE_BUFFERS.SECTOR_BUFFER -.check_dir_loop: +.check_dir_loop:; LD A,(HL) OR A JP Z,.dir_empty @@ -106,10 +94,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 OR XL JR NZ,.no_inc_hl INC HL -.no_inc_hl: ; POP AF - ; DEC A - ; JR NZ,.read_dir_loop - POP BC +.no_inc_hl: POP BC DJNZ .read_dir_loop ; fat32 EXX diff --git a/DSS/build.txt b/DSS/build.txt index abc4eff..801f180 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -46 \ No newline at end of file +47 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 148864f..0ce4512 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -431,32 +431,48 @@ GetParams: EX DE,HL LD C,BIOS.DRV_GET_PAR RST ToBIOS POP IY - JR NC,.next + JR C,.error ; - CP BIOS.Error.BadNumber - SCF - JR Z,.error - LD A,BIOS.Error.NotReady - JR .error + ; CP BIOS.Error.BadNumber + ; SCF + ; JR Z,.error + ; LD A,BIOS.Error.NotReady + ; JR .error ; ; [ ] media change - убрать ;!FIXIT .next: EX AF,AF' JR NC,.NoMediaChange CP BIOS.Error.ATAPI.UnitAttention - SCF - JR NZ,.NoMediaChange - ; -.ReDEFINE: PUSH IX - PUSH IY + JR Z,.ReDEFINE + ;SCF + ;JR NZ,.NoMediaChange + ; PUSH HL PUSH DE + AND A + LD DE,#FFFF + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+0) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+1) + SBC HL,DE + JR NZ,.ReDEFINE_SP + ; + LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) + LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) + SBC HL,DE + JR Z,.ReDEFINE_Skip + ; + ; +.ReDEFINE: PUSH HL + PUSH DE +.ReDEFINE_SP: PUSH IX + PUSH IY PUSH BC CALL ReDEFINE_PARTITIONS POP BC - POP DE - POP HL POP IY POP IX +.ReDEFINE_Skip: POP DE + POP HL ; .NoMediaChange: ; перетасовка регистров с результатом от BIOS EX DE,HL @@ -498,7 +514,7 @@ GetParams: EX DE,HL LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; - ;AND A + AND A .error: POP IY POP IX RET diff --git a/Shared_Includes b/Shared_Includes index 89efc04..1b6a539 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 89efc04ac63ae8b6a3b79c4a0e521fc967636a64 +Subproject commit 1b6a539aea8d46b09a617a90a04a2e45dcb37b3f From 17b7bb938afcd4790b20b42e76fd96ffbe3e7516 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 24 May 2025 00:55:54 +1000 Subject: [PATCH 212/219] silent sys --- BOOT/boot.asm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 97f03a2..78c107b 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -141,11 +141,13 @@ BEGIN: ;di sbc hl,bc jr nc,BEGIN.old_ver ; -version_ok: xor a ; индекс строки титла - call print_string - pop hl ; ком-строка +version_ok: pop hl ; ком-строка ; выделить параметр ком-строки call get_drive_letter + push af + xor a ; индекс строки титла + call print_string + pop af jp c,help ; нет параметров ld (disk),a ; заданный номер диска ; узнать номер boot-диска системы From ec139d5761d152ff67c54b1927a1dad22e4c0bc6 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 24 May 2025 22:55:54 +1000 Subject: [PATCH 213/219] =?UTF-8?q?SHELL:=20fixed=20bug=20in=20read=5Fdisk?= =?UTF-8?q?=5Finfo=20with=20.full=20CORE:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=A4=D0=A1=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0=20=D0=B2=20FAT=5FBPB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DOS_Proc.asm | 4 ++-- DSS/FS/FAT.asm | 39 ++++++++++++++++++++++++------------- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 4 +--- SHELL/Procedures/shared.asm | 7 +++++-- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 7 files changed, 36 insertions(+), 24 deletions(-) diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 8e45be8..4346cb6 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -305,8 +305,8 @@ MASK: LD HL,TMPNAME POP DE POP HL LD A,(HL) - CP '.' ;R007 - SCF ;R007 + CP '.' ;R007 + SCF ;R007 JR Z,.MASKB ;R007 CP ' '+1 .MASKB: LD A,DSS_Error.sys.INVALID_NAME diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 4a76892..c4d5fbf 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -723,6 +723,9 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) CP #F0 JP C,RD_BPB.UnknownBPB ; + XOR A + LD (.UsesVarsFAT32),A + ; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector) LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) @@ -753,6 +756,7 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) OR D JR NZ,.skip_high ; + LD (.UsesVarsFAT32),A EXX LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) LD A,E @@ -766,6 +770,7 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD (CORE_BUFFERS.FS_Buffer.Number_Of_FATs),A CP 1 JR Z,.one_FAT + JP C,RD_BPB.UnknownBPB DEC A ADD HL,DE LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL @@ -791,7 +796,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_H),HL EXX - ;LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_H),BC ; LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) LD A,B @@ -813,12 +817,18 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) ; EX DE,HL LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 - ; [ ]fat32 ;!TEST + ; fat32 LD A,H OR L - JR Z,.skip_loop2 + ;JR Z,.skip_loop2 + JR NZ,.filesRoot + ; + INC A + LD (.UsesVarsFAT32),A + DEC A + JR .skip_loop2 ; - DEC HL +.filesRoot: DEC HL XOR A ;NEXTAD2 .loop2: INC A @@ -904,15 +914,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) SBC HL,DE ; .HDDBIG: CALL SectorToCluster -; LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) -; SCF -; .loop7: RRA -; JR C,.loop7_exit -; RR B -; RR C -; RR H -; RR L -; JP .loop7 ; .loop7_exit: INC HL LD (CORE_BUFFERS.FS_Buffer.MaxClusterLow),HL @@ -985,6 +986,10 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) JR C,.its_FAT32 ; ; It's FAT16 + LD A,(.UsesVarsFAT32) + AND A + JP NZ,RD_BPB.UnknownBPB + ; LD HL,#FFFF LD A,FAT_TYPE.x16 .set_vars: EXX @@ -998,7 +1003,11 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) JR .SET_VARS ; -.its_FAT12: LD HL,#0FFF +.its_FAT12: LD A,(.UsesVarsFAT32) + AND A + JP NZ,RD_BPB.UnknownBPB + ; + LD HL,#0FFF LD A,FAT_TYPE.x12 JR .set_vars ; @@ -1142,6 +1151,8 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) SBC HL,DE RET + ; +.UsesVarsFAT32: DB 0 ;;;;;;;; ; --> BC:HL - Sector diff --git a/DSS/build.txt b/DSS/build.txt index 801f180..31ff414 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -47 \ No newline at end of file +48 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 1a03623..1a3d04f 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -256,10 +256,8 @@ cmd_dir: push de or a call nz,ToDSS ; - ld a,(read_disk_info.full) + ld a,(read_disk_info.LastDskInfoIsFull) and a - ;ld de,MAIN_MSG.CRLF - ;jp z,ECHO_MESSAGE RET Z ; ; free space diff --git a/SHELL/Procedures/shared.asm b/SHELL/Procedures/shared.asm index b223c6c..ec636ce 100644 --- a/SHELL/Procedures/shared.asm +++ b/SHELL/Procedures/shared.asm @@ -37,7 +37,7 @@ read_disk_info: OR #80 AND E EXX INC A - LD (.full),A + LD (.LastDskInfoIsFull),A ; AND H @@ -201,7 +201,10 @@ read_disk_info: OR #80 DJNZ .loop3 LD HL,serial_string+4 LD (HL),'-' - JR read_disk_info.get_label + JR .get_label + ; +.LastDskInfoIsFull: + DB 0 ; /////////////////////////////////////////////////////////////////////// free_space_low: WORD 0 diff --git a/SHELL/build.txt b/SHELL/build.txt index 88bc40f..54a584d 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -513 \ No newline at end of file +514 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 1b6a539..25ac1c8 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 1b6a539aea8d46b09a617a90a04a2e45dcb37b3f +Subproject commit 25ac1c89f4ce070e041437ddbcdd18ab2ab223be From e01ebd75bdfe3f7424ed00154fe5ce2578781317 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 25 May 2025 18:14:56 +1000 Subject: [PATCH 214/219] =?UTF-8?q?=D0=BE=D0=BF=D1=8F=D1=82=D1=8C=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=B7=D0=B0=D1=82=D1=83=D0=BF?= =?UTF-8?q?=D0=B0=20=D1=81=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BC=20=D0=B4?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/diskINF.asm | 2 +- DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 4 ++-- Shared_Includes | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 8fb2559..775111a 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -242,7 +242,7 @@ FAT_STRING: DB 'FAT12' ; DE - буфер GET_LABEL: PUSH DE LD HL,.LABEL_MASK ; "\*.*" имя метки - LD A,FAT_ATTR.ItIsVolID ; атрибут метки тома + LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома LD B,high Dss.F_First.FATname CALL F_FIRST POP DE diff --git a/DSS/build.txt b/DSS/build.txt index 31ff414..2e66562 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -48 \ No newline at end of file +49 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 1a3d04f..2a98517 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -122,8 +122,8 @@ cmd_dir: push de ; .NeXt: CALL Print_Header ; [ ] 01/10/23 - ld hl,Buffers.work.free ; имя файла - ld de,Buffers.work.buffer1 ; 80 буфер + ld hl,Buffers.work.free ; имя файла + ld de,Buffers.work.buffer1 ; 80 буфер ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) ld bc,Dss.F_First.FATname ; f_first (формат 11) RST ToDSS diff --git a/Shared_Includes b/Shared_Includes index 25ac1c8..8371051 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 25ac1c89f4ce070e041437ddbcdd18ab2ab223be +Subproject commit 8371051031cac61e25740ba6cf9f2acacdc783b7 From 7befdcafc1db91895e405c62ea8cbc69f350f4cb Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 26 May 2025 00:46:35 +1000 Subject: [PATCH 215/219] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D0=B1=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BD=D1=91=D0=B9=20=D0=BF=D0=BE=20=D1=80=D1=83?= =?UTF-8?q?=D1=81=D1=81=D0=BA=D0=B8=D0=BC=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Find.asm | 2 +- DSS/FS/FAT.asm | 4 ++-- DSS/Procedures.asm | 49 +++++++++++++++++++++++----------------------- DSS/build.txt | 2 +- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index ece270c..50ba524 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -17,9 +17,9 @@ F_FIRST_FN: CALL F_FIRST.INIT_VARS PUSH HL ;!TEST Current Dir ;[x] 15/10/23 CALL DIR_PATH_CHECK + POP HL RET C ; - POP HL JR F_FIRST.begin ; F_FIRST: CALL .INIT_VARS diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index c4d5fbf..2dde1a3 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -443,8 +443,8 @@ FINDDIR: RET Z LD (HL),A INC HL - LD (HL),0 - ;INC HL + XOR A ; сброс CF заодно + LD (HL),A RET ;----------------------------------------------------------------------; diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index cf7ecdd..58b46f9 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -206,31 +206,32 @@ CalcDayOfWeek: LD A,D ;----------------------------------------------------------------------; ; a..z -> A..Z -UPPER: CP 'a' - RET C - CP 'z' + 1 - JR NC,.MDUPPER - SUB #20 -.NOUPPER: - RET -.MDUPPER: - CP 'а' ; русская буква а, код #A0 - JR C,.NOUPPER - CP 'п' ; русская буква п, код #B0 - JR NC,.BGUPPER - SUB #20 - RET -.BGUPPER: - CP 'р' ; русская буква р, код #E0 - JR C,.NOUPPER - CP 'Ё' ; русская буква Ё, код #F0 - JR NC,.HGUPPER - SUB #50 - RET +UPPER: CP 'a' + RET C + CP 'z' + 1 + JR NC,.CheckRUS +.Dec: SUB #20 + RET + ; +.CheckRUS: CP 'а' ; русская буква а, код #A0 + RET C + CP 'п' ; русская буква п, код #B0 + JR C,.Dec + ; JR NC,.BGUPPER + ; SUB #20 + ; RET + ; +.BGUPPER: CP 'р' ; русская буква р, код #E0 + RET C + CP 'Ё' ; русская буква Ё, код #F0 + JR NC,.HGUPPER + SUB #50 + RET + ; .HGUPPER: CP 'ё' ; русская буква ё, код #F1 - RET NZ - DEC A - RET + RET NZ + DEC A + RET ;----------------------------------------------------------------------; diff --git a/DSS/build.txt b/DSS/build.txt index 2e66562..7003e7f 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -49 \ No newline at end of file +51 \ No newline at end of file From 8ba8177a13b3f222264edbee29647570b549cd80 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 3 Jun 2025 22:23:48 +1000 Subject: [PATCH 216/219] =?UTF-8?q?CORE:=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D1=80=D1=83=D1=81=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D0=BC=D0=B8=20=D0=B1=D1=83=D0=BA=D0=B2=D0=B0=D0=BC=D0=B8?= =?UTF-8?q?=20SHELL:=20=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=20=D1=81=20=D0=BC=D0=B0=D1=81=D0=BA=D0=BE=D0=B9=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20DIR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Write.asm | 2 +- DSS/FS/FAT.asm | 2 +- DSS/KEYINTER.ASM | 2 +- DSS/Procedures.asm | 7 ++---- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 38 ++++++++++++++++++++++++++--- SHELL/Commands/DIR.ASM | 6 +++-- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 9 files changed, 46 insertions(+), 17 deletions(-) diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index e6c2888..4c5a9cf 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -4,7 +4,7 @@ WRITE.ERR2: POP HL WRITE.ERR1: POP BC - SCF + ;SCF RET WRITE.RD_ONLY: POP DE diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 2dde1a3..19bfdf3 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -2605,6 +2605,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV + ; LD A,DSS_Error.sys.WRITE_ERROR JR C,.Error_3 POP BC @@ -2626,7 +2627,6 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX .Error_3: POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP BC POP DE - ;LD A,DSS_Error.sys.WRITE_ERROR ;SCF RET ; diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index f97b49b..b08715e 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -1172,7 +1172,7 @@ BEEP: LD A,#10 JR NZ,BEEP RET ; -.beep_loop: OUT (ZX_Beeper),A +.beep_loop: OUT (SP_SND.Beeper),A LD B,D LD C,E ; diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index 58b46f9..4638b1f 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -215,11 +215,8 @@ UPPER: CP 'a' ; .CheckRUS: CP 'а' ; русская буква а, код #A0 RET C - CP 'п' ; русская буква п, код #B0 + CP 'п'+1 ; русская буква п, код #AF + 1 JR C,.Dec - ; JR NC,.BGUPPER - ; SUB #20 - ; RET ; .BGUPPER: CP 'р' ; русская буква р, код #E0 RET C @@ -228,7 +225,7 @@ UPPER: CP 'a' SUB #50 RET ; -.HGUPPER: CP 'ё' ; русская буква ё, код #F1 +.HGUPPER: CP 'ё' ; русская буква ё, код #F1 RET NZ DEC A RET diff --git a/DSS/build.txt b/DSS/build.txt index 7003e7f..7c6ba0f 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -51 \ No newline at end of file +55 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 0ce4512..31c71f1 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -650,17 +650,19 @@ GetBPB: ; !FIXIT ReadLong: LD C,BIOS.DRV_READ_LONG JP Exec_BIOS - +;!FIXIT debug zip ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A'- PAGE ; A - HDD LOG NUMBER ;WRITE SECTOR +; WriteLong: LD C,BIOS.DRV_WRITE_LONG +; JP Exec_BIOS WriteLong: LD C,BIOS.DRV_WRITE_LONG JP Exec_BIOS - +;!FIXIT debug zip ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER @@ -668,7 +670,31 @@ WriteLong: LD C,BIOS.DRV_WRITE_LONG ;WRITE SECTOR Write: LD C,BIOS.DRV_WRITE JP Exec_BIOS - +; Write: LD C,BIOS.DRV_WRITE +; .loop: PUSH HL +; PUSH IX +; PUSH DE +; PUSH BC +; PUSH AF +; CALL Exec_BIOS +; JR NC,.good +; JR Z,.good +; ; +; POP AF +; POP BC +; POP DE +; POP IX +; POP HL +; JR .loop +; ; +; .good: EXX +; POP DE +; POP DE +; POP DE +; POP DE +; POP DE +; EXX +; RET ;HL:IX - SECTOR @@ -685,15 +711,17 @@ Exec_BIOS: PUSH IY ; .exec: CALL SelectDrive RET C ;!FIXIT переделать номер ошибки с драйвера на дос + PUSH IY RST ToBIOS + POP IY RET NC CP BIOS.Error.ATAPI.UnitAttention SCF RET NZ SET 1,(IY + LOGDRV.MediaParameters) RET + ; - ;------------------------------[ PARTIT ]------------------------------; ; вход: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved DEFINE_PARTITIONS: @@ -983,6 +1011,8 @@ INC_DRV_COUNT: LD A,(Init.count) LD (Init.count),A RET +;======================================================================= + ;======================================================================= ; PHISICAL DRIVE NUMBER ; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 2a98517..47d0c71 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -7,6 +7,7 @@ cmd_dir: push de ; зануляем все параметры на старте xor a ld (Buffers.work.buffer2),a + ld (Buffers.work.free),a ld (read_disk_info.full),a ld (.key_p),a ; выполняем/настраиваем все найденные параметры в строке @@ -48,8 +49,9 @@ cmd_dir: push de ld hl,Buffers.work.buffer1 ld bc,Dss.EX_Path.GET_ALL rst ToDSS - ; - and %00001100 ; имя диска и путь + ;!FIXIT сделать поиск по маски без пути в начале + ; сейчас перед маской нужен путь типа dir .\*.asm + and %00001100 ; имя диска и путь ;!FIXIT сделать поиск по маски без пути в начале jr z,.SkipMask ; ld hl,Buffers.work.buffer2+2 diff --git a/SHELL/build.txt b/SHELL/build.txt index 54a584d..c047c4a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -514 \ No newline at end of file +518 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 8371051..63faf9f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 8371051031cac61e25740ba6cf9f2acacdc783b7 +Subproject commit 63faf9f0823649cfb52e9fcaad430170a05b31a7 From 98f56372893c81b3c5309a696ef07411067f1a21 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 15 Jun 2025 03:35:37 +1000 Subject: [PATCH 217/219] -2 bytes --- DSS/API/diskINF.asm | 3 --- DSS/build.txt | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 775111a..d0655a5 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -127,9 +127,6 @@ DISKINF: LD C,B .error: POP HL RET ; - CP #FF ; !FIXIT WorkDirectory - ;!TEST !Current Dir - ;JR Z,CURRDS ;R06 .CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' LD HL,CORE_BUFFERS.FS_Buffer.DRIVE diff --git a/DSS/build.txt b/DSS/build.txt index 7c6ba0f..2ebc651 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -55 \ No newline at end of file +56 \ No newline at end of file From 072ed4ed60b1912e6d86c0d9c79decf43eb3cb28 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 17 Jun 2025 05:20:24 +1000 Subject: [PATCH 218/219] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Write.asm | 8 ++++---- DSS/FS/FAT.asm | 2 +- DSS/KEYINTER.ASM | 27 +++++++++++++++------------ DSS/build.txt | 2 +- Shared_Includes | 2 +- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 4c5a9cf..90474ae 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -53,7 +53,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH DE PUSH BC .R_POINT+2: LD IX,0 - CALL BLOK_WRITE + CALL BLOCK_WRITE POP BC JR C,.ERR3 LD C,B @@ -62,7 +62,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] .WOV5: ADD HL,DE DJNZ .WOV5 ; B=0 - LD (.R_POINT),HL ;!FIXIT это значение уже расcчитывается перед выходом в BLOK_WRITE? + LD (.R_POINT),HL ;!FIXIT это значение уже расcчитывается перед выходом в BLOCK_WRITE? ;LD B,0 POP HL ADD HL,BC @@ -103,7 +103,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_WRITE + CALL BLOCK_WRITE POP BC LD C,SLOT3 OUT (C),B @@ -181,7 +181,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_WRITE + CALL BLOCK_WRITE POP BC LD C,SLOT3 OUT (C),B diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 19bfdf3..cba5fe8 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -2422,7 +2422,7 @@ CHECK_FIRST_CLUSTER: ; IX - data in RAM ; IY - FM ; B - количество секторов для записи -BLOK_WRITE: LD (READ.PointerOnBuffer),IX +BLOCK_WRITE: LD (READ.PointerOnBuffer),IX LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index b08715e..76c73f3 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -451,14 +451,9 @@ PUTSYM: LD HL,HEAD AND #3F CP (HL) JR Z,FULL_BF - LD A,(HL) - INC (HL) - INC (HL) - INC (HL) - INC (HL) - RES 6,(HL) - LD L,A - LD H,high SBUF + ; + CALL GetSymAddr + ; LD (HL),E INC L LD (HL),D @@ -468,10 +463,8 @@ PUTSYM: LD HL,HEAD LD (HL),C RET -GETSYM: LD HL,HOST - LD A,(HEAD) - CP (HL) - RET Z + +GetSymAddr: LD A,(HL) INC (HL) INC (HL) @@ -480,6 +473,16 @@ GETSYM: LD HL,HOST RES 6,(HL) LD L,A LD H,high SBUF + RET + + +GETSYM: LD HL,HOST + LD A,(HEAD) + CP (HL) + RET Z + ; + CALL GetSymAddr + ; LD E,(HL) INC L LD D,(HL) diff --git a/DSS/build.txt b/DSS/build.txt index 2ebc651..f0b5c72 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -56 \ No newline at end of file +57 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 63faf9f..a0e68ce 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 63faf9f0823649cfb52e9fcaad430170a05b31a7 +Subproject commit a0e68ce3a19bd47537585e49bfbf5e45fab197a1 From 49af2b4266176df2dbc52bf6cc7cf22dd480b944 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:15:30 +1000 Subject: [PATCH 219/219] =?UTF-8?q?-bug=20in=20DIR=20=D1=81=20=D1=80=D1=83?= =?UTF-8?q?=D1=81=D1=81=D0=BA=D0=B8=D0=BC=D0=B8=20=D0=B1=D1=83=D0=BA=D0=B2?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8.=20=D0=BE=D0=BF=D1=8F=D1=82=D1=8C=20=D0=A1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B5=D0=BB=D0=B8=D0=B9=20=D0=BD=D0=B0=D1=88=D1=91?= =?UTF-8?q?=D0=BB)))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SHELL/Commands/CLS.ASM | 26 ++++++------- SHELL/Commands/DIR.ASM | 30 ++++++++------- SHELL/EXEC.ASM | 6 +-- SHELL/Procedures/parsers.asm | 6 +-- SHELL/Procedures/shared.asm | 27 ++++++++++++- SHELL/SHELL.ASM | 74 ++++++++++++++++++------------------ SHELL/build.txt | 2 +- 7 files changed, 95 insertions(+), 76 deletions(-) diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 432fc70..3f62cbb 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -51,16 +51,16 @@ cls_clear: ld a,b ; ascii -> int -ascii2byte: - cp "0" - ret c - cp "9"+1 - jr c,$+10 ;!FIXIT $ - and 5Fh - cp "F"+1 - ccf - ret c - sub 7 - sub "0" - or a - ret +ascii2byte: cp "0" + ret c + cp "9"+1 + jr c,.number + ; + and %0101'1111 + cp "F"+1 + ccf + ret c + sub 7 +.number: sub "0" + or a + ret diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 47d0c71..70dbd0c 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -328,7 +328,7 @@ Print_Header: ; %1 JP ECHO_MESSAGE ; вывести строку ; -; Подготовить строку списка файлов/папок +; Подготовить строку списка файлов/папок ; !FIXIT не готова к LFN PRNNAME: dec hl ld a,(hl) and FAT_ATTR.DIRECTORY @@ -358,18 +358,22 @@ PRNNAME: dec hl ld b,11 ;!HARDCODE длина имени DOS .loop: inc hl ld a,(hl) - cp 'A' - jr c,.next - cp 'Z'+1 - jr c,.letter - ; - cp 'А' ;#80 - jr c,.next - cp 'Я'+1 ;#9F + 1 - jr nc,.next - ; -.letter: or %0010'0000 - ld (hl),a + call CorrBigChar +; cp 'A' +; jr c,.next +; cp 'Z'+1 +; jr c,.letter +; ; +; cp 'А' ;#80 +; jr c,.next +; cp 'П'+1 ;#9F + 1 +; jr c,.letter +; ; +; cp 'Я'+1 +; jr c,.next +; ; +; .letter: or %0010'0000 + ld (hl),a .next: djnz .loop ex de,hl ret diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 70f520f..9f78156 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -55,11 +55,7 @@ COMP: call EVALCMD ; (batch.asm) cp c ; 2-й символ jr nz,RUN_EXT ; задан не диск ld a,b ; 1-й символ - cp "a" - jr c,.NOUP - cp "z"+1 - jr nc,.NOUP - and #5F ; a..z -> A..Z + CALL COMPARE.cmp_AZ .NOUP: sub "A" ; номер диска ld (.dsk),a ld c,Dss.ChDisk ; сменить тек. диск diff --git a/SHELL/Procedures/parsers.asm b/SHELL/Procedures/parsers.asm index 7cccc6b..9a59823 100644 --- a/SHELL/Procedures/parsers.asm +++ b/SHELL/Procedures/parsers.asm @@ -9,11 +9,7 @@ RUN_COMMAND: push de ; .loop: ld a,(de) - cp "a" - jr c,.skip - cp "z"+1 - jr nc,.skip - and %0101'1111 ; a..z -> A..Z + CALL COMPARE.cmp_AZ .skip: cp (hl) jr nz,.not_cmd ; не команда inc hl diff --git a/SHELL/Procedures/shared.asm b/SHELL/Procedures/shared.asm index ec636ce..ea07568 100644 --- a/SHELL/Procedures/shared.asm +++ b/SHELL/Procedures/shared.asm @@ -221,4 +221,29 @@ volume_string_yes: db "has label",0 ; ; has_not_full_info: db ' (?)',0 /////////////////////////////////////////////////////////////////////// -;----------------------------------------------------------------------; \ No newline at end of file +;----------------------------------------------------------------------; + + + +;Процедура коррекции буквы к маленькой букве +CorrBigChar: CP 'A' + RET C + CP 'Z' + 1 + JR NC,.CheckRUS +.Dec: ADD #20 + RET + ; +.CheckRUS: CP 'А' + RET C + CP 'П'+1 + JR C,.Dec + ; +.BGUPPER: CP 'Я' + 1 + JR NC,.HGUPPER + ADD #50 + RET + ; +.HGUPPER: CP 'Ё' ; русская буква ё, код #F1 + RET NZ + INC A + RET diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 8908e4f..5090b2d 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -285,30 +285,26 @@ GET_CMD: ; Тест на опции шелла и уст. бит-флагов ; вход: hl=строка опций set_option_flag: - ld a,(RUNMODE) ; ячейка бит-флагов - ld c,a - ld a,(hl) - cp "a" - jr c,setopt1 - cp "z"+1 - jr nc,$+4 ;!FIXIT $ - and #5F ; a..z -> A..Z -setopt1: cp "P" ; запуск шелла с отраб. autoexec.bat - jr nz,setopt2 - set 7,c - jr setopt4 - ; -setopt2: cp "S" ; запуск 2-й копии шелла (без отраб. autoexec.bat) - jr nz,setopt3 - set 5,c - jr setopt4 - ; -setopt3: cp "C" ; выполн. bat-файл и вернуться в родит. процесс - ret nz - set 4,c -setopt4: ld a,c - ld (RUNMODE),a - ret + ld a,(RUNMODE) ; ячейка бит-флагов + ld c,a + ld a,(hl) + call COMPARE.cmp_AZ +.setopt1: cp "P" ; запуск шелла с отраб. autoexec.bat + jr nz,.setopt2 + set 7,c + jr .setopt4 + ; +.setopt2: cp "S" ; запуск 2-й копии шелла (без отраб. autoexec.bat) + jr nz,.setopt3 + set 5,c + jr .setopt4 + ; +.setopt3: cp "C" ; выполн. bat-файл и вернуться в родит. процесс + ret nz + set 4,c +.setopt4: ld a,c + ld (RUNMODE),a + ret ; Сохранить тек. диск и путь @@ -355,23 +351,25 @@ newline: push hl pop hl ret -; Сравнение строк +; Сравнение строк (Английский) ; in: de=string1 ; hl=string2 ; b=длина строки -COMPARE: - ld a,(de) - cp "a" - jr c,.next - cp "z"+1 - jr nc,.next - and 5Fh ; a..z -> A..Z -.next: cp (hl) - ret nz - inc hl - inc de - djnz COMPARE - ret +COMPARE: ld a,(de) + call .cmp_AZ +.next: cp (hl) + ret nz + inc hl + inc de + djnz COMPARE + ret + ; +.cmp_AZ: cp "a" + ret c + cp "z"+1 + ret nc + and %0101'1111 ; a..z -> A..Z + ret ; Скопир. строку (с нулем), макс. 15 символов diff --git a/SHELL/build.txt b/SHELL/build.txt index c047c4a..8db1e5f 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -518 \ No newline at end of file +522 \ No newline at end of file