ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
11月 15 (木曜日) 2007
15:32
fopenとは?
 
いろいろと調べて見ると、よくあるパターンとして、fopenは構造体を返すようだね。

その構造体がFILEHANDLE。(これ自体は既にはりぼてに存在してる)



そしてその構造体を引数として与えることで、freadやfgetが動くと。

で、この構造体内には各種ファイルの情報が入っている。その中で注目すべきが

fpointというもの。つまり、現在、そのファイルはどこを読んでいるのか?という値ね。



それではさっそくそういうふうにできるようにしてみよう。

とりあえずはFILEHANDLE2なんて構造体でいろいろ実験開始。
 
name: @Guest  Comment:
Referer  (1)
14:39
そっとしておいてくれ。明日につながる今日くらい
 
いけたかなぁ??? ♪

FD_TaskのFIFOにコマンドを送信したあと、こんなことしてみた。



for (;;)

{

if (fifo32_status(&task->fifo) == 0)

{

task_sleep(task);/* FIFOが空なので寝て待つ */

}

else

{ //なんかFIFOに来たぞ!!

i = fifo32_get(&task->fifo);

if ( i == 999 )

{

reg[7] = -1;

return 0;

}

}

}





これでたぶんいいんじゃないかと・・・

(いまのところ目的通りに動いている感じ。

あとはこの「FIFOに返信される数値」を決めて、エラー分岐とかに発展させていけばいいかもと。



リビジョン85
 
name: @Guest  Comment:
10:31
タスク寝かせ
 
動作しているタスクを強制的に停止させる。ええと・・・これはHLTかな?

あ”ちがった・・・ HLTってのは「CPUそのもの」を止めちゃう命令。あるタスクが止まったって別のタスクは動いている。そのためにはCPUは動いてなくちゃいけないもんね。



そうすると・・・・

これかな??。

P333のあたり。

複数のタスクが平行して動いているように見えるけどそうじゃない。

タスクは高速に切り替えが行われているのでそう見えるだけ。



(Task_a → Task_b → task_c →再びTask_aへ!)



  ↑

こんな感じの指示表があってその通りに切り替えを行っている



この指示表から抜いてしまう!



(Task_a → → task_c →再びTask_aへ!) Task_b



こうすることで、そのタスクは「停止しているのではなく、動かさせてもらえない」という状態になるわけだよね。



・・・あっれえぇぇぇ?

うまくいかないなぁ。



・・・それはそうと、少し上のほう。キー入力APIの辺りではループによって待ちをかけているぞ?

あれー? こういうパターンって、だめだったんじゃないっけ?

(以前うっちゃんに言われて試した)



ちょっと視点を変えてもう一度試してみる・・・
 
name: @Guest  Comment:
11月 14 (水曜日) 2007
15:45
僕は・・・いやだ・・・
 
今現在、オイラが書いたAPIではこんなことする必要があります。



FILEOPEN:

;;試作のfopenAPI

MOV EDX,0x6E ;;機能番号

MOV EAX,filename ;;開くファイル名

MOV EBX,tmpfilename ;;これはテスト用・・・

MOV ECX,fbuf ;;ここに読み込んじゃう

MOV ESI,waitflag ;;処理終了を知らせるフラグ

INT 0x40 ;コール!



JMP WAITLOOP





WAITLOOP:

MOV AX,[waitflag]

CMP AX,0

JE FDOK

JMP WAITLOOP



INT40でファイルオープンのAPIをコールしているのですが、普通はそのすぐ後に

EAXかなんかの判定(戻り値)を書きますよね? 

オイラのではこうやってループを設けて、かつ、自前でループさせて、

しかもメモリの値を評価しないといけない。



細かいことはよくわからないんですけど、なーーーんかこれ、普通じゃないですよね?



このAPIが呼ばれたら作業が完了するまで自動で止まるようにするほうがいい、とやっぱり思うんですよ。



なんとかならないもんでしょうかねぇ。



そんなわけで、このAPIが呼ばれたら、呼んだタスクを調べて強制的に停止させちゃう。

作業が全て終わったら戻り値をセットし、再びタスク再開。

そんなふうにできないものかと・・・



そんなわけで、2巡目でなお怪しいマルチタスクの管理部分を復習してみることにしました。

 
name: @Guest  Comment:
11月 12 (月曜日) 2007
21:42
この音は・・・16気筒かぁ!
 
むひょ〜!!!!!



多セクタファイル、読み込めたぁ!!!!!!

すこし大きいファイルを追加。(sjis.txt)

こいつをtype2で表示することに成功!!!



よーし! いろいろ細かい部分に穴があるのでそいつを検証するか!



fopen関数、搭載近し!!!! (かな? ^^; )



リビジョン84
 
name: @Guest  Comment:
11月 11 (日曜日) 2007
23:24
パワーでもこちらは負けん!私はメバルルとは違う!
 
うはぁぁぁ!!!



いけたぞ!!!! まだまだ機能超限定だけど読んだぞ!!!



・・・あっちゃぁぁぁぁ!!!

まーた例の問題が出ちゃった。(ファイルが大きくなって日本語フォントを全部読めていない)



・・・とりあえず、またファイル順を入れ替えてと・・・



くっそぉーーー! この辺が限界か!

まあとりあえずはこんなところで。

(原因はわかってる。dir2やtype2がとりあえずのため、自身の内部に巨大なバッファエリアを持ってるせいなんだよねぇ・・・)



今現在は、まだ単セクタファイル専用なんだけど、もうすこし

拡張して多セクタファイルにも対応しよう!!!



リビジョン82
 
name: @Guest  Comment:
Referer  (3)
16:35
いよいよfileopenに着手!??
 
クソったれぇ! (最後10分降られた!)



さーて。とりあえずはtype2.nasとconsole.cはこんなところかな。

いよいよfd.cにファイルオープン命令をカキコ・・・

リビジョン81
 
name: @Guest  Comment:
13:28
ファイルオープンAPI再び
 
いよいよファイルオープンAPIを試搭載開始。

まず、''とりあえず''は、FATの繋がりを論理セクタで返すようにしてみる・・・



飽きた ━━━━[;´Д`]━━━━ !!!



・・・ちょっと首都高までお散歩・・・
 
name: @Guest  Comment:
Referer  (1)
10:53
過ちは青春さ! 人生の肥やしさ!
 
(でも肥やしあげすぎると根っこが腐っちゃうんだよね・・・orz)



えー! そんなわけでありまして! 再び正しい知識で再検証!



  1. ルートディレクトリからファイル名を探し、ファイルを探す

  2. ファイルが見つかったら、例の2バイトを読むことでファイル開始位置が解る

  3. この値は 論理セクタ位置 = データ領域開始位置 - 2 + ファイル開始位置 なんて式で論理セクタに変換できる

  4. 末尾の4バイトを読む。これはサイズを表しているので、これが1セクタ以下ならファイルは一個のセクタに収まっているので終了。

  5. すこしでも大きい場合、多セクタにつながっているのでFAT領域を読んで追いかける

  6. FAT領域は3バイトで2つを作っている(圧縮?)

  7. 先ほどの開始位置と照らし合わせる。それによって次につながっている論理セクタの位置がわかる

  8. この値がFF8〜FF9になれば、そこでファイルは終了



さて、じゃ、FAT領域の解読。例の表に当てはめると・・・



ウチのFAT(論理セクタ1)の状態



FAT番号 00 01 02 03 04 05 06 07

┌──┐ ┌──┐ ┌──┐ ┌──┐

0x00000200 F0 FF FF 03 40 00 05 60 00 07 80 00

FAT番号 08 09 0A 0B 0C 0D 0E 0F

┌──┐ ┌──┐ ┌──┐ ┌──┐

0x0000020D 09 A0 00 0B C0 00 0D E0 00 0F 00 01

FAT番号 10 11 12 13 14 15 16 17

┌──┐ ┌──┐ ┌──┐ ┌──┐

0x0000021A 11 20 01 13 40 01 15 60 01 17 80 01

FAT番号 18 19 1A 1B 1C 1D 1E 1F

┌──┐ ┌──┐ ┌──┐ ┌──┐

0x00000227 19 A0 01 1B C0 01 1D E0 01 1F 00 02



こういうふうになるわけか。そうするとこんな式でいいのかな?



if ( 開始ナンバー % 2 ==0 ) //偶数奇数で分ける

{

FAT頭 = 開始ナンバー * 3 / 2 + 0x00000200;

FAT尻 = FAT頭 + 2;

//ここで例に並べ替えを行い、二つの数値を取り出す//

次FAT = 1番目の値

}

else

{

FAT頭 = (開始ナンバー - 1) * 3 / 2 + 0x00000200 ;

FAT尻 = FAT頭 + 2;

//ここで例に並べ替えを行い、二つの数値を取り出す//

次FAT = 2番目の値

}



・・・この式で行くと、例のeuc.txtのファイル開始ナンバー(0x00AB)の情報が書いてあるFAT番地は・・・・2FF !?



FAT番号 AA AB

┌──┐

0x000002FF FF FF FF



こうなるはず! 2番目の数字を取り出すと・・・FFF !?

つまりファイルはこれで終了!!!

むむむ!? これでほんとにいいのかなぁ。(先のポカがあるから心配だ・・・

 
name: @Guest  Comment:
Referer  (1)
11月 10 (土曜日) 2007
23:51
毛利小五郎でした!!!
 
・・・このオイラのマヌケさといったら、迷探偵毛利小五郎か、はたまたうっかり八兵衛か!!!



FAT領域は圧縮されている



って、黒猫本のP388にちゃんと書いてあるじゃん!!!!



・・・・嗚呼・・・・なーにやってんだろ・・・俺・・・・orz・・・
 
name: @Guest  Comment:
1 2 3 4 5 6 (7) 8 9 10 11 12 13 14 15 16 » 

PopnupBlog V3 Denali created by Bluemoon inc.