blob: c53ef176a682f300c1a3e226397b6ebfecfc2329 [file] [log] [blame]
swissChili9b3584b2021-02-18 13:57:27 -08001#include "io.h"
swissChili19ef4182021-02-21 17:45:51 -08002#include "kbd.h"
3#include "log.h"
4#include "pic.h"
5
6bool pressed_keys[LAST_KBD_KEY];
swissChilif5448622021-03-08 20:17:36 -08007char special_key_mappings[LAST_KBD_KEY - FIRST_KBD_KEY] = {
swissChili19ef4182021-02-21 17:45:51 -08008 [KBD_ENTER - FIRST_KBD_KEY] = '\n',
9 [KBD_SPACEBAR - FIRST_KBD_KEY] = ' ',
10 [KBD_TAB - FIRST_KBD_KEY] = '\t',
11 [KBD_BACKSPACE - FIRST_KBD_KEY] = '\b',
swissChili19ef4182021-02-21 17:45:51 -080012};
swissChilid8137922021-02-17 15:34:07 -080013
swissChilid8137922021-02-17 15:34:07 -080014void outb(ushort port, uchar val)
15{
swissChili825d46b2021-02-21 10:14:16 -080016 asm volatile("outb %1, %0" : : "dN"(port), "a"(val));
swissChilid8137922021-02-17 15:34:07 -080017}
18
19uchar inb(ushort port)
20{
21 uchar ret;
swissChili825d46b2021-02-21 10:14:16 -080022 asm volatile("inb %1, %0" : "=a"(ret) : "dN"(port));
swissChilid8137922021-02-17 15:34:07 -080023 return ret;
24}
25
26ushort inw(ushort port)
27{
28 ushort ret;
swissChili825d46b2021-02-21 10:14:16 -080029 asm volatile("inw %1, %0" : "=a"(ret) : "dN"(port));
swissChilid8137922021-02-17 15:34:07 -080030 return ret;
31}
32
swissChili0d248832021-04-08 18:16:02 -070033void outl(ushort port, uint val)
34{
35 asm volatile("outl %1, %0" : : "dN"(port), "a"(val));
36}
37
38uint inl(ushort port)
39{
40 uint ret;
41 asm volatile("inl %1, %0" : "=a"(ret) : "dN"(port));
42 return ret;
43}
44
swissChilid8137922021-02-17 15:34:07 -080045void *memset(void *s, int c, size_t n)
46{
47 for (size_t i = 0; i < n; i++)
48 {
49 ((uchar *)s)[i] = c;
50 }
swissChili825d46b2021-02-21 10:14:16 -080051 return s;
swissChilid8137922021-02-17 15:34:07 -080052}
53
54void *memcpy(void *dest, const void *src, size_t n)
55{
56 for (size_t i = 0; i < n; i++)
57 {
58 ((uchar *)dest)[i] = ((uchar *)src)[i];
59 }
swissChili825d46b2021-02-21 10:14:16 -080060 return dest;
swissChilid8137922021-02-17 15:34:07 -080061}
swissChili9b3584b2021-02-18 13:57:27 -080062
swissChilie9289ee2021-03-20 21:54:28 -070063void strcpy(char *dest, char *src)
64{
65 memcpy(dest, src, strlen(src) + 1);
66}
67
swissChilif5448622021-03-08 20:17:36 -080068uint strlen(char *a)
69{
swissChilicfd3c3c2021-04-03 15:04:24 -070070 uint i = 0;
71 for (; a[i]; i++)
swissChilif5448622021-03-08 20:17:36 -080072 {
73 }
74
75 return i;
76}
77
78int strcmp(char *a, char *b)
79{
80 int al = strlen(a), bl = strlen(b);
81
82 if (al != bl)
83 return bl - al;
84
85 for (int i = 0; i < al; i++)
86 {
87 if (a[i] != b[i])
88 return -1;
89 }
90 return 0;
91}
92
swissChili19ef4182021-02-21 17:45:51 -080093uchar kbd_scan_code()
94{
95 return inb(KBD_DATA_PORT);
96}
97
98static bool kbd_shift_pressed()
99{
100 return pressed_keys[KBD_LEFT_SHIFT] || pressed_keys[KBD_RIGHT_SHIFT] ||
101 pressed_keys[KBD_CAPS_LOCK];
102}
103
104void kbd_handle_input(struct registers *registers)
105{
106 uchar byte = kbd_scan_code();
107
108 struct kbd_scan_codes code = scan_code_set_1[byte];
109
110 if (code.ascii && !code.brk)
111 {
112 kprintf("%c", kbd_shift_pressed() && code.up_symbol ? code.up_symbol
113 : code.symbol);
114 }
115 else if (!code.brk && special_key_mappings[code.symbol - FIRST_KBD_KEY])
116 {
117 kprintf("%c", special_key_mappings[code.symbol - FIRST_KBD_KEY]);
118 }
119 pressed_keys[code.symbol] = !code.brk;
120}
121
122void init_kbd()
123{
124 memset(pressed_keys, 0, LAST_KBD_KEY);
125 add_interrupt_handler(33, kbd_handle_input);
126}
swissChili9bd74de2021-06-15 20:30:48 -0700127
128bool isdigit(char c)
129{
130 return c >= '0' && c <= '9';
131}
132
133uint parse_int(char *string)
134{
135 uint number = 0;
136
137 for (; isdigit(*string); string++)
138 {
139 number *= 10;
140 number += *string - '0';
141 }
142
143 return number;
144}