重新调整FIFO缓冲区(2)

This commit is contained in:
Yourtion
2016-04-20 13:57:29 +08:00
parent d17af6a0f3
commit 90ad25656d
6 changed files with 93 additions and 94 deletions

View File

@@ -9,8 +9,9 @@ void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b, char *s, i
void HariMain(void)
{
struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
struct FIFO8 timerfifo, timerfifo2, timerfifo3;
char s[40], keybuf[32], mousebuf[128], timerbuf[8], timerbuf2[8], timerbuf3[8];
struct FIFO32 fifo;
char s[40];
int fifobuf[128];
struct TIMER *timer, *timer2, *timer3;
int mx, my, i;
unsigned int memtotal;
@@ -23,25 +24,23 @@ void HariMain(void)
init_gdtidt();
init_pic();
io_sti(); /* IDT/PIC的初始化已经完成于是开放CPU的中断 */
fifo8_init(&keyfifo, 32, keybuf);
fifo8_init(&mousefifo, 128, mousebuf);
init_pit();
io_out8(PIC0_IMR, 0xf8); /* PIT和PIC1和键盘设置为许可(11111000) */
fifo32_init(&fifo, 128, fifobuf);
init_keyboard(&fifo, 256);
enable_mouse(&fifo, 512, &mdec);
io_out8(PIC0_IMR, 0xf8); /* 设定PIT和PIC1以及键盘为许可(11111000) */
io_out8(PIC1_IMR, 0xef); /* 开放鼠标中断(11101111) */
init_pit();
fifo8_init(&timerfifo, 8, timerbuf);
timer = timer_alloc();
timer_init(timer, &timerfifo, 10);
timer_settime(timer, 1000);
timer2 = timer_alloc();
timer_init(timer2, &timerfifo, 3);
timer_settime(timer2, 300);
timer3 = timer_alloc();
timer_init(timer3, &timerfifo, 1);
timer_settime(timer3, 50);
timer = timer_alloc();
timer_init(timer, &fifo, 10);
timer_settime(timer, 1000);
timer2 = timer_alloc();
timer_init(timer2, &fifo, 3);
timer_settime(timer2, 300);
timer3 = timer_alloc();
timer_init(timer3, &fifo, 1);
timer_settime(timer3, 50);
init_keyboard();
enable_mouse(&mdec);
memtotal = memtest(0x00400000, 0xbfffffff);
memman_init(memman);
memman_free(memman, 0x00001000, 0x0009e000); /* 0x00001000 - 0x0009efff */
@@ -79,19 +78,17 @@ void HariMain(void)
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 10);
io_cli();
if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo) == 0) {
if (fifo32_status(&fifo) == 0) {
io_sti();
} else {
if (fifo8_status(&keyfifo) != 0) {
i = fifo8_get(&keyfifo);
io_sti();
sprintf(s, "%02X", i);
i = fifo32_get(&fifo);
io_sti();
if (256 <= i && i <= 511) { /* 键盘数据*/
sprintf(s, "%02X", i - 256);
putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2);
} else if (fifo8_status(&mousefifo) != 0) {
i = fifo8_get(&mousefifo);
io_sti();
if (mouse_decode(&mdec, i) != 0) {
/* 3字节都凑齐了所以把它们显示出来*/
} else if (512 <= i && i <= 767) { /* 鼠标数据*/
if (mouse_decode(&mdec, i - 512) != 0) {
/* 已经收集了3字节的数据所以显示出来 */
sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
if ((mdec.btn & 0x01) != 0) {
s[1] = 'L';
@@ -122,25 +119,20 @@ void HariMain(void)
putfonts8_asc_sht(sht_back, 0, 0, COL8_FFFFFF, COL8_008484, s, 10);
sheet_slide(sht_mouse, mx, my);/* 包含sheet_refresh含sheet_refresh */
}
} else if (fifo8_status(&timerfifo) != 0) {
i = fifo8_get(&timerfifo); /*超时的是哪个呢? */
io_sti();
if (i == 10) {
putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
} else if (i == 3) {
putfonts8_asc_sht(sht_back, 0, 80, COL8_FFFFFF, COL8_008484, "3[sec]", 6);
} else {
/* 0还是1 */
if (i != 0) {
timer_init(timer3, &timerfifo, 0); /*下面是设定为0 */
boxfill8(buf_back, binfo->scrnx, COL8_FFFFFF, 8, 96, 15, 111);
} else {
timer_init(timer3, &timerfifo, 1); /*下面是设定为1*/
boxfill8(buf_back, binfo->scrnx, COL8_008484, 8, 96, 15, 111);
}
timer_settime(timer3, 50);
sheet_refresh(sht_back, 8, 96, 16, 112);
}
} else if (i == 10) { /* 10秒定时器 */
putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
} else if (i == 3) { /* 3秒定时器 */
putfonts8_asc_sht(sht_back, 0, 80, COL8_FFFFFF, COL8_008484, "3[sec]", 6);
} else if (i == 1) { /* 光标用定时器*/
timer_init(timer3, &fifo, 0); /* 下面是设定0 */
boxfill8(buf_back, binfo->scrnx, COL8_FFFFFF, 8, 96, 15, 111);
timer_settime(timer3, 50);
sheet_refresh(sht_back, 8, 96, 16, 112);
} else if (i == 0) { /* 光标用定时器 */
timer_init(timer3, &fifo, 1); /* 下面是设定1 */
boxfill8(buf_back, binfo->scrnx, COL8_008484, 8, 96, 15, 111);
timer_settime(timer3, 50);
sheet_refresh(sht_back, 8, 96, 16, 112);
}
}
}

View File

@@ -29,14 +29,14 @@ void asm_inthandler2c(void);
unsigned int memtest_sub(unsigned int start, unsigned int end);
/* fifo.c */
struct FIFO8 {
unsigned char *buf;
struct FIFO32 {
int *buf;
int p, q, size, free, flags;
};
void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf);
int fifo8_put(struct FIFO8 *fifo, unsigned char data);
int fifo8_get(struct FIFO8 *fifo);
int fifo8_status(struct FIFO8 *fifo);
void fifo32_init(struct FIFO32 *fifo, int size, int *buf);
int fifo32_put(struct FIFO32 *fifo, int data);
int fifo32_get(struct FIFO32 *fifo);
int fifo32_status(struct FIFO32 *fifo);
/* graphic.c */
void init_palette(void);
@@ -108,8 +108,7 @@ void inthandler27(int *esp);
/* keyboard.c */
void inthandler21(int *esp);
void wait_KBC_sendready(void);
void init_keyboard(void);
extern struct FIFO8 keyfifo;
void init_keyboard(struct FIFO32 *fifo, int data0);
#define PORT_KEYDAT 0x0060
#define PORT_KEYCMD 0x0064
@@ -119,9 +118,8 @@ struct MOUSE_DEC {
int x, y, btn;
};
void inthandler2c(int *esp);
void enable_mouse(struct MOUSE_DEC *mdec);
void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec);
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat);
extern struct FIFO8 mousefifo;
/* memory.c */
#define MEMMAN_FREES 4090 /* 大约是32KB*/
@@ -172,8 +170,8 @@ void sheet_free(struct SHEET *sht);
#define MAX_TIMER 500
struct TIMER {
unsigned int timeout, flags;
struct FIFO8 *fifo;
unsigned char data;
struct FIFO32 *fifo;
int data;
};
struct TIMERCTL {
unsigned int count, next, using;
@@ -185,7 +183,7 @@ extern struct TIMERCTL timerctl;
void init_pit(void);
struct TIMER *timer_alloc(void);
void timer_free(struct TIMER *timer);
void timer_init(struct TIMER *timer, struct FIFO8 *fifo, unsigned char data);
void timer_init(struct TIMER *timer, struct FIFO32 *fifo, unsigned char data);
void timer_settime(struct TIMER *timer, unsigned int timeout);
void inthandler20(int *esp);

View File

@@ -4,23 +4,23 @@
#define FLAGS_OVERRUN 0x0001
void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
/* 初始化FIFO缓冲区 */
void fifo32_init(struct FIFO32 *fifo, int size, int *buf)
/* FIFO缓冲区的初始化*/
{
fifo->size = size;
fifo->buf = buf;
fifo->free = size; /* 缓冲区大小 */
fifo->free = size; /**/
fifo->flags = 0;
fifo->p = 0; /* 下一个数据写入位置 */
fifo->q = 0; /* 下一个数据读出位置 */
fifo->p = 0; /*写入位置*/
fifo->q = 0; /*读取位置*/
return;
}
int fifo8_put(struct FIFO8 *fifo, unsigned char data)
/*FIFO送数据并保存 */
int fifo32_put(struct FIFO32 *fifo, int data)
/*FIFO送数据并储存在FIFO中*/
{
if (fifo->free == 0) {
/* 没有空间,溢出 */
/*没有空余空间,溢出*/
fifo->flags |= FLAGS_OVERRUN;
return -1;
}
@@ -33,12 +33,12 @@ int fifo8_put(struct FIFO8 *fifo, unsigned char data)
return 0;
}
int fifo8_get(struct FIFO8 *fifo)
/* 从FIFO取得一个数据 */
int fifo32_get(struct FIFO32 *fifo)
/*从FIFO取得一个数据*/
{
int data;
if (fifo->free == fifo->size) {
/* 如果缓冲区为空返回-1 */
/*缓冲区为空的情况下返回-1*/
return -1;
}
data = fifo->buf[fifo->q];
@@ -50,8 +50,8 @@ int fifo8_get(struct FIFO8 *fifo)
return data;
}
int fifo8_status(struct FIFO8 *fifo)
/* 报告一下积攒是数据量 */
int fifo32_status(struct FIFO32 *fifo)
/*报告已经存储了多少数据*/
{
return fifo->size - fifo->free;
}

View File

@@ -2,15 +2,15 @@
#include "bootpack.h"
struct FIFO8 keyfifo;
struct FIFO32 *keyfifo;
int keydata0;
void inthandler21(int *esp) {
/* 来自PS/2键盘的中断 */
struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
unsigned char data, s[4];
io_out8(PIC0_OCW2, 0x61); /* 通知PIC IRQ-01 已经受理完毕 */
void inthandler21(int *esp)
{
int data;
io_out8(PIC0_OCW2, 0x61); /* 把IRQ-01接收信号结束的信息通知给PIC */
data = io_in8(PORT_KEYDAT);
fifo8_put(&keyfifo, data);
fifo32_put(keyfifo, data + keydata0);
return;
}
@@ -19,7 +19,8 @@ void inthandler21(int *esp) {
#define KEYCMD_WRITE_MODE 0x60
#define KBC_MODE 0x47
void wait_KBC_sendready(void) {
void wait_KBC_sendready(void)
{
/* 等待键盘控制电路准备完毕 */
for (;;) {
if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) {
@@ -29,8 +30,12 @@ void wait_KBC_sendready(void) {
return;
}
void init_keyboard(void) {
/* 初始化键盘控制电路 */
void init_keyboard(struct FIFO32 *fifo, int data0)
{
/* 将FIFO缓冲区的信息保存到全局变量里 */
keyfifo = fifo;
keydata0 = data0;
/* 键盘控制器的初始化 */
wait_KBC_sendready();
io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);
wait_KBC_sendready();

View File

@@ -2,32 +2,36 @@
#include "bootpack.h"
struct FIFO8 mousefifo;
struct FIFO32 *mousefifo;
int mousedata0;
void inthandler2c(int *esp)
{
/* 来自PS/2鼠标的中断 */
unsigned char data;
io_out8(PIC1_OCW2, 0x64); /* 通知PIC IRQ-12 已经受理完毕 */
io_out8(PIC0_OCW2, 0x62); /* 通知PIC IRQ-02 已经受理完毕 */
int data;
io_out8(PIC1_OCW2, 0x64); /* 把IRQ-12接收信号结束的信息通知给PIC1 */
io_out8(PIC0_OCW2, 0x62); /* 把IRQ-02接收信号结束的信息通知给PIC0 */
data = io_in8(PORT_KEYDAT);
fifo8_put(&mousefifo, data);
fifo32_put(mousefifo, data + mousedata0);
return;
}
#define KEYCMD_SENDTO_MOUSE 0xd4
#define MOUSECMD_ENABLE 0xf4
void enable_mouse(struct MOUSE_DEC *mdec)
void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec)
{
/* 将FIFO缓冲区的信息保存到全局变量里 */
mousefifo = fifo;
mousedata0 = data0;
/* 鼠标有效 */
wait_KBC_sendready();
io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
wait_KBC_sendready();
io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
/* 顺利的话ACK(0xfa)会被送过来 */
mdec->phase = 0; /* 等待0xfa的阶段 */
return;
/* 顺利的话ACK(0xfa)会被送*/
mdec->phase = 0; /* 等待鼠标的0xfa的阶段*/
return;
}
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)

View File

@@ -43,7 +43,7 @@ void timer_free(struct TIMER *timer)
return;
}
void timer_init(struct TIMER *timer, struct FIFO8 *fifo, unsigned char data)
void timer_init(struct TIMER *timer, struct FIFO32 *fifo, unsigned char data)
{
timer->fifo = fifo;
timer->data = data;
@@ -91,7 +91,7 @@ void inthandler20(int *esp)
}
/* 超时*/
timerctl.timers[i]->flags = TIMER_FLAGS_ALLOC;
fifo8_put(timerctl.timers[i]->fifo, timerctl.timers[i]->data);
fifo32_put(timerctl.timers[i]->fifo, timerctl.timers[i]->data);
}
/* 正好有i个定时器超时了。其余的进行移位。 */
timerctl.using -= i;