;----------------------------------------------------------- ; Прорисовка объекта ; Object ~List Box~ ; Input: HL-label ; Format mouse table: ; +0 - Object ~List Box" ; +1 - Xo position object ; +2 - Xi position object ; +3 - Yo position object ; +4 - Yi position object ; +5 - Xi position name ; +6 - тек. элемент ; +7 - число элементов в ListBox ; +8,9 - адрес списка ; +10 - Y pos line up ; +11 - Y pos line down ; +12 - Previos Y pos bar ; +13 - hot-буква ; +14 - контекст ;----------------------------------------------------------- PListBox: 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 ADD A,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 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) LstBox0:INC HL CP "&" JR NZ,LstBox1 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 LstBox1:LD (DE),A INC DE INC DE DEC B LD A,(HL) OR A JR NZ,LstBox0 INC HL ld a,(hl) inc hl ld (iy+15),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,LstBox2 LD A,"─" LD (DE),A INC DE INC DE DJNZ $-3 LstBox2:LD A,"┐" LD (DE),A INC (IX+5) LD A,(HL) ; контекст INC HL LD (IY+16),A SUB A LD (IY+7),A ;Тек.элем. LD (IY+8),A ;Первый элем. на странице LD (IY+9),A ;Кол-во элем. LD E,(HL) INC HL LD (IY+10),E ;Адрес списка LD (IY+17),E ;Адрес списка LD D,(HL) INC HL LD (IY+11),D LD (IY+18),D PUSH HL EX DE,HL LD A,(HL) OR A JP Z,EndBox ; Next element list LstBox3:LD C,(IX+4) ;pos element LD B,(IX+5) CALL GetPutA LD A,(IX+6) SUB 3 LD B,A EX DE,HL LD (HL),"│" INC HL INC HL LD A,(IY+4) SUB (IX+1) INC A CP (IX+5) LD A,(color_array+29) ; цвет ListBox-а JR NZ,$+5 LD A,(color_array+31) ; цвет после указателя LD C,A LD (HL)," " INC HL LD (HL),C INC HL LstBox4:LD A,(DE) INC DE CP 0Dh ; конец строки JR Z,NxtLst LD (HL),A INC HL LD (HL),C INC HL DJNZ LstBox4 LD A,(DE) INC DE CP 0Dh ; конец строки JR NZ,$-4 NxtLst: LD A,B OR A JR Z,LstBox5 LD A," " LD (HL),A INC HL LD (HL),C INC HL DJNZ $-4 LstBox5:LD (HL)," " INC HL LD (HL),C INC HL LD A,(IY+4) SUB (IX+1) INC A CP (IX+5) LD B,"" JR Z,PutLsBr INC A CP (IX+5) LD B,"■" JR Z,PutLsBr LD A,(IY+5) SUB (IX+1) SUB 2 CP (IX+5) LD B,"" JR Z,PutLsBr LD B,"▒" PutLsBr:LD (HL),B INC HL LD A,(color_array+32) ; цвет скролл-бара LD (HL),A INC HL LD (HL),"│" EX DE,HL INC (IY+9) INC (IX+5) LD A,(IY+5) SUB (IX+1) DEC A CP (IX+5) JR Z,EndBox1 LD A,(HL) OR A JP NZ,LstBox3 EndBox: LD A,(IY+5) SUB (IX+1) SUB (IX+5) DEC A JR Z,EndBox1 LD B,A LstBox6:PUSH BC LD C,(IX+4) ;pos element LD B,(IX+5) CALL GetPutA LD A,(IX+6) DEC A LD B,A EX DE,HL LD (HL),"│" INC HL INC HL LD A,(color_array+29) ; цвет ListBox-а LD C,A LD A," " LD (HL),A INC HL LD (HL),C INC HL DJNZ $-4 LD A,(IY+4) SUB (IX+1) INC A CP (IX+5) LD B,"" JR Z,PutLsB1 INC A CP (IX+5) LD B,"■" JR Z,PutLsB1 LD A,(IY+5) SUB (IX+1) SUB 2 CP (IX+5) LD B,"" JR Z,PutLsB1 LD B,"▒" PutLsB1:LD (HL),B INC HL LD A,(color_array+32) ; цвет скролл-бара LD (HL),A INC HL LD (HL),"│" EX DE,HL INC (IX+5) POP BC DJNZ LstBox6 ; EndBox1:LD A,(HL) OR A JR Z,EndBox2 CP 0Dh ; конец строки INC HL LD A,(HL) JR NZ,$-4 INC (IY+9) JR EndBox1+1 ; EndBox2:LD C,(IX+4) ;End string LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"└" INC HL INC HL LD B,(IX+6) LD A,"─" LD (HL),A INC HL INC HL DJNZ $-3 LD (HL),"┘" LD A,(IY+4) INC A LD (IY+12),A ;line up INC A LD (IY+14),A ;prev pos LD A,(IY+5) SUB 2 LD (IY+13),A ;line down POP HL LD BC,19 LD (IY+0),C ADD IY,BC RET GetLstBox: LD HL,what INC HL INC HL LD A,(IX+7) ADD A,(IX+8) LD (HL),A RET ;------------------------------------------------- ; Обработчик событий объектов ~List Box~ ;------------------------------------------------- EListBox: ld hl,what ; поле событий ld a,(hl) inc hl cp evMouseFr jp z,ELmouse cp evKeyboard jp z,ELkeys cp evMessage jr z,ELmess cp evCombKey ret nz bit 7,(ix+1) ; sel or nosel jp nz,ELcomb ; объект уже выделен ld b,(hl) ;+1 what inc hl ld a,(hl) ;+2 what cp 56h ; курсор вправо jp z,SetLstBox push ix ld e,(ix+0) ; размер таблицы "List Box" ld d,0 add ix,de bit 7,(ix+0) pop ix ret z ; еще не конец объектов cp 54h ; курсор влево jp z,SetLstBox ld a,b and 00111111b ; биты Ctrl, Alt ret nz ld a,(hl) ;+2 what cp 15+80h ; Tab скен-код+80h ret nz ; Shift+Tab jp SetLstBox ; select my ; Событие - сообщения ELmess: LD A,(HL) ;+1 what INC HL CP msHiddInvr JR NZ,ELmess1 BIT 7,(IX+1) RET NZ LD A,(IX+9) OR A RET Z JP HdLstBoxI ; ELmess1:CP msNewList RET NZ LD E,(HL) INC HL LD D,(HL) LD (IX+10),E LD (IX+11),D LD (IX+17),E LD (IX+18),D LD B,0 ELmess2:LD A,(DE) INC DE CP 0Dh JR NZ,ELmess2 INC B LD A,(DE) OR A JR NZ,ELmess2 ELmessE:LD (IX+9),B CALL RsLstBoxI SUB A LD (IX+7),A LD (IX+8),A LD A,(IX+9) OR A JR Z,ELmesE1 BIT 7,(IX+1) PUSH AF CALL Z,HdLstBoxI POP AF CALL NZ,StLstBoxI ELmesE1:CALL PrnLstBox CALL LstBoxBar JP ELboxex ; Событие - курсорные клавиши ELcomb: inc hl ld de,ELexit push de ld a,(hl) ;+2 what cp 58h ; курсор вверх jr z,ELup cp 52h ; курсор вниз jp z,ELdown cp 54h ; курсор влево jp z,ELpgup cp 56h ; курсор вправо jp z,ELpgdwn cp 59h ; PageUp jp z,ELpgup cp 53h ; PageDown jp z,ELpgdwn cp 57h ; Home jp z,ELhome cp 51h ; End jp z,ELend pop de ret ELup: LD A,(IX+9) CP 2 RET C LD A,(IX+7) DEC A JP M,ELup1 CALL RsLstBoxI LD (IX+7),A CALL StLstBoxI CALL LstBoxBar JP ELboxex ; ELup1: LD A,(IX+8) DEC A RET M LD (IX+8),A LD L,(IX+10) LD H,(IX+11) JR Z,ELupn1 LD L,(IX+17) LD H,(IX+18) DEC HL DEC HL LD A,(HL) CP 0Dh JR NZ,$-4 INC HL ELupn1: LD (IX+17),L LD (IX+18),H CALL PrnLstBox CALL LstBoxBar JP ELboxex ELdown: LD A,(IX+9) CP 2 RET C LD A,(IX+5) SUB (IX+4) SUB 2 LD C,A LD A,(IX+7) ADD A,(IX+8) INC A CP (IX+9) RET Z SUB (IX+8) CP C JR Z,ELdown1 CALL RsLstBoxI LD (IX+7),A CALL StLstBoxI CALL LstBoxBar JP ELboxex ; ELdown1:LD A,(IX+8) INC A LD (IX+8),A LD L,(IX+10) LD H,(IX+11) JR Z,ELdwn1 LD L,(IX+17) LD H,(IX+18) LD A,(HL) INC HL CP 0Dh JR NZ,$-4 ELdwn1: LD (IX+17),L LD (IX+18),H CALL PrnLstBox CALL LstBoxBar JP ELboxex ; Page Up ELpgup: LD A,(IX+9) CP 2 RET C LD A,(IX+8) OR A LD B,1 JP Z,ELnopg LD A,(IX+5) SUB (IX+4) SUB 2 LD C,A LD A,(IX+8) SUB C JR NC,$+3 SUB A LD (IX+8),A JR ELpgex ELpgdwn:LD A,(IX+9) CP 2 RET C LD A,(IX+5) SUB (IX+4) SUB 2 LD C,A LD A,(IX+9) SUB (IX+8) LD B,A CP C JR C,ELnopg JR Z,ELnopg LD A,(IX+8) ADD A,C CP (IX+9) JR C,$+6 LD A,(IX+9) SUB C LD (IX+8),A ADD A,C CP (IX+9) JR C,ELpgex JR Z,ELpgex LD A,(IX+9) SUB C LD (IX+8),A ; ELpgex: LD L,(IX+10) LD H,(IX+11) LD A,(IX+8) OR A JR Z,ELpgex1 LD B,A LD A,(HL) INC HL CP 0Dh JR NZ,$-4 DJNZ $-6 ELpgex1:LD (IX+17),L LD (IX+18),H CALL PrnLstBox CALL LstBoxBar LD A,(IX+7) ADD A,(IX+8) CP (IX+9) JR C,ELboxex LD A,(IX+9) SUB (IX+8) LD B,A ; ELnopg: DEC B LD A,B CP (IX+7) RET Z CALL RsLstBoxI LD (IX+7),A CALL StLstBoxI CALL LstBoxBar ; ELboxex:LD HL,what LD (HL),evMessage INC HL LD (HL),msNewElem INC HL LD A,(IX+7) ADD A,(IX+8) LD (HL),A ; тек. элемент call TransMessUp jp get_fire ;ld b,8 ;call get_mouse_info ;ret z ;HALT ;DJNZ $-5 ;RET ; Home ELhome: LD A,(IX+8) OR A JR Z,ELhome1 LD (IX+8),0 LD L,(IX+10) LD H,(IX+11) LD (IX+17),L LD (IX+18),H CALL PrnLstBox ELhome1:LD A,(IX+7) OR A RET Z CALL RsLstBoxI LD (IX+7),0 CALL StLstBoxI jp LstBoxBar ; End ELend: LD A,(IX+8) ADD A,(IX+7) INC A CP (IX+9) RET Z LD A,(IX+5) SUB (IX+4) SUB 2 LD C,A LD A,(IX+9) SUB C JR C,ELend1 JR Z,ELend1 LD A,(IX+9) SUB C LD (IX+8),A LD L,(IX+10) LD H,(IX+11) LD B,A LD A,(HL) INC HL CP 0Dh JR NZ,$-4 DJNZ $-6 LD (IX+17),L LD (IX+18),H CALL RsLstBoxI CALL PrnLstBox LD A,(IX+9) DEC A SUB (IX+8) LD (IX+7),A CALL StLstBoxI jp LstBoxBar ; ELend1: CALL RsLstBoxI LD A,(IX+9) DEC A LD (IX+7),A CALL StLstBoxI jp LstBoxBar ; Событие - мышка ELmouse: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,SetLstBox POP DE LD HL,ELexit PUSH HL LD A,(IX+9) OR A RET Z LD A,E ADD A,2 CP (IX+3) JR Z,ELmous1 RET NC LD A,E CP (IX+2) RET Z LD A,D CP (IX+4) RET Z INC A CP (IX+5) RET Z LD A,D SUB (IX+4) DEC A ADD A,(IX+8) CP (IX+9) JR C,$+6 LD A,(IX+9) DEC A SUB (IX+8) CP (IX+7) JR Z,SelLine CALL RsLstBoxI LD (IX+7),A CALL StLstBoxI CALL LstBoxBar jp ELboxex ; SelLine:POP HL LD HL,what ; поле событий LD (HL),evCommand INC HL LD (HL),cmSelect RET ELmous1:LD A,D CP (IX+12) RET C JP Z,ELup CP (IX+13) JP Z,ELdown RET NC CP (IX+14) RET Z JP C,ELpgup JP NC,ELpgdwn RET ; Событие - обычные клавиши ELkeys: ld a,(hl) bit 7,(ix+1) ; sel or nosel ret nz cp 9 ; Tab jr z,SetLstBox ; set button inc hl ld a,(hl) ;+2 what скен-код cp (ix+15) ; hot-буква ret nz SetLstBox: CALL MoveObj ;Select Button 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 LD A,(IX+9) OR A CALL NZ,StLstBoxI LD HL,what ; поле событий LD (HL),evMessage INC HL LD (HL),msNewElem INC HL LD A,(IX+7) ADD A,(IX+8) LD (HL),A ; тек. элемент CALL TransMessUp ELexit: LD HL,what LD (HL),evNothing RET RsLstBoxI: PUSH AF LD A,(color_array+29) ; цвет ListBox-а CALL LstBoxInv POP AF RET HdLstBoxI: LD A,(color_array+31) ; цвет после указателя JR LstBoxInv ; StLstBoxI: LD A,(color_array+30) ; цвет указателя ListBox-а LstBoxInv: LD (lbcolor+1),A PUSH IY PUSH IX PUSH IX POP IY LD IX,DialData ; таблица осн. диал. окна LD A,(IY+2) SUB (IX+0) INC A LD C,A LD A,(IY+4) SUB (IX+1) INC A ADD A,(IY+7) LD B,A CALL GetPutA PUSH DE IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A LD A,(IY+3) SUB (IY+2) SUB 3 LD L,A LD H,1 LD B,L lbcolor:LD A,0 INC DE LD (DE),A INC DE DJNZ $-3 POP AF OUT (SLOT3),A POP IX LD E,(IY+2) INC E LD A,(IY+4) INC A ADD A,(IY+7) LD D,A CALL PutDialLn POP IX POP IY RET LstBoxBar: LD A,(IX+7) ADD A,(IX+8) LD E,A LD A,(IX+13) SUB (IX+12) SUB 2 LD C,A CALL Mult8X8 ;CurLine*LenScrollBar=num16bit LD A,H OR L JR Z,LBB1 LD A,(IX+9) ;num16bit/EquipElem OR A JR Z,$+3 DEC A LD C,A CALL Divis16X8 LBB1: LD A,(IX+12) ;Смещение от начала INC A ADD A,L CP (IX+14) RET Z PUSH IY PUSH IX PUSH AF PUSH IX POP IY LD IX,DialData LD A,(IY+3) SUB (IX+0) SUB 2 LD C,A LD A,(IY+14) SUB (IX+1) LD B,A CALL GetPutA IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A LD A,"▒" LD (DE),A POP AF OUT (SLOT3),A LD A,(IY+3) SUB 2 LD E,A LD D,(IY+14) LD A,D CP 31 JR NC,LBe BIT 7,E JR NZ,LBe LD A,E CP 80 JR NC,LBe LD A,(color_array+32) ; цвет скролл-бара LD H,A LD L,"▒" LD BC,1BB5h SUB A RST 08h LBe: LD A,(IY+3) SUB 2 LD E,A POP AF LD (IY+14),A LD D,A PUSH DE CP 31 JR NC,LBe1 BIT 7,E JR NZ,LBe1 LD A,E CP 80 JR NC,LBe1 LD A,(color_array+32) ; цвет скролл-бара LD H,A LD L,"■" LD BC,1BB5h SUB A RST 08h LBe1: POP DE LD A,E SUB (IX+0) LD C,A LD A,D SUB (IX+1) LD B,A CALL GetPutA IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (0E2h),A LD A,"■" LD (DE),A POP AF OUT (SLOT3),A POP IX POP IY RET PrnLstBox: PUSH IY PUSH IX IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A PUSH IX POP IY LD IX,DialData ; таблица осн. диал. окна LD L,(IY+17) LD H,(IY+18) LD A,(IY+2) SUB (IX+0) ADD A,2 LD C,A LD A,(IY+4) SUB (IX+1) INC A LD B,A LD A,(IY+5) SUB (IY+4) SUB 2 PrLsBx0:PUSH AF PUSH BC CALL GetPutA LD A,(IY+3) SUB (IY+2) SUB 5 LD B,A PrLsBx1:LD A,(HL) INC HL CP 0Dh JR Z,PrLsBx2 LD (DE),A INC DE INC DE DJNZ PrLsBx1 LD A,(HL) INC HL CP 0Dh JR NZ,$-4 PrLsBx2:LD A,B OR A JR Z,PrLsBx3 LD A," " ; конц. пробелы тек. пункта LD (DE),A INC DE INC DE DJNZ $-3 PrLsBx3:POP BC INC B POP AF DEC A JR Z,PrLsBx4 LD E,(HL) INC E DEC E JR NZ,PrLsBx0 PrLsBx4:OR A JR Z,PrLsBx6 PrLsBx5:PUSH AF PUSH BC CALL GetPutA LD A,(IY+3) SUB (IY+2) SUB 5 LD B,A SUB A LD (DE),A INC DE INC DE DJNZ $-3 POP BC INC B POP AF DEC A JR NZ,PrLsBx5 PrLsBx6:CALL PutDial POP AF OUT (SLOT3),A POP IX POP IY RET ; Процедура деления (16x8bit) ; вход: HL/C ; выход: l=целое, h=остаток Divis16X8: LD B,8 Div16X8:ADD HL,HL LD A,H JR C,Div1 SUB C JR NC,Div2 ADD A,C LD H,A DJNZ Div16X8 RET Div1: SUB C Div2: LD H,A INC HL DJNZ Div16X8 RET ; Процедура умножения (8*8bit) ; вход: e * c ; выход: hl=результат Mult8X8:SUB A LD L,A LD H,A LD D,A CP C RET Z CP E RET Z LD H,C LD B,8 Mlt8x8: ADD HL,HL JR NC,$+3 ADD HL,DE DJNZ Mlt8x8 RET