Skip to content

Commit 22f7b52

Browse files
committed
getch() using keyboard keypress blocking input
1 parent a718089 commit 22f7b52

File tree

25 files changed

+360
-98
lines changed

25 files changed

+360
-98
lines changed

Makefile

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ $(bt_stage2): $(SRC_BOOTLOADER)/stage2.asm $(SRC_BOOTLOADER)/stage2.c $(SRC_BOOT
108108
ld --oformat binary -m elf_i386 -Ttext 0x8000 --strip-all -o $@ $(BUILD_BOOTLOADER)/stage2_asm.o $(BUILD_BOOTLOADER)/stage2_c.o $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios
109109
truncate --size=%512 $@
110110

111-
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/interrupts.asm $(SRC_LIB_UTILS)/io.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga # And other io.h dependecies -_-
111+
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/interrupts.asm $(SRC_LIB_UTILS)/output.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga # And other output.h dependecies -_-
112112
mkdir -p $$(dirname $(kernel_core))
113113
nasm -o $(BUILD_KERNEL)/core_asm.o -f elf32 $(SRC_KERNEL)/core.asm
114114
nasm -o $(BUILD_KERNEL)/interrupts_asm.o -f elf32 $(SRC_KERNEL)/interrupts.asm
@@ -141,9 +141,9 @@ $(BUILD_DRIVERS)/keyboard/libkeyboard: $(SRC_DRIVERS)/keyboard/keyboard.c $(SRC_
141141
nasm -o $(BUILD_DRIVERS)/keyboard/keyboard_asm.o -f elf32 $(SRC_DRIVERS)/keyboard/keyboard.asm
142142
ar rc $@ $(BUILD_DRIVERS)/keyboard/keyboard_c.o $(BUILD_DRIVERS)/keyboard/keyboard_asm.o
143143

144-
$(BUILD_LIB_UTILS)/libutils_16: $(SRC_LIB_UTILS)/io.c $(SRC_LIB_UTILS)/io.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/disk.c $(SRC_LIB_UTILS)/disk.asm $(SRC_LIB_UTILS)/disk.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
144+
$(BUILD_LIB_UTILS)/libutils_16: $(SRC_LIB_UTILS)/output.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/disk.c $(SRC_LIB_UTILS)/disk.asm $(SRC_LIB_UTILS)/disk.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
145145
mkdir -p $(BUILD_LIB_UTILS)/
146-
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/io.o $(SRC_LIB_UTILS)/io.c
146+
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/output.o $(SRC_LIB_UTILS)/output.c
147147
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/string.o $(SRC_LIB_UTILS)/string.c
148148
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/color.o $(SRC_LIB_UTILS)/color.c
149149
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/disk_c.o $(SRC_LIB_UTILS)/disk.c
@@ -152,11 +152,12 @@ $(BUILD_LIB_UTILS)/libutils_16: $(SRC_LIB_UTILS)/io.c $(SRC_LIB_UTILS)/io.h $(SR
152152
nasm -o $(BUILD_LIB_UTILS)/panic_asm.o -f elf32 $(SRC_LIB_UTILS)/panic.asm
153153
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/time_c.o $(SRC_LIB_UTILS)/time.c
154154
nasm -o $(BUILD_LIB_UTILS)/time_asm.o -f elf32 $(SRC_LIB_UTILS)/time.asm
155-
ar rc $@ $(BUILD_LIB_UTILS)/io.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/disk_c.o $(BUILD_LIB_UTILS)/disk_asm.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
155+
ar rc $@ $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/disk_c.o $(BUILD_LIB_UTILS)/disk_asm.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
156156

157-
$(BUILD_LIB_UTILS)/libutils: $(SRC_LIB_UTILS)/io.c $(SRC_LIB_UTILS)/io.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/disk.c $(SRC_LIB_UTILS)/disk.asm $(SRC_LIB_UTILS)/disk.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
157+
$(BUILD_LIB_UTILS)/libutils: $(SRC_LIB_UTILS)/output.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/input.c $(SRC_LIB_UTILS)/input.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/disk.c $(SRC_LIB_UTILS)/disk.asm $(SRC_LIB_UTILS)/disk.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
158158
mkdir -p $(BUILD_LIB_UTILS)/
159-
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/io.o $(SRC_LIB_UTILS)/io.c
159+
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/output.o $(SRC_LIB_UTILS)/output.c
160+
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/input.o $(SRC_LIB_UTILS)/input.c
160161
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/string.o $(SRC_LIB_UTILS)/string.c
161162
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/color.o $(SRC_LIB_UTILS)/color.c
162163
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/disk_c.o $(SRC_LIB_UTILS)/disk.c
@@ -165,21 +166,21 @@ $(BUILD_LIB_UTILS)/libutils: $(SRC_LIB_UTILS)/io.c $(SRC_LIB_UTILS)/io.h $(SRC_L
165166
nasm -o $(BUILD_LIB_UTILS)/panic_asm.o -f elf32 $(SRC_LIB_UTILS)/panic.asm
166167
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/time_c.o $(SRC_LIB_UTILS)/time.c
167168
nasm -o $(BUILD_LIB_UTILS)/time_asm.o -f elf32 $(SRC_LIB_UTILS)/time.asm
168-
ar rc $@ $(BUILD_LIB_UTILS)/io.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/disk_c.o $(BUILD_LIB_UTILS)/disk_asm.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
169+
ar rc $@ $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/input.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/disk_c.o $(BUILD_LIB_UTILS)/disk_asm.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
169170

170171
$(BUILD_LIB_DS)/libds: $(SRC_LIB_DS)/queue.h $(SRC_LIB_DS)/queue.c
171172
mkdir -p $(BUILD_LIB_DS)/
172173
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_DS)/queue.o $(SRC_LIB_DS)/queue.c
173174
ar rc $@ $(BUILD_LIB_DS)/queue.o
174175

175176
# User Applications
176-
$(app_calc): $(app_entry) $(SRC_APP)/calc.c $(SRC_LIB_UTILS)/io.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga # And dependecies :/
177+
$(app_calc): $(app_entry) $(SRC_APP)/calc.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga # And dependecies :/
177178
mkdir -p $$(dirname $(app_calc))
178179
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_APP)/calc.o $(SRC_APP)/calc.c
179180
ld --oformat binary -m elf_i386 -Ttext 0x2000 --strip-all -o $@ $(app_entry) $(BUILD_APP)/calc.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga
180181
truncate --size=%512 $@
181182

182-
$(app_tick_tac_toe): $(app_entry) $(SRC_APP)/tic_tac_toe.c $(SRC_LIB_UTILS)/io.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga # And dependecies :/
183+
$(app_tick_tac_toe): $(app_entry) $(SRC_APP)/tic_tac_toe.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga # And dependecies :/
183184
mkdir -p $$(dirname $(app_tick_tac_toe))
184185
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_APP)/tic_tac_toe.o $(SRC_APP)/tic_tac_toe.c
185186
ld --oformat binary -m elf_i386 -Ttext 0x2000 --strip-all -o $@ $(app_entry) $(BUILD_APP)/tic_tac_toe.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga

src/app/calc.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ void print_int(int x) {
1212
printf("%d", x);
1313
}
1414
#else
15-
#include <lib/utils/io.h>
15+
#include <lib/utils/output.h>
1616
#include <lib/utils/time.h>
1717
#include <lib/utils/string.h>
18+
void read_line(char *s) {
19+
// Not Implemented.
20+
// Migrate binary to 32-bit.
21+
}
1822
#endif
1923

2024
int err;
@@ -98,7 +102,7 @@ int handle_expression(char str[]) {
98102
} else {
99103
print_line(" Result: ");
100104
print_int(result);
101-
print_line("\n\n");
105+
print_line("\n\n");
102106
}
103107
return 1;
104108
}

