;[]=========================================================================[] ;[] Обработка клавиатуры [] ;[] v0.01 - последние изменения 10.10.2004 [] ;[] v0.02 - последние изменения 27.03.2005 [] ;[] v0.03 - последние изменения 11.03.2006 [] ;[] v0.10 - последние изменения 14.05.2006 [] ;[]=========================================================================[] ; -- Key masks and flags SHIFTS_MASK EQU 11110000b LSHIFT_FLAG EQU 10000000b RSHIFT_FLAG EQU 01000000b SHIFT_FLAG EQU LSHIFT_FLAG + RSHIFT_FLAG CTRL_FLAG EQU 00100000b ALT_FLAG EQU 00010000b LCTRL_FLAG EQU 00001000b LALT_FLAG EQU 00000100b RCTRL_FLAG EQU 00000010b RALT_FLAG EQU 00000001b SHIFTED_KEY EQU 0x80 ; -- Key codes (Scancodes) AST_KEY EQU 0x00 ENTER_KEY EQU 0x0D BKSP_KEY EQU 0x0E TAB_KEY EQU 0x0F E_KEY EQU 0x12 R_KEY EQU 0x13 ESC_KEY EQU 0x1B Z_KEY EQU 0x2A X_KEY EQU 0x2B C_KEY EQU 0x2C V_KEY EQU 0x2D F1_KEY EQU 0x3B F2_KEY EQU 0x3C F3_KEY EQU 0x3D F4_KEY EQU 0x3E F5_KEY EQU 0x3F F6_KEY EQU 0x40 F7_KEY EQU 0x41 F8_KEY EQU 0x42 F9_KEY EQU 0x43 F10_KEY EQU 0x44 SLCK_KEY EQU 0x48 DEL_KEY EQU 0x4F INS_KEY EQU 0x50 END_KEY EQU 0x51 DN_KEY EQU 0x52 PGDN_KEY EQU 0x53 LEFT_KEY EQU 0x54 RIGHT_KEY EQU 0x56 HOME_KEY EQU 0x57 UP_KEY EQU 0x58 PGUP_KEY EQU 0x59 MODULE KEYB Keyb_RF call CursorRes ; выкл курсор call Refresh ; обновление экрана jr Keyb Keyb_NC call CursorRes ; выкл курсор Keyb call Cursor ; вкл курсор call CursorSet !Keyb_L1 ld c,Dss.ScanKey ; состояние клавиатуры rst DssRst jr z,Keyb_L1 ld a,b ; состояние and SHIFTS_MASK jr z,.L100 ; Обработка комбинации Shift + символ and SHIFT_FLAG ; or a jr z,.L1 ld a,d cp SHIFTED_KEY+TAB_KEY ; Shift+Tab jr nz,Keyb_L1 ld hl,Keyb.WinScreen ld a,(hl) dec a jr nz,.Keyb_L4 ld a,4 .Keyb_L4 ld (hl),a ; номер окна дампа jr Keyb_NC ; Обработка комбинации Alt + символ .L1 ld a,b and SHIFTS_MASK cp ALT_FLAG ; jr nz,.L10 ld a,d ; позиционный код cp SHIFTED_KEY+X_KEY ; + jr nz,.L10 ret z ; выход ; Обработка комбинации Ctrl + символ .L10 cp CTRL_FLAG ; jp nz,.L0 ld a,d ; позиционный код cp SHIFTED_KEY+E_KEY ; + (dEc/hEx) jr nz,.L11 ld a,(DecHex) cpl ld (DecHex),a jr Keyb_RF .L11 cp SHIFTED_KEY+R_KEY ; + резидент jr nz,.L12 call CursorRes ld b,5 ; длина строки ввода ld hl,0x1413 push hl push bc call CursorSet pop bc pop hl call InputLine jp c,Keyb_NC call PutAddress jp c,Keyb_NC call KREG.KReg.Rez ; новый адрес резидента jr Keyb_RF .L12 cp SHIFTED_KEY+Z_KEY ; + jp z,.L202M2 ; выполнение команды cp SHIFTED_KEY+C_KEY ; + jp z,.L200P5 ; выполнение команды cp SHIFTED_KEY+V_KEY ; + jp z,.L9952 ; пропуск команды ; cp 0x80+0x48 ; ; call z,ScreenS ;сохранение экрана в файл .L13 ;... jp .L0 ; Обработка ASCII кодов .L100 ld a,e cp ESC_KEY ; - вкл.системного экрана jr nz,.L200 xor a ; выкл часов ld (ClockOn),a ld a,(OSScreen) ld b,a push bc ld a,(OSGrafMode) ld c,Dss.SetVMod ; системный экран rst DssRst pop bc ld a,(DemonScreen) cp b jr nz,.NoRest ld de,0 ; Если экраны ОС и Демона совпадают - ld hl,#2050 ; восстанавливаем скрин ld a,(BufPage) ld b,a ld c,Dss.WinRest ld ix,#c000 rst DssRst .NoRest ld c,Dss.WaitKey rst DssRst ; ждем Any Key ld a,(DemonScreen) ld b,a ld a,3 ld c,Dss.SetVMod push bc rst DssRst pop bc ld a,(OSScreen) cp b call z,RefreshScreen ; Если экраны совпадают - перерисовываем ld a,On ; вкл часов ld (ClockOn),a jp Keyb_L1 ; Обработка позиционного кода .L200 ld a,d cp F1_KEY ; jr nz,.L208 .L200P5 call DemonHelp ; ld c,Dss.WaitKey ; rst DssRst ; ждем Any Key .NoExit call RefreshScreen jp Keyb_L1 .L208 cp F3_KEY jr nz,.L207 call LOADBIN.LoadBinDialog jr .NoExit .L207 cp F8_KEY ; jr nz,.L201 ld a,Off ; флаг пропуска подпрограмм jr .L202 .L201 cp F7_KEY ; jr nz,.L203 .L202M2 ld a,On ; флаг трассировки подпрограмм .L202 ld (STEP.Step.Flag),a ld hl,PrintStrSP.StrSp ld a,(hl) ; строка вершины стека inc a jr nz,.L9948 ld a,6 ; вернуть вершину стека ld (hl),a .L9948 call STEP.Step jp Keyb_RF .L203 cp F9_KEY ; jr nz,.L204 .L9952 ld hl,(Reg._PC) call List ; следующая команда ld (Reg._PC),hl ; новый PC push hl ld a,(KList.Descript) ; количество строк листинга call AdrListTabl ; нижний адрес листинга ld de,(ListAddr) ; верхний адрес листинга pop bc ; новый PC call AdrArea jp nc,Keyb_RF ld (ListAddr),bc ; новая страница листинга jp Keyb_RF .L204 cp TAB_KEY ; jr nz,.L205 ld hl,Keyb.WinScreen ld a,(hl) inc a cp 5 jr nz,.L9983 ld a,1 .L9983 ld (hl),a ; номер окна дампа jp Keyb_NC .L205 cp SLCK_KEY ; jr nz,.L206 call SaveScr ; сохранение экрана в файл jp Keyb_L1 .L206 cp F10_KEY ; jr nz,.L0 ;выход ld ix,ExitDlg call DialogWindow ret call ClearScreen .L0 ld a,(.WinScreen) ; активное окно dec a jp z,KList dec a jp z,KDUMP.KDump dec a jp z,KREG.KReg jp KStack .WinScreen db 1 ; номер активного окна ; 1 - окно листинга ; 2 - окно дампа ; 3 - окно регистров ; 4 - окно стека ; Прорисовка курсора Cursor: ld a,(Keyb.WinScreen) ; активное окно dec a jr z,.L1 dec a jr z,.L2 dec a jr z,.L3 ; Окно дампа стека ld de,(KStack.Coordinate) ; расчет курсора ld hl,KStack.Descript+2 ld b,e .L99C7 inc hl inc hl djnz .L99C7 ld a,(hl) ; длина курсора ld (@KStack.ESTR_LEN),a ld b,a dec hl ld e,(hl) ; X-координата курсора ex de,hl ld (@KStack.ESTR_POS),hl ret ; Окно листинга .L1 ld de,(KList.Coordinate) ; расчет курсора ld hl,KList.Descript+2 ld b,e .L99DF inc hl inc hl djnz .L99DF ld a,(hl) ; длина курсора ld (KList.L201+1),a ld b,a dec hl ld e,(hl) ; X-координата курсора ex de,hl ld (KList.L201+3),hl ret ; Окно дампа .L2 ld de,(KDUMP.KDump.Coordinate) ; расчет курсора ld hl,KDUMP.KDump.Descript+2 ld b,e .L99F7 inc hl inc hl djnz .L99F7 ld a,(hl) ; длина курсора ld (KDUMP.KDump.ESTR_LEN),a ld b,a dec hl ld e,(hl) ; X-координата курсора ex de,hl ld (KDUMP.KDump.ESTR_POS),hl ret ; Окно регистров .L3 call KREG.KReg.DescCalc ld d,b ld b,e ; колонока в строке .L9A0C inc hl inc hl djnz .L9A0C ld a,(hl) ; длина курсора ld (KREG.KReg.ESTR_LEN),a ld b,a dec hl ld e,(hl) ; X-координата курсора ex de,hl ld (KREG.KReg.ESTR_POS),hl ret ; Обработка клавиш в окне листинга KList: ld a,b ; состояние and SHIFTS_MASK jr z,.L100 ; Обработка комбинации Alt + символ cp ALT_FLAG ; jr nz,.L10 jp Keyb_L1 ; Обработка комбинации Ctrl + символ .L10 cp CTRL_FLAG ; jp nz,Keyb_L1 ld a,d ; позиционный код cp SHIFTED_KEY+X_KEY ; + jp nz,.L20 call AdrListTabl-3 ; выборка адреса листинга по N строки ld (Reg._PC),hl jp .NewLA1+3 .L20 ld a,b cp CTRL_FLAG+RCTRL_FLAG ; правый jr nz,.L21 ld bc,.CtrlTabl call AdrCtrlTabl ; выборка строки в таблице jp nc,Keyb_L1 ; не цифровые клавиши ld a,(.Coordinate+1) ld (bc),a ; номер строки листинга inc bc call AdrListTabl ; выборка адреса листинга по N строки ld a,l ld (bc),a inc bc ld a,h ld (bc),a jp Keyb_L1 .L21 cp CTRL_FLAG+LCTRL_FLAG ; левый jp nz,Keyb_L1 ld a,d ; позиционный код cp SHIFTED_KEY+AST_KEY ; Ctrl+"`" jp nz,.L22 ld a,(.CtrlWin) ld h,a ld l,0 add a,0x40 ; следующее окно ld (.CtrlWin),a ld a,(.Descript+1) ld (.Coordinate+1),a jp .NewLA1 .L22 ld bc,.CtrlTabl call AdrCtrlTabl ; выборка строки в таблице jp nc,Keyb_L1 ld a,(bc) ; номер строки листинга or a jp z,Keyb_L1 ; нет данных inc bc ld a,(bc) ld l,a inc bc ld a,(bc) ld h,a ; адрес из буфера jp .NewLA ; Обработка позиционного кода .L100 ld a,e ; ASCII код ld (.L200+1),a ld a,d ; позиционный код ld de,(.Coordinate) ; текущие координаты курсора cp RIGHT_KEY ; jr nz,.L101 ld a,(.Descript+2) ; кол-во колонок cp e ld a,e jr nz,.L9AA5 xor a .L9AA5 inc a ld (.Coordinate),a ; текущая колонка jp Keyb_NC .L101 cp LEFT_KEY ; jr nz,.L102 ld a,e ; текущая колонка cp 1 jr nz,.L9AB9 ld a,(.Descript+2) ; кол-во колонок inc a .L9AB9 dec a ld (.Coordinate),a ; текущая колонка jp Keyb_NC .L102 ld hl,(.Descript) cp DN_KEY ; jr nz,.L103 ld a,d ; текущая строка cp l jr nz,.L104 ld hl,(ListAddr+2) ; адрес следующей строки jp .NewLA1 .L104 inc a ld (.Coordinate+1),a jp Keyb_NC .L103 cp UP_KEY ; jr nz,.L105 ld a,d ; текущая строка cp h jr nz,.L107 ld hl,(ListAddr) ; адрес верхней строки листинга call UpAddress ; предыдущий адрес jp .NewLA1 .L107 dec a ld (.Coordinate+1),a jp Keyb_NC .L105 cp PGDN_KEY ; jr nz,.L108 ld a,d ; текущая строка cp l jr nz,.L106 call AdrListTabl jp .NewLA1 .L106 ld a,l ; на последнюю строку ld (.Coordinate+1),a jp Keyb_NC .L108 cp PGUP_KEY ; jr nz,.L110 ld a,d ; текущая строка cp h jr nz,.L109 dec l ; кол-во строк - 1 ld b,l ld hl,(ListAddr) ; адрес первой строки .L9B12 push bc call UpAddress ; предыдущий адрес pop bc djnz .L9B12 jp .NewLA1 .L109 ld a,h ; на первую строку ld (.Coordinate+1),a jp Keyb_NC .L110 cp HOME_KEY ; jr nz,.L111 ld a,1 ld (.Coordinate),a ; первая колонка jp Keyb_NC .L111 cp END_KEY ; jr nz,.L200 ld a,(.Descript+2) ; последняя колонка ld (.Coordinate),a ; первая колонка jp Keyb_NC ; Обработка ASCII кодов .L200 ld a,0 cp ENTER_KEY ; jp nz,.NewPCAdr ; Keyb+6 .L201 ld b,0 ; длина строки ввода ld hl,0 ; координаты строки ввода ld a,(.Coordinate) dec a ; колонка адреса jr z,.InAdres dec a ; колонка метки jr z,.L2P5 dec a ; колонка кода команды jr z,.InCode .L2P5 call InputLine jp Keyb_NC .NewPCAdr cp "z" ; jp nz,Keyb_L1 call AdrListTabl-3 ; Установить новый PC ld (Reg._PC),HL jp Keyb_RF .InCode call InputLine ; ввод кода в 3 колонке jp c,Keyb_NC ; завершение ввода по call PutCode jr c,.L201 ; ошибка в веденных данных call AdrListTabl-3 ; адрес текущей строки ld de,PutCode.Buffer .L2M6 ld a,(de) ; запись кода в память call Ld_hl_a inc de inc hl djnz .L2M6 jr .NewLA2 .InAdres call InputLine ; ввод адреса в 1 колонке jp c,Keyb_NC ; завершение ввода по call PutAddress jr c,.L201 ; ошибка в веденных данных .NewLA ld a,(.Coordinate+1) dec a jr z,.NewLA1 ld b,a .L9B95 push bc call UpAddress ; предыдущий адрес pop bc djnz .L9B95 .NewLA1 ld (ListAddr),hl .NewLA2 jp Keyb_RF .CtrlWin db 0 ; окно для Ctrl+"`" .CtrlTabl ds 30 ; буффер для адр быстр перехода .Coordinate dw 0x0201 ; курсор (стр/кол курсора) .Descript: dw 0x0114 ; первая/последняя строка окна db 4 ; кол-во колонок db 0x1A ; N столбца колонки db 5 ; ширина колонки db 0x20 db 14 db 0x2F db 8 db 0x38 db 22 ;[]=========================================================================[] ;[] Выборка адреса листинга из таблицы [] ;[] Выход: HL - адрес листинга в текущей строке [] ;[]=========================================================================[] ld a,(KList.Coordinate+1) ; номер текущей строки листинга AdrListTabl: dec a add a,a ; *2 ld e,a ld d,0 ld hl,ListAddr ; таблица адресов листинга add hl,de ; строка в таблице ld a,(hl) inc hl ld h,(hl) ld l,a ; адрес строки листинга ret ;[]=========================================================================[] ;[] Выборка адреса цифровых клавиш из таблицы [] ;[] Вход: D - позиционный код цифровой клавиши [] ;[] BC - адрес начала таблицы [] ;[] Выход: BC - адрес в таблице [] ;[] Флаг NC - нажата не цифровая клавиша [] ;[]=========================================================================[] AdrCtrlTabl: ld a,d and 01111111b ; сброс старшего бита dec a dec a cp 0x0A ; проверка цифровых клавиш верхнего ряда ret nc or a scf ret z ; выход, если "0" .L9BEA inc bc inc bc inc bc dec a jr nz,.L9BEA ret ;[]=========================================================================[] ;[] Получение кода из строки ввода [] ;[] Вход: C - длина строки ввода [] ;[] Выход: .Buffer - захваченные байты [] ;[] B - количество захваченных байт [] ;[] флаг C - ошибка [] ;[]=========================================================================[] PutCode ld de,InputLine.Buffer ld hl,.Buffer ld a,c dec a ret c ; нулевая строка inc a srl a ld b,a jr z,.L3 ; обработка одного символа ld c,a ld a,0xC9 ; RET jr nc,.L9C06 xor a ; NOP .L9C06 ld (.L3_RET),a .L2 push hl ld hl,0 ld a,2 call PutHex ld a,l pop hl ret c ; выход с ошибкой ld (hl),a inc hl dec c jr nz,.L2 or a .L3_RET ret .L3 inc b push hl ld hl,0 ld a,1 call PutHex ld a,l pop hl ret c ; выход с ошибкой ld (hl),a or a ret .Buffer ds 4 ;[]=========================================================================[] ;[] Получение адреса из строки ввода [] ;[] Вход: C - длина строки ввода [] ;[] Выход: HL - число [] ;[] флаг C - ошибка [] ;[]=========================================================================[] PutAddress ld a,c dec a ret c ; нулевая строка ld de,InputLine.Buffer ld hl,0 ld a,(de) call CapsLetter cp "X" ; hex-число jr z,.L9C43 cp "#" ; hex-число .L9C43 ld a,c jr nz,PutDec inc de inc de dec a dec a ret c inc a PutHex exa ld a,(de) call Numeric ; цифра? jr c,.L1 call CapsLetter ; лат.буквы в верхний регистр cp "F"+1 ccf ret c ; выход с ошибкой cp "A" ret c ; выход с ошибкой sub 0x07 .L1 sub 0x30 add hl,hl ; *16 add hl,hl add hl,hl add hl,hl or l ld l,a inc de inc de exa dec a jr nz,PutHex or a ; сброс флага C ret PutDec exa ld a,(de) call Numeric ; цифра? ccf ret c ; выход если нет ld c,l ld b,h add hl,hl ; *10 add hl,hl add hl,bc add hl,hl ld b,0 sub 0x30 ld c,a add hl,bc inc de inc de exa dec a jr nz,PutDec or a ; сброс флага C ret ;[]=========================================================================[] ;[] Проверка кода символа на принадлежность к цифрам (коды 0x30...0x39) [] ;[] Вход: A - код символа [] ;[] Выход: флаг C - цифра; Флаг NC - не цифра [] ;[]=========================================================================[] Numeric cp "0" ccf ret nc cp 3Ah ret ;[]=========================================================================[] ;[] Перевод символов латинского алфавита a...z в верхний регистр [] ;[] Вход: A - код символа [] ;[] Выход: A - код символа в верхнем регистре [] ;[]=========================================================================[] CapsLetter cp "a" ; <"a" ret c cp "z"+1 ; >"z" ret nc and 11011111b ; преобразование символа ret InputLine1 push hl push bc call CursorSet pop bc pop hl jr InputLine ;[]=========================================================================[] ;[] Ввод строки символов с клавиатуры [] ;[] Вход: B - длина строки ввода [] ;[] HL - координаты курсора [] ;[] Выход: флаг C - флаг NC - [] ;[] C - длина введенной строки, если [] ;[]=========================================================================[] InputLineEd ld a,(Color.InLineEd) ; цвет строки ввода ld c,a xor a jr InputLine+6 InputLine ld a,(Color.InLine) ; цвет строки ввода ld c,a ld a,On .L0 ld (.EntEnd),a ld a,0xC3 ; код JP ld (.L15),a ld (CursPos),hl ld (.Coordinate),hl ld hl,.Pos xor a ; текущая позиция ld (hl),a inc hl ld (hl),c ; цвет inc hl ld (hl),b ; длина строки редактирования inc hl ; начало буфера редактирования ld de,CursorSet.Buffer ; буфер строки под курсором ;ld c,a ; окраска строки редактирования .L1 ld a,(de) ld (hl),a inc hl inc de ld (hl),c inc hl inc de djnz .L1 call .PrintInLine ; напечатать строку ld a,(.EntEnd) or a call nz,.EndString ; курсор в конец строки .L100 ld a,On ; включить програм курсор ld (CursOnOff),a ld hl,.L100 push hl ; адрес возврата .L9CE7 ld c,Dss.ScanKey ; состояние клавиатуры rst DssRst jr z,.L9CE7 cp 0x20 ; есть ASCII-код jr c,.L3 push af ld a,(.Pos) exa ld hl,.Color ; текущий цвет строки ввода ld a,(Color.InLine) cp (hl) call z,.ClearInLine call z,.HomeString call .NextPos ; на выходе в HL адрес .Pos jr z,.L12 ld a,(CursInsOvr) ; режим Ins/Ovr or a jr nz,.L12 ; переход если Ovr ld a,(.Len) ld e,a dec a ; длина строки - 1 add a,a ld b,0 ld c,a ld d,(hl) ; позиция печати символа ld hl,.Buffer add hl,bc ; конец буфера inc hl ld a,e sub d ; кол-во сдвигаемых символов add a,a ld c,a ld d,h ld e,l dec hl dec hl lddr ; раздвижка строки .L12 exa add a,a ld b,0 ld c,a ld hl,.Buffer add hl,bc ; адрес в буфере pop af ld (hl),a ; символ в буфер call ResCurs .L15 jp .PrintInLine jr .L14 .L3 cp ESC_KEY ; jr nz,.L13 call ResCurs pop hl ; востановить стек scf ret .L13 cp ENTER_KEY ; jr nz,.L2 ld a,On ld (.EntEnd),a call ResCurs .L14 pop hl ; востановить стек call .EndPos ; длина введенной строки ret .L2 ld a,d cp DEL_KEY ; jr nz,.L9 call ResCurs ld hl,.Color ; текущий цвет строки ввода ld a,(Color.InLine) cp (hl) call z,.ClearInLine .L11 ld hl,.Pos ld a,(hl) ; позиция курсора add a,a ld e,a inc hl inc hl ld a,(hl) ; длина строки dec a add a,a sub e ; проверка конца строки ld c,a ld b,0 ld d,b inc hl ; начало буфера add hl,de ; адрес курсора push hl pop de inc hl inc hl jr z,.L9D80 ; если в конце строки ldir .L9D80 ld a," " ld (de),a ; последний символ jp .PrintInLine .L9 cp BKSP_KEY ; jr nz,.L10 call ResCurs call .ColorInLine ; сменить цвет строки ld hl,.Pos ld a,(hl) ; позиция курсора or a jp z,.PrintInLine ; если в начале строки dec (hl) ; уменьшить позицию ld hl,CursPos dec (hl) ; курсор влево jr .L11 .L10 cp INS_KEY ; jr nz,.L5 ld a,(CursInsOvr) cpl ld (CursInsOvr),a ret .L5 cp RIGHT_KEY ; jr nz,.L6 call ResCurs call .ColorInLine ; сменить цвет строки call z,.PrintInLine call .EndPos ret z ld a,(.Pos) cp c ret nc jp .NextPos .L6 cp LEFT_KEY ; jr nz,.L7 call ResCurs call .ColorInLine ; сменить цвет строки call z,.PrintInLine ld hl,.Pos ; позиция курсора ld a,(hl) or a ret z dec (hl) ld hl,CursPos ; координаты програм курсора dec (hl) ret .L7 cp HOME_KEY ; jr nz,.L8 call ResCurs call .ColorInLine ; сменить цвет строки call z,.PrintInLine .HomeString ld hl,.Pos ; позиция курсора ld a,(hl) or a ret z ld a,(.Coordinate) ; координаты начала строки ld (CursPos),a xor a ld (hl),a ; обнулить позицию печати ret .L8 cp END_KEY ; ret nz call ResCurs call .ColorInLine ; сменить цвет строки call z,.PrintInLine .EndString call .EndPos ret z ld a,(.Len) ; dec a ; длина строки ввода - 1 sub c ; заполнена полностью? jr nz,.L9E10 dec c .L9E10 ld hl,.Pos ld (hl),c ; позиция в конце строки ld a,(.Coordinate) add a,c ld (CursPos),a ; новая позиция програм курсора ret .PrintInLine ld ix,.Buffer ; буфер строки ld a,(.Len) ld l,a ld h,1 ; размеры буфера ld de,(.Coordinate) ; координаты в экране IFDEF D_PRINTCH_BIOS xor a ld c,Bios.Win_Restore_Win ;вывод буфера на экран di rst BiosRst ei ELSE ld a,(BankDebug) ld b,a ld c,Dss.WinRest rst DssRst ENDIF ret .ClearInLine ld hl,.Len ; очистка строки ввода ld b,(hl) ; длина строки ввода ld a," " ; пробел .L9E38 inc hl ; начало буфера строки ld (hl),a inc hl djnz .L9E38 xor a ; позиция печати ld (.Pos),a exa ld a,(.Coordinate) ld (CursPos),a jr .L9E52 .ColorInLine ld hl,.Color ; окраска в основной цвет ld a,(Color.InLine) cp (hl) ret nz .L9E52 ld a,(Color.InLineEd) ; цвет строки ввода ld (.Color),a ld hl,.Len ; длина строки ввода ld b,(hl) inc hl .L9E5D inc hl ld (hl),a inc hl djnz .L9E5D ret .EndPos ld hl,.Buffer ; поиск позиции послед. символа ld a,(.Len) ld c,a dec a add a,a ld e,a ld d,0 add hl,de .L9E70 ld a,(hl) dec hl dec hl cp " " ; ищем конец строки ret nz dec c jr nz,.L9E70 ret .NextPos ld hl,.Pos ; расчет следующей позиции ld a,(.Len) dec a cp (hl) jr nz,.L16 ld a,(.EntEnd) ; заканчивать по ENTER inc a ret z ; последняя позиция в строке ld a,0xCD ; код CALL ld (.L15),a ret .L16 inc (hl) ; увеличение позиции ld a,(CursPos) ; координаты програм курсора inc a ld (CursPos),a ret ;[]=========================================================================[] ;[] Копирование из буфера строки ввода [] ;[]=========================================================================[] ;Вход: ;DE - адрес назначения ;C - длина строки .FromBuffer ld hl,.Buffer ld b,0 .FB1 ld a,(hl) ld (de),a inc hl inc hl inc de dec c jr nz,.FB1 ret ;[]=========================================================================[] ;[] Копирование в буфер строки ввода [] ;[]=========================================================================[] ;Вход: ;HL - адрес строки ;C - длина строки .ToBuffer ld de,.Buffer .TB1 ld a,(hl) ld (de),a inc de inc de inc hl dec c jr nz,.TB1 ret .EntEnd DB On ; флаг окончания строки ENTER .Coordinate DW 0 ; начало строки в экране ; Последовательность переменных не изменять! .Pos DB 0 ; позиция курсора в строке .Color DB 0 ; цвет строки ввода .Len DB 0 ; длина строки ввода .Buffer DS 22*2 ; буфер строки ввода ;[]=========================================================================[] ;[] Программное создние мигающего курсора [] ;[]=========================================================================[] ;======== Подготовка дополнительного знакогенератора ======== PreparChar ld de,OrgAdr-0x100 ; буфер для 2kB знакогенератора ld c,Bios.Win_Get_ZG ; получить сист. знакогенератор rst BiosRst ld hl,OrgAdr-0x100+7*256 ld bc,0x00FF .L9EF0 ld (hl),c inc hl djnz .L9EF0 ld de,OrgAdr-0x100 ; уст.знакогенератор 0x5B ld c,Bios.Win_Set_ZG ld a,0x5B rst BiosRst ld hl,(0039h) ; установка вектора (для мигания курсора) ld (Rst38.Vect+1),hl ld hl,Rst38 ld (0039h),hl ret Rst38 di ; вектор курсора push iy push ix push hl push de push bc push af exx exa push hl push de push bc push af call Clock ld a,(CursOnOff) or a call nz,CuttingCurs pop af pop bc pop de pop hl exx exa pop af pop bc pop de pop hl pop ix pop iy .Vect jp 0x0000 ; адрес сист. вектора RST 38 ;======== Обработка программного курсора ======== CuttingCurs ld a,(TimerFlash) ; пауза мигания dec a call z,.L1 ld (TimerFlash),a ret .L1 ld a,(CursPutRes) cpl ld (CursPutRes),a ld de,(CursPos) ld (ResCurs.L1+1),de or a ; флаг Put / Res jr z,.L3 ; установка курсора ; иначе сброс курсора ld hl,(CursSymb) ; символ и его цвет sub a ; сброс id окна ld b,SysSymb ; системный знакогенератор ld c,Bios.Win_Put_Sym ; положить символ rst BiosRst ld a,PauseFlash ; пауза мигания ret .L3 ld c,Bios.Win_Get_Sym ; получить символ sub a ; сброс id окна rst BiosRst ld (CursSymb),hl ; символ и его цвет ld de,(CursPos) ; позиция печати ld a,(CursInsOvr) ; флаг режима Ins / Ovr or a jr z,.L4 ; режим вставки ; иначе режим замены ld a,h rlca rlca rlca rlca ld h,a sub a ; сброс id окна ld b,SysSymb ; системный знакогенератор ; ld l,0xDC ; курсор режима замены ld c,Bios.Win_Put_Sym ; символ на экран rst BiosRst ld a,PauseFlash ; пауза мигания ret .L4 sub a ; сброс id окна ld b,0x5B ; модиф. знакогенератор ld c,Bios.Win_Put_Sym ; символ на экран rst BiosRst ld a,PauseFlash ; пауза мигания ret ;======== Принудительный сброс курсора ======== ResCurs ld a,(CursOnOff) or a ret z ; курсор не установлен push hl ld a,On ld (CursPutRes),a inc a ld (CursOnOff),a ld a,1 ; пауза мигания ld (TimerFlash),a .L1 ld de,0 ; последние координаты курсора ld hl,(CursSymb) ld bc,0x1B00+Bios.Win_Put_Sym sub a ; сбросить id окна rst BiosRst pop hl ret CursOnOff db Off ; флаг курсора 00-выкл/FF-вкл CursPutRes db On ; флаг 00-Res/FF-Put CursInsOvr db Ins ; флаг 00-Ins/FF-Ovr TimerFlash db 1 ; таймер CursPos dw 0 ; позиция курсора CursSymb dw 0 ; символ под курсором ENDMODULE