;----------------------------------------------------------- ; Прорисовка объекта ~Pallete Box~ ; Input: HL-label ; Format mouse table: ; +0 - Object ~Pallete Box" ; +1 - Xo position object ; +2 - Xi position object ; +3 - Yo position object ; +4 - Yi position object ; +5 - Xi position name ; +6 - число цвет. полей по X ; +7 - число цвет. полей по Y ; +8 - тек.элемент ; +9 - hot-буква ; +10 - контекст ;----------------------------------------------------------- ; db PalleteBox ; dw 022Bh,0404h ; Yo,Xo,lenY,lenX ; db "&Foreground",0 ; db 0 ; контекст ; db 0Fh ; маска ; dw ColPal ; адрес нач. цвета ;----------------------------------------------------------- ; PPallete: LD (IY+1),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 window LD (IY+2),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 window LD (IY+4),A ;+3 Yo CALL GetPutA LD A,(HL) ; len X INC HL LD (IY+7),A ; число цветн. полей по X LD C,A ADD A,A ;1+1=2 ADD A,C ;2+1=3 LD (IX+6),A LD B,A ADD A,2 ADD A,(IY+2) LD (IY+3),A ; Xi pos LD A,(HL) ; len Y INC HL LD (IY+8),A ; число цветн. полей по Y ADD A,A ADD A,2 ; Yi pos ADD A,(IY+4) LD (IY+5),A LD A,"┌" LD (DE),A INC DE INC DE LD A," " ; вед. пробел заголовка LD (DE),A INC DE INC DE DEC B LD A,(color_array+24) ; цвет диал. окна LD C,A LD A,(HL) PltBox0:INC HL CP "&" JR NZ,PltBox1 LD A,(HL) LD (DE),A ; hot-букву в буфер INC HL INC DE push bc ld a,(color_array+25) ; цвет hot-буквы диал. окон ld b,a ld a,c ; цвет бутона and 0F0h or b ld (de),a ; атрибут pop bc inc de DEC B LD A,(HL) INC HL PltBox1:LD (DE),A INC DE INC DE DEC B LD A,(HL) OR A JR NZ,PltBox0 INC HL ld a,(hl) inc hl ld (iy+10),a ; hot-буква LD A," " ; конц. пробел заголовка LD (DE),A INC DE INC DE DEC B LD A,(IX+6) SUB B ADD A,(IY+2) inc a LD (IY+6),A ; Xi полож. заголовка LD A,B OR A JR Z,PltBox2 LD A,"─" LD (DE),A INC DE INC DE DJNZ $-3 PltBox2:LD A,"┐" LD (DE),A INC (IX+5) LD A,(HL) ; контекст INC HL LD (IY+11),A LD A,(HL) INC HL LD (IY+9),A ; маска цветов из описателя LD A,(HL) INC HL LD (IY+12),A ; адрес начального цвета LD A,(HL) INC HL LD (IY+13),A PUSH HL LD A,(color_array+24) ; цвет диал. окна AND 0F0h LD (IX+6),A ; начальный цвет LD B,(IY+8) ; цикл вывода цветн. полей PltBox3:PUSH BC LD C,(IX+4) ; pos element LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"│" ; начальный символ цветн. поля INC HL INC HL LD B,(IY+7) ; высота цветн. поля в символах LD A,(IX+6) ; начальный цвет LD C,"█" ; символ заполнения цветн. поля PltBox4:LD (HL),C INC HL LD (HL),A INC HL LD (HL),C INC HL LD (HL),A INC HL LD (HL),C INC HL LD (HL),A INC HL INC A DJNZ PltBox4 LD (HL),"│" ; конечный символ цветн. поля EX DE,HL INC (IX+5) ; ++Y полож. поля LD C,(IX+4) ; bc=Y/X полож. цветн. поля LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"│" ; начальный символ цветн. поля INC HL INC HL LD B,(IY+7) LD A,(IX+6) LD C,"█" ; символ заполнения цветн. поля PltBox5:LD (HL),C INC HL LD (HL),A INC HL LD (HL),C INC HL LD (HL),A INC HL LD (HL),C INC HL LD (HL),A INC HL INC A DJNZ PltBox5 LD (HL),"│" ; конечный символ цветн. поля EX DE,HL INC (IX+5) LD A,(IY+7) ADD A,(IX+6) LD (IX+6),A POP BC DJNZ PltBox3 ; все цветн. поля выведены LD C,(IX+4) ; pos element LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"└" INC HL INC HL LD A,(IY+3) SUB (IY+2) SUB 2 LD B,A LD A,"─" LD (HL),A INC HL INC HL DJNZ $-3 LD (HL),"┘" LD L,(IY+12) ; адрес начального цвета LD H,(IY+13) LD A,(HL) ; цвет AND (IY+9) BIT 7,(IY+9) JR Z,$+6 RRCA RRCA RRCA RRCA LD B,-1 INC B SUB (IY+7) JR NC,$-4 ADD A,(IY+7) LD C,A ADD A,A ;1+1=2 ADD A,C ;2+1=3 гориз. шаг inc a LD C,A LD A,B ADD A,A ;1+1=2 верт. шаг INC A LD B,A LD A,(IY+2) SUB (IX+0) INC A ADD A,C LD C,A LD A,(IY+4) SUB (IX+1) INC A ADD A,B LD B,A CALL GetPutA LD A,"*" LD (DE),A INC DE LD A,(color_array+24) ; цвет диал. окна LD (DE),A POP HL LD BC,14 LD (IY+0),C ADD IY,BC RET ;------------------------------------------------- ; Object ~Pallette Resident 1 or 2~ ; Format mouse table: ; +0 - Object ~Pallette Resident~ ;------------------------------------------------- PResid2:EX AF,AF' LD E,(HL) INC HL LD D,(HL) INC HL LD (AdrCol+1),DE ; тек. адрес в массиве цветов LD A,(page_dial_screen) ; page buffer OUT (SLOT3),A EX AF,AF' JR PResid1 ;------------------------------------------------- ; Object ~Pallette Resident 1 or 2~ ; Format mouse table: ; +0 - Object ~Pallette Resident~ ;------------------------------------------------- PResid1:LD (IY+0),2 ; длина таблицы "Pallette Resident" ? INC IY LD (IY+0),A ;+0 номер объекта ~Pallette Resident 1 или 2~ INC IY RET ;------------------------------------------------- ; Прорисовка объекта ~Test color~ ; Format mouse table: ;------------------------------------------------- PTestCol: LD (IY+1),A ;+0 object LD (IY+4),0 LD A,(HL) ; X pos INC HL LD C,A ADD A,(IX+0) ; Pos X from begin screen LD (IY+2),A ;+1 Xo LD A,(HL) ; Y pos INC HL LD B,A ADD A,(IX+1) ; Pos Y from begin screen LD (IY+3),A ;+3 Yo LD (PTestC2+1),BC CALL GetPutA PUSH DE LD E,(HL) INC HL LD D,(HL) INC HL LD A,(DE) ; цвет строки LD C,A ;INC DE ;LD A,(DE) ;CPL ;LD B,A POP DE PUSH HL ; текст. строка LD A,(HL) PTestC1:INC HL LD (DE),A INC DE ;LD A,(DE) ;AND B ;OR C ld a,c LD (DE),A ; атрибут INC DE INC (IY+4) LD A,(HL) OR A JR NZ,PTestC1 POP HL ; вывод 2-й строки PUSH BC PTestC2:LD BC,0 INC B ; ниже на строку CALL GetPutA POP BC LD A,(HL) PTestC3:INC HL LD (DE),A INC DE ;LD A,(DE) ;AND B ;OR C ld a,c LD (DE),A ; атрибут INC DE LD A,(HL) OR A JR NZ,PTestC3 INC HL LD BC,5 LD (IY+0),C ADD IY,BC RET ;----------------------------------------------------------- ; Обработчик событий объекта ~Test Color~ ;----------------------------------------------------------- ETestCol: LD HL,what LD A,(HL) INC HL CP evMessage RET NZ LD A,(HL) ;+1 CP msNewColor RET NZ INC HL LD A,(HL) INC HL LD H,(HL) LD L,A LD C,(HL) ; цвет из массива нач. цветов ;INC HL ;LD B,(HL) ;LD A,B ;CP 0FFh ;JR Z,ETestC1 ;CPL ;LD B,A ;LD A,(color_array+24) ; цвет диал. окна ;AND B ;OR C ;LD C,A ;ETestC1: PUSH IY PUSH IX PUSH IX POP IY IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A LD IX,DialData ; таблица осн. диал. окна LD A,C PUSH AF LD A,(IY+2) SUB (IX+0) LD C,A LD A,(IY+3) SUB (IX+1) LD B,A CALL GetPutA EX DE,HL POP AF PUSH AF PUSH IX PUSH HL LD B,(IY+4) INC HL LD (HL),A INC HL DJNZ $-3 LD E,(IY+2) LD D,(IY+3) LD L,(IY+4) LD H,1 POP IX CALL PutDialLn POP IX LD A,(IY+2) SUB (IX+0) LD C,A LD A,(IY+3) SUB (IX+1) INC A LD B,A CALL GetPutA EX DE,HL POP AF PUSH HL LD B,(IY+4) INC HL LD (HL),A INC HL DJNZ $-3 LD E,(IY+2) LD D,(IY+3) INC D LD L,(IY+4) LD H,1 POP IX CALL PutDialLn POP AF OUT (SLOT3),A POP IX POP IY RET ;----------------------------------------------------------- ; Обработчик событий объекта ~Pallete Box~ ;----------------------------------------------------------- EPallete: ld hl,what ld a,(hl) inc hl cp evMouseFr jp z,EPmouse cp evKeyboard jp z,EPkeys cp evMessage jr z,EPmess cp evCombKey ret nz ; Событие - комбинация клавиш bit 7,(ix+1) jr nz,EPcomb ; объект уже выделен ld b,(hl) ;+1 what inc hl ld a,(hl) ;+2 what cp 56h ; курсор вправо jp z,SetPalBox push ix ld e,(ix+0) ; размер таблицы "Pallete Box" ld d,0 add ix,de bit 7,(ix+0) pop ix ret z ; еще не конец объектов cp 54h ; курсор влево jp z,SetPalBox ld a,b and 00111111b ; биты Ctrl, Alt ret nz ld a,(hl) ;+2 what cp 15+80h ; Tab скен-код+80h ret nz ; Shift+Tab jp SetPalBox ; выделить пред. объект ; Событие - сообщение EPmess: ld a,(hl) ;+1 what inc hl cp msNewColor ret nz ld e,(hl) ;+2 inc hl ld d,(hl) ;+3 ld l,(ix+12) ; адрес ColList ld h,(ix+13) ex de,hl ; hl=старый адрес цвета ;INC DE ;LD A,(DE) ;AND (IX+9) ;JR Z,EPmess1 ;DEC DE ;LD A,(DE) ; итоговый цвет ;AND (IX+9) ; маска из описателя объекта ;LD B,A ;INC HL ;LD A,(HL) ;DEC HL ;AND (IX+9) ;JR Z,EPmess1 ;LD A,(HL) ;AND (IX+9) ;CP B ;JR Z,EPmess1+3 ;EPmess1: call ResPalCurs ld (ix+12),l ; hl=новый адрес цвета ld (ix+13),h ;INC HL ;LD A,(HL) ;AND (IX+9) jp SetPalCurs ;CALL NZ,SetPalCurs ;RET ; Событие - курсорные клавиши EPcomb: inc hl ld de,EPexit push de ld a,(hl) ;+2 cp 58h ; вверх jp z,EPup cp 52h ; вниз jp z,EPdown cp 54h ; влево jp z,EPleft cp 56h ; вправо jp z,EPright pop de ret ; курсор вверх EPup: LD L,(IX+12) LD H,(IX+13) ;INC HL ;LD A,(HL) ;AND (IX+9) ;RET Z ;DEC HL LD A,(HL) AND (IX+9) BIT 7,(IX+9) JR Z,$+6 RRCA RRCA RRCA RRCA SUB (IX+7) RET C JP EPex ; курсор вниз EPdown: LD B,(IX+8) SUB A ADD A,(IX+7) DJNZ $-3 LD C,A LD L,(IX+12) LD H,(IX+13) ;INC HL ;LD A,(HL) ;AND (IX+9) ;RET Z ;DEC HL LD A,(HL) AND (IX+9) BIT 7,(IX+9) JR Z,$+6 RRCA RRCA RRCA RRCA ADD A,(IX+7) CP C RET NC JP EPex ; курсор влево EPleft: LD L,(IX+12) LD H,(IX+13) LD A,(HL) AND (IX+9) BIT 7,(IX+9) JR Z,$+6 RRCA RRCA RRCA RRCA DEC A RET M JP EPex ; курсор вправо EPright:ld b,(ix+8) ; число цветн. полей по Y xor a add a,(ix+7) ; число цветн. полей по X djnz $-3 ld c,a ld l,(ix+12) ; hl=адрес начального цвета ld h,(ix+13) ld a,(hl) ; нач. цвет and (ix+9) ; маска цветов bit 7,(ix+9) jr z,$+6 rrca rrca rrca rrca inc a cp c ret nc EPex: call ResPalCurs bit 7,(ix+9) jr z,$+6 RLCA RLCA RLCA RLCA LD C,A LD A,(IX+9) CPL LD B,A LD A,(HL) AND B OR C LD (HL),A CALL SetPalCurs LD HL,what LD (HL),evMessage INC HL LD (HL),msNewColor INC HL LD A,(IX+12) LD (HL),A INC HL LD A,(IX+13) LD (HL),A call TransMessUp jp get_fire ; Событие - мышка EPmouse:LD E,(HL) ; X coord INC HL LD D,(HL) ; Y coord LD A,E BIT 7,(IX+2) JR NZ,$+6 CP (IX+2) ; Xo pos RET C ; < BIT 7,(IX+3) RET NZ CP (IX+3) ; Xi pos RET NC ; > LD A,D CP (IX+4) ; Yo pos list box RET C CP (IX+5) ; Yi pos list box RET NC BIT 7,(IX+1) ; sel or nosel PUSH DE CALL Z,SetPalBox ; выделить объект POP DE LD HL,EPexit PUSH HL LD L,(IX+12) LD H,(IX+13) LD A,E CP (IX+2) RET Z INC A CP (IX+3) RET Z SUB (IX+2) SUB 2 LD C,A LD A,D CP (IX+4) ; Yo pos list box RET Z INC A CP (IX+5) ; Yi pos list box RET Z SUB (IX+4) SUB 2 SRL A JR Z,EPmous1 LD B,A SUB A ADD A,(IX+7) DJNZ $-3 EPmous1:LD E,A LD A,C LD B,-1 INC B sub 3 ; минус шаг по гориз. JR NC,$-3 LD A,B ADD A,E LD B,A BIT 7,(IX+9) JR Z,$+6 RLCA RLCA RLCA RLCA LD C,A LD A,(HL) AND (IX+9) CP C RET Z LD A,B JP EPex ; Событие - обычные клавиши EPkeys: ld a,(hl) ;+1 what bit 7,(ix+1) ; sel or nosel ret nz ; объект уже выделен cp 9 ; Tab jr z,SetPalBox ; выделить объект inc hl ld a,(hl) ;+2 what скен-код cp (ix+10) ; hot-буква ret nz SetPalBox: call MoveObj ; объект в начало таблицы call ResDialInv ; Reset previos invert ld ix,DialTab+5 ; таблица объектов ld e,(ix+2) ; Xo inc e ld d,(ix+4) ; Y ld a,(ix+6) ; Xi sub e ld c,a ; ширина выделения call SetDialInv EPexit: ld hl,what ; поле события ld (hl),evNothing ret ;------------------------------------------------- ; Сбросить курсор палитры ;------------------------------------------------- ResPalCurs: PUSH IY PUSH IX PUSH HL PUSH AF PUSH IX POP IY LD IX,DialData ; таблица осн. диал. окна LD L,(IY+12) ; hl=адрес начального цвета LD H,(IY+13) LD A,(HL) ; нач. цвет AND (IY+9) ; маска из описателя BIT 7,(IY+9) JR Z,$+6 RRCA RRCA RRCA RRCA LD L,A ; цвет LD B,-1 INC B SUB (IY+7) JR NC,$-4 ADD A,(IY+7) LD C,A ADD A,A ;1+1=2 ADD A,C ;2+1=3 гориз. шаг inc a LD C,A LD A,B ADD A,A ;1+1=2 верт. шаг INC A LD B,A PUSH BC LD A,(IY+2) SUB (IX+0) INC A ADD A,C LD C,A LD A,(IY+4) SUB (IX+1) INC A ADD A,B LD B,A CALL GetPutA IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A LD A,"█" ; символ затирания LD (DE),A INC DE LD A,L LD (DE),A ; цвет POP AF OUT (SLOT3),A POP BC LD A,C ADD A,(IY+2) INC A LD E,A LD A,B ADD A,(IY+4) INC A LD D,A LD A,D CP 31 JR NC,RPalCr LD A,E CP 80 JR NC,RPalCr LD C,84h ; уст. курсор PUSH HL RST 08h POP DE ; e=атрибут LD A,"█" ; символ затирания LD BC,0181h ; один символ с атрибутом RST 08h RPalCr: POP AF POP HL POP IX POP IY RET ;------------------------------------------------- ; Выделить курсор палитры ;------------------------------------------------- SetPalCurs: PUSH IY PUSH IX PUSH HL PUSH IX POP IY LD IX,DialData ; таблица осн. диал. окна LD L,(IY+12) ; адрес тек. цвета LD H,(IY+13) LD A,(HL) AND (IY+9) BIT 7,(IY+9) JR Z,$+6 RRCA RRCA RRCA RRCA LD B,-1 INC B SUB (IY+7) JR NC,$-4 ADD A,(IY+7) LD C,A ADD A,A ;1+1=2 ADD A,C ;2+1=3 гориз. шаг inc a LD C,A LD A,B ADD A,A ;1+1=2 верт. шаг INC A LD B,A PUSH BC LD A,(IY+2) SUB (IX+0) INC A ADD A,C LD C,A LD A,(IY+4) SUB (IX+1) INC A ADD A,B LD B,A CALL GetPutA IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A LD A,"*" ; курсор палитры LD (DE),A INC DE LD A,(color_array+24) ; цвет диал. окна LD (DE),A POP AF OUT (SLOT3),A POP BC LD A,C ADD A,(IY+2) INC A LD E,A LD A,B ADD A,(IY+4) INC A LD D,A LD A,D CP 31 JR NC,SPalCr LD A,E CP 80 JR NC,SPalCr LD C,84h ; уст. курсор RST 08h LD A,(color_array+24) ; цвет диал. окна LD E,A LD A,"*" ; курсор палитры LD BC,0181h ; 1 символ с атрибутом RST 08h SPalCr: POP HL POP IX POP IY RET ;----------------------------------------------------------- ; Выделить заголовок объектов ~List Box~, ~Pallete Box~ ;----------------------------------------------------------- PLstBoxI: ld e,(ix+2) ; Xo inc e ld d,(ix+4) ; Y ld a,(ix+6) ; Xi sub e ld c,a ; ширина выделения call SetDialInv ; выделить заголовок jp StLstBoxI ; указатель ListBox-а ;----------------------------------------------------------- ; Обработчик событий объекта ~Resident1~ ;----------------------------------------------------------- EResident1: LD HL,what ; поле событий LD A,(HL) INC HL CP evCommand JR NZ,ERes1 LD A,(HL) ;+1 DEC HL CP cmSelect RET NZ LD (HL),evNothing RET ; ERes1: CP evMessage RET NZ LD A,(HL) ;+1 what CP msNewElem RET NZ LD (HL),msNewList INC HL PUSH HL LD L,(HL) ;+2 what номер списка (1..6) LD H,0 ADD HL,HL ;1+1=2 ADD HL,HL ;2+2=4 LD DE,ItemTab ; таблица ADD HL,DE LD E,(HL) ; de=ItemList1..6 INC HL LD D,(HL) INC HL LD C,(HL) ; bc=ColList1..6 INC HL LD B,(HL) POP HL LD (HL),E INC HL LD (HL),D LD (AdrCol+1),BC ; тек. адрес в массиве цветов RET ;------------------------------------------------- ; Обработчик событий объекта ~Resident1~ ;------------------------------------------------- EResident2: LD HL,what LD A,(HL) INC HL CP evCommand JR NZ,ERes2 LD A,(HL) DEC HL CP cmSelect RET NZ LD (HL),evNothing RET ; ERes2: CP evMessage RET NZ LD A,(HL) CP msNewElem RET NZ LD (HL),msNewColor INC HL LD C,(HL) ; номер списка 1..6 LD B,0 EX DE,HL AdrCol: LD HL,0 ; тек. адрес в массиве цветов ADD HL,BC ;1+1=2 ;ADD HL,BC;? ;2+1=3 убрать EX DE,HL LD (HL),E INC HL LD (HL),D RET