ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
10月 19 (金曜日) 2007
22:53
FDアクセス:とにかくセクタを読んでみる
 
最初からあまり仰々しいことやってもトーシローのオイラには無理なので、
まずは直線的な流れで、ベターーーっとあるセクターを読み込んでみよう!!
じゃ、とりあえずは論理セクター0ね。(^^

まず、[3]を押すとシーク0のコマンドを発行し、完了すると画面に返事を書く。
そんなのを考える。

・・・そうだ! 内部で最後に発行したコマンドを覚えておく変数を用意してfifoからのデータが3000ならそこで分岐させるってのはどうだろう??

・・・いや、違うなぁ・・・




 
30日を過ぎたBlogにはコメントできません。
22:47
FDアクセス:モーターの憂鬱
 
はりぼてWikiによると、AT互換機のFDDは「今現在モーターが回っているか?」という情報を取得できないらしい・・・

なので、OS側で覚えておけということらしいが、疑問がある。
それは起動時のOSそのものの読み込み時に回転するモーターが、はたして今現在とまっているのかどうかという判断だ。

いまでこそサビビは小さいのでOSが動き出した時点ではたぶん止まっていると過程していいだろう。しかし、たとえば将来、設定ファイルや
スタートアップアプリなどをサポートしたという場合、はたして・・・

さて、そんなことを今考えてもしょうがないので、とりあえずモーターは必ず止まっているということを前提として進めていこう。
 
●uchan@Guest -- 10/20 07:30
うちのノートPCだと、モーター止める処理を入れる前はずっと回ってました。
●hideyosi -- 10/20 11:01
なにいぃぃぃ!??? うーむ。うっちゃん貴重なアドバイス感謝!。・・・そうなると、やっぱりある地点で強制的に停止コマンドを発行して、どこかに停止マークつけとかないといけないよなぁ・・・むむむ!

30日を過ぎたBlogにはコメントできません。
20:18
FDアクセス:割り込み装備
 
[2]キーを押してコマンドが送信された。(送信しろというコード部は実行されたクサイ)

もしこれでOKなら、割り込みが発生するはず。
とりあえず割り込み部分でなにかアクションを行えるようにしてみよう。

・・・おぉっとぉ!

どうも割り込みがこないと思ったら、割り込みマスクをはずしておくの忘れてた!!
(これ、前にもひっかかったんだよなぁ。俺ってマヌケ・・・)


io_out8(PIC0_IMR, 0xf8); /* PITとPIC1とキーボードを許可(11111000) *


bootpac.c内のこんなやつね・・・(^^;
ここを修正してと・・・

よおっしゃぁぁぁぁぁぁ!!!!
FDコントローラから割り込みが来るようになったぞ!!!

さーて・・・
testtask内。FDを効率的にアクセスするにはどうしていったらいいだろう。
すこし組み立て(フローチャート?)を考えてみよう。

リビジョン21
 
30日を過ぎたBlogにはコメントできません。
19:29
FDアクセス:コマンド送信実験
 
えとえと・・・

まず、とにかくFDにコマンドが送れるようにしてみる。

testtask内で、[2]を押せばコマンド送信準備をする。現在の0x03f4の値を表示するようにしてみよう・・・

void test_task(struct SHEET *sheet){
struct TASK *task = task_now();
struct TIMER *timer1 = timer_alloc();
int i;
int fifodata;
char s[40];
char ascii;

int counter;
counter = 0;

//====== DMAの初期化===============
io_out8(0x00d6, 0xc0); /* マスタのch0をカスケードモードに */
io_out8(0x00c0, 0x00); /* スレーブのDMAを許可 */
io_out8(0x000a, 0x06); /* マスタのch2のDMAをマスク */

for(;;){
counter++;
if ( counter >100000 ){counter=0;}

io_cli();

if (fifo32_status(&task->fifo) ==0){
io_sti();
}
else{
fifodata = fifo32_get(&task->fifo);
io_sti();

sprintf(s, "fifo=%05d", fifodata);
putfonts8_asc_sht(sheet,20,16*4,COL8_008484,COL8_FFFFFF,s,10);

//========== キーボードだった場合の処理 ========
if (256 <= fifodata && fifodata <=511){
ascii=fifodata-256;

sprintf(s, "ASCII=%02x", ascii);
putfonts8_asc_sht(sheet,20,16*5,COL8_008484,COL8_FFFFFF,s,8);
//-------[1]だった場合(読み込みコードの実行)
if (ascii == 0x31){

}
//読み込みが可能な状態かどうかチェックしてみる
if (ascii == 0x32){
int cmd;
cmd = io_in8(0x03f4) & 0x11;

sprintf(s, "0x03f4=%04x", cmd);
putfonts8_asc_sht(sheet,20,16*6,COL8_008484,COL8_FFFFFF,s,11);
}
}
}
sprintf(s, "counter=%05d", counter);
putfonts8_asc_sht(sheet,20,16*3,COL8_000000,COL8_FFFFFF,s,13);
}
}


