; Содержит объекты ~Input Line~ и ~Inp Line~ (ввод даты/времени файлов) ; ;===================================================================== ; Прорисовка объекта ; object ~Input Line~ (имеет фокус) ; Input: HL-описатель объекта ; Format table (данная таблица в DialTab): ; +0 - номер объекта ~Input Line~ ; +1 - Xo левая позиция объекта ; +2 - Xi правая позиция объекта ; +3 - Y позиция объекта ; +4 - Xi position text (позиция имени кластера ?) ; +5 - Xo левая позиция поля ввода ; +6 - ;Hot-keys (имени кластера) ; +7 - контекст ; +8,9 - адрес структуры строки ввода ;--------------------------------------------------------------------- ; Формат описателя: ; db InputLine ; номер объекта ; dw 0503h ; Yo,Xo ; db 10 ; ширина поля ввода ; db 1 ; контекст ; dw InputBuffer ; структура строки ввода ;===================================================================== PutInputLine: push iy ; iy=DialTab+5 inc iy ; пройти ячейку длины данной таблицы ld (iy+0),a ;+0 номер объекта "Input Line" ld a,(hl) ; X pos inc hl ld c,a add a,(ix+0) ; X полож. от начала экрана ld (iy+1),a ;+1 Xo ld (ix+4),a ; X temp coord ld a,(hl) ; Y pos inc hl ld b,a add a,(ix+1) ; Pos Y от начала экрана ld (iy+3),a ;+3 Yo позиция курсора call GetPutA ld a,(ix+4) ; левый край поля ввода (экран. координаты) ld (iy+4),a ; Xi правая позиция начала текста ld (iy+5),a ;+5 Xi правая позиция курсора ld (pInputAddr+1),de ; адрес в экран. буфере ld a,(hl) ; ширина поля ввода (из описателя) ld (pInputWidth+1),a inc hl ld a,(hl) ; контекст inc hl ld (iy+7),a ;+7 ld e,(hl) inc hl ld d,(hl) ld (iy+8),e ;+8 de=структура строки ввода ld (iy+9),d ;+9 inc hl inc de ; пройти ячейку "+0" ; Инициализация структуры строки ввода push hl ld hl,4 ; смещ. до буфера строки add hl,de xor a ld c,a ld b,a cpir ; найти конец строки ld a,c cpl ld b,a ; длина строки ld c,0 ; смещ. строки за левый край ld a,(pInputWidth+1) ; ширина поля ввода sub b ; ширина поля - длина строки jr nc,pInputLine1 ; строка короче поля редактирования neg inc a ld c,a ; смещ. строки за левый край ld a,(pInputWidth+1) ; ширина поля ввода dec a jr $+3 pInputLine1: ld a,b pop hl ex de,hl ld (hl),1 ;+1 флаг=1 ReadyString inc hl ld (hl),a ;+2 X позиция курсора в пределах строки inc hl ld (hl),c ;+3 X смещ. строки за левый край inc hl ld (hl),b ;+4 кол-во введ. символов inc hl ex de,hl push hl add a,(iy+5) ; X позиция курсора ld l,a ld h,(iy+3) ; Y позиция курсора ld (CursorPos),hl ; Y/X позиция курсора ld b,0 ex de,hl add hl,bc ; de=остаток видимой строки ex de,hl ; перекачать данные из буфера строки в экран. буфер pInputAddr: ld hl,0 ; адрес в экран. буфере ld a,(color_array+33) ; цвет строки ввода and 0F0h or 08h ld c,a ; цвет не редакт. строки ввода pInputWidth: ld b,1 ; ширина поля ввода ld a,(de) inc de ld (hl),a inc hl ld (hl),c ; цвет строки inc hl inc (ix+4) ; X ++правый край поля ввода (экран. координаты) djnz $-9 pInputLine2: ; из "PutInpLine" pop hl ld a,(ix+4) ; X правый край поля ввода (экран. координаты) ld (iy+2),a ; Xi правая позиция объекта ld bc,10 ; размер таблицы add iy,bc ; IY-next element ; сохр. размер таблицы в Таблице объектов push iy exx pop hl pop de ; de=iy and a sbc hl,de ; длина таблицы "Input Line" ld a,l ld (de),a ; DialTab+5 exx ret ;===================================================================== ; ; Обработчик событий объектов "Input Line" ; ;===================================================================== step_scroll equ 1 ; шаг скроллинга EvInputLine: ld hl,what ; список событий ld a,(hl) inc hl cp evMouseFr jr z,EvInputMouse cp evKeyboard jr z,EvInputKeys cp evCombKey jp z,EvInputComb ret ; Событие - Мышка EvInputMouse: LD E,(HL) ; X coord INC HL LD D,(HL) ; Y coord 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) ; Sel or nosel JR Z,SetInputLine ; выделить, объект не в фокусе BIT 7,(IX+6) JR NZ,$+6 CP (IX+6) ; Xo input line RET C SUB (IX+6) ; Shift from begin LD C,A LD L,(IX+9) ; структура буфера LD H,(IX+10) INC HL LD (HL),0 ;+1 уст. флаг "не стирать строку" INC HL CP (HL) ;+2 X тек. полож. курсора в строке RET Z ;PUSH HL INC HL ADD A,(HL) ;+3 X смещ. строки за левый край INC HL CP (HL) ;+4 число введ. символов LD A,(HL) ;POP HL dec hl; dec hl; JR Z,EIM JR C,EIM INC HL SUB (HL) ;+3 DEC HL LD C,A EIM: ld (hl),c ;+2 X тек. полож. курсора в строке dec hl dec hl push iy push hl pop iy call PrnInLn ; вывести строку на экран pop iy jr InputLineExt ; Событие - обычная клавиша EvInputKeys: bit 7,(ix+1) ; Sel or nosel jr nz,InputLineWork ; объект уже выделен ld a,(hl) ;+1 what cp 9 ; Tab ret nz ; фокус на объект "Input Line" SetInputLine: call MoveObj ; Select "Input line" call ResDialInv ; Reset previos object ld ix,DialTab+5 ; Таблица объектов push iy ld l,(ix+9) ; hl=структура строки ввода "Input Line" ld h,(ix+10) push hl pop iy inc hl ld (hl),1 ;+1 флаг ReadyString (1=очистить строку при вводе) ld a,(color_array+33) ; цвет строки ввода and 0F0h or 08h ld (ColorInLn+1),a ; цвет не редакт. строки call PrnInLn ; вывести строку на экран ld a,(color_array+33) ld (ColorInLn+1),a ; восст. цвет pop iy call PILCurs ; вкл. курсор ei InputLineExt: ld hl,what ; поле событий ld (hl),evNothing jp get_fire ; Работа в строке редактирования InputLineWork: LD A,(HL) ; what+1 код клавиши CP 8 ; "забой" JR Z,$+5 CP " " RET C PUSH IY LD DE,InputLineWex PUSH DE LD L,(IX+9) ; hl=структура строки ввода LD H,(IX+10) PUSH HL POP IY ex af,af' res 7,(iy+1) ;+1 флаг ReadyString ld a,(D0642) ; флаги клавы bit 1,a ; бит Ins ld a,1 ; вставка jr nz,$+3 dec a ; замена and 1 rrca ; вправо (мл.бит -> перенос) or (iy+1) ld (iy+1),a ex af,af' CP 8 ; "забой" JP Z,BackDelete EX AF,AF' BIT 0,(IY+1) ;+1 флаг ReadyString CALL NZ,ClearIL ; очистить всю строку и ее буфер LD A,(IY+4) ; InputSymb CP (IY+0) ; Max len JR NZ,InLineWork LD A,(IY+2) ADD A,(IY+3) CP (IY+0) RET NC BIT 7,(IY+1) RET NZ InLineWork: LD A,(IY+4) SUB (IY+3) SUB (IY+2) JR Z,NoInsert DEC (IY+4) BIT 7,(IY+1) JR Z,NoInsert INC (IY+4) ; ввод в середину текста (вставка) LD C,A LD B,0 LD L,(IX+9) LD H,(IX+10) 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 NoInsert: LD L,(IX+9) LD H,(IX+10) 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) ; X тек. полож. курсора в пределах строки CALL Z,OutIL ; курсор за полем ввода CALL PrnInLn ; вывести строку на экран POP DE InputLineWex: LD HL,what ; поле событий LD (HL),evNothing POP IY RET ; Курсор за полем ввода OutIL: ld a,(iy+3) add a,step_scroll ; шаг скроллинга ld (iy+3),a ld a,(iy+2) sub step_scroll ; шаг скроллинга ld (iy+2),a ret ; Очистить редакт. строку ClearIL:xor a ld b,(iy+0) ;+0 длина буфера редакт. строки ld l,(ix+9) ; hl=структура строки ввода ld h,(ix+10) inc hl inc hl inc hl inc hl inc hl ;+5 буфер редакт. строки ld (hl),a djnz $-2 ld (iy+2),a ;+2 X позиция курсора в пределах строки ld (iy+3),a ;+3 X смещ. строки за левый край ld (iy+4),a ;+4 сбр. число введенных символов res 0,(iy+1) ;+1 сбр. флаг ReadyString ret ; Событие - курс. клавиши или комбинации EvInputComb: bit 7,(ix+1) ; sel or nosel jr nz,EvInputComb1 ; объект уже выделен ld b,(hl) ;+1 what inc hl ld a,(hl) ;+2 what cp 56h ; курсор вправо jp z,SetInputLine 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,SetInputLine ld a,b and 00111111b ; биты Ctrl, Alt ret nz ld a,(hl) ;+2 what cp 15+80h ; Tab скен-код+80h ret nz jp SetInputLine ; Shift+Tab, на предыдущий объект ; EvInputComb1: push iy inc hl ld a,(hl) ;+2 what ld l,(ix+9) ; Address buffer ld h,(ix+10) ld de,InputLineWex push de push hl pop iy cp 54h ; курсор влево jr z,InputLeft cp 56h ; курсор вправо jr z,InputRight cp 4Fh ; Del удалить символ в тек. позиции jp z,InputDel cp 57h ; Home в начало строки jp z,InputHome cp 51h ; End в конец строки jp z,InputEnd pop de pop iy ret ; Курсор влево на одно место InputLeft: ld a,(iy+2) dec a jp p,InLeft ld a,(iy+3) sub step_scroll ; шаг скроллинга ret c ; курсор в крайнем левом полож. ld (iy+3),a ; X смещ. строки за левый край (в символах) ld a,(iy+2) ; X полож. курсора в пределах строки add a,step_scroll-1 ; шаг скроллинга InLeft: ld (iy+2),a call PrnInLn ; вывести строку на экран res 0,(iy+1) ;+1 ReadyString сбр.флаг "стереть строку" ret ; Курсор вправо на одно место InputRight: ld a,(iy+2) add a,(iy+3) cp (iy+4) jr z,InputRight2 ; для "сменить цвет строки" ld a,(ix+3) sub (ix+6) ld b,a ld a,(iy+2) inc a cp b jr nz,InRight ld a,(iy+3) ; X смещ. строки за левый край (в символах) add a,step_scroll ; шаг скроллинга ld (iy+3),a ld a,(iy+2) ; X полож. курсора в пределах строки sub step_scroll-1 ; шаг скроллинга InRight:ld (iy+2),a InputRight2: call PrnInLn ; вывести строку на экран res 0,(iy+1) ;+1 ReadyString сбр.флаг "стереть строку" ret ; Забой - удалить символ левее курсора BackDelete: LD A,(IY+2) OR A JR NZ,BackDelete1 LD A,(IY+3) SUB step_scroll ; шаг скроллинга RET C LD (IY+3),A LD A,(IY+2) ADD A,step_scroll ; шаг скроллинга LD (IY+2),A BackDelete1: LD L,(IX+9) LD H,(IX+10) 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,$+7 LD C,A LD B,0 LDIR xor a ld (de),a DEC (IY+2) ; X полож. курсора в пределах строки DEC (IY+4) ; число введ. символов CALL PrnInLn ; вывести строку на экран RES 0,(IY+1) ;+1 ReadyString сбр.флаг "стереть строку" RET ; Delete - удалить символ в тек. позиции InputDel: LD L,(IX+9) LD H,(IX+10) 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) ;+1 ReadyString сбр.флаг "стереть строку" RET ; Home - в начало строки InputHome: ld a,(iy+2) ; X полож. курсора в пределах строки add a,(iy+3) ; смещ. строки за левый край ret z xor a ld (iy+2),a ; X полож. курсора в пределах строки ld (iy+3),a ; смещ. строки за левый край call PrnInLn ; вывести строку на экран res 0,(iy+1) ;+1 ReadyString сбр.флаг "стереть строку" ret ; End - в конец строки InputEnd: ld a,(iy+4) sub (iy+3) cp (iy+2) jr z,InEnd1 ; для "сменить цвет строки" add a,(iy+3) ld c,a ld (iy+3),0 ld a,(ix+3) sub (ix+6) sub c jr z,$+6 jr nc,InEndNIL neg InEndLp:ld c,a ld a,(iy+3) ; X смещ. строки за левый край (в символах) add a,step_scroll ; шаг скроллинга ld (iy+3),a ld a,c sub step_scroll ; шаг скроллинга jr nc,InEndLp InEndNIL: ld a,(iy+4) sub (iy+3) ld (iy+2),a ; X полож. курсора в пределах строки InEnd1: call PrnInLn ; вывести строку на экран res 0,(iy+1) ;+1 ReadyString сбр.флаг "стереть строку" ret ;----------------------------------------------------------- ; Вывод строки объекта "Input Line" на экран ;----------------------------------------------------------- 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" LD A,E NEG LD L,A LD E,H LD (prnadd+1),HL LD C,84h ; уст. позицию курсора RST 08h LD L,(IX+9) ; hl=структура строки ввода LD H,(IX+10) 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.line) = Len inp.line 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,work_buffer ; раб. буфер InputLine 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 ColorInLn: ld e,31h ; цвет выдел. объекта (color_array+26) ld c,85h ; вывод строки с атрибутами RST 08h prne: LD A,(IY+2) ADD A,(IX+6) LD E,A LD D,(IX+4) LD (CursorPos),de ; Y/X позиция курсора 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,work_buffer ; раб. буфер InputLine LD A,(IX+3) ; Xi - Xo (inp.line) = Len inp.line SUB (IX+6) LD C,A LD B,0 IN A,(SLOT3) PUSH AF LD A,(page_dial_screen) OUT (SLOT3),A LDI INC DE JP PE,$-3 POP AF OUT (SLOT3),A RET ;------------------------------------------------- ; Установить фокус на объект "Input Line" ;------------------------------------------------- InpLineI: ld de,color_array+33 ; цвет строки ввода ld (set_dial_tmp_inv+1),de ld e,(ix+2) ; Xo left коорд. имени кластера ld d,(ix+4) ; Y ld a,(ix+5) ; Xi right коорд. имени кластера sub e ld c,a ; длина выдел. метки call SetDialInv ld de,color_array+26 ; цвет Selected title (объекта) ld (set_dial_tmp_inv+1),de ld de,(CursorPos) ; Y/X позиция курсора call PILCurs ; вкл. курсор ei ret ;--------------------------------------------------------------------- ;===================================================================== ; Прорисовка объекта ~Inp Line~ ; ; Отличие от "Input Line" - режим "замены" текста; нет цвета не ред. ; строки; при получении фокуса курсор уст. в начало строки. ; Вводятся только символы 0..9, ".", ":". ; ; object ~Inp Line~ (имеет фокус) ; Input: HL-описатель объекта ; Format table (данная таблица в DialTab): ; +0 - номер объекта ~Input Line~ ; +1 - Xo левая позиция объекта ; +2 - Xi правая позиция объекта ; +3 - Y позиция объекта ; +4 - Xi position text (позиция имени кластера ?) ; +5 - Xo левая позиция поля ввода ; +6 - ;Hot-keys (имени кластера) ; +7 - контекст ; +8,9 - адрес структуры строки ввода ;--------------------------------------------------------------------- ; Формат описателя: ; db InpLine ; номер объекта ; dw 0503h ; Yo,Xo ; db 12 ; ширина поля ввода ; db 4 ; контекст ; dw Buffer ; структура строки ввода ;===================================================================== PutInpLine: push iy ; iy=DialTab+5 inc iy ; пройти ячейку длины данной таблицы ld (iy+0),a ;+0 номер объекта "Input Line" ld a,(hl) ; X pos inc hl ld c,a add a,(ix+0) ; X полож. от начала экрана ld (iy+1),a ;+1 Xo ld (ix+4),a ; X temp coord ld a,(hl) ; Y pos inc hl ld b,a add a,(ix+1) ; Pos Y от начала экрана ld (iy+3),a ;+3 Yo позиция курсора call GetPutA ld a,(ix+4) ; левый край поля ввода (экран. координаты) ld (iy+4),a ; Xi правая позиция начала текста ld (iy+5),a ;+5 Xi правая позиция курсора ld (pInpAddr__+1),de ; адрес в экран. буфере ld b,(hl) ; ширина поля ввода (из описателя) inc hl ld a,(hl) ; контекст inc hl ld (iy+7),a ;+7 ld e,(hl) inc hl ld d,(hl) ld (iy+8),e ;+8 de=структура строки ввода ld (iy+9),d ;+9 inc hl inc de ; пройти ячейку "+0" ; иниц. структуры строки ввода ex de,hl xor a ld (hl),a ;+1 флаг=0 ReadyString (не очищать строку) inc hl ld (hl),a ;+2 X позиция курсора в пределах строки inc hl ld (hl),a ;+3 X смещ. строки за левый край inc hl ld (hl),b ;+4 кол-во введ. символов inc hl ;cp (hl) ;+5 есть строка? ;jr nz,$+5 ; да ;dec hl ;ld (hl),a ;+4 нет введ. символов ;inc hl ex de,hl push hl add a,(iy+5) ; X позиция курсора ld l,a ld h,(iy+3) ; Y позиция курсора ld (CursorPos),hl ; Y/X позиция курсора ; перекачать данные из буфера строки в экран. буфер pInpAddr__: ld hl,0 ; адрес в экран. буфере ld a,(color_array+33) ; цвет строки ввода ld c,a ; b=ширина поля ввода ;dec de ;ld a,(de) ;+4 число введ. символов ;inc de ;or a ;jr z,pInpBlank ; нет строки ld a,(de) inc de ld (hl),a inc hl ld (hl),c ; цвет строки inc hl inc (ix+4) ; X ++правый край поля ввода (экран. координаты) djnz $-9 jp pInputLine2 ; ;pInpBlank: ;ld a," " ;ld (hl),a ;inc hl ;ld (hl),c ; цвет строки ;inc hl ;inc (ix+4) ; X ++правый край поля ввода (экран. координаты) ;djnz $-7 ;jp pInputLine2 ;===================================================================== ; ; Обработчик событий объектов ~Inp Line~ ; ;===================================================================== EvInpLine: ld hl,what ; список событий ld a,(hl) inc hl cp evMouseFr jr z,EvInpMouse cp evKeyboard jr z,EvInpKeys cp evCombKey jp z,EvInpComb ret ; Событие - Мышка EvInpMouse: ld e,(hl) ; X coord inc hl ld d,(hl) ; Y coord 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) ; Xi правый край поля ввода ret nz cp (ix+3) ; Xi правый край поля ввода ret nc bit 7,(ix+1) ; Sel or nosel jr z,SetInpLine ; выделить - объект не в фокусе bit 7,(ix+6) jr nz,$+6 cp (ix+6) ; Xo input line ret c sub (ix+6) ; Shift from begin ld c,a ld l,(ix+9) ; структура буфера ld h,(ix+10) inc hl ld (hl),0 ;+1 уст. флаг "не стирать строку" inc hl cp (hl) ;+2 X тек. полож. курсора в строке ret z push hl inc hl inc hl cp (hl) ;+4 число введ. символов ld a,(hl) pop hl jr z,$+5 jr c,$+3 ld c,a ; число введ. символов ld (hl),c dec hl dec hl push iy push hl pop iy call PrnInLn ; вывести строку на экран pop iy jr InpLineExt ; Событие - обычная клавиша EvInpKeys: bit 7,(ix+1) ; Sel or nosel jr nz,InpLineWork ; объект уже выделен ld a,(hl) ;+1 what cp 9 ; Tab ret nz ; фокус на объект "Inp Line" SetInpLine: call MoveObj ; Select "Inp line" call ResDialInv ; Reset previos object ld ix,DialTab+5 ; Таблица объектов push iy ld l,(ix+9) ; hl=структура строки ввода "Inp Line" ld h,(ix+10) push hl pop iy inc hl xor a ld (hl),a ;+1 флаг ReadyString (1=очистить строку при вводе) inc hl ld (hl),a ;+2 X позиция курсора в пределах строки inc hl ld (hl),a ;+3 X смещ. строки за левый край inc hl call PrnInLn ; вывести строку на экран pop iy call PILCurs ; вкл. курсор ei InpLineExt: ld hl,what ; поле событий ld (hl),evNothing jp get_fire ; Работа в строке редактирования InpLineWork: ld a,(hl) ; what+1 код клавиши cp 8 ; "забой" jr z,$+12 cp "." jr z,$+8 cp "0" ret c cp ":"+1 ret nc ; символы ".", 0..9, ":" push iy ld de,InpLineWex push de ld l,(ix+9) ; структура буфера ld h,(ix+10) push hl pop iy ex af,af' res 7,(iy+1) ;+1 флаг ReadyString ld a,1; ; 01/00 вставка/замена and 1 rrca ; вправо (мл.бит -> перенос) or (iy+1) ld (iy+1),a ;+1 флаг ReadyString ex af,af' cp 8 ; "забой" jp z,BackDel ex af,af' ld a,(iy+4) ;+4 число введ. символов cp (iy+0) ;+0 макс. длина строки jr z,no_ins sub (iy+2) ; X тек. полож. курсора в строке jr z,no_ins ; не раздв. строку dec (iy+4) ;+4 число введ. символов bit 7,(iy+1) ;+1 флаг ReadyString jr z,no_ins ; не раздв. строку inc (iy+4) ;+4 число введ. символов ; ввод в середину текста (вставка) ld c,a ld b,0 ld l,(ix+9) ; структура буфера ld h,(ix+10) ld a,(iy+4) ;+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 no_ins: ld l,(ix+9) ; структура буфера ld h,(ix+10) ld a,(iy+2) ; X тек. полож. курсора в строке 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 ; сохр. символ в строке ld a,(iy+4) ; число введ. символов cp (iy+0) ; макс. длина строки jr z,$+5 ; вся строка заполнена inc (iy+4) ; ++число введ. символов inc (iy+2) ; X ++полож. курсора в строке ld a,(ix+3) ; Xi правый край поля ввода sub (ix+6) ; Xo левый край поля cp (iy+2) ; X тек. полож. курсора в строке jr nz,$+5 ; курсор не за полем ввода dec (iy+2) ; X --полож. курсора call PrnInLn ; вывести строку на экран pop de InpLineWex: ld hl,what ; поле событий ld (hl),evNothing pop iy ret ; Событие - курс. клавиши или комбинации EvInpComb: bit 7,(ix+1) ; sel or nosel jr nz,EvInpComb1 ; объект уже выделен ld b,(hl) ;+1 what inc hl ld a,(hl) ;+2 what cp 56h ; курсор вправо jp z,SetInpLine push ix ld e,(ix+0) ; размер таблицы "Inp Line" ld d,0 add ix,de bit 7,(ix+0) pop ix ret z ; еще не конец объектов cp 54h ; курсор влево jp z,SetInpLine ld a,b and 00111111b ; биты Ctrl, Alt ret nz ld a,(hl) ;+2 what cp 15+80h ; Tab скен-код+80h ret nz jp SetInpLine ; Shift+Tab, на предыдущий объект ; EvInpComb1: push iy inc hl ld a,(hl) ;+2 what ld l,(ix+9) ; структура буфера ld h,(ix+10) ld de,InpLineWex push de push hl pop iy cp 54h ; курсор влево jr z,InpLeft cp 56h ; курсор вправо jr z,InpRight cp 4Fh ; Del удалить символ в тек. позиции jp z,InpDel cp 57h ; Home в начало строки jp z,InpHome cp 51h ; End в конец строки jp z,InpEnd pop de pop iy ret ; Курсор влево на одно место InpLeft:ld a,(iy+2) ; X тек. полож. курсора в строке dec a ret m ; за левым краем поля InpPrint: ld (iy+2),a jp PrnInLn ; вывести строку на экран ; Курсор вправо на одно место InpRight: ld a,(iy+2) ;+2 X тек. полож. курсора в строке cp (iy+4) ;+4 число введ. символов ret z ; конец строки ld a,(ix+3) ; Xi правый край поля ввода sub (ix+6) ; Xo левый край поля ld b,a ld a,(iy+2) ;+2 X тек. полож. курсора в строке inc a cp b ret z ; уперлись в правый край поля jr InpPrint ; Забой - удалить символ левее курсора BackDel:ld a,(iy+2) ; X тек. полож. курсора в строке or a ret z ; дошли до левого края поля ld l,(ix+9) ; структура буфера ld h,(ix+10) ld a,(iy+2) ; X тек. полож. курсора в строке 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+2) ; X тек. полож. курсора в строке jr z,$+7 ; курсор за концом строки ld c,a ld b,0 ldir ; обновить остаток строки xor a ld (de),a ; в конец строки dec (iy+2) ; X тек. полож. курсора в строке dec (iy+4) ; число введ. символов jp PrnInLn ; вывести строку на экран ; Delete - удалить символ в тек. позиции InpDel: ld l,(ix+9) ; структура буфера ld h,(ix+10) ld a,(iy+2) ; X тек. полож. курсора в строке inc a 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) ;+4 число введ. символов sub (iy+2) ; X тек. полож. курсора в строке ret z ; курсор за концом строки ld c,a ld b,0 ldir ; обновить остаток строки xor a ld (de),a ; в конец строки dec (iy+4) ; число введ. символов jp PrnInLn ; вывести строку на экран ; Home - в начало строки InpHome:ld a,(iy+2) ; X тек. полож. курсора в строке or a ret z xor a ; X полож. курсора jp InpPrint ; вывести строку на экран ; End - в конец строки InpEnd: ld a,(iy+4) ;+4 число введ. символов cp (iy+2) ; X тек. полож. курсора в строке ret z ld c,a ld a,(ix+3) ; Xi правый край поля ввода sub (ix+6) ; Xo левый край поля cp c ld a,c jp nz,InpPrint ; строка меньше ширины поля dec a ; --полож. курсора jp InpPrint ; вывести строку на экран