Code: Select all
.type irq0,@function
irq0:
push $0
push $0
pusha
mov %ds, %eax
pushl %eax
mov %es, %eax
pushl %eax
mov %fs, %eax
pushl %eax
mov %gs, %eax
pushl %eax
mov $0x10, %eax
mov %eax, %ds
mov %eax, %es
mov %eax, %fs
mov %eax, %gs
movl %cr0, %eax
pushl %eax
movl %esp, %eax
pushl %eax
cli
call timer_handler
sti
pop %eax
pop %eax
mov %eax, %cr0
pop %eax
mov %eax, %gs
pop %eax
mov %eax, %fs
pop %eax
mov %eax, %es
pop %eax
mov %eax, %ds
popa
iret
.type irq1,@function
irq1:
push $0
push $1
pusha
mov %ds, %eax
pushl %eax
mov %es, %eax
pushl %eax
mov %fs, %eax
pushl %eax
mov %gs, %eax
pushl %eax
mov $0x10, %eax
mov %eax, %ds
mov %eax, %es
mov %eax, %fs
mov %eax, %gs
movl %cr0, %eax
pushl %eax
movl %esp, %eax
pushl %eax
cli
call keyboard_handler
sti
pop %eax
pop %eax
mov %eax, %cr0
pop %eax
mov %eax, %gs
pop %eax
mov %eax, %fs
pop %eax
mov %eax, %es
pop %eax
mov %eax, %ds
popa
iret
Code: Select all
.type isr48,@function
isr48:
push $0
push $48
pusha
mov %ds, %eax
pushl %eax
mov %es, %eax
pushl %eax
mov %fs, %eax
pushl %eax
mov %gs, %eax
pushl %eax
mov $0x10, %eax
mov %eax, %ds
mov %eax, %es
mov %eax, %fs
mov %eax, %gs
movl %cr0, %eax
pushl %eax
movl %esp, %eax
pushl %eax
cli
call syscall
sti
pop %eax
pop %eax
mov %eax, %cr0
pop %eax
mov %eax, %gs
pop %eax
mov %eax, %fs
pop %eax
mov %eax, %es
pop %eax
mov %eax, %ds
popa
iret
Code: Select all
void syscall(struct regs *r)
{
unsigned char last_key;
switch(r->eax)
{
case 0:
Printf((char *)r->ebx);
break;
case 1:
r->ebx=(unsigned int)last_key;
break;
default:
break;
}
}
Code: Select all
void keyboard_handler(struct regs *r)
{
unsigned char scancode;
unsigned char last_key;
unsigned char diff='A'-'a';
scancode=inportb(0x06);
if(scancode&0x80)
{
if(last_key==ALT)
{
alt=0;
}
else
if(last_key==SHIFT)
{
shift=0;
}
else
if(last_key==CTRL)
{
ctrl=0;
}
}
else
{
switch(kb_setup)
{
case 0:
last_key=kb_us[scancode];
break;
case 1:
last_key=kb_dvorak[scancode];
break;
default:
break;
}
switch(last_key)
{
case CAPS:
if(caps)
{
caps=0;
while((inportb(0x64)&2)!=0);
outportb(0x60,0xED);
outportb(0x60,0x00);
}
else
{
caps=1;
while((inportb(0x64)&2)!=0);
outportb(0x60,0xED);
outportb(0x60,0x03);
}
break;
case ALT:
alt=1;
break;
case SHIFT:
shift=1;
break;
case CTRL:
ctrl=1;
break;
default:
if(caps || shift)
{
if(last_key>='a' && last_key<='z')
{
if(caps && shift){}
else
{
last_key+=diff;
}
}
else
if(!caps && shift)
{
switch(last_key)
{
case '[':
last_key='{';
break;
case '7':
last_key='&';
break;
case '5':
last_key='%';
break;
case '3':
last_key='#';
break;
case '1':
last_key='!';
break;
case '9':
last_key='(';
break;
case '0':
last_key=')';
break;
case '2':
last_key='@';
break;
case '4':
last_key='$';
break;
case '6':
last_key='^';
break;
case '8':
last_key='*';
break;
case ']':
last_key='}';
break;
case '\'':
last_key='"';
break;
case '=':
last_key='+';
break;
case '\\':
last_key='|';
break;
case '-':
last_key='_';
break;
case '/':
last_key='?';
break;
case ',':
last_key='<';
break;
case '.':
last_key='>';
break;
default:
break;
}
}
}
}
}
if(last_key<127)
{
Putch(last_key);
}
outportb(0x20, 0x20);
}
Code: Select all
void timer_handler(struct regs *r)
{
timer_ticks++;
outportb(0x20,0x20);
}