; Метка "###" - отработка "Enter" как Tab ; Метка "$$$" - раскомментарить, чтобы попадать Enter-ом ; (и Tab-ом) в InputLine. ; ; Буфер имени метки дискеты LabelBuff: DB 11 ; Max input symbols DB 0 ; ReadyString DB 0 ; Pos X DB 0 ; Add X DB 0 ; Inp.Symb LABEL: DS 12,0 cSystem: DB 0 ; 01/00 - созд./не созд. сист. дискету Mode0: DB 0 ; "Standart mode" Mode2: DB 1 ; "Optimize sectors" Mode1: DB 0 ; "Quick format" CurElem0: DW 0 ; тек. полож. курсора ListBox1-а CurElem1: DW 0 ; тек. полож. курсора ListBox2-а CurILFl: DB 0 ; флаг курсора 00-выкл/01-вкл ;Flag: DB 0 ; флаг курсора 00-нет/01-есть Timer: DB 1 ; таймер CursPos: DW 0 ; позиция курсора _OS: DB 0 ; 00/01/02 тип ОС (ms-dos/tr-dos/cpm) ; Опции выбора формата FDD ; диск "A" DriveA: SetDriveA0: DB 1 ; 1.44Mb 3.5" SetDriveA1: DB 0 ; 720kB 5.25" SetDriveA2: DB 0 ; None (ячейка не отслеживается) ; диск "B" DriveB: SetDriveB0: DB 0 ; 1.44Mb 3.5" SetDriveB1: DB 1 ; 720kB 5.25" SetDriveB2: DB 0 ; None ;[]===========================================================[] ; Отрисовка объекта ; Put object 'input line' ; Input: HL-label ; Format mouse table: ; +0 - Object ~Input line~ ; +1 - Xo position object ; +2 - Xi position object ; +3 - Y position object ; +4 - Xi position text ; +5 - Xo position input line ; +6 - Hot keys ; +7 - Context ; +8,9 - Address input buffer ; PInpLine: PUSH IY ; iy=DialTab+5 INC IY LD (IY+0),A ;+0 object LD A,(HL) ;X pos INC HL LD C,A ADD A,(IX+0) ;Pos X from begin screen LD (IY+1),A ;+1 Xo LD (IX+4),A ;Temp X coord 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 CALL GetPutA EX DE,HL LD A,(ColDialWn) LD C,A LD A,(DE) PInpLp1: INC DE CP '~' JR NZ,PInpN0 LD C,ColDhotkey ;LD C,A LD A,(DE) INC DE LD (HL),A INC HL RES 5,A LD (IY+6),A ;Hot key LD A,(HL) AND 0F0h OR C LD (HL),A INC HL INC DE INC (IX+4) LD A,(ColDialWn) LD C,A LD A,(DE) INC DE PInpN0: LD (HL),A INC HL LD (HL),C INC HL INC (IX+4) LD A,(DE) OR A JR NZ,PInpLp1 EX DE,HL INC HL LD A,(IX+4) LD (IY+4),A ;Xi position text LD A,(IX+4) LD (IY+5),A ;Xi position input line LD (next1+1),DE LD B,(HL) ;len input line INC HL LD A,(HL) ;context INC HL LD (IY+7),A LD E,(HL) ;DE-Address input buffer LD (IY+8),E INC HL LD D,(HL) LD (IY+9),D INC HL LD A,(DE) INC DE SUB A INC A LD (DE),A ;Ready DEC A INC DE LD (DE),A ;Pos X INC DE LD (DE),A ;Add X INC DE INC DE PUSH HL next1: LD HL,0 LD C,ColInpLine ; цвет строки ввода ;LD C,A PInpLp2: LD A,(DE) INC DE LD (HL),A INC HL LD (HL),C INC HL INC (IX+4) DJNZ PInpLp2 ; цикл прохода строки ввода POP HL LD E,(IY+5) LD D,(IY+3) LD (CursPos),DE LD A,(IX+4) LD (IY+2),A ;Xi position object LD BC,000Ah ADD IY,BC ;IY-next element PUSH IY EXX ;Len label objects POP HL POP DE OR A SBC HL,DE LD A,L LD (DE),A EXX RET ; Отрисовка объекта ; Object ~Claster radio buttons~ ; Input: HL-label ; Format mouse table: ; +0 - Object ~Claster radio buttons" ; +1 - Xo position object ; +2 - Xi position object ; +3 - Yo position object ; +4 - Yi position object ; +5 - Xi position name ; from: +0 - Y position radio button ; +1 - Hot key ; +2 - Context ; +3 - (Ceil) ; +4,5 - Address ceil ; 80h - End buttons PClRadioB: 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 SUB 2 LD C,A LD B,0 ADD A,4 ADD A,(IY+1) LD (IY+2),A ;Xi pos LD A,(HL) INC HL ADD A,3 ;Yi pos ADD A,(IY+3) LD (IY+4),A LD A,"┌" LD (DE),A INC DE LD A,ColLstBxFr ; цвет рамки LD (DE),A INC DE LD A," " LD (DE),A INC DE INC DE LDI ;$-5 INC DE LD A,(HL) OR A JR NZ,$-5 LD A," " LD (DE),A INC DE INC DE INC HL LD A,(IX+6) SUB C INC A ADD A,(IY+1) LD (IY+5),A ;Xi pos name LD A,C OR A JR Z,ClRadN1 LD B,C clrd1: LD A,"─" LD (DE),A INC DE LD A,ColLstBxFr ; LD (DE),A INC DE DJNZ clrd1 ClRadN1: LD A,"┐" LD (DE),A INC DE LD A,ColLstBxFr ; LD (DE),A INC (IX+5) LD BC,6 ;Next element claster ADD IY,BC ; LD C,(IX+4) ;Empty string LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"│" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL LD C,(IX+6) LD B,0 ADD HL,BC ADD HL,BC LD (HL),"│" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC (IX+5) EX DE,HL ; ; 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 ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL INC HL INC HL INC B 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,(ColDialWn) ;Put name element LD C,A LD A,(DE) ClRadL1: INC DE CP '~' JR NZ,ClRadN0 LD C,ColDhotkey ;LD C,A LD A,(DE) INC DE LD (HL),A INC HL RES 5,A LD (IY+1),A ;Hot key LD A,(HL) AND 0F0h OR C LD (HL),A INC HL INC DE LD A,(ColDialWn) 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+6) SUB B LD C,A LD B,0 ADD HL,BC ADD HL,BC LD (HL),"│" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr LD A,(IX+5) ;Current Y pos ADD A,(IX+1) ;from begin screen LD (IY+0),A INC IY INC IY EX DE,HL LD A,(HL) INC HL LD (IY+0),A ;Context INC IY LD C,(HL) INC HL LD B,(HL) INC HL LD A,(BC) LD (IY+0),A ;(Ceil) INC IY LD (IY+0),C ;BC=Ceil 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 ; LD C,(IX+4) ;End string LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"└" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL LD B,(IX+6) clrd2: LD A,"─" LD (HL),A INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL DJNZ clrd2 LD (HL),"┘" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr EX DE,HL PUSH IY EXX POP HL POP DE OR A SBC HL,DE LD A,L LD (DE),A EXX RET ; Отрисовка объекта ; Object ~Claster check buttons~ ; Input: HL-label ; Format mouse table: ; +0 - Object ~Claster check buttons" ; +1 - Xo position object ; +2 - Xi position object ; +3 - Yo position object ; +4 - Yi position object ; +5 - Xi position name ; from: +0 - Y position check button ; +1 - Hot key ; +2 - Context ; +3 - (Ceil) ; +4,5 - Address ceil ; 80h - End buttons PClCheckB: 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 SUB 2 LD C,A LD B,0 ADD A,4 ADD A,(IY+1) LD (IY+2),A ;Xi pos LD A,(HL) INC HL ADD A,3 ;Yi pos ADD A,(IY+3) LD (IY+4),A LD A,"┌" LD (DE),A INC DE LD A,ColLstBxFr ; LD (DE),A INC DE LD A," " LD (DE),A INC DE INC DE LDI ;$-5 INC DE LD A,(HL) OR A JR NZ,$-5 LD A," " LD (DE),A INC DE INC DE INC HL LD A,(IX+6) SUB C INC A ADD A,(IY+1) LD (IY+5),A ;Xi pos name LD A,C OR A JR Z,ClChkN1 LD B,C clch1: LD A,"─" LD (DE),A INC DE LD A,ColLstBxFr ; LD (DE),A INC DE DJNZ clch1 ClChkN1: LD A,"┐" LD (DE),A INC DE LD A,ColLstBxFr ; LD (DE),A INC (IX+5) LD BC,6 ;Next element claster ADD IY,BC ; LD C,(IX+4) ;Empty string LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"│" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL LD C,(IX+6) LD B,0 ADD HL,BC ADD HL,BC LD (HL),"│" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC (IX+5) EX DE,HL ; 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 ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL INC HL INC HL INC B 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,(ColDialWn) ;Put name element LD C,A LD A,(DE) ClChkL1: INC DE CP '~' JR NZ,ClChkN0 LD C,ColDhotkey ;LD C,A LD A,(DE) INC DE LD (HL),A INC HL RES 5,A LD (IY+1),A ;Hot key LD A,(HL) AND 0F0h OR C LD (HL),A INC HL INC DE LD A,(ColDialWn) 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+6) SUB B LD C,A LD B,0 ADD HL,BC ADD HL,BC LD (HL),"│" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr ; LD A,(IX+5) ;Current Y pos ADD A,(IX+1) ;from begin screen LD (IY+0),A INC IY INC IY EX DE,HL LD A,(HL) INC HL LD (IY+0),A ;Context INC IY LD C,(HL) INC HL LD B,(HL) INC HL LD A,(BC) LD (IY+0),A ;(Ceil) INC IY LD (IY+0),C ;BC=Ceil 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 ; LD C,(IX+4) ;End string LD B,(IX+5) CALL GetPutA EX DE,HL LD (HL),"└" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL LD B,(IX+6) clch2: LD A,"─" LD (HL),A INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr INC HL DJNZ clch2 LD (HL),"┘" INC HL ;ld a,(ColLstBxFr) ; LD (HL),ColLstBxFr EX DE,HL PUSH IY EXX POP HL POP DE OR A SBC HL,DE LD A,L LD (DE),A EXX RET ; Отрисовка объекта ; Object ~Frame~ ; Input: HL-label ; Format mouse table: None ; PFrame: LD C,(HL) ; X pos INC HL LD B,(HL) ; Y pos INC HL ; X len INC HL ; Y len LD A,(HL) PUSH AF ; сохр. Y len PUSH BC CALL GetPutA LD A,"┌" LD (DE),A INC DE LD A,ColorFrame LD (DE),A INC DE DEC HL LD B,(HL) ; X len .loop1: LD A,"─" LD (DE),A INC DE LD A,ColorFrame LD (DE),A INC DE DJNZ .loop1 LD A,"┐" LD (DE),A INC DE LD A,ColorFrame LD (DE),A POP BC .loop2: INC B PUSH BC CALL GetPutA EX DE,HL LD (HL),"│" INC HL LD (HL),ColorFrame INC HL EX DE,HL LD B,(HL) ; X len .loop3: LD A," " LD (DE),A INC DE LD A,ColorFrame ; цвет внутри фрейма LD (DE),A INC DE DJNZ .loop3 LD A,"│" LD (DE),A INC DE LD A,ColorFrame LD (DE),A INC DE POP BC INC HL DEC (HL) DEC HL JR NZ,.loop2 INC B CALL GetPutA LD A,"└" LD (DE),A INC DE LD A,ColorFrame LD (DE),A INC DE LD B,(HL) ; X len INC HL POP AF LD (HL),A ; восст. Y len .loop4: LD A,"─" LD (DE),A INC DE LD A,ColorFrame LD (DE),A INC DE DJNZ .loop4 LD A,"┘" LD (DE),A INC DE LD A,ColorFrame LD (DE),A INC HL RET ;[]===========================================================[] ; Event Input Line EInpLine: LD HL,what ; список событий LD A,(HL) INC HL CP evMouseFr JR Z,EImouse CP evKeyboard JR Z,EIkeys CP evCombKey JP Z,EIcombK RET ;Event - Mouse fire EImouse: LD E,(HL) ;Xcoord INC HL LD D,(HL) ;Ycoord LD A,D CP (IX+4) ;Y pos input line RET NZ 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 BIT 7,(IX+1) JR Z,SetInLn BIT 7,(IX+6) JR NZ,$+6 CP (IX+6) ;Xo inp.line RET C SUB (IX+6) ;shift from begin LD C,A LD L,(IX+9) LD H,(IX+0Ah) INC HL LD (HL),0 ;Flag INC HL CP (HL) RET Z PUSH HL INC HL ADD A,(HL) ;AddX INC HL CP (HL) ;InpSymb LD A,(HL) POP HL JR Z,EIM JR C,EIM INC HL SUB (HL) DEC HL LD C,A EIM: LD (HL),C DEC HL DEC HL PUSH IY PUSH HL POP IY CALL PrnInLn POP IY JR InLnExt ;Event - Key press EIkeys: BIT 7,(IX+1) JR NZ,ILwork LD A,(HL) ; what+1 RES 5,A ; CP 9 ; Tab ; JR Z,SetInLn ; cp 0Dh ; $$$ ; jr z,SetInLn CP (IX+7) ;Hot key RET NZ SetInLn: CALL MoveObj ;Select Input line CALL ResDialInv ;Reset previos invert LD IX,DialTab+5 LD E,(IX+2) ;Xo LD D,(IX+4) ;Y LD A,(IX+5) ;Xi text SUB E LD C,A ;Len text CALL SetDialInv PUSH IY LD L,(IX+9) LD H,(IX+0Ah) PUSH HL POP IY INC HL LD (HL),1 ;Flag INC HL SUB A LD (HL),A ;Pos X INC HL LD (HL),A ;Add X INC HL CALL PrnInLn POP IY CALL PILCurs ; уст. курсор EI InLnExt: LD HL,what LD (HL),evNothing JP GetFire ; Work select input line ILwork: LD A,(HL) ; what+1 Get keys ILwrk2: CP 8 JR Z,ILw1 CP " " RET C ILw1: PUSH IY LD DE,InLnWex PUSH DE LD L,(IX+9) ;Address buffer LD H,(IX+0Ah) PUSH HL POP IY PUSH AF RES 7,(IY+1) LD A,1 AND 1 RRCA OR (IY+1) LD (IY+1),A POP AF CP 8 JP Z,ILdelet EX AF,AF' BIT 0,(IY+1) CALL NZ,ClearIL LD A,(IY+4) ;InpytSymb CP (IY+0) ;Max len JR NZ,ILn LD A,(IY+2) ADD A,(IY+3) CP (IY+0) RET NC BIT 7,(IY+1) RET NZ ILn: LD A,(IY+4) SUB (IY+3) SUB (IY+2) JR Z,NoInsrt DEC (IY+4) BIT 7,(IY+1) JR Z,NoInsrt INC (IY+4) ; Ввод в середину текста LD C,A LD B,0 LD L,(IX+9) LD H,(IX+0Ah) LD A,(IY+4) ADD A,L LD L,A JR NC,$+3 INC H INC HL INC HL INC HL INC HL INC HL LD D,H LD E,L DEC HL LDDR NoInsrt: LD L,(IX+9) LD H,(IX+0Ah) LD A,(IY+2) ADD A,(IY+3) ADD A,L LD L,A JR NC,$+3 INC H INC HL INC HL INC HL INC HL INC HL EX AF,AF' LD (HL),A INC (IY+4) INC (IY+2) LD A,(IX+3) SUB (IX+6) CP (IY+2) CALL Z,OutIL CALL PrnInLn POP DE InLnWex: LD HL,what LD (HL),evNothing POP IY RET ;Курсор за экраном OutIL: LD A,(IY+3) ADD A,8 ;Step LD (IY+3),A LD A,(IY+2) SUB 8 ;Step LD (IY+2),A RET ;Clear Buffer ClearIL: SUB A LD B,(IY+0) LD L,(IX+9) LD H,(IX+0Ah) INC HL INC HL INC HL INC HL INC HL LD (HL),A DJNZ $-2 LD (IY+4),A RES 0,(IY+1) RET ; Combination keys EIcombK: BIT 7,(IX+1) JR NZ,EIcombn PUSH IX LD E,(IX+0) LD D,0 ADD IX,DE BIT 7,(IX+0) POP IX RET Z INC HL LD A,(HL) ; what+2 Shift+Tab CP 9 RET NZ JP SetInLn ; выделить пред. объект ; EIcombn: PUSH IY LD C,(HL) ; what+1 INC HL LD A,(HL) ; what+2 LD L,(IX+9) ; Address buffer LD H,(IX+0Ah) LD DE,InLnWex PUSH DE PUSH HL POP IY BIT 7,C ; курсорные или shift+... ? JR NZ,eicmb1 ; Shift+... CP 54h JR Z,ILleft ; курсор влево CP 56h JR Z,ILright ; курсор вправо CP 4Fh JP Z,IL_del_ ; удалить символ в тек. позиции CP 57h JP Z,ILHome ; в начало строки CP 51h JP Z,ILEnd ; в конец строки JR eicmb2 eicmb1: CP " " JR C,eicmb2 CP "~"+1 JP C,ILwrk2 ; на ввод символов eicmb2: POP DE POP IY RET ;Курсор влево на одно место ILleft: LD A,(IY+2) DEC A JP P,ILlfnxt LD A,(IY+3) SUB 8 ;Step RET C LD (IY+3),A LD A,(IY+2) ADD A,8 ;Step ILlfnxt: LD (IY+2),A CALL PrnInLn RES 0,(IY+1) RET ;Курсор вправо на одно место ILright: LD A,(IY+2) ADD A,(IY+3) CP (IY+4) RET Z LD A,(IX+3) SUB (IX+6) LD B,A LD A,(IY+2) INC A CP B JR NZ,ILrgnxt LD A,(IY+3) ADD A,8 ;Step LD (IY+3),A LD A,(IY+2) SUB 8 ;Step ILrgnxt: LD (IY+2),A CALL PrnInLn RES 0,(IY+1) RET ;delete ILdelet: LD A,(IY+2) OR A JR NZ,ILDelNx LD A,(IY+3) SUB 8 ;Step RET C LD (IY+3),A LD A,(IY+2) ADD A,8 ;Step LD (IY+2),A ILDelNx: LD L,(IX+9) LD H,(IX+0Ah) LD A,(IY+2) ADD A,(IY+3) ADD A,L LD L,A JR NC,$+3 INC H INC HL INC HL INC HL INC HL INC HL LD D,H LD E,L DEC DE LD A,(IY+4) SUB (IY+3) SUB (IY+2) JR Z,ILDelN LD C,A LD B,0 LDIR ILDelN: SUB A LD (DE),A DEC (IY+2) DEC (IY+4) CALL PrnInLn RES 0,(IY+1) RET ;Delete Char in Current Position IL_del_: LD L,(IX+9) LD H,(IX+0Ah) LD A,(IY+2) INC A ADD A,(IY+3) ADD A,L LD L,A JR NC,$+3 INC H INC HL INC HL INC HL INC HL INC HL LD D,H LD E,L DEC DE LD A,(IY+4) SUB (IY+3) SUB (IY+2) RET Z LD C,A LD B,0 LDIR SUB A LD (DE),A DEC (IY+4) CALL PrnInLn RES 0,(IY+1) RET ;Home ILHome: LD A,(IY+2) OR A RET Z SUB A LD (IY+2),A LD (IY+3),A CALL PrnInLn RES 0,(IY+1) RET ;End string ILEnd: LD A,(IY+4) SUB (IY+3) CP (IY+2) RET Z ADD A,(IY+3) LD C,A LD (IY+3),0 LD A,(IX+3) SUB (IX+6) SUB C JR Z,ILEndLp JR NC,EndNIL NEG ILEndLp: LD C,A LD A,(IY+3) ADD A,8 ;Step LD (IY+3),A LD A,C SUB 8 ;Step JR NC,ILEndLp EndNIL: LD A,(IY+4) SUB (IY+3) LD (IY+2),A CALL PrnInLn RES 0,(IY+1) RET ;[]===========================================================[] ; Put Input Line in window PrnInLn: LD A,(CurILFl) PUSH AF CALL ResILCr ; сбросить курсор LD HL,0 LD E,(IX+6) ;Xo pos inp.line LD D,(IX+4) ;Y pos object BIT 7,(IX+3) JP NZ,prne BIT 7,E JR Z,$+7 LD A,E NEG LD L,A LD E,H LD (prnadd+1),HL ;LD C,BIOS.LP_SET_PLACE ; уст. позицию курсора ;RST ToBIOS LD C,Dss.Locate RST ToDSS LD L,(IX+9) ;Address buffer LD H,(IX+0Ah) LD A,(IY+3) ADD A,L LD L,A JR NC,$+3 INC H INC HL INC HL INC HL INC HL INC HL LD A,(IX+3) ;Xi-Xo(inp.ln.)=Len inp.ln. SUB (IX+6) LD E,A LD C,A LD B,A LD A,(IX+6) ADD A,C CP 80+1 JR C,$+8 LD A,80 SUB (IX+6) LD B,A BIT 7,(IX+6) JR Z,$+11 LD A,(IX+6) NEG SUB C NEG LD B,A PUSH BC SUB A LD B,E LD DE,CompBuff PUSH DE LD (DE),A INC DE DJNZ $-2 LD A,(IY+0) SUB (IY+3) CP C JR NC,$+3 LD C,A LD B,0 LD A,(IY+4) SUB C JR NC,$+4 ADD A,C LD C,A POP DE PUSH DE LD A,B OR C JR Z,$+4 LDIR POP HL POP BC prnadd: LD DE,0 ADD HL,DE LD A,B OR A JR Z,prne LD C,86h ; вывод строки без атрибутов RST ToBIOS prne: LD A,(IY+2) ADD A,(IX+6) LD E,A LD D,(IX+4) LD (CursPos),DE POP AF OR A CALL NZ,PILCurs ; уст. курсор EI PUSH IY LD IY,DialData LD A,(IX+6) SUB (IY+0) LD C,A LD A,(IX+4) SUB (IY+1) LD B,A POP IY PUSH IX LD IX,DialData CALL GetPutA POP IX LD HL,CompBuff LD A,(IX+3) ;Xi-Xo(inp.ln.)=Len inp.ln. SUB (IX+6) LD C,A LD B,0 IN A,(Page3) PUSH AF LD A,(hPages.Win2) OUT (Page3),A LDI INC DE JP PE,$-3 POP AF OUT (Page3),A RET ;;;;;;;;;;;;;;;; PILCurs: LD DE,(CursPos) ; уст. курсор LD (ResILCr.CrPs),DE BIT 7,E JR NZ,.cre ; LD C,Dss.Locate RST ToDSS ; LD BC,Dss.K_SETUP.ShowCursor RST ToDSS ; .cre: LD A,1 LD (CurILFl),A LD A,12 ;!FIXIT надо ли? RET ;;;;;;;;;;;;;;;; ; Сбросить курсор ResILCr: LD A,(CurILFl) OR A RET Z ; .CrPs+1: LD DE,0 BIT 7,E RET NZ ; LD BC,Dss.K_SETUP.HideCursor RST ToDSS XOR A LD (CurILFl),A RET ;;;;;;;;;;;;;;;; ;!FIXIT CURSOR переделать курсор на дос и убрать перехвать прерываний ;Курсор объекта InputLine ; PrnILCr: LD A,(Timer) ;пауза мигания ; DEC A ; CALL Z,.PutILCr ; LD (Timer),A ; RET ; ; ; .PutILCr: LD A,(Flag) ; CPL ; LD (Flag),A ; PILCurs: LD DE,(CursPos) ; уст. курсор ; LD (ResILCr.CrPs),DE ; BIT 7,E ; JR NZ,.cre ; ; ; LD C,0B4h ; получить символ ; SUB A ; RST ToBIOS ; LD A,(Flag) ; OR A ; LD B,1Bh ; JR Z,.NoILC ; LD B,5Bh ; курсор черточкой ; .NoILC: LD C,0B5h ; символ на экран ; SUB A ; RST ToBIOS ; .cre: LD A,1 ; LD (CurILFl),A ; LD A,12 ; RET ;;;;;;;;;;;;;;;; ; Сбросить курсор ; ResILCr: LD A,(CurILFl) ; OR A ; RET Z ; LD A,#FF ; LD (Flag),A ; INC A ; LD (CurILFl),A ; LD A,12 ; LD (Timer),A ; .CrPs+1: LD DE,0 ; BIT 7,E ; RET NZ ; ; ; LD C,#B4 ; получить символ ; SUB A ; RST ToBIOS ; LD BC,1BB5h ; символ на экран ; SUB A ; RST ToBIOS ; RET ;;;;;;; ; InpLineI: LD E,(IX+2) ;Xo LD D,(IX+4) ;Y LD A,(IX+5) ;Xi text SUB E LD C,A ;Len text CALL SetDialInv LD DE,(CursPos) CALL PILCurs ; уст. курсор EI RET ClastI: 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 E,(IX+2) ;Xo INC E LD D,(IX+7) ;Y elem LD A,(IX+3) SUB E DEC A LD C,A ;Len X JP SetClasInv ; Set claster buttons invert ; Input: ; E - X pos ; D - Y pos ; C - X len SetClasInv: PUSH IX LD IX,DialData IN A,(Page3) PUSH AF ;сохр.page4 LD A,(hPages.Win2) OUT (Page3),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 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 E,ColDialInv ;LD E,A LD D,ColDhotkey ;LD D,A SetDin2: INC HL LD A,(HL) AND 0Fh CP D JR Z,.loc2 ;$+5 LD A,(HL) ;XOR E AND 0xF0 ; OR E ; LD (HL),A .loc2: INC HL DJNZ SetDin2 LD IX,(RClIbuf+2) ;Put Name with invert LD HL,(RClIlen+1) LD DE,(RClIpos+1) CALL PutDialLn POP HL POP AF OUT (Page3),A POP IX LD E,(IX+2) ;Xo pos element INC E INC E INC E LD D,(HL) ;Y pos element LD (CursPos),DE PUSH HL CALL PILCurs ; Set cursor POP HL LD A,1 LD (CIflag+1),A RET ; Get claster data GetClDt: PUSH IX POP HL LD BC,7 ADD HL,BC ;Begin claster elements GetDtLp: INC HL ;Ypos INC HL ;Hot key INC HL ;Context LD A,(HL) ;(Ceil) INC HL LD E,(HL) ;Address Ceil INC HL ; LD D,(HL) ; INC HL LD (DE),A BIT 7,(HL) ;7bit-end claster JR Z,GetDtLp RET ;[]===========================================================[] ; Event claster radio/check buttons ; EClasterB: 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 ; Event - Mouse fire ; проверка координат мышки ECmouse: LD E,(HL) ;Xpos INC HL LD D,(HL) ;Ypos 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 RET C ;< CP (IX+5) ;Yi pos RET NC ;> SUB A LD (ECnext+1),A DEC A LD (SaveA1+1),A ;Begin element claster PUSH IX POP HL INC HL LD BC,6 ;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 ;Event - Key press ECkeys: SUB A LD (ECnext+1),A DEC A LD (SaveA1+1),A ;Begin element claster LD A,(HL) ; CP 0Dh ; JR Z,ECspace ; test on "Enter" CP " " JR Z,ECspace ; test on "Space" RES 5,A BIT 7,(IX+1) JR NZ,ECkeyN ; I is select CP 9 ; Tab JP Z,SelCls0 ; выделить след. объект CP 0Dh ; ### JP Z,SelCls0 ; выделить след. объект ECkeyN: PUSH IX POP HL INC HL LD BC,6 ;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) ;NZ-object is select JP NZ,CSelect JP SelCls1 ;Test on space 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 LD DE,6 LD B,A ADD HL,DE ;find elem.label DJNZ $-1 JP ECnext ;change ;Test on cursor keys ECcombK: BIT 7,(IX+1) JR NZ,ECcombn ;is select PUSH IX LD E,(IX+0) LD D,0 ADD IX,DE BIT 7,(IX+0) POP IX RET Z INC HL LD A,(HL) ; Shift+Tab CP 9 RET NZ JP SelCls0 ; выделить пред. объект ; ECcombn: SUB A LD (ECnext+1),A ;Flag change buttons INC HL LD A,(HL) 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 LD E,L LD D,H LD BC,6 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 ;Cursor up ECup: PUSH IX POP HL INC HL LD DE,6 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 LD E,(IX+2) ;Xo name INC E LD D,(IX+4) ;Y name LD A,(IX+6) ;Xi name SUB E LD C,A ;len name CALL SetDialInv ;Set my invert 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 ;Event - Mouse fire (in select claster) 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 LD DE,6 SavElem: LD A,0 OR A JR NZ,$+3 INC A LD B,A ADD HL,DE DJNZ $-1 Pcurs: LD E,(IX+2) ;Xo pos element INC E LD D,(HL) ;Y pos element LD A,(IX+3) SUB E DEC A LD C,A ;len element 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 GetFire ;[]===========================================================[] ; Change buttons (Check/Radio) ; Input parameters: HL-Address claster element label ChangeB: LD A,(IX+1) RES 7,A CP ClRadioBut JP Z,ChangeR ; Change check button 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,(Page3) PUSH AF LD A,(hPages.Win2) OUT (Page3),A ChangL2: LD D,(HL) ;Ypos INC HL INC HL INC HL LD A,(HL) ;Address ceil INC HL INC HL INC HL LD E,(IX+2) ;X pos INC E INC E 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,BIOS.LP_SET_PLACE ; уст. позицию курсора RST ToBIOS POP AF OR A LD A," " JR Z,$+4 LD A,"" LD BC,0182h RST ToBIOS ;Print on/off POP HL cl1: BIT 7,(HL) JR Z,ChangL2 CALL ResILCr ; сбросить курсор CALL PILCurs ; Set cursor EI POP AF OUT (Page3),A RET ;Change radio button ([x]) ChangeR: IN A,(Page3) PUSH AF LD A,(hPages.Win2) OUT (Page3),A LD D,(HL) ;Ypos INC HL INC HL INC HL LD A,(HL) ;Address ceil XOR 1 LD (HL),A INC HL INC HL INC HL LD E,(IX+2) ;Xpos INC E INC E 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,BIOS.LP_SET_PLACE ; уст. позицию курсора RST ToBIOS POP AF OR A LD A," " JR Z,$+4 LD A,"x" LD BC,0182h RST ToBIOS ;Print cl2: CALL ResILCr ; сбросить курсор CALL PILCurs ; уст. курсор EI POP AF OUT (Page3),A RET