lab4 ok, music
This commit is contained in:
parent
4b58f8019d
commit
acc9cdbf63
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "type.h"
|
#include "type.h"
|
||||||
|
|
||||||
|
#define KEYBOARD_BUF_REG 0x60
|
||||||
void add_keyboard_buf(u8 ch);
|
void add_keyboard_buf(u8 ch);
|
||||||
|
|
||||||
#endif /* MINIOS_KEYBOARD_H */
|
#endif /* MINIOS_KEYBOARD_H */
|
||||||
@ -31,8 +31,11 @@ typedef struct s_proc {
|
|||||||
u32 pid; /* process id passed in from MM */
|
u32 pid; /* process id passed in from MM */
|
||||||
char p_name[16]; /* name of the process */
|
char p_name[16]; /* name of the process */
|
||||||
}PROCESS;
|
}PROCESS;
|
||||||
|
#ifdef HAPPY_SNAKE
|
||||||
|
#define PCB_SIZE 1
|
||||||
|
#else
|
||||||
#define PCB_SIZE 3
|
#define PCB_SIZE 3
|
||||||
|
#endif
|
||||||
/* 指向当前进程pcb的指针 */
|
/* 指向当前进程pcb的指针 */
|
||||||
extern PROCESS *p_proc_ready;
|
extern PROCESS *p_proc_ready;
|
||||||
/* pcb表 */
|
/* pcb表 */
|
||||||
|
|||||||
@ -6,4 +6,10 @@
|
|||||||
void timecounter_inc();
|
void timecounter_inc();
|
||||||
size_t clock();
|
size_t clock();
|
||||||
|
|
||||||
|
void change_8253Counter0(int hertz);
|
||||||
|
#define TIMER0 0x40
|
||||||
|
#define TIMER_MODEREG 0x43
|
||||||
|
#define TIMER_MODE 0x34
|
||||||
|
#define TIMER_FREQ 1193182L
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -72,7 +72,7 @@ void exception_handler(int vec_no, int err_code, int eip,
|
|||||||
/* 外设中断实际处理函数(C接口) */
|
/* 外设中断实际处理函数(C接口) */
|
||||||
void default_interrupt_handler(int irq);
|
void default_interrupt_handler(int irq);
|
||||||
void clock_interrupt_handler(int irq);
|
void clock_interrupt_handler(int irq);
|
||||||
|
void keyboard_interrupt_handler(int irq);
|
||||||
/* 外设中断实际处理函数表 */
|
/* 外设中断实际处理函数表 */
|
||||||
extern void (*irq_table[])(int);
|
extern void (*irq_table[])(int);
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
#ifndef NULL
|
#ifndef NULL
|
||||||
#define NULL ((void*) 0)
|
#define NULL ((void*) 0)
|
||||||
#endif
|
#endif
|
||||||
|
// #define HAPPY_SNAKE
|
||||||
|
|
||||||
typedef _Bool bool;
|
typedef _Bool bool;
|
||||||
enum { false, true };
|
enum { false, true };
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
#include "type.h"
|
#include "type.h"
|
||||||
|
#include "x86.h"
|
||||||
|
|
||||||
#define KB_INBUF_SIZE 4
|
#define KB_INBUF_SIZE 4
|
||||||
|
|
||||||
@ -23,6 +24,14 @@ static KB_INPUT kb_input = {
|
|||||||
void
|
void
|
||||||
add_keyboard_buf(u8 ch)
|
add_keyboard_buf(u8 ch)
|
||||||
{
|
{
|
||||||
|
if (kb_input.count < KB_INBUF_SIZE) {
|
||||||
|
*(kb_input.p_head) = ch;
|
||||||
|
kb_input.p_head ++;
|
||||||
|
if (kb_input.p_head == kb_input.buf + KB_INBUF_SIZE) {
|
||||||
|
kb_input.p_head = kb_input.buf;
|
||||||
|
}
|
||||||
|
kb_input.count ++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -32,5 +41,18 @@ add_keyboard_buf(u8 ch)
|
|||||||
u8
|
u8
|
||||||
getch(void)
|
getch(void)
|
||||||
{
|
{
|
||||||
|
if (kb_input.count == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
else {
|
||||||
|
// disable_int();
|
||||||
|
// in user mode, cli and sti will only cause protection exception
|
||||||
|
u8 val = *(kb_input.p_tail);
|
||||||
|
kb_input.p_tail ++;
|
||||||
|
if (kb_input.p_tail == kb_input.buf + KB_INBUF_SIZE) {
|
||||||
|
kb_input.p_tail = kb_input.buf;
|
||||||
|
}
|
||||||
|
kb_input.count --;
|
||||||
|
// enable_int();
|
||||||
|
return val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
26
kern/main.c
26
kern/main.c
@ -6,6 +6,9 @@
|
|||||||
#include "type.h"
|
#include "type.h"
|
||||||
#include "trap.h"
|
#include "trap.h"
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
|
#include "time.h"
|
||||||
|
#include "keyboard.h"
|
||||||
|
#include "game.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 三个测试函数,用户进程的执行流
|
* 三个测试函数,用户进程的执行流
|
||||||
@ -13,8 +16,12 @@
|
|||||||
void TestA()
|
void TestA()
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
u8 ch;
|
||||||
while(1){
|
while(1){
|
||||||
kprintf("A%d.",i++);
|
if ((ch = getch()) != 255) {
|
||||||
|
kprintf("%c", ch);
|
||||||
|
}
|
||||||
|
// kprintf("A%d.",i++);
|
||||||
for (int j = 0 ; j < 5e7 ; j++)
|
for (int j = 0 ; j < 5e7 ; j++)
|
||||||
;//do nothing
|
;//do nothing
|
||||||
}
|
}
|
||||||
@ -24,7 +31,7 @@ void TestB()
|
|||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(1){
|
while(1){
|
||||||
kprintf("B%d.",i++);
|
// kprintf("B%d.",i++);
|
||||||
for (int j = 0 ; j < 5e7 ; j++)
|
for (int j = 0 ; j < 5e7 ; j++)
|
||||||
;//do nothing
|
;//do nothing
|
||||||
}
|
}
|
||||||
@ -34,7 +41,7 @@ void TestC()
|
|||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(1){
|
while(1){
|
||||||
kprintf("C%d.",i++);
|
// kprintf("C%d.",i++);
|
||||||
for (int j = 0 ; j < 5e7 ; j++)
|
for (int j = 0 ; j < 5e7 ; j++)
|
||||||
;//do nothing
|
;//do nothing
|
||||||
}
|
}
|
||||||
@ -49,6 +56,14 @@ char process_stack[STACK_TOTSIZE];
|
|||||||
PROCESS *p_proc_ready;
|
PROCESS *p_proc_ready;
|
||||||
// pcb表
|
// pcb表
|
||||||
PROCESS proc_table[PCB_SIZE];
|
PROCESS proc_table[PCB_SIZE];
|
||||||
|
#ifdef HAPPY_SNAKE
|
||||||
|
void (*entry[]) = {
|
||||||
|
startGame
|
||||||
|
};
|
||||||
|
char pcb_name[][16] = {
|
||||||
|
"SNAKE"
|
||||||
|
};
|
||||||
|
#else
|
||||||
void (*entry[]) = {
|
void (*entry[]) = {
|
||||||
TestA,
|
TestA,
|
||||||
TestB,
|
TestB,
|
||||||
@ -59,7 +74,7 @@ char pcb_name[][16] = {
|
|||||||
"TestB",
|
"TestB",
|
||||||
"TestC",
|
"TestC",
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* 内核的main函数
|
* 内核的main函数
|
||||||
* 用于初始化用户进程,然后将执行流交给用户进程
|
* 用于初始化用户进程,然后将执行流交给用户进程
|
||||||
@ -94,8 +109,9 @@ void kernel_main()
|
|||||||
|
|
||||||
p_proc_ready = proc_table;
|
p_proc_ready = proc_table;
|
||||||
|
|
||||||
|
change_8253Counter0(1000);
|
||||||
enable_irq(CLOCK_IRQ);
|
enable_irq(CLOCK_IRQ);
|
||||||
|
enable_irq(KEYBOARD_IRQ);
|
||||||
restart();
|
restart();
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
14
kern/time.c
14
kern/time.c
@ -1,5 +1,6 @@
|
|||||||
#include "type.h"
|
#include "type.h"
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
|
#include "x86.h"
|
||||||
|
|
||||||
static size_t timecounter;
|
static size_t timecounter;
|
||||||
|
|
||||||
@ -20,3 +21,16 @@ clock()
|
|||||||
{
|
{
|
||||||
return timecounter;
|
return timecounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
change_8253Counter0(int hertz) {
|
||||||
|
outb(TIMER_MODEREG, TIMER_MODE);
|
||||||
|
outb(TIMER0, (u8)(TIMER_FREQ / hertz));
|
||||||
|
outb(TIMER0, (u8)((TIMER_FREQ / hertz) >> 8));
|
||||||
|
/*
|
||||||
|
8253's counter is 2bytes long
|
||||||
|
port 0x43 be the Mode Control Register
|
||||||
|
Orange book writes 00_11_010_0 into this reg, which means
|
||||||
|
SelectCounter0 | RW low byte first and then high byte | rate generator mode | binary counter
|
||||||
|
*/
|
||||||
|
}
|
||||||
27
kern/trap.c
27
kern/trap.c
@ -4,6 +4,8 @@
|
|||||||
#include "time.h"
|
#include "time.h"
|
||||||
#include "trap.h"
|
#include "trap.h"
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
|
#include "keymap.h"
|
||||||
|
#include "keyboard.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 当前内核需要处理中断的数量
|
* 当前内核需要处理中断的数量
|
||||||
@ -12,7 +14,7 @@ int k_reenter;
|
|||||||
|
|
||||||
void (*irq_table[16])(int) = {
|
void (*irq_table[16])(int) = {
|
||||||
clock_interrupt_handler,
|
clock_interrupt_handler,
|
||||||
default_interrupt_handler,
|
keyboard_interrupt_handler,
|
||||||
default_interrupt_handler,
|
default_interrupt_handler,
|
||||||
default_interrupt_handler,
|
default_interrupt_handler,
|
||||||
default_interrupt_handler,
|
default_interrupt_handler,
|
||||||
@ -101,10 +103,29 @@ exception_handler(int vec_no, int err_code, int eip, int cs, int eflags)
|
|||||||
void
|
void
|
||||||
clock_interrupt_handler(int irq)
|
clock_interrupt_handler(int irq)
|
||||||
{
|
{
|
||||||
kprintf("#");
|
static unsigned int _sched_count = 0;
|
||||||
|
// kprintf("i%d", clock());
|
||||||
timecounter_inc();
|
timecounter_inc();
|
||||||
p_proc_ready++;
|
_sched_count ++;
|
||||||
|
if (p_proc_ready == proc_table) {
|
||||||
|
_sched_count ++;
|
||||||
|
if (_sched_count >= 20) {
|
||||||
|
p_proc_ready ++;
|
||||||
|
_sched_count = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p_proc_ready ++;
|
||||||
|
}
|
||||||
if (p_proc_ready >= proc_table + PCB_SIZE) {
|
if (p_proc_ready >= proc_table + PCB_SIZE) {
|
||||||
p_proc_ready = proc_table;
|
p_proc_ready = proc_table;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void keyboard_interrupt_handler(int irq) {
|
||||||
|
// kprintf("K");
|
||||||
|
u8 scode = inb(KEYBOARD_BUF_REG);
|
||||||
|
if (scode < sizeof(keymap) && keymap[scode] >= 'a' && keymap[scode] <= 'z') {
|
||||||
|
add_keyboard_buf(keymap[scode]); //only keep a-z MAKE CODE
|
||||||
|
// kprintf("%c", keymap[scode]);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user