うーむ・・・・とりあえずはこれでいいみたいだなぁ・・・
値もちゃんと0が帰ってくるようだ。

(ほんとは「待つ!」と書いてあるんでそうするのがいいんだけど、ちょっと手抜きで・・・)

さらに、

  • io_in8(0x03f4) & 0xc0 が 0x80 になるのを待つ
  • io_out8(0x03f5, データ);

・・・とのこと。どうしようかな。とりあえず「シリンダ0へのシーク」をやってみよう。そうすると・・・


//読み込みが可能な状態かどうかチェックしてみる
//もしキーボードが[2]だったら・・・
if (ascii == 0x32){
int cmd;
cmd = io_in8(0x03f4) & 0x11;

sprintf(s, "0x03f4=%04x", cmd);
putfonts8_asc_sht(sheet,20,16*6,COL8_008484,COL8_FFFFFF,s,11);

cmd = io_in8(0x03f4) & 0xC0;
sprintf(s, "0x03f4=%04x", cmd);
putfonts8_asc_sht(sheet,20,16*7,COL8_008484,COL8_FFFFFF,s,11);

//コマンド送信
//シリンダ0へのシーク
io_out8(0x03f5,0x07);
io_out8(0x03f5,0x00);

sprintf(s, "DATA Send!!");
putfonts8_asc_sht(sheet,20,16*8,COL8_008484,COL8_FFFFFF,s,11);

}


こういうコードになるってことでいいのかな???

とりあえずコンパイラも通るようだし、成功???
いやでも、反応を見ることができないんじゃわからないよね?
割り込み処理に手を入れよう。

リビジョン20
 
30日を過ぎたBlogにはコメントできません。

Referer  (1)
17:17
メインFIFOに送信されるデータの整理
 
ここでちょっとメインfifoに送信されてくるデータを整理しておこう。えっと・・・

こっちにまとめるか・・・

よーし。とりあえずこんなところかな。
キリがいいのでFDD関係のfifoデータは3000〜4000ということにするか。

メインのタスクにもし3000〜4000が来たら、そのままFDDタスク(今はまあ、testtaskだけどね)のfifoに送信と!

inthandler26の関数もあわせて変更・・・っと。
 
30日を過ぎたBlogにはコメントできません。
16:10
FDアクセス:IRQ06
 
おっとっと! 忘れてた! これが大事な概念。

  • FDDはFDDコントローラに対してコマンドを送信して動かす
  • しかし返事が返ってくるのがとても遅い・・・
  • なので、割り込み(IRQ06)にお知らせがくる
  • そうでないとCPUとかに比べて遅すぎるので

こういうことですな。まずは割り込みの処理を設置しないと・・・

dsctbl.cに割り込みを設置する。

    /*ここ。IRQ6。フロッピーからのお返事
set_gatedesc(idt + 0x26, (int) asm_inthandler26, 2 * 8, AR_INTGATE32);


naskfunc.nas内に反応する関数を設置と・・・(P234を参考)

_asm_inthandler26:
PUSH ES
PUSH DS
PUSHAD
MOV EAX,ESP
PUSH EAX
MOV AX,SS
MOV DS,AX
MOV ES,AX
CALL _inthandler26
POP EAX
POPAD
POP DS
POP ES
IRETD


こんなところかな。

あとはここから呼び出される関数の本体を作る。
fd.cというファイルを追加。内容は

#include
#include "bootpack.h"

void inthandler26(int *esp)
/* FDコントローラからの割り込み */
{

/*実験部分*/
io_out8(PIC0_OCW2, 0x66); /* IRQ-06受付完了をPICに通知 */

struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
unsigned char s[4];

//sprintf(s, "%02X", data);
//boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
//putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FF00FF, s);
/*-------------------*/


return;
}



