Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Нужна помощь: Смена раскладки клавиатуры


Автор: 0x00 15.10.2009, 00:51
Нужно сделать, чтобы раскладка клавиатуры менялась не только левым SHIFT+CTRL, но и правым.
Тому кто поможет большое человеческое спасибо, вознаграждение на пиво.
В аську 5000870.

Код
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.

Автор: Goodwin98 15.10.2009, 01:14
Код

    mov ah,02
    int 16h
    mov ah,al
    and al,6
    cmp AL,6H
    jz  @@1
    and ah,5
    cmp ah,5
    jz @@1
    xor AX,AX
    ret
@@1:mov AX,01H
    ret

Автор: 0x00 15.10.2009, 01:39
Спасибо, тему можно считать закрытой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)