; Включает объекты ~Radio Button~ и ~Check Box~ ; ;===================================================================== ; Прорисовка объекта "Radio Button" ; object ~Claster radio buttons~ (имеет фокус) ; Input: HL-описатель объекта ; Format table: ; +0 - номер объекта ~Radio Button" ; +1 - Xo левое полож. объекта ; +2 - Xi правое полож. объекта ; +3 - Yo левое полож. объекта ; +4 - Yi правое полож. объекта ; +5 - Xi правое полож. имени ; from: +0 - Y полож. radio-кнопки ; +1 - скен-код hot-буквы ; +2 - триг. ячейка ; +3,4 - адрес ячейки ; 80h - конец таблицы объекта ;--------------------------------------------------------------------- ; db ClsRadioBut ; номер объекта ; dw 0202h,0112h ; Yo,Xo,lenY,lenX (с "() ") ; db "&Viewer command",0 ; имя элемента ; db 2Dh ; скен-код hot-буквы ; dw Mode1 ; ячейка памяти ; db "&Editor command",0 ; имя элемента ; db 12h ; скен-код hot-буквы ; dw Mode2 ; ячейка памяти ; db 0 ; конец кластера ;===================================================================== PutClsRadioBut: push iy inc iy ld (iy+0),a ; номер объекта ld a,(hl) ; X pos inc hl ld c,a ld (ix+4),a ; Save X pos add a,(ix+0) ; Pos X from begin screen ld (iy+1),a ;+1 Xo ld a,(hl) ; Y pos inc hl ld b,a ld (ix+5),a ; Save Y pos add a,(ix+1) ; Pos Y from begin screen ld (iy+3),a ;+3 Yo call GetPutA ld a,(hl) inc hl ld (ix+6),a add a,(iy+1) ld (iy+2),a ; Xi pos ld a,(hl) inc hl add a,(iy+3) ld (iy+4),a ld a,(ix+6) add a,(iy+1) ld (iy+5),a ; Xi pos name ld bc,6 ; next element claster add iy,bc ; Next element ClChkLp:ld c,(ix+4) ; pos element ld b,(ix+5) call GetPutA ld b,0 ex de,hl ld (hl),"(" inc hl inc hl inc b push hl inc hl inc hl inc b ld (hl),")" inc hl inc hl inc b inc hl inc hl inc b ; имя элемента объекта ld a,(color_array+24) ; цвет диал. окна ld c,a ld a,(de) ClChkL1:inc de cp "&" jr nz,ClChkN0 ld a,(color_array+25) ; цвет hot-буквы диал. окна ld c,a ld a,(de) inc de ld (hl),a inc hl ld a,(hl) and 0F0h or c ld (hl),a inc hl ld a,(color_array+24) ; цвет диал. окна ld c,a inc b ld a,(de) inc de ClChkN0:ld (hl),a inc hl ld (hl),c inc hl inc b ld a,(de) or a jr nz,ClChkL1 inc de ld a,(ix+5) ; Current Y pos add a,(ix+1) ; from begin screen ld (iy+0),a inc iy ex de,hl ld a,(hl) inc hl ld (iy+0),a ; скен-код hot-буквы inc iy ld c,(hl) inc hl ld b,(hl) inc hl ld a,(bc) ld (iy+0),a ; ячейка inc iy ld (iy+0),c ; bc=адрес ячейки inc iy ld (iy+0),b inc iy pop bc or a ld a," " jr z,$+4 ld a,"" ld (bc),a inc (ix+5) ld a,(hl) or a jp nz,ClChkLp ld (iy+0),80h ; End tab claster inc iy inc hl ; сохр. размер таблицы в Таблице объектов push iy exx pop hl pop de or a sbc hl,de ld a,l ld (de),a exx ld a,1 ld (SavElem+1),a ; первый элемент ret ;===================================================================== ; Прорисовка объекта "Check Box" ; object ~Claster check buttons~ (имеет фокус) ; Input: HL-описатель объекта ; Format table: ; +0 - номер объекта "CheckBox" ; +1 - Xo левое полож. объекта ; +2 - Xi правое полож. объекта ; +3 - Yo левое полож. объекта ; +4 - Yi правое полож. объекта ; +5 - Xi правое полож. имени объекта ; from: +0 - Y полож. чек-бокса ; +1 - скен-код hot-буквы ; +2 - триг. ячейка ; +3,4 - адрес ячейки ; 80h - конец таблицы объекта ;--------------------------------------------------------------------- ; db ClsCheckBox ; номер объекта ; dw 0202h,0225h ; Yo,Xo,lenY,lenX (с "[x] ") ; db "&Clear r/o attribute",0 ; имя элемента ; db 2Ch ; скен-код hot-буквы ; dw cSystem1 ; адрес ячейки ; db "Clear &attribute",0 ; имя элемента ; db 1Dh ; скен-код hot-буквы ; dw cSystem2 ; адрес ячейки ; db 0 ; конец кластера ;===================================================================== PutClsCheckBox: PUSH IY INC IY LD (IY+0),A ; номер объекта LD A,(HL) ; Xo pos INC HL LD C,A LD (IX+4),A ; Save X pos ## ADD A,(IX+0) ; Pos X from begin screen LD (IY+1),A ;+1 Xo LD A,(HL) ; Yo pos INC HL LD B,A LD (IX+5),A ; Save Yo pos ADD A,(IX+1) ; Pos Yo from begin screen LD (IY+3),A ;+3 Yo CALL GetPutA LD A,(HL) ; X Len INC HL LD (IX+6),A ; ширина объекта ; ADD A,(IY+1) ;+1 Xo левая позиция объекта LD (IY+2),A ;+2 Xi pos LD A,(HL) ; Y Len INC HL ADD A,(IY+3) ;+3 Yo pos object LD (IY+4),A ;+4 Yi pos object LD A,(IX+6) ADD A,(IY+1) LD (IY+5),A ; Xi pos name LD BC,6 ; next element claster ADD IY,BC ; Next element ClRadLp:LD C,(IX+4) ; pos element LD B,(IX+5) CALL GetPutA LD B,0 EX DE,HL LD (HL),"[" INC HL INC HL INC B PUSH HL INC HL INC HL INC B LD (HL),"]" INC HL INC HL INC B INC HL INC HL INC B ; имя элемента объекта LD A,(color_array+24) ; цвет диал. окна LD C,A LD A,(DE) ClRadL1:INC DE CP "&" JR NZ,ClRadN0 LD A,(color_array+25) ; цвет hot-буквы диал. окна LD C,A LD A,(DE) INC DE LD (HL),A INC HL LD A,(HL) AND 0F0h OR C LD (HL),A INC HL LD A,(color_array+24) ; цвет диал. окна LD C,A INC B LD A,(DE) INC DE ClRadN0:LD (HL),A INC HL LD (HL),C INC HL INC B LD A,(DE) OR A JR NZ,ClRadL1 INC DE LD A,(IX+5) ; Current Y pos ADD A,(IX+1) ; from begin screen LD (IY+0),A INC IY EX DE,HL ld a,(hl) ld (iy+0),a ; скен-код hot-буквы inc hl inc iy LD C,(HL) INC HL LD B,(HL) INC HL LD A,(BC) LD (IY+0),A ; ячейка INC IY LD (IY+0),C ; bc=адрес ячейки INC IY LD (IY+0),B INC IY POP BC OR A LD A," " JR Z,$+4 LD A,"x" LD (BC),A INC (IX+5) LD A,(HL) OR A JP NZ,ClRadLp LD (IY+0),80h ; End tab claster INC IY INC HL ; сохр. размер таблицы в Таблице объектов push iy exx pop hl pop de or a sbc hl,de ; длина таблицы "Check Box" ld a,l ld (de),a ; DialTab+5 exx ld a,1 ld (SavElem+1),a ; первый элемент ret ;----------------------------------------------------------- ; Начальный фокус на объект "Check Box" или "Radio Button" ;----------------------------------------------------------- ClastI: ld de,color_array+24 ; 70h цвет диал. окон ld (set_dial_tmp_inv+1),de ; не "выделять" цветом чек-боксы ld e,(ix+2) ; Xo inc e ld d,(ix+4) ; Y ld a,(ix+6) ; Xi name sub e ld c,a call SetDialInv ld hl,color_array+26 ld (set_dial_tmp_inv+1),hl ; восст. ячейку push ix pop hl ld de,7 add hl,de ld a,(ix+7) ; Y полож. 1-го элемента кластера ld (hl),a ; Y pos check button jp SetClasInv ; выделить элемент объекта ;------------------------------------------------- ; Узнать состояние ячейки кластера ;------------------------------------------------- GetClsData: push ix pop hl ld bc,7 add hl,bc ; Begin claster elements GetDtLp:inc hl ; Y pos inc hl ; скен-код hot-буквы ld a,(hl) ; ячейка inc hl ld e,(hl) ; de=дрес ячейки inc hl ld d,(hl) inc hl ld (de),a bit 7,(hl) ; 7bit-End claster jr z,GetDtLp ret ;===================================================================== ; ; Обработчик событий объектов "Check Box" и "Radio Button" ; ;===================================================================== EvClasterBut: ld hl,what ld a,(hl) inc hl cp evMouseFr jr z,ECmouse ; Mouse fire cp evKeyboard jr z,ECkeys ; Key press cp evCombKey jp z,ECcombK ; Key press ret ; Событие - Мышка ECmouse:LD E,(HL) ; X pos INC HL LD D,(HL) ; Y pos LD A,E BIT 7,(IX+2) JR NZ,$+6 CP (IX+2) ; Xo left pos RET C ; < BIT 7,(IX+3) RET NZ CP (IX+3) ; Xi right pos RET NC ; > LD A,D CP (IX+4) ; Yo left pos RET C ; < CP (IX+5) ; Yi right pos RET NC ; > xor a LD (ECnext+1),a DEC A LD (SaveA1+1),a ; Begin element claster PUSH IX POP HL INC HL inc hl ld bc,5 ; len element claster LD E,B ; number element LD A,D EClsLp1:ADD HL,BC BIT 7,(HL) JP NZ,SelClas ; Elem not found INC E CP (HL) ; Compare with Y pos elem JR NZ,EClsLp1 JR CSelNxt ; Событие - обычная клавиша ECkeys: xor a ld (ECnext+1),a dec a ld (SaveA1+1),a ; Begin element claster ld a,(hl) ;+1 what cp 20h ; пробел jr z,ECspace bit 7,(ix+1) jr nz,ECkeyN ; объект уже выделен cp 9 ; Tab jp z,SelCls0 ; If tab then select my ECkeyN: inc hl ld a,(hl) ;+2 what скен-код push ix pop hl inc hl inc hl ld bc,5 ; Len elements ld e,b ECkeyLp:add hl,bc bit 7,(hl) ret nz inc e inc hl cp (hl) ; hot-key element dec hl jr nz,ECkeyLp CSelNxt:bit 7,(ix+1) jp nz,CSelect ; объект уже выделен jp SelCls1 ; Обработка пробела ECspace:BIT 7,(IX+1) RET Z ; not select LD A,(SavElem+1) OR A JR NZ,ECspc1 INC A LD (SavElem+1),A ECspc1: LD (ECnext+1),A PUSH IX POP HL INC HL inc hl ld de,5 LD B,A ADD HL,DE ; find elem.label DJNZ $-1 JP ECnext ; change ; Курсорные клавиши ECcombK:bit 7,(ix+1) jr nz,ECcombn ; объект уже выделен ld b,(hl) ;+1 what inc hl ld a,(hl) ;+2 what cp 56h ; курсор вправо jp z,SelCls0 push ix ld e,(ix+0) ; размер таблицы "Input Line" ld d,0 add ix,de bit 7,(ix+0) pop ix ret z ; еще не конец объектов cp 54h ; курсор влево jp z,SelCls0 ld a,b and 00111111b ; биты Ctrl, Alt ret nz ld a,(hl) ;+2 what cp 15+80h ; Tab скен-код+80h ret nz jp SelCls0 ; If tab then select my ; ECcombn:xor a ld (ECnext+1),a ; Flag change buttons inc hl ld a,(hl) ;+2 what cp 58h ; вверх jr z,ECup cp 54h ; влево jr z,ECup cp 52h ; вниз jr z,ECdown cp 56h ; вправо ret nz ; курсор вниз ECdown: PUSH IX POP HL INC HL inc hl ld e,l ld d,h ld bc,5 LD A,(SavElem+1) OR A JR NZ,$+3 INC A INC A ; increment element LD (SavElem+1),A ECcmlp: ADD HL,BC ; find label BIT 7,(HL) CALL NZ,EndClst ; table is over DEC A JR NZ,ECcmlp CALL ResClasInv ; Res inver elem JP Pcurs ; next invert ; Get begin table elem EndClst:EX DE,HL ADD HL,BC ; table is begin LD A,1 LD (SavElem+1),A ; first elem. RET ; Курсор вверх ECup: PUSH IX POP HL INC HL inc hl ld de,5 LD A,(SavElem+1) OR A JR NZ,$+3 INC A DEC A ; decrement cur.elem. CALL Z,BegClst LD (SavElem+1),A LD B,A ADD HL,DE ; find label DJNZ $-1 CALL ResClasInv ; Res inver elem JR Pcurs ; next invert ; Get end table elem BegClst:PUSH HL SUB A DEC A INC A ADD HL,DE ; find nember end element BIT 7,(HL) JR Z,$-4 POP HL RET ; A=end element ; selected claster SelClas:BIT 7,(IX+1) JR NZ,SaveA1 ; NZ-is select SelCls0:ld e,0 SelCls1:LD A,E LD (SaveA1+1),A call MoveObj call ResDialInv ; Res orevios invert LD IX,DialTab+5 SaveA1: LD A,0 INC A JR Z,EClexit ; Element not found DEC A LD (SavElem+1),A LD (ECnext+1),A JR CButton ; Change buttons ; Событие - Мышка (в выбранном кластере) CSelect:LD A,1 LD (ECnext+1),A LD A,(SavElem+1) CP E JR Z,ECnext LD A,E LD (SavElem+1),A CALL ResClasInv ; Res inver elem CButton:PUSH IX POP HL INC HL inc hl ld de,5 SavElem:LD A,0 OR A JR NZ,$+3 INC A LD B,A ADD HL,DE DJNZ $-1 Pcurs: CALL SetClasInv ; Set inver elem ECnext: ld a,0 or a call nz,ChangeB EClexit:ld hl,what ; Event claster exit ld (hl),evNothing jp get_fire ;--------------------------------------------------------------------- ; Изменение элементов CheckBox-а или Radio-кнопок ; ; вход: HL-Address claster element label ;--------------------------------------------------------------------- ChangeB:LD A,(IX+1) RES 7,A CP ClsCheckBox JP Z,ChangeR ; изменить CheckBox ; Изменить Radio-кнопку LD E,L LD D,H PUSH IX POP HL LD BC,7 ADD HL,BC PUSH HL ; Save cur.elem ChangL1:INC HL ; Begin elements claster INC HL ;INC HL LD (HL),B ; (Ceil)=0 INC HL INC HL INC HL BIT 7,(HL) JR Z,ChangL1 EX DE,HL ; HL=Current element claster INC B INC HL INC HL INC HL LD (HL),B ; Cur.elem=1 INC HL INC HL INC HL POP HL ; Reset begin elem table IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A ChangL2:LD D,(HL) ; Y pos INC HL INC HL ;INC HL ;? LD A,(HL) ; Address ceil INC HL INC HL INC HL LD E,(IX+2) ; X полож. "" INC E PUSH IX PUSH DE LD IX,DialData EX AF,AF' LD A,E SUB (IX+0) LD C,A LD A,D SUB (IX+1) LD B,A CALL GetPutA EX AF,AF' LD C,A OR A LD A," " JR Z,$+4 LD A,"" LD (DE),A POP DE POP IX LD A,D CP 31 JR NC,cl1 BIT 7,E JR NZ,cl1 LD A,E CP 80 JR NC,cl1 PUSH HL LD A,C PUSH AF LD C,84h ; Set position print RST 08h POP AF OR A LD A," " JR Z,$+4 LD A,"" LD BC,0182h RST 08h ; Print on/off POP HL cl1: BIT 7,(HL) JR Z,ChangL2 CALL ResILCr ; Res cursor CALL PILCurs ; Set cursor EI POP AF OUT (SLOT3),A RET ;------------------------------------------------- ; Изменение элемента CheckBox-а ;------------------------------------------------- ChangeR: IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A LD D,(HL) ; Y pos INC HL INC HL LD A,(HL) ; ячейка XOR 1 LD (HL),A INC HL INC HL INC HL LD E,(IX+2) ; X полож. "x" INC E PUSH IX PUSH DE LD IX,DialData EX AF,AF' LD A,E SUB (IX+0) LD C,A LD A,D SUB (IX+1) LD B,A CALL GetPutA EX AF,AF' LD C,A OR A LD A," " JR Z,$+4 LD A,"x" LD (DE),A POP DE POP IX LD A,D CP 31 JR NC,cl2 BIT 7,E JR NZ,cl2 LD A,E CP 80 JR NC,cl2 LD A,C PUSH AF LD C,84h ; Set position print RST 08h POP AF OR A LD A," " JR Z,$+4 LD A,"x" LD BC,0182h RST 08h ; Print cl2: CALL ResILCr CALL PILCurs EI POP AF OUT (SLOT3),A RET