; Клавиши управления ком-строки: ; ; Ctrl+Enter - вставить имя файла (папки) или тек. путь панели ; ; Esc, Ctrl+Y - очистить ком-строку. Ctrl+Y используется, ; когда отключена Esc. При нажатиях на Esc, Ctrl+Y ; в пустой ком-строке - выходим в менеджер. ; ; навигация по истории команд: ; ; Ctrl+E - предыдущая строка истории ; Ctrl+X - следующая строка истории ; Ctrl+Del - очистить историю команд ; ; при убранных панелях: ; ; PageUp - в начало истории ; PageDown - в конец истории ; ; ComLineWidth: db 76 ; макс. ширина поля ввода ;--------------------------------------------------------------------- ; Прорисовка объекта ;--------------------------------------------------------------------- PutComLine: ld a,(disk) ; номер диска add a,"A" ld hl,(char_disk) ; адрес буквы диска акт. панели ld (hl),a call width_path ; путь из path-буфера в буфер пути панели ; call print_compath ; вывести путь + новая ширина поля ввода in a,(SLOT3) push af ld a,(page_dial_screen) ; стр. буфера out (SLOT3),a ; YXpos: ld de,1E04h ; Y/X начало ком-строки ld (CursorPos),de ; Y/X позиция курсора call GetPutB ; перекачать данные из буфера строки в экран. буфер ex de,hl ; hl=адрес в экран. буфере ld de,ComLineBuff+5 ; строка ld a,(ComLineWidth) ; ширина поля ввода ld b,a ld a,(color_array+22) ; цвет ком-строки ld c,a ld a,(de) inc de ld (hl),a inc hl ld (hl),c ; цвет строки inc hl djnz $-6 pop af out (SLOT3),a jr PrnComLn ; вывод строки на экран ;----------------------------------------------------------- ; По значению координат узнать адрес вставки в памяти ; Input: BC - Y/X координаты от начала окна ; Output: DE - адрес вставки ;----------------------------------------------------------- GetPutB:ld hl,LC000+MaxDialWin ld d,0 add hl,de ;DE-shiftX add hl,de ex de,hl ;DE-Address ret ;------------------------------------------------- ; Установить фокус на объект "Input Line" ;------------------------------------------------- ComLineI: ld de,(CursorPos) ; Y/X позиция курсора call PILCurs ; вкл. курсор ei ret ;----------------------------------------------------------- ; Вывод строки объекта "Command Line" на экран ;----------------------------------------------------------- PrnComLn: ld a,(CurILFl) push af call ResILCr ; выкл. курсор ld de,(YXpos+1) ; начало поля ввода ld c,84h ; уст. курсор rst 08h ld hl,ComLineBuff ; структура буфера push hl pop iy ld a,(iy+3) ;+3 смещ. строки за левый край add a,l ld l,a jr nc,$+3 inc h inc hl inc hl inc hl inc hl inc hl ld a,(ComLineWidth) ; ширина поля ld e,a ld c,a ld b,a push bc xor a ld b,e ld de,work_buffer ; врем. буфер 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 ld a,b ; длина строки or a jr z,prne__ ld a,(color_array+22) ; цвет ком-строки ld e,a ld c,85h ; вывод строки с атрибутами rst 08h prne__: ld a,(YXpos+1) ; начало поля ввода ld e,(iy+2) ;+2 тек. полож. курсора в строке add a,e cp 80 jr c,prne1__ ld b,79 sub b ld d,a ; "наезд" за правый край ld a,e sub d ld (iy+2),a ;+2 новое полож. курсора ld a,b prne1__:ld (CursorPos),a ; X полож. курсора на экране pop af or a call nz,PILCurs ; вкл. курсор ei ld de,(YXpos+1) ; начало поля ввода call GetPutB ld hl,work_buffer ; врем. буфер ld bc,(ComLineWidth) ; ширина поля 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 step equ 1 ; шаг скроллинга ;===================================================================== ; ; Обработчик событий ~Command Line~ ; ;===================================================================== EvComLine: call handle_event ; Читаем событие EvComLine1: ld hl,EvComLine push hl ld iy,ComLineBuff ; структура буфера ld hl,what ; список событий ld a,(hl) inc hl cp evMouseFr jr z,EvComMouse cp evKeyboard jp z,EvComKeys cp evCombKey jp z,EvComComb ret ; Ctrl+Y com_clear: pop hl ; восст. стек от "ComLineWex" ; тест на режим отработки ComEsc: ld a,(ComLineBuff+4) ; число введ. символов or a jp nz,ClearComLine ; очистить ком-строку ; выйти в менеджер при пустой ком-строке ComExit:ld a,evNothing ; событие jr com_enter__ ; ComEnter: xor a ld (work_buffer+127),a ;+255 задать пустую строку ld hl,ComLineBuff+4 ; число введ. символов ld e,(hl) cp e jr z,ComExit ; пустая строка ld c," " ; пробел ld d,a add hl,de ld a,(hl) cp c jr nz,ent1__ ; нет конц. пробелов ld b,e ; убрать конц. пробелы ком-строки ld a,(hl) cp c jr nz,$+5 dec hl djnz $-5 inc hl ld (hl),d ; в конец ком-строки ld a,b or a jr z,ComExit ; были одни пробелы ld de,ComLineBuff+4 ; число введ. символов ld (de),a ; новое число (для history_adding) ent1__: call history_adding ; добавить строку в history ; скопир. строку во врем. буфер ld hl,ComLineBuff+5 ; откуда ld de,work_buffer+127;255 ; куда call copy_string ; скопир. строку (с нулем) ld a,evRunComLine ; событие "отработать ком-строку" com_enter__: pop hl ; восст. баланс стека ld hl,what ; поле событий ld (hl),a ; номер события call ResILCr ; выкл. курсор call ClearComLine ; очистить ком-строку ; уст. историю на посл. пустую строку ld a,(history_count) ; число строк в истории ld (history_cur_string),a ; номер тек. строки истории jp get_fire ; Событие - Мышка EvComMouse: ld e,(hl) ; X coord inc hl ld d,(hl) ; Y coord ld a,(YXpos+2) ; Y полож. ком-строки cp d jr nz,ComExit ; мышка не в ком-строке EvComMouse1: ld c,4 ; X начало строки ввода ld hl,ComLineBuff+1 ; структура буфера ld a,e sub c ret c ; мышка левее строки ввода ld (hl),0 ;+1 уст. флаг "не стирать строку" inc hl cp (hl) ;+2 X тек. полож. курсора в строке ret z ; мышка в начале строки ввода ld e,a inc hl add a,(hl) ;+3 смещ. строки за левый край inc hl cp (hl) ;+4 число введ. символов ld a,(hl) dec hl dec hl jr z,$+8 jr c,$+6 inc hl sub (hl) ;+3 смещ. строки за левый край dec hl ld e,a ld (hl),e ;+2 X тек. полож. курсора в строке call PrnComLn ; вывести строку на экран jp get_fire ; Событие - обычная клавиша EvComKeys: ld a,(hl) ;+1 what cp 1Bh jp z,ComEsc ; обработка Esc ld c,cmOkey ; номер команды cp 0Dh jp z,ComEnter cp 9 ; Tab смена панели jp z,tab ; работа в строке редактирования cp 8 ; "забой" jr z,$+5 cp " " ret c ; ld de,ComLineWex push de ld hl,ComLineBuff ; структура буфера 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 ;+1 флаг ReadyString ex af,af' cp 8 ; "забой" jp z,backspace ex af,af' ; сохр. символ ld a,(iy+4) ; InputSymb 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,no_insrt dec (iy+4) bit 7,(iy+1) jr z,no_insrt inc (iy+4) ; ввод в середину текста (вставка) ld c,a ld b,0 ld hl,ComLineBuff ; структура буфера 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_insrt: ld hl,ComLineBuff ; структура буфера ld a,(iy+2) ; X тек. полож. курсора в строке 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,(ComLineWidth) ; ширина поля cp (iy+2) ; X тек. полож. курсора в пределах строки jr nz,$+8 ; курсор за полем inc (iy+3) ; смещ. строки за левый край dec (iy+2) ; X тек. полож. курсора в пределах строки call PrnComLn ; вывести строку на экран pop de ; восст. баланс стека ComLineWex: ret ; Событие - курс. клавиши или комбинации EvComComb: ld b,(hl) ;+1 what inc hl ld a,(hl) ;+2 what cp 44h ; F10 jp z,ComExit ld hl,ComLineBuff ; структура буфера ld de,ComLineWex push de cp 54h ; курсор влево jp z,ComLeft cp 56h ; курсор вправо jp z,ComRight cp 4Fh ; Del, удалить символ в тек. позиции jp z,ComDel cp 57h ; Home, в начало строки jp z,ComHome cp 51h ; End, в конец строки jp z,ComEnd ; ld d,a bit 5,b ; бит Ctrl jr z,com_comb_next cp 18h+80h ; Ctrl+O, убрать/показать панели jp z,hidden_panels cp 15h+80h ; Ctrl+Y, очистить ком-строку jp z,com_clear cp 12h+80h ; Ctrl+E пред. строка истории jp z,history_prev cp 2Bh+80h ; Ctrl+X след. строка истории jp z,history_next cp 4Fh+80h ; Ctrl+Del, очистить историю команд jp z,alt_clear_history ; Enter ld a,(format_mode) ; тек. формат панели and form_info+form_qview ; info, qview jr nz,com_comb_ext ld a,d cp 28h+80h ; Ctrl+Enter, имя/путь в ком-строку jp z,copy_name_to_comline cp 4Eh+80h ; Ctrl+Enter цифр. поля jp z,copy_name_to_comline ; cp 1Ah+80h ; Ctrl+[ путь левой панели в ком-строку jp z,copy_left_path_panel_to_comline_alt cp 1Bh+80h ; Ctrl+] путь правой панели в ком-строку jp z,copy_right_path_panel_to_comline_alt ; com_comb_next: call test_show_panels ; тест на режим вкл. панелей ld a,d jr z,com_comb_next1 cp 58h ; курсор вверх jp z,up cp 52h ; курсор вниз jp z,down cp 53h ; PageDown jp z,page_down cp 59h ; PageUp jp z,page_up com_comb_ext: pop de ret ; панели выключены com_comb_next1: cp 58h ; курсор вверх, пред. строка истории jp z,history_prev cp 52h ; курсор вниз, след. строка истории jp z,history_next cp 59h ; PageUp, в начало истории jp z,history_begin cp 53h ; PageDown, в конец истории jp z,history_last pop de ret ; Курсор влево на одно место ComLeft:ld a,(iy+2) dec a jp p,ComPrint ld a,(iy+3) ; смещ. строки за левый край sub step ; шаг скроллинга ret c ; курсор в крайнем левом полож. ld (iy+3),a ; X смещ. строки за левый край (в символах) ld a,(iy+2) ; X полож. курсора в пределах строки add a,step-1 ; шаг скроллинга ComPrint: ld (iy+2),a jp PrnComLn ; вывести строку на экран ; Курсор вправо на одно место ComRight: ld a,(iy+2) ; X полож. курсора в пределах строки add a,(iy+3) ; смещ. строки за левый край cp (iy+4) ; число введ. символов ret z ld a,(ComLineWidth) ; ширина поля ld b,a ld a,(iy+2) ; X полож. курсора в пределах строки inc a cp b jr nz,ComPrint inc (iy+3) ; смещ. строки за левый край ld a,(iy+2) ; X полож. курсора в пределах строки sub step-1 ; шаг скроллинга jr ComPrint ; Забой - удалить символ левее курсора backspace: ld a,(iy+2) ; X тек. полож. курсора в строке or a jr nz,backspac1 ld a,(iy+3) ; смещ. строки за левый край sub step ; шаг скроллинга ret c ld (iy+3),a inc (iy+2) ;+2 тек. полож. курсора в строке backspac1: ld hl,ComLineBuff ; структура буфера LD A,(IY+2) ;+2 X тек. полож. курсора в строке ADD A,(IY+3) ;+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) ;+4 число введ. символов sub (iy+3) ; смещ. строки за левый край 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 PrnComLn ; вывести строку на экран ; Delete - удалить символ в тек. позиции ComDel: ld hl,ComLineBuff ; структура буфера ld a,(iy+2) ; X тек. полож. курсора в строке 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) ;+4 число введ. символов sub (iy+3) ; смещ. строки за левый край sub (iy+2) ; X тек. полож. курсора в строке ret z ; курсор за концом строки ld c,a ld b,0 ldir ; обновить остаток строки xor a ld (de),a ; в конец строки dec (iy+4) ; число введ. символов jp PrnComLn ; вывести строку на экран ; Home - в начало строки ComHome:ld a,(move_home_end) or a jr nz,$+8 call test_show_panels ; тест на режим вкл. панелей jp nz,home_list ; в начало списка файлов ; ld a,(iy+2) ; X тек. полож. курсора в строке add a,(iy+3) ; смещ. строки за левый край ret z xor a ; X полож. курсора ld (iy+2),a ; X полож. курсора в пределах строки ld (iy+3),a ; смещ. строки за левый край jp ComPrint ; вывести строку на экран ; End - в конец строки ComEnd: ld a,(move_home_end) or a jr nz,$+8 call test_show_panels ; тест на режим вкл. панелей jp nz,end_list ; в конец списка файлов ; ld a,(iy+4) ;+4 число введ. символов sub (iy+3) ;+3 смещ. строки за левый край cp (iy+2) ;+2 X тек. полож. курсора в строке ret z add a,(iy+3) ; смещ. строки за левый край ld c,a ld (iy+3),0 ; смещ. строки за левый край ld a,(ComLineWidth) ; ширина поля sub c jr z,ComEndLp jr nc,ComEndNIL neg ComEndLp: inc (iy+3) ; X смещ. строки за левый край sub step ; шаг скроллинга jr nc,ComEndLp ComEndNIL: ld a,(iy+4) ; число введ. символов sub (iy+3) ; смещ. строки за левый край jp ComPrint ; вывести строку на экран ;------------------------------------------------- ; Очистить буфер ком-строки ;------------------------------------------------- ClearComLine: call clear_combuffer jp PrnComLn ; вывести строку на экран clear_combuffer: ld hl,ComLineBuff ; структура буфера clear_struct_inline: xor a ld b,(hl) ;+0 макс. длина строки inc hl ld (hl),a ;+1 сбр. флаг ReadyString inc hl ld (hl),a ;+2 X тек. полож. курсора в строке inc hl ld (hl),a ;+3 смещ. строки за левый край inc hl ld (hl),a ;+4 число введ. символов inc hl ;+5 буфер редакт. строки ld (hl),a djnz $-2 ret ;--------------------------------------------------------------- ; Вывод пути в ком-строке на экран + новая ширина поля ввода ;--------------------------------------------------------------- print_compath: ; очистить старый путь на экране ld a,(ComLineWidth) ; ширина поля ввода ld l,a ld a,80 sub l ld l,a ; ширина окна ld h,1 ld de,1E00h ; Y/X полож. ld a,(color_array+22) ; цвет ком-строки ld b,a ld c,89h ; очистить окно rst 08h ; вывести новый путь ld de,1E00h ; Y/X полож. ком-строки ld c,84h ; уст. курсор rst 08h ld hl,(__path) ; адрес описателя пути акт. панели ld a,(hl) ; длина строки dec a ld (YXpos+1),a ; X полож. курсора ld (EvComMouse1+1),a ; начало поля ввода dec a ; без конц. пробела ld b,a ld a,79 ; ширина экрана - 1 sub b ld (ComLineWidth),a ; новая ширина поля ввода (48..76) ld de,5 ; смещ. до строки add hl,de ld a,(color_array+22) ; цвет ком-строки ld e,a push de ld c,85h ; вывод строки с атрибутами rst 08h pop de ld a,">" ld bc,0181h ; символ с атрибутом rst 08h jp PrnComLn ; вывести ком-строку на экран ; Флаг формата вставляемого имени ms-dos/spec ; (заюзать при выполнении командной строки) format_name: db 0 ;----------------------------------------------------------- ; Вставить путь/имя файла в ком-строку (Ctrl+Enter) ; с установкой фокуса на ком-строку. ;----------------------------------------------------------- put_name_to_comline: ld a,(format_mode) ; формат акт. панели and form_info+form_qview ret nz ld (format_name),a ; флаг формата вставляемого имени call print_keybar ; обновить key-бар в норм. вид ld de,(YXpos+1) ; начало поля ввода ком-строки ld (CursorPos),de ; полож. курсора на экране call copy_name_to_comline__ ; вставить строку ; фокус на ком-строку (от мышки) enter_to_comline: call ComLineI ; вкл. курсор jp EvComLine ; вход в ком-строку ;----------------------------------------------------------- ; Вставить путь/имя файла в ком-строку (Ctrl+Enter) ; без установки фокуса на ком-строку. ;----------------------------------------------------------- copy_name_to_comline: call ResILCr ; выкл. курсор call copy_name_to_comline__ jp ComLineI ; вкл. курсор copy_name_to_comline__: ld iy,ComLineBuff ; структура буфера ld a,(iy+4) ; число введ. символов cp max_len_comline ; 126 ;254 ret z ; строка заполнена ld hl,PrnComLn ; точка выхода (вывести строку) push hl ld hl,status_string+4 ; имя файла статусной строки ld a,(hl) cp "." ; ".." jr z,copy_path_to_comline ; скопировать имя файла ld b,12 ; макс. длина имени ld a,(hl) cp " " jp z,put_char inc hl call put_char ld a,(iy+4) ; число введ. символов cp max_len_comline ; 126 ;254 ret z djnz $-16 copy_name_to_comline1__: ld a," " ; концевой пробел jp put_char ;----------------------------------------------------------- ; Скопировать путь акт. панели в ком-строку ;----------------------------------------------------------- copy_path_to_comline: ld hl,(char_disk) ; диск акт. панели ld de,(__buff) ; путь акт. панели call copy_path_to_comline1 jr copy_name_to_comline1__ ; вставить концевой пробел ;----------------------------------------------------------- ; Вставить путь левой панели в ком-строку (Ctrl+[) ;----------------------------------------------------------- copy_left_path_panel_to_comline: ld hl,EvComLine ; вход в ком-строку push hl ; Вставить путь в ком-строку без установки фокуса copy_left_path_panel_to_comline_alt: call ResILCr ; выкл. курсор ld hl,disk_left ; диск левой панели ld de,buff_left ; путь левой панели buff_right copy_path_panel__: call copy_path_to_comline1 jp ComLineI ; вкл. курсор ;----------------------------------------------------------- ; Вставить путь правой панели в ком-строку (Ctrl+]) ;----------------------------------------------------------- copy_right_path_panel_to_comline: ld hl,EvComLine ; вход в ком-строку push hl ; Вставить путь в ком-строку без установки фокуса copy_right_path_panel_to_comline_alt: call ResILCr ; выкл. курсор ld hl,disk_right ; диск правой панели ld de,buff_right ; путь правой панели jr copy_path_panel__ ; Скопировать путь в ком-строку ; вход: hl=диск панели ; deпуть панели copy_path_to_comline1: ld iy,ComLineBuff ; структура буфера ld a,(iy+4) ; число введ. символов cp max_len_comline ; 126 ;254 ret nc ; строка заполнена ld bc,PrnComLn ; точка выхода (вывести строку) push bc push de ; сохр. путь левой/правой панели ld a,(hl) ; буква диска левой/правой панели inc hl call put_char ld a,":" call put_char pop hl ; восст. путь ld a,(hl) or a jr z,$+14 ; конец строки пути call put_char ld a,(iy+4) ; число введ. символов cp max_len_comline ; 126 ;254 ret z inc hl jr $-14 ; ld a,'\' dec hl cp (hl) ; корень ? call nz,put_char ; нет, вставить "\" ret ; Вставить один символ в ком-строку. ; Символ всегда вставляется, в независимости ; от текущего режима "вставка/замена". ; вход: a=символ put_char: push hl ex af,af' ; сохр. символ res 7,(iy+1) ;+1 флаг ReadyString ld a,1 ; вставка rrca ; вправо (мл.бит -> перенос) or (iy+1) ld (iy+1),a ;+1 флаг ReadyString ld a,(iy+4) ; InputSymb cp (iy+0) ; Max len jr nz,ILn1__ ld a,(iy+2) add a,(iy+3) cp (iy+0) ret nc bit 7,(iy+1) ret nz ILn1__: ld a,(iy+4) sub (iy+3) sub (iy+2) jr z,no_insrt1 dec (iy+4) bit 7,(iy+1) jr z,no_insrt1 inc (iy+4) ; ввод в середину текста (вставка) ld c,a ld b,0 ld hl,ComLineBuff ; структура буфера 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_insrt1: ld hl,ComLineBuff ; структура буфера ld a,(iy+2) ; X тек. полож. курсора в строке 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 ; символ в ком-строку pop hl inc (iy+4) ; число введ. символов inc (iy+2) ; X тек. полож. курсора в строке ld a,(ComLineWidth) ; ширина поля ввода cp (iy+2) ; X тек. полож. курсора в пределах строки ret nz ; курсор за правым краем поля ввода inc (iy+3) ; смещ. строки за левый край dec (iy+2) ; X тек. полож. курсора в пределах строки ret ;------------------------------------------------- ; Вставить строку из history-буфера ; вход: de=структура строки: ; +0=длина строки, +1=строка ;------------------------------------------------- put_from_history: call clear_combuffer ; очистить строку ввода ld iy,ComLineBuff ; структура буфера ld a,(de) ;+0 длина строки ld b,a inc de ld a,(de) call put_char djnz $-5 jp PrnComLn ; вывести строку на экран ; Вызов из самой ком-строки alt_clear_history: call ClearComLine jr $+5 ;------------------------------------------------- ; Очистить историю команд ;------------------------------------------------- clear_history: call clear_combuffer ; очистить строку ввода xor a ld (history_count),a ; число строк в history ld (history_cur_string),a ; номер тек. строки history ld hl,history_buff ; конец посл. строки ld (history_end),hl ret ;/////////////////////////////////////////////////////////////////////////////// ; ; History Код ; ;/////////////////////////////////////////////////////////////////////////////// history_count: db 0 ; число строк в истории ; history_cur_string: db 0 ; номер тек. строки истории ; history_end: dw history_buff ; конец послед. строки истории ;------------------------------------------------- ; В начало истории ;------------------------------------------------- history_begin: ld a,(history_count) or a ret z ; нет строк xor a ld (history_cur_string),a jr history_copy ; перейти на 1-ю строку ;------------------------------------------------- ; В конец истории ;------------------------------------------------- history_last: ld a,(history_count) or a ret z ; нет строк ld (history_cur_string),a ; уст. послед. пустую строку jp ClearComLine ; вернуть пустую строку ;------------------------------------------------- ; Следующая строка ;------------------------------------------------- history_next: ld a,(history_count) or a ret z ; нет строк dec a ld b,a ld hl,history_cur_string ld a,(hl) cp b jr c,$+7 inc b ld (hl),b jp ClearComLine ; вернуть пустую строку ; inc a ld (hl),a jr history_copy ;------------------------------------------------- ; Предыдущая строка ;------------------------------------------------- history_prev: ld a,(history_count) or a ret z ; нет строк ld b,a ld hl,history_cur_string ld a,(hl) or a jr z,history_copy ; уперлись в начало истории cp b jr c,$+3 ld a,b dec a ld (hl),a ; перейти на строку по ее индексу history_copy: call history_index jp put_from_history ; строку из history в буфер ком-строки ; вход: а=индекс строки ; выход: de=строка (ее структура из history-буфера) history_index: ld b,0 ld hl,history_buff ; буфер истории or a ; индекс строки jr z,hist_index ; 1-я строка истории ld c,(hl) ; размер строки inc c add hl,bc ; на след. строку dec a jr nz,$-4 hist_index: ex de,hl ret ;----------------------------------------------------------- ; Добавить новую строку в конец буфера истории. ; Если строка не влезает, удаляются самые старые строки до ; тех пор, пока появится достаточно места для новой строки. ;----------------------------------------------------------- history_adding: ld de,ComLineBuff+4 ; структура строки call history_compare ; сравнить строки ret z ; уже есть такая строка ld bc,(history_end) ; адрес конца посл. строки ld hl,history_buff+history_size ; адрес конца буфера and a sbc hl,bc ; hl=размер своб. места ld a,(de) ; длина новой строки inc a ld c,a xor a ld b,a sbc hl,bc ; умещ. в своб. месте буфера истории ? jr nc,history_add_ok ; да ; удалить первую (самую старую) строку из буфера ;push de ld de,history_buff ; буфер истории ld a,(de) ; длина 1-й строки inc a ld c,a xor a ld b,a ld hl,(history_end) sbc hl,bc ld (history_end),hl ; конец посл. строки ld l,e ; hl=history_buff ld h,d add hl,bc ; начало 2-й строки push hl ld hl,history_size ; размер буфера and a sbc hl,bc ld c,l ; размер остатка буфера ld b,h pop hl ; начало 2-й строки ldir ld hl,history_count dec (hl) ; --число строк в history ;pop de ; восст. адрес ComLineBuff+4 jr history_adding ; history_add_ok: ld hl,(history_end) ; адрес конца посл. строки ex de,hl ldir ld (history_end),de ; конец посл. строки ld hl,history_count ld a,(hl) ld (history_cur_string),a ; тек. строка history inc (hl) ; ++число строк в history ret ; Сравнить строки. Если строки равны, то переместить ; тек. строку в конец истории. ; вход: de=структура строки: +0=длина строки, +1=строка ; выход: Z-есть строка ; NZ-нет строки history_compare: ld hl,history_count ld b,(hl) ; число строк в history dec b inc b jr z,hist_comp_quit ; history-буфер пустой ex af,af' xor a ; сбр. индекс сравн. строки ex af,af' ld hl,history_buff ; буфер истории history_comp_loop: push de ld (move_cur_str+1),hl ; тек. строка истории ld c,(hl) ; длина тек. строки history ld a,(de) ; длина новой строки inc hl inc de cp c jr z,hist_comp_loop ; строки одинаковой длины ld a,l add a,c ld l,a ld a,h adc a,0 ld h,a jr hist_comp_next ; ; сравнить строки hist_comp_loop: ld a,(de) cp (hl) jr nz,hist_comp_notequal ; строки не равны inc hl inc de dec c jr nz,hist_comp_loop ; строки равны jr move_to_end_history ; найденную строку в конец истории ; hist_comp_notequal: inc hl dec c jr nz,$-2 ; до конца строки hist_comp_next: pop de ex af,af' inc a ; ++индекс сравн. строки ex af,af' djnz history_comp_loop hist_comp_quit: xor a dec a ; NZ-флаг ret ; переместить тек. строку в конец истории move_to_end_history: ld a,(history_count) ; число строк истории ld c,a dec c ex af,af' ; индекс найденной строки cp c jr nc,not_move_to_end ; найденная строка уже в конце ; сохр. строку во врем. буфере move_cur_str: ld hl,0 ; тек. строка истории ld de,work_buffer ; врем. буфер ld c,(hl) ;+0 длина строки inc c ; учесть ячейку длины строки xor a ld b,a push bc push hl ldir pop de ; куда (на место старой строки) pop bc ; сдвинуть остаток буфера на место сохр. строки push hl ld hl,(history_end) ; конец посл. строки истории and a sbc hl,de and a sbc hl,bc ld c,l ; величина сдвига ld b,h pop hl ; откуда ldir ; восст. строку из врем. буфера в конец истории ld hl,work_buffer ; врем. буфер ld c,(hl) inc c ld b,a ldir not_move_to_end: ld a,(history_count) dec a ld (history_cur_string),a ; тек. строка history xor a ; Z флаг pop de ret