ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
2007年11月01日(木曜日)
13:00
FDアクセス:とにかくセクタを読んでみる
 
関数化の第一段階いけたぞーー! (゜∀゜)

こんな感じで実機アクセスが可能に!!!(まだエラーチェックやってないんだけどね・・・)

//モーターON
fd_moter(1,&fdtime1);

//リセットコマンド送信
err1 = send_reset(&fdtime1);

//割り込み待ち
err1 = int6wait(900,&fdtime1);

//割り込み状態取得
err1 = int6check(900,&fdtime1);

//DMAを開ける
fd_dma_set(0);

//読み込みコマンド発行
err1 = send_sec_read(0,0,1,&fdtime1);

//割り込み待ち
err1 = int6wait(900,&fdtime1);

//リザルトの取得
err1 = get_rez(&fdtime1);

//dmaを閉じる
fd_dma_set(1);

int i;
char *ssbuf2;
ssbuf2 = 0x7c00;
//画面に表示してみる
for ( i = 0; i <= 8; i++)
{
sprintf(s, "%08X",ssbuf2[i]);
putfonts8_asc_sht(sheet,8,16*(i+6),COL8_008484,COL8_FFFFFF,s,8);

}


・・・ところでちょっとメモ。
リードコマンド(たぶんライトコマンドも)って、発行した後割り込みが来るじゃない?
これ、このコマンドのミス等以外にDMAの設定がまずいとやっぱり
帰ってこなくなる時があるみたい。
(微妙にハマッた・・・)

DMAの設定で
io_out8(0x0005, セクタ数 * 2 - 1); /* バイト数の設定 */
ってのがあるよね? このセクタ数。オイラはまだ1セクタごとにしか
読んでないので、ここは「1」になるのが正しい。
・・・でも、ハマりまくってグッチャグチャになってた時、
「もしかしてセクタの大きさのことなのかな?」
なんて思って、ここを512にしてたことがあった。
もちろんこれは間違いなんだけど、うっかりこれをそのままにして
しまっているバージョンがあった。
・・・なので、「あっれえぇぇぇ? まーた割り込みが来ないよ? なんでーー!!」
って10分ほどハマって、ここを直したらツルっと一発だったのよねぇ〜・・・(^^;


さーーーて! こんな時間か! 仕事言ってくる〜!

リビジョン57
 
30日を過ぎたBlogにはコメントできません。
00:55
FDアクセス:実機でいけた!??
 
えっとね。まず。

今回いろいろと躓いてしまった理由というか、顛末ね。

まずはこれ!

while ( (io_in8(0x03f4) & 0x10) != 0 )

オイラは「計算の優先順位」を正しく理解していなかった。
なので、↑の式をずっと

while ( io_in8(0x03f4) & 0x10 != 0 )

こんなふうに書いてしまっていた。これでは正しい計算結果が出ない。
なので本来はこのwhileをパスできる状態なのにひっかかってしまったり、またその逆だったり。
「まともな計算評価をしていない」んだから、これでうまくいってもダメでもそれはなんにもならないわけ。
さらに追い討ちというか。エミュではずっとこれで通ってしまっていた。(たぶん偶然なんだろうけど)
そのためこんなつまらないことを発見するのがだいぶ遅れてしまった。

次にひっかかってしまったのが、「いきなりセクタリード命令!」。
これはちゃんと書かれていたことなんだけど後回しにしてしまっていた。
あるセクタを読みたければ、まずはそのシリンダにヘッドをシークしないといけないわけ。
これまたエミュでは「いきなりセクタリード命令!」でも動作して
しまっていたからヤッカイなのだ。

さらにドツボ。
セクタリード命令の前に、このシークを挟み込んだ。この命令は単純だし、
シークを行うのでぶぶっなんて音が出る。動いているのが体感でわかる。
これが正解かと考え、そのすぐ後にセクタリードを置いてみたんだけどエラーになってしまった。
なぜこれでエラーになるのか。これがさっぱりわからなかった。
セクタリードの部分をさんざんコネ回して泣きそうになってしまった。

見かねたKタンがアドバイスをくれた。「割り込み状態取得」だ。
ところがこれがややこしい。意味合いやどんな時に必要なのかが
よくわからなかったため、inthandler26にもぐりこませて固まって
しまったりで大変だった。なぜうまくいかないのかが解らなかったためだ。

次に、この「割り込み状態取得」は「とにかく割り込みが来た時にはしなくてはならない」と間違えて理解してしまった。
最後のハマリ所がこれ。
シーク命令発行→割り込み→割り込み状態取得・・・
っと、ここまでがなまじうまく行ってしまったので余計ドブボ。その後、
シーク成功→セクタリード命令発行→割り込み→割り込み状態取得→リザルト取得
・・・とこういう組み立てをしてしまい、これまた散々悩みまくりだった。

結局正解は、なんのことはない。
SEEK系では割り込み状態取得が必要」
ということ。逆に言えばSEEK系以外では必要ないわけ。
オイラは「全ての割り込みに対して割り込み状態取得が必要」という勘違いをし、
さらに「セクターリードもSEEK系」という二重の勘違いをしてしまっていたわけ。

いやはや。解ってしまえばなんてことはないんだけどねぇ。
でもまあ、大変だったけど収穫も多い一週間でございました。(^^

さ〜て!

それじゃこれらの経験を生かして、包括関数の再構築とまいりましょうか。

とにもかくにも「dirっぽい動作をする」ところまで仕上げて、
新ベータとしてリリースしたいにょ〜♪
 
30日を過ぎたBlogにはコメントできません。

リンク元  (1)
00:43
FDアクセス:実機でいけた!??
 

ふぎゃあぁぁぁ!!!


・・・い・・・いけた・・・いけたか?・・・いやいけてる!!!!!

実機AB共に・・・・

FD読めた━━━━━━(゜∀゜)━━━━━━ !!!!!


やった・・・やったぞぉおぉ!!

これもひとえに天才的なhideyosiさんの実力Kタンの膨大な文書郡・タコなコードにアドバイスしてくれたうっちゃんのおかげだぁ!!

感謝!!


・・・とは言え、これは完成でもなんでもないんだよねぇ・・・
たかだか0セクタをベタ読みできただけなんだもん。
これから! これからが、新たなる戦いなのだ!

みんなぁぁ! これからが本当の戦いだあぁぁぁ!

おおぉぉぉぉぉぉぉぉぉぉぉぉ!!!!

第一部完       hideyosi先生の次回作にご期待ください

(打ち切りに言い訳してどーーーする!!!)

いろいろとまとめなきゃいかんな。
 
30日を過ぎたBlogにはコメントできません。
(1) 

PopnupBlog V3 Denali created by Bluemoon inc.