85 lines
1.2 KiB
ArmAsm
85 lines
1.2 KiB
ArmAsm
#include "drivers/ps2/ps2.h"
|
|
|
|
.code32
|
|
|
|
.global ps2_wait_input_empty
|
|
.global ps2_wait_output_full
|
|
.global ps2_write_command
|
|
.global ps2_read_data
|
|
.global ps2_write_data
|
|
.global ps2_flush_output_buffer
|
|
|
|
# helpers
|
|
ps2_wait_input_empty: #(void) -> void
|
|
push %ebp
|
|
mov %esp, %ebp
|
|
1:
|
|
inb $PS2_STATUS, %al
|
|
andb $0x02, %al
|
|
jnz 1b
|
|
|
|
leave
|
|
ret
|
|
|
|
ps2_wait_output_full: #(void) -> void
|
|
push %ebp
|
|
mov %esp, %ebp
|
|
1:
|
|
inb $PS2_STATUS, %al
|
|
andb $0x01, %al
|
|
jz 1b
|
|
|
|
leave
|
|
ret
|
|
|
|
ps2_write_command: #(uint8_t command) -> void
|
|
push %ebp
|
|
mov %esp, %ebp
|
|
|
|
call ps2_wait_input_empty
|
|
|
|
xor %eax, %eax
|
|
movb 8(%ebp), %al
|
|
outb %al, $PS2_COMMAND
|
|
|
|
leave
|
|
ret
|
|
|
|
ps2_read_data: #(void) -> uint8_t
|
|
push %ebp
|
|
mov %esp, %ebp
|
|
|
|
call ps2_wait_output_full
|
|
|
|
xor %eax, %eax
|
|
inb $PS2_DATA, %al
|
|
|
|
leave
|
|
ret
|
|
|
|
ps2_write_data: #(uint8_t) -> void
|
|
push %ebp
|
|
mov %esp, %ebp
|
|
|
|
call ps2_wait_input_empty
|
|
|
|
xor %eax, %eax
|
|
movb 8(%ebp), %al
|
|
outb %al, $PS2_DATA
|
|
|
|
leave
|
|
ret
|
|
|
|
|
|
ps2_flush_output_buffer: #(void) -> void
|
|
push %ebp
|
|
mov %esp, %ebp
|
|
1:
|
|
inb $PS2_STATUS, %al
|
|
andb $0x01, %al
|
|
jz 2f
|
|
inb $PS2_DATA, %al
|
|
jmp 1b
|
|
2:
|
|
leave
|
|
ret |