@@ -7,6 +7,9 @@
void keywin_off ( struct SHEET * key_win ) ;
void keywin_on ( struct SHEET * key_win ) ;
struct SHEET * open_console ( struct SHTCTL * shtctl , unsigned int memtotal ) ;
void close_console ( struct SHEET * sht ) ;
void close_constask ( struct TASK * task ) ;
void HariMain ( void )
{
@@ -20,7 +23,7 @@ void HariMain(void)
struct MOUSE_DEC mdec ;
struct MEMMAN * memman = ( struct MEMMAN * ) MEMMAN_ADDR ;
unsigned char * buf_back , buf_mouse [ 256 ] , * buf_cons [ 2 ] ;
struct SHEET * sht_back , * sht_mouse , * sht_cons [ 2 ] ;
struct SHEET * sht_back , * sht_mouse ;
struct TASK * task_a , * task_cons [ 2 ] , * task ;
static char keytable0 [ 0x80 ] = {
0 , 0 , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' , ' 0 ' , ' - ' , ' ^ ' , 0x08 , 0 ,
@@ -50,6 +53,7 @@ void HariMain(void)
init_pic ( ) ;
io_sti ( ) ; /* IDT/PIC的初始化已经完成, 于是开放CPU的中断 */
fifo32_init ( & fifo , 128 , fifobuf , 0 ) ;
* ( ( int * ) 0x0fec ) = ( int ) & fifo ;
init_pit ( ) ;
init_keyboard ( & fifo , 256 ) ;
enable_mouse ( & fifo , 512 , & mdec ) ;
@@ -76,29 +80,7 @@ void HariMain(void)
init_screen8 ( buf_back , binfo - > scrnx , binfo - > scrny ) ;
/* sht_cons */
for ( i = 0 ; i < 2 ; i + + ) {
sht_cons [ i ] = sheet_alloc ( shtctl ) ;
buf_cons [ i ] = ( unsigned char * ) memman_alloc_4k ( memman , 256 * 165 ) ;
sheet_setbuf ( sht_cons [ i ] , buf_cons [ i ] , 256 , 165 , - 1 ) ; /*没有透明色*/
make_window8 ( buf_cons [ i ] , 256 , 165 , " console " , 0 ) ;
make_textbox8 ( sht_cons [ i ] , 8 , 28 , 240 , 128 , COL8_000000 ) ;
task_cons [ i ] = task_alloc ( ) ;
task_cons [ i ] - > tss . esp = memman_alloc_4k ( memman , 64 * 1024 ) + 64 * 1024 - 12 ;
task_cons [ i ] - > tss . eip = ( int ) & console_task ;
task_cons [ i ] - > tss . es = 1 * 8 ;
task_cons [ i ] - > tss . cs = 2 * 8 ;
task_cons [ i ] - > tss . ss = 1 * 8 ;
task_cons [ i ] - > tss . ds = 1 * 8 ;
task_cons [ i ] - > tss . fs = 1 * 8 ;
task_cons [ i ] - > tss . gs = 1 * 8 ;
* ( ( int * ) ( task_cons [ i ] - > tss . esp + 4 ) ) = ( int ) sht_cons [ i ] ;
* ( ( int * ) ( task_cons [ i ] - > tss . esp + 8 ) ) = memtotal ;
task_run ( task_cons [ i ] , 2 , 2 ) ; /* level=2, priority=2 */
sht_cons [ i ] - > task = task_cons [ i ] ;
sht_cons [ i ] - > flags | = 0x20 ; /*有光标*/
cons_fifo [ i ] = ( int * ) memman_alloc_4k ( memman , 128 * 4 ) ;
fifo32_init ( & task_cons [ i ] - > fifo , 128 , cons_fifo [ i ] , task_cons [ i ] ) ;
}
key_win = open_console ( shtctl , memtotal ) ;
/* sht_mouse */
sht_mouse = sheet_alloc ( shtctl ) ;
@@ -107,15 +89,12 @@ void HariMain(void)
mx = ( binfo - > scrnx - 16 ) / 2 ; /* 计算坐标使其位于画面中央 */
my = ( binfo - > scrny - 28 - 16 ) / 2 ;
sheet_slide ( sht_back , 0 , 0 ) ;
sheet_slide ( sht_cons [ 1 ] , 56 , 6 ) ;
sheet_slide ( sht_cons [ 0 ] , 8 , 2 ) ;
sheet_slide ( sht_back , 0 , 0 ) ;
sheet_slide ( key_win , 32 , 4 ) ;
sheet_slide ( sht_mouse , mx , my ) ;
sheet_updown ( sht_back , 0 ) ;
sheet_updown ( sht_cons [ 1 ] , 1 ) ;
sheet_updown ( sht_cons [ 0 ] , 2 ) ;
sheet_updown ( sht_mouse , 3 ) ;
key_win = sht_cons [ 0 ] ;
sheet_updown ( sht_back , 0 ) ;
sheet_updown ( key_win , 1 ) ;
sheet_updown ( sht_mouse , 2 ) ;
keywin_on ( key_win ) ;
/*为了避免和键盘当前状态冲突,在一开始先进行设置*/
@@ -147,9 +126,13 @@ void HariMain(void)
} else {
i = fifo32_get ( & fifo ) ;
io_sti ( ) ;
if ( key_win - > flags = = 0 ) { /*输入 窗口被关闭*/
key_win = shtctl - > sheets [ shtctl - > top - 1 ] ;
keywin_on ( key_win ) ;
if ( key_win ! = 0 & & key_win - > flags = = 0 ) { /*窗口被关闭*/
if ( shtctl - > top = = 1 ) { /*当画面上只剩鼠标和背景时*/
key_win = 0 ;
} else {
key_win = shtctl - > sheets [ shtctl - > top - 1 ] ;
keywin_on ( key_win ) ;
}
}
if ( 256 < = i & & i < = 511 ) { /* 键盘数据*/
if ( i < 0x80 + 256 ) { /*将按键编码转换为字符编码*/
@@ -167,10 +150,10 @@ void HariMain(void)
s [ 0 ] + = 0x20 ; /*将大写字母转换为小写字母*/
}
}
if ( s [ 0 ] ! = 0 ) { /*一般字符、退格键、回车键*/
if ( s [ 0 ] ! = 0 & & key_win ! = 0 ) { /*一般字符、退格键、回车键*/
fifo32_put ( & key_win - > task - > fifo , s [ 0 ] + 256 ) ;
}
if ( i = = 256 + 0x0f ) { /* Tab键 */
if ( i = = 256 + 0x0f & & key_win ! = 0 ) { /* Tab键 */
keywin_off ( key_win ) ;
j = key_win - > height - 1 ;
if ( j = = 0 ) {
@@ -206,7 +189,7 @@ void HariMain(void)
fifo32_put ( & keycmd , KEYCMD_LED ) ;
fifo32_put ( & keycmd , key_leds ) ;
}
if ( i = = 256 + 0x3b & & key_shift ! = 0 ) {
if ( i = = 256 + 0x3b & & key_shift ! = 0 & & key_win ! = 0 ) {
task = key_win - > task ;
if ( task ! = 0 & & task - > tss . ss0 ! = 0 ) { /* Shift+F1 */
cons_putstr0 ( task - > cons , " \n Break(key) : \n " ) ;
@@ -216,6 +199,15 @@ void HariMain(void)
io_sti ( ) ;
}
}
if ( i = = 256 + 0x3c & & key_shift ! = 0 ) { /* Shift+F2 */
if ( key_win ! = 0 ) {
keywin_off ( key_win ) ;
}
key_win = open_console ( shtctl , memtotal ) ;
sheet_slide ( key_win , 32 , 4 ) ;
sheet_updown ( key_win , shtctl - > top ) ;
keywin_on ( key_win ) ;
}
if ( i = = 256 + 0x57 ) { /* F11 */
sheet_updown ( shtctl - > sheets [ 1 ] , shtctl - > top - 1 ) ;
}
@@ -276,8 +268,13 @@ void HariMain(void)
task - > tss . eax = ( int ) & ( task - > tss . esp0 ) ;
task - > tss . eip = ( int ) asm_end_app ;
io_sti ( ) ;
} else { /*命令行窗口*/
task = sht - > task ;
io_cli ( ) ;
fifo32_put ( & task - > fifo , 4 ) ;
io_sti ( ) ;
}
}
}
break ;
}
}
@@ -299,6 +296,8 @@ void HariMain(void)
}
}
}
} else if ( 768 < = i & & i < = 1023 ) { /*命令行窗口关闭处理*/
close_console ( shtctl - > sheets0 + ( i - 768 ) ) ;
}
}
}
@@ -321,3 +320,52 @@ void keywin_on(struct SHEET *key_win)
}
return ;
}
struct SHEET * open_console ( struct SHTCTL * shtctl , unsigned int memtotal )
{
struct MEMMAN * memman = ( struct MEMMAN * ) MEMMAN_ADDR ;
struct SHEET * sht = sheet_alloc ( shtctl ) ;
unsigned char * buf = ( unsigned char * ) memman_alloc_4k ( memman , 256 * 165 ) ;
struct TASK * task = task_alloc ( ) ;
task - > cons_stack = memman_alloc_4k ( memman , 64 * 1024 ) ;
task - > tss . esp = task - > cons_stack + 64 * 1024 - 12 ;
int * cons_fifo = ( int * ) memman_alloc_4k ( memman , 128 * 4 ) ;
sheet_setbuf ( sht , buf , 256 , 165 , - 1 ) ; /*无透明色*/
make_window8 ( buf , 256 , 165 , " console " , 0 ) ;
make_textbox8 ( sht , 8 , 28 , 240 , 128 , COL8_000000 ) ;
task - > tss . esp = memman_alloc_4k ( memman , 64 * 1024 ) + 64 * 1024 - 12 ;
task - > tss . eip = ( int ) & console_task ;
task - > tss . es = 1 * 8 ;
task - > tss . cs = 2 * 8 ;
task - > tss . ss = 1 * 8 ;
task - > tss . ds = 1 * 8 ;
task - > tss . fs = 1 * 8 ;
task - > tss . gs = 1 * 8 ;
* ( ( int * ) ( task - > tss . esp + 4 ) ) = ( int ) sht ;
* ( ( int * ) ( task - > tss . esp + 8 ) ) = memtotal ;
task_run ( task , 2 , 2 ) ; /* level=2, priority=2 */
sht - > task = task ;
sht - > flags | = 0x20 ; /*有光标*/
fifo32_init ( & task - > fifo , 128 , cons_fifo , task ) ;
return sht ;
}
void close_constask ( struct TASK * task )
{
struct MEMMAN * memman = ( struct MEMMAN * ) MEMMAN_ADDR ;
task_sleep ( task ) ;
memman_free_4k ( memman , task - > cons_stack , 64 * 1024 ) ;
memman_free_4k ( memman , ( int ) task - > fifo . buf , 128 * 4 ) ;
task - > flags = 0 ; /*用来替代task_free(task); */
return ;
}
void close_console ( struct SHEET * sht )
{
struct MEMMAN * memman = ( struct MEMMAN * ) MEMMAN_ADDR ;
struct TASK * task = sht - > task ;
memman_free_4k ( memman , ( int ) sht - > buf , 256 * 165 ) ;
sheet_free ( sht ) ;
close_constask ( task ) ;
return ;
}