Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2009, 23:06   #1
Slash3
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 14
По умолчанию переключение раскладки клавиатуры по кнопкам Alt и Shift

Есть рабочая программа с переключением раскладки клавиатуры по кнопкам Ctrl и Shift как переделать чтобы раскладка клавиатуры переключалась по кнопкам Alt и Shift....
Код:
uses crt;
 
var rusChars:array[1..102] of char;
	engChars:array[1..102] of char;
    rusLang:boolean;
 
function int2str(int:integer):string;
var sint:string;
begin
	str(int, sint);
    int2str:=sint;
end;
 
procedure initRusChars;
begin
	rusChars[16]:='©';
    rusChars[17]:='ж';
	rusChars[18]:='г';
	rusChars[19]:='Є';
    rusChars[20]:='Ґ';
    rusChars[21]:='*';
	rusChars[22]:='Ј';
    rusChars[23]:='и';
    rusChars[24]:='й';
    rusChars[25]:='§';
    rusChars[26]:='е';
    rusChars[27]:='к';
 
    rusChars[30]:='д';
    rusChars[31]:='л';
    rusChars[32]:='ў';
    rusChars[33]:='*';
    rusChars[34]:='Ї';
    rusChars[35]:='а';
    rusChars[36]:='®';
    rusChars[37]:='«';
    rusChars[38]:='¤';
    rusChars[39]:='¦';
    rusChars[40]:='н';
    rusChars[41]:='с';
 
    rusChars[44]:='п';
    rusChars[45]:='з';
    rusChars[46]:='б';
    rusChars[47]:='¬';
    rusChars[48]:='Ё';
    rusChars[49]:='в';
    rusChars[50]:='м';
    rusChars[51]:='Ў';
    rusChars[52]:='о';
end;
 
procedure initEngChars;
begin
	engChars[16]:='q';
    engChars[17]:='w';
	engChars[18]:='e';
	engChars[19]:='r';
    engChars[20]:='t';
    engChars[21]:='y';
	engChars[22]:='u';
    engChars[23]:='i';
    engChars[24]:='o';
    engChars[25]:='p';
 
    engChars[30]:='a';
    engChars[31]:='s';
    engChars[32]:='d';
    engChars[33]:='f';
    engChars[34]:='g';
    engChars[35]:='h';
    engChars[36]:='j';
    engChars[37]:='k';
    engChars[38]:='l';
 
    engChars[44]:='z';
    engChars[45]:='x';
    engChars[46]:='c';
    engChars[47]:='v';
    engChars[48]:='b';
    engChars[49]:='n';
    engChars[50]:='m';
end;
 
procedure asmReadChar(var posChar,codeChar);assembler;
asm
	mov AH,00H
    int 16H
    push AX
    xor AH,AH
	les	DI,codeChar
    stosw
 
    pop AX
    mov AL,AH
    xor AH,AH
    les	DI,posChar
    stosw
end;
 
function _asmIsCharEnabled:integer;assembler;
asm
	mov AH,01H
    int 16H
    jz  @@1
    xor AH,AH
    mov AL,01H
    ret
@@1:xor AH,AH
	mov AL,00H
    ret
 
end;
 
function isCharEnabled:boolean;
var charEnabled:integer;
begin
    charEnabled:=_asmIsCharEnabled;
	{writeln('charEnabled = '+int2str(charEnabled));}
	isCharEnabled:=charEnabled<>0;
end;
 
function _asmIsCtrlShift:integer;assembler;
asm
	mov AH,02H
    int 16H
    and AL,6H
    cmp AL,6H
    jz  @@1
    mov AL,00H
    ret
@@1:mov AL,01H
	ret
 
end;
 
function isCtrlShift:boolean;
begin
   	isCtrlShift:=_asmIsCtrlShift<>0;
end;
 
procedure _drawWindow(x1,y1,x2,y2,bgcolor,txtcolor:integer);
begin
	window(x1,y1,x2,y2);
    textBackGround(bgcolor);
    textColor(txtcolor);
    clrscr;
end;
 
procedure _drawLangWindow(rusLang:boolean);
begin
	_drawWindow(75,1,80,1,red,black);
    if rusLang then
    	write('rus')
    else
    	write('eng');
end;
 
procedure _drawMainWindow;
begin
	_drawWindow(1,1,59,25,black,lightgray);
end;
 
procedure _drawAllWindows(rusLang:boolean);
begin
    textBackGround(black);
    clrscr;
    _drawLangWindow(rusLang);
    _drawMainWindow;
end;
 
 
procedure writeChar(codeChar, posChar:integer);
var currentChar:char;
begin
	if rusLang then
    	currentChar:=rusChars[posChar]
    else
    	currentChar:=engChars[posChar];
    if currentChar<>#0 then
    begin
		write(int2str(codeChar)+' - '+int2str(posChar)+' = ');
		write('"');
	    write(currentChar);
		writeln('"');
    end;
end;
 
 
const Esc=27;
var codeChar, posChar:integer;
 
begin
    initRusChars;
    initEngChars;
    rusLang:=false;
    _drawAllWindows(rusLang);
    repeat
        repeat
        	if isCtrlShift then
                begin
            		rusLang:= not rusLang;
                    _drawAllWindows(rusLang);
                    repeat
                    until not isCtrlShift;
                end;
        until isCharEnabled;
 
		asmReadChar(posChar, codeChar);
 
        writeChar(codeChar, posChar);
    until codeChar=Esc;
end.

Последний раз редактировалось rpy3uH; 10.03.2009 в 07:38.
Slash3 вне форума Ответить с цитированием
Старый 10.03.2009, 11:01   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если не ошибаюсь
Код:
function _asmIsCtrlShift:integer;assembler;
asm
	mov AH,02H
    int 16H
    cmp AL,9; при левом шифте или 10 при правом
    jz  @@1
    mov AL,00H
    ret
@@1:mov AL,01H
	ret
 
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.03.2009, 11:12   #3
Slash3
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 14
По умолчанию

Не работает((( Вы сами пробавли запускать???
Slash3 вне форума Ответить с цитированием
Старый 10.03.2009, 11:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вы сами пробавли запускать???
Нет у меня нет ДОС эмулятора.
Цитата:
Не работает
В таком случае проходи по шагам и выясняй что за число возвращается при нажатии этих клавиш.

Кстати в ДОСе ту же инфу можно извлеч из ячейки 0:417
I'm learning to live...

Последний раз редактировалось Stilet; 10.03.2009 в 12:08.
Stilet вне форума Ответить с цитированием
Старый 10.03.2009, 13:08   #5
Slash3
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нет у меня нет ДОС эмулятора.

В таком случае проходи по шагам и выясняй что за число возвращается при нажатии этих клавиш.

Кстати в ДОСе ту же инфу можно извлеч из ячейки 0:417
К сажалению я непонимаю (((
Slash3 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реагировать на изменение раскладки клавиатуры Rusl92 Общие вопросы Delphi 3 22.02.2009 01:18
Переключение клавиатуры в Turbo pascal 7.1 TrunV Помощь студентам 2 16.01.2009 01:09
не получается отключение CTRL+alt+del? Alt+TAb, часов с панели задач и Крестик окна Reds Общие вопросы Delphi 1 30.09.2008 10:37
Смена раскладки клавиатуры NoName_emaNoN Общие вопросы Delphi 10 28.05.2008 08:55