;;.PRINTX "Low-print-2." ;============================================================== ; ; Программа LOW PRINT for Sprinter-97. ; ;============================================================== ;============================================================= ; Функции Bios Sprinter-97. ; Рабочая версия 29.05.97 ;============================================================= ; LP_OPEN_WIN Открытие окна ; point 3D13h C=80h Вход: B - код окна. ; B=0 - Spectrum 32x24 B=1 - Spectrum 64x24 ; B=2 - Spectrum 40x24 B=3 - Spectrum 80x24 ; Выход: DE - размер окна ;============================================================= ; LP_PRINT_ALL Вывод символов на экран с текущего знакоместа ; point 3D13h C=81h Вход: A - символ, ; B - число выводимых символов, ; Е - атрибут символа ;============================================================= ; LP_PRINT_SYM Вывод символов на экран с текущего знакоместа ; без атрибута ; point 3D13h C=82h Вход: A - символ, ; B - число выводимых символов, ;============================================================= ; LP_PRINT_ATR Вывод атрибутов на экран с текущего знакоместа ; point 3D13h C=83h Вход: B - число выводимых символов, ; Е - атрибут символа ;============================================================= ; LP_SET_PLACE Установка текущего знакоместа ; point 3D13h C=84h Вход: E - знакоместо по горизонтали ; D - знакоместо по вертикали ;============================================================= ; LP_PRINT_LN Вывод строки символов на экран с текущего ; знакоместа ; point 3D13h C=85h Вход: HL - адрес строки ; B - число выводимых символов, ; Е - атрибут символов ;============================================================= ; LP_PRINT_LN2 Вывод строки символов на экран с текущего ; знакоместа без атрибутов ; point 3D13h C=86h Вход: HL - адрес строки ; B - число выводимых символов, ;============================================================= ; LP_PRINT_LN3 Вывод строки символов на экран с текущего ; знакоместа ; point 3D13h C=87h Вход: HL - адрес строки ; B - число выводимых символов, ; D - разделитель ; Е - атрибут символов ;============================================================= ; LP_PRINT_LN4 Вывод строки символов на экран с текущего ; знакоместа без атрибутов ; point 3D13h C=88h Вход: HL - адрес строки ; B - число выводимых символов, ; D - разделитель ;============================================================= ; LP_CLS_WIN Очистка окна экрана ; point 3D13h C=89h Вход: DE - положение окна ; B - атрибут очистки ; H - высота, L - ширина ;============================================================= TEST_40 MACRO ; LOCAL LLL ; EX AF,AF' ; JR C,LLL ; INC D ; режим 40 ;LLL: ; EX AF,AF' ENDM DJ_NEXT_HL MACRO DJNZ .LLL CALL LP_NEXT_HL .LLL: ENDM LP_OPEN_PG MACRO IN A,(PAGE3) LD C,A LD A,SYS_PAGE OUT (PAGE3),A LD A,C LD (COPY_PAGE3),A IN A,(RGADR) LD (COPY_RGADR),A ENDM LP_CLOSE_PG MACRO LD A,(COPY_RGADR) OUT (RGADR),A LD A,(COPY_PAGE3) OUT (PAGE3),A ENDM LP_BEG_PM MACRO EX AF,AF' EXX IN A,(PAGE3) LD C,A IN A,(RGADR) LD B,A LD A,SYS_PAGE OUT (PAGE3),A LD (SYS_SP),SP LD SP,SYS_SP PUSH BC LD HL,(WIN_MAP_IX+WIN_HL) LD DE,(WIN_MAP_IX+WIN_DE) LD BC,(WIN_MAP_IX+WIN_BC) LD A,E AND A RRA OUT (RGADR),A EXX EX AF,AF' ENDM LP_END_PM MACRO EX AF,AF' EXX RLA LD E,A LD (WIN_MAP_IX+WIN_HL),HL ; место печати LD (WIN_MAP_IX+WIN_DE),DE LD (WIN_MAP_IX+WIN_BC),BC POP BC LD A,B OUT (RGADR),A LD A,C OUT (PAGE3),A LD SP,SYS_SP EXX EX AF,AF' RET ENDM LP_PRINT_ALL: CALL LP_BEG_P EXX LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_AL1: EXX LD A,D OUT (RGADR),A INC D 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 EXX DJNZ LP_PRINT_AL1 LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_SYM: CALL LP_BEG_P EXX LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_SY1: EXX LD A,D OUT (RGADR),A LD (HL),C INC D TEST_40 DJ_NEXT_HL ; DEC B ; CALL Z,LP_NEXT_HL EXX DJNZ LP_PRINT_SY1 LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_ATR: CALL LP_BEG_P LD A,E EXX LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_AT1: EXX LD A,D OUT (RGADR),A INC D INC L LD (HL),C DEC L TEST_40 DJ_NEXT_HL ; DEC B ; CALL Z,LP_NEXT_HL EXX DJNZ LP_PRINT_AT1 LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_LINE: CALL LP_BEG_P EXX ; LD C,A LD A,50H OUT (PAGE3),A LD C,RGADR EXX LP_PRINT_LN1: 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 ; DEC B ; CALL Z,LP_NEXT_HL EXX DJNZ LP_PRINT_LN1 LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_LINE2: CALL LP_BEG_P LD A,50H OUT (PAGE3),A EXX LD C,RGADR EXX LP_PRINT_LN2: 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 EXX DJNZ LP_PRINT_LN2 LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_LINE3: CALL LP_BEG_P EXX ; LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_LN3: EXX LD A,D OUT (RGADR),A INC D EXX LD A,(HL) INC HL CP D JR NZ,LP_PR_L31 DEC HL LD A,' ' LP_PR_L31: EXX LD (HL),A EXX LD A,E EXX INC L LD (HL),A DEC L TEST_40 DJ_NEXT_HL ; DEC B ; CALL Z,LP_NEXT_HL EXX DJNZ LP_PRINT_LN3 LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_LINE4: CALL LP_BEG_P EXX ; LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_LN4: EXX LD A,D OUT (RGADR),A EXX LD A,(HL) INC HL CP D JR NZ,LP_PR_L41 DEC HL LD A,' ' LP_PR_L41: EXX LD (HL),A INC D TEST_40 DJ_NEXT_HL ; DEC B ; CALL Z,LP_NEXT_HL EXX DJNZ LP_PRINT_LN4 LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_LINE5: CALL LP_BEG_P EXX ; LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_LN5: EXX LD A,D OUT (RGADR),A EXX LD A,(HL) INC HL CP D JR Z,LP_PR_L51 EXX LD (HL),A EXX LD A,E EXX INC L LD (HL),A DEC L INC D TEST_40 DJ_NEXT_HL ; DEC B ; CALL Z,LP_NEXT_HL EXX DJNZ LP_PRINT_LN5 LP_PR_L51: LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_LINE6: CALL LP_BEG_P EXX ; LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_LN6: EXX LD A,D OUT (RGADR),A EXX LD A,(HL) INC HL CP D JR Z,LP_PR_L61 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 (PAGE3),A CALL LP_END_P RET ;************************************* LP_PRINT_LINE_DIR: CALL LP_BEG_P EXX ; LD C,A LD A,50H OUT (PAGE3),A EXX LP_PRINT_LN_D: EXX LD A,D OUT (RGADR),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 LP_PRINT_LN_D2: 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 EXX JR LP_PRINT_LN_D LP_LN_DD1: LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET LP_PRINT_LN_D11: LD A,50H OUT (PAGE3),A JR LP_PRINT_LN_D1 LP_BEEP: JR LP_PRINT_LN_D2 LP_BACK: LD A,SYS_PAGE OUT (PAGE3),A LD A,(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 (PAGE3),A LD A,(WIN_MAP_IX+WIN_H_BEG) SUB D NEG AND 07H NEG ADD A,8 LD C,A LD A,50H OUT (PAGE3),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 (PAGE3),A LD A,(WIN_MAP_IX+WIN_H_BEG) LD D,A LD A,(WIN_MAP_IX+WIN_SIZE_REL) LD B,A LP_LF: LD A,SYS_PAGE OUT (PAGE3),A INC L INC L INC L INC L LD A,(WIN_MAP_IX+WIN_V_END) CP L LP_CLS: JR NC,LP_PRINT_LN_D11 LD A,(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 (PAGE3),A LD A,(WIN_MAP_IX+WIN_H_BEG) LD D,A LD A,(WIN_MAP_IX+WIN_SIZE_REL) LD B,A JR LP_PRINT_LN_D11 ;***************************************** LP_SET_PLACE: CALL LP_BEG_P CALL LP_AT_D CALL LP_TAB_E CALL LP_END_P RET LP_GET_PLACE: CALL LP_BEG_P LD A,(WIN_MAP_IX+WIN_H_BEG) NEG EXX ADD A,D EXX LD E,A LD A,(WIN_MAP_IX+WIN_V_BEG) NEG EXX ADD A,L DEC A EXX RRCA RRCA AND 3FH LD D,A CALL LP_END_P RET ;********************************************* ;********************************************* LP_CLS_WIN: LD C,20h JR LP_CLS_WIN_3 LP_CLS_WIN_2: LD C,A LP_CLS_WIN_3: CALL LP_BEG_P LD (SYS_WORK1),BC ; сохранить цвет push de LP_CLS_L2: CALL LP_AT_D CALL LP_TAB_E PUSH DE EXX LD BC,(SYS_WORK1) EXX LD B,L LD A,50H OUT (PAGE3),A LP_CLS_L1: EXX LD A,D OUT (RGADR),A LD (HL),C INC L LD (HL),B DEC L INC D EXX DJNZ LP_CLS_L1 LD A,SYS_PAGE OUT (PAGE3),A POP DE INC D DEC H JR NZ,LP_CLS_L2 pop de CALL LP_AT_D CALL LP_TAB_E CALL LP_END_P RET ;******************************************************* ; ; WIN_MAP_SC - карта экрана :-) ; 0 - hor size ; 1 - ver size ; 2 - hor place ; 3 - ver place LP_SIZE: ; определение size LP_OPEN_PG LD DE,(WIN_MAP_IX+WIN_SIZE_H) LP_CLOSE_PG RET ; LD (WIN_MODE_SC),DE ; место по горизонтали и страница моды ; LD (WIN_MODE_SH),HL ; место по вертикали с адресом LP_AT_D: LD A,(WIN_MAP_IX+WIN_SIZE_V) EXX LD L,A EXX LD A,D EXX LP_AT_DX: SUB L JR NC,LP_AT_DX ; JR Z,LP_AT_DX ADD A,L ADD A,A ADD A,A LD L,A LD A,(WIN_MAP_IX+WIN_V_BEG) ADD A,L LD L,A INC L LD H,0C3H EXX RET LP_TAB_E: LD A,(WIN_MAP_IX+WIN_SIZE_REL) EXX LD D,A EXX LD A,E EXX LP_TAB_EX: SUB D JR NC,LP_TAB_EX JR Z,LP_TAB_EX NEG LD B,A ; сохранить сколько осталось символов в строке NEG ADD A,D LD D,A LD A,(WIN_MAP_IX+WIN_MODE) BIT 5,A JR Z,LP_NO_ADD_A LD A,D ADD A,A LD D,A LP_NO_ADD_A: LD A,(WIN_MAP_IX+WIN_H_BEG) ADD A,D LD D,A EXX RET ;************************************************************* ;******************************************* LP_NEXT_HL: ; вычисление нового места LD A,SYS_PAGE OUT (PAGE3),A INC L INC L INC L INC L LD A,(WIN_MAP_IX+WIN_V_END) CP L JR NC,LP_NEXT_HL1 LD A,(WIN_MAP_IX+WIN_V_BEG) LD L,A INC L LD H,0C3H LP_NEXT_HL1: LD A,(WIN_MAP_IX+WIN_H_BEG) LD D,A LD A,(WIN_MAP_IX+WIN_SIZE_REL) LD B,A LD A,50H OUT (PAGE3),A RET ; program set registers ; for low printer LP_BEG_P: EX AF,AF' EXX LP_OPEN_PG LD HL,(WIN_MAP_IX+WIN_HL) LD DE,(WIN_MAP_IX+WIN_DE) LD BC,(WIN_MAP_IX+WIN_BC) LD A,E AND A RRA OUT (RGADR),A EXX EX AF,AF' RET ; program init registers ; for low printer & save WIN_GET_ZG: ; DE - адрес куда переслать фонт LD HL,ZG_ADRESS LD BC,800H 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,(PAGE1) LD (COPY_PAGE1),A LD A,0FFH OUT (PAGE1),A EXX EX AF,AF' LD B,A AND 0FH ADD A,A OUT (RGADR),A LD A,B RRCA RRCA RRCA AND 18H OR 040H LD H,A LD L,0 LD BC,0800H EX DE,HL LDIR EX DE,HL LD A,H RRCA RRCA RRCA DEC A AND 3 ADD A,058H LD H,A ; LD HL,05800H LP_INI_L1: LD (HL),L INC L JR NZ,LP_INI_L1 EXX EX AF,AF' LD A,(COPY_PAGE1) OUT (PAGE1),A RET LP_INI_P: EX AF,AF' EXX LP_OPEN_PG LD A,(WIN_MAP_IX+WIN_MODE) CP 0C0H JR NC,LP_INI_NO_ZG ; открытие бордера... LD A,(WIN_MAP_IX+WIN_MODE_S) BIT 0,A JR NZ,LP_INI_NO_ZG ; открытие Spectrum-Screen LD A,(WIN_MAP_IX+WIN_MODE) BIT 4,A JR Z,LP_INI_NO_ZG ; открытие графического экрана LD DE,(WIN_ZG) ; знакогенератор EXX EX AF,AF' CALL LP_SET_ZG1 EXX EX AF,AF' LP_INI_NO_ZG: LD A,(WIN_MAP_IX+WIN_H_BEG) LD D,A LD A,(WIN_MAP_IX+WIN_V_BEG) LD L,A INC L LD H,0C3H AND A LD A,(WIN_MAP_IX+WIN_MODE) BIT 5,A LD A,(WIN_MAP_IX+WIN_SIZE_H) JR NZ,LP_INI_40 ADD A,A SCF LP_INI_40: LD B,A LD (WIN_MAP_IX+WIN_SIZE_REL),A ; LD DE,(WIN_MODE_SC) ; место по горизонтали и страница моды ; LD HL,(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 (WIN_MAP_IX+WIN_HL),HL ; место печати LD (WIN_MAP_IX+WIN_DE),DE LD (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' RET ;******************************************************** LP_OPEN_S: LD A,B ADD A,A CP LP_SC_TAB_SIZE CCF RET C PUSH HL LD HL,LP_SC_TAB ADD A,L LD L,A LD A,H ADC A,0 LD H,A LD A,(HL) INC HL LD H,(HL) 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 PIC_SET_S1 DW PIC_SET_S2 ; DW LP_SET_MNU LP_SC_TAB_SIZE EQU $-LP_SC_TAB ;LP_SET_MNU: ; SCF ; RET ; LD IX,LP_SCR_MNU ; JR LP_SET_MODE LP_SET_32: LD HL,4104H LP_SET_32X: LD IX,LP_SCR_32 JR LP_SET_MODE LP_SET_64: LD HL,4104H LP_SET_64X: LD IX,LP_SCR_64 JR LP_SET_MODE LP_SET_40: LD HL,4000H LP_SET_40X: LD IX,LP_SCR_40 JR LP_SET_MODE LP_SET_80: LD HL,4000H LP_SET_80X: LD IX,LP_SCR_80 JR LP_SET_MODE PIC_SET_S1: LD IX,PIC_320X256_1 JR LP_SET_MODE PIC_SET_S2: LD IX,PIC_320X256_2 JR LP_SET_MODE ;********************************************************** WIN_OPEN_WIN: ; HL - место на экране по знакоместам ; IX - описатель окна LP_OPEN_PG LD (WIN_MAP_SC),IX ; карта окна PUSH HL PUSH DE LD HL,(WIN_MAP_SC) LD DE,WIN_MAP_IX LD BC,32 LDIR LD IX,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 PIC_FN0: LP_SET_MODE: ; HL - PLACE ; IX - SIZE_HOR; IX+1 - SIZE_VER; IX+2,3; IX+4 - MODE; ; E - страница моды. LD A,H AND 10H ; переместить бит 4 в регистр E XOR E LD E,A LD A,L AND 3FH 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 (WIN_MAP_SC),IX ; карта окна PUSH HL PUSH DE LD HL,(WIN_MAP_SC) LD DE,WIN_MAP_IX LD BC,32 LDIR LD IX,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 INC A ; вычисление PORT_Y BIT 4,E JR NZ,LP_SET_NO_OR OR 80H ; если вывод на второй экран LP_SET_NO_OR: LD (IX+WIN_H_BEG),A LD D,A LD A,(IX+WIN_SIZE_H) ADD A,A ADD A,D LD (IX+WIN_H_END),A LD (WIN_MODE_SC),DE ; место по горизонтали и страница моды LD A,H AND 3FH ADD A,A ADD A,A LD L,A LD H,0C3H LD (WIN_MODE_SH),HL ; место по вертикали с адресом LD (IX+WIN_V_BEG),A LD A,(IX+WIN_SIZE_V) ADD A,A ADD A,A ADD A,L LD (IX+WIN_V_END),A LD L,(IX+WIN_V_BEG) LD H,0C3H LD B,(IX+WIN_SIZE_V) ; размер по вертикали LD (IX+WIN_WORK_1),0 LD A,(IX+WIN_MODE) ; знакогенератор плюс режим LD (IX+WIN_WORK_2),A BIT 4,A JR NZ,LP_SET_LOOP ; переход, если текстовый режим AND 0F0H LD C,A LD A,(IX+WIN_GR_X) RRCA RRCA RRCA LD D,A AND 0FH OR C LD (IX+WIN_WORK_2),A LD A,D AND 0E0H LD C,A LD A,(IX+WIN_GR_Y) AND 1FH OR C RLCA RLCA RLCA LD (IX+WIN_WORK_1),A LP_SET_LOOP: LD D,(IX+WIN_H_BEG) ; D - начало строки (PORT_Y) LD C,(IX+WIN_SIZE_H) ; размер по горизонтали LD A,(IX+WIN_MODE) ; знакогенератор плюс режим PUSH BC CALL LP_MODE_LINE POP BC INC L INC L INC L INC L DJNZ 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 CALL LP_INI_P ; LD A,(WIN_MODE_SC) ; OUT (RGMOD),A CALL LP_SIZE ; AND A XOR A RET WIN_CLOSE_WIN: SCF RET LP_MODE_LINE: ; Установка режима на линии BIT 0,(IX+WIN_MODE_S) JP NZ,LP_MODE_LINE2 ; идти на спектрум BIT 4,A JP Z,LP_MODE_LINE3 ; идти на графику! DEC D ; текстовый режим. EX AF,AF' LD A,50H OUT (PAGE3),A LD A,L ; вертикальное положение CP 80H JR NC,LP_EXIT_MODE LP_MODE_RECURSE: LD A,D ; горизонтальное положение AND 7FH SUB 80 JR C,LP_MODE_LL SUB 48 NEG LD E,A ; запомнить ADD A,D LD D,A ; новое положение LD A,E ; восстановить RRA AND 3FH SUB C JR NC,LP_EXIT_MODE NEG LD C,A ; новое значение C JR LP_MODE_RECURSE LP_MODE_LL: NEG RRA AND 3FH 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 (RGADR),A EX AF,AF' LD (HL),A ; режим INC D EX AF,AF' LD A,D OUT (RGADR),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 (PAGE3),A EX AF,AF' RET LP_MODE_LINE2: ; Установка режима на линии ; Spectrum mode LD A,(IX+WIN_WORK_2) LD B,(IX+WIN_WORK_1) DEC D EX AF,AF' LD A,50H OUT (PAGE3),A LD A,L ; вертикальное положение CP 80H JR NC,LP_EXIT_MODE2 LP_MODE_RECURSE2: LD A,D ; горизонтальное положение AND 7FH SUB 80 JR C,LP_MODE_LL2 SUB 48 NEG LD E,A ; запомнить ADD A,D LD D,A ; новое положение LD A,E ; восстановить RRA AND 3FH SUB C JR NC,LP_EXIT_MODE2 NEG LD C,A ; новое значение C JR LP_MODE_RECURSE2 LP_MODE_LL2: NEG RRA AND 3FH 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 (RGADR),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 (RGADR),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 (PAGE3),A EX AF,AF' LD (IX+WIN_WORK_1),B LD (IX+WIN_WORK_2),A RET LP_MODE_LINE3: ; Установка режима на линии ; Grafic Mode LD A,(IX+WIN_WORK_1) LD B,(IX+WIN_WORK_2) DEC D EX AF,AF' LD A,50H OUT (PAGE3),A LD A,L ; вертикальное положение CP 80H JR NC,LP_EXIT_MODE3 LP_MODE_RECURSE3: LD A,D ; горизонтальное положение AND 7FH SUB 80 JR C,LP_MODE_LL3 SUB 48 NEG LD E,A ; запомнить ADD A,D LD D,A ; новое положение LD A,E ; восстановить RRA AND 3FH SUB C JR NC,LP_EXIT_MODE3 NEG LD C,A ; новое значение C JR LP_MODE_RECURSE3 LP_MODE_LL3: NEG RRA AND 3FH 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 (RGADR),A EX AF,AF' LD (HL),B INC L LD (HL),a INC L LD (HL),0 DEC L DEC L INC D 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 (PAGE3),A EX AF,AF' LD A,(IX+WIN_WORK_1) ADD A,8 LD (IX+WIN_WORK_1),A RET LP_GR_640: EX AF,AF' LD A,D OUT (RGADR),A EX AF,AF' LD (HL),B ; режим INC L LD (HL),A ; режим 2 INC L LD (HL),0 INC D EX AF,AF' LD A,D OUT (RGADR),A EX AF,AF' LD (HL),0 DEC L LD (HL),A DEC L LD (HL),B ; режим 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_SCROLL_UD: DEC B JR Z,LP_SCROLL_UP DEC B JR Z,LP_SCROLL_DN ; DEC B ; JR Z,LP_SCROLL_UP2 ; DEC B ; JR Z,LP_SCROLL_DN2 SCF RET LP_SCROLL_UP: ; Вход : D - верхняя строка ( от 0 ) ; ; E - число скроллируемых строк DEC E RET Z LP_OPEN_PG LD B,E LD E,0 PUSH BC CALL LP_AT_D CALL LP_TAB_E ; вычислить переменные для строки POP BC LP_SCROLL_L2: EXX PUSH HL EXX POP HL LD E,L LD D,H INC L INC L INC L INC L LD A,(WIN_MAP_IX+WIN_V_END) CP L JR C,LP_SCROLL_U_EXIT ; если конец, то выход PUSH BC LD A,L EXX LD L,A EXX LD A,(WIN_MAP_IX+WIN_SIZE_H) ADD A,A ; число байт в строке для переноса ADD A,A LD C,A LD B,0 LD A,50H OUT (PAGE3),A ; открыть страницу для переноса EXX LD A,D ; получить порт начала строки EXX LP_SCROLL_L1: OUT (RGADR),A INC A ; следующее значение порта LDI LDD OUT (RGADR),A INC A ; следующее значение порта LDI LDD JP PE,LP_SCROLL_L1 LD A,SYS_PAGE OUT (PAGE3),A POP BC DJNZ LP_SCROLL_L2 LP_SCROLL_U_EXIT: LP_CLOSE_PG RET LP_SCROLL_DN: ; Вход : D - верхняя строка ( от 0 ) ; ; E - число скроллируемых строк DEC E RET Z 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 LP_SCROLL_D2: EXX PUSH HL EXX POP HL LD E,L LD D,H DEC L DEC L DEC L DEC L LD A,(WIN_MAP_IX+WIN_V_BEG) CP L JR Z,LP_SCROLL_U_CONT JR NC,LP_SCROLL_U_EXIT ; если конец, то выход LP_SCROLL_U_CONT: PUSH BC LD A,L EXX LD L,A EXX LD A,(WIN_MAP_IX+WIN_SIZE_H) ADD A,A ADD A,A LD C,A LD B,0 LD A,50H OUT (PAGE3),A EXX LD A,D EXX LP_SCROLL_D1: OUT (RGADR),A INC A LDI LDD OUT (RGADR),A INC A LDI LDD JP PE,LP_SCROLL_D1 LD A,SYS_PAGE OUT (PAGE3),A POP BC DJNZ LP_SCROLL_D2 LP_SCROLL_D_EXIT: LP_CLOSE_PG RET WIN_GET_SYM: ; DE - место символа в окне ; А - номер окна ; выход: HL - символ/атрибут B - знакогенератор AND A SCF RET NZ CALL LP_BEG_P CALL LP_AT_D CALL LP_TAB_E LD A,50H OUT (PAGE3),A EXX LD A,D OUT (RGADR),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 EXX LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET WIN_PUT_SYM: ; DE - место символа в окне ; А - номер окна ; HL - символ/атрибут B - знакогенератор AND A SCF RET NZ CALL LP_BEG_P CALL LP_AT_D CALL LP_TAB_E LD A,50H OUT (PAGE3),A EXX LD A,D OUT (RGADR),A EXX LD A,L EXX LD (HL),A INC L EXX LD A,H EXX LD (HL),A DEC L DEC L EXX LD A,B EXX LD (HL),A INC L EXX LD A,SYS_PAGE OUT (PAGE3),A CALL LP_END_P RET WIN_MOVE_WIN: ; HL - размер окна ; DE - положение окна AND A ; A - номер окна SCF ; IX - новое положение окна RET NZ PUSH IX PUSH HL LD B,0FFH LD IX,0C000H CALL WIN_COPY_WIN1 POP HL POP DE LD B,0FFH LD IX,0C000H CALL WIN_REST_WIN1 AND A RET WIN_COPY_WIN: ; HL - размер сохраняемого окна ; DE - место сохраняемого окна ; IX - адрес сохраняемого окна, в странице 4000h ; А - номер окна, B - страница AND A SCF RET NZ WIN_COPY_WIN1: CALL LP_BEG_P IN A,(PAGE1) PUSH AF CALL LP_AT_D CALL LP_TAB_E LD (SYS_WORK1),SP LD A,B OUT (PAGE3),A LD A,50H OUT (PAGE1),A EXX RES 7,H LD C,D EXX LP_COPY_L2: LD A,L EXX LD B,A ADD A,A DB 0DDH ADD A,L DB 0DDH LD L,A JR NC,LP_NO_INC_IX1 DB 0DDH INC H LP_NO_INC_IX1: LD SP,IX LD A,C ADD A,B LP_COPY_L1: DEC A OUT (RGADR),A LD E,(HL) INC L LD D,(HL) DEC L PUSH DE DJNZ LP_COPY_L1 INC HL INC HL INC HL INC HL EXX DEC H JR NZ,LP_COPY_L2 LD A,SYS_PAGE OUT (PAGE3),A LD SP,(SYS_WORK1) POP AF OUT (PAGE1),A CALL LP_END_P2 AND A RET WIN_REST_WIN: ; HL - размер сохраняемого окна ; DE - место сохраняемого окна ; IX - адрес данных восстанавливаемого окна AND A SCF RET NZ WIN_REST_WIN1: CALL LP_BEG_P IN A,(PAGE1) PUSH AF CALL LP_AT_D CALL LP_TAB_E LD (SYS_WORK1),SP LD SP,IX LD A,B OUT (PAGE3),A LD A,50H OUT (PAGE1),A EXX RES 7,H LD C,D EXX LP_REST_L2: LD A,L EXX LD B,A LD A,C LP_REST_L1: OUT (RGADR),A INC A POP DE LD (HL),E INC L LD (HL),D DEC L DJNZ LP_REST_L1 INC HL INC HL INC HL INC HL EXX DEC H JR NZ,LP_REST_L2 LD A,SYS_PAGE OUT (PAGE3),A LD SP,(SYS_WORK1) POP AF OUT (PAGE1),A CALL LP_END_P2 AND A RET