; Раскомментарить обработчики Original, Current, Blank ; Номера объектов TextLine equ 0 ; строка текста InputLine equ 1 ; строка редакт. текста InpLine equ 2 ; вариант строки ввода для окна "Attributes" ClsCheckBox equ 3 ; Check Box ClsRadioBut equ 4 ; Radio Button Button equ 5 ; Button HLine equ 6 ; гориз. линия PalleteBox equ 7 TestColor equ 8 ListBox equ 9 PResident1 equ 10 PResident2 equ 11 ProcesLine equ 12 ; Команды (внутренние) cmOkey equ 0 cmCancel equ 1 cmOriginal equ 2 ; от окна "Attributes" cmCurrent equ 3 ; от окна "Attributes" cmBlank equ 4 ; от окна "Attributes" cmSelect equ 5 cmDefault equ 6 cmSkip equ 7 cmSkipAll equ 8 cmAll equ 9 cmAppend equ 10 ; События (внутренние) evNothing equ 0 ; нет событий evMouseFr equ 1 ; нажата кнопка мыши evKeyboard equ 2 ; нажата клавиша evCombKey equ 3 ; нажата комбинация клавиш evCommand equ 4 ; есть команда evMessage equ 5 ; передача сообщения evRunComLine equ 6 ; отработать ком-строку ; Сообщения (внутренние) msHiddInvr equ 80h ; объект ~палитра~ msNewColor equ 81h msNewElem equ 82h msNewList equ 83h ; буфер сохр. экрана под строкой гориз. меню WinHMenuBuff equ 0C000h+1400h ; буфер за SysScrn ;+ManScrn MaxDialWin equ 1400h ; макс. размер окна ; бордюр окон FramDSl:db "╔╗╚╝═║║║" WinBoxBuff: dw 0C000h ; сохр. начало буферов окон ;------------ данные главного обработчика диалоговых окон -------------- DialData: ds 16 ; таблица главного диал. окна DialName: ds 25 ; буфер заголовков окон DialTab: ds 128 ; главная таблица объектов ;----------------------------------------------------------------------- DialData1: ds 16 ; таблица обычного окна ;--------------------------------------------------------------------- ; Переместить объект (его таблицу) в начало Таблицы объектов ; ; Вход: IX-таблица объекта ; Выход: таблица объекта в начале Таблицы объектов и ; объект отмечен, как "в фокусе" (7-й бит). ;--------------------------------------------------------------------- MoveObj:set 6,(ix+0) ; отметить объект в его таблице ld hl,DialTab+5 ; Таблица всех объектов MoveOlp:bit 6,(hl) ; тек. объект отмечен ? res 6,(hl) ; сбр. флаг отметки ret nz ; да, таблица объекта уже в начале inc hl res 7,(hl) ; сбр. признак фокуса объекта dec hl ld de,work_buffer ; Move first object in buffer ld c,(hl) ; Len object label ld b,0 res 6,c ldir ; Move push hl push hl ld c,(hl) ; -6 res 6,c add hl,bc ; Search end table bit 7,(hl) jr z,$-6 pop bc or a ; HL-End table,BC-Address 2 obj sbc hl,bc ; HL-BC=Len table -1 object ld c,l ; BC=Len table ld b,h pop hl ld de,DialTab+5 ; Move to begin table push de ld a,b or c jr z,$+4 ldir ld hl,work_buffer ; Move from buffer to end table ld c,(hl) ; object BC=len Object label res 6,c ldir pop hl inc hl ; ячейка номера объекта (+0) set 7,(hl) ; уст. признак фокуса объекта dec hl jr MoveOlp ;------------------------------------------------- ; Сохранить место под диал. окно ;------------------------------------------------- SavDial:PUSH IX LD A,(IX+2) ;with shadow ADD A,2 LD L,A LD A,(IX+3) INC A LD H,A ; Wind len LD E,(IX+0) LD D,(IX+1) LD IX,(WinBoxBuff) ; Address Box buffers LD A,(page_dial_screen) ; Page buffer LD C,0B2h ; копир. из окна в буфер call scrn4__ POP IX RET ;----------------------------------------------------------- ; Процедура очистки площади цветом диал. окна ; На вход: IX - описатель ;----------------------------------------------------------- PutDialRc: LD HL,(WinBoxBuff) ld bc,MaxDialWin; add hl,bc; LD B,(IX+3) ;Len Y LD C,(IX+2) ;Len X LD E," " ; символ заполнения LD A,(color_array+24) ; цвет диал. окна putRc1_:LD D,C LD (HL),E INC HL LD (HL),a ; цвет окна INC HL DEC D JR NZ,$-5 INC HL ; место для тени INC HL INC HL INC HL DJNZ putRc1_ RET ;--------------------------------------------------------------------- ; Процедура наложения рамки на прямоугольную площадь диал. окна ; На вход: IX - описатель ; HL - адрес описателя рамки ;--------------------------------------------------------------------- PutDialFr: PUSH IY PUSH HL POP IY LD HL,(WinBoxBuff) ld bc,MaxDialWin; add hl,bc; LD A,(color_array+24) ; цвет диал. окна LD C,A LD A,(IY+0) LD (HL),A ;First Line INC HL LD (HL),C INC HL LD B,(IX+2) ;Len DialX DEC B DEC B LD A,(IY+4) LD (HL),A INC HL LD (HL),C INC HL DJNZ $-4 LD A,(IY+1) LD (HL),A INC HL LD (HL),C INC HL INC HL INC HL INC HL INC HL ; LD E,(IX+2) ;lenX DEC E DEC E LD D,B LD B,(IX+3) ;lenY DEC B DEC B LD A,(IY+5) PutDialFr2__: LD (HL),A ;middle space window INC HL LD (HL),C INC HL ADD HL,DE ADD HL,DE LD (HL),A ;middle space window INC HL LD (HL),C INC HL INC HL INC HL INC HL INC HL DJNZ PutDialFr2__ ; LD A,(IY+2) LD (HL),A ;End Line INC HL LD (HL),C INC HL LD B,(IX+2) ;Len X DEC B DEC B LD A,(IY+4) LD (HL),A INC HL LD (HL),C INC HL DJNZ $-4 LD A,(IY+3) LD (HL),A INC HL LD (HL),C INC HL LD HL,DialName ; титл окна LD E,L LD D,H LD B,1 INC B ;B=Len name+2 (for space) LD A,(HL) INC HL OR A ;0-End name JR NZ,$-4 LD A,(IX+2) ;Len X SUB B ;LenX-Len name=Len empty SRL A ;Len empty/2=shift LD HL,(WinBoxBuff) ld bc,MaxDialWin; add hl,bc; LD C,A LD B,0 ADD HL,BC ;get address name place ADD HL,BC LD (HL)," " ; вед. пробел имени окна INC HL INC HL EX DE,HL ;HL=Adr.Name,DE=Adr.Place PutDialFr5__: LDI ;Move INC DE ;Attrib place LD A,(HL) OR A ;0-End name JR NZ,PutDialFr5__ LD A," " ; закр. пробел имени окна LD (DE),A POP IY RET ;------------------------------------------------- ; Процедура вывода в буфер тени окна ; На вход: IX - адрес описателя ;------------------------------------------------- PutDialSh: LD HL,(WinBoxBuff) ld de,MaxDialWin; add hl,de; LD A,(IX+2) ; Xlen LD E,A LD D,0 ADD HL,DE ADD HL,DE EXX LD E,A ; ширина окна X BIT 7,(IX+0) ; Xpos JR Z,ExShD1 ; правая граница экрана LD A,(IX+0) NEG ; в A-на сколько окно залезло за экран SUB E ; -длина окна=-видимая часть NEG LD E,A ; длина видимой части ExShD1: LD D,0 LD HL,(WinBoxBuff) ADD HL,DE ADD HL,DE LD A,(HL) ; первая линия без тени INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL ; середина окна LD B,(IX+3) ; длина окна Y-1 DEC B DShadLp:ADD HL,DE ADD HL,DE EXX ADD HL,DE ADD HL,DE LD A,(HL) INC HL EXX LD (HL),A INC HL EXX ;LD A,(HL) INC HL EXX ;AND 7 ;JR NZ,$+4 ;LD A,7 ;LD (HL),A ld (hl),color_shadow ; цвет тени INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL EXX ;LD A,(HL) INC HL EXX ;AND 7 ;JR NZ,$+4 ;LD A,7 ;LD (HL),A ld (hl),color_shadow ; цвет тени INC HL DJNZ DShadLp ADD HL,DE ; конец линии для тени ADD HL,DE INC HL INC HL INC HL INC HL EXX ADD HL,DE ; конец буфера ADD HL,DE INC HL INC HL INC HL INC HL EXX LD B,E DShadL1:EXX DEC HL ; заполняем с конца ;LD A,(HL) EXX DEC HL ;AND 7 ;JR NZ,$+4 ;LD A,7 ;LD (HL),A ld (hl),color_shadow ; цвет тени EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A DJNZ DShadL1 EXX ; два первых знакоместа без изменений DEC HL LD A,(HL) EXX DEC HL LD (HL),A EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A RET ;----------------------------------------------------------- ; По значению координат узнать адрес вставки в памяти ; Input: BC - Y/X координаты от начала окна ; Output: DE - адрес вставки ;----------------------------------------------------------- GetPutA:PUSH HL LD HL,(WinBoxBuff) ld de,MaxDialWin; add hl,de; LD A,(IX+2) ;Len X-2 ADD A,2 ;Full len with shadow ADD A,A ;With attributs LD E,A ;LenX in bytes LD D,0 LD A,B OR A JR Z,$+5 ADD HL,DE DJNZ $-1 LD E,C ;$+5 ADD HL,DE ;DE-shiftX ADD HL,DE EX DE,HL ;DE-Address POP HL RET ;----------------------------------------------------------- ; Процедура подготовки и вывода диалогового окна ; На вход: HL - Адрес описателя ;----------------------------------------------------------- PutDialWn: PUSH IY LD IY,DialTab ; Таблица объектов, имеющих фокус LD IX,DialData ; таблица диал. окна IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) ; стр. буфера OUT (SLOT3),A LD A,(HL) ; X полож. диал. окна LD (IX+0),A ;+0 Xpos INC HL LD A,(HL) ; Y полож. диал. окна LD (IX+1),A ;+1 Ypos INC HL LD A,(HL) ; ширина диал. окна LD (IX+2),A ;+2 Xlen INC HL LD A,(HL) ; высота диал. окна LD (IX+3),A ;+3 Ylen INC HL LD DE,DialName ; титл диал. окна PutDialWn1__: LDI LD A,(HL) OR A JR NZ,PutDialWn1__ LDI PUSH HL CALL SavDial ; сохр. площадь экрана CALL PutDialRc ; очистить место цветом окна LD HL,FramDSl CALL PutDialFr ; вставить рамку и титл окна CALL PutDialSh ; вставить тень LD A,(IX+0) ; move window LD (IY+0),A ;+0 INC IY ADD A,(IX+2) ; номер объекта LD (IY+0),A ;+1 INC IY LD A,(IX+1) LD (IY+0),A ;+2 INC IY LD A,(IX+0) ; координаты |■| (закр.окно) LD (IY+0),A ;+3 INC IY LD A,(IX+1) LD (IY+0),A ;+4 INC IY POP HL ; iy=DialTab+5 ; цикл сканир. на объекты в описателе окна DialCycle: ld a,(hl) ; тип след. объекта описателя inc hl bit 7,a ; 0FFh test jr nz,DialExit ; конец описателя диал. окна ld de,DialCycle push de cp TextLine jp z,PutTextLine ; вставить текст. строку cp HLine jp z,PutHLine ; вставить раздел. линию cp InputLine jp z,PutInputLine ; вставить строку редактир. cp InpLine jp z,PutInpLine ; вставить строку редактир. cp Button jp z,PutButton cp ClsRadioBut jp z,PutClsRadioBut ; put claster radio buttons cp ClsCheckBox jp z,PutClsCheckBox ; put claster check buttons cp PalleteBox jp z,PPallete cp TestColor jp z,PTestCol cp ProcesLine jp z,PProcess cp ListBox jp z,PListBox cp PResident1 jp z,PResid1 cp PResident2 jp z,PResid2 pop de DialExit: ld (iy+0),80h ;+5 конец таблицы объектов call PutDial ; вывести окно на экран pop af out (SLOT3),a pop iy ; Найти последний (с фитчей фокуса) объект в описателе ld hl,DialTab+5 ; начало "местных" таблиц в DialTab ld d,0 SelEndL:ld e,(hl) ; размер "местной" таблицы в DialTab add hl,de bit 7,(hl) ; 80h (см. метку "DialExit") jr z,SelEndL ; не конец таблицы объектов DialTab and a sbc hl,de ; вернуться на послед. объект ; перекачать в буфер таблицу послед. объекта ld de,work_buffer ; врем. буфер ld b,0 ld c,(hl) ; размер "местной" таблицы ld a,c ldir ; заполн. буферы DialTab+5 ld c,a DEC HL LD E,L LD D,H OR A SBC HL,BC PUSH HL LD BC,DialTab+4 OR A SBC HL,BC LD C,L LD B,H POP HL LD A,B OR C JR Z,$+4 LDDR LD HL,work_buffer ; врем. буфер LD DE,DialTab+5 LD C,(HL) LDIR ;xor a ;ld (CIflag+1),a ; для объекта "буттон" ; Установить фокус на объект ld ix,DialTab+5 ; начало Таблицы объектов ld hl,DIALe__ push hl ld a,(ix+1) set 7,(ix+1) ; уст. признак фокуса cp InputLine jp z,InpLineI ; вывести курсор в объекте cp InpLine jp z,InpLineI ; вывести курсор в объекте cp Button jp z,ButtonI ; фокус на бутон cp ClsRadioBut jp z,ClastI cp ClsCheckBox jp z,ClastI cp ListBox jp z,PLstBoxI cp PalleteBox jp z,PLstBoxI pop hl DIALe__:ret ;/////////////////////////////////////////////////////////// ; Вызов диалогового окна ; вход: hl=описатель диал. окна ;/////////////////////////////////////////////////////////// DialogW:ld de,(CursorPos) ; сохр. полож. курсора в ком. строке push de call Dialog pop de ld (CursorPos),de ; восст. полож. курсора ld hl,what ; поле событий ld a,(hl) inc hl ret ;/////////////////////////////////////////////////////////// ; Вызов диалогового окна ошибки ; вход: hl=описатель диал. окна ;/////////////////////////////////////////////////////////// DialogEr: ld de,color_array+34 ; Select buttons ld a,(de) push af push de ld a,(color_array+35) ; Sel.buttons Warning/Errors ld (de),a ld de,color_array+24 ; Normal text dial. window ld a,(de) push af push de ld a,(color_array+28) ; Warning/Errors window ld (de),a ld de,(CursorPos) ; сохр. полож. курсора в ком. строке push de call Dialog pop de ld (CursorPos),de ; восст. полож. курсора pop de pop af ld (de),a pop de pop af ld (de),a ld hl,what ; поле событий ld a,(hl) inc hl ret ;/////////////////////////////////////////////////////////// ; Вызов простого информ. окна ; вход: hl=описатель окна ;/////////////////////////////////////////////////////////// WinSimple: ld de,0C000h+1400h+1400h ld (WinBoxBuff),de call PutWindow ; вывести окно ld hl,0C000h ld (WinBoxBuff),hl ret ;------------------------------------------------- ; Закрытие простого информ. окна ;------------------------------------------------- CloseWinSimple: ld de,0C000h+1400h+1400h ld (WinBoxBuff),de call close_window ld hl,0C000h ld (WinBoxBuff),hl ret ;/////////////////////////////////////////////////////////// ; Вызов простого информ. окна ошибки ; вход: hl=описатель окна ;/////////////////////////////////////////////////////////// WinSimpleEr: ld a,(color_array+27) ; Information window push af ld a,(color_array+28) ; Warning/Errors window ld (color_array+27),a call WinSimple ; вывести окно pop af ld (color_array+27),a ; ждем нажатия клавиши/мышки call get_mouse_info jr nz,CloseWinSimple ; бутоны нажаты ld a,2 ; опрос без ожидания rst 20h jr z,$-8 ; не нажаты ld a,1 ; очистить буфер клавы rst 20h jr CloseWinSimple ;----------------------------------------------------------- ; Основной обработчик диалогового окна ; ; вход: hl-описатель окна ;----------------------------------------------------------- Dialog: call PutDialWn ; вывести диал. окно ; Основной цикл событий окна DialogLoop: call handle_event ; Читаем событие ld ix,DialTab+5 ; Таблица объектов ; цикл проверки на события каждого из объектов DialLoop: ld hl,DialWex___ push hl ld a,(ix+1) ; начало таблицы тек. объекта res 7,a ; убрать флаг фокуса ; (только фокусные объекты) cp InputLine jp z,EvInputLine cp InpLine jp z,EvInpLine cp Button jp z,EvButton cp ClsRadioBut jp z,EvClasterBut cp ClsCheckBox jp z,EvClasterBut cp ListBox jp z,EListBox cp ProcesLine jp z,EProcess cp PalleteBox jp z,EPallete cp TestColor jp z,ETestCol cp PResident1 jp z,EResident1 cp PResident2 jp z,EResident2 pop hl DialWex___: ld c,(ix+0) ; длина таблицы объекта в DialTab ld b,0 add ix,bc ; на таблицу след. объекта bit 7,(ix+0) ; конец Таблицы объектов ? jr z,DialLoop ; нет ; проверка на события самого окна ;ld de,DialogC___ ld de,DialogLoop push de ld hl,what ; поле событий ld a,(hl) inc hl cp evMouseFr ; Fire from mouse jr z,TstExtD1 ; test on Close window cp evKeyboard ; Event keyboard jr z,TstKeyD ; тест на Esc/Enter cp evCombKey ; Event keyboard jr z,TstQuitD ; тест на F10 cp evCommand jr z,TstCmnD ; проверка команд от мышки, клавы ret ; назад в осн. цикл окна TstKeyD:ld a,(hl) ;+1 what cp 1Bh ; Esc jr z,CancelD cp 0Dh ; Enter jr z,OkeyD ret ; TstQuitD: inc hl ld a,(hl) ;+2 what cp 44h ; F10 jr z,CancelD ret ; TstCmnD:ld a,(hl) ;+1 what cp cmCancel jr z,CancelD ; ; бутоны Original, Current, Blank ld a,(hl) ;+1 what cp cmOriginal ;jp z,OriginalAttr cp cmCurrent ;jp z,CurrentAttr cp cmBlank ;jp z,BlankAttr ; jr OkeyDn___ ; Ok OkeyD: ld hl,what ld (hl),evCommand ; тип события inc hl ld (hl),cmOkey ;+1 номер команды OkeyDn___: ld ix,DialTab+5 ; Таблица объектов OkeyLp___: ld de,OkeyN___ ; Find clasters & get data push de ld a,(ix+1) ; номер тек. объекта res 7,a ; убрать признак фокуса cp ClsRadioBut jp z,GetClsData ; узнать сост. ячейки кластера cp ClsCheckBox jp z,GetClsData cp ListBox jp z,GetLstBox pop de OkeyN___: ld c,(ix+0) ; размер таблицы тек. объекта ld b,0 add ix,bc ; на таблицу след. объекта bit 7,(ix+0) ; конец Таблицы объектов ? jr z,OkeyLp___ ; нет DialogE___: ; выйти из диал. окна call Close_Dial_Win ; закрыть окно pop de ; баланс стека (осн. цикла окна) jp get_fire ; Cancel CancelD:ld hl,what ; поле событий ld (hl),evCommand inc hl ld (hl),cmCancel ; номер команды jr DialogE___ ; Проверка координат мышки и диал. окна TstExtD1: ld e,(hl) ;+1 X Get mouse coords in DE inc hl ld d,(hl) ;+2 Y ld ix,DialData ; таблица осн. диал. окна ld c,(ix+0) ; Xo левая ld b,(ix+1) ; Xi правая ld l,(ix+2) ; ширина ld h,(ix+3) ; высота add hl,bc ld a,e cp c jr c,CancelD ; < Xo левая cp l jr nc,CancelD ; > Xi правая ld a,d cp b jr c,CancelD ; < Yo левая cp h jr nc,CancelD ; > Yi правая ret ; не выходить из диал. окна ;----------------------------------------------------------- ; Вывести диалоговое окно на экран ;----------------------------------------------------------- PutDial:push ix ld a,(ix+2) ; with shadow add a,2 ld l,a ld a,(ix+3) inc a ld h,a ; Win len ld e,(ix+0) ld d,(ix+1) ld ix,(WinBoxBuff) ; Address Box buffers ld bc,MaxDialWin; add ix,bc; ld a,(page_dial_screen) ; Page buffer ld c,0B3h ; из буфера в текст. окно call scrn4__ pop ix ret ;----------------------------------------------------------- ; Закрыть простое окно ;----------------------------------------------------------- close_window: ld ix,DialData1 ; таблица осн. диал. окна jr close_dial_win1 ;----------------------------------------------------------- ; Закрыть диалоговое окно и восст. место под ним ;----------------------------------------------------------- Close_Dial_Win: call ResILCr ; сбросить курсор ld ix,DialData ; таблица осн. диал. окна close_dial_win1: ld a,(ix+2) ; with shadow add a,2 ld l,a ld a,(ix+3) inc a ld h,a ; Win len ld e,(ix+0) ld d,(ix+1) ld ix,(WinBoxBuff) ; Address Box buffers ld a,(page_dial_screen) ; Page buffer ld c,0B3h ; из буфера в текст. окно jp scrn4__ ;----------------------------------------------------------- ; Setting dialog invert objects ; ; Input: e=X pos ; d=Y pos ; c=X len ;----------------------------------------------------------- SetDialInv: push ix ld ix,DialData ; таблица осн. диал. окна in a,(SLOT3) push af ld a,(page_dial_screen) ; Page buffer out (SLOT3),a ld l,c ld h,1 ld (RDlIlen+1),hl ; сохр. размер ld (RDlIpos+1),de ; сохр. полож. ld a,e sub (ix+0) ld c,a ld a,d sub (ix+1) ld b,a call GetPutA ex de,hl ld (RDlIbuf+2),hl dec e; ; 0-я длина ? (когда "Input Line" без имени) inc e; jr z,SetDia1; ; выйти ld b,e set_dial_tmp_inv: ld a,(color_array+26) ; 30h цвет Selected title (объекта) ld e,a ld a,(color_array+25) ; цвет hot-буквы диал. окна ld d,a SetDin1:inc hl ld a,(hl) and 0Fh cp d ; hot-буква ? ld a,e jr nz,$+5 and 0F0h or d ld (hl),a inc hl djnz SetDin1 ld ix,(RDlIbuf+2) ; Put Name with invert ld hl,(RDlIlen+1) ld de,(RDlIpos+1) call PutDialLn SetDia1:pop af out (SLOT3),a pop ix ret ;------------------------------------------------- ; Set claster buttons invert ; Input: ; E - X pos ; D - Y pos ; C - X len ; (для CheckBox) ;------------------------------------------------- SetClasInv: ;PUSH IX ;LD IX,DialData ; таблица осн. диал. окна ;IN A,(SLOT3) ;PUSH AF ; сохр. page4 ;LD A,(page_dial_screen) ;OUT (SLOT3),A ; вкл. буфер ;PUSH HL ;LD L,C ; Len X ;LD H,1 ; Len Y ;LD (RClIlen+1),HL ; Save len ;LD (RClIpos+1),DE ; Save pos ;dec c ; 0-я длина ? (когда "Input Line" без имени) ;inc c ;jr z,SetDia3 ; выйти ;LD A,E ;SUB (IX+0) ;LD C,A ;LD A,D ;SUB (IX+1) ;LD B,A ;CALL GetPutA ;EX DE,HL ;LD (RClIbuf+2),HL ;LD B,E ;ld a,(color_array+26) ; 30h цвет выдел. объекта ;ld a,(ColDialWn) ; цвет диал. окна ;ld e,a ;ld a,(color_array+25) ; цвет hot-буквы диал. окна ;ld d,a ;SetDin2:inc hl ;ld a,(hl) ;and 0Fh ;cp d ; hot-буква ? ;ld a,e ;jr nz,$+5 ;and 0F0h ;or d ;ld (hl),a ;inc hl ;djnz SetDin2 ;LD IX,(RClIbuf+2) ; Put Name with invert ;LD HL,(RClIlen+1) ;LD DE,(RClIpos+1) ;CALL PutDialLn ;SetDia3:POP HL ;POP AF ;OUT (SLOT3),A ;POP IX ld e,(ix+2) ; Xo pos element inc e ;inc e ;inc e ld d,(hl) ; Y pos element ld (CursorPos),de push hl call PILCurs ; Set cursor pop hl ;ld a,1 ;ld (CIflag+1),a ret ;----------------------------------------------------------- ; Res dialog invert objects ; Input: None ;----------------------------------------------------------- ResDialInv: push ix in a,(SLOT3) push af ld a,(page_dial_screen) ; Page buffer out (SLOT3),a ld a,(RDlIlen+1) or a; ; 0-я длина ? (когда "Input Line" без имени) jr z,ResDia1; ; выйти ld hl,(RDlIbuf+2) ld b,a ld a,(color_array+24) ; цвет диал. окна ld e,a ld a,(color_array+25) ; цвет hot-буквы диал. окна ld d,a ResDin1:inc hl ld a,(hl) and 0Fh cp d ; hot-буква ? ld a,e jr nz,$+5 and 0F0h or d ld (hl),a inc hl djnz ResDin1 RDlIbuf:ld ix,0 ; Put Name with invert RDlIlen:ld hl,0 RDlIpos:ld de,0 call PutDialLn ;CIflag: ld a,0 ; 1 - Was claster invert ;or a ;call nz,ResClasInv ResDia1:call ResILCr ; выкл. курсор объекта "Input Line" pop af out (SLOT3),a pop ix ld hl,what ld (hl),evMessage ; тип события inc hl ld (hl),msHiddInvr ; внутр. команда jp TransMessage ; передать сообщение ;------------------------------------------------- ; Res Claster invert ; Input: None ;------------------------------------------------- ResClasInv: push ix IN A,(SLOT3) PUSH AF ; сохр. page4 LD A,(page_dial_screen) OUT (SLOT3),A ; вкл. буфер push hl ;LD HL,(RClIbuf+2) ;ld a,(RClIlen+1) ;or a; ; 0-я длина ? (когда "Input Line" без имени) ;jr z,ResDia2; ; выйти ;ld b,a ;ld a,(color_array+24) ; цвет диал. окна ;ld e,a ;ld a,(color_array+25) ; цвет hot-буквы диал. окна ;ld d,a ;ResDin2:inc hl ;ld a,(hl) ;and 0Fh ;cp d ; hot-буква ? ;ld a,e ;jr nz,$+5 ;and 0F0h ;or d ;ld (hl),a ;inc hl ;djnz ResDin2 ;RClIbuf:LD IX,0 ; Put Name with invert ;RClIlen:LD HL,0 ;RClIpos:LD DE,0 ;CALL PutDialLn ;ResDia2: call ResILCr ; выкл. курсор ;xor a ;LD (CIflag+1),a pop hl POP AF OUT (SLOT3),A pop ix ret ;------------------------------------------------- ; Вывод на экран ;------------------------------------------------- PutDialLn: ld a,d cp 31 ret nc bit 7,e jr z,pdln__ ld a,e ld e,0 neg ld c,a sub l neg ld l,a ret z ret m ld a,c add a,a db 0DDh add a,l db 0DDh ld l,a jr nc,pdln__ db 0DDh inc h pdln__: ld a,e cp 80 ret nc add a,l cp 80 jr c,$+6 ld a,80 sub e ld l,a ld a,(page_dial_screen) ld c,0B3h ; копир. с буфера на экран jp scrn4__ ;------------------------------------------------- ; Выделить бутон ;------------------------------------------------- PushBut:in a,(SLOT3) push af ld a,(page_dial_screen) ; Page buffer out (SLOT3),a push ix ld e,(ix+2) ; Xo left ld d,(ix+4) ; Y ld a,(ix+3) ; Xi right sub e ld l,a ld h,1 ; Y len push hl ; save Len push de ; save Pos ld a,l ld ix,DialData ; таблица осн. диал. окна ld a,e sub (ix+0) ld c,a ld a,d sub (ix+1) ld b,a call GetPutA ld c,l sla c ld b,0 ld hl,work_buffer ex de,hl ldir ; скопир. в буфер pop de pop hl ld ix,work_buffer in a,(SLOT3) ; Page1 ld c,0B3h ; из буфера на экран call scrn4__ ld b,8 halt djnz $-1 pop ix pop af out (SLOT3),a ret ;--------------------------------------------------------------------- ; Передача сообщений по объектам с текущего объекта ;--------------------------------------------------------------------- TransMessUp: push iy push ix jr TransEx ;--------------------------------------------------------------------- ; Передача сообщений по объектам с первого объекта ;--------------------------------------------------------------------- TransMessage: push iy push ix ld ix,DialTab+5 ; Таблица объектов TransLp:ld hl,TransEx push hl ld a,(ix+1) ; текущий объект and 7Fh ; сбр. 7-й бит (флаг выделения объекта) cp InputLine jp z,EvInputLine cp InpLine jp z,EvInpLine cp Button jp z,EvButton cp ClsCheckBox jp z,EvClasterBut cp ClsRadioBut jp z,EvClasterBut cp ListBox jp z,EListBox cp PalleteBox jp z,EPallete cp TestColor jp z,ETestCol cp PResident1 jp z,EResident1 cp PResident2 jp z,EResident2 pop hl TransEx:ld c,(ix+0) ld b,0 add ix,bc ; след. объект bit 7,(ix+0) jr z,TransLp ; не конец таблицы объектов pop ix pop iy ld hl,what ; поле событий ld a,(hl) cp evMessage ; тип события ret nz ; test command ld (hl),evNothing ret ;=========================================================== ; Вывод Обычного Окна ;=========================================================== ;----------------------------------------------------------- ; Процедура подготовки и вывода обычного окна. ; Используется для вывода инф. окон. ; вход: hl=описатель окна ;----------------------------------------------------------- PutWindow: ld a,(color_array+24) ; цвет диал. окна push af ld a,(color_array+27) ; цвет информ. окон ld (color_array+24),a ; цвет диал. окна ld ix,DialData1; ; таблица диал. окна in a,(SLOT3) push af ld a,(page_dial_screen) ; стр. буфера окна out (SLOT3),a ld a,(hl) ; X полож. окна ld (ix+0),a ;+0 Xpos inc hl ld a,(hl) ; Y полож. окна ld (ix+1),a ;+1 Ypos inc hl ld a,(hl) ; ширина окна ld (ix+2),a ;+2 Xlen inc hl ld a,(hl) ; высота окна ld (ix+3),a ;+3 Ylen inc hl ld de,DialName ; титл окна put_win1__: ldi ld a,(hl) or a jr nz,put_win1__ ldi push hl call SavDial ; сохр. площадь экрана call PutDialRc ; очистить место цветом окна ld hl,FramDSl call PutDialFr ; вставить рамку и титл окна call PutDialSh ; вставить тень pop hl ; цикл сканир. на объекты описателя окна put_win_cycle: ld a,(hl) ; тип след. объекта описателя inc hl bit 7,a ; -1 ? jr nz,put_win_done ; конец описателя окна ld de,put_win_cycle push de cp TextLine jp z,PutTextLine ; вставить текст. строку cp HLine jp z,PutHLine ; вставить раздел. линию ;cp Frame ;jp z,PFrame ; вставить рамку pop de put_win_done: call PutDial ; вывести окно на экран pop af out (SLOT3),a pop af ld (color_array+24),a ; восст. цвет ret