From dd79b546ecda77efe05c7718167e3bce38c06cd2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 6 Mar 2025 03:29:13 +1000 Subject: [PATCH] new DSS in recovery --- Shared_Includes | 2 +- src/bios/exp/FONT.ASM | 6 +- src/bios/exp/FUNC_LOW_PRINT.ASM | 476 +++++++++++++++++++++++++++++++- src/bios/rom/SETUP/MAIN.asm | 4 +- src/bios/rom/SETUP/SETTINGS.asm | 4 +- src/bios/rom/SETUP/VIDEO_IO.asm | 12 +- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 7 files changed, 475 insertions(+), 29 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 60b5ff6..9bfe7bd 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 60b5ff6a74b57614b1f54fbe5611585cd46582ab +Subproject commit 9bfe7bd76b9648dae6f492dcd730b9b7ed80f48d diff --git a/src/bios/exp/FONT.ASM b/src/bios/exp/FONT.ASM index 2ef9370..3ea3f24 100644 --- a/src/bios/exp/FONT.ASM +++ b/src/bios/exp/FONT.ASM @@ -167,4 +167,8 @@ end end ENDLUA -; \ No newline at end of file +; +/* +Линия 256 байтов в ОЗУ становится столбиком в видеопамяти. +Слева направо переходит сверху вниз. Первая линия - первый столбик. +*/ \ No newline at end of file diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index 29ad79c..70ac35e 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -597,12 +597,12 @@ WIN_SET_ZG: ; LP_SET_ZG: AND #0F ADD A,A OUT (PORT_Y),A - LD A,B - RRCA - RRCA - RRCA - AND #18 - OR #40 + LD A,B ; %xx00'0000 + RRCA ; %0xx0'0000 + RRCA ; %00xx'0000 + RRCA ; %000x'x000 + AND %0001'1000 + OR %0100'0000 LD H,A LD L,0 LD BC,#0800 ;!HARDCODE @@ -783,7 +783,7 @@ LP_INI_P: EXX EX AF,AF' - CALL WIN_SET_ZG.SET ;LP_SET_ZG1 + CALL WIN_SET_ZG.SET ;LP_SET_ZG1 EXX EX AF,AF' @@ -833,9 +833,6 @@ LP_OPEN_S: LD A,B LD L,A JR NC,.no_inc INC H - ; LD A,H - ; ADC A,0 - ; LD H,A .no_inc: LD A,(HL) INC HL LD H,(HL) @@ -895,6 +892,9 @@ PIC_SET_S2: ;------------------------------------------------------------------[#B0] ; HL - место на экране по знакоместам (НЕ ИСПОЛЬЗУЕТСЯ) ; IX - описатель окна +WIN_OPEN.SCR1: + LD E,1 +; E - bit0 - номер экрана WIN_OPEN: LP_OPEN_PG LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна @@ -1055,7 +1055,7 @@ LP_MODE_LINE: LP_MODE_RECURSE: LD A,D ; горизонтальное положение - AND 7FH + AND #7F SUB 80 JR C,LP_MODE_LL SUB 48 @@ -1067,7 +1067,7 @@ LP_MODE_RECURSE: LD A,E ; восстановить RRA - AND 3FH + AND #3F SUB C JR NC,LP_EXIT_MODE NEG @@ -1077,7 +1077,7 @@ LP_MODE_RECURSE: LP_MODE_LL: NEG RRA - AND 3FH + AND #3F CP C JR NC,LP_MODE_LR LD C,A @@ -1910,3 +1910,453 @@ LP_CR: LD A,SYS_PAGE JR LP_PRINT_LN_D11 ;------------------------------------------------------------------[#E0] + +;!TODO старая LP_SET_MODE - расковырять старый LP_SCR_MNU +/* + MODULE EXPERIMENT + +; byte 1 +; 0..4 - VIDEO_PAGE +; 5 - mode 42/84 ; 0 - 42,1 - 84 +; 6 - next line +; 7 - end table +; byte 2 - number of places +; byte 3..4 - adress places/ +; 4000-5FFF - Spectrum modes/ C000-FFFF - Graf mode +; + MACRO LP_S PG,XX,ADR + DB PG,XX + DW ADR + ENDM +;--------------------------------------- +GR_BIT_END EQU 7 + +S_BIT_END EQU 7 +S_BIT_LIN EQU 6 +S_BIT_MOD EQU 5 + +BIT_1440 EQU 1 +BIT_MASK_1440 EQU %00000010 + +MODE_PAGE EQU #FC +;--------------------------------------- + ;DS (($/4)*4+4-$) + ALIGN 4 + + +LP_SCR_MNU: + LP_S #40,14,#40E7 + LP_S #40,14,#4807 + LP_S #40,14,#4827 + LP_S #40,14,#4847 + LP_S #40,14,#4867 + LP_S #40,14,#4887 + LP_S #40,14,#48A7 + LP_S #40,14,#48C7 + LP_S #40,14,#48E7 + DB #FF,0,0,0 + +; LP_SCR_80: +; DB 40,32,0,0,#1B,0,0,0 +; DB 0,0,0,0,0,0,0,0 + +; LP_S %01100010,40,#4000 +; LP_S %01100010,40,#4028 +; LP_S %01100010,40,#4050 +; LP_S %01100010,40,#4078 +; LP_S %01100010,40,#40A0 +; LP_S %01100010,40,#40C8 +; +; LP_S %01100010,40,#4800 +; LP_S %01100010,40,#4828 +; LP_S %01100010,40,#4850 +; LP_S %01100010,40,#4878 +; LP_S %01100010,40,#48A0 +; LP_S %01100010,40,#48C8 +; +; LP_S %01100010,40,#5000 +; LP_S %01100010,40,#5028 +; LP_S %01100010,40,#5050 +; LP_S %01100010,40,#5078 +; LP_S %01100010,40,#50A0 +; LP_S %01100010,40,#50C8 +; +; LP_S %01100100,40,#4000 +; LP_S %01100100,40,#4028 +; LP_S %01100100,40,#4050 +; LP_S %01100100,40,#4078 +; LP_S %01100100,40,#40A0 +; LP_S %01100100,40,#40C8 +; +; LP_S %01100100,40,#4800 +; LP_S %01100100,40,#4828 +; LP_S %01100100,40,#4850 +; LP_S %01100100,40,#4878 +; LP_S %01100100,40,#48A0 +; LP_S %01100100,40,#48C8 +; +; LP_S %01100100,40,#5000 +; LP_S %01100100,40,#5028 +; +; DEFB #FF,0,0,0 +; +; LP_SCR_40: +; DB 40,32,0,0,7BH,0,0,0 +; DB 0,0,0,0,0,0,0,0 +; +; LP_S 01000100B,40,5050H +; LP_S 01000100B,40,5078H +; LP_S 01000100B,40,50A0H +; LP_S 01000100B,40,50C8H +; +; LP_S 01000110B,40,4000H +; LP_S 01000110B,40,4028H +; LP_S 01000110B,40,4050H +; LP_S 01000110B,40,4078H +; LP_S 01000110B,40,40A0H +; LP_S 01000110B,40,40C8H +; +; LP_S 01000110B,40,4800H +; LP_S 01000110B,40,4828H +; LP_S 01000110B,40,4850H +; LP_S 01000110B,40,4878H +; LP_S 01000110B,40,48A0H +; LP_S 01000110B,40,48C8H +; +; LP_S 01000110B,40,5000H +; LP_S 01000110B,40,5028H +; LP_S 01000110B,40,5050H +; LP_S 01000110B,40,5078H +; LP_S 01000110B,40,50A0H +; LP_S 01000110B,40,50C8H +; +; LP_S 01001000B,40,4000H +; LP_S 01001000B,40,4028H +; LP_S 01001000B,40,4050H +; LP_S 01001000B,40,4078H +; LP_S 01001000B,40,40A0H +; LP_S 01001000B,40,40C8H +; +; LP_S 01001000B,40,4800H +; LP_S 01001000B,40,4828H +; LP_S 01001000B,40,4850H +; LP_S 01001000B,40,4878H +; +; DEFB 0FFh,0,0,0 +; +; LP_SCR_32: +; DB 32,24,4,4,30H,1,0,0 +; DB 0,0,0,0,0,0,0,0 +; +; LP_S 040h,32,04000H +; LP_S 040h,32,04020H +; LP_S 040h,32,04040H +; LP_S 040h,32,04060H +; LP_S 040h,32,04080H +; LP_S 040h,32,040A0H +; LP_S 040h,32,040C0H +; LP_S 040h,32,040E0H +; +; LP_S 040h,32,04800H +; LP_S 040h,32,04820H +; LP_S 040h,32,04840H +; LP_S 040h,32,04860H +; LP_S 040h,32,04880H +; LP_S 040h,32,048A0H +; LP_S 040h,32,048C0H +; LP_S 040h,32,048E0H +; +; LP_S 040h,32,05000H +; LP_S 040h,32,05020H +; LP_S 040h,32,05040H +; LP_S 040h,32,05060H +; LP_S 040h,32,05080H +; LP_S 040h,32,050A0H +; LP_S 040h,32,050C0H +; LP_S 040h,32,050E0H +; +; LP_S 0FFh,0,0 +; +; LP_SCR_64: +; DB 32,24,4,4,9BH,0,0,0 +; DB 0,0,0,0,0,0,0,0 +; +; LP_S 06Ah,32,04000H +; LP_S 06Ah,32,04020H +; LP_S 06Ah,32,04040H +; LP_S 06Ah,32,04060H +; LP_S 06Ah,32,04080H +; LP_S 06Ah,32,040A0H +; LP_S 06Ah,32,040C0H +; LP_S 06Ah,32,040E0H +; +; LP_S 06Ah,32,04800H +; LP_S 06Ah,32,04820H +; LP_S 06Ah,32,04840H +; LP_S 06Ah,32,04860H +; LP_S 06Ah,32,04880H +; LP_S 06Ah,32,048A0H +; LP_S 06Ah,32,048C0H +; LP_S 06Ah,32,048E0H +; +; LP_S 06Ah,32,05000H +; LP_S 06Ah,32,05020H +; LP_S 06Ah,32,05040H +; LP_S 06Ah,32,05060H +; LP_S 06Ah,32,05080H +; LP_S 06Ah,32,050A0H +; LP_S 06Ah,32,050C0H +; LP_S 06Ah,32,050E0H +; +; LP_S 0FFh,0,0 + + +LP_SET_MNU: + LD IX,LP_SCR_MNU + JR LP_SET_MODE + + +; HL - смещение от начала экрана +; = hor_sh + vert_sh * 64 + 4000H +; IX - экранная таблица +LP_SET_MODE: LP_OPEN_PG + LD (SYS_PAGE.WIN_MAP_SC),IX + LD (SYS_PAGE.WIN_MODE_SH),HL + LD (SYS_PAGE.WIN_MODE_SC),DE + LD HL,(SYS_PAGE.WIN_MAP_SC) + LD DE,SYS_PAGE.WIN_MAP_IX +.LP_SET_COPY: LD BC,4 + LDIR + BIT S_BIT_END,(HL) + JR Z,.LP_SET_COPY + LD BC,4 + LDIR + LD HL,SYS_PAGE.WIN_MAP_IX + LD (SYS_PAGE.WIN_MAP_SC),HL +.LP_SET_MODE_INT: + LD IX,(SYS_PAGE.WIN_MAP_SC) + LD HL,(SYS_PAGE.WIN_MODE_SH) + CALL LP_SET_MODE1 + LD DE,(SYS_PAGE.WIN_MODE_SC) + LP_CLOSE_PG + PUSH DE + CALL LP_INI_P + POP DE + LD A,E + OUT (RGMOD),A + CALL LP_SIZE + RET + +LP_SET_MODE1: AND A + BIT S_BIT_END,(IX) ; проверка конца данных + RET NZ + + PUSH HL + + IN A,(RGADR) + PUSH AF + + LD A,H + CP #48 + CCF + LD A,#16 + ADC A,0 + OUT (RGADR),A + +.LP_SET_LOOP: CALL LP_MODE_LINE + + INC IX + INC IX + INC IX + INC IX + BIT S_BIT_LIN,(IX) + JR Z,.LP_SET_LOOP + + POP AF + OUT (RGADR),A + + POP HL + + LD BC,#40 + ADD HL,BC + JR LP_SET_MODE1 + +;******************************************************** +; Вычисление значения MODE из экранной таблицы. +; IX - текущее положение в таблице. +LP_MODE_LINE: BIT 3,H + RET NZ + + IN A,(SLOT1) + LD (SYS_PAGE.SYS_WORK1),A + + IN A,(RGADR) + AND 1 + OR MODE_PAGE + OUT (SLOT1),A + + LD A,(IX) + LD B,A + RRCA + AND #0F + LD C,A + LD A,B + AND #20 + XOR #30 + OR C + LD C,A + LD A,(IX+3) + RLC A + RLC A + RLC A + AND #C0 + OR C + LD D,A ; Первый байт MODE + LD E,(IX+2) ; Второй байт.. + + LD B,(IX+1) ; число знакомест + + LD A,L + AND #3F + SUB 40 + JR NC,.LP_NO_SET_MD + NEG + CP B + JR NC,.LP_MD_NO_B + LD B,A +.LP_MD_NO_B: + +.LP_MD_LOOP: SET 4,H + LD (HL),E + RES 4,H + LD (HL),D + + INC E + INC L + DJNZ .LP_MD_LOOP + +.LP_MD_END: LD A,(SYS_PAGE.SYS_WORK1) + OUT (SLOT1),A + RET + +.LP_NO_SET_MD: LD A,C + +.LP_MD_LOOP2: INC E + INC L + BIT 5,H + JR Z,.LP_MD_LOOP + DJNZ .LP_MD_LOOP2 + JR .LP_MD_END + + +; вычисление нового места +LP_TAB_HL: LD HL,(SYS_PAGE.WIN_TAB_SC) ; загрузить текущее положение в таблице SCR + LD A,(HL) ; загрузить флаги таблицы + BIT S_BIT_END,A ; флаг конца + JR Z,LP_TAB_H1 ; если 0 - не конец +LP_TAB_H2: LD HL,(SYS_PAGE.WIN_MAP_SC) ; загрузить начальное положение в таблице SCR +LP_TAB_H3: LD A,(HL) ; и новые флаги +LP_TAB_H1: CALL .LP_PG1 ; переключить страницу + INC HL ; (HL) - новое число символов + BIT S_BIT_MOD,A ; бит 42/84 + LD A,(HL) ; загрузить число символов + JR Z,.LP_NO_MUL ; если 84, то не нужно умножение на 2 + ADD A,A ; A=A*2 +.LP_NO_MUL: LD B,A ; число символов в B + INC HL ; загрузка нового HL + LD A,(HL) + INC HL + INC HL + LD (SYS_PAGE.WIN_TAB_SC),HL ; с сохранением следующего положения в таблице SCR + DEC HL + LD H,(HL) ; положение на экране + LD L,A + + LD A,H + RRCA ; вычислить положение + RRCA ; аттрибута + RRCA + AND 3 + OR H + OR #18 + LD C,A + RET + +.LP_PG1: AND #1F ; переключать только страницы ОЗУ Spectrum mode + OUT (RGADR),A + LD E,(HL) ; значение битов и флагов + + BIT S_BIT_MOD,E ; бит 42/84 + JR Z,.LP_N_84 ; если 42 то не устанавливать CF + SCF ; 84 mode +.LP_N_84: EX AF,AF' ; спрятать флаги и значение для вывода в порт + LD A,E ; в A должен быть байт с флагами + RET + +; program init registers +; for low printer & save +LP_INI_P: EXX + LP_OPEN_PG + LD DE,(SYS_PAGE.WIN_ZG) + LD B,0 + CALL LP_TAB_H2 + EXX +; program save registers +; for low printer +LP_END_P: EX AF,AF' + EXX + RLA + LD E,A + LD (SYS_PAGE.WIN_SAV_HL),HL + LD (SYS_PAGE.WIN_SAV_DE),DE + LD (SYS_PAGE.WIN_SAV_BC),BC + LP_CLOSE_PG + EXX + EX AF,AF' + RET + + +; определение size +LP_SIZE: LP_OPEN_PG + EXX + XOR A + LD HL,(SYS_PAGE.WIN_MAP_SC) ; начало карты scr + CALL .LP_LN2 ; сканировать до + EXX ; конца + NEG ; получить число + LD D,A ; строк в D + LD E,0 + EXX + ;LD A,3 ; число символов + LD HL,(SYS_PAGE.WIN_MAP_SC) ; по 3-йе строке + ;CALL LP_LN2 ; настройка +.LOOP: CALL LP_TAB_H3 ; данные + LD A,B + EXX + ADD A,E + LD E,A + EXX + LD HL,(SYS_PAGE.WIN_TAB_SC) ; данные экрана + BIT S_BIT_LIN,(HL) + JR Z,.LOOP + ;BIT S_BIT_MOD,(HL) + EXX + ;XOR A + ;OUT (RGADR),A + LP_CLOSE_PG + RET + ; +.LP_LN0: DEC A + RET Z +.LP_LN1: INC HL + INC HL + INC HL + INC HL +.LP_LN2: BIT S_BIT_LIN,(HL) + JR Z,.LP_LN1 + BIT S_BIT_END,(HL) + JR Z,.LP_LN0 + RET + + ENDMODULE +*/ diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index b9c7910..bbbec36 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -496,9 +496,7 @@ INSTALL: XOR A OUT (BorderColor),A LD IX,win_descriptor.tab80x32 - ;LD HL,#0000 - LD E,1 - CALL WIN_OPEN + CALL WIN_OPEN.SCR1 LD DE,0 LD HL,#2050 diff --git a/src/bios/rom/SETUP/SETTINGS.asm b/src/bios/rom/SETUP/SETTINGS.asm index a08ea4c..e436937 100644 --- a/src/bios/rom/SETUP/SETTINGS.asm +++ b/src/bios/rom/SETUP/SETTINGS.asm @@ -858,9 +858,7 @@ setInt: ld a,CMOS_CELL.ScreenSET .set: CALL FN_SYNC LD IX,win_descriptor.tab80x32 - ;LD HL,#0000 - LD E,1 - CALL WIN_OPEN + CALL WIN_OPEN.SCR1 ld a,(ITEM) ld (ITEM_Restore),a diff --git a/src/bios/rom/SETUP/VIDEO_IO.asm b/src/bios/rom/SETUP/VIDEO_IO.asm index d12c672..be66ec6 100644 --- a/src/bios/rom/SETUP/VIDEO_IO.asm +++ b/src/bios/rom/SETUP/VIDEO_IO.asm @@ -316,12 +316,12 @@ LOGOTYPE: CALL SHOW_LOGO ; ; .ERASE_LOGO: LD IX,win_descriptor.tab80x32 ;LD HL,#0000 - LD E,1 + ;LD E,1 ; EI HALT DI - CALL WIN_OPEN + CALL WIN_OPEN.SCR1 ; LD DE,0 LD HL,#0920 ;!HARDCODE LOGOTYPE SIZE @@ -338,9 +338,7 @@ LOGOTYPE: CALL SHOW_LOGO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SHOW_LOGO: LD IX,win_descriptor.tab320x256 - ;LD HL,#0000 - LD E,1 - CALL WIN_OPEN + CALL WIN_OPEN.SCR1 SAFE_PORTY @@ -449,9 +447,7 @@ go_setup: ; !FIXIT jr nz,go_setup LD IX,win_descriptor.tab80x32 - ;LD HL,#0000 - LD E,1 - CALL WIN_OPEN + CALL WIN_OPEN.SCR1 JP ENTER_SETUP .to_EXIT_SETUP: diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 28b92a060d671c456fb5203d21457148ce9f8cba..b01f68cf518598b90ec8336cd393a3d8dc9b6673 100755 GIT binary patch delta 4819 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 Z_M@Pv|H1Bt3F(%L^`E?lpUX!%{}0>GoFV`K