こんなところかな・・・

おぉぉっと! bootpac.hに今回設置した各関数を追加し、Makefileとかも直さないと・・・

おっしゃ! とにもかくにもコンパイルは通ったみたいだぞ!??

あとはinthandler26関数でtesttaskのfifoにデータを送信するように
すればいいはず。ええと・・・どうしようかな??

リビジョン19
 
30日を過ぎたBlogにはコメントできません。
15:55
FDアクセス:最初
 
ふむふむ・・・
まずはDMACの初期化かぁ・・・
これは最初にやっておけばよさそうなのでタスクのforループの前でやってしまったほうがいいかな。
とりあえずはこんなソースを置いてみる・・・

void test_task(struct SHEET *sheet){
struct TASK *task = task_now();
struct TIMER *timer1 = timer_alloc();
int i;
int fifodata;
char s[40];

int counter;
counter = 0;

//====== DMAの初期化===============
io_out8(0x00d6, 0xc0); /* マスタのch0をカスケードモードに */
io_out8(0x00c0, 0x00); /* スレーブのDMAを許可 */
io_out8(0x000a, 0x06); /* マスタのch2のDMAをマスク */

for(;;){
counter++;
if ( counter >100000 ){counter=0;}

io_cli();

if (fifo32_status(&task->fifo) ==0){
io_sti();
}
else{
fifodata = fifo32_get(&task->fifo);
io_sti();

sprintf(s, "fifo=%05d", fifodata);
putfonts8_asc_sht(sheet,20,16*4,COL8_008484,COL8_FFFFFF,s,10);

//========== キーボードだった場合の処理 ========
if (256 <= fifodata && fifodata <=511){
fifodata=fifodata-256;

sprintf(s, "ASCII=%02x", fifodata);
putfonts8_asc_sht(sheet,20,16*5,COL8_008484,COL8_FFFFFF,s,8);
}

}
sprintf(s, "counter=%05d", counter);
putfonts8_asc_sht(sheet,20,16*3,COL8_000000,COL8_FFFFFF,s,13);


}

}


あとはこのキーボードに反応してコマンドを送れるようにしてみる・・・

まずは「1」が押されたら読み込みコードを実行するって感じかな・・・



 
30日を過ぎたBlogにはコメントできません。
12:11
FDDを読み書きしたい!
 
さてさて!
オイラが今一番やりたいのがこれ!
以前も結構やってたんだけど挫折しますた・・・ orz

タスク設置で気をよくしたもんで、再び無謀な挑戦〜

さて、FDDをコントロールするにはタスクを独立させたほうがいいという
アドバイスをKタンがしていますなぁ。そういうわけで、さっそく
やってみることにします。
あ”・・・ こないだのタスクバーもどき、testtaskなんて名前で設置されてるね(汗
まずはこれらの名前変更から・・・

リビジョン17


さてさて! 
そしたら、この時計タスクの最初とほぼ同じような感じのタスクを設置・・・

よし!!! できたーー!

リビジョン18


ではでは、いよいよこのあたらしいtesttask内でFDDアクセスにチャレンジ!!!
パクリ参考元ここ
 
30日を過ぎたBlogにはコメントできません。
01:57
完成! いっちょリリースするか!!
 
わははは! でけたーーー!

よーし。じゃあこれを Ver.0.01とでもしてリリースと行きますか。

リビジョン16
 
30日を過ぎたBlogにはコメントできません。
00:05
特別なシート
 
今回作ったtesttaskウィンドゥ。見た目の描画をタスクバー風に
するのはわりと簡単。
でも、これ、見た目にかかわらずウィンドゥの移動やxボタンが効いてしまうんだよなぁ・・・

このシートだけは特殊なので、if文で判断させてはじいてみよう。

まずはbootpac.hのsheet構造体にパラメータ用の変数を追加してと。
お!? パラメータの分岐部で、クローズボタンの処理発見!
ここあわせてなかったな。ついでに修正・・・っと。

お!? タイトルバー部のアクティブ非アクティブの部分も邪魔だな。
条件分岐追加・・・っと。
 
30日を過ぎたBlogにはコメントできません。
(1) 

PopnupBlog V3 Denali created by Bluemoon inc.