;LAST UPDATE: 12.09.2022 savelij
;ОПИСАТЕЛЬ ОКНА (АДРЕС В IX)
;+00 X КООРДИНАТА
;+01 Y КООРДИНАТА
;+02 V ВЫСОТА
;+03 H ШИРИНА
;+04 C ЦВЕТ
;+05 C ЦВЕТ КУРСОРА
;+06 F ФЛАГОВЫЙ
;+07 N НОМЕР ПУНКТА В ОКНЕ
; БИТ 7-0=БАЙТЫ 8-9 ТЕКУЩИЙ ПУНКТ МЕНЮ,
; 1=БАЙТЫ 8-9 АДРЕС ХРАНЕНИЯ
;+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 КОД КЛАВИШИ
;[ГЕНЕРАЦИЯ ТАБЛИЦЫ АДРЕСОВ ЛИНИЙ ZX ЭКРАНА]
ADRTSC LD B,0X18
LD DE,0X4000
LD HL,BUFTSC
ADRTSC2 LD C,8
ADRTSC1 LD (HL),E
INC HL
LD (HL),D
INC HL
INC D
DEC C
JR NZ,ADRTSC1
LD A,0X20
ADD A,E
LD E,A
JR C,ADRTSC3
LD A,D
SUB 8
LD D,A
ADRTSC3 DJNZ ADRTSC2
RET
;[CLS]
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
;[СЛЕДУЮЩАЯ СТРОКА ZX ЭКРАНА]
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
;[ПРЕДЫДУЩАЯ СТРОКА ZX ЭКРАНА]
DEC_H DEC H
LD A,H
AND 7
CP 7
RET NZ
LD A,L
SUB 0X20
LD L,A
RET C
UVEHL1 LD A,H
ADD A,8
LD H,A
RET
UVEHL LD A,0X20
ADD A,L
LD L,A
RET NC
JR UVEHL1
UMEHL LD A,L
SUB 0X20
LD L,A
RET NC
JR UMEHL1
;[РИСОВАНИЕ ОКНА (GLUK)]
DRAWWIN LD C,(IX+_X_COORD) ;X
LD B,(IX+_Y_COORD) ;Y
EX DE,HL
LD A,C
ADD A,A
ADD A,A
ADD A,A
LD C,A
LD A,B
ADD A,A
ADD A,A
ADD A,A
CALL 0X22B0
EX DE,HL
PUSH IX
POP HL
INC HL
INC HL
INC HL
LD B,(HL) ;ШИРИНА-1
INC HL
DEC B
LD A,(HL)
INC HL
LD (COL_SYM),A ;ЦВЕТ ОКНА
PUSH DE
LD C,B
CALL PR32
DEC C
JR NZ,$-4
CALL PR3232
POP DE
PUSH DE
CALL NXCOLLN ;C=0
CALL PRTX
INC HL
PUSH BC
CALL PR32
DJNZ $-3
POP BC
LD A,C ;НАПЕЧАТАНО СТРОК
ADD A,A
ADD A,A
ADD A,A
ADD A,6+8
LD D,A
LD A,B
ADD A,A
ADD A,A
ADD A,A
ADD A,0X10*WIDE+0X0D-0X10
LD E,A
POP HL
INC H
LD C,0X40
PUSH BC
PUSH HL
LD B,E
CALL HORLN
LD B,D
CALL VERLN
POP HL
POP BC
LD B,D
CALL VERLN
LD B,E
HORLN LD A,(HL)
HORLN0 OR C
RRC C
JR NC,$+5
LD (HL),A
INC L
LD A,(HL)
DJNZ HORLN0
OR C
LD (HL),A
RET
VERLN0 CALL INC_H
VERLN LD A,(HL)
OR C
LD (HL),A
DJNZ VERLN0
RET
NXCOLLN LD A,E
ADD A,0X20
LD E,A
RET NC
LD A,D
ADD A,8
LD D,A
RET
PRSP0 LD A,(HL)
INC HL
PUSH DE
PUSH HL
LD H,(HL)
LD L,A
CALL PRT_HL_
POP HL
POP DE
INC HL
CALL NXCOLLN
DJNZ PRSP0
RET
;[ПЕЧАТЬ В HEX 16-ГО ЧИСЛА]
PRT_HL_ LD A,H
CALL PRT_A_
LD A,L
;[ПЕЧАТЬ В HEX 8-ГО ЧИСЛА]
PRT_A_ PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL $+4
POP AF
AND 0X0F
CP 0X0A
CCF
ADC A,"0"
DAA
PRSN AND 0X7F
PRSYM CP 0X20
JR NC,PRSYM1
CP 0X80
JR C,PRSYM1
LD A,"."
PRSYM1 PUSH DE
PUSH BC
PUSH HL
ADD A,A
LD L,A
LD H,0X0F
ADD HL,HL
ADD HL,HL
LD B,4
PRSN0 LD A,(HL)
RRCA
OR (HL)
INC L
EX DE,HL
LD (HL),A
INC H
EX DE,HL
LD A,(HL)
RRCA
OR (HL)
INC L
EX DE,HL
LD (HL),A
INC H
EX DE,HL
DJNZ PRSN0
POP HL
PR32Q POP BC
LD A,D
RRCA
RRCA
RRCA
ADD A,0X4F
LD D,A
LD A,7
COL_SYM EQU $-1 ;ЦВЕТ СИМВОЛА
LD (DE),A
POP DE
INC E
RET NZ
LD A,D
ADD A,8
LD D,A
RET
PR3232 CALL PR32
PR32 PUSH DE
PUSH BC
XOR A
REPT 4
LD (DE),A
INC D
LD (DE),A
INC D
ENDM
JR PR32Q
PRCR CALL PR3232
PRCRDE LD DE,0
CALL NXCOLLN
INC C
PRTX LD (PRCRDE+1),DE
CALL PR3232
PRTX0 LD A,(HL)
CP 0XFF
RET Z
CALL PRSN
BIT 7,(HL)
INC HL
JR Z,PRTX0
JR PRCR
;[ПЕЧАТЬ ТЕКСТА]
PRINT_MSG PUSH HL
LD A,D
CALL 0X0E9E ;HL=ADRLN,D:=A
LD A,E
ADD A,L
LD L,A
EX DE,HL
POP HL
PRTXT LD A,(HL)
INC HL
CP 0XFF
RET Z
CALL PRSN
JR PRTXT
REST_COLOR LD DE,(COL_CURSOR)
LD HL,COLBUF
LD C,(IX+_H_SIZE)
BIT 2,(IY+55) ;ФАЙЛОВ БОЛЬШЕ ВЫСОТЫ ОКНА?
JR Z,RESTCOL1
DEC C ;ЦВЕТНАЯ ПОЛОСКА НА 1 КОРОЧЕ
RESTCOL1 LD B,0
LDIR
RET
REST_COLCURS LD DE,(COL_CURSOR)
LD HL,COLBUF
LD C,(IX+_H_SIZE)
LD B,0
LDIR
RET
;[РИСОВАЛКА ЦВЕТНОЙ ПОЛОСКИ В МЕНЮ]
COLOR_CURSOR LD DE,0
COL_CURSOR EQU $-2
LD HL,COLBUF
LD C,(IX+_H_SIZE)
COLCURS1 LD B,0
LDIR
SET_ADR_ATR LD A,(IX+_NUM_PKT)
LD B,A
LD H,(IX)
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)
COLCURS2 LD C,(IX+_COLOR_CUR)
LD A,(HL)
LD (DE),A
LD (HL),C
INC L
INC E
DJNZ $-5
RET
;[ПЕЧАТЬ СИМВОЛА]
PRT_SYM PUSH HL
PUSH DE
EX DE,HL
CALL ADRDIS
EX DE,HL
ADD A,A
LD L,A
LD H,0X0F
ADD HL,HL
ADD HL,HL
REPT 8
LD A,(HL)
RRCA
OR (HL)
LD (DE),A
INC L
INC D
ENDM
POP DE
POP HL
INC D
RET
PRTSPECSYM PUSH HL
PUSH DE
EX DE,HL
CALL ADRDIS
EX DE,HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,L
ADD A,LOW (ICON)
LD L,A
ADC A,HIGH (ICON)
SUB L
LD H,A
REPT 8
LD A,(HL)
LD (DE),A
INC HL
INC D
ENDM
POP DE
POP HL
INC D
RET
;[CURSOR_UP]
CURSOR_UP LD C,(IX+_TEK_PKT_L)
LD B,(IX+_TEK_PKT_H)
LD A,B
OR C
RET Z
DEC BC
LD (IX+_TEK_PKT_L),C
LD (IX+_TEK_PKT_H),B
LD A,(IX+_NUM_PKT)
AND A
JR Z,CURSOR_UP1
DEC (IX+_NUM_PKT)
JP COLOR_CURSOR
CURSOR_UP1 CALL REST2X2
; CALL REST_COLCURS
; LD A,1
XOR A
RST8 _SCROLL_DOWN
; CALL SET_ADR_ATR
LD E,(IX+_Y_COORD)
INC E
DOWN1 LD D,(IX+_X_COORD)
INC D
INC D
LD HL,ERS_FLAGS
BIT B_RUN_FAT,(HL)
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
JR NZ,DOWN3
LD BC,ADR_CAT
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,BC
DOWN4 CALL FILENAME8_3
LD A,(ERS_FLAGS)
AND M_MOUSE_ON ;ПРОВЕРКА НАЛИЧИЯ МЫШИ
RET Z
JP DRAW_MOUSE
DOWN3 LD BC,ADR_CAT_FAT
DEC D
ADD HL,HL
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
PUSH DE
LD A,6
RST8 _COM_FAT,_POS_FILES
LD HL,BUF_FILEITEM
RST8 _COM_FAT,_READ_DIR
LD BC,0X0B
ADD HL,BC
LD A,(HL)
SBC HL,BC
AND 0X10
LD A,0
JR NZ,DOWN5
LD A,1
DOWN5 POP DE
CALL PRTSPECSYM
LD HL,OUT_NAME_FILET
RST8 _COM_FAT,_GET_LONGNAME
LD (LONG_NAME),A
JR DOWN4
;[CURSOR_DOWN]
CURSOR_DOWN LD C,(IX+_TEK_PKT_L)
LD B,(IX+_TEK_PKT_H)
LD L,(IX+_NUM_KOL_L)
LD H,(IX+_NUM_KOL_H)
LD A,H
OR L
RET Z
SCF
SBC HL,BC
RET Z
INC BC
LD (IX+_TEK_PKT_L),C
LD (IX+_TEK_PKT_H),B
LD A,(IX+_V_SIZE)
SUB 3
CP (IX+_NUM_PKT)
JR Z,CURSOR_DOWN1
INC (IX+_NUM_PKT)
JP COLOR_CURSOR
CURSOR_DOWN1 CALL REST2X2
; CALL REST_COLCURS
; LD A,1
XOR A
RST8 _SCROLL_UP
; CALL SET_ADR_ATR
LD A,(IX+_Y_COORD)
ADD A,(IX+_V_SIZE)
SUB 2
LD E,A
JP DOWN1
GET_XY LD E,(IX+_NUM_KOL_L)
LD D,(IX+_NUM_KOL_H) ;КОЛ-ВО
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H) ;НОМЕР
LD A,(IX+_V_SIZE)
SUB 3
LD C,A
LD B,0
LD A,D
OR E
LD A,C
RET
;[ПЕРЕМЕЩЕНИЕ НА СТРАНИЦУ ВВЕРХ]
PAGEUP CALL GET_XY
RET Z
XOR A
SBC HL,BC
EX DE,HL
JR NC,PDUN0
PDU0 LD D,A
LD E,A
JR PDUN0
;[ПЕРЕМЕЩЕНИЕ НА СТРАНИЦУ ВНИЗ]
PAGEDN CALL GET_XY
RET Z
EX DE,HL
AND A
SBC HL,BC
ADD HL,BC
EX DE,HL
JR NC,PDN00
DEC DE
LD A,E
JR PDUN0
PDN00 ADD HL,BC
EX DE,HL
SBC HL,DE
ADD HL,DE
JR Z,PDUN1
JR NC,PDUN0
PDUN1 EX DE,HL
DEC DE
PDUN0 LD (IX+_NUM_PKT),A
LD (IX+_TEK_PKT_L),E
LD (IX+_TEK_PKT_H),D
CALL REST2X2
CALL OUT_TEK_DIR
LD A,(ERS_FLAGS)
AND M_MOUSE_ON ;ПРОВЕРКА НАЛИЧИЯ МЫШИ
RET Z
JP DRAW_MOUSE
;[ВЫЧИСЛЕНИЕ АДРЕСА В ZX ЭКРАНЕ]
;H-X, L-Y
ADRDIS LD (ASD+1),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
ASD LD A,0
RET
;[УСТАНОВКА АДРЕСА РИСОВАНИЯ ИНДИКАТОРНОЙ ПОЛОСКИ]
SETWIN_INDICAT PUSH HL
PUSH DE
LD H,(IX+_X_COORD)
INC H
ADD A,(IX+_Y_COORD)
LD L,A
CALL ADRDIS
LD (ADRSTARTIND),DE
POP DE
POP HL
RET
;[РИСОВАНИЕ СЛЕДУЮЩЕГО ЦВЕТНОГО КВАДРАТИКА]
INC_INDICAT PUSH HL
LD HL,0
ADRSTARTIND EQU $-2
LD (HL),0X39
INC HL
LD (ADRSTARTIND),HL
POP HL
RET
;[ВОССТАНОВЛЕНИЕ ЧАСТИ ЭКРАНА ПОД ОКНОМ]
WIN_RESTORE
; BIT 3,(IX-1)
; RET Z
; RES 3,(IX-1)
LD A,2
JR RESAV
;[СОХРАНЕНИЕ ЧАСТИ ЭКРАНА ПОД ОКНОМ]
WIN_STORE
; BIT 3,(IX-1)
; RET NZ
; SET 3,(IX-1)
LD A,1
RESAV EX AF,AF'
LD A,0X16;P_WINS
CALL SET_7FFD;PAGE_128
; LD HL,PAGE_128_RET
; PUSH HL
EX AF,AF'
LD (NSOH+1),A
RRCA
CALL WSOHR
LD HL,0X127E
JR C,SOH7
LD HL,0X771A
SOH7 LD (SOH4),HL
LD (SOH1),HL
LD L,(IX+_Y_COORD)
LD H,(IX+_X_COORD)
CALL ADRDIS_
PUSH HL
CALL ADRATR_
EX (SP),HL
LD B,(IX+_V_SIZE)
SOH3 PUSH BC
LD B,8
PUSH HL
SOH2 PUSH HL
LD C,(IX+_H_SIZE)
SOH1 LD A,(HL)
LD (DE),A
INC DE
INC HL
DEC C
JR NZ,SOH1
POP HL
INC H
DJNZ SOH2
POP HL
CALL UVEHL_
POP BC
DJNZ SOH3
POP HL
LD A,(NSOH+1)
AND A
JR Z,SOH6_0
BIT 6,(IX+_FLAGS)
JR Z,SOH6_0
INC (IX+_V_SIZE)
INC (IX+_H_SIZE)
SOH6_0 LD C,(IX+_V_SIZE)
SOH6 PUSH HL
LD B,(IX+_H_SIZE)
SOH4 LD A,(HL)
LD (DE),A
INC HL
INC DE
DJNZ SOH4
POP HL
LD A,0X20
ADD A,L
LD L,A
JR NC,SOH4_0
INC H
SOH4_0 DEC C
JR NZ,SOH6
NSOH LD A,0
AND A
RET Z
CP 1
JR NZ,NSOH1
LD (BUFHR+1),DE
NSOH1 BIT 6,(IX+_FLAGS)
JR Z,ADRWEK
DEC (IX+_V_SIZE)
DEC (IX+_H_SIZE)
ADRWEK LD HL,0
RRCA
JR NC,ADRWK1
INC HL
INC HL
LD D,IXH
LD E,IXL
LD (HL),E
INC HL
LD (HL),D
RET
ADRWK1 LD A,(BUFHR1+1)
AND A
RET Z
DEC HL
DEC HL
DEC HL
DEC HL
DEC HL
LD D,(HL)
DEC HL
LD E,(HL)
ADRWK2 LD IXH,D
LD IXL,E
RET
WSOHR PUSH AF
PUSH HL
BUFHR LD DE,0XC000
EX AF,AF'
LD HL,TABSS
BUFHR1 LD A,0
AND A
JR NZ,BUFHR4
LD DE,0XC000
BUFHR4 PUSH AF
PUSH AF
ADD A,A
ADD A,A
ADD A,L
LD L,A
JR NC,BUFHR4_0
INC H
BUFHR4_0 LD (ADRWEK+1),HL
POP AF
EX AF,AF'
JR NC,NWOS
LD (HL),E
INC HL
LD (HL),D
POP AF
INC A
JR BUFHR3
NWOS DEC HL
DEC HL
DEC HL
LD D,(HL)
DEC HL
LD E,(HL)
LD (BUFHR+1),DE
POP AF
DEC A
RET C
BUFHR3 LD (BUFHR1+1),A
POP HL
POP AF
RET
TABSS DUPL 0X20,0
ADRDIS_ PUSH AF
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
POP AF
RET
ADRATR_ LD A,H
RRCA
RRCA
RRCA
AND 3
OR 0X58
LD H,A
RET
UVEHL_ LD A,0X20
ADD A,L
LD L,A
RET NC
LD A,H
ADD A,8
LD H,A
RET
DRAW_PROGRESS PUSH AF
PUSH HL
LD L,A
LD H,0
ADD HL,HL ; *2
ADD HL,HL ; *4
ADD HL,HL ; *8
ADD HL,HL ; *16
LD C,L
LD B,H
LD DE,(FILESIZE_BLOCKS)
CALL DIVIDE16
INC C
LD L,(IX + _Y_COORD)
INC L
INC L
INC L
LD H,0
ADD HL,HL ; *2
ADD HL,HL ; *4
ADD HL,HL ; *8
ADD HL,HL ; *16
ADD HL,HL ; *32
LD A,(IX + _X_COORD)
INC A
ADD A,L
LD L,A
LD A,0x58
ADD A,H
LD H,A
LD A,%00111000
.L1 LD (HL),A
INC L
DEC C
JR NZ,.L1
POP HL
POP AF
RET