From 4b3e8113f9c6884f93263db5c0101894b458ee69 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 15 Jul 2023 05:06:38 +1000 Subject: [PATCH] ... --- Shared_Includes | 2 +- src/bios/exp/EXP.asm | 62 +++++++++++--------- src/bios/exp/EXTENDED/FDD_DRIVER_2.asm | 75 +++++++++++++++++++++---- src/bios/exp/FLEX.asm | 29 +++++----- src/bios/shared/DEFINES.INC | 13 +++-- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 6 files changed, 122 insertions(+), 59 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index d3626ca..eb8e552 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d3626cafdbc4a718c1bb02da6d4c3dc806875896 +Subproject commit eb8e55262317fea366bfb6b7d834dde90ff7307b diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 8e6a4af..cb2fc84 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -72,37 +72,43 @@ RST_30: ; INTERUPT Point RST38: IF TEST_INT - ;INT: - PUSH BC - PUSH AF + ;INT: + PUSH BC + PUSH AF - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A - LD A,(SYS_PAGE.INT_ID) - CP #AA - JR Z,YESINT - OUT (C),B - JP NOINT -YESINT: PUSH HL - LD HL,(SYS_PAGE.INT_ADRESS) - LD A,H - OR L - LD A,(SYS_PAGE.INT_PAGE) - OUT (C),B - PUSH DE - CALL NZ,EXTINT - POP DE - POP HL -NOINT: POP AF - POP BC + LD A,(SYS_PAGE.INT_ID) + CP #AA + JR Z,YESINT + OUT (C),B + JP NOINT +YESINT: PUSH HL + LD HL,(SYS_PAGE.INT_ADRESS) + LD A,H + OR L + LD A,(SYS_PAGE.INT_PAGE) + OUT (C),B + PUSH DE + CALL NZ,EXTINT + POP DE + POP HL +NOINT: POP AF + POP BC + EI + RETI + ELSE + +; PUSH AF +; 1: DEC A +; JR NZ,1B +; POP AF + EI + RETI ENDIF - - EI - RETI - ;RST10: ; CALL_48 10h ; RET diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index 38c0387..b8635e7 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -24,14 +24,36 @@ ;[]===========================================================[] ;!FIXIT всегда идет работа с данными для диска А FDD_5x.GETMED: + ;!TEST FDD 720/1440 + IF FDD_NormalCount + LD IY,FDD_INI_TABLE.FDD_0 + DEC A + JR C,.getParams + LD IY,FDD_INI_TABLE.FDD_1 +.getParams: + ENDIF + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD HL,(FDD_INI_TABLE.FDD_0.SECTORS) - LD DE,(FDD_INI_TABLE.FDD_0.CYLINDL) - LD IX,(FDD_INI_TABLE.FDD_0.B_P_S) - LD A,(FDD_INI_TABLE.FDD_0.F144) + ;!TEST FDD 720/1440 + IF FDD_NormalCount + LD L,(IY+1) ;SECTORS + LD H,(IY+2) ;HEADS + LD E,(IY+3) ;CYLINDL + LD D,(IY+4) ;CYLINDH + LD A,(IY+5) ;B_P_S low + LD XL,A + LD A,(IY+6) ;B_P_S High + LD XH,A + LD A,(IY+0) ;F144/720 + ELSE + LD HL,(FDD_INI_TABLE.FDD_0.SECTORS) + LD DE,(FDD_INI_TABLE.FDD_0.CYLINDL) + LD IX,(FDD_INI_TABLE.FDD_0.B_P_S) + LD A,(FDD_INI_TABLE.FDD_0.F144) + ENDIF LD B,A EX AF,AF' OUT (SLOT3),A @@ -51,20 +73,51 @@ FDD_5x.GETMED: ;Return: None ;[]===========================================================[] FDD_5x.SETMED: + ;!TEST FDD 720/1440 + IF FDD_NormalCount + LD IY,FDD_INI_TABLE.FDD_0 + DEC A + JR C,.setParams + LD IY,FDD_INI_TABLE.FDD_1 + ENDIF +.setParams: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD A,B - LD (FDD_INI_TABLE.FDD_0.SECTORS),HL - LD (FDD_INI_TABLE.FDD_0.CYLINDL),DE - LD (FDD_INI_TABLE.FDD_0.B_P_S),IX - LD (FDD_INI_TABLE.FDD_0.F144),A + + ;!TEST FDD 720/1440 + IF FDD_NormalCount + LD (IY+1),L ;SECTORS + LD (IY+2),H ;HEADS + LD (IY+3),E ;CYLINDL + LD (IY+4),D ;CYLINDH + LD A,XL + LD (IY+5),A ;B_P_S low + LD A,XH + LD (IY+6),A ;B_P_S High + LD (IY+0),B ;F144/720 + LD A,B + ELSE + LD A,B + LD (FDD_INI_TABLE.FDD_0.SECTORS),HL + LD (FDD_INI_TABLE.FDD_0.CYLINDL),DE + LD (FDD_INI_TABLE.FDD_0.B_P_S),IX + LD (FDD_INI_TABLE.FDD_0.F144),A + ENDIF EX AF,AF' OUT (SLOT3),A EX AF,AF' - AND A - RET + + ;!TEST FDD 720/1440 + IF FDD_NormalCount + AND 1 + JP Z,FN_TURBO.SET_FDD_720 + JP FN_TURBO..SET_FDD_1440 + ELSE + AND A + RET + ENDIF ;[]===========================================================[] ;Function: Detect Disk Density diff --git a/src/bios/exp/FLEX.asm b/src/bios/exp/FLEX.asm index 4950cc8..887ca03 100644 --- a/src/bios/exp/FLEX.asm +++ b/src/bios/exp/FLEX.asm @@ -631,7 +631,6 @@ FN_SYNC: .INT_PENT: LD IX,SCREEN_TABLES.PENTAGON ; JR PROG_SCR - .PROG_SCR: IN A,(SLOT3) EX AF,AF' @@ -643,11 +642,11 @@ FN_SYNC: LD (SYS_PAGE.COPY_RGADR),A LD (SYS_PAGE.CONFIG_ALL),IX - LD A,0 + XOR A ;----[START]-----------------------[? 1] .loop_1: - OUT (RGADR),A + OUT (PORT_Y),A EX AF,AF' LD A,#50 @@ -682,7 +681,7 @@ FN_SYNC: EX AF,AF' INC A - OUT (RGADR),A + OUT (PORT_Y),A EX AF,AF' LD (HL),0 @@ -693,7 +692,7 @@ FN_SYNC: EX AF,AF' INC A - OUT (RGADR),A + OUT (PORT_Y),A EX AF,AF' DJNZ .loop_5 @@ -705,9 +704,9 @@ FN_SYNC: INC HL INC HL INC HL - IN A,(RGADR) + IN A,(PORT_Y) AND #80 - OUT (RGADR),A + OUT (PORT_Y),A DEC C JR NZ,.loop_3 ;------------------------[^ 3]---------- @@ -729,7 +728,7 @@ FN_SYNC: ; Exit LD A,(SYS_PAGE.COPY_RGADR) - OUT (RGADR),A + OUT (PORT_Y),A LD A,(SYS_PAGE.COPY_SLOT3) OUT (SLOT3),A .exit: OR A @@ -771,12 +770,14 @@ SCREEN_TABLES: DB 9 , #F8 DB 0 -;.SCR: DB 41,#F8, 3,#FC, 4,#FC, 7,#FC, 9,#F8, 0 -.INT: DB 40,#FC, 2,#FD, 6,#FC, 7,#FC, 9,#FC, 0 -.INT_SC: DB 41,#F8, 1,#FD, 6,#FC, 7,#FC, 9,#F8, 0 -.BLN: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 -.SNC: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 -.RES: DB 41,#F8, 3,#FE, 4,#FE, 7,#FE, 9,#F8, 0 +;.SCR: DB 41,#F8, 3,#FC, 4,#FC, 7,#FC, 9,#F8, 0 + +.INT: DB 40,#FC, 2,#FD, 6,#FC, 7,#FC, 9,#FC, 0 ;!TEST PENTAGON INT 2 квадратика +;.INT: DB 40,#FC, 1,#FD, 1,#FC, 1,#FD, 21,#FC, 0 ;!TEST PENTAGON INT 2 квадратика +.INT_SC: DB 41,#F8, 1,#FD, 6,#FC, 7,#FC, 9,#F8, 0 +.BLN: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 +.SNC: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 +.RES: DB 41,#F8, 3,#FE, 4,#FE, 7,#FE, 9,#F8, 0 ;--------------------------------------- ;--- Screen data tables 2: counter1, data address1 .. counterX, data addressX diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index 7f56abd..f2a390a 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -1,8 +1,6 @@ ; ;---------[All shared defines]---------- DEFINE DEBUG 1 ; добавляет строку и сообщение о тестовой сборке на стартовом экране - DEFINE NEW_FEATURE 0 ; !TODO пункты в сетап - DEFINE TEST_INT 1 ; Тестовый обработчик пользовательского INT DEFINE PACKED_MAIN 0 ; паковать MAIN или влезает без этого? DEFINE SP2000_ConfID #FEFF ; DEFINE IDE_Optimization 1 ; слегка оптимизирует некоторые процедуры работы с HDD @@ -10,14 +8,19 @@ DEFINE Pashalki 0 ; DEFINE PICTURE_FILE './src/bios/logo/psfathers.bmp' - DEFINE RECOVERYrdChooseTYPE 1 ; 1 - RECOVERY всегда грузится в диск 15, 2 - ищется свободный рамдиск и если такого нет, то занимается 15ый - DEFINE RECOVERYmountTYPE 1 ; 1 - быстрый немного захардкоженый вариант. 2 - более "правильный" - DEFINE HDDwriteProtect 0 ; Задержка в кадрах после отрисовки логотипа (0 = 256) DEFINE LOGO_DELAY_MIN 25 DEFINE LOGO_DELAY_NORM 100 DEFINE LOGO_DELAY_MAX 130 ; +; +; [ TEST ] + DEFINE TEST_INT 1 ; Тестовый обработчик пользовательского INT + DEFINE NEW_FEATURE 0 ; !TODO пункты в сетап + DEFINE HDDwriteProtect 0 + DEFINE RECOVERYmountTYPE 1 ; 1 - быстрый немного захардкоженый вариант. 2 - более "правильный" + DEFINE RECOVERYrdChooseTYPE 1 ; 1 - RECOVERY всегда грузится в диск 15, 2 - ищется свободный рамдиск и если такого нет, то занимается 15ый + DEFINE FDD_NormalCount 0 ; \ No newline at end of file diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 132c4367eab63d9bb9c379f108e9b6658f7a5c41..3f37079d8c37aed521c03bd885dc2e20b01eb8a4 100755 GIT binary patch delta 9972 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 J&n!5D{~!4f)kFXQ delta 9094 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