simple scroll
This commit is contained in:
parent
4bd7c1e46d
commit
1e07c4cff6
@ -121,6 +121,9 @@
|
|||||||
#define PAD_MID PAD_5 /* Middle key */
|
#define PAD_MID PAD_5 /* Middle key */
|
||||||
#define PAD_DEL PAD_DOT /* Del */
|
#define PAD_DEL PAD_DOT /* Del */
|
||||||
#endif
|
#endif
|
||||||
|
#define MOUSESCR_UP 0x1
|
||||||
|
#define MOUSESCR_DOWN 0x2
|
||||||
|
|
||||||
#define PS2_PORT_DATA (0x60)
|
#define PS2_PORT_DATA (0x60)
|
||||||
#define PS2_PORT_CMD (0x64)
|
#define PS2_PORT_CMD (0x64)
|
||||||
|
|
||||||
@ -155,6 +158,16 @@ typedef struct mouse_inbuf{
|
|||||||
u8 buf[MOUSE_IN_BYTES];
|
u8 buf[MOUSE_IN_BYTES];
|
||||||
}MOUSE_INPUT;
|
}MOUSE_INPUT;
|
||||||
|
|
||||||
|
typedef struct MouseState
|
||||||
|
{
|
||||||
|
u8 mouse_lb;
|
||||||
|
u8 mouse_mb;
|
||||||
|
u8 mouse_rb;
|
||||||
|
signed char mouse_scroll;
|
||||||
|
int mouse_x;
|
||||||
|
int mouse_y;
|
||||||
|
} MouseState;
|
||||||
|
|
||||||
#endif /* _ORANGES_KEYBOARD_H_ */
|
#endif /* _ORANGES_KEYBOARD_H_ */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -545,6 +545,19 @@ const static struct scanmap scanmap_escaped[KBD_SCAN_CODES] = {
|
|||||||
#define ALT 0x0800 /* Alternate key */
|
#define ALT 0x0800 /* Alternate key */
|
||||||
#define HASNUM 0x4000 /* Num Lock has effect */
|
#define HASNUM 0x4000 /* Num Lock has effect */
|
||||||
#define HASCAPS 0x8000 /* Caps Lock has effect */
|
#define HASCAPS 0x8000 /* Caps Lock has effect */
|
||||||
|
#define ISMOUSE 0x80000000
|
||||||
|
#define MOUSEBTN 0x40000000
|
||||||
|
#define MOUSEBTN_RELEASE 0x00
|
||||||
|
#define MOUSEBTN_CLICK 0x80
|
||||||
|
#define MOUSEBTN_L 0x1
|
||||||
|
#define MOUSEBTN_R 0x2
|
||||||
|
#define MOUSEBTN_M 0x4
|
||||||
|
#define MOUSEPOS 0x20000000
|
||||||
|
#define MOUSEPOS_XY 0x00000200
|
||||||
|
#define MOUSEPOS_NEG 0x00000100
|
||||||
|
#define MOUSESCR 0x10000000
|
||||||
|
#define MOUSESCR_UP 0x1
|
||||||
|
#define MOUSESCR_DOWN 0x2
|
||||||
|
|
||||||
/* The left and right versions for the actual keys in the keymap. */
|
/* The left and right versions for the actual keys in the keymap. */
|
||||||
#define LCTRL CTRLKEY
|
#define LCTRL CTRLKEY
|
||||||
|
|||||||
@ -48,20 +48,10 @@ typedef struct s_tty
|
|||||||
struct s_console *console;
|
struct s_console *console;
|
||||||
} TTY;
|
} TTY;
|
||||||
|
|
||||||
typedef struct MouseState
|
|
||||||
{
|
|
||||||
u8 mouse_lb;
|
|
||||||
u8 mouse_mb;
|
|
||||||
u8 mouse_rb;
|
|
||||||
signed char mouse_scroll;
|
|
||||||
int mouse_x;
|
|
||||||
int mouse_y;
|
|
||||||
} MouseState;
|
|
||||||
|
|
||||||
typedef struct n_tty
|
typedef struct n_tty
|
||||||
{
|
{
|
||||||
int driver_type; // 1-vga&kbd; 2-serial
|
int driver_type; // 1-vga&kbd; 2-serial
|
||||||
MouseState mouse;
|
|
||||||
void *input_buf;
|
void *input_buf;
|
||||||
void *output_buf;
|
void *output_buf;
|
||||||
} NTTY;
|
} NTTY;
|
||||||
@ -112,11 +102,13 @@ void vga_tty_init(NTTY* tty);
|
|||||||
void vga_tty_write(NTTY* tty, char ch);
|
void vga_tty_write(NTTY* tty, char ch);
|
||||||
void vga_tty_flush(NTTY* tty);
|
void vga_tty_flush(NTTY* tty);
|
||||||
void vga_tty_backspace(NTTY* tty);
|
void vga_tty_backspace(NTTY* tty);
|
||||||
|
void vga_tty_scroll(NTTY *tty, int direction);
|
||||||
|
|
||||||
void ps2_tty_init(NTTY* tty);
|
void ps2_tty_init(NTTY* tty);
|
||||||
int ps2_tty_read(NTTY* tty, u8* buf, int nr);
|
int ps2_tty_read(NTTY* tty, char* buf, int nr);
|
||||||
|
|
||||||
|
|
||||||
#define CYCLE_SUB(head, tail, _max) ((head) < (tail) ? (tail)-(head) : (tail) + (_max) - (head))
|
#define CYCLE_SUB(head, tail, _max) ((head) <= (tail) ? (tail)-(head) : (tail) + (_max) - (head))
|
||||||
#define NEXT(x, _max) (((x) + 1) % (_max))
|
#define NEXT(x, _max) (((x) + 1) % (_max))
|
||||||
#define LAST(x, _max) (((x) - 1) >= 0 ? ((x) - 1) % (_max) : (_max) - 1)
|
#define LAST(x, _max) (((x) - 1) >= 0 ? ((x) - 1) % (_max) : (_max) - 1)
|
||||||
#define DEBUGNEW
|
#define DEBUGNEW
|
||||||
|
|||||||
@ -9,6 +9,7 @@
|
|||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
// #include "keymap.h"
|
// #include "keymap.h"
|
||||||
|
#include "spinlock.h"
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
@ -29,13 +30,13 @@ static int ctrl_r; /* l ctrl state */
|
|||||||
static int caps_lock; /* Caps Lock */
|
static int caps_lock; /* Caps Lock */
|
||||||
static int num_lock; /* Num Lock */
|
static int num_lock; /* Num Lock */
|
||||||
static int scroll_lock; /* Scroll Lock */
|
static int scroll_lock; /* Scroll Lock */
|
||||||
static int column;
|
static MouseState mouse_state;
|
||||||
|
|
||||||
static u8 get_byte_from_kb_buf();
|
static u8 get_byte_from_kb_buf();
|
||||||
static void set_leds();
|
static void set_leds();
|
||||||
static void set_mouse_leds();
|
static void set_mouse_leds();
|
||||||
static void kb_wait();
|
static void kb_wait();
|
||||||
static void ps2_push(NTTY* tty, u16 key);
|
static void ps2_push(NTTY* tty, u32 key);
|
||||||
static void kbd_process(unsigned char scode);
|
static void kbd_process(unsigned char scode);
|
||||||
|
|
||||||
// static void kb_ack();
|
// static void kb_ack();
|
||||||
@ -89,6 +90,7 @@ void kb_handler(int irq){
|
|||||||
u8 scan_code = inb(PS2_PORT_DATA);
|
u8 scan_code = inb(PS2_PORT_DATA);
|
||||||
#ifdef DEBUGNEW
|
#ifdef DEBUGNEW
|
||||||
kbd_process(scan_code);
|
kbd_process(scan_code);
|
||||||
|
// kprintf("shit");
|
||||||
#else
|
#else
|
||||||
if(kb_in.count < KB_IN_BYTES){
|
if(kb_in.count < KB_IN_BYTES){
|
||||||
*(kb_in.p_head) = scan_code;
|
*(kb_in.p_head) = scan_code;
|
||||||
@ -101,50 +103,49 @@ void kb_handler(int irq){
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TTY_FIRST (tty_table)
|
|
||||||
#define TTY_END (tty_table+NR_CONSOLES)
|
|
||||||
|
|
||||||
void mouse_handler(int irq){
|
void mouse_handler(int irq){
|
||||||
u8 scan_code = inb(PS2_PORT_DATA);
|
u8 scan_code = inb(PS2_PORT_DATA);
|
||||||
|
static int aux_state = 0;
|
||||||
mouse_in.buf[mouse_in.count]=scan_code;
|
int i;
|
||||||
if ((mouse_in.buf[0] & 0xc8) == 0x08)
|
u32 pack;
|
||||||
mouse_in.count++; // simple trick to sync mouse data
|
if (mouse_in.count == 0 && !(scan_code & 0x08))
|
||||||
if(mouse_in.count==4){
|
return; // resync
|
||||||
// printf("0x%02x 0x%02x 0x%02x 0x%02x\n", mouse_in.buf[0], mouse_in.buf[1], mouse_in.buf[2], mouse_in.buf[3]);
|
mouse_in.buf[mouse_in.count++] = scan_code;
|
||||||
TTY* p_tty;
|
if (mouse_in.count < 4) return;
|
||||||
for (p_tty = TTY_FIRST; p_tty < TTY_END; p_tty++) {
|
|
||||||
if(p_tty->console==&console_table[current_console]){
|
|
||||||
p_tty->mouse_left_button = mouse_in.buf[0]&0x01;
|
|
||||||
|
|
||||||
u8 mid_button = mouse_in.buf[0]&0b100;
|
|
||||||
if(mid_button==0b100){
|
|
||||||
p_tty->mouse_mid_button = 1;
|
|
||||||
}else{
|
|
||||||
p_tty->mouse_mid_button = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(p_tty->mouse_left_button){
|
|
||||||
u8 dir_Y = mouse_in.buf[0]&0x20;
|
|
||||||
u8 dir_X = mouse_in.buf[0]&0x10;
|
|
||||||
if(dir_Y==0x20){//down
|
|
||||||
p_tty->mouse_Y -= 1;
|
|
||||||
}else{//up
|
|
||||||
p_tty->mouse_Y += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(dir_X==0x10){//left
|
|
||||||
p_tty->mouse_X -= 1;
|
|
||||||
}else{//right
|
|
||||||
p_tty->mouse_X += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mouse_in.count = 0;
|
mouse_in.count = 0;
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
pack = ISMOUSE | MOUSEBTN;
|
||||||
|
if ((aux_state ^ mouse_in.buf[0]) & (1 << i)) {
|
||||||
|
aux_state ^= (1 << i);
|
||||||
|
pack |= !!(aux_state & (1 << i)) ? MOUSEBTN_CLICK : MOUSEBTN_RELEASE;
|
||||||
|
pack |= (1 << i);
|
||||||
|
ps2_push(&ntty_table[cur_ntty], pack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pack = ISMOUSE | MOUSESCR;
|
||||||
|
if ((signed char)mouse_in.buf[3] > 0) {
|
||||||
|
// actually it is 0x1
|
||||||
|
pack |= MOUSESCR_DOWN;
|
||||||
|
ps2_push(&ntty_table[cur_ntty], pack);
|
||||||
|
} else if ((signed char)mouse_in.buf[3] < 0) {
|
||||||
|
// actually it is 0xff
|
||||||
|
pack |= MOUSESCR_UP;
|
||||||
|
ps2_push(&ntty_table[cur_ntty], pack);
|
||||||
|
}
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
pack = mouse_in.buf[1 + i];
|
||||||
|
if (pack != 0) {
|
||||||
|
pack |= ISMOUSE | MOUSEPOS;
|
||||||
|
if (mouse_in.buf[0] & (0x10 << i))
|
||||||
|
pack |= MOUSEPOS_NEG;
|
||||||
|
if (i == 1) pack |= MOUSEPOS_XY;
|
||||||
|
ps2_push(&ntty_table[cur_ntty], pack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// kprintf("0x%02x 0x%02x 0x%02x 0x%02x\n", mouse_in.buf[0], mouse_in.buf[1], mouse_in.buf[2], mouse_in.buf[3]);
|
||||||
|
}
|
||||||
|
|
||||||
void init_mouse(){
|
void init_mouse(){
|
||||||
mouse_in.count = 0;
|
mouse_in.count = 0;
|
||||||
@ -182,12 +183,10 @@ void init_kb(){
|
|||||||
shift_l = shift_r = 0;
|
shift_l = shift_r = 0;
|
||||||
alt_l = alt_r = 0;
|
alt_l = alt_r = 0;
|
||||||
ctrl_l = ctrl_r = 0;
|
ctrl_l = ctrl_r = 0;
|
||||||
|
|
||||||
caps_lock = 0;
|
caps_lock = 0;
|
||||||
num_lock = 1;
|
num_lock = 1;
|
||||||
scroll_lock = 0;
|
scroll_lock = 0;
|
||||||
|
|
||||||
column = 0;
|
|
||||||
|
|
||||||
set_leds();
|
set_leds();
|
||||||
put_irq_handler(KEYBOARD_IRQ, kb_handler);
|
put_irq_handler(KEYBOARD_IRQ, kb_handler);
|
||||||
@ -198,6 +197,7 @@ void init_kb(){
|
|||||||
|
|
||||||
}
|
}
|
||||||
#ifndef DEBUGNEW
|
#ifndef DEBUGNEW
|
||||||
|
static int column;
|
||||||
void keyboard_read(TTY* p_tty)
|
void keyboard_read(TTY* p_tty)
|
||||||
{
|
{
|
||||||
u8 scan_code;
|
u8 scan_code;
|
||||||
@ -591,6 +591,7 @@ static void set_mouse_leds(){
|
|||||||
outb(KB_DATA, KBC_MODE);
|
outb(KB_DATA, KBC_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct spinlock buflock;
|
||||||
|
|
||||||
#define LASTKEY(x) LAST(x, TTY_IN_BYTES)
|
#define LASTKEY(x) LAST(x, TTY_IN_BYTES)
|
||||||
#define NEXTKEY(x) NEXT(x, TTY_IN_BYTES)
|
#define NEXTKEY(x) NEXT(x, TTY_IN_BYTES)
|
||||||
@ -604,29 +605,63 @@ void ps2_tty_init(NTTY* tty) {
|
|||||||
kbd->buf = (void*)keybuf[_cnt ++];
|
kbd->buf = (void*)keybuf[_cnt ++];
|
||||||
kbd->head = kbd->tail = kbd->readable = 0;
|
kbd->head = kbd->tail = kbd->readable = 0;
|
||||||
kbd->len = 0;
|
kbd->len = 0;
|
||||||
|
buflock.locked = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ps2_tty_read(NTTY* tty, u8* buf, int nr) {
|
int ps2_tty_read(NTTY* tty, char* buf, int nr) {
|
||||||
|
assert(tty->input_buf);
|
||||||
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
||||||
|
assert(kbd->buf);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (kbd->readable == 0);
|
while(1) {
|
||||||
|
if (kbd->readable) {
|
||||||
|
disable_int();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u8* ibuf = kbd->buf;
|
||||||
for (; i < nr && i < kbd->readable; ++ i) {
|
for (; i < nr && i < kbd->readable; ++ i) {
|
||||||
buf[i] = ((int*)kbd->buf)[kbd->head];
|
*(buf+i) = *(ibuf+kbd->head);
|
||||||
|
// kprintf("read %p\n", ibuf+kbd->head);
|
||||||
kbd->head = NEXTKEY(kbd->head);
|
kbd->head = NEXTKEY(kbd->head);
|
||||||
}
|
}
|
||||||
kbd->readable -= i;
|
kbd->readable -= i;
|
||||||
kbd->len -= i;
|
kbd->len -= i;
|
||||||
|
enable_int();
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ps2_tty_flush(NTTY* tty) {
|
void ps2_tty_flush(NTTY* tty) {
|
||||||
|
disable_int();
|
||||||
|
assert(tty->input_buf);
|
||||||
|
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
||||||
|
kbd->head = kbd->tail = kbd->len = kbd->readable = 0;
|
||||||
|
enable_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ps2_push(NTTY* tty, u16 key) {
|
static void ps2_push(NTTY* tty, u32 key) {
|
||||||
// kprintf("%x\n", key);
|
// kprintf("%x\n", key);
|
||||||
|
disable_int();
|
||||||
|
assert(tty->input_buf);
|
||||||
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
||||||
if (key & EXT) {
|
if (key & ISMOUSE) {
|
||||||
|
if (key & MOUSESCR) {
|
||||||
|
if (key & MOUSESCR_UP) {
|
||||||
|
// kprintf("scroll up\n");
|
||||||
|
vga_tty_scroll(tty, MOUSESCR_UP);
|
||||||
|
} else {
|
||||||
|
// kprintf("scroll down\n");
|
||||||
|
vga_tty_scroll(tty, MOUSESCR_DOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key & MOUSEBTN) {
|
||||||
|
if ((key & MOUSEBTN_CLICK) && (key & MOUSEBTN_M)) {
|
||||||
|
kprintf("middle btn click %x\n", key);
|
||||||
|
vga_tty_scroll(tty, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key & EXT) {
|
||||||
switch (key)
|
switch (key)
|
||||||
{
|
{
|
||||||
case F1: case F2: case F3: case F4: case F5: case F6:
|
case F1: case F2: case F3: case F4: case F5: case F6:
|
||||||
@ -643,10 +678,11 @@ static void ps2_push(NTTY* tty, u16 key) {
|
|||||||
{
|
{
|
||||||
case '\r': case '\n': // escape ENTER
|
case '\r': case '\n': // escape ENTER
|
||||||
vga_tty_write(tty, '\n');
|
vga_tty_write(tty, '\n');
|
||||||
((int*)kbd->buf)[kbd->tail] = '\n';
|
((u8*)kbd->buf)[kbd->tail] = '\n';
|
||||||
kbd->len ++;
|
kbd->len ++;
|
||||||
kbd->tail = NEXTKEY(kbd->tail);
|
kbd->tail = NEXTKEY(kbd->tail);
|
||||||
kbd->readable = CYCLE_SUB(kbd->head, kbd->tail, TTY_IN_BYTES);
|
kbd->readable = CYCLE_SUB(kbd->head, kbd->tail, TTY_IN_BYTES);
|
||||||
|
// kprintf("len=%d, h=%d, t=%d, rd=%d\n", kbd->len, kbd->head, kbd->tail, kbd->readable);
|
||||||
break;
|
break;
|
||||||
case '\b':
|
case '\b':
|
||||||
if (kbd->len > kbd->readable) {
|
if (kbd->len > kbd->readable) {
|
||||||
@ -660,12 +696,15 @@ static void ps2_push(NTTY* tty, u16 key) {
|
|||||||
if ((key & 0xff) == 0) return;
|
if ((key & 0xff) == 0) return;
|
||||||
if (kbd->len == TTY_IN_BYTES - 1) return; // leave one space for ctrl ascii
|
if (kbd->len == TTY_IN_BYTES - 1) return; // leave one space for ctrl ascii
|
||||||
vga_tty_write(tty, key);
|
vga_tty_write(tty, key);
|
||||||
((int*)kbd->buf)[kbd->tail] = key & 0xff;
|
((u8*)kbd->buf)[kbd->tail] = key & 0xff;
|
||||||
kbd->len ++;
|
kbd->len ++;
|
||||||
kbd->tail = NEXTKEY(kbd->tail);
|
kbd->tail = NEXTKEY(kbd->tail);
|
||||||
|
// kprintf("len=%d, h=%d, t=%d, rd=%d\n", kbd->len, kbd->head, kbd->tail, kbd->readable);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
vga_tty_flush(tty);
|
||||||
}
|
}
|
||||||
|
enable_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: 1. 修改键盘驱动 2. 添加测试代码 3. 添加鼠标并调试滚动
|
//TODO: 1. 修改键盘驱动 2. 添加测试代码 3. 添加鼠标并调试滚动
|
||||||
@ -127,7 +127,7 @@ void initial()
|
|||||||
do_vclose(stdout);
|
do_vclose(stdout);
|
||||||
do_vclose(stderr);
|
do_vclose(stderr);
|
||||||
|
|
||||||
exec("orange/shell_0.bin");
|
exec("orange/test.bin");
|
||||||
|
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
@ -124,7 +124,7 @@ void task_tty()
|
|||||||
// }
|
// }
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
vga_tty_flush(&ntty_table[cur_ntty]);
|
// vga_tty_flush(&ntty_table[cur_ntty]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -305,7 +305,7 @@ void tty_write(TTY *tty, char *buf, int len)
|
|||||||
{
|
{
|
||||||
vga_tty_write(&ntty_table[cur_ntty], *buf++);
|
vga_tty_write(&ntty_table[cur_ntty], *buf++);
|
||||||
}
|
}
|
||||||
// vga_tty_flush(&ntty_table[cur_ntty]);
|
vga_tty_flush(&ntty_table[cur_ntty]);
|
||||||
#else
|
#else
|
||||||
while (--len >= 0)
|
while (--len >= 0)
|
||||||
out_char(tty->console, *buf++);
|
out_char(tty->console, *buf++);
|
||||||
@ -321,7 +321,7 @@ void tty_write(TTY *tty, char *buf, int len)
|
|||||||
int tty_read(TTY *tty, char *buf, int len)
|
int tty_read(TTY *tty, char *buf, int len)
|
||||||
{
|
{
|
||||||
#ifdef DEBUGNEW
|
#ifdef DEBUGNEW
|
||||||
return ps2_tty_read(&ntty_table[cur_ntty], (u8*)buf, len);
|
return ps2_tty_read(&ntty_table[cur_ntty], buf, len);
|
||||||
#else
|
#else
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if (!tty->ibuf_read_cnt)
|
if (!tty->ibuf_read_cnt)
|
||||||
|
|||||||
82
kernel/vga.c
82
kernel/vga.c
@ -142,30 +142,30 @@ void vga_tty_init(NTTY* tty) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define INDEX(row, col) ((row) * SCR_WIDTH + (col))
|
#define INDEX(row, col) ((row) * SCR_WIDTH + (col))
|
||||||
#define NEXTLINE(row) (((row) + 1) % SCR_MAXLINE)
|
#define NEXTLINE(row) NEXT(row, SCR_MAXLINE)
|
||||||
#define LASTLINE(row) (((row)-1) >= 0 ? ((row)-1) % SCR_MAXLINE : SCR_MAXLINE)
|
#define LASTLINE(row) LAST(row, SCR_MAXLINE)
|
||||||
|
|
||||||
static void newline(vga_buf *vgabuf)
|
static void newline(vga_buf* vga) {
|
||||||
{
|
u16* buf = vga->buf;
|
||||||
vgabuf->cur_col = 0;
|
vga->cur_col = 0;
|
||||||
// kprintf("bf %x\n", vgabuf->scr_cur_line);
|
// kprintf("bf %x\n", vgabuf->scr_cur_line);
|
||||||
vgabuf->scr_cur_line = NEXTLINE(vgabuf->scr_cur_line);
|
vga->scr_cur_line = NEXTLINE(vga->scr_cur_line);
|
||||||
// kprintf("af %x\n", vgabuf->scr_cur_line);
|
// kprintf("af %x\n", vgabuf->scr_cur_line);
|
||||||
vgabuf->cur_row = abs(vgabuf->scr_cur_line - vgabuf->scr_top_line);
|
vga->cur_row = CYCLE_SUB(vga->scr_top_line, vga->scr_cur_line, SCR_MAXLINE);
|
||||||
if (vgabuf->cur_row == SCR_HEIGHT)
|
if (vga->cur_row == SCR_HEIGHT) {
|
||||||
{
|
|
||||||
// auto scroll
|
// auto scroll
|
||||||
vgabuf->scr_top_line = NEXTLINE(vgabuf->scr_top_line);
|
vga->scr_top_line = NEXTLINE(vga->scr_top_line);
|
||||||
if (vgabuf->scr_cur_line == vgabuf->head_line)
|
}
|
||||||
{
|
if(vga->scr_cur_line == vga->head_line) {
|
||||||
vgabuf->head_line = NEXTLINE(vgabuf->head_line);
|
vga->head_line = NEXTLINE(vga->head_line);
|
||||||
// remember to fill blank the old line
|
// remember to fill blank the old line
|
||||||
u32 *ptr_buf = (u32 *)(vgabuf->buf + sizeof(u16) * vgabuf->head_line * SCR_WIDTH);
|
u32* ptr_buf = (u32*) (vga->buf + sizeof(u16) * vga->scr_cur_line * SCR_WIDTH);
|
||||||
for (int i = 0; i < SCR_WIDTH * sizeof(u16) / sizeof(u32); ++i)
|
for (int i = 0; i < SCR_WIDTH * sizeof(u16) / sizeof(u32); ++i) {
|
||||||
{
|
|
||||||
*ptr_buf++ = (BLANK << 16) | BLANK; // bg-black, fg-white, ascii-space
|
*ptr_buf++ = (BLANK << 16) | BLANK; // bg-black, fg-white, ascii-space
|
||||||
}
|
}
|
||||||
}
|
// for (int i = 0; i < SCR_WIDTH; ++ i) {
|
||||||
|
// buf[INDEX(vga->scr_cur_line, i)] = BLANK;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,23 +464,24 @@ void vga_tty_flush(NTTY* tty) {
|
|||||||
u16* buf = vga->buf;
|
u16* buf = vga->buf;
|
||||||
int i, cur_line;
|
int i, cur_line;
|
||||||
vga_set_cursor(INDEX(vga->cur_row, vga->cur_col));
|
vga_set_cursor(INDEX(vga->cur_row, vga->cur_col));
|
||||||
if (vga->cur_row == SCR_WIDTH - 1)
|
// if (vga->cur_row == SCR_HEIGHT - 1)
|
||||||
{
|
// {
|
||||||
vga_flush_screen(&buf[INDEX(vga->scr_top_line, 0)]);
|
// vga_flush_screen(&buf[INDEX(vga->scr_top_line, 0)]);
|
||||||
}
|
|
||||||
else
|
// }
|
||||||
{
|
// else
|
||||||
|
// {
|
||||||
cur_line = vga->scr_top_line;
|
cur_line = vga->scr_top_line;
|
||||||
for (i = 0; i <= vga->cur_row; ++i)
|
for (i = 0; i <= vga->cur_row; ++i)
|
||||||
{
|
{
|
||||||
vga_flush_line(&buf[INDEX(cur_line, 0)], i);
|
vga_flush_line(&buf[INDEX(cur_line, 0)], i);
|
||||||
cur_line = NEXTLINE(cur_line);
|
cur_line = NEXTLINE(cur_line);
|
||||||
}
|
}
|
||||||
for (; i < SCR_WIDTH; ++i)
|
for (; i < SCR_HEIGHT; ++i)
|
||||||
{
|
{
|
||||||
vga_flush_blankline(i);
|
vga_flush_blankline(i);
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
// kprintf("flush: row=%d, top=%d, cur=%d\n", vga->cur_row, vga->scr_top_line, vga->scr_cur_line);
|
// kprintf("flush: row=%d, top=%d, cur=%d\n", vga->cur_row, vga->scr_top_line, vga->scr_cur_line);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -488,42 +489,37 @@ void vga_tty_scroll(NTTY *tty, int direction)
|
|||||||
{
|
{
|
||||||
vga_buf *vga = tty->output_buf;
|
vga_buf *vga = tty->output_buf;
|
||||||
u16 *buf = vga->buf;
|
u16 *buf = vga->buf;
|
||||||
if (direction > 0)
|
if (direction == MOUSESCR_DOWN)
|
||||||
{
|
{
|
||||||
// down
|
// down
|
||||||
if (vga->scr_top_line == vga->scr_cur_line)
|
if (vga->scr_top_line == vga->scr_cur_line)
|
||||||
return;
|
return;
|
||||||
vga->scr_top_line = NEXTLINE(vga->scr_top_line);
|
vga->scr_top_line = NEXTLINE(vga->scr_top_line);
|
||||||
}
|
}
|
||||||
else
|
else if (direction == MOUSESCR_UP)
|
||||||
{
|
{
|
||||||
if (vga->scr_top_line == vga->head_line)
|
if (vga->scr_top_line == vga->head_line)
|
||||||
return;
|
return;
|
||||||
vga->scr_top_line = LASTLINE(vga->scr_top_line);
|
vga->scr_top_line = LASTLINE(vga->scr_top_line);
|
||||||
}
|
}
|
||||||
vga->cur_row = abs(vga->scr_cur_line - vga->scr_top_line);
|
else {
|
||||||
|
if (CYCLE_SUB(vga->scr_top_line, vga->scr_cur_line, SCR_MAXLINE) >= SCR_HEIGHT) {
|
||||||
|
|
||||||
|
vga->scr_top_line = CYCLE_SUB(SCR_HEIGHT / 2, vga->scr_cur_line, SCR_MAXLINE);
|
||||||
|
}
|
||||||
|
// kprintf("scroll to cur top-%d, cur-%d\n", vga->scr_top_line, vga->scr_cur_line);
|
||||||
|
}
|
||||||
|
vga->cur_row = CYCLE_SUB(vga->scr_top_line, vga->scr_cur_line, SCR_MAXLINE);
|
||||||
if (vga->cur_row >= SCR_HEIGHT)
|
if (vga->cur_row >= SCR_HEIGHT)
|
||||||
{
|
{
|
||||||
vga_disable_cursor();
|
vga_disable_cursor();
|
||||||
|
// kprintf("disable cursor: %d\n", vga->cur_row);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vga_enable_cursor(0, 15);
|
vga_enable_cursor(14, 15);
|
||||||
}
|
}
|
||||||
}
|
vga_tty_flush(tty);
|
||||||
|
|
||||||
void vga_scroll_to_cur(NTTY *tty)
|
|
||||||
{
|
|
||||||
vga_buf *vga = tty->output_buf;
|
|
||||||
u16 *buf = vga->buf;
|
|
||||||
// vga->scr_top_line = vga->scr_cur_line
|
|
||||||
}
|
|
||||||
|
|
||||||
void vga_ttroll_to_cur(NTTY *tty)
|
|
||||||
{
|
|
||||||
vga_buf *vga = tty->output_buf;
|
|
||||||
u16 *buf = vga->buf;
|
|
||||||
// vga->scr_top_line = vga->scr_cur_line
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vga_tty_select(NTTY *tty)
|
void vga_tty_select(NTTY *tty)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user