From acc561bb6a2eb15ea2d0d0f193d505a911dbbb59 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 8 Aug 2023 23:48:25 +1000 Subject: [PATCH] refactoring, optimizations --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 8 +- src/bios/exp/FUNC_LOW_PRINT.ASM | 1099 ++++++++++++++----------------- 3 files changed, 498 insertions(+), 611 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index ccb7691..7e4985b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit ccb7691e3e36560b42832ea558ff038388a4598e +Subproject commit 7e4985b40214f573ba17b707ad5191319841acdd diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 3e617ef..90fa753 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -228,9 +228,9 @@ TAB_FNS: ; Fx DB low RST_CONF.SP97_1 ; #F0 для совместимости с софтом Sp97 DB low RST_CONF.SP97_2 ; #F1 для совместимости с софтом Sp97 - DB low FN_SYNC ; #F2 - DB low RST_CONF.CUSTOM ; #F3 для совместимости с софтом Sp97 ;!TODO сделать её и для перезаливки конфы Sp2000 - DB low DCP_CONFIG ; #F4 + DB low FN_SYNC ; #F2 установка синхронизации + DB low RST_CONF.CUSTOM ; #F3 для совместимости с софтом Sp97 ;!TODO сделать её и для перезаливки конфы Sp2000 + DB low DCP_CONFIG ; #F4 функция распределения портов ; [x] DB low CMOS_TEST ; #F5 DB low CMOS_RD ; #F6 DB low CMOS_WR ; #F7 @@ -240,7 +240,7 @@ TAB_FNS: DB low GOTO_SPEC ; #FB Goto Spectrum! DB low FN_RESERVED ; #FC DB low REINIT ; #FD - DB low FN_RESERVED ; #FE SAVE_AUTOSTART ;!!!!! + DB low FN_RESERVED ; #FE SAVE_AUTOSTART. Есть в ZX_EXP.ASM DB low FN_VERSION ; #FF ;****************----------------------------************************----------------- diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index e3b4fef..2c2b66a 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -63,15 +63,16 @@ ; H - высота, L - ширина ;============================================================= MACRO TEST_40 -; LOCAL LLL ; EX AF,AF' -; JR C,LLL +; JR C,.LLL ; INC D ; режим 40 -;LLL: +;.LLL: ; EX AF,AF' ENDM MACRO DJ_NEXT_HL +; DEC B +; CALL Z,LP_NEXT_HL DJNZ .LLL CALL LP_NEXT_HL .LLL: @@ -99,6 +100,16 @@ ENDM +;********************************* +;* LOW LEVEL PRINTER * +;* DE' - ZG * +;* HL' - PLACE ON SCR * +;* C' - ATTRIBUTES * +;* B' - COUNT SYMBS * +;* ZF - inverse * +;* AF' - страница и mode * +;********************************* + MACRO LP_BEG_PM EX AF,AF' EXX @@ -120,7 +131,7 @@ LD A,E AND A RRA - OUT (PORT_Y),A + OUT (PORT_Y),A EXX EX AF,AF' ENDM @@ -146,117 +157,100 @@ RET ENDM +; +;------------------------------------------------------------------[#81] LP_PRINT_ALL: CALL LP_BEG_P EXX - LD C,A + LD C,A + EXX LD A,#50 OUT (SLOT3),A - EXX -LP_PRINT_AL1: - - EXX +.loop: EXX LD A,D OUT (PORT_Y),A INC D - LD (HL),C +.cont: LD (HL),C EXX LD A,E EXX INC L LD (HL),A DEC L - -; TEST_40 - - DJ_NEXT_HL - -; DEC B -; CALL Z,LP_NEXT_HL + ;TEST_40 + DJ_NEXT_HL EXX + DJNZ .loop - DJNZ LP_PRINT_AL1 - - LD A,SYS_PAGE - OUT (SLOT3),A JP LP_END_P - ;CALL LP_END_P - ;RET +;------------------------------------------------------------------[#81] +; +; +;------------------------------------------------------------------[#82] LP_PRINT_SYM: CALL LP_BEG_P EXX - LD C,A + LD C,A + EXX LD A,#50 OUT (SLOT3),A - EXX -LP_PRINT_SY1: - EXX + +.loop: EXX LD A,D OUT (PORT_Y),A - LD (HL),C +.cont: LD (HL),C INC D - - TEST_40 - - DJ_NEXT_HL -; DEC B -; CALL Z,LP_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX - DJNZ LP_PRINT_SY1 + DJNZ .loop - LD A,SYS_PAGE - OUT (SLOT3),A JP LP_END_P - ;CALL LP_END_P - ;RET +;------------------------------------------------------------------[#82] +; +; +;------------------------------------------------------------------[#83] LP_PRINT_ATR: CALL LP_BEG_P LD A,E EXX - LD C,A + LD C,A + EXX LD A,#50 OUT (SLOT3),A - EXX -LP_PRINT_AT1: - EXX +.loop: EXX LD A,D OUT (PORT_Y),A INC D - INC L LD (HL),C DEC L - - - TEST_40 - - DJ_NEXT_HL -; DEC B -; CALL Z,LP_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX - DJNZ LP_PRINT_AT1 + DJNZ .loop - LD A,SYS_PAGE - OUT (SLOT3),A + ;LD A,SYS_PAGE + ;OUT (SLOT3),A JP LP_END_P - ;CALL LP_END_P - ;RET +;------------------------------------------------------------------[#83] +; +; +;------------------------------------------------------------------[#85] LP_PRINT_LINE: CALL LP_BEG_P EXX -; LD C,A + LD C,PORT_Y + EXX LD A,#50 OUT (SLOT3),A - LD C,PORT_Y - EXX -LP_PRINT_LN1: - EXX +.loop: EXX OUT (C),D INC D EXX @@ -270,79 +264,68 @@ LP_PRINT_LN1: INC L LD (HL),A DEC L - - TEST_40 - - DJ_NEXT_HL - -; DEC B -; CALL Z,LP_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX + DJNZ .loop - DJNZ LP_PRINT_LN1 - - LD A,SYS_PAGE - OUT (SLOT3),A + ;LD A,SYS_PAGE + ;OUT (SLOT3),A JP LP_END_P - ;CALL LP_END_P - ;RET - +;------------------------------------------------------------------[#85] +; +; +;------------------------------------------------------------------[#86] LP_PRINT_LINE2: CALL LP_BEG_P - + EXX + LD C,PORT_Y + EXX LD A,#50 OUT (SLOT3),A - EXX - LD C,PORT_Y - EXX -LP_PRINT_LN2: - LD A,(HL) +.loop: LD A,(HL) INC HL EXX OUT (C),D INC D LD (HL),A - TEST_40 - - DJ_NEXT_HL - -; DEC B -; CALL Z,LP_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX - DJNZ LP_PRINT_LN2 + DJNZ .loop - LD A,SYS_PAGE - OUT (SLOT3),A + ;LD A,SYS_PAGE + ;OUT (SLOT3),A JP LP_END_P - ;CALL LP_END_P - ;RET +;------------------------------------------------------------------[#86] +; +; +;------------------------------------------------------------------[#87] LP_PRINT_LINE3: CALL LP_BEG_P - EXX -; LD C,A LD A,#50 OUT (SLOT3),A - EXX -LP_PRINT_LN3: - EXX +.loop: EXX LD A,D OUT (PORT_Y),A INC D - EXX LD A,(HL) INC HL CP D - JR NZ,LP_PR_L31 + JR NZ,.NoEnd DEC HL - LD A,' ' -LP_PR_L31: - EXX - + ;!TEST + ;LD A,' ' + EXX + LD C,' ' + JP LP_PRINT_ALL.cont + ; +.NoEnd: EXX LD (HL),A EXX LD A,E @@ -350,88 +333,68 @@ LP_PR_L31: INC L LD (HL),A DEC L - - TEST_40 - - DJ_NEXT_HL - -; DEC B -; CALL Z,LP_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX + DJNZ .loop - DJNZ LP_PRINT_LN3 - - LD A,SYS_PAGE - OUT (SLOT3),A JP LP_END_P - ;CALL LP_END_P - ;RET - +;------------------------------------------------------------------[#87] +; +; +;------------------------------------------------------------------[#88] LP_PRINT_LINE4: CALL LP_BEG_P - EXX -; LD C,A LD A,#50 OUT (SLOT3),A - EXX -LP_PRINT_LN4: - EXX +.loop: EXX LD A,D OUT (PORT_Y),A - EXX LD A,(HL) INC HL CP D - JR NZ,LP_PR_L41 + JR NZ,.NoEnd DEC HL - LD A,' ' -LP_PR_L41: - EXX - + ;!TEST + ;LD A,' ' + EXX + LD C,' ' + JP LP_PRINT_SYM.cont + ; +.NoEnd: EXX LD (HL),A - INC D - - TEST_40 - - DJ_NEXT_HL - -; DEC B -; CALL Z,LP_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX + DJNZ .loop - DJNZ LP_PRINT_LN4 - - LD A,SYS_PAGE - OUT (SLOT3),A JP LP_END_P - ;CALL LP_END_P - ;RET - +;------------------------------------------------------------------[#88] +; +; +;------------------------------------------------------------------[#8B] LP_PRINT_LINE5: CALL LP_BEG_P - EXX -; LD C,A LD A,#50 OUT (SLOT3),A - EXX -LP_PRINT_LN5: - EXX +.loop: EXX LD A,D OUT (PORT_Y),A - EXX LD A,(HL) INC HL CP D - JR Z,LP_PR_L51 + ;!TEST + ;JR Z,.exit + JR Z,LP_END_P + ; EXX - LD (HL),A EXX LD A,E @@ -439,221 +402,86 @@ LP_PRINT_LN5: INC L LD (HL),A DEC L - INC D - - TEST_40 - - DJ_NEXT_HL - -; DEC B -; CALL Z,LP_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX + DJNZ .loop - DJNZ LP_PRINT_LN5 - -LP_PR_L51: +.exit: ;JP LP_END_P +;------------------------------------------------------------------[#8B] +LP_END_P: ; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе LD A,SYS_PAGE OUT (SLOT3),A - JP LP_END_P - ;CALL LP_END_P - ;RET +.SYS_PAGE: + EX AF,AF' + EXX + RLA + LD E,A + LD (SYS_PAGE.WIN_MAP_IX+WIN_HL),HL ; место печати + LD (SYS_PAGE.WIN_MAP_IX+WIN_DE),DE + LD (SYS_PAGE.WIN_MAP_IX+WIN_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 +; +; +;------------------------------------------------------------------[#8C] LP_PRINT_LINE6: CALL LP_BEG_P - EXX -; LD C,A LD A,#50 OUT (SLOT3),A - EXX -LP_PRINT_LN6: - EXX +.loop: EXX LD A,D OUT (PORT_Y),A - EXX LD A,(HL) INC HL CP D - JR Z,LP_PR_L61 + ;!TEST + ;JR Z,.exit + JR Z,LP_END_P + ; EXX - - LD (HL),A - - INC D - - TEST_40 - - DJ_NEXT_HL - -; DEC B -; CALL Z,LP_NEXT_HL - EXX - - DJNZ LP_PRINT_LN6 -LP_PR_L61: - LD A,SYS_PAGE - OUT (SLOT3),A - JP LP_END_P - ;CALL LP_END_P - ;RET - -LP_PRINT_LINE_DIR: - - CALL LP_BEG_P - EXX -; LD C,A - LD A,#50 - OUT (SLOT3),A - EXX - -LP_PRINT_LN_D: - EXX - LD A,D - OUT (PORT_Y),A - - EXX - LD A,(HL) - INC HL - CP B - JR Z,LP_LN_DD1 - EXX - - CP 14 - JR NC,LP_PRINT_LN_DD - CP 7 - JR C,LP_PRINT_LN_DD - SUB 7 - JR Z,LP_BEEP - DEC A - JR Z,LP_BACK - DEC A - JR Z,LP_TAB - DEC A - JR Z,LP_LF - DEC A - JR Z,LP_XX - DEC A - JR Z,LP_CLS - DEC A - JR Z,LP_CR - -LP_XX: ; выводить! - -LP_PRINT_LN_DD: LD (HL),A INC D - -LP_PRINT_LN_D1: - - DJ_NEXT_HL + TEST_40 + DJ_NEXT_HL EXX - JR LP_PRINT_LN_D + DJNZ .loop -LP_LN_DD1: - LD A,SYS_PAGE - OUT (SLOT3),A - JP LP_END_P - ;CALL LP_END_P - ;RET +.exit: JP LP_END_P +;------------------------------------------------------------------[#8C] +; -LP_PRINT_LN_D11: - LD A,#50 - OUT (SLOT3),A - JR LP_PRINT_LN_D1 -LP_BEEP: - JR LP_PRINT_LN_D1 -LP_BACK: - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_H_BEG) - CP D - JR Z,LP_PRINT_LN_D11 - INC B - DEC D - JR LP_PRINT_LN_D11 -LP_TAB: - LD A,SYS_PAGE - OUT (SLOT3),A - - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_H_BEG) - SUB D - NEG - AND 07H - NEG - ADD A,8 - - LD C,A - LD A,#50 - OUT (SLOT3),A - -LP_TAB_L: - LD (HL),20H - INC D - DEC B - JR Z,LP_TAB_L1 - DEC C - JR NZ,LP_TAB_L - JR LP_PRINT_LN_D1 - -LP_TAB_L1: - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_H_BEG) - LD D,A - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_SIZE_REL) - LD B,A - -LP_LF: - LD A,SYS_PAGE - OUT (SLOT3),A - - INC L - INC L - INC L - INC L - - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_V_END) - CP L - JR NC,LP_PRINT_LN_D11 - - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_V_BEG) - LD L,A ; вернуться наверх без скролла!!! - -; scrolling ???? - - JR LP_PRINT_LN_D11 - -LP_CLS: - - JR LP_PRINT_LN_D1 - -LP_CR: - LD A,SYS_PAGE - OUT (SLOT3),A - - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_H_BEG) - LD D,A - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_SIZE_REL) - LD B,A - - JR LP_PRINT_LN_D11 - -;***************************************** +; +;------------------------------------------------------------------[#84] LP_SET_PLACE: ; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе - CALL LP_BEG_P - CALL LP_AT_D - CALL LP_TAB_E - JP LP_END_P - ;CALL LP_END_P - ;RET + 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 @@ -672,72 +500,138 @@ LP_GET_PLACE: EXX RRCA RRCA - AND #3F + AND %0011'1111 LD D,A - ;!TEST cursor - JP LP_END_P2 - ;CALL LP_END_P2 - ;AND A - ;RET - ; - -;********************************************* - - -;********************************************* + + JP LP_END_P.short +;------------------------------------------------------------------[#8E] +; +; +;-------------------------------------------------------------[#89, #8D] +;--------------------------------------------------------[#89] LP_CLS_WIN: - LD C,20h - JR LP_CLS_WIN_3 + LD C,' ' + JR CLS_WIN +;--------------------------------------------------------[#89] +;--------------------------------------------------------[#8D] LP_CLS_WIN2: - LD C,A -LP_CLS_WIN_3: - CALL LP_BEG_P - LD (SYS_PAGE.SYS_WORK1),BC ; сохранить цвет - push de -LP_CLS_L2: - CALL LP_AT_D - CALL LP_TAB_E - PUSH DE + 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) + LD BC,(SYS_PAGE.SYS_WORK1) EXX - LD B,L + LD B,L + LD A,#50 + OUT (SLOT3),A - LD A,#50 - OUT (SLOT3),A - -LP_CLS_L1: - - EXX - LD A,D - OUT (PORT_Y),A - - LD (HL),C - INC L - LD (HL),B - DEC L - - INC D +.loop2: EXX + LD A,D + OUT (PORT_Y),A + LD (HL),C + INC L + LD (HL),B + DEC L + INC D EXX + DJNZ .loop2 - DJNZ LP_CLS_L1 + LD A,SYS_PAGE + OUT (SLOT3),A + POP DE + INC D + DEC H + JR NZ,.loop1 - LD A,SYS_PAGE - OUT (SLOT3),A + POP DE + CALL LP_AT_D + CALL LP_TAB_E + JP LP_END_P.SYS_PAGE +;-------------------------------------------------------------[#89, #8D] +; - POP DE - INC D - DEC H - JR NZ,LP_CLS_L2 - pop de +; +;------------------------------------------------------------------[#B8] +WIN_GET_ZG: ; DE - адрес куда переслать фонт + LD HL,ZG_ADDRESS + LD BC,#0800 + LDIR + AND A + RET +;------------------------------------------------------------------[#B8] +; - CALL LP_AT_D - CALL LP_TAB_E - JP LP_END_P - ;CALL LP_END_P - ;RET +; +;------------------------------------------------------------------[#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,#FF + OUT (SLOT1),A + EXX + LD BC,Port_All_Mode + IN A,(C) + LD (SYS_PAGE.SYS_WORK1),A + AND #FE ; 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 + RRCA + RRCA + RRCA + AND #18 + OR #40 + LD H,A + LD L,0 + LD BC,#0800 ;!HARDCODE + EX DE,HL + LDIR + 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 +;------------------------------------------------------------------[#B6] +; ;******************************************************* ; @@ -757,9 +651,8 @@ LP_SIZE: ; ADD A,A LD E,A RET +; -; LD (SYS_PAGE.WIN_MODE_SC),DE ; место по горизонтали и страница моды -; LD (SYS_PAGE.WIN_MODE_SH),HL ; место по вертикали с адресом LP_AT_D: ; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе LD A,(SYS_PAGE.WIN_MAP_IX+WIN_SIZE_V) @@ -768,11 +661,11 @@ LP_AT_D: ; !!!!! EXX LD A,D EXX + .loop: SUB L JR NC,.loop -; JR Z,LP_AT_DX - ADD A,L + ADD A,L ADD A,A ADD A,A LD L,A @@ -783,6 +676,8 @@ LP_AT_D: ; !!!!! LD H,#C3 EXX RET +; + ; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе LP_TAB_E: @@ -792,57 +687,50 @@ LP_TAB_E: EXX LD A,E EXX -LP_TAB_EX: - SUB D - JR NC,LP_TAB_EX - JR Z,LP_TAB_EX + +.loop: SUB D + JR NC,.loop + JR Z,.loop + NEG LD B,A ; сохранить сколько осталось символов в строке NEG ADD A,D LD D,A LD A,(SYS_PAGE.WIN_MAP_IX+WIN_MODE) - ;BIT 5,A AND %0010'0000 - JR Z,LP_NO_ADD_A - + JR Z,.skip_Dx2 LD A,D ADD A,A LD D,A - -LP_NO_ADD_A: +.skip_Dx2: LD A,(SYS_PAGE.WIN_MAP_IX+WIN_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,(SYS_PAGE.WIN_MAP_IX+WIN_V_END) CP L JR NC,LP_NEXT_HL1 - - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_V_BEG) - LD L,A + LD HL,(SYS_PAGE.WIN_MAP_IX+WIN_V_BEG) + ;LD A,(SYS_PAGE.WIN_MAP_IX+WIN_V_BEG) + ;LD L,A INC L LD H,#C3 ;!HARDCODE LP_NEXT_HL1: LD A,(SYS_PAGE.WIN_MAP_IX+WIN_H_BEG) LD D,A - LD A,(SYS_PAGE.WIN_MAP_IX+WIN_SIZE_REL) LD B,A @@ -850,13 +738,11 @@ LP_NEXT_HL1: OUT (SLOT3),A RET -; program set registers -; for low printer ; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе LP_BEG_P: EX AF,AF' EXX - LP_OPEN_PG + LP_OPEN_PG LD HL,(SYS_PAGE.WIN_MAP_IX+WIN_HL) LD DE,(SYS_PAGE.WIN_MAP_IX+WIN_DE) LD BC,(SYS_PAGE.WIN_MAP_IX+WIN_BC) @@ -868,110 +754,25 @@ LP_BEG_P: EX AF,AF' RET - -; program init registers -; for low printer & save -WIN_GET_ZG: ; DE - адрес куда переслать фонт - LD HL,ZG_ADDRESS - LD BC,#0800 - LDIR - AND A - RET - -WIN_SET_ZG: -LP_SET_ZG: - EX AF,AF' - EXX - LP_OPEN_PG - - CALL LP_SET_ZG1 - - LP_CLOSE_PG - EXX - EX AF,AF' - AND A - RET - - -LP_SET_ZG1: - IN A,(SLOT1) - LD (SYS_PAGE.COPY_SLOT1),A - LD A,#FF - OUT (SLOT1),A - EXX - - LD BC,Port_All_Mode - IN A,(C) - LD (SYS_PAGE.SYS_WORK1),A - AND #FE ; 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 - RRCA - RRCA - RRCA - AND #18 - OR #40 - LD H,A - LD L,0 - - LD BC,#0800 - EX DE,HL - LDIR - EX DE,HL - LD A,H - RRCA - RRCA - RRCA - DEC A - AND 3 - ADD A,#58 - LD H,A -; LD HL,05800H -LP_INI_L1: - LD (HL),L - INC L - JR NZ,LP_INI_L1 - - 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 - LP_INI_P: - EX AF,AF' - EXX - - LP_OPEN_PG - + EXX + LP_OPEN_PG LD A,(SYS_PAGE.WIN_MAP_IX+WIN_MODE) CP #C0 - JR NC,LP_INI_NO_ZG ; открытие бордера... + JR NC,LP_INI_NO_ZG ; открытие бордера... LD A,(SYS_PAGE.WIN_MAP_IX+WIN_MODE_S) BIT 0,A - JR NZ,LP_INI_NO_ZG ; открытие Spectrum-Screen + JR NZ,LP_INI_NO_ZG ; открытие Spectrum-Screen LD A,(SYS_PAGE.WIN_MAP_IX+WIN_MODE) BIT 4,A - JR Z,LP_INI_NO_ZG ; открытие графического экрана - LD DE,(SYS_PAGE.WIN_ZG) ; знакогенератор + JR Z,LP_INI_NO_ZG ; открытие графического экрана + LD DE,(SYS_PAGE.WIN_ZG) ; знакогенератор EXX EX AF,AF' - CALL LP_SET_ZG1 + CALL WIN_SET_ZG.SET ;LP_SET_ZG1 EXX EX AF,AF' @@ -990,51 +791,30 @@ LP_INI_NO_ZG: JR NZ,LP_INI_40 ADD A,A SCF + ;!TODO что-то тут подвыпиленно LP_INI_40: LD B,A LD (SYS_PAGE.WIN_MAP_IX+WIN_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 + ; 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 -; JR LP_END_P -; program save registers -; for low printer -LP_END_P: ; !!!!! ожидается, что портятся только альтернативные регистры и те, что как параметры на входе - EX AF,AF' - EXX - RLA - LD E,A - LD (SYS_PAGE.WIN_MAP_IX+WIN_HL),HL ; место печати - LD (SYS_PAGE.WIN_MAP_IX+WIN_DE),DE - LD (SYS_PAGE.WIN_MAP_IX+WIN_BC),BC - LP_CLOSE_PG - EXX - EX AF,AF' - AND A - RET - -LP_END_P2: - EX AF,AF' - EXX - LP_CLOSE_PG - EXX - EX AF,AF' - AND A - RET - + JP LP_END_P ;******************************************************** + +; +;------------------------------------------------------------------[#80] LP_OPEN_S: LD A,B ADD A,A - CP LP_SC_TAB_SIZE + CP LP_SC_TAB.SIZE CCF RET C PUSH HL @@ -1051,67 +831,63 @@ LP_OPEN_S: LD L,A EX (SP),HL RET - LP_SC_TAB: DW LP_SET_32 DW LP_SET_64 DW LP_SET_40 DW LP_SET_80 - DW LP_SET_32X - DW LP_SET_64X - DW LP_SET_40X - DW LP_SET_80X + DW LP_SET_32.X + DW LP_SET_64.X + DW LP_SET_40.X + DW LP_SET_80.X DW PIC_SET_S1 DW PIC_SET_S2 -; DW LP_SET_MNU - -LP_SC_TAB_SIZE EQU $-LP_SC_TAB + ; DW LP_SET_MNU +.SIZE EQU $-LP_SC_TAB ;LP_SET_MNU: ; ????? ; SCF ; RET ; LD IX,LP_SCR_MNU -; JR LP_SET_MODE +; JP LP_SET_MODE LP_SET_32: - LD HL,4104H -LP_SET_32X: - LD IX,LP_SCR_32 - JR LP_SET_MODE + LD HL,#4104 +.X: LD IX,LP_SCR_32 + JP LP_SET_MODE LP_SET_64: LD HL,#4104 -LP_SET_64X: - LD IX,LP_SCR_64 - JR LP_SET_MODE +.X: LD IX,LP_SCR_64 + JP LP_SET_MODE LP_SET_40: LD HL,#4000 -LP_SET_40X: - LD IX,LP_SCR_40 - JR LP_SET_MODE +.X: LD IX,LP_SCR_40 + JP LP_SET_MODE LP_SET_80: LD HL,#4000 -LP_SET_80X: - LD IX,LP_SCR_80 - JR LP_SET_MODE +.X: LD IX,LP_SCR_80 + JP LP_SET_MODE PIC_SET_S1: LD IX,PIC_320X256_1 - JR LP_SET_MODE + JP LP_SET_MODE PIC_SET_S2: LD IX,PIC_320X256_2 - JR LP_SET_MODE + JP LP_SET_MODE +;------------------------------------------------------------------[#80] +; -;********************************************************** +; +;------------------------------------------------------------------[#B0] ; HL - место на экране по знакоместам (НЕ ИСПОЛЬЗУЕТСЯ) ; IX - описатель окна WIN_OPEN: 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 @@ -1119,12 +895,10 @@ WIN_OPEN: LDIR LD IX,SYS_PAGE.WIN_MAP_IX POP DE -; POP HL - LD L,(IX+WIN_PLACE_H) LD H,(IX+WIN_PLACE_V) LD (IX+WIN_MODE_E),E - JR WIN_OPEN_W1 + JP WIN_OPEN_W1 ; HL - PLACE @@ -1136,20 +910,15 @@ LP_SET_MODE: AND #10 ; переместить бит 4 в регистр E XOR E LD E,A - LD A,L AND #3F ADD HL,HL ADD HL,HL LD L,A - RES 7,H - RES 6,H -; LD A,H -; AND 3FH -; LD H,A - -;LP_SET_MODE_M: - LP_OPEN_PG + LD A,H + AND #3F + LD H,A + LP_OPEN_PG LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна PUSH HL PUSH DE @@ -1160,11 +929,9 @@ LP_SET_MODE: LD IX,SYS_PAGE.WIN_MAP_IX POP DE POP HL - LD (IX+WIN_PLACE_H),L LD (IX+WIN_PLACE_V),H LD (IX+WIN_MODE_E),E - WIN_OPEN_W1: LD A,L ADD A,A @@ -1179,9 +946,7 @@ LP_SET_NO_OR: ADD A,A ADD A,D LD (IX+WIN_H_END),A - LD (SYS_PAGE.WIN_MODE_SC),DE ; место по горизонтали и страница моды - LD A,H AND #3F ADD A,A @@ -1246,20 +1011,14 @@ LP_SET_LOOP: LD A,(IX+WIN_MODE_E) AND 1 OUT (RGMOD),A -; LD A,(IX+WIN_MODE) -; BIT 4,A - - LP_CLOSE_PG - -; RET Z - + ; LD A,(IX+WIN_MODE) + ; BIT 4,A + LP_CLOSE_PG + ; RET Z CALL LP_INI_P - -; LD A,(SYS_PAGE.WIN_MODE_SC) -; OUT (RGMOD),A - + ; LD A,(SYS_PAGE.WIN_MODE_SC) + ; OUT (RGMOD),A CALL LP_SIZE -; AND A XOR A RET @@ -1267,6 +1026,7 @@ WIN_CLOSE: SCF RET + ; Установка режима на линии LP_MODE_LINE: BIT 0,(IX+WIN_MODE_S) @@ -1662,6 +1422,7 @@ LP_SCROLL_UP: .EXIT: LP_CLOSE_PG RET + ; Вход : ; D - верхняя строка ( от 0 ) ; E - число скроллируемых строк @@ -1773,10 +1534,6 @@ WIN_GET_SYM: INC L EXX - - LD A,SYS_PAGE - OUT (SLOT3),A - CALL LP_END_P RET @@ -1824,13 +1581,8 @@ WIN_PUT_SYM: INC L EXX - - LD A,SYS_PAGE - OUT (SLOT3),A - JP LP_END_P - ;CALL LP_END_P - ;RET + ; HL - размер окна ; DE - положение окна @@ -1926,7 +1678,7 @@ WIN_COPY_WIN1: POP AF OUT (SLOT1),A - JP LP_END_P2 + JP LP_END_P.short ;AND A ;RET @@ -1995,10 +1747,145 @@ LP_REST_L1: POP AF OUT (SLOT1),A - JP LP_END_P2 - ;CALL LP_END_P2 - ;AND A - ;RET + JP LP_END_P.short +;======================================================================; + +;!FIXIT нет описания, недоделана. Печать с управляющими символами +;------------------------------------------------------------------[#E0] +LP_PRINT_LINE_DIR: + 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 + ; печатаемые символы + 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" + ; + + ; выводить! +.VT: ; ... + ; ... +.print: LD (HL),A + INC D + +.next: ; ... + ; ... + DJ_NEXT_HL + EXX + JR .loop + +.exit: JP LP_END_P +; +; +LP_PRINT_LN_D11: + LD A,#50 + OUT (SLOT3),A + JR LP_PRINT_LINE_DIR.next + +;!TODO недоделана +LP_BELL: + JR LP_PRINT_LINE_DIR.next + +LP_BACK: + LD A,SYS_PAGE + OUT (SLOT3),A + + LD A,(SYS_PAGE.WIN_MAP_IX+WIN_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,(SYS_PAGE.WIN_MAP_IX+WIN_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 + + JR LP_PRINT_LINE_DIR.next +.end_Line: + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.WIN_MAP_IX+WIN_H_BEG) + LD D,A + LD A,(SYS_PAGE.WIN_MAP_IX+WIN_SIZE_REL) + LD B,A + ;JP LP_LF +;-------[TAB end] +LP_LF: LD A,SYS_PAGE + OUT (SLOT3),A + + INC L + INC L + INC L + INC L + + LD A,(SYS_PAGE.WIN_MAP_IX+WIN_V_END) + CP L + JR NC,LP_PRINT_LN_D11 + + LD A,(SYS_PAGE.WIN_MAP_IX+WIN_V_BEG) + LD L,A ; вернуться наверх без скролла!!! + + ; scrolling ???? + JR LP_PRINT_LN_D11 + +LP_CLS: ; ... + ; scrolling ???? + JR LP_PRINT_LINE_DIR.next + +LP_CR: LD A,SYS_PAGE + OUT (SLOT3),A + + LD A,(SYS_PAGE.WIN_MAP_IX+WIN_H_BEG) + LD D,A + LD A,(SYS_PAGE.WIN_MAP_IX+WIN_SIZE_REL) + LD B,A + + JR LP_PRINT_LN_D11 +;------------------------------------------------------------------[#E0] +