From ba3112f0060c35aeeb01993b864c9a69ca3d2882 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 25 Mar 2025 01:04:36 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=D1=81=20txt=2040x32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bios/exp/FUNC_LOW_PRINT.ASM | 274 +++++++++++++++----------------- 1 file changed, 132 insertions(+), 142 deletions(-) diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index 3968f55..f58e1ee 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -63,7 +63,7 @@ ; H - высота, L - ширина ;============================================================= - MACRO TEST_SCR_40 ;[x] включил 31/10/23, чисто на Хэллоууууииин + MACRO CORRECT_SCR_40 ;[x] включил 31/10/23, чисто на Хэллоууууииин EX AF,AF' JR C,.LLL INC D ; режим 40 @@ -156,7 +156,7 @@ LP_PRINT_ALL: CALL LP_BEG_P INC L LD (HL),A DEC L - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -179,7 +179,7 @@ LP_PRINT_SYM: CALL LP_BEG_P OUT (PORT_Y),A .cont: LD (HL),C INC D - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -204,7 +204,7 @@ LP_PRINT_ATR: CALL LP_BEG_P INC L LD (HL),C DEC L - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -237,7 +237,7 @@ LP_PRINT_LINE: CALL LP_BEG_P INC L LD (HL),A DEC L - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -262,7 +262,7 @@ LP_PRINT_LINE2: CALL LP_BEG_P OUT (C),D INC D LD (HL),A - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -274,8 +274,7 @@ LP_PRINT_LINE2: CALL LP_BEG_P ; ;------------------------------------------------------------------[#87] -LP_PRINT_LINE3: - CALL LP_BEG_P +LP_PRINT_LINE3: CALL LP_BEG_P LD A,#50 OUT (SLOT3),A ; @@ -302,7 +301,7 @@ LP_PRINT_LINE3: INC L LD (HL),A DEC L - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -312,8 +311,7 @@ LP_PRINT_LINE3: ; ;------------------------------------------------------------------[#88] -LP_PRINT_LINE4: - CALL LP_BEG_P +LP_PRINT_LINE4: CALL LP_BEG_P LD A,#50 OUT (SLOT3),A ; @@ -334,7 +332,7 @@ LP_PRINT_LINE4: .NoEndSymbol: EXX LD (HL),A INC D - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -344,8 +342,7 @@ LP_PRINT_LINE4: ; ;------------------------------------------------------------------[#8B] -LP_PRINT_LINE5: - CALL LP_BEG_P +LP_PRINT_LINE5: CALL LP_BEG_P LD A,#50 OUT (SLOT3),A ; @@ -367,7 +364,7 @@ LP_PRINT_LINE5: LD (HL),A DEC L INC D - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -414,7 +411,7 @@ LP_PRINT_LINE6: CALL LP_BEG_P EXX LD (HL),A INC D - TEST_SCR_40 + CORRECT_SCR_40 DJNZ_NEXT_HL EXX DJNZ .loop @@ -429,8 +426,7 @@ LP_PRINT_LINE6: CALL LP_BEG_P ;------------------------------------------------------------------[#84] ; портятся только альтернативные регистры и те, что как параметры на входе LP_SET_PLACE: CALL LP_BEG_P - CALL LP_AT_D - ;CALL LP_TAB_E + CALL LP_SET_CUR JP LP_END_P.SYS_PAGE ;------------------------------------------------------------------[#84] ; @@ -442,6 +438,15 @@ LP_GET_PLACE: CALL LP_BEG_P NEG EXX ADD A,D + ; + EX AF,AF' + JR C,.LLL + EX AF,AF' + AND A + RRA ; режим txt 40 + EX AF,AF' +.LLL: EX AF,AF' + ; EXX LD E,A LD A,(WIN_ID_0.V_BEG) @@ -472,8 +477,7 @@ CLS_WIN: CALL LP_BEG_P LD (SYS_PAGE.SYS_WORK1),BC ; сохранить цвет PUSH DE ; -.loop1: CALL LP_AT_D - ;CALL LP_TAB_E +.loop1: CALL LP_SET_CUR PUSH DE EXX LD BC,(SYS_PAGE.SYS_WORK1) @@ -501,8 +505,7 @@ CLS_WIN: CALL LP_BEG_P JR NZ,.loop1 ; POP DE - CALL LP_AT_D - ;CALL LP_TAB_E + CALL LP_SET_CUR JP LP_END_P.SYS_PAGE ;-------------------------------------------------------------[#89, #8D] ; @@ -616,19 +619,24 @@ LP_SIZE: CALL LP_OPEN_PG ; ; ожидается, что портятся только альтернативные регистры и те, что как параметры на входе -LP_AT_D: LD A,(WIN_ID_0.USER.SIZE_V) +; установить курсор: +; D - номер символа по вертикали +; E - номер символа по горизонтали +LP_SET_CUR: ; LP_AT_D: + LD A,(WIN_ID_0.USER.SIZE_V) EXX LD L,A EXX LD A,D EXX -.loop: SUB L - JR NC,.loop +.loop_x: SUB L + JR NC,.loop_x ; ADD A,L ADD A,A ADD A,A LD L,A + ; LD A,(WIN_ID_0.V_BEG) ADD A,L LD L,A @@ -636,27 +644,35 @@ LP_AT_D: LD A,(WIN_ID_0.USER.SIZE_V) LD H,#C3 EXX ;RET -LP_TAB_E: LD A,(WIN_ID_0.SIZE_REL) + ; + ;LP_TAB_E: + LD A,(WIN_ID_0.SIZE_REL) EXX LD D,A EXX LD A,E EXX -.loop: SUB D - JR NC,.loop - JR Z,.loop +.loop_y: SUB D + JR NC,.loop_y + JR Z,.loop_y ; NEG LD B,A ; сохранить сколько осталось символов в строке NEG ADD A,D LD D,A - LD A,(WIN_ID_0.USER.MODE) - AND %0010'0000 - JR Z,.skip_Dx2 - LD A,D - ADD A,A - LD D,A + ; + EX AF,AF' + JR C,.LLL + SLA D ; режим txt 40 +.LLL: EX AF,AF' + ;LD A,(WIN_ID_0.USER.MODE) + ;AND %0010'0000 + ;JR Z,.skip_Dx2 + ;LD A,D + ;ADD A,A + ;LD D,A + ; .skip_Dx2: LD A,(WIN_ID_0.H_BEG) ADD A,D LD D,A @@ -692,6 +708,7 @@ LP_NEXT_HL_DIR: LD A,SYS_PAGE PUSH HL LD A,(WIN_ID_0.USER.SIZE_V) LD B,A + LD E,0 ; всю строку окна скроллим CALL LP_SCROLL_UP.RUN EXX LD C," " @@ -700,7 +717,7 @@ LP_NEXT_HL_DIR: LD A,SYS_PAGE DEC L DEC L DEC L - LD H,#C3 + LD H,#C3 ;!HARDCODE смещение в странице 3 к началу описателей экрана ; LD A,(WIN_ID_0.H_BEG) LD D,A @@ -717,7 +734,7 @@ LP_NEXT_HL_DIR: LD A,SYS_PAGE OUT (PORT_Y),A LD (HL),C INC D - TEST_SCR_40 + CORRECT_SCR_40 EXX DJNZ .loop_cl_line ; @@ -1256,8 +1273,7 @@ LP_MODE_LINE: BIT 0,(IX+Window_Variables.USER.MODE_S) ;***************************************************************** -LP_SCROLL_UD: - DEC B +LP_SCROLL_UD: DEC B JR Z,LP_SCROLL_UP DEC B JR Z,LP_SCROLL_DN @@ -1270,61 +1286,59 @@ LP_SCROLL_UD: LP_SCROLL_UP: DEC E RET Z CALL LP_OPEN_PG + ; LD B,E - LD E,0 ;!FIXIT чёт тут нечисто, подгонка под один вариант окна глобального? + LD E,0 ; всю строку окна скроллим CALL .RUN -.EXIT: CALL LP_CLOSE_PG - RET - ; +.EXIT: JP LP_CLOSE_PG + ; + ; .RUN: PUSH BC - CALL LP_AT_D - ;CALL LP_TAB_E ; вычислить переменные для строки + CALL LP_SET_CUR ; вычислить переменные для строки POP BC .loop2: EXX PUSH HL EXX POP HL - + ; LD E,L LD D,H - INC L - INC L - INC L - INC L - + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO + ; отличие от LP_SCROLL_DN + LD A,4 + ADD L + LD L,A + ; LD A,(WIN_ID_0.V_END) CP L - ;JR C,.EXIT ; если конец, то выход - RET C + RET C ; если конец, то выход + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PUSH BC - LD A,L EXX LD L,A EXX - LD A,(WIN_ID_0.USER.SIZE_H) ADD A,A ; число байт в строке для переноса ADD A,A - LD C,A LD B,0 - + ; LD A,#50 OUT (SLOT3),A ; открыть страницу для переноса EXX - LD A,D ; получить порт начала строки + LD A,D ; получить порт начала строки EXX .loop1: OUT (PORT_Y),A - INC A ; следующее значение порта + INC A ; следующее значение порта LDI LDD OUT (PORT_Y),A - INC A ; следующее значение порта + INC A ; следующее значение порта LDI LDD JP PE,.loop1 - + ; LD A,SYS_PAGE OUT (SLOT3),A POP BC @@ -1336,114 +1350,104 @@ LP_SCROLL_UP: DEC E ; Вход : ; D - верхняя строка ( от 0 ) ; E - число скроллируемых строк -LP_SCROLL_DN: - DEC E ;!FIXIT правильно? +LP_SCROLL_DN: DEC E ;!FIXIT правильно? RET Z - CALL LP_OPEN_PG + ; LD B,E LD E,0 LD A,D ADD A,B -; DEC A LD D,A - PUSH BC - CALL LP_AT_D - ;CALL LP_TAB_E + CALL .RUN +.EXIT: JP LP_CLOSE_PG + ; + ; +.RUN: PUSH BC + CALL LP_SET_CUR POP BC - .loop2: EXX - PUSH HL + PUSH HL EXX POP HL - + ; LD E,L LD D,H - DEC L - DEC L - DEC L - DEC L - + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO + ; можно совместить. признак направления в рег C + ; отличие от LP_SCROLL_UD + LD A,L + SUB 4 + LD L,A + ; LD A,(WIN_ID_0.V_BEG) CP L ; .CONT: L >= A JR Z,.CONT - JR NC,.EXIT ; если конец, то выход + RET NC ; если конец, то выход + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .CONT: PUSH BC - LD A,L EXX - LD L,A + LD L,A EXX - LD A,(WIN_ID_0.USER.SIZE_H) - ADD A,A + ADD A,A ; число байт в строке для переноса ADD A,A LD C,A LD B,0 - + ; LD A,#50 - OUT (SLOT3),A + OUT (SLOT3),A ; открыть страницу для переноса EXX - LD A,D + LD A,D ; получить порт начала строки EXX .loop1: OUT (PORT_Y),A - INC A + INC A ; следующее значение порта LDI LDD OUT (PORT_Y),A - INC A + INC A ; следующее значение порта LDI LDD JP PE,.loop1 - + ; LD A,SYS_PAGE OUT (SLOT3),A - POP BC DJNZ .loop2 -.EXIT: CALL LP_CLOSE_PG RET ; DE - место символа в окне ; А - номер окна ; выход: HL - символ/атрибут B - знакогенератор -WIN_GET_SYM: - AND A +WIN_GET_SYM: AND A SCF RET NZ - + ; CALL LP_BEG_P - - CALL LP_AT_D - ;CALL LP_TAB_E - + CALL LP_SET_CUR LD A,#50 OUT (SLOT3),A - + ; EXX - - LD A,D - OUT (PORT_Y),A - - LD A,(HL) + LD A,D + OUT (PORT_Y),A + LD A,(HL) EXX LD L,A EXX - INC L - LD A,(HL) + INC L + LD A,(HL) EXX LD H,A EXX - DEC L - DEC L - LD A,(HL) + DEC L + DEC L + LD A,(HL) + INC L EXX LD B,A - EXX - INC L - - EXX JP LP_END_P ;RET @@ -1451,46 +1455,35 @@ WIN_GET_SYM: ; А - номер окна ; HL - символ/атрибут ; B - знакогенератор -WIN_PUT_SYM: - AND A +WIN_PUT_SYM: AND A SCF RET NZ - + ; CALL LP_BEG_P - - CALL LP_AT_D - ;CALL LP_TAB_E - + CALL LP_SET_CUR LD A,#50 OUT (SLOT3),A - + ; EXX - - LD A,D - OUT (PORT_Y),A - + ;CORRECT_SCR_40 + LD A,D + OUT (PORT_Y),A EXX LD A,L EXX - - LD (HL),A - INC L - + LD (HL),A + INC L EXX LD A,H EXX - - LD (HL),A - DEC L - DEC L - + LD (HL),A + DEC L + DEC L EXX LD A,B EXX - - LD (HL),A - INC L - + LD (HL),A + INC L EXX JP LP_END_P @@ -1530,9 +1523,7 @@ WIN_COPY_WIN1: IN A,(SLOT1) PUSH AF - CALL LP_AT_D - ;CALL LP_TAB_E - + CALL LP_SET_CUR LD (SYS_PAGE.SYS_WORK1),SP LD A,B @@ -1601,8 +1592,7 @@ WIN_RESTORE: AND A IN A,(SLOT1) PUSH AF ; - CALL LP_AT_D - ;CALL LP_TAB_E + CALL LP_SET_CUR ; LD (SYS_PAGE.SYS_WORK1),SP LD SP,IX @@ -1722,7 +1712,7 @@ LP_PR_LINE_DIR: LD A,XH LD (HL),A INC D -.next_full: TEST_SCR_40 +.next_full: CORRECT_SCR_40 .next: DJNZ_NEXT_HL_ADDR .loop JR .loop ;-------[TAB] ;!FIXIT заполняет пробелами