src/app/dashboard.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
#include <app/calc.c>
2-
#include <lib/utils/io.h>
2+
#include <lib/utils/output.h>
33
#include <lib/utils/time.h>
44
#include <lib/utils/color.h>
55
#include <lib/utils/disk.h>
66
#include <lib/utils/string.h>
77

8+
void read_line(char *s) {
9+
// Not Implemented.
10+
// Migrate binary to 32-bit.
11+
}
12+
813
char query_app_number[] = "Enter Application Number: ";
914
char application_list[5][15] = {"Calculator", "Sample 2", "Sample 3", "Sample 4", "Sample 5"};
1015
void print_applications(unsigned char x, unsigned char y, char *list, unsigned char count, unsigned char max_strlen) {

src/app/tic_tac_toe.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22
#define BUILD_FOR_FUZZY
33
#ifndef BUILD_FOR_FUZZY
44
#else
5-
#include <lib/utils/io.h>
5+
#include <lib/utils/output.h>
66
#include <lib/utils/time.h>
77
#include <lib/utils/string.h>
8+
char getch() {
9+
// Not Implemented.
10+
// Migrate binary to 32-bit.
11+
}
812
#endif
913

1014
void console_init() {

src/bootloader/stage2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <lib/utils/color.h>
22
#include <lib/utils/disk.h>
3-
#include <lib/utils/io.h>
3+
#include <lib/utils/output.h>
44
#include <lib/utils/time.h>
55

66
char message_welcome[] = "C says 'Hello World'";

src/drivers/display/text_mode.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,4 @@ void io_low_scroll_screen(unsigned char count, unsigned char color,
1313
unsigned char x1, unsigned char y1,
1414
unsigned char x2, unsigned char y2);
1515

16-
void io_low_put_char(char c, unsigned char color);
17-
18-
// Should be out of here.
19-
char io_low_read_char();
16+
void io_low_put_char(char c, unsigned char color);

src/drivers/display/text_mode_bios.asm

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,6 @@ global _low_read_char
4848
mov dh, [ebp + 0x1c] ; (window bottom-right y)
4949
int 0x10
5050

51-
mov esp, ebp
52-
pop ebp
53-
ret
54-
55-
_low_read_char:
56-
push ebp
57-
mov ebp, esp
58-
59-
mov ah, 0x00 ; (read character)
60-
int 0x16
61-
and eax, 0xFF
62-
6351
mov esp, ebp
6452
pop ebp
6553
ret

src/drivers/display/text_mode_bios.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,5 @@ void io_low_scroll_screen(unsigned char count, unsigned char color,
4747
}
4848

4949
void io_low_put_char(char c, unsigned char color) {
50-
_low_put_chars(c, 1, color);
51-
}
52-
53-
char io_low_read_char() {
54-
return _low_read_char();
55-
}
50+
_low_put_chars(c, 1, color);
51+
}

src/drivers/display/text_mode_vga.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,4 @@ void io_low_scroll_screen(unsigned char count, unsigned char color,
7474

7575
void io_low_put_char(char c, unsigned char color) {
7676
_low_put_char(c,color, location_xy);
77-
}
78-
79-
char io_low_read_char() {
80-
// Not implemented!
81-
while(1);
82-
return 0;
83-
}
77+
}

src/drivers/keyboard/keyboard.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <drivers/keyboard/keyboard.h>
22
#include <lib/ds/queue.h>
3-
#include <lib/utils/io.h>
3+
#include <lib/utils/output.h>
44
#include <lib/utils/time.h>
55
#include <lib/utils/panic.h>
66

@@ -24,8 +24,6 @@ void __stack_chk_fail(void) {
2424
}
2525

2626
void print_status(const char *message, int status) {
27-
set_color_bg(C_WHITE);
28-
set_color_fg(C_BLACK);
2927
move_xy(0, TEXT_WINDOW_HEIGHT-1);
3028
print_line(message);
3129
print_int(status);
@@ -47,7 +45,7 @@ void keyboard_wait() {
4745
}
4846

4947
const int WAIT_FOR_STATUS_TIMEOUT = 1000000;
50-
const int WAIT_FOR_STATUS_KEYSCANCODE_TIMEOUT = 1000;
48+
const int WAIT_FOR_STATUS_KEYSCANCODE_TIMEOUT = 10;
5149

5250
int wait_for_status_flag_timeout_low(unsigned char flag, unsigned char check_true, int timeout, int canpanic) {
5351
while(timeout>0) {
@@ -140,7 +138,7 @@ unsigned char read_data_reply() {
140138
#define KEYBOARD_BUFFER_SIZE 64
141139
int keyboard_buffer[KEYBOARD_BUFFER_SIZE+3];
142140

143-
void keyboard_scanner_handle_buffer(int keyboard_buffer_queue[]);
141+
int keyboard_scanner_handle_buffer(int keyboard_buffer_queue[]);
144142

145143
void keyboard_scanner_init() {
146144
ASSERT( queue_init(keyboard_buffer, KEYBOARD_BUFFER_SIZE) );
@@ -150,11 +148,11 @@ int keyboard_scanner_step() {
150148
int state_change = 0;
151149
int qc = queue_capacity(keyboard_buffer);
152150
int qs = queue_size(keyboard_buffer);
153-
while(qs<qc) {
151+
if(qs<qc) {
154152
int got_response = wait_for_status_flag_nopanic_timeout(STATUS_OUTPUT_BUFFER, 1, WAIT_FOR_STATUS_KEYSCANCODE_TIMEOUT);
155-
if(!got_response) return;
153+
if(!got_response) return 0;
156154
unsigned char out = read_data_reply();
157-
if(out == 0) return;
155+
if(out == 0) return 0;
158156
state_change = 1;
159157

160158
queue_push(keyboard_buffer, out);
@@ -164,17 +162,19 @@ int keyboard_scanner_step() {
164162
return state_change;
165163
}
166164

167-
int fake_getch() {
168-
while(queue_size(keyboard_buffer) == 0) {
169-
// busy wait but checking on keyboard replies.
165+
char keyboard_get_key_pressed_blocking() {
166+
while(!keyboard_scanner_ascii_is_available()) {
170167
keyboard_scanner_step();
171168
}
172-
int out = queue_front(keyboard_buffer);
173-
queue_pop(keyboard_buffer);
174-
return out;
169+
return keyboard_scanner_ascii_get();
175170
}
176171

177172
void keyboard_init() {
173+
unsigned char original_colors = get_color_fgbg();
174+
175+
set_color_bg(C_LIGHT_GRAY);
176+
set_color_fg(C_BLACK);
177+
178178
sleep_mini(3000000);
179179

180180
unsigned char out;
@@ -306,4 +306,5 @@ void keyboard_init() {
306306
PANIC(out, "scan failed");
307307
}
308308
keyboard_scanner_init();
309+
set_color_fgbg(original_colors);
309310
}

0 commit comments

Comments
 (0)