diff --git a/Shared_Includes b/Shared_Includes index 9bfe7bd..840faf4 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9bfe7bd76b9648dae6f492dcd730b9b7ed80f48d +Subproject commit 840faf40250ec41742e4da3c1f68077ba78a2dc6 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 770bbb7..47c4f8c 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -141,7 +141,7 @@ TAB_FNS: DB low EMM.MergeMemBlocks ; #9E слияние двух блоков DB low EMM.FullInit ; #9F инициализация всей памяти, системных переменных ; Ax - DB low PIC_FN0 ; #A0 ОТКРЫТИЕ ОКНА - Fn 0A0h + DB low PIC_FN0 ; #A0 ОТКРЫТИЕ ОКНА DB low PIC_FN1 ; #A1 ВЫВЕСТИ ТОЧКУ DB low PIC_FN2 ; #A2 ВЫВОД ЛИНИИ COPY DB low PIC_FN3 ; #A3 ВЫВОД ЛИНИИ FILL diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 1438afc..6a28adb 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -1087,7 +1087,7 @@ PORTS_INIT: ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -DCP_DATA: INCLUDE 'DCP.ASM' +DCP_DATA: INCLUDE 'DCP.ASM' ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; @@ -1098,7 +1098,9 @@ DCP_DATA: INCLUDE 'DCP.ASM' ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -ZG_ADDRESS: INCLUDE 'FONT.ASM' +ZG_ADDRESS: INCLUDE 'FONT.ASM' +ZG_SIZE EQU $-ZG_ADDRESS + ASSERT (ZG_SIZE <= #800), "The font size is too big!" ;-----------------------------------------------------------------------; diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index d4d2d5f..6160403 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -63,43 +63,19 @@ ; H - высота, L - ширина ;============================================================= - MACRO TEST_40 ;[x] включил 31/10/23, чисто на Хэллоууууииин - EX AF,AF' - JR C,.LLL - INC D ; режим 40 -.LLL: EX AF,AF' - ; + MACRO TEST_SCR_40 ;[x] включил 31/10/23, чисто на Хэллоууууииин + EX AF,AF' + JR C,.LLL + INC D ; режим 40 +.LLL: EX AF,AF' + ENDM ; + + MACRO DJNZ_NEXT_HL + DJNZ .LLL + CALL LP_NEXT_HL +.LLL: ; ENDM - MACRO DJ_NEXT_HL - ; DEC B - ; CALL Z,LP_NEXT_HL - DJNZ .LLL - CALL LP_NEXT_HL -.LLL: - ENDM - - - - MACRO LP_OPEN_PG - IN A,(SLOT3) - LD C,A - LD A,SYS_PAGE - OUT (SLOT3),A - - LD A,C - LD (SYS_PAGE.COPY_SLOT3),A - IN A,(PORT_Y) - LD (SYS_PAGE.COPY_RGADR),A - ENDM - -; не должен влиять на флаги и трогать регистры кроме A - MACRO LP_CLOSE_PG - LD A,(SYS_PAGE.COPY_RGADR) - OUT (PORT_Y),A - LD A,(SYS_PAGE.COPY_SLOT3) - OUT (SLOT3),A - ENDM ;********************************* @@ -111,89 +87,82 @@ ;* ZF - inverse * ;* AF' - страница и mode * ;********************************* +; MACRO LP_BEG_PM +; EX AF,AF' +; EXX +; IN A,(SLOT3) +; LD C,A +; IN A,(PORT_Y) +; LD B,A +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD (SYS_SP),SP +; LD SP,SYS_SP +; PUSH BC +; ; +; LD HL,(WIN_ID_0.HL) +; LD DE,(WIN_ID_0.DE) +; LD BC,(WIN_ID_0.BC) +; LD A,E +; AND A +; RRA +; OUT (PORT_Y),A +; EXX +; EX AF,AF' +; ENDM ; - MACRO LP_BEG_PM - EX AF,AF' - EXX - IN A,(SLOT3) - LD C,A - IN A,(PORT_Y) - LD B,A - - LD A,SYS_PAGE - OUT (SLOT3),A - LD (SYS_SP),SP - LD SP,SYS_SP - PUSH BC - - LD HL,(WIN_ID_0.HL) - LD DE,(WIN_ID_0.DE) - LD BC,(WIN_ID_0.BC) - - LD A,E - AND A - RRA - OUT (PORT_Y),A - EXX - EX AF,AF' - ENDM - - MACRO LP_END_PM - EX AF,AF' - EXX - RLA - LD E,A - LD (WIN_ID_0.HL),HL ; место печати - LD (WIN_ID_0.DE),DE - LD (WIN_ID_0.BC),BC - - POP BC - LD A,B - OUT (PORT_Y),A - LD A,C - OUT (SLOT3),A - - LD SP,SYS_SP - EXX - EX AF,AF' - RET - ENDM +; MACRO LP_END_PM +; EX AF,AF' +; EXX +; RLA +; LD E,A +; LD (WIN_ID_0.HL),HL ; место печати +; LD (WIN_ID_0.DE),DE +; LD (WIN_ID_0.BC),BC +; ; +; POP BC +; LD A,B +; OUT (PORT_Y),A +; LD A,C +; OUT (SLOT3),A +; LD SP,SYS_SP +; EXX +; EX AF,AF' +; RET +; ENDM ; ; ;------------------------------------------------------------------[#81] -LP_PRINT_ALL: - CALL LP_BEG_P - EXX - LD C,A - EXX - LD A,#50 - OUT (SLOT3),A - -.loop: EXX - LD A,D - OUT (PORT_Y),A - INC D -.cont: LD (HL),C - EXX - LD A,E - EXX - INC L - LD (HL),A - DEC L - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - - JP LP_END_P +LP_PRINT_ALL: CALL LP_BEG_P + EXX + LD C,A + EXX + LD A,#50 + OUT (SLOT3),A + ; +.loop: EXX + LD A,D + OUT (PORT_Y),A + INC D +.cont: LD (HL),C + EXX + LD A,E + EXX + INC L + LD (HL),A + DEC L + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + JP LP_END_P ;------------------------------------------------------------------[#81] ; ; ;------------------------------------------------------------------[#82] ; -LP_PRINT_SYM: - CALL LP_BEG_P +LP_PRINT_SYM: CALL LP_BEG_P EXX LD C,A EXX @@ -205,8 +174,8 @@ LP_PRINT_SYM: OUT (PORT_Y),A .cont: LD (HL),C INC D - TEST_40 - DJ_NEXT_HL + TEST_SCR_40 + DJNZ_NEXT_HL EXX DJNZ .loop JP LP_END_P @@ -215,436 +184,408 @@ LP_PRINT_SYM: ; ;------------------------------------------------------------------[#83] -LP_PRINT_ATR: - CALL LP_BEG_P - LD A,E - EXX - LD C,A - EXX - LD A,#50 - OUT (SLOT3),A - -.loop: EXX - LD A,D - OUT (PORT_Y),A - INC D - INC L - LD (HL),C - DEC L - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - - ;LD A,SYS_PAGE - ;OUT (SLOT3),A - JP LP_END_P +LP_PRINT_ATR: CALL LP_BEG_P + LD A,E + EXX + LD C,A + EXX + LD A,#50 + OUT (SLOT3),A + ; +.loop: EXX + LD A,D + OUT (PORT_Y),A + INC D + INC L + LD (HL),C + DEC L + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + JP LP_END_P ;------------------------------------------------------------------[#83] ; ; ;------------------------------------------------------------------[#85] -LP_PRINT_LINE: - CALL LP_BEG_P - EXX - LD C,PORT_Y - EXX - LD A,#50 - OUT (SLOT3),A - -.loop: EXX - OUT (C),D - INC D - EXX - LD A,(HL) - INC HL - EXX - LD (HL),A - EXX - LD A,E - EXX - INC L - LD (HL),A - DEC L - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - - ;LD A,SYS_PAGE - ;OUT (SLOT3),A - JP LP_END_P +LP_PRINT_LINE: CALL LP_BEG_P + EXX + LD C,PORT_Y + EXX + LD A,#50 + OUT (SLOT3),A + ; +.loop: EXX + OUT (C),D + INC D + EXX + LD A,(HL) + INC HL + EXX + LD (HL),A + EXX + LD A,E + EXX + INC L + LD (HL),A + DEC L + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + JP LP_END_P ;------------------------------------------------------------------[#85] ; ; ;------------------------------------------------------------------[#86] -LP_PRINT_LINE2: - CALL LP_BEG_P - EXX - LD C,PORT_Y - EXX - LD A,#50 - OUT (SLOT3),A - -.loop: LD A,(HL) - INC HL - EXX - OUT (C),D - INC D - LD (HL),A - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - - ;LD A,SYS_PAGE - ;OUT (SLOT3),A - JP LP_END_P +LP_PRINT_LINE2: CALL LP_BEG_P + EXX + LD C,PORT_Y + EXX + LD A,#50 + OUT (SLOT3),A + ; +.loop: LD A,(HL) + INC HL + EXX + OUT (C),D + INC D + LD (HL),A + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + JP LP_END_P ;------------------------------------------------------------------[#86] ; ; ;------------------------------------------------------------------[#87] LP_PRINT_LINE3: - CALL LP_BEG_P - LD A,#50 - OUT (SLOT3),A - -.loop: EXX - LD A,D - OUT (PORT_Y),A - INC D - EXX - LD A,(HL) - INC HL - CP D - JR NZ,.NoEnd - DEC HL - ;!TEST - ;LD A,' ' - EXX - LD C,' ' - JP LP_PRINT_ALL.cont - ; -.NoEnd: EXX - LD (HL),A - EXX - LD A,E - EXX - INC L - LD (HL),A - DEC L - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - - JP LP_END_P + CALL LP_BEG_P + LD A,#50 + OUT (SLOT3),A + ; +.loop: EXX + LD A,D + OUT (PORT_Y),A + INC D + EXX + LD A,(HL) + INC HL + CP D + JR NZ,.NoEnd + DEC HL + ;LD A,' ' ;!TEST + EXX + LD C,' ' + JP LP_PRINT_ALL.cont + ; +.NoEnd: EXX + LD (HL),A + EXX + LD A,E + EXX + INC L + LD (HL),A + DEC L + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + JP LP_END_P ;------------------------------------------------------------------[#87] ; ; ;------------------------------------------------------------------[#88] LP_PRINT_LINE4: - CALL LP_BEG_P - LD A,#50 - OUT (SLOT3),A - -.loop: EXX - LD A,D - OUT (PORT_Y),A - EXX - LD A,(HL) - INC HL - CP D - JR NZ,.NoEnd - DEC HL - ;!TEST - ;LD A,' ' - EXX - LD C,' ' - JP LP_PRINT_SYM.cont - ; -.NoEnd: EXX - LD (HL),A - INC D - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - - JP LP_END_P + CALL LP_BEG_P + LD A,#50 + OUT (SLOT3),A + ; +.loop: EXX + LD A,D + OUT (PORT_Y),A + EXX + LD A,(HL) + INC HL + CP D + JR NZ,.NoEndSymbol + DEC HL + ;LD A,' ' ;!TEST + EXX + LD C,' ' + JP LP_PRINT_SYM.cont + ; +.NoEndSymbol: EXX + LD (HL),A + INC D + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + JP LP_END_P ;------------------------------------------------------------------[#88] ; ; ;------------------------------------------------------------------[#8B] LP_PRINT_LINE5: - CALL LP_BEG_P - LD A,#50 - OUT (SLOT3),A - -.loop: EXX - LD A,D - OUT (PORT_Y),A - EXX - LD A,(HL) - INC HL - CP D - ;!TEST - ;JR Z,.exit - JR Z,LP_END_P - ; - EXX - LD (HL),A - EXX - LD A,E - EXX - INC L - LD (HL),A - DEC L - INC D - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - -.exit: ;JP LP_END_P -;------------------------------------------------------------------[#8B] -LP_END_P: ; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе - LD A,SYS_PAGE - OUT (SLOT3),A -.SYS_PAGE: - EX AF,AF' - EXX - RLA - LD E,A - LD (WIN_ID_0.reg_HL),HL ; место печати - LD (WIN_ID_0.reg_DE),DE - LD (WIN_ID_0.reg_BC),BC - LP_CLOSE_PG - EXX - EX AF,AF' - AND A - RET -.short: EX AF,AF' - EXX - LP_CLOSE_PG - EXX - EX AF,AF' - AND A - RET -; - -; + CALL LP_BEG_P + LD A,#50 + OUT (SLOT3),A + ; +.loop: EXX + LD A,D + OUT (PORT_Y),A + EXX + LD A,(HL) + INC HL + CP D + JR Z,LP_END_P + ; + EXX + LD (HL),A + EXX + LD A,E + EXX + INC L + LD (HL),A + DEC L + INC D + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + ;JP LP_END_P +;----------------- ------------------------------------[#8B] +; ожидается, что портятся только альтернативные регистры и те, что как параметры на входе +LP_END_P: LD A,SYS_PAGE + OUT (SLOT3),A + ; +.SYS_PAGE: EX AF,AF' + EXX + RLA + LD E,A + LD (WIN_ID_0.reg_HL),HL ; место печати + LD (WIN_ID_0.reg_DE),DE + LD (WIN_ID_0.reg_BC),BC + CALL LP_CLOSE_PG + EXX + EX AF,AF' + AND A + RET + ; +.short: EX AF,AF' + EXX + CALL LP_CLOSE_PG + EXX + EX AF,AF' + AND A + RET ;------------------------------------------------------------------[#8C] -LP_PRINT_LINE6: - CALL LP_BEG_P - LD A,#50 - OUT (SLOT3),A - -.loop: EXX - LD A,D - OUT (PORT_Y),A - EXX - LD A,(HL) - INC HL - CP D - ;!TEST - ;JR Z,.exit - JR Z,LP_END_P - ; - EXX - LD (HL),A - INC D - TEST_40 - DJ_NEXT_HL - EXX - DJNZ .loop - -.exit: JP LP_END_P +LP_PRINT_LINE6: CALL LP_BEG_P + LD A,#50 + OUT (SLOT3),A + ; +.loop: EXX + LD A,D + OUT (PORT_Y),A + EXX + LD A,(HL) + INC HL + CP D + JR Z,LP_END_P + ; + EXX + LD (HL),A + INC D + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + DJNZ .loop + JP LP_END_P ;------------------------------------------------------------------[#8C] ; - - ; ;------------------------------------------------------------------[#84] -LP_SET_PLACE: ; портятся только альтернативные регистры и те, что как параметры на входе - CALL LP_BEG_P - CALL LP_AT_D - CALL LP_TAB_E - JP LP_END_P.SYS_PAGE +; портятся только альтернативные регистры и те, что как параметры на входе +LP_SET_PLACE: CALL LP_BEG_P + CALL LP_AT_D + ;CALL LP_TAB_E + JP LP_END_P.SYS_PAGE ;------------------------------------------------------------------[#84] ; ; ;------------------------------------------------------------------[#8E] -LP_GET_PLACE: - CALL LP_BEG_P - - LD A,(WIN_ID_0.H_BEG) - NEG - EXX - ADD A,D - EXX - LD E,A - - LD A,(WIN_ID_0.V_BEG) - NEG - EXX - ADD A,L - DEC A - EXX - RRCA - RRCA - AND %0011'1111 - LD D,A - - JP LP_END_P.short +LP_GET_PLACE: CALL LP_BEG_P + LD A,(WIN_ID_0.H_BEG) + NEG + EXX + ADD A,D + EXX + LD E,A + LD A,(WIN_ID_0.V_BEG) + NEG + EXX + ADD A,L + DEC A + EXX + RRCA + RRCA + AND %0011'1111 + LD D,A + JP LP_END_P.short ;------------------------------------------------------------------[#8E] ; ; ;-------------------------------------------------------------[#89, #8D] -;--------------------------------------------------------[#89] -LP_CLS_WIN: - LD C,' ' - JR CLS_WIN -;--------------------------------------------------------[#89] ;--------------------------------------------------------[#8D] -LP_CLS_WIN2: - LD C,A - ;JR CLS_WIN +LP_CLS_WIN2: LD C,A + JR CLS_WIN ;--------------------------------------------------------[#8D] -CLS_WIN: CALL LP_BEG_P - LD (SYS_PAGE.SYS_WORK1),BC ; сохранить цвет - PUSH DE - -.loop1: CALL LP_AT_D - CALL LP_TAB_E - PUSH DE - EXX - LD BC,(SYS_PAGE.SYS_WORK1) - EXX - LD B,L - LD A,#50 - OUT (SLOT3),A - -.loop2: EXX - LD A,D - OUT (PORT_Y),A - LD (HL),C - INC L - LD (HL),B - DEC L - INC D - EXX - DJNZ .loop2 - - LD A,SYS_PAGE - OUT (SLOT3),A - POP DE - INC D - DEC H - JR NZ,.loop1 - - POP DE - CALL LP_AT_D - CALL LP_TAB_E - JP LP_END_P.SYS_PAGE +;--------------------------------------------------------[#89] +LP_CLS_WIN: LD C,' ' + ;JR CLS_WIN +;----------------- ---------------------------[#89] +CLS_WIN: CALL LP_BEG_P + LD (SYS_PAGE.SYS_WORK1),BC ; сохранить цвет + PUSH DE + ; +.loop1: CALL LP_AT_D + CALL LP_TAB_E + PUSH DE + EXX + LD BC,(SYS_PAGE.SYS_WORK1) + EXX + LD B,L + LD A,#50 + OUT (SLOT3),A + ; +.loop2: EXX + LD A,D + OUT (PORT_Y),A + LD (HL),C + INC L + LD (HL),B + DEC L + INC D + EXX + DJNZ .loop2 + ; + LD A,SYS_PAGE + OUT (SLOT3),A + POP DE + INC D + DEC H + JR NZ,.loop1 + ; + POP DE + CALL LP_AT_D + ;CALL LP_TAB_E + JP LP_END_P.SYS_PAGE ;-------------------------------------------------------------[#89, #8D] ; ; ;------------------------------------------------------------------[#B8] -WIN_GET_ZG: ; DE - адрес куда переслать фонт - LD HL,ZG_ADDRESS - LD BC,#0800 - LDIR - AND A - RET +; DE - адрес куда переслать фонт +WIN_GET_ZG: LD HL,ZG_ADDRESS + LD BC,ZG_SIZE + LDIR + AND A + RET ;------------------------------------------------------------------[#B8] ; ; ;------------------------------------------------------------------[#B6] -WIN_SET_ZG: ; LP_SET_ZG: - EX AF,AF' - EXX - LP_OPEN_PG - CALL .SET ;LP_SET_ZG1 - LP_CLOSE_PG - EXX - EX AF,AF' - AND A - RET -.SET: IN A,(SLOT1) - LD (SYS_PAGE.COPY_SLOT1),A - LD A,SHARED_PAGE - OUT (SLOT1),A - EXX - LD BC,Port_All_Mode - IN A,(C) - LD (SYS_PAGE.SYS_WORK1),A - AND #FE ; Spectrum Screen on, accelerator and keyboard interrupt off - OUT (C),A - EX AF,AF' - LD B,A - AND #0F - ADD A,A - OUT (PORT_Y),A - 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 - EX DE,HL - ;!TEST 11/02/2024 установка шрифта более гибкая без заплётов - LD A,H - SUB #C0 - JR NC,.change - ; - LDIR -.cont: EX DE,HL - LD A,H - RRCA - RRCA - RRCA - DEC A - AND 3 - ADD A,#58 - LD H,A - -.loop: LD (HL),L - INC L - JR NZ,.loop - - LD A,(SYS_PAGE.SYS_WORK1) - LD BC,Port_All_Mode - OUT (C),A - EXX - - EX AF,AF' - LD A,(SYS_PAGE.COPY_SLOT1) - OUT (SLOT1),A - RET -;!TEST 11/02/2024 установка шрифта более гибкая без заплётов -.change: - LD A,(SYS_PAGE.COPY_SLOT3) - OUT (SLOT3),A - LDIR - LD A,SYS_PAGE - OUT (SLOT3),A - JR .cont +WIN_SET_ZG: EX AF,AF' ; LP_SET_ZG: + EXX + CALL LP_OPEN_PG + CALL .SET + CALL LP_CLOSE_PG + EXX + EX AF,AF' + AND A + RET + ; +.SET: IN A,(SLOT1) ;LP_SET_ZG1 + LD (SYS_PAGE.COPY_SLOT1),A + LD A,SHARED_PAGE + OUT (SLOT1),A + EXX + LD BC,Port_All_Mode + IN A,(C) + LD (SYS_PAGE.SYS_WORK1),A + AND #FE ; Spectrum Screen on, accelerator and keyboard interrupt off + OUT (C),A + EX AF,AF' + LD B,A + AND #0F + ADD A,A + OUT (PORT_Y),A + 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,ZG_SIZE + EX DE,HL + ;[ ] 11/02/2024 установка шрифта более гибкая без заплётов + LD A,H + SUB #C0 + JR NC,.change + ; + LDIR +.cont: EX DE,HL + LD A,H + RRCA + RRCA + RRCA + DEC A + AND 3 + ADD A,#58 + LD H,A + ; +.loop: LD (HL),L + INC L + JR NZ,.loop + ; + LD A,(SYS_PAGE.SYS_WORK1) + LD BC,Port_All_Mode + OUT (C),A + EXX + EX AF,AF' + LD A,(SYS_PAGE.COPY_SLOT1) + OUT (SLOT1),A + RET + ; + ;[ ] 11/02/2024 установка шрифта более гибкая без заплётов +.change: LD A,(SYS_PAGE.COPY_SLOT3) + OUT (SLOT3),A + LDIR + LD A,SYS_PAGE + OUT (SLOT3),A + JR .cont ;------------------------------------------------------------------[#B6] ; @@ -655,168 +596,148 @@ WIN_SET_ZG: ; LP_SET_ZG: ; 1 - ver size ; 2 - hor place ; 3 - ver place -LP_SIZE: ; определение size - LP_OPEN_PG - LD DE,(WIN_ID_0.USER.SIZE_H) - LD A,(WIN_ID_0.USER.MODE) - AND %0010'0000 - LP_CLOSE_PG - RET NZ - LD A,E - ADD A,A - LD E,A - RET +; определение size +LP_SIZE: CALL LP_OPEN_PG + LD DE,(WIN_ID_0.USER.SIZE_H) + LD A,(WIN_ID_0.USER.MODE) + AND %0010'0000 + CALL LP_CLOSE_PG + RET NZ + ; + LD A,E + ADD A,A + LD E,A + RET ; - -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 - - 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 - INC L - LD H,#C3 - EXX - RET -; - - -; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе -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 - - 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 -.skip_Dx2: - LD A,(WIN_ID_0.H_BEG) - ADD A,D - LD D,A - EXX - RET +; ожидается, что портятся только альтернативные регистры и те, что как параметры на входе +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 + ; + 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 + INC L + LD H,#C3 + EXX + ;RET +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 + ; + 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 +.skip_Dx2: LD A,(WIN_ID_0.H_BEG) + ADD A,D + LD D,A + EXX + RET ;************************************************************* ; вычисление нового места -LP_NEXT_HL: - LD A,SYS_PAGE - OUT (SLOT3),A - INC L - INC L - INC L - INC L - LD A,(WIN_ID_0.V_END) - CP L - JR NC,LP_NEXT_HL1 - LD HL,(WIN_ID_0.V_BEG) - ;LD A,(WIN_ID_0.V_BEG) - ;LD L,A - INC L - LD H,#C3 ;!HARDCODE -LP_NEXT_HL1: - LD A,(WIN_ID_0.H_BEG) - LD D,A - LD A,(WIN_ID_0.SIZE_REL) - LD B,A +LP_NEXT_HL: LD A,SYS_PAGE + OUT (SLOT3),A + INC L + INC L + INC L + INC L + LD A,(WIN_ID_0.V_END) + CP L + JR NC,.no_end_line + ; + LD HL,(WIN_ID_0.V_BEG) + INC L + LD H,#C3 ;!HARDCODE +.no_end_line: LD A,(WIN_ID_0.H_BEG) + LD D,A + LD A,(WIN_ID_0.SIZE_REL) + LD B,A + LD A,#50 + OUT (SLOT3),A + RET - LD A,#50 - OUT (SLOT3),A - RET - -; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе -LP_BEG_P: - EX AF,AF' - EXX - LP_OPEN_PG - LD HL,(WIN_ID_0.reg_HL) - LD DE,(WIN_ID_0.reg_DE) - LD BC,(WIN_ID_0.reg_BC) - LD A,E - AND A - RRA - OUT (PORT_Y),A - EXX - EX AF,AF' - RET - -LP_INI_P: - EX AF,AF' - EXX - LP_OPEN_PG - LD A,(WIN_ID_0.USER.MODE) - CP #C0 - JR NC,LP_INI_NO_ZG ; открытие бордера... - LD A,(WIN_ID_0.USER.MODE_S) - AND %0000'0001 - JR NZ,LP_INI_NO_ZG ; открытие Spectrum-Screen - - LD A,(WIN_ID_0.USER.MODE) - BIT 4,A - JR Z,LP_INI_NO_ZG ; открытие графического экрана - LD DE,(SYS_PAGE.WIN_ZG) ; знакогенератор - - EXX - EX AF,AF' - CALL WIN_SET_ZG.SET ;LP_SET_ZG1 - EXX - EX AF,AF' - -LP_INI_NO_ZG: - LD A,(WIN_ID_0.H_BEG) - LD D,A - LD A,(WIN_ID_0.V_BEG) - LD L,A - INC L - LD H,#C3 - - AND A - LD A,(WIN_ID_0.USER.MODE) - BIT 5,A - LD A,(WIN_ID_0.USER.SIZE_H) - JR NZ,LP_INI_40 - ADD A,A - SCF - ;!TODO что-то тут подвыпиленно -LP_INI_40: - LD B,A - LD (WIN_ID_0.SIZE_REL),A - - ; LD DE,(SYS_PAGE.WIN_MODE_SC) ; место по горизонтали и страница моды - ; LD HL,(SYS_PAGE.WIN_MODE_SH) ; место по вертикали с адресом - ; INC HL - ; LD B,0 - ; CALL LP_TAB_H2 - - EX AF,AF' - EXX - JP LP_END_P +; !ожидается, что портятся только альтернативные регистры и те, что как параметры на входе +LP_BEG_P: EX AF,AF' + EXX + CALL LP_OPEN_PG + LD HL,(WIN_ID_0.reg_HL) + LD DE,(WIN_ID_0.reg_DE) + LD BC,(WIN_ID_0.reg_BC) + LD A,E + AND A + RRA + OUT (PORT_Y),A + EXX + EX AF,AF' + RET +; +LP_INI_P: EX AF,AF' + EXX + CALL LP_OPEN_PG + LD A,(WIN_ID_0.USER.MODE) + CP #C0 + JR NC,LP_INI_NO_ZG ; открытие бордера... + LD A,(WIN_ID_0.USER.MODE_S) + AND %0000'0001 + JR NZ,LP_INI_NO_ZG ; открытие Spectrum-Screen + ; + LD A,(WIN_ID_0.USER.MODE) + BIT 4,A + JR Z,LP_INI_NO_ZG ; открытие графического экрана + LD DE,(SYS_PAGE.WIN_ZG) ; знакогенератор + EXX + EX AF,AF' + CALL WIN_SET_ZG.SET ;LP_SET_ZG1 + EXX + EX AF,AF' +LP_INI_NO_ZG: LD A,(WIN_ID_0.H_BEG) + LD D,A + LD A,(WIN_ID_0.V_BEG) + LD L,A + INC L + LD H,#C3 + AND A + LD A,(WIN_ID_0.USER.MODE) + BIT 5,A + LD A,(WIN_ID_0.USER.SIZE_H) + JR NZ,LP_INI_40 + ADD A,A + SCF +LP_INI_40: LD B,A + LD (WIN_ID_0.SIZE_REL),A + ;LD DE,(SYS_PAGE.WIN_MODE_SC) ; место по горизонтали и страница моды + ;LD HL,(SYS_PAGE.WIN_MODE_SH) ; место по вертикали с адресом + ;INC HL + ;LD B,0 + ;CALL LP_TAB_H2 + EX AF,AF' + EXX + JP LP_END_P ;******************************************************** @@ -829,7 +750,6 @@ LP_OPEN_S: LD A,B RET C PUSH HL LD HL,LP_SC_TAB - ; ADD A,L LD L,A JR NC,.no_inc @@ -841,596 +761,499 @@ LP_OPEN_S: LD A,B EX (SP),HL RET ; -LP_SC_TAB: DW LP_SET_32 ; 0 - спектрумовское окно 32x24 - DW LP_SET_64 ; 1 - текстовое окно 64x24 - DW LP_SET_40 ; 2 - текстовое окно 40x32 - DW LP_SET_80 ; 3 - текстовое окно 80x32 - DW LP_SET_32.X ; 4 - спектрумовское окно, HL - положение окна - DW LP_SET_64.X ; 5 - текстовое окно 64x24, HL - положение окна - DW LP_SET_40.X ; 6 - текстовое окно 40x32, HL - положение окна - DW LP_SET_80.X ; 7 - текстовое окно 80x32, HL - положение окна - DW PIC_SET_S1 ; 8 - графическое окно 0, HL - положение окна - DW PIC_SET_S2 ; 9 - графическое окно 1, HL - положение окна - ;DW LP_SET_MNU ; !TODO -.SIZE EQU $-LP_SC_TAB +LP_SC_TAB: DW LP_SET_32 ; 0 - спектрумовское окно 32x24 + DW LP_SET_64 ; 1 - текстовое окно 64x24 + DW LP_SET_40 ; 2 - текстовое окно 40x32 + DW LP_SET_80 ; 3 - текстовое окно 80x32 + DW LP_SET_32.X ; 4 - спектрумовское окно, HL - положение окна + DW LP_SET_64.X ; 5 - текстовое окно 64x24, HL - положение окна + DW LP_SET_40.X ; 6 - текстовое окно 40x32, HL - положение окна + DW LP_SET_80.X ; 7 - текстовое окно 80x32, HL - положение окна + DW PIC_SET_S1 ; 8 - графическое окно 0, HL - положение окна + DW PIC_SET_S2 ; 9 - графическое окно 1, HL - положение окна + ;DW LP_SET_MNU ; 10 - ;!TODO +.SIZE: EQU $-LP_SC_TAB ; !TODO ; LP_SET_MNU: ; LD IX,LP_SCR_MNU ; JP LP_SET_MODE -LP_SET_32: - LD HL,#4104 +LP_SET_32: LD HL,#4104 .X: LD IX,LP_SCR_32 JP LP_SET_MODE -LP_SET_64: - LD HL,#4104 +LP_SET_64: LD HL,#4104 .X: LD IX,LP_SCR_64 JP LP_SET_MODE -LP_SET_40: - LD HL,#4000 +LP_SET_40: LD HL,#4000 .X: LD IX,LP_SCR_40 JP LP_SET_MODE -LP_SET_80: - LD HL,#4000 +LP_SET_80: LD HL,#4000 .X: LD IX,LP_SCR_80 JP LP_SET_MODE -PIC_SET_S1: - LD IX,PIC_320X256_1 +PIC_SET_S1: LD IX,PIC_320X256_1 JP LP_SET_MODE -PIC_SET_S2: - LD IX,PIC_320X256_2 +PIC_SET_S2: LD IX,PIC_320X256_2 JP LP_SET_MODE ;------------------------------------------------------------------[#80] ; +;------------------------------------------------------------------[#B1] +; !TODO +WIN_CLOSE: SCF + RET +;------------------------------------------------------------------[#B1] +; + ; ;------------------------------------------------------------------[#B0] -; HL - место на экране по знакоместам (НЕ ИСПОЛЬЗУЕТСЯ) ; IX - описатель окна -WIN_OPEN.SCR1: - LD E,1 +WIN_OPEN.SCR1: LD E,1 ; E - bit0 - номер экрана -WIN_OPEN: - LP_OPEN_PG - LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна - PUSH DE - LD HL,(SYS_PAGE.WIN_MAP_SC) - LD DE,WIN_ID_0 - LD BC,Window_UserVars - LDIR - LD IX,WIN_ID_0 - POP DE - LD L,(IX+Window_Variables.USER.PLACE_H) - LD H,(IX+Window_Variables.USER.PLACE_V) - LD (IX+Window_Variables.MODE_E),E - JP WIN_OPEN_W1 +WIN_OPEN: CALL .Prepare + LD L,(IX + Window_Variables.USER.PLACE_H) + LD H,(IX + Window_Variables.USER.PLACE_V) + JP WIN_OPEN_W1 + ; +.Prepare: CALL LP_OPEN_PG + LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна + PUSH HL + PUSH DE + LD HL,(SYS_PAGE.WIN_MAP_SC) + LD DE,WIN_ID_0 + LD BC,Window_UserVars + LDIR + LD IX,WIN_ID_0 + POP DE + POP HL + LD (IX + Window_Variables.MODE_E),E + RET +;------------------------------------------------------------------[#B0] +; - -; HL - PLACE -; IX - SIZE_HOR; IX+1 - SIZE_VER; IX+2,3; IX+4 - MODE; -; E - страница моды. +; +;------------------------------------------------------------------[#A0] +; HL = X + Y*64 + #4000 + #1000*RGMOD. место на экране по знакоместам +; IX - описатель окна +; E - bit0: номер экрана PIC_FN0: -LP_SET_MODE: - LD A,H - AND #10 ; переместить бит 4 в регистр E - XOR E - LD E,A - LD A,L - AND #3F - ADD HL,HL - ADD HL,HL - LD L,A - LD A,H - AND #3F - LD H,A - LP_OPEN_PG - LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна - PUSH HL - PUSH DE - LD HL,(SYS_PAGE.WIN_MAP_SC) - LD DE,SYS_PAGE.WIN_MAP_IX - LD BC,Window_UserVars - LDIR - LD IX,SYS_PAGE.WIN_MAP_IX - POP DE - POP HL - LD (IX+Window_Variables.USER.PLACE_H),L - LD (IX+Window_Variables.USER.PLACE_V),H - LD (IX+Window_Variables.MODE_E),E -WIN_OPEN_W1: - LD A,L - ADD A,A - INC A ; вычисление PORT_Y - BIT 4,E - JR NZ,LP_SET_NO_OR - OR #80 ; если вывод на второй экран -LP_SET_NO_OR: - LD (IX+Window_Variables.H_BEG),A - LD D,A - LD A,(IX+Window_Variables.USER.SIZE_H) - ADD A,A - ADD A,D - LD (IX+Window_Variables.H_END),A - LD (SYS_PAGE.WIN_MODE_SC),DE ; место по горизонтали и страница моды - LD A,H - AND #3F - ADD A,A - ADD A,A - LD L,A - LD H,#C3 - LD (SYS_PAGE.WIN_MODE_SH),HL ; место по вертикали с адресом - LD (IX+Window_Variables.V_BEG),A - LD A,(IX+Window_Variables.USER.SIZE_V) - ADD A,A - ADD A,A - ADD A,L - LD (IX+Window_Variables.V_END),A - - LD L,(IX+Window_Variables.V_BEG) - LD H,#C3 - LD B,(IX+Window_Variables.USER.SIZE_V) ; размер по вертикали - - - LD (IX+Window_Variables.WORK_1),0 - LD A,(IX+Window_Variables.USER.MODE) ; знакогенератор плюс режим - LD (IX+Window_Variables.WORK_2),A - BIT 4,A - JR NZ,LP_SET_LOOP ; переход, если текстовый режим - - AND #F0 - LD C,A - LD A,(IX+Window_Variables.USER.GR_X) - RRCA - RRCA - RRCA - LD D,A - AND #0F - OR C - LD (IX+Window_Variables.WORK_2),A - - LD A,D - AND #E0 - LD C,A - LD A,(IX+Window_Variables.USER.GR_Y) - AND #1F - OR C - RLCA - RLCA - RLCA - LD (IX+Window_Variables.WORK_1),A - -LP_SET_LOOP: - LD D,(IX+Window_Variables.H_BEG) ; D - начало строки (PORT_Y) - LD C,(IX+Window_Variables.USER.SIZE_H) ; размер по горизонтали - LD A,(IX+Window_Variables.USER.MODE) ; знакогенератор плюс режим - - PUSH BC - CALL LP_MODE_LINE - POP BC - INC L - INC L - INC L - INC L - DJNZ LP_SET_LOOP - - LD A,(IX+Window_Variables.MODE_E) - AND 1 - OUT (RGMOD),A - ; LD A,(IX+Window_Variables.MODE) - ; BIT 4,A - LP_CLOSE_PG - ; RET Z - CALL LP_INI_P - ; LD A,(SYS_PAGE.WIN_MODE_SC) - ; OUT (RGMOD),A - CALL LP_SIZE - XOR A - RET -WIN_CLOSE: - SCF - RET - +LP_SET_MODE: ; финт для совместимости со старыми прогами, где передавались другие параметры + LD A,H + AND %00001'0000 ; переместить бит 4 в регистр E + XOR E + LD E,A + ; + LD A,L + AND #3F + ADD HL,HL + ADD HL,HL + LD L,A + ; + LD A,H + AND #3F + LD H,A + ; + CALL WIN_OPEN.Prepare + LD (IX + Window_Variables.USER.PLACE_H),L + LD (IX + Window_Variables.USER.PLACE_V),H +WIN_OPEN_W1: LD A,L + ADD A,A + INC A ; вычисление PORT_Y + BIT 4,E + JR NZ,.NO_OR + OR #80 ; если вывод на второй экран +.NO_OR: LD (IX+Window_Variables.H_BEG),A + LD D,A + LD A,(IX+Window_Variables.USER.SIZE_H) + ADD A,A + ADD A,D + LD (IX+Window_Variables.H_END),A + LD (SYS_PAGE.WIN_MODE_SC),DE ; место по горизонтали и страница моды + LD A,H + AND #3F + ADD A,A + ADD A,A + LD L,A + LD H,#C3 + LD (SYS_PAGE.WIN_MODE_SH),HL ; место по вертикали с адресом + LD (IX+Window_Variables.V_BEG),A + LD A,(IX+Window_Variables.USER.SIZE_V) + ADD A,A + ADD A,A + ADD A,L + LD (IX+Window_Variables.V_END),A + ; + LD L,(IX+Window_Variables.V_BEG) + LD H,#C3 + LD B,(IX+Window_Variables.USER.SIZE_V) ; размер по вертикали + LD (IX+Window_Variables.WORK_1),0 + LD A,(IX+Window_Variables.USER.MODE) ; знакогенератор плюс режим + LD (IX+Window_Variables.WORK_2),A + BIT 4,A + JR NZ,.LOOP ; переход, если текстовый режим + ; + AND #F0 + LD C,A + LD A,(IX+Window_Variables.USER.GR_X) + RRCA + RRCA + RRCA + LD D,A + AND #0F + OR C + LD (IX+Window_Variables.WORK_2),A + ; + LD A,D + AND #E0 + LD C,A + LD A,(IX+Window_Variables.USER.GR_Y) + AND #1F + OR C + RLCA + RLCA + RLCA + LD (IX+Window_Variables.WORK_1),A +.LOOP: LD D,(IX+Window_Variables.H_BEG) ; D - начало строки (PORT_Y) + LD C,(IX+Window_Variables.USER.SIZE_H) ; размер по горизонтали + LD A,(IX+Window_Variables.USER.MODE) ; знакогенератор плюс режим + PUSH BC + CALL LP_MODE_LINE + POP BC + INC L + INC L + INC L + INC L + DJNZ .LOOP + ; + LD A,(IX+Window_Variables.MODE_E) + AND 1 + OUT (RGMOD),A + ;LD A,(IX+Window_Variables.MODE) + ;BIT 4,A + CALL LP_CLOSE_PG + ;RET Z + CALL LP_INI_P + ;LD A,(SYS_PAGE.WIN_MODE_SC) + ;OUT (RGMOD),A + CALL LP_SIZE + XOR A + RET +; ; Установка режима на линии -LP_MODE_LINE: - BIT 0,(IX+Window_Variables.USER.MODE_S) - JP NZ,LP_MODE_LINE2 ; идти на спектрум - BIT 4,A - JP Z,LP_MODE_LINE3 ; идти на графику! - DEC D - -; текстовый режим. - - EX AF,AF' - LD A,#50 - OUT (SLOT3),A - LD A,L ; вертикальное положение - CP #80 - JR NC,LP_EXIT_MODE - -LP_MODE_RECURSE: - LD A,D ; горизонтальное положение - AND #7F - SUB 80 - JR C,LP_MODE_LL - SUB 48 - NEG - - LD E,A ; запомнить - ADD A,D - LD D,A ; новое положение - - LD A,E ; восстановить - RRA - AND #3F - SUB C - JR NC,LP_EXIT_MODE - NEG - LD C,A ; новое значение C - JR LP_MODE_RECURSE - -LP_MODE_LL: - NEG - RRA - AND #3F - CP C - JR NC,LP_MODE_LR - LD C,A -LP_MODE_LR: - EX AF,AF' - - INC D -LP_MD_LL1: - EX AF,AF' - LD A,D - OUT (PORT_Y),A - EX AF,AF' - LD (HL),A ; режим - INC D - EX AF,AF' - LD A,D - OUT (PORT_Y),A - EX AF,AF' - LD (HL),A ; режим - INC D - DEC C - JR NZ,LP_MD_LL1 - - EX AF,AF' -LP_EXIT_MODE: - LD A,SYS_PAGE - OUT (SLOT3),A - EX AF,AF' - RET - -; Установка режима на линии -; Spectrum mode -LP_MODE_LINE2: - LD A,(IX+Window_Variables.WORK_2) - LD B,(IX+Window_Variables.WORK_1) - - DEC D - - EX AF,AF' - LD A,#50 - OUT (SLOT3),A - LD A,L ; вертикальное положение - CP #80 - JR NC,LP_EXIT_MODE2 - -LP_MODE_RECURSE2: - LD A,D ; горизонтальное положение - AND #7F - SUB 80 - JR C,LP_MODE_LL2 - SUB 48 - NEG - - LD E,A ; запомнить - ADD A,D - LD D,A ; новое положение - - LD A,E ; восстановить - RRA - AND #3F - SUB C - JR NC,LP_EXIT_MODE2 - NEG - LD C,A ; новое значение C - JR LP_MODE_RECURSE2 - -LP_MODE_LL2: - NEG - RRA - AND #3F - CP C - JR NC,LP_MODE_LR2 - LD C,A -LP_MODE_LR2: - EX AF,AF' - - INC D -LP_MD_LL2: - EX AF,AF' - LD A,D - OUT (PORT_Y),A - EX AF,AF' - LD (HL),A ; режим - INC L - LD (HL),B - INC L - LD (HL),B - DEC L - DEC L - - INC D - BIT 4,A - JR NZ,lp_md_ll3x - INC B -lp_md_ll3x: - EX AF,AF' - LD A,D - OUT (PORT_Y),A - EX AF,AF' - LD (HL),A ; режим - INC L - LD (HL),B - INC L - LD (HL),B - DEC L - DEC L - - INC D - - INC B - JR NZ,LP_NO_ADD_40 - ADD A,40H -LP_NO_ADD_40: - - DEC C - JR NZ,LP_MD_LL2 - - EX AF,AF' -LP_EXIT_MODE2: - LD A,SYS_PAGE - OUT (SLOT3),A - EX AF,AF' - - LD (IX+Window_Variables.WORK_1),B - LD (IX+Window_Variables.WORK_2),A - RET - - -LP_MODE_LINE3: ; Установка режима на линии - -; Grafic Mode - - LD A,(IX+Window_Variables.WORK_1) - LD B,(IX+Window_Variables.WORK_2) - - DEC D - - EX AF,AF' - LD A,#50 - OUT (SLOT3),A - LD A,L ; вертикальное положение - CP #80 - JR NC,LP_EXIT_MODE3 - -LP_MODE_RECURSE3: - LD A,D ; горизонтальное положение - AND #7F - SUB 80 - JR C,LP_MODE_LL3 - SUB 48 - NEG - - LD E,A ; запомнить - ADD A,D - LD D,A ; новое положение - - LD A,E ; восстановить - RRA - AND #3F - SUB C - JR NC,LP_EXIT_MODE3 - NEG - LD C,A ; новое значение C - JR LP_MODE_RECURSE3 - -LP_MODE_LL3: - NEG - RRA - AND #3F - CP C - JR NC,LP_MODE_LR3 - LD C,A -LP_MODE_LR3: - EX AF,AF' - - INC D - - BIT 5,B - JR Z,LP_GR_640 - -LP_MD_LL3: - - EX AF,AF' - LD A,D - OUT (PORT_Y),A - EX AF,AF' - LD (HL),B ; режим - INC L - LD (HL),A ; режим 2 - INC L - LD (HL),0 ; режим 2 - DEC L - DEC L - - INC D - -; EX AF,AF' -; LD A,D -; OUT (PORT_Y),A -; EX AF,AF' -; LD (HL),B ; режим -; INC L -; LD (HL),A ; режим 2 -; DEC L - - INC D - - INC A - LD E,A - AND 7 - JR NZ,LP_NO_INC_B - LD A,E - SUB 8 - LD E,A - INC B -LP_NO_INC_B: - LD A,E - - DEC C - JR NZ,LP_MD_LL3 - -LP_640_RET: - EX AF,AF' -LP_EXIT_MODE3: - LD A,SYS_PAGE - OUT (SLOT3),A - EX AF,AF' - - LD A,(IX+Window_Variables.WORK_1) - ADD A,8 - LD (IX+Window_Variables.WORK_1),A - RET - -LP_GR_640: - EX AF,AF' - LD A,D - OUT (PORT_Y),A - EX AF,AF' - LD (HL),B ; режим 1 - INC L - LD (HL),A ; режим 2 - INC L - LD (HL),0 ; режим 3 - - INC D - - EX AF,AF' - LD A,D - OUT (PORT_Y),A - EX AF,AF' - LD (HL),0 ; режим 3 - DEC L - LD (HL),A ; режим 2 - DEC L - LD (HL),B ; режим 1 - - INC D - - INC A - LD E,A - AND 7 - JR NZ,LP_NO_INC_B6 - LD A,E - SUB 8 - LD E,A - INC B -LP_NO_INC_B6: - LD A,E - - DEC C - JR NZ,LP_GR_640 - JP LP_640_RET - - +LP_MODE_LINE: BIT 0,(IX+Window_Variables.USER.MODE_S) + JP NZ,.Spectrum ; идти на спектрум + BIT 4,A + JP Z,.Graphic ; идти на графику! + DEC D + ; текстовый режим. + EX AF,AF' + LD A,#50 + OUT (SLOT3),A + LD A,L ; вертикальное положение + CP #80 + JR NC,.Exit_txt + ; + CALL .RECURSE + JR NC,.Exit_txt + ; + CALL .CALC_C + ; +.loop_txt_scr: EX AF,AF' + LD A,D + OUT (PORT_Y),A + EX AF,AF' + LD (HL),A ; режим + INC D + EX AF,AF' + LD A,D + OUT (PORT_Y),A + EX AF,AF' + LD (HL),A ; режим + INC D + DEC C + JR NZ,.loop_txt_scr + ; + EX AF,AF' +.Exit_txt: LD A,SYS_PAGE + OUT (SLOT3),A + EX AF,AF' + RET + ; + ; Spectrum mode +.Spectrum: LD A,(IX+Window_Variables.WORK_2) + LD B,(IX+Window_Variables.WORK_1) + DEC D + EX AF,AF' + LD A,#50 + OUT (SLOT3),A + LD A,L ; вертикальное положение + CP #80 + JR NC,.Exit_zx_scr + ; + CALL .RECURSE + JR NC,.Exit_zx_scr + ; + CALL .CALC_C + ; +.loop_zx_scr: EX AF,AF' + LD A,D + OUT (PORT_Y),A + EX AF,AF' + LD (HL),A ; режим + ; + INC L + LD (HL),B + INC L + LD (HL),B + DEC L + DEC L + ; + INC D + BIT 4,A + JR NZ,.no_inc_B_zx + ; + INC B +.no_inc_B_zx: EX AF,AF' + LD A,D + OUT (PORT_Y),A + EX AF,AF' + ; + LD (HL),A ; режим + INC L + LD (HL),B + INC L + LD (HL),B + DEC L + DEC L + ; + INC D + INC B + JR NZ,.NO_ADD_40 + ; + ADD A,#40 +.NO_ADD_40: DEC C + JR NZ,.loop_zx_scr + EX AF,AF' + ; +.Exit_zx_scr: LD A,SYS_PAGE + OUT (SLOT3),A + EX AF,AF' + LD (IX+Window_Variables.WORK_1),B + LD (IX+Window_Variables.WORK_2),A + RET + ; + ; Graphic Mode +.Graphic: LD A,(IX+Window_Variables.WORK_1) + LD B,(IX+Window_Variables.WORK_2) + DEC D + EX AF,AF' + LD A,#50 + OUT (SLOT3),A + LD A,L ; вертикальное положение + CP #80 + JR NC,.Exit2_GFX_scr + ; + CALL .RECURSE + JR NC,.Exit2_GFX_scr + ; + CALL .CALC_C + ; + BIT 5,B + JR Z,.GFX_640_Loop + ; + ; GFX 320 +.loop_GFX_scr: EX AF,AF' + LD A,D + OUT (PORT_Y),A + EX AF,AF' + LD (HL),B ; mode 0 + INC L + LD (HL),A ; mode 1 + INC L + LD (HL),0 ; mode 2 + DEC L + DEC L + INC D + ; + ;EX AF,AF' + ;LD A,D + ;OUT (PORT_Y),A + ;EX AF,AF' + ;LD (HL),B ; режим + ;INC L + ;LD (HL),A ; режим 2 + ;DEC L + ; + INC D + INC A + LD E,A + AND 7 + JR NZ,.NO_INC_B_320 + ; + LD A,E + SUB 8 + LD E,A + INC B +.NO_INC_B_320: LD A,E + DEC C + JR NZ,.loop_GFX_scr + ; +.Exit_GFX_scr: EX AF,AF' +.Exit2_GFX_scr: LD A,SYS_PAGE + OUT (SLOT3),A + EX AF,AF' + LD A,(IX+Window_Variables.WORK_1) + ADD A,8 + LD (IX+Window_Variables.WORK_1),A + RET + ; + ; GFX 640 +.GFX_640_Loop: EX AF,AF' + LD A,D + OUT (PORT_Y),A + EX AF,AF' + LD (HL),B ; mode 0 + INC L + LD (HL),A ; mode 1 + INC L + LD (HL),0 ; mode 2 + ; + INC D + EX AF,AF' + LD A,D + OUT (PORT_Y),A + EX AF,AF' + LD (HL),0 ; mode 2 + DEC L + LD (HL),A ; mode 1 + DEC L + LD (HL),B ; mode 0 + ; + INC D + INC A + LD E,A + AND 7 + JR NZ,.NO_INC_B_640 + ; + LD A,E + SUB 8 + LD E,A + INC B +.NO_INC_B_640: LD A,E + DEC C + JR NZ,.GFX_640_Loop + JP .Exit_GFX_scr +; +.RECURSE: LD A,D ; горизонтальное положение + AND #7F + SUB 80 + RET C + SUB 48 + NEG + LD E,A ; запомнить + ADD A,D + LD D,A ; новое положение + LD A,E ; восстановить + RRA + AND #3F + SUB C + RET NC + NEG + LD C,A ; новое значение C + JR .RECURSE +; +.CALC_C: NEG + RRA + AND #3F + CP C + JR NC,.NoChangeC + LD C,A +.NoChangeC: EX AF,AF' + INC D + RET ;***************************************************************** LP_SCROLL_UD: - DEC B - JR Z,LP_SCROLL_UP - DEC B - JR Z,LP_SCROLL_DN - SCF - RET + DEC B + JR Z,LP_SCROLL_UP + DEC B + JR Z,LP_SCROLL_DN + SCF + RET ; Вход: ; D - верхняя строка ( от 0 ) ; E - число скроллируемых строк -LP_SCROLL_UP: - DEC E - RET Z - LP_OPEN_PG - LD B,E - LD E,0 ;!FIXIT чёт тут нечисто, подгонка под один вариант окна глобального? - CALL .RUN -.EXIT: LP_CLOSE_PG - RET +LP_SCROLL_UP: DEC E + RET Z + CALL LP_OPEN_PG + LD B,E + LD E,0 ;!FIXIT чёт тут нечисто, подгонка под один вариант окна глобального? + CALL .RUN +.EXIT: CALL LP_CLOSE_PG + RET ; -.RUN: PUSH BC - CALL LP_AT_D - CALL LP_TAB_E ; вычислить переменные для строки - POP BC -.loop2: EXX - PUSH HL - EXX - POP HL +.RUN: PUSH BC + CALL LP_AT_D + ;CALL LP_TAB_E ; вычислить переменные для строки + POP BC +.loop2: EXX + PUSH HL + EXX + POP HL - LD E,L - LD D,H - INC L - INC L - INC L - INC L + LD E,L + LD D,H + INC L + INC L + INC L + INC L - LD A,(WIN_ID_0.V_END) - CP L - ;JR C,.EXIT ; если конец, то выход - RET C - PUSH BC + LD A,(WIN_ID_0.V_END) + CP L + ;JR C,.EXIT ; если конец, то выход + RET C + PUSH BC - LD A,L - EXX - LD L,A - EXX + LD A,L + EXX + LD L,A + EXX - LD A,(WIN_ID_0.USER.SIZE_H) - ADD A,A ; число байт в строке для переноса - ADD A,A + LD A,(WIN_ID_0.USER.SIZE_H) + ADD A,A ; число байт в строке для переноса + ADD A,A - LD C,A - LD B,0 + LD C,A + LD B,0 - LD A,#50 - OUT (SLOT3),A ; открыть страницу для переноса - EXX - LD A,D ; получить порт начала строки - EXX -.loop1: OUT (PORT_Y),A - INC A ; следующее значение порта - LDI - LDD - OUT (PORT_Y),A - INC A ; следующее значение порта - LDI - LDD - JP PE,.loop1 + LD A,#50 + OUT (SLOT3),A ; открыть страницу для переноса + EXX + LD A,D ; получить порт начала строки + EXX +.loop1: OUT (PORT_Y),A + INC A ; следующее значение порта + LDI + LDD + OUT (PORT_Y),A + INC A ; следующее значение порта + LDI + LDD + JP PE,.loop1 - LD A,SYS_PAGE - OUT (SLOT3),A - POP BC - DJNZ .loop2 - RET + LD A,SYS_PAGE + OUT (SLOT3),A + POP BC + DJNZ .loop2 + RET @@ -1438,114 +1261,114 @@ LP_SCROLL_UP: ; D - верхняя строка ( от 0 ) ; E - число скроллируемых строк LP_SCROLL_DN: - DEC E ;!FIXIT правильно? - RET Z + DEC E ;!FIXIT правильно? + RET Z - LP_OPEN_PG - LD B,E - LD E,0 - LD A,D - ADD A,B + 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 - POP BC + LD D,A + PUSH BC + CALL LP_AT_D + ;CALL LP_TAB_E + POP BC -.loop2: EXX - PUSH HL - EXX - POP HL +.loop2: EXX + PUSH HL + EXX + POP HL - LD E,L - LD D,H - DEC L - DEC L - DEC L - DEC L + LD E,L + LD D,H + DEC L + DEC L + DEC L + DEC L - LD A,(WIN_ID_0.V_BEG) - CP L ; .CONT: L >= A - JR Z,.CONT - JR NC,.EXIT ; если конец, то выход -.CONT: PUSH BC + LD A,(WIN_ID_0.V_BEG) + CP L ; .CONT: L >= A + JR Z,.CONT + JR NC,.EXIT ; если конец, то выход +.CONT: PUSH BC - LD A,L - EXX - LD L,A - EXX + 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,(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 - EXX -.loop1: OUT (PORT_Y),A - INC A - LDI - LDD - OUT (PORT_Y),A - INC A - LDI - LDD - JP PE,.loop1 + LD A,#50 + OUT (SLOT3),A + EXX + LD A,D + EXX +.loop1: OUT (PORT_Y),A + INC A + LDI + LDD + OUT (PORT_Y),A + INC A + LDI + LDD + JP PE,.loop1 - LD A,SYS_PAGE - OUT (SLOT3),A + LD A,SYS_PAGE + OUT (SLOT3),A - POP BC - DJNZ .loop2 -.EXIT: LP_CLOSE_PG - RET + POP BC + DJNZ .loop2 +.EXIT: CALL LP_CLOSE_PG + RET ; DE - место символа в окне ; А - номер окна ; выход: HL - символ/атрибут B - знакогенератор WIN_GET_SYM: - AND A - SCF - RET NZ + AND A + SCF + RET NZ - CALL LP_BEG_P + CALL LP_BEG_P - CALL LP_AT_D - CALL LP_TAB_E + CALL LP_AT_D + ;CALL LP_TAB_E - LD A,#50 - OUT (SLOT3),A + LD A,#50 + OUT (SLOT3),A - EXX + EXX - LD A,D - OUT (PORT_Y),A + LD A,D + OUT (PORT_Y),A - LD A,(HL) - EXX - LD L,A - EXX - INC L - LD A,(HL) - EXX - LD H,A - EXX - DEC L - DEC L - LD A,(HL) - EXX - LD B,A - EXX - INC L + LD A,(HL) + EXX + LD L,A + EXX + INC L + LD A,(HL) + EXX + LD H,A + EXX + DEC L + DEC L + LD A,(HL) + EXX + LD B,A + EXX + INC L - EXX - JP LP_END_P + EXX + JP LP_END_P ;RET ; DE - место символа в окне @@ -1553,69 +1376,68 @@ WIN_GET_SYM: ; HL - символ/атрибут ; B - знакогенератор WIN_PUT_SYM: - AND A - SCF - RET NZ + AND A + SCF + RET NZ - CALL LP_BEG_P + CALL LP_BEG_P - CALL LP_AT_D - CALL LP_TAB_E + CALL LP_AT_D + ;CALL LP_TAB_E - LD A,#50 - OUT (SLOT3),A + LD A,#50 + OUT (SLOT3),A - EXX + EXX - LD A,D - OUT (PORT_Y),A + LD A,D + OUT (PORT_Y),A - EXX - LD A,L - EXX + EXX + LD A,L + EXX - LD (HL),A - INC L + LD (HL),A + INC L - EXX - LD A,H - EXX + EXX + LD A,H + EXX - LD (HL),A - DEC L - DEC L + LD (HL),A + DEC L + DEC L - EXX - LD A,B - EXX + EXX + LD A,B + EXX - LD (HL),A - INC L + LD (HL),A + INC L - EXX - JP LP_END_P + EXX + JP LP_END_P ; HL - размер окна ; DE - положение окна ; A - номер окна ; IX - новое положение окна -WIN_MOVE: - AND A - SCF - RET NZ - PUSH IX - PUSH HL - LD B,SHARED_PAGE - LD IX,SLOT3.MEM_ADDR - CALL WIN_COPY_WIN1 - POP HL - POP DE - LD B,SHARED_PAGE - LD IX,SLOT3.MEM_ADDR - CALL WIN_RESTORE.Start - AND A - RET +WIN_MOVE: AND A + SCF + RET NZ + PUSH IX + PUSH HL + LD B,SHARED_PAGE + LD IX,SLOT3.MEM_ADDR + CALL WIN_COPY_WIN1 + POP HL + POP DE + LD B,SHARED_PAGE + LD IX,SLOT3.MEM_ADDR + CALL WIN_RESTORE.Start + AND A + RET ; HL - размер сохраняемого окна @@ -1623,70 +1445,70 @@ WIN_MOVE: ; IX - адрес сохраняемого окна, в странице 4000h ; А - номер окна, B - страница WIN_COPY: - AND A - SCF - RET NZ + AND A + SCF + RET NZ WIN_COPY_WIN1: - CALL LP_BEG_P + CALL LP_BEG_P - IN A,(SLOT1) - PUSH AF + IN A,(SLOT1) + PUSH AF - CALL LP_AT_D - CALL LP_TAB_E + CALL LP_AT_D + ;CALL LP_TAB_E - LD (SYS_PAGE.SYS_WORK1),SP + LD (SYS_PAGE.SYS_WORK1),SP - LD A,B - OUT (SLOT3),A - LD A,#50 - OUT (SLOT1),A + LD A,B + OUT (SLOT3),A + LD A,#50 + OUT (SLOT1),A - EXX - RES 7,H - LD C,D - EXX + EXX + RES 7,H + LD C,D + EXX .COPY_loop2: - LD A,L - EXX - LD B,A + LD A,L + EXX + LD B,A ; - ADD A,A - ADD A,XL - LD XL,A - JR NC,.NO_INC_XH - INC XH + ADD A,A + ADD A,XL + LD XL,A + JR NC,.NO_INC_XH + INC XH .NO_INC_XH: - LD SP,IX + LD SP,IX ; - LD A,C - ADD A,B + LD A,C + ADD A,B .COPY_loop: - DEC A - OUT (PORT_Y),A - LD E,(HL) - INC L - LD D,(HL) - DEC L - PUSH DE - DJNZ .COPY_loop + DEC A + OUT (PORT_Y),A + LD E,(HL) + INC L + LD D,(HL) + DEC L + PUSH DE + DJNZ .COPY_loop ; - INC HL - INC HL - INC HL - INC HL - EXX - DEC H - JR NZ,.COPY_loop2 + INC HL + INC HL + INC HL + INC HL + EXX + DEC H + JR NZ,.COPY_loop2 ; - LD A,SYS_PAGE - OUT (SLOT3),A - LD SP,(SYS_PAGE.SYS_WORK1) + LD A,SYS_PAGE + OUT (SLOT3),A + LD SP,(SYS_PAGE.SYS_WORK1) ; - POP AF - OUT (SLOT1),A - JP LP_END_P.short + POP AF + OUT (SLOT1),A + JP LP_END_P.short ;AND A ;RET @@ -1694,60 +1516,59 @@ WIN_COPY_WIN1: ; HL - размер сохраняемого окна ; DE - место сохраняемого окна ; IX - адрес данных восстанавливаемого окна -WIN_RESTORE: - AND A - SCF - RET NZ +WIN_RESTORE: AND A + SCF + RET NZ .Start: - CALL LP_BEG_P - ; - IN A,(SLOT1) - PUSH AF - ; - CALL LP_AT_D - CALL LP_TAB_E - ; - LD (SYS_PAGE.SYS_WORK1),SP - LD SP,IX - ; - LD A,B - OUT (SLOT3),A - LD A,#50 - OUT (SLOT1),A - ; - EXX - RES 7,H - LD C,D - EXX -.L2: LD A,L - EXX - LD B,A - LD A,C -.L1: OUT (PORT_Y),A - INC A - POP DE - LD (HL),E - INC L - LD (HL),D - DEC L - DJNZ .L1 - ; - INC HL - INC HL - INC HL - INC HL - EXX - DEC H - JR NZ,.L2 + CALL LP_BEG_P + ; + IN A,(SLOT1) + PUSH AF + ; + CALL LP_AT_D + ;CALL LP_TAB_E + ; + LD (SYS_PAGE.SYS_WORK1),SP + LD SP,IX + ; + LD A,B + OUT (SLOT3),A + LD A,#50 + OUT (SLOT1),A + ; + EXX + RES 7,H + LD C,D + EXX +.L2: LD A,L + EXX + LD B,A + LD A,C +.L1: OUT (PORT_Y),A + INC A + POP DE + LD (HL),E + INC L + LD (HL),D + DEC L + DJNZ .L1 + ; + INC HL + INC HL + INC HL + INC HL + EXX + DEC H + JR NZ,.L2 - LD A,SYS_PAGE - OUT (SLOT3),A + LD A,SYS_PAGE + OUT (SLOT3),A - LD SP,(SYS_PAGE.SYS_WORK1) + LD SP,(SYS_PAGE.SYS_WORK1) - POP AF - OUT (SLOT1),A - JP LP_END_P.short + POP AF + OUT (SLOT1),A + JP LP_END_P.short ;======================================================================; @@ -1759,161 +1580,183 @@ WIN_RESTORE: ; HL - адрес с выводимой строкой ; B - разделитель LP_PR_LINE_DIR: - CALL LP_BEG_P - LD A,#50 - OUT (SLOT3),A + CALL LP_BEG_P + LD A,#50 + OUT (SLOT3),A -.loop: EXX - LD A,D - OUT (PORT_Y),A - EXX - LD A,(HL) - INC HL - CP B - JR Z,.exit - EXX +.loop: EXX + LD A,D + OUT (PORT_Y),A + EXX + LD A,(HL) + INC HL + CP B + JR Z,.exit + EXX ; печатаемые символы - CP 14 - JR NC,.print - CP 7 - JR C,.print + CP 14 + JR NC,.print + CP 7 + JR C,.print ; управляющие символы - SUB 7 - JR Z,LP_BELL ; A = 07 "BELL" - DEC A - JR Z,LP_BACK ; A = 08 "Backspace" - DEC A - JR Z,LP_TAB ; A = 09 "TAB" - DEC A - JR Z,LP_LF ; А = 10 "Line Feed" - DEC A - JR Z,.VT ; А = 11 "Vertical Tabulation" = "Line Feed", если LF работает как CRLF - DEC A - JR Z,LP_CLS ; А = 12 "Form feed" - разрыв страницы, начало нового листа, может работать как VT - DEC A - JR Z,LP_CR ; А = 13 "Carriage Return" + SUB 7 + JR Z,LP_BELL ; A = 07 "BELL" + DEC A + JR Z,LP_BACK ; A = 08 "Backspace" + DEC A + JR Z,LP_TAB ; A = 09 "TAB" + DEC A + JR Z,LP_LF ; А = 10 "Line Feed" + DEC A + JR Z,.VT ; А = 11 "Vertical Tabulation" = "Line Feed", если LF работает как CRLF + DEC A + JR Z,LP_CLS ; А = 12 "Form feed" - разрыв страницы, начало нового листа, может работать как VT + DEC A + JR Z,LP_CR ; А = 13 "Carriage Return" ; ; выводить! .VT: ; ... ; ... -.print: LD (HL),A - INC D +.print: LD (HL),A + INC D .next: ; ... - ; ... - DJ_NEXT_HL - EXX - JR .loop + ; ... + TEST_SCR_40 + DJNZ_NEXT_HL + EXX + JR .loop -.exit: JP LP_END_P +.exit: JP LP_END_P ; ; LP_PRINT_LN_D11: - LD A,#50 - OUT (SLOT3),A - JR LP_PR_LINE_DIR.next + LD A,#50 + OUT (SLOT3),A + JR LP_PR_LINE_DIR.next ;!TODO недоделана LP_BELL: - JR LP_PR_LINE_DIR.next + JR LP_PR_LINE_DIR.next LP_BACK: - LD A,SYS_PAGE - OUT (SLOT3),A + LD A,SYS_PAGE + OUT (SLOT3),A - LD A,(WIN_ID_0.H_BEG) - CP D - JR Z,LP_PRINT_LN_D11 - INC B - DEC D - JR LP_PRINT_LN_D11 + LD A,(WIN_ID_0.H_BEG) + CP D + JR Z,LP_PRINT_LN_D11 + INC B + DEC D + JR LP_PRINT_LN_D11 ;-------[TAB] -LP_TAB: LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(WIN_ID_0.H_BEG) - SUB D - NEG - AND %0000'0111 - NEG - ADD A,8 - LD C,A - LD A,#50 - OUT (SLOT3),A +LP_TAB: LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(WIN_ID_0.H_BEG) + SUB D + NEG + AND %0000'0111 + NEG + ADD A,8 + LD C,A + LD A,#50 + OUT (SLOT3),A -.loop: LD (HL),' ' - INC D - DEC B - JR Z,.end_Line - DEC C - JR NZ,.loop +.loop: LD (HL),' ' + INC D + DEC B + JR Z,.end_Line + DEC C + JR NZ,.loop - JR LP_PR_LINE_DIR.next + JR LP_PR_LINE_DIR.next .end_Line: - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(WIN_ID_0.H_BEG) - LD D,A - LD A,(WIN_ID_0.SIZE_REL) - LD B,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(WIN_ID_0.H_BEG) + LD D,A + LD A,(WIN_ID_0.SIZE_REL) + LD B,A ;JP LP_LF ;-------[TAB end] -LP_LF: LD A,SYS_PAGE - OUT (SLOT3),A +LP_LF: LD A,SYS_PAGE + OUT (SLOT3),A - INC L - INC L - INC L - INC L + INC L + INC L + INC L + INC L - LD A,(WIN_ID_0.V_END) - CP L - JR NC,LP_PRINT_LN_D11 + LD A,(WIN_ID_0.V_END) + CP L + JR NC,LP_PRINT_LN_D11 ;!TEST BIOS SCROLL ;LD A,(WIN_ID_0.V_BEG) ;LD L,A ; вернуться наверх без скролла!!! ;-------------------------------------------------------------\ - PUSH HL - PUSH BC - EXX - PUSH BC - PUSH DE - EXX + PUSH HL + PUSH BC + EXX + PUSH BC + PUSH DE + EXX - LD A,(WIN_ID_0.USER.SIZE_V) - LD B,A - CALL LP_SCROLL_UP.RUN + LD A,(WIN_ID_0.USER.SIZE_V) + LD B,A + CALL LP_SCROLL_UP.RUN - EXX - POP DE - POP BC - EXX - POP BC - POP HL + EXX + POP DE + POP BC + EXX + POP BC + POP HL ;-------------------------------------------------------------/ ; ; scrolling ???? - JR LP_PRINT_LN_D11 + JR LP_PRINT_LN_D11 LP_CLS: ; ... ; scrolling ???? - JR LP_PR_LINE_DIR.next + JR LP_PR_LINE_DIR.next -LP_CR: LD A,SYS_PAGE - OUT (SLOT3),A +LP_CR: LD A,SYS_PAGE + OUT (SLOT3),A - LD A,(WIN_ID_0.H_BEG) - LD D,A - LD A,(WIN_ID_0.SIZE_REL) - LD B,A + LD A,(WIN_ID_0.H_BEG) + LD D,A + LD A,(WIN_ID_0.SIZE_REL) + LD B,A - JR LP_PRINT_LN_D11 + JR LP_PRINT_LN_D11 ;------------------------------------------------------------------[#E0] -;!TODO старая LP_SET_MODE - расковырять старый LP_SCR_MNU +LP_OPEN_PG: IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,C + LD (SYS_PAGE.COPY_SLOT3),A + IN A,(PORT_Y) + LD (SYS_PAGE.COPY_RGADR),A + RET +; + +; не должна влиять на флаги и трогать регистры кроме A +LP_CLOSE_PG: LD A,(SYS_PAGE.COPY_RGADR) + OUT (PORT_Y),A + LD A,(SYS_PAGE.COPY_SLOT3) + OUT (SLOT3),A + RET + /* + +;!TODO старая LP_SET_MODE - расковырять старый LP_SCR_MNU + MODULE EXPERIMENT ; byte 1 @@ -1925,37 +1768,56 @@ LP_CR: LD A,SYS_PAGE ; 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 + MACRO LP_S PG,XX,ADR + DB PG,XX + DW ADR + ENDM + + MACRO LP_OPEN_PG + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,C + LD (SYS_PAGE.COPY_SLOT3),A + IN A,(PORT_Y) + LD (SYS_PAGE.COPY_RGADR),A + ENDM ; + + MACRO LP_CLOSE_PG + LD A,(SYS_PAGE.COPY_RGADR) + OUT (PORT_Y),A + LD A,(SYS_PAGE.COPY_SLOT3) + OUT (SLOT3),A + ENDM ; ;--------------------------------------- -GR_BIT_END EQU 7 +GR_BIT_END: EQU 7 -S_BIT_END EQU 7 -S_BIT_LIN EQU 6 -S_BIT_MOD EQU 5 +S_BIT_END: EQU 7 +S_BIT_LIN: EQU 6 +S_BIT_MOD: EQU 5 -BIT_1440 EQU 1 -BIT_MASK_1440 EQU %00000010 +BIT_1440: EQU 1 +BIT_MASK_1440: EQU %00000010 -MODE_PAGE EQU #FC +MODE_PAGE: EQU #FC ;--------------------------------------- ;DS (($/4)*4+4-$) - ALIGN 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_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 @@ -2112,11 +1974,8 @@ LP_SCR_MNU: ; LP_S 0FFh,0,0 -LP_SET_MNU: - LD IX,LP_SCR_MNU - JR LP_SET_MODE - - +@LP_SET_MNU: LD IX,LP_SCR_MNU + ;JR LP_SET_MODE ; HL - смещение от начала экрана ; = hor_sh + vert_sh * 64 + 4000H ; IX - экранная таблица @@ -2360,4 +2219,5 @@ LP_SIZE: LP_OPEN_PG RET ENDMODULE -*/ + +*/ \ No newline at end of file diff --git a/src/bios/exp/FUNC_SCREEN 2.ASM b/src/bios/exp/FUNC_SCREEN 2.ASM deleted file mode 100644 index 69f8c51..0000000 --- a/src/bios/exp/FUNC_SCREEN 2.ASM +++ /dev/null @@ -1,1144 +0,0 @@ - -;****************************************************************** -; вход: DE - вертикаль, HL - горизонталь, -; B - цвет точки, A - экран -PIC_FN1: - AND A - SCF - RET NZ - - IN A,(PORT_Y) - PUSH AF - - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - - LD A,(WIN_ID_0.GRAF_Y) - ADD A,E - OUT (PORT_Y),A - LD A,B - LD BC,(WIN_ID_0.GRAF_X) - ADD HL,BC - LD B,A - LD A,#50 - OUT (SLOT3),A - LD (HL),A - EX AF,AF' - OUT (SLOT3),A - - POP AF - OUT (PORT_Y),A - RET - -; вход: DE - вертикаль, HL - горизонталь. -; IX - длина линии в точках не 0 !!! -; FILL - by A -; ????? -PIC_FN2: - LD D,A - IN A,(SLOT1) - EX AF,AF' - - LD A,B - ADD A,#50 - OUT (SLOT1),A - - BIT 0,B - LD BC,#40+#4000 - JR Z,PIC_FN2_NO_2ND - LD BC,#40+320+#4000 -PIC_FN2_NO_2ND: - ADD HL,BC - - LD A,E - OUT (PORT_Y),A - - LD A,XH - AND A - JR Z,PIC_FN2_NO256 -PIC_FN2_256L: - LD B,64 -PIC_FN2_256: - LD (HL),D - INC HL - LD (HL),D - INC HL - LD (HL),D - INC HL - LD (HL),D - INC HL - DJNZ PIC_FN2_256 - DEC A - JR NZ,PIC_FN2_256L - -PIC_FN2_NO256: - LD B,XL - AND A - RR B - JR NC,PIC_FN2_NO1 - LD (HL),D - INC HL - AND A -PIC_FN2_NO1: - RR B - JR NC,PIC_FN2_NO2 - LD (HL),D - INC HL - LD (HL),D - INC HL - AND A -PIC_FN2_NO2: - XOR A - CP B - JR Z,PIC_FN2_NO4 -PIC_FN2_4: - LD (HL),D - INC HL - LD (HL),D - INC HL - LD (HL),D - INC HL - LD (HL),D - INC HL - DJNZ PIC_FN2_4 -PIC_FN2_NO4: - - EX AF,AF' - OUT (SLOT1),A - XOR A - OUT (PORT_Y),A - RET - -;************************************************************************ -; вход: dE - вертикаль, HL - горизонталь. -; A',HL' - адрес данных во второй странице ! -; BC' - длина данных -; ВЫВОД ЛИНИИ ТОЧЕК -PIC_FN3: - IN A,(SLOT3) - LD C,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,C - LD (SYS_PAGE.COPY_SLOT3),A - IN A,(SLOT2) - LD (SYS_PAGE.COPY_SLOT2),A - IN A,(SLOT1) - LD (SYS_PAGE.COPY_SLOT1),A - - LD A,B - ADD A,#50 - OUT (SLOT1),A - - BIT 0,B - LD BC,#40 + #4000 - JR Z,PIC_FN3_NO_2ND - LD BC,#40 + 320 + #4000 -PIC_FN3_NO_2ND: - ADD HL,BC - - LD A,E - OUT (PORT_Y),A - - LD A,H - EXX - LD D,A - EXX - LD A,L - EXX - LD E,A - EXX - - EX AF,AF' - OUT (SLOT2),A - EX AF,AF' - LD HL,SYS_PAGE.RAM_TABLE - LD L,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(HL) - OUT (SLOT3),A - EXX - LDIR - BIT 6,H - JR Z,PIC_FN3_NO - RES 6,H - EX AF,AF' -PIC_FN3_NO: - EXX - - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.COPY_SLOT1) - OUT (SLOT1),A - LD A,(SYS_PAGE.COPY_SLOT2) - OUT (SLOT2),A - LD A,(SYS_PAGE.COPY_SLOT3) - OUT (SLOT3),A - - XOR A - OUT (PORT_Y),A - RET - -;************************************************************************** -;PIC_FN4: -; вход: HL - данные палитры RGB, E - начальный цвет -; D - число цветов, B - PAL-mask, A - page PAL -PIC_SET_PAL: - PUSH IX - - EX AF,AF' - IN A,(PORT_Y) - PUSH AF ; сохранить положение PORT_Y - LD A,E - OUT (PORT_Y),A ; начальный цвет в порт - LD A,D ; сохранить число цветов - EX AF,AF' ; вернуть страницу PAL - - BIT 7,H ; проверить адрес данных - LD C,SLOT3 ; если ниже 8000h - LD D,#C3 ; то граф.экран на странице 3 - JR Z,.NO_PAGE1 - LD D,#43 ; иначе - LD C,SLOT1 ; на странице 1 -.NO_PAGE1: - ADD A,A - PUSH AF - - ADD A,A - AND #1C - XOR #E0 ; младший байт адреса PAL - LD E,A ; DE - адрес в видео-ОЗУ - PUSH DE - POP IX ; адрес палитры - - LD D,B ; маска PAL - EX AF,AF' ; вернуть число цветов - LD B,A ; число цветов - - IN E,(C) ; сохранить страницу 3 - LD A,#50 ; страница графического RAM - OUT (C),A - - POP AF - JR C,PIC_GET_PAL - ; цикл установки цветов палитры -.loopPal: - LD A,(HL) ; B - AND D - LD (IX+2),A - INC HL - - LD A,(HL) ; G - AND D - LD (IX+1),A - INC HL - - LD A,(HL) ; R - AND D - LD (IX+0),A - INC HL - - LD A,(HL) ; Y - AND D - LD (IX+3),A - INC HL - - IN A,(PORT_Y) - INC A - OUT (PORT_Y),A - DJNZ .loopPal ; выполнять, пока не 0 - -.exit: OUT (C),E ; восстановить страницу 3 - POP AF - OUT (PORT_Y),A ; восстановить Y_PORT - POP IX - AND A - RET - -PIC_GET_PAL: - ; цикл чтения цветов палитры -.loopPal: - LD A,(IX+2) - LD (HL),A ; B - INC HL - - LD A,(IX+1) - LD (HL),A ; G - INC HL - - LD A,(IX+0) - LD (HL),A ; R - INC HL - - LD A,(IX+3) - LD (HL),A ; Y - INC HL - - IN A,(PORT_Y) - INC A - OUT (PORT_Y),A - DJNZ .loopPal ; выполнять, пока не 0 - - JR PIC_SET_PAL.exit - -;******************************************************************** -PIC_FN5: ; УСТАНОВКА СТРАНИЦЫ MODE - LD A,E - AND 1 - OUT (RGMOD),A - RET -;******************************************************************* -; Установка внутренней палитры -; A - page_pal, E - номер палитры, B - тип палитры -SET_PAL_INIT: - LD D,A - DEC B - JP Z,SET_GRAPH_PALETTE - DEC B - JP Z,SET_TXT_PALETTE.ZX - DEC B - JP Z,SET_TXT_PALETTE.IBM - -; LD IX,PAL_DAT1 -; JR Z,PIC_FN6_L1 -; DEC B -; LD IX,PAL_DAT -; JR Z,PIC_FN6_L1 - - SCF - RET - -;PIC_FN6_L1: -; AND 3 -; ADD A,A -; ADD A,A -; ADD A,#E0 -; LD L,A -; LD H,#43 -; IN A,(SLOT1) -; PUSH AF -; -; LD A,#50 -; OUT (SLOT1),A -; XOR A -; OUT (PORT_Y),A -; EX AF,AF' -; call PAL_LOOP_M -; -; POP AF -; OUT (SLOT1),A -; XOR A -; OUT (PORT_Y),A -; -; RET - -;****************************************************************** -; Рисование линии. -; dЕ - вертикаль, HL - горизонталь -; H' - высота, C'/DE',B' - add_parameters -; A - color -PIC_FN7: - LD D,A - IN A,(SLOT1) - PUSH AF - - LD A,B - ADD A,#50 - OUT (SLOT1),A - - BIT 0,B - LD BC,#40+#4000 - JR Z,.no_2nd - LD BC,#40+320+#4000 -.no_2nd: - ADD HL,BC - LD A,E - -.loop: OUT (PORT_Y),A ; страница видео-ОЗУ - LD (HL),D - - EXX - EX AF,AF' - - DEC H - JR Z,.exit - - LD A,C ; NEXT HORIZONTAL - ADD A,B - LD C,A - LD A,E - EXX - - ADC A,L - LD L,A - - EXX - LD A,D - EXX - - ADC A,H - LD H,A - INC E ; NEXT VERTICAL - EX AF,AF' - INC A - JR .loop - -.exit: EXX - POP AF - OUT (SLOT1),A - XOR A - OUT (PORT_Y),A - RET - -;****************************************************************** -; Рисование линии. -; dЕ - вертикаль, HL - горизонталь -; H' - высота, C'/DE',B' - add_parameters -; (IX) - colors -PIC_FN8: - IN A,(SLOT1) - PUSH AF - - LD A,B - ADD A,#50 - OUT (SLOT1),A - - BIT 0,B - LD BC,#40+#4000 - JR Z,.no_2nd - LD BC,#40+320+#4000 -.no_2nd: - ADD HL,BC - LD A,E - -.loop: OUT (PORT_Y),A ; страница видео-ОЗУ - LD D,(IX) - INC IX - LD (HL),D - - EXX - EX AF,AF' - - DEC H - JR Z,.exit - - LD A,C ; NEXT HORIZONTAL - ADD A,B - LD C,A - LD A,E - EXX - - ADC A,L - LD L,A - - EXX - LD A,D - EXX - - ADC A,H - LD H,A - - INC E ; NEXT VERTICAL - - EX AF,AF' - INC A - JR .loop - -.exit: EXX - POP AF - OUT (SLOT1),A - XOR A - OUT (PORT_Y),A - RET - -;************************************************** -; Вывод спрайта на экран -; HL - горизоталь, DE - вертикаль -; A',HL' - адрес данных -PIC_FN9: - -;********************************* -; HL,E - координаты D - color -; B - Magnify -PIC_FN10: -PIC_FN11: -PIC_FN12: -PIC_FN13: -PIC_FN14: -PIC_FN15: - SCF - RET -;************************************ - - -;************************************ -; SYCLES EQU 0 -; ;START EQU 1 -; ST1 EQU 2 -; DPAL1 EQU 3 -; ST2 EQU 4 -; DPAL2 EQU 5 - -; MACRO NEXT_LIN_H -; EX AF,AF' -; INC A -; OUT (PORT_Y),A -; EX AF,AF' -; ENDM - -; MACRO NEXT_LIN_HP -; EX AF,AF' -; INC A -; OUT (PORT_Y),A -; JR NZ,.MD_NO_INC_H -; INC L -; .MD_NO_INC_H: -; EX AF,AF' -; ENDM - -;**************************************** -; Загрузка режима экрана. -;**************************************** - -; CALL SINC_DEF -; CALL SET_TXT_PALETTE.ZX -; RET - -;**************************************** - -;!TODO тут функция -CL0 EQU 200 -CL1 EQU 240 - - -SET_TXT_PALETTE: -.IBM: LD DE,#8000 - JR .TXT - ; -.ZX: LD DE,0 -.TXT: PUSH IX - IN A,(PORT_Y) - PUSH AF - IN A,(SLOT3) - EX AF,AF' - LD A,#50 - OUT (SLOT3),A - ; - LD IX,#C3F0 ; !HARDCODE адрес палитры? -.generate_loop: - CALL GENERATE_PAL1 - LD A,E - OUT (PORT_Y),A - LD (IX),L ; R - LD (IX+1),B ; G - LD (IX+2),C ; B - LD (IX+3),H ; i ? - INC E - JR NZ,.generate_loop - ; - LD BC,4 - ADD IX,BC - INC D - LD A,D - AND 3 - JR NZ,.generate_loop - ; - EX AF,AF' - OUT (SLOT3),A - POP AF - OUT (PORT_Y),A - POP IX - RET - -; генерация спектрумовской палитры. -; Вход: E - атрибут, D - номер палитры -; ВЫХОД: L - red, B - green, C - blue, H - intensity -GENERATE_PAL1: XOR A - LD C,A - LD B,A - LD L,A - BIT 7,D - JR NZ,GENERATE_IBM - BIT 1,D - JR NZ,.FLH -.NOF: BIT 0,D - JR Z,.PAPER -.INK: LD A,CL0 - BIT 6,E - JR Z,.NOI1 - LD A,CL1 -.NOI1: BIT 0,E ; BLUE - JR Z,.NO1 - LD C,A -.NO1: BIT 1,E ; RED - JR Z,.PP_NO2 - LD L,A -.PP_NO2: BIT 2,E ; GREEN - JR Z,.PP_NO6 ;JR Z,.PP_NO3 - LD B,A -.PP_NO3: JR .PP_NO6 -; -.FLH: BIT 7,E - JR Z,.NOF - BIT 0,D - JR Z,.INK -.PAPER: LD A,CL0 - BIT 6,E - JR Z,.NOI2 - LD A,CL1 -.NOI2: BIT 3,E ; BLUE - JR Z,.PP_NO4 - LD C,A -.PP_NO4: BIT 4,E ; RED - JR Z,.PP_NO5 - LD L,A -.PP_NO5: BIT 5,E ; GREEN - JR Z,.PP_NO6 - LD B,A -.PP_NO6: LD A,C - AND A - RRA - ADD A,L - RRA - ADD A,B - RRA - LD H,A ; B/W mode - RET -;**************************************** - -GENERATE_IBM: - BIT 7,E - JR Z,.NO_FLH - BIT 1,D - JR Z,.PAPER -.NO_FLH: - BIT 0,D - JR Z,.PAPER -.INK: -.NO_INTENS: - LD A,#A8 -.INTENS: - BIT 0,E ; BLUE - JR Z,.PPI_NO4 - LD C,A -.PPI_NO4: - BIT 2,E ; RED - JR Z,.PPI_NO5 - LD L,A -.PPI_NO5: - BIT 1,E ; GREEN - JR Z,.PPI_NO6 - LD B,A -.PPI_NO6: - LD A,E - AND #0F - CP 6 - JR NZ,.no_correct - LD B,#54 -.no_correct: - BIT 3,E - JR Z,GENERATE_PAL1.PP_NO6 - - LD A,#54 - ADD A,C - LD C,A - LD A,#54 - ADD A,B - LD B,A - LD A,#54 - ADD A,L - LD L,A - JR GENERATE_PAL1.PP_NO6 -.PAPER: - LD A,#A8 - BIT 4,E ; BLUE - JR Z,.PPI_NO4X - LD C,A -.PPI_NO4X: - BIT 6,E ; RED - JR Z,.PPI_NO5X - LD L,A -.PPI_NO5X: - BIT 5,E ; GREEN - JR Z,.PPI_NO6X - LD B,A -.PPI_NO6X: - LD A,E - AND #70 - CP #60 - JR NZ,GENERATE_PAL1.PP_NO6 - LD B,#54 - JR GENERATE_PAL1.PP_NO6 -;**************************************** - -;**************************************** -;**************************************** - -; D - номер графической палитры -SET_GRAPH_PALETTE: - PUSH IX - IN A,(PORT_Y) - PUSH AF - - IN A,(SLOT3) - EX AF,AF' - LD A,#50 - OUT (SLOT3),A - - - LD IX,#C3E0 - LD A,D - AND 3 - ADD A,A - ADD A,A - LD E,A - LD D,0 - ADD IX,DE - - LD E,0 - - XOR A - LD B,A - LD C,A - LD L,A - LD H,A - -SET_PAL_GR1: - LD A,E - OUT (PORT_Y),A - - LD (IX),L - LD (IX+1),B - LD (IX+2),C - LD (IX+3),H - - CALL GENERATE_PAL3 - - INC E - LD A,E - CP 40 - JR NZ,SET_PAL_GR1 - - XOR A - LD B,A - LD C,A - LD L,A - LD H,A - -SET_PAL_GR2: - LD A,E - OUT (PORT_Y),A - - LD (IX),L - LD (IX+1),B - LD (IX+2),C - LD (IX+3),H - - CALL GENERATE_PAL2 - - INC E - JR NZ,SET_PAL_GR2 - - EX AF,AF' - OUT (SLOT3),A - POP AF - OUT (PORT_Y),A - POP IX - RET -; -;;********************************* -; - -GENERATE_PAL3: ; gray-scale - LD A,B - ADD A,6 - LD B,A - LD C,A - LD L,A - - LD A,C - AND A - RRA - ADD A,L - RRA - ADD A,B - RRA - LD H,A - - RET - -GENERATE_PAL2: ; C - BLUE; L - RED; B - GREEN; H - INTENSITY - LD A,C - ADD A,50 - LD C,A - JR NC,GEN_PAL2_L1 - LD C,0 - LD A,L - ADD A,50 - LD L,A - JR NC,GEN_PAL2_L1 - LD L,0 - LD A,B - ADD A,50 - LD B,A - JR NC,GEN_PAL2_L1 - LD B,0 - -GEN_PAL2_L1: - LD A,C - AND A - RR A - ADD A,L - RR A - ADD A,B - RR A - LD H,A - - RET -; -;************************************ - -FN_SYNC: BIT 7,A - JR Z,.old_mode - ; - LD H,A - AND #60 ; check reserved bits - JR NZ,.error - ; - BIT 2,H ; Set V-Sinc? - JR NZ,.set_v_sinc - ; - BIT 4,H ; Set Waits? - JR Z,.error ; Error - no parameters - ; -.set_waits: LD A,H - AND 8 ; check waits. Z - no waits, NZ - waits - LD H,Port_All_Mode.DEFAULT - JR Z,.no_change - LD H,Port_All_Mode.DEFAULT-Port_All_Mode.MEM_WAITS_OFF -.no_change: LD BC,(Port_All_Mode) - IN A,(C) - AND H - OUT (C),A - RET - ; -.set_v_sinc: LD A,H - AND 3 - JR Z,.SetDefLines - DEC A - JR Z,.SetCmosLines - DEC A - JR Z,.Set320Lines - ;JR .Set312Lines -.set312lines: LD A,Port_VSYNC.SET_312L - OUT (Port_VSYNC),A - ; - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD A,(SYS_PAGE.VSyncAndWaits) - AND 2 - LD (SYS_PAGE.VSyncAndWaits),A - OUT (C),B - ; -.end_set_v_sinc: - BIT 4,H - RET Z - JR .set_waits - ; -.Set320Lines: LD A,Port_VSYNC.SET_320L - OUT (Port_VSYNC),A - ; - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD A,(SYS_PAGE.VSyncAndWaits) - OR 1 - LD (SYS_PAGE.VSyncAndWaits),A - OUT (C),B - JR .end_set_v_sinc - ; -.SetCmosLines: LD D,CMOS_CELL.ScreenSET - CALL CMOS_RD - ; - AND high CMOS_CELL.ScreenSET.Mask.Sinc ; в регистре A значение ScreenSET - JR Z,.SetDefLines - ; - BIT 6,A - JR Z,.set312lines - JR .Set320Lines - ; -.old_mode: AND A - JR Z,.INT_DEF - DEC A - JR Z,.INT_SCORP - DEC A - JR Z,.INT_PENT - DEC A - JR Z,.INT_ORIG - DEC A - JR Z,.INT_CMOS_SINC - ; [x] кастомный экран по таблице пользователя - DEC A - JR Z,.PROG_SCR - ; -.error: SCF - RET - ; -.SetDefLines: LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD A,(SYS_PAGE.VSyncAndWaits) - OUT (C),B - AND 1 - JR Z,.set312lines - JR .Set320Lines - ; -.INT_DEF: LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD DE,(SYS_PAGE.SCREEN_TABLE) - OUT (C),B - ; - CALL Test_SCREEN_TABLE - JR NZ,.INT_CMOS_SINC - JP (IX) - ; -.INT_CMOS_SINC: LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD DE,(SYS_PAGE.SCREEN_TABLE) - OUT (C),B - ; - LD D,CMOS_CELL.ScreenSET - CALL CMOS_RD - ; - AND high CMOS_CELL.ScreenSET.Mask.Int ; в регистре A значение ScreenSET - JR NZ,.skiptest - ; - CALL Test_SCREEN_TABLE - JP (IX) ; default int (non CMOS) - ; -.skiptest: CP #10 - JR Z,.INT_SCORP ; scorpion int - ; - CP #20 - JR Z,.INT_PENT ; pentagon int - ; - ;JR .INT_ORIG ; original int -.INT_ORIG: LD IX,SCREEN_TABLES.ORIGINAL - JR .PROG_SCR - ; -.INT_SCORP: LD IX,SCREEN_TABLES.SCORPION - JR .PROG_SCR - ; -.INT_PENT: LD IX,SCREEN_TABLES.PENTAGON - ;JR .PROG_SCR -.PROG_SCR: IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - EX AF,AF' - LD (SYS_PAGE.COPY_SLOT3),A - IN A,(PORT_Y) - LD (SYS_PAGE.COPY_RGADR),A - ; - LD (SYS_PAGE.SCREEN_TABLE),IX - XOR A -;----[START]-----------------------[? 1] -.loop_1: OUT (PORT_Y),A - EX AF,AF' - LD A,#50 - OUT (SLOT3),A - LD HL,#C300 -;----[START]------------------[v 2]----- -.loop_2: LD C,(IX) -;----[START]-------------[v 3]---------- -.loop_3: ; взять адрес данных для записи в служебную область экрана - LD E,(IX+1) ; take adress of line X - LD D,(IX+2) -;----[START]--------[v 4]--------------- -.loop_4: LD A,(DE) ; take counter in table 1, line X, column Y - INC DE - AND A - JR Z,.loop_4_exit ; exit if zero-counter - LD B,A - LD A,(DE) - INC DE -;----[START]---[v 5]-------------------- -.loop_5: LD (HL),A - INC L - LD (HL),0 - INC L - LD (HL),0 - ; - EX AF,AF' - INC A - OUT (PORT_Y),A - EX AF,AF' - ; - LD (HL),0 - DEC L - LD (HL),0 - DEC L - LD (HL),A - ; - EX AF,AF' - INC A - OUT (PORT_Y),A - EX AF,AF' - ; - DJNZ .loop_5 -;--------------[^ 5]-------------------- - JR .loop_4 -;-------------------[^ 4]--------------- -.loop_4_exit: INC HL ; next line - INC HL - INC HL - INC HL - IN A,(PORT_Y) - AND #80 - OUT (PORT_Y),A - DEC C - JR NZ,.loop_3 -;------------------------[^ 3]---------- - INC IX ; next counter - INC IX - INC IX - LD A,(IX) - AND A - JR NZ,.loop_2 -;-----------------------------[^ 2]----- - LD A,SYS_PAGE - OUT (SLOT3),A - LD IX,(SYS_PAGE.SCREEN_TABLE) - ; - EX AF,AF' - ADD A,#80 - JR NC,.loop_1 -;----------------------------------[^ 1] - ; Exit - LD A,(SYS_PAGE.COPY_RGADR) - OUT (PORT_Y),A - LD A,(SYS_PAGE.COPY_SLOT3) - OUT (SLOT3),A -.exit: OR A - RET - ; - ;DE - содержимое SYS_PAGE.SCREEN_TABLE -Test_SCREEN_TABLE: - LD HL,SCREEN_TABLES.SCORPION - AND A - SBC HL,DE - LD IX,FN_SYNC.INT_SCORP - RET Z - ; - LD HL,SCREEN_TABLES.ORIGINAL - AND A - SBC HL,DE - LD IX,FN_SYNC.INT_ORIG - RET Z - ; - LD HL,SCREEN_TABLES.PENTAGON - AND A - SBC HL,DE - LD IX,FN_SYNC.INT_PENT - RET Z - AND A - RET -;--- Screen data table 1: counter1, data1 .. counterX, dataX -SCREEN_TABLES: -; | число | значения | -; | строк | в | -; | /2 | строках | -.SCR: DB 41 , #F8 - DB 3 , #FC - DB 4 , #FC - DB 7 , #FC - 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 -;--------------------------------------- - -;--- Screen data tables 2: counter1, data address1 .. counterX, data addressX -; -; | кол-во | значения | -; | строк | в | -; | | строке | -.PENTAGON: DB 33 : DW .SCR - DB 1 : DW .INT ; DW .BLN - DB 3 : DW .SNC - DB 1 : DW .BLN - DB 1 : DW .SCR - DB 1 : DW .RES - DB 0 ; end -.SCORPION: DB 31 : DW .SCR - DB 1 : DW .INT_SC - DB 1 : DW .SCR - DB 1 : DW .SNC - DB 3 : DW .SNC - DB 1 : DW .BLN - DB 2 : DW .RES - DB 0 ; end -.ORIGINAL: DB 33 : DW .SCR - DB 1 : DW .SNC - DB 1 : DW .INT - DB 2 : DW .SNC - DB 1 : DW .BLN - DB 1 : DW .SCR - DB 1 : DW .RES - DB 0 ; end -;--------------------------------------- - -;************************************ -; -; Экранные таблицы -; -;текстовое окно 80x32 -LP_SCR_80: - DB 40,32,0,0,%0001'1011,0,0,0 - BLOCK 8,0 - -;текстовое окно 40x32 -LP_SCR_40: - DB 40,32,0,0,%0111'1011,0,0,0 - BLOCK 8,0 - -;спектрумовское окно 32x24 -LP_SCR_32: - DB 32,24,4,4,%0011'0000,1,0,0 - BLOCK 8,0 - -;текстовое окно 64x24 -LP_SCR_64: - DB 32,24,4,4,%1001'1011,0,0,0 - BLOCK 8,0 - -;графическое окно 0 -PIC_320X256_1: - DB 40,32,0,0,%0010'0000,0,8,0 - BLOCK 8,0 - -;графическое окно 1 -PIC_320X256_2: - DB 40,32,0,0,%0110'0000,0,48,0 - BLOCK 8,0 - -;************************************ -; - - diff --git a/src/bios/exp/FUNC_SCREEN.ASM b/src/bios/exp/FUNC_SCREEN.ASM index 2fd6ec1..ae44fe5 100644 --- a/src/bios/exp/FUNC_SCREEN.ASM +++ b/src/bios/exp/FUNC_SCREEN.ASM @@ -6,6 +6,7 @@ PIC_FN1: AND A SCF RET NZ + CCF IN A,(PORT_Y) PUSH AF @@ -1110,33 +1111,33 @@ SCREEN_TABLES: ; ;текстовое окно 80x32 LP_SCR_80: - DB 40,32,0,0,27,0,0,0 - DB 0, 0,0,0, 0,0,0,0 + DB 40,32,0,0,%0001'1011,0,0,0 + BLOCK 8,0 ;текстовое окно 40x32 LP_SCR_40: - DB 40,32,0,0,123,0,0,0 - DB 0, 0,0,0, 0,0,0,0 + DB 40,32,0,0,%0111'1011,0,0,0 + BLOCK 8,0 ;спектрумовское окно 32x24 LP_SCR_32: - DB 32,24,4,4,48,1,0,0 - DB 0, 0,0,0, 0,0,0,0 + DB 32,24,4,4,%0011'0000,1,0,0 + BLOCK 8,0 ;текстовое окно 64x24 LP_SCR_64: - DB 32,24,4,4,155,0,0,0 - DB 0, 0,0,0, 0,0,0,0 + DB 32,24,4,4,%1001'1011,0,0,0 + BLOCK 8,0 ;графическое окно 0 PIC_320X256_1: - DB 40,32,0,0,32,0,8,0 - DB 0, 0,0,0, 0,0,0,0 + DB 40,32,0,0,%0010'0000,0,8,0 + BLOCK 8,0 ;графическое окно 1 PIC_320X256_2: - DB 40,32,0,0,96,0,48,0 - DB 0, 0,0,0, 0,0, 0,0 + DB 40,32,0,0,%0110'0000,0,48,0 + BLOCK 8,0 ;************************************ ; diff --git a/src/bios/exp/ZX_MEM 2.TXT b/src/bios/exp/ZX_MEM 2.TXT deleted file mode 100644 index cf20fbf..0000000 --- a/src/bios/exp/ZX_MEM 2.TXT +++ /dev/null @@ -1,13 +0,0 @@ -Отдельные рамблоки для: - vROM - vRAM -Отдельные процедуры выделения страниц для: - #1FFD - обрабатывать первым если нужен. Не подходят #A0, #D0..#DF - #7FFD - 128/512, не выделять память для #1FFD в режиме pent 512 - vROM -Страницу 0 использовать как раньше для маппа в #7FFD и для #1FFD=1 -Подкрутить в меню спектрума переключалку режимов и освобождение памяти под новую модель памяти -При освобождении памяти vROM мапить на эти порты обратно Spec_Page -Проверить на хардкод биос и zxroms, чтоб не втыкались стандартные (зарезервированные) страницы -; -Сделать переключалку в биосе старый/новый режим работы памяти? \ No newline at end of file