5: 2007-01-28 (日) 20:34:42 |
現: 2024-01-06 (土) 22:39:09 |
| io_out8(PIC1_IMR, 0xef); /* マウスを許可(11101111) */ | | io_out8(PIC1_IMR, 0xef); /* マウスを許可(11101111) */ |
| fifo32_init(&keycmd, 32, keycmd_buf, 0); | | fifo32_init(&keycmd, 32, keycmd_buf, 0); |
| + | |
| //DMAの初期化 | | //DMAの初期化 |
| io_out8(0x00d6, 0xc0); /* マスタのch0をカスケードモードに */ | | io_out8(0x00d6, 0xc0); /* マスタのch0をカスケードモードに */ |
| io_out8(0x00c0, 0x00); /* スレーブのDMAを許可 */ | | io_out8(0x00c0, 0x00); /* スレーブのDMAを許可 */ |
| io_out8(0x000a, 0x06); /* マスタのch2のDMAをマスク */ | | io_out8(0x000a, 0x06); /* マスタのch2のDMAをマスク */ |
| + | |
| memtotal = memtest(0x00400000, 0xbfffffff); | | memtotal = memtest(0x00400000, 0xbfffffff); |
| | | |
| *((int *) 0x0fe4) = (int) shtctl; | | *((int *) 0x0fe4) = (int) shtctl; |
| task_a->langmode = 0; | | task_a->langmode = 0; |
| + | |
| /*fdタスク実験部*/ | | /*fdタスク実験部*/ |
| task_fdctl = task_alloc(); | | task_fdctl = task_alloc(); |
| task_run(task_fdctl,2,2); | | task_run(task_fdctl,2,2); |
| /*=============================*/ | | /*=============================*/ |
| + | |
| /* sht_back */ | | /* sht_back */ |
| sht_back = sheet_alloc(shtctl); | | sht_back = sheet_alloc(shtctl); |
| | | |
| void task_fdctl_main(){ | | void task_fdctl_main(){ |
| + | |
| struct FIFO32 fifo_fd; | | struct FIFO32 fifo_fd; |
| struct TIMER *timer_1s; | | struct TIMER *timer_1s; |
| int i = 0; | | int i = 0; |
| int fifost, fifobuf[128]; | | int fifost, fifobuf[128]; |
| + | |
| fifo32_init(&fifo_fd, 128, fifobuf, 0); | | fifo32_init(&fifo_fd, 128, fifobuf, 0); |
| timer_1s = timer_alloc(); | | timer_1s = timer_alloc(); |
| timer_init(timer_1s, &fifo_fd, 100); | | timer_init(timer_1s, &fifo_fd, 100); |
| timer_settime(timer_1s, 100); | | timer_settime(timer_1s, 100); |
| + | |
| struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; | | struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; |
| unsigned char s[8]; | | unsigned char s[8]; |
| + | |
| for(;;){ | | for(;;){ |
| + | |
| io_cli(); | | io_cli(); |
| fifost = fifo32_get(&fifo_fd); | | fifost = fifo32_get(&fifo_fd); |
| if ( fifost = 100){ | | if ( fifost = 100){ |
| i = i++;; | | i = i++;; |
| + | |
| sprintf(s, "%02X",i); | | sprintf(s, "%02X",i); |
| boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 31, 31); | | boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 31, 31); |
| timer_settime(timer_1s, 100); | | timer_settime(timer_1s, 100); |
| } | | } |
| + | |
| io_sti(); | | io_sti(); |
| } | | } |
| { | | { |
| int cc,hh,ss; /*物理セクタ格納用*/ | | int cc,hh,ss; /*物理セクタ格納用*/ |
| + | |
| if( r_sec > 2879 ){ | | if( r_sec > 2879 ){ |
| return -1; | | return -1; |
| } | | } |
| + | |
| ss = r_sec % 18 +1; /* 論理セクタを物理セクタに変換*/ | | ss = r_sec % 18 +1; /* 論理セクタを物理セクタに変換*/ |
| hh = (r_sec / 18) % 2; | | hh = (r_sec / 18) % 2; |
| cc = (r_sec / 18) /2 / 80; | | cc = (r_sec / 18) /2 / 80; |
| + | |
| /*データリード: [1] [セクタ番号] [セクタ数] [番地] [FIFO32*] [データ]*/ | | /*データリード: [1] [セクタ番号] [セクタ数] [番地] [FIFO32*] [データ]*/ |
| io_cli(); | | io_cli(); |
| fifo32_put(fd_ctl_task->fifo,data); | | fifo32_put(fd_ctl_task->fifo,data); |
| io_sti(); | | io_sti(); |
| + | |
| return; | | return; |
| } | | } |
| | | |
| -・・・だめだ。これではHariMainはtask_fdctlを知っているが、呼び出したタスク(コンソールタスク)はこれを知らない。やっぱ、グローバル関数化かなぁ・・・ | | -・・・だめだ。これではHariMainはtask_fdctlを知っているが、呼び出したタスク(コンソールタスク)はこれを知らない。やっぱ、グローバル関数化かなぁ・・・ |
| + | |
| + | |
| + | うーん。そうか。とにかくFDタスクに変数としてFIFOを渡さないといけないのかな??? |
| + | FDタスクはタスクだから、とにかく一度でも動かないと初期化も定義もしないわけだし・・・ |
| + | |
| + | んんん? まてよ? こういうことかな??? |
| + | -まず、メインルーチンであるHariMain内であるFIFO(じゃ、FIFO_Aとする)を定義。 |
| + | -同じくそれをHariMain内で初期化。HariMain内ではごく普通に扱えるFIFOが1個できる。 |
| + | -FDタスクを初期化。しかし、例の方法で「パラメータ」を渡せるタイプのタスクにする。(task_fd_main(int *FIFO)とか |
| + | -FDタスクを走らせる(task_run)する前に、この*fifo を FIFO_Aに当て込む。(例のスタックを使うというおかしな方法で渡す) |
| + | -HariMain側では、単にFIFO_Aにputすれば、それがFDタスクへの指令になる |
| + | -fd_task内でもこのタスクを読みこんでループ動作から分岐して作業を行う |