; LAST UPDATE: 14.02.2025 savelij
; описатель окна (адрес в IX)
; +00 X координата
; +01 Y координата
; +02 V высота
; +03 H ширина
; +04 C цвет
; +05 C цвет курсора
; +06 F флаговый
; +07 N номер пункта в окне
; BIT 7-0 => 8-9 текущий пункт,
; 1 => 8-9 адрес хранения
; 6-0 => A-B количество пунктов
; 1 => A-B адрес хранения
; +08 | текущий
; +09 | пункт меню
; +0A : количество
; +0B : пунктов
; +0C | адрес
; +0D | текста
; +0E : список адресов
; +0F : подпрограмм
; +10 | адрес списка активных
; +11 | зон для мыши
; +12 : адрес списка
; +13 : горячих клавиш
; формат флагового байта окна
; IX+6
; 7-0-нет, 1-есть нижний заголовок
; 6-0-с рамкой,1-без рамки
; 5-0-нет, 1-есть верхний заголовок
; 4-0-есть текст, 1-нет
; 3
; 2-
; 1-
; 0-
; раскладка байт выделений. на данный момент не все перенесено из старой реализации
; +0 флаговый
; 7 при активности установлен
; 6 установлен, не выделяется
; 5 установлен, вызов вектора
; 4
; 3 \
; 2 } форма курсора
; 1 } при попадании
; 0 /
; +1 x координата
; +2 y координата
; +3 v высота
; +4 h ширина
; +5 k код клавиши
EXT_WINDOW LD A,(SYSFLAGS)
BIT SYSFLAGS.B_FB_INT_EXT,A
JR NZ,EXT_ZX_WINDOW
; внутренний вызов рисования окна на ZX экране
INT_ZX_WINDOW LD A,NUM_ZXSCR
JR INT_TXT_WINDOW.L1
; внутренний вызов для рисования окна на текстовом экране
INT_TXT_WINDOW LD A,NUM_TXTSCR
; внешний вызов для рисования окна на текстовом экране
.L1 EX AF,AF'
XOR A
LD (PAGE4READ),A
EX AF,AF'
LD HL,SYSFLAGS
SET SYSFLAGS.B_WIN_INT_EXT,(HL)
JR EXT_ZX_WINDOW.L1
; внешний вызов для рисования окна на ZX экране
EXT_ZX_WINDOW LD HL,SYSFLAGS
RES SYSFLAGS.B_WIN_INT_EXT,(HL)
LD IX,(RREG_IXL)
LD A,(R_77)
AND 7
.L1 CP NUM_ZXSCR
JP Z,WINW_ZX
CP NUM_TXTSCR
RET NZ
EXX
LD BC,WIN_P2
LD A,(PAGE4READ)
OUT (C),A
EXX
LD D,(IX+_X_COORD) ; X
LD E,(IX+_Y_COORD) ; Y
LD C,(IX+_COLOR_WIN) ; цвет окна
EXX
LD H,(IX+_V_SIZE) ; V
LD L,(IX+_H_SIZE) ; H
LD D,(IX+_FLAGS) ; FLAGS
EVOPORT WIN_P2,RAM_NMI
LD B,HIGH (WIN_P3)
LD A,VMODE7_0
OUT (C),A
EXX
PUSH DE
LD B," "
EXX
PUSH HL
WINT2 LD A,L
EXX
PUSH DE
WINT1 EX AF,AF'
CALL PRTSYMTXTMODE
INC D
EX AF,AF'
DEC A
JR NZ,WINT1
POP DE
INC E
EXX
DEC H
JR NZ,WINT2
POP HL
BIT B_DOWN_HEADER,D
EXX
POP DE
JR Z,TNIZ_RAMKA ; окно без нижнего заголовка
; рисуем нижнюю цветную полоску
PUSH DE
EXX
LD A,H
EXX
DEC A
ADD A,E
LD E,A
CALL COLOR_LINE
POP DE
JR TCENTR_RAMK
; рисуем нижнюю рамку
TNIZ_RAMKA EXX
BIT B_WINFRAME,D
EXX
JR NZ,TCENTR_RAMK
EXX
LD A,H
EXX
PUSH DE
DEC A
ADD A,E
LD E,A
; LD B,"└"
LD B,5+0xF2 ; левый нижний угол
CALL PRTSYMTXTMODE
; LD B,"─"
LD B,6+0xF2 ; нижний край
INC D
EXX
LD A,L
EXX
DEC A
DEC A
WINT04 EX AF,AF'
CALL PRTSYMTXTMODE
INC D
EX AF,AF'
DEC A
JR NZ,WINT04
; LD B,"┘"
LD B,7+0xF2 ; правый нижний угол
CALL PRTSYMTXTMODE
POP DE
TCENTR_RAMK EXX
BIT B_WINFRAME,D
EXX
JR NZ,TWERH_COLOR ; окно без рамки
; рисуем боковые рамки
EXX
LD A,H
EXX
DEC A
DEC A
; LD B,"│"
LD B,3+0xF2 ; левая сторона
INC E
PUSH DE
WINT01 EX AF,AF'
CALL PRTSYMTXTMODE
INC E
EX AF,AF'
DEC A
JR NZ,WINT01
POP DE
PUSH DE
EXX
LD A,L
EXX
ADD A,D
DEC A
LD D,A
EXX
LD A,H
EXX
DEC A
DEC A
LD B,4+0xF2 ; правая сторона окна
WINT02 EX AF,AF'
CALL PRTSYMTXTMODE
INC E
EX AF,AF'
DEC A
JR NZ,WINT02
POP DE
DEC E
TWERH_COLOR EXX
BIT B_UPHEADER,D
EXX
JR Z,TWERH_RAMK
; рисуем верхнюю цветную полосу
PUSH DE
CALL COLOR_LINE
POP DE
JR TRASCH
TWERH_RAMK EXX
BIT B_WINFRAME,D
EXX
JR NZ,TRASCH
; LD B,"┌"
LD B,0+0xF2 ; левый верхний угол
CALL PRTSYMTXTMODE
; LD B,"─"
LD B,1+0xF2 ; верхний край
EXX
LD A,L
EXX
DEC A
DEC A
PUSH DE
INC D
WINT3 EX AF,AF'
CALL PRTSYMTXTMODE
INC D
EX AF,AF'
DEC A
JR NZ,WINT3
; LD B,"┐"
LD B,2+0xF2 ; правый верхний угол
CALL PRTSYMTXTMODE
POP DE
TRASCH INC D
LD (TADRSTR_Y),DE
LD A,D
LD (TXNEW),A
LD A,(SYSFLAGS)
AND SYSFLAGS.M_RUN_FAT_DSK
JR NZ,TNOSET_MAIN
ROMCALL MAIN_MEM13,ROM_RST83
TNOSET_MAIN LD BC,WIN_P2
LD A,(PAGE4READ)
OUT (C),A
LD L,(IX+_ADR_TXT_L)
LD H,(IX+_ADR_TXT_H)
EVOPORT WIN_P2,RAM_NMI
EXX
BIT B_TEXT,D
EXX
RET NZ
ITPRINT_MESSAGE EXX
LD HL,0
LD (TEK_TEXT),HL
EVOPORT WIN_P2,RAM_NMI
LD A,(PAGE4READ)
LD H,A
OUT (C),H
LD L,0
EXX
TNEXT EXX
OUT (C),H
EXX
LD A,(HL)
INC HL
AND A
JP Z,STOP_TPRINTMSG
TPRINT CP 0x20
JP NC,TPRINTA
CP 3
JR Z,TNEXT
CP 9
JR NZ,TCOD0D
LD B,(HL)
INC HL
EXX
OUT (C),L
EXX
LD A,(TADRSTR_X)
ADD A,B
LD (TADRSTR_X),A
JP TNEXT
TCOD0D CP 0x0D
JR NZ,TCOD16
EXX
OUT (C),L
EXX
LD A,(TXNEW)
LD (TADRSTR_X),A
LD D,A
LD A,(TADRSTR_Y)
INC A
LD (TADRSTR_Y),A
LD E,A
JP TNEXT
TCOD16 CP 0x16
JR NZ,TCOD17
LD E,(HL)
INC HL
LD D,(HL)
INC HL
EXX
OUT (C),L
EXX
LD (TADRSTR_Y),DE
JP TNEXT
TCOD17 CP 0x17
JR NZ,TCOD1
LD C,(HL)
INC HL
LD A,C
EXX
OUT (C),L
EXX
LD (COLOR4SYM),A
JP TNEXT
TCOD1 CP 1
JR NZ,TCOD2
LD D,(IX+_X_COORD)
LD E,(IX+_Y_COORD)
INC D
EXX
OUT (C),L
EXX
LD (TADRSTR_Y),DE
JP TNEXT
TCOD2 CP 2
JP NZ,TNEXT
LD DE,(TEK_TEXT)
LD A,D
OR E
JR NZ,TCOD2_1
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD (TEK_TEXT),HL
EX DE,HL
JP TNEXT
TCOD2_1 LD HL,(TEK_TEXT)
LD DE,0
LD (TEK_TEXT),DE
JP TNEXT
TPRINT_A LD A,(RREG_A)
ITPRINT_A EX AF,AF'
ITPRINT_A1 EXX
LD BC,WIN_P2
LD A,(PAGE4READ)
LD H,A
LD L,0
EX AF,AF'
EXX
LD HL,STOP_PRINTA
TPRINTA EX AF,AF'
EXX
OUT (C),L
EXX
PUSH HL
LD HL,TADRSTR_Y
LD E,(HL)
INC HL
LD D,(HL)
INC (HL)
LD A,(COLOR4SYM)
LD C,A
EXX
LD A,VMODE7_0
OUT (C),A
EXX
LD H,E
LD L,0
LD E,D
LD A,D
LD D,L
SRL H
RR L
SRL H
RR L
SRL E
ADD HL,DE
AND 1
RRCA
RRCA
RRCA
RRCA
ADD A,HIGH (CPU2+LSYM)
LD D,A
LD E,LOW (CPU2+LSYM)
ADD HL,DE
EX AF,AF'
LD (HL),A
LD A,C
INC A
JP Z,TRINTA0
LD A,H
XOR 0x30
LD H,A
LD A,D
AND 0x10
RRCA
RRCA
RRCA
RRCA
ADD A,L
LD L,A
LD (HL),C
TRINTA0 EXX
OUT (C),L
EXX
POP HL
JP TNEXT
STOP_TPRINTMSG EXX
OUT (C),L
EXX
RET
; D-X E-Y B-символ C-цвет
COLOR_LINE LD A,C
PUSH AF
AND 7
RLCA
RLCA
RLCA
LD H,A
LD A,C
RRCA
RRCA
RRCA
AND 7
OR H
LD H,A
LD A,C
AND 0xC0
OR H
LD C,A
LD B," "
EXX
LD A,L
EXX
WINT03 EX AF,AF'
CALL PRTSYMTXTMODE
INC D
EX AF,AF'
DEC A
JR NZ,WINT03
POP AF
LD C,A
RET
; D-X E-Y -> DE=ATTR ADR HL=DISP ADR
TDISP_ATTR LD H,E
LD L,0
LD E,D
LD A,D
LD D,L
SRL H
RR L
SRL H
RR L
SRL E
ADD HL,DE
AND 1
RRCA
RRCA
RRCA
RRCA
ADD A,HIGH (CPU3+LSYM)
LD D,A
LD E,LOW (CPU3+LSYM)
ADD HL,DE ; HL=Адрес символа на текстмодном экране
LD E,H
LD A,H
XOR 0x30
LD D,A
LD A,E
AND 0x10
RRCA
RRCA
RRCA
RRCA
ADD A,L
LD E,A
RET
; печать символа на текстмодном экране
; D-X E-Y B-символ C-цвет
PRTSYMTXTMODE PUSH DE
PUSH HL
CALL TDISP_ATTR
LD (HL),B
LD A,C
INC A
JR Z,.L1
EX DE,HL
LD (HL),C
.L1 POP HL
POP DE
RET
WINW_ZX EXX
READ_7FFD
AND 8
RRCA
RRCA
RRCA
RRCA
LD D,A
LD BC,WIN_P2
LD A,(PAGE4READ)
OUT (C),A
LD A,(IX+_V_SIZE)
ADD A,A
ADD A,A
ADD A,A
LD E,A
EXX
LD C,(IX+_H_SIZE)
LD L,(IX+_Y_COORD)
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD IY,BUFTSC
ADD IY,DE
WINW3 LD A,(IX+_X_COORD)
ADD A,(IY+0)
LD E,A
LD A,(IY+1)
EXX
ADD A,D
EXX
LD D,A
AND 7
JR NZ,WINW4
LD B,C
LD A,D
RRCA
RRCA
RRCA
AND 3
ADD A,0x58
EXX
ADD A,D
EXX
LD H,A
LD L,E
LD A,(IX+_COLOR_WIN)
WINW5 LD (HL),A
INC L
DJNZ WINW5
WINW4 LD B,C
XOR A
WINW6 LD (DE),A
INC E
DJNZ WINW6
INC IY
INC IY
EXX
DEC E
EXX
JR NZ,WINW3
BIT B_ADR_PUNKT,(IX+_FLAGS)
JR Z,NIZ_RAMKA ; окно без нижнего заголовка
; рисуем нижнюю цветную полоску
LD DE,0xFFF0
ADD IY,DE
LD A,(IX+_X_COORD)
ADD A,(IY+0)
LD E,A
LD A,(IY+1)
RRCA
RRCA
RRCA
AND 3
ADD A,0x58
EXX
ADD A,D
EXX
LD D,A
LD B,C
LD L,(IX+_COLOR_WIN)
LD A,L
AND 7
RLCA
RLCA
RLCA
LD H,A
LD A,L
RRCA
RRCA
RRCA
AND 7
OR H
WINWN1 LD (DE),A
INC E
DJNZ WINWN1
LD DE,0x0E
ADD IY,DE
JR CENTR_RAMK
NIZ_RAMKA BIT B_ADR_NUMS_PUNKT,(IX+_FLAGS)
JR NZ,CENTR_RAMK ; окно без рамки
; рисуем нижнюю рамку
DEC IY
DEC IY
LD L,(IX+_X_COORD)
LD A,(IY+0)
ADD A,L
LD E,A
LD H,A
LD A,(IY+1)
EXX
ADD A,D
EXX
LD D,A
LD B,C
LD A,0xFF
NR1 LD (DE),A
INC E
DJNZ NR1
DEC E
DEC D
LD L,H
LD H,D
LD A,0x80
LD B,7
NR2 LD (HL),A
RLCA
LD (DE),A
RRCA
DEC H
DEC D
DJNZ NR2
CENTR_RAMK BIT B_ADR_NUMS_PUNKT,(IX+_FLAGS)
JR NZ,WERH_COLOR ; окно без рамки
; рисуем боковые рамки
EXX
LD A,(IX+_V_SIZE)
SUB 2
LD E,A
EXX
NR4 LD DE,0xFFF0
ADD IY,DE
LD L,(IX+_X_COORD)
LD A,(IY+0)
ADD A,L
LD E,A
LD A,(IY+1)
EXX
ADD A,D
EXX
LD D,A
LD A,E
LD H,D
ADD A,(IX+_H_SIZE)
DEC A
LD L,A
LD A,0x80
LD B,8
NR3 LD (DE),A
RLCA
LD (HL),A
RRCA
DEC H
DEC D
DJNZ NR3
EXX
DEC E
EXX
JR NZ,NR4
WERH_COLOR BIT B_UPHEADER,(IX+_FLAGS)
JR Z,WERH_RAMK ; без верхнего заголовка
; рисуем верхнюю цветную полосу
LD L,(IX+_Y_COORD)
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD IY,BUFTSC
ADD IY,DE
LD A,(IX+_X_COORD)
ADD A,(IY+0)
LD E,A
LD A,(IY+1)
RRCA
RRCA
RRCA
AND 3
ADD A,0x58
EXX
ADD A,D
EXX
LD D,A
LD B,C
LD L,(IX+_COLOR_WIN)
LD A,L
AND 7
RLCA
RLCA
RLCA
LD H,A
LD A,L
RRCA
RRCA
RRCA
AND 7
OR H
WINWW1 LD (DE),A
INC E
DJNZ WINWW1
JP RADUGA
WERH_RAMK BIT B_ADR_NUMS_PUNKT,(IX+_FLAGS)
JR NZ,RADUGA ; окно без рамки
; рисуем верхнюю рамку
WR4 LD DE,0xFFF0
ADD IY,DE
LD L,(IX+_X_COORD)
LD A,(IY+0)
ADD A,L
LD E,A
LD A,(IY+1)
EXX
ADD A,D
EXX
LD D,A
LD A,E
LD H,D
ADD A,(IX+_H_SIZE)
DEC A
LD L,A
LD A,0x80
LD B,7
WR3 LD (DE),A
RLCA
LD (HL),A
RRCA
DEC H
DEC D
DJNZ WR3
LD A,L
SUB E
LD B,A
INC B
LD A,0xFF
WR5 LD (DE),A
INC E
DJNZ WR5
RADUGA BIT B_UPHEADER,(IX+_FLAGS)
JR Z,RASCH
LD IY,BUFTSC
LD L,(IX+_Y_COORD)
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
ADD IY,DE
LD L,(IY+0)
LD A,(IY+1)
LD D,A
RRCA
RRCA
RRCA
AND 3
ADD A,0x58
EXX
ADD A,D
EXX
LD H,A
LD A,(IX+_X_COORD)
ADD A,(IX+_H_SIZE)
ADD A,L
LD L,A
LD E,A
LD A,(IX+_COLOR_WIN)
AND 0x47
LD C,A
AND 0x40
LD B,A
DEC L
LD A,C
ADD A,5*8
LD (HL),A ; 5*8+7
DEC L
LD A,4*8+5
OR B
LD (HL),A ; 4*8+5
DEC L
LD A,6*8+4
OR B
LD (HL),A ; 6*8+4
DEC L
LD A,2*8+6
OR B
LD (HL),A ; 2*8+6
DEC L
LD A,C
AND 7
RLCA
RLCA
RLCA
OR B
ADD A,2
LD (HL),A ; 7*8+2
EX DE,HL
DEC L
LD B,8
XOR A
LD C,L
RADUGA1 SCF
RLA
LD (HL),A
DEC L
LD (HL),A
DEC L
LD (HL),A
DEC L
LD (HL),A
DEC L
LD (HL),A
LD L,C
INC H
DJNZ RADUGA1
RASCH LD A,(IX+_X_COORD)
LD L,(IX+_Y_COORD)
ADD A,A
ADD A,A
ADD A,A
LD H,A
INC H
EXX
EVOPORT WIN_P2,RAM_NMI
EXX
LD A,H
LD (XNEW),A
LD (ADRSTR_Y),HL
EXX
LD A,(PAGE4READ)
OUT (C),A
EXX
LD L,(IX+_ADR_TXT_L)
LD H,(IX+_ADR_TXT_H)
EXX
EVOPORT WIN_P2,RAM_NMI
EXX
BIT B_TEXT,(IX+_FLAGS)
JP Z,IPRINT_MESSAGE
RET
CLS LD HL,0
LD D,H
LD E,L
ADD HL,SP
LD B,0x60
LD SP,0x5800
CLS1
REPT 0x20
PUSH DE
ENDM
DJNZ CLS1
LD SP,HL
CLSSCR LD HL,0
LD D,A
LD E,A
ADD HL,SP
LD SP,0x5B00
LD B,12
CLS2
REPT 0x20
PUSH DE
ENDM
DJNZ CLS2
LD SP,HL
RRCA
RRCA
RRCA
AND 7
OUT (0xFE),A
RET
STOP_PRINTMSG
EVOPORT WIN_P2,RAM_NMI
RET
; печать текстовой строки с управляющими кодами (внешний вызов)
PRINT_MESSAGE LD HL,(RREG_L)
; печать текстовой строки с управляющими кодами (внутренний вызов)
IPRINT_MESSAGE LD A,(R_77)
AND 7
CP 7
JP Z,ITPRINT_MESSAGE
CP 3
RET NZ
READ_7FFD
AND 8
LD BC,BUFTSC
JR Z,IPM1
LD BC,BUFTSC1
IPM1 LD (TEKBUFTSC),BC
LD BC,WIN_P2
; печать текстовой стороки с управляющими кодами (внутренний вызов)
NEXT LD A,(PAGE4READ)
OUT (C),A
LD A,(HL)
INC HL
AND A
JR Z,STOP_PRINTMSG
PRINT CP 0x20
JP NC,PRINTA
COD03 CP 3
JR NZ,COD9
LD D,0 ; центровка строки в окне
LD A,H
EX AF,AF'
LD E,L
CEN2 LD A,(HL)
CP 0x20
JR C,CEN3
LD A,6
ADD A,D
LD D,A
INC HL
JR CEN2
CEN3
EVOPORT WIN_P2,RAM_NMI
LD A,(IX+_H_SIZE)
ADD A,A
ADD A,A
ADD A,A
SUB D
SRL A
DEC A
LD H,A
LD A,(XNEW)
ADD A,H
LD (ADRSTR_X),A
EX AF,AF'
LD H,A
LD L,E
JP NEXT
COD9 CP 9
JR NZ,COD0D
LD D,(HL) ; табуляция на N позиций
INC HL
LD A,D
ADD A,A
ADD A,D
ADD A,A
LD D,A
EVOPORT WIN_P2,RAM_NMI
LD A,(ADRSTR_X)
ADD A,D
LD (ADRSTR_X),A
JR NEXT
COD0D CP 0x0D
JR NZ,COD16
EVOPORT WIN_P2,RAM_NMI
LD A,(XNEW) ; перевод строки
LD (ADRSTR_X),A
LD A,(ADRSTR_Y)
INC A
LD (ADRSTR_Y),A
JP NEXT
COD16 CP 0x16
JR NZ,COD17
LD E,(HL) ; печать в указанной позиции
INC HL
LD D,(HL)
INC HL
EVOPORT WIN_P2,RAM_NMI
LD (ADRSTR_Y),DE
JP NEXT
COD17 CP 0x17
JR NZ,COD1
LD D,(HL)
INC HL
EVOPORT WIN_P2,RAM_NMI
LD A,D
LD (COLOR4SYM),A
JP NEXT
; координата печати в исходную позицию окна
COD1 CP 1
JP NZ,NEXT
EVOPORT WIN_P2,RAM_NMI
LD A,(IX+_X_COORD)
LD E,(IX+_Y_COORD)
ADD A,A
ADD A,A
ADD A,A
INC A
LD D,A
LD (ADRSTR_Y),DE
JP NEXT
PRINT_A LD A,(RREG_A)
IPRINT_A EX AF,AF'
LD A,(R_77)
AND 7
CP 7
JP Z,ITPRINT_A1
CP 3
RET NZ
EX AF,AF'
LD BC,WIN_P2
LD HL,STOP_PRINTA
; печать символа в "A"
PRINTA EX AF,AF'
EVOPORT WIN_P2,RAM_NMI
PUSH HL
LD H,A
EX AF,AF'
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,CHARS
ADD HL,DE
LD A,(COLOR4SYM)
LD D,A
EXX
LD HL,(ADRSTR_Y) ; H=X L=Y
LD B,0
LD D,B
LD A,H
AND 7
LD C,A
LD IY,SDVIG
ADD IY,BC
LD A,H
AND 0xF8
RRCA
RRCA
RRCA
EX AF,AF'
LD A,6
ADD A,H
LD H,A
LD (ADRSTR_Y),HL
LD A,L
RLCA
RLCA
RLCA
LD E,A
LD HL,(TEKBUFTSC)
ADD HL,DE
ADD HL,DE
EX AF,AF'
ADD A,(HL)
INC HL
LD E,A
LD D,(HL)
LD HL,BUFMSK
ADD HL,BC
ADD HL,BC
LD B,(HL)
INC HL
LD C,(HL)
EXX
LD A,(PAGE4READ)
OUT (C),A
EXX
LD A,8
SLEDU EX AF,AF'
EXX
LD A,(HL)
INC HL
EXX
LD L,A
LD H,0
JP (IY)
SDVIG
REPT 8
ADD HL,HL
ENDM
LD A,(DE)
AND B
OR H
LD (DE),A
INC E
LD A,(DE)
AND C
OR L
LD (DE),A
DEC E
INC D
EX AF,AF'
DEC A
JP NZ,SLEDU
EX DE,HL
EXX
LD A,D
EXX
LD E,A
INC A
JR Z,PRINTA1
DEC H
LD A,H
RRCA
RRCA
RRCA
AND 3
OR 0x58
LD H,A
LD (HL),E
PRINTA1 EXX
EVOPORT WIN_P2,RAM_NMI
POP HL
JP NEXT
STOP_PRINTA DB 0
BUFMSK DB %00000011,%11111111
DB %10000001,%11111111
DB %11000000,%11111111
DB %11100000,%01111111
DB %11110000,%00111111
DB %11111000,%00011111
DB %11111100,%00001111
DB %11111110,%00000111
; рисовалка цветной полоски в меню
COLOR_CURSOR LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
JP Z,COLORCURS4
EVOPORT WIN_P3,VMODE7_0
LD B,(IX+_H_SIZE)
LD DE,(COL_CURSOR)
CALL TRESTORE_CLINE
COLORCURS6 LD A,(IX+_NUM_PKT)
BIT B_ADR_PUNKT,A
JR Z,COLORCURS5
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
LD A,(HL)
COLORCURS5 LD D,(IX+_X_COORD)
ADD A,(IX+_Y_COORD)
LD E,A
INC E
LD (COL_CURSOR),DE
EVOPORT WIN_P3,VMODE7_0
LD B,(IX+_H_SIZE)
CALL TSTORE_CLINE
LD A,(IX+_COLOR_CUR)
AND 0xF8
LD C,A
PUSH HL
PUSH DE
PUSH BC
LD (COL_CURSOR),DE
CALL TDISP_ATTR
LD A,D
XOR 0x10
LD H,A
LD A,D
AND 0x10
RRCA
RRCA
RRCA
RRCA
ADD A,E
LD L,A
TCOLORLINE2 EX DE,HL
LD A,(HL)
AND 0xC7
OR C
LD (HL),A
INC HL
DJNZ TCOLORLINE2
POP BC
POP DE
POP HL
RET
; рисование цветной полосы
; D-X E-Y B-длина C-цвет
TCOLOR_LINE PUSH HL
PUSH DE
PUSH BC
LD (COL_CURSOR),DE
CALL TDISP_ATTR
LD A,D
XOR 0x10
LD H,A
LD A,D
AND 0x10
REPT 4
RRCA
ENDM
ADD A,E
LD L,A
TCOLORLINE1 EX DE,HL
LD (HL),C
INC HL
DJNZ TCOLORLINE1
POP BC
POP DE
POP HL
RET
; 00 01 02 03 04 05 06
; F1C0 E1C1 F1C1 E1C2 F1C2 E1C3 F1C3
; сохранение части экрана для вывода цветной линии
; D-X E-Y B-длина
TSTORE_CLINE PUSH HL
PUSH DE
PUSH BC
CALL TDISP_ATTR
LD A,D
XOR 0x10
LD H,A
LD A,D
AND 0x10
REPT 4
RRCA
ENDM
ADD A,E
LD L,A
TSTORECLINE1 EXX
LD HL,COLBUF
EXX
TSTORECLINE2 EX DE,HL
LD A,(HL)
INC HL
EXX
LD (HL),A
INC HL
EXX
DJNZ TSTORECLINE2
POP BC
POP DE
POP HL
RET
; восстановление части экрана под цветной линией
; D-X E-Y B-длина
TRESTORE_CLINE PUSH HL
PUSH DE
PUSH BC
LD B,(IX+_H_SIZE)
LD DE,(COL_CURSOR)
CALL TDISP_ATTR
LD A,D
XOR 0x10
LD H,A
LD A,D
AND 0x10
REPT 4
RRCA
ENDM
ADD A,E
LD L,A
TRESTCLINE1 EXX
LD HL,COLBUF
EXX
TRESTCLINE2 EX DE,HL
EXX
LD A,(HL)
INC HL
EXX
LD (HL),A
INC HL
DJNZ TRESTCLINE2
POP BC
POP DE
POP HL
RET
RESTORE_CLINE LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
JR NZ,TREST_CLINE
LD DE,(COL_CURSOR)
LD HL,COLBUF
LD C,(IX+_H_SIZE)
LD B,0
LDIR
RET
TREST_CLINE
EVOPORT WIN_P3,VMODE7_0
LD B,(IX+_H_SIZE)
LD DE,(COL_CURSOR)
JP TRESTORE_CLINE
COLORCURS4 LD DE,(COL_CURSOR)
LD HL,COLBUF
LD C,(IX+_H_SIZE)
; BIT 2,(IY+55) ; файлов больше высоты окна?
; JR Z,COLCURS1
; DEC C ; цветная полоска на 1 короче
COLCURS1 LD B,0
LDIR
SET_ADR_ATR
EVOPORT WIN_P3,VMODE7_0
LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
JP NZ,COLORCURS6
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,COLCURS3
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
LD A,(HL)
COLCURS3 LD H,(IX+_X_COORD)
LD L,(IX+_Y_COORD)
ADD A,L
LD L,A
INC L
CALL ADRDIS
EX DE,HL
LD (COL_CURSOR),HL ; положили адрес для восстановления цвета
LD DE,COLBUF
LD B,(IX+_H_SIZE)
; BIT 2,(IY+55) ; файлов больше высоты окна?
; JR Z,COLCURS2
; DEC B ; цветная полоска на 1 короче
COLCURS2 LD C,(IX+_COLOR_CUR)
.L1 LD A,(HL)
LD (DE),A
LD (HL),C
INC L
INC E
DJNZ .L1
RET
; H-X, L-Y
ADRDIS LD C,A
LD A,L
AND 0x18
OR 0x40
EX AF,AF'
LD A,L
AND 7
RRCA
RRCA
RRCA
ADD A,H
LD L,A
EX AF,AF'
LD H,A
LD E,L
ADRATR LD A,H
RRCA
RRCA
RRCA
AND 3
OR 0x58
LD D,A
LD A,C
RET
INC_H INC H
LD A,H
AND 7
RET NZ
LD A,L
ADD A,0x20
LD L,A
RET C
UMEHL1 LD A,H
SUB 8
LD H,A
RET
; сдвиг окна вверх
SCRUP LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
JP NZ,TSCRUP
; сдвиг окна вверх (ZX)
PUSH IY
PUSH IX
EXX
LD A,(SCROLL_MODE)
LD E,A
EXX
LD L,(IX+_Y_COORD)
INC L
CALL USTAN
; сдвиг пикселей вверх
SCRUP1 LD A,(IX+0x10)
ADD A,C
LD L,A
LD H,(IX+0x11)
LD A,(IX+0)
ADD A,C
LD E,A
LD D,(IX+1)
PUSH BC
CALL LDIST
POP BC
EXX
LD A,E
EXX
AND 1;A
JR Z,SCRUP2
LD A,(IX+0x11)
LD H,A
AND 7
CP 7
JR NZ,SCRUP2
; сдвиг вверх цветовой строки после переноса 7 линий знакоряда
LD A,H
RRCA
RRCA
RRCA
AND 3
OR 0x58
LD H,A
LD L,(IX+0x10)
LD A,(IX+1)
RRCA
RRCA
RRCA
AND 3
OR 0x58
LD D,A
LD E,(IX+0)
PUSH BC
CALL LDIST
POP BC
SCRUP2 INC IX
INC IX
DJNZ SCRUP1
SCRUP3 POP IX
POP IY
RET
; сдвиг окна вверх (TXT)
TSCRUP PUSH IY
PUSH IX
EVOPORT WIN_P3,VMODE7_0
LD A,(IX+_V_SIZE)
SUB 3
LD B,A ; сколько строк в окне скроллировать
LD C,(IX+_H_SIZE) ; ширина окна
LD D,(IX+_X_COORD) ; X координата левого верхнего угла для скроллера
LD E,(IX+_Y_COORD)
INC E ; Y координата левого верхнего угла для скроллера
LD A,E
ADD A,A
ADD A,A
EXX
LD C,A
LD B,0
LD IX,TBUFTSC
ADD IX,BC ; IX=список адресов начал строк для скроллера
EXX
LD A,C
AND 0xFE
NEG
LD H,A ; ширина для левый символов
LD L,A ; ширина для правых символов
BIT 0,C
JR Z,TSCRUP1 ; если ширина четная, ничего не делаем
DEC L
DEC L
BIT 0,D
JR NZ,TSCRUP1
LD A,H
LD H,L
LD L,A
TSCRUP1 LD A,D
SRL A
LD D,A
ADC A,0
LD E,A
TSCRUP2 LD A,H
EXX
LD IY,LDI_END
LD E,A
LD D,0xFF
ADD IY,DE
EXX
LD A,E
EXX
LD E,A
ADD A,(IX+4)
LD L,A
LD H,(IX+5)
LD A,E
ADD A,(IX+0)
LD E,A
LD D,(IX+1)
CALL LDIST ; перенос монохромнойй строки
EXX
LD A,E
EXX
LD E,A
ADD A,(IX+4+100)
LD L,A
LD H,(IX+5+100)
LD A,E
ADD A,(IX+0+100)
LD E,A
LD D,(IX+1+100)
CALL LDIST ; перенос цветной строки
EXX
LD A,L
EXX
LD IY,LDI_END
LD E,A
LD D,0xFF
ADD IY,DE
EXX
LD A,D
EXX
LD E,A
ADD A,(IX+6)
LD L,A
LD H,(IX+7)
LD A,E
ADD A,(IX+2)
LD E,A
LD D,(IX+3)
CALL LDIST ; перенос монохромной строки
EXX
LD A,D
EXX
LD E,A
ADD A,(IX+6+100)
LD L,A
LD H,(IX+7+100)
LD A,E
ADD A,(IX+2+100)
LD E,A
LD D,(IX+3+100)
CALL LDIST ; перенос строки цвета
REPT 4
INC IX
ENDM
EXX
DJNZ TSCRUP2
POP IX
POP IY
RET
;0 2 4 6 8
; 1 3 5 7 9
; ===== 3 нечет + 2 чет
;===== 2 нечет + 3 чет
; ==== 2 нечет + 2 чет
;==== 2 нечет + 2 чет
;0 2 4 6 8
; 1 3 5 7 9
;C200 C201 C202 C203 C204
; D200 D201 D202 D203 D204
;----------------------------------------
;C240 C241 C242 C243 C244
; D240 D241 D242 D243 D244
; сдвиг окна вниз
TSCRDN DI
PUSH IX
PUSH IY
EVOPORT WIN_P3,VMODE7_0
LD A,(IX+_V_SIZE)
SUB 3
LD B,A ; сколько строк в окне скроллировать
LD C,(IX+_H_SIZE) ; ширина окна
LD D,(IX+_X_COORD) ; X координата левого верхнего угла для скроллера
LD A,(IX+_Y_COORD)
ADD A,(IX+_V_SIZE)
SUB 2
LD E,A ; Y координата левого верхнего угла для скроллера
ADD A,A
ADD A,A
EXX
LD C,A
LD B,0
LD IX,TBUFTSC
ADD IX,BC ; IX=список адресов начал строк для скроллера
EXX
LD A,C
AND 0xFE
NEG
LD H,A ; ширина для левый символов
LD L,A ; ширина для правых символов
BIT 0,C
JR Z,TSCRDN1
DEC L
DEC L
BIT 0,D
JR NZ,TSCRDN1
LD A,H
LD H,L
LD L,A
TSCRDN1 LD A,D
SRL A
LD D,A
ADC A,0
LD E,A
TSCRDN2
REPT 4
DEC IX
ENDM
LD A,H
EXX
LD IY,LDI_END
LD E,A
LD D,0xFF
ADD IY,DE
EXX
LD A,E
EXX
LD E,A
ADD A,(IX+0)
LD L,A
LD H,(IX+1)
LD A,E
ADD A,(IX+4)
LD E,A
LD D,(IX+5)
CALL LDIST ; перенос мохоромной строки
EXX
LD A,E
EXX
LD E,A
ADD A,(IX+0+100)
LD L,A
LD H,(IX+1+100)
LD A,E
ADD A,(IX+4+100)
LD E,A
LD D,(IX+5+100)
CALL LDIST ; перенос цветной строки
EXX
LD A,L
EXX
LD IY,LDI_END
LD E,A
LD D,0xFF
ADD IY,DE
EXX
LD A,D
EXX
LD E,A
ADD A,(IX+2)
LD L,A
LD H,(IX+3)
LD A,E
ADD A,(IX+6)
LD E,A
LD D,(IX+7)
CALL LDIST ; перенос монохромной строки
EXX
LD A,D
EXX
LD E,A
ADD A,(IX+2+100)
LD L,A
LD H,(IX+3+100)
LD A,E
ADD A,(IX+6+100)
LD E,A
LD D,(IX+7+100)
CALL LDIST ; перенос цветной строки
EXX
DJNZ TSCRDN2
POP IY
POP IX
RET
SCRDN LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
JP NZ,TSCRDN
; скролл окна вверх (ZX)
PUSH IX
PUSH IY
EXX
LD A,(SCROLL_MODE)
LD E,A
EXX
LD A,(IX+_V_SIZE)
ADD A,(IX+_Y_COORD)
SUB 2
LD L,A
CALL USTAN
DEC IX
DEC IX
SCRDN1 LD A,(IX+0)
ADD A,C
LD L,A
LD H,(IX+1)
LD A,(IX+0x10)
ADD A,C
LD E,A
LD D,(IX+0x11)
PUSH BC
CALL LDIST
POP BC
EXX
LD A,E
EXX
AND 1;A
JR Z,SCRDN2
LD A,(IX+1)
LD H,A
AND 7
CP 7
JR NZ,SCRDN2
LD A,H
RRCA
RRCA
RRCA
AND 3
OR 0x58
LD H,A
LD L,(IX+0)
LD A,(IX+0x11)
RRCA
RRCA
RRCA
AND 3
OR 0x58
LD D,A
LD E,(IX+0x10)
PUSH BC
CALL LDIST
POP BC
SCRDN2 DEC IX
DEC IX
DJNZ SCRDN1
POP IY
POP IX
RET
; установки для скроллера окна
USTAN LD A,(IX+_H_SIZE)
ADD A,A
LD E,A
LD A,L
LD D,0
LD HL,LDI_END
AND A
SBC HL,DE
PUSH HL
POP IY
LD C,(IX+_X_COORD)
LD L,A
LD A,(IX+_V_SIZE)
SUB 3
ADD A,A
ADD A,A
ADD A,A
LD B,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD IX,BUFTSC
EX DE,HL
ADD IX,DE
ADD IX,DE
RET
LDIST JP (IY)
REPT 80
LDI
ENDM
LDI_END RET
SYM00 DB %11111111
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
SYM01 DB %11111111
DB %00000000
DB %00000000
DB %00000000
DB %00000000
DB %00000000
DB %00000000
DB %00000000
SYM02 DB %11111111
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
SYM03 DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
SYM04 DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
SYM05 DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %10000000
DB %11111111
SYM06 DB %00000000
DB %00000000
DB %00000000
DB %00000000
DB %00000000
DB %00000000
DB %00000000
DB %11111111
SYM07 DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %00000001
DB %11111111
END_MAGICSYM
;ICO_MOUSE0 DB %00111111,%00000000;3F,00
; DB %00011111,%01000000;1F,40
; DB %00001111,%01100000;0F,60
; DB %00000111,%01010000;07,50
; DB %00000011,%01001000;03,48
; DB %00000001,%01001100;01,4C
; DB %00000001,%01110000;01,70
; DB %00000111,%00000000;07,00
;ICO_MOUSE1 DB %00111111,%00000000;3F,00
; DB %00011111,%01000000;1F,40
; DB %00001111,%01100000;0F,60
; DB %00000111,%01110000;07,70
; DB %00000011,%01111000;03,78
; DB %00000001,%01111100;01,7C
; DB %00000001,%01110000;01,70
; DB %00000111,%00000000;07,00