implement prover stdin reading

This commit is contained in:
2025-11-18 17:54:24 +03:00
parent ccf954e1d6
commit 68033325d2
7 changed files with 124 additions and 39 deletions
+57 -30
View File
@@ -1,5 +1,11 @@
#include "../include/keyboard.h"
#include <stdbool.h>
#include "../include/task.h"
#include "../include/string.h"
char stdin_buffer[STDIN_BUFFER_SIZE];
int stdin_pos = 0;
bool stdin_has_line = false;
unsigned char kbdus[128] =
{
@@ -87,39 +93,60 @@ bool caps_pressed;
void keyboard_wait();
void handle_keyboard()
{//3a
uint8_t scancode = inb(0x60);
void handle_keyboard() {
uint8_t scancode = inb(0x60);
if(scancode & 0x80)//key released
{
scancode = scancode-0x80;
if(scancode == 0x2a || scancode == 0x36)
shift_pressed = false;
//printf("(%X)%c released ", scancode, kbdus[scancode-0x80]);
}
else//key pressed
{
if(scancode == 0x2a || scancode == 0x36)
{
shift_pressed = true;
return;
}
if (scancode & 0x80) { // Released
scancode -= 0x80;
if (scancode == 0x2A || scancode == 0x36) shift_pressed = false;
} else { // Pressed
if (scancode == 0x2A || scancode == 0x36) {
shift_pressed = true;
return;
}
if (scancode == 0x3A) { // Caps
return;
}
if(scancode == 0x3a)
{
caps_pressed = !caps_pressed;
outb(0x60, 0xed);//set LED command
keyboard_wait();
outb(0x60, caps_pressed << 2);//0 is scroll lock, 1 is numlock, 2 is caps lock
return;
}
char c;
if (shift_pressed || caps_pressed) c = kbdus2[scancode];
else c = kbdus[scancode];
if(shift_pressed || caps_pressed)
printf("%c", kbdus2[scancode]);
else
printf("%c", kbdus[scancode]); //printf("(0x%X)%c", scancode, kbdus[scancode]);
}
if (c == '\b') { //Backspace
if (stdin_pos > 0) {
stdin_pos--;
printf("\b \b");
}
} else if (c == '\n') { // Enter
if (stdin_pos < STDIN_BUFFER_SIZE - 1) {
stdin_buffer[stdin_pos++] = '\n';
printf("\n");
}
stdin_has_line = true;
// Wake-up: wake up all Waiting tasks on STDIN
scheduler_lock();
Process *p = queue;
while (p) {
if (p->state == Waiting && p->waiting_reason == STDIN) {
p->state = Ready;
p->waiting_reason = NONE;
}
p = p->next;
}
scheduler_unlock();
} else if (c != 0 && stdin_pos < STDIN_BUFFER_SIZE - 1) {//if printable
stdin_buffer[stdin_pos++] = c;
printf("%c", c);//echo
}
}
}
void init_keyboard()
{
memset(stdin_buffer, 0, STDIN_BUFFER_SIZE);
stdin_pos = 0;
stdin_has_line = false;
}
void keyboard_wait()