ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
10月 20 (土曜日) 2007
20:08
FDアクセス:イメージ内で発見?
 
あっれえぇぇぇ?



論理セクター0(C1 H0 S0)を読み込んだはずだけど、

haribote.imgの0x4800〜を読み込んでるようだぞ???



おっかしいなぁ。論理0はブートセクタのはずだから、



EB 4E 90 ・・・・・・



のはずじゃね?



なにこの



F6 0F 00 00 6A 00 8D ・・・・



って??



・・・・・まさか・・・・・ まさかねぇ・・・








ぎゃーーー!







セクタが1から始まるのをシリンダと勘違いしてました・・・orz



オレの二日間はなんだったんだああぁぁぁぁぁぁぁ!



直したらちゃんと読めた!

おぉ! オレって天才じゃん!!!( ゜∀゜)アーヒャヒャヒャヒャヒャヒャ!!!!





立ち直りが早いのか現実逃避なのか・・・




まぁとにかく!!!!



FDのセクタを指定して読むことはできるよーーになったぞ!!!



リビジョン26
 
name: @Guest  Comment:
18:29
番外:やっぱオレはアホだった・・・
 
苦労してメモリダンプのコマンドを作ったんだけどさ・・・



typeやcalcと同じように「アプリケーション」で作ったわけよ。



セグメントが違うじゃんかよーーーーー! (T▽T)



リビジョン25
 
name: @Guest  Comment:
11:25
FDアクセス:成功?失敗?
 
さていろいろやって、とにもかくにもFDでセクタを読むことには

成功したっぽいです。



(発想の転換で、fifoを判断するforループを入れ子にしちゃったん

ですよね。このタスクは基本的にはFDDコントロール専用だし)



・・・で!



読み込んだはずのデータを表示してみたんですけど、どうも合わない・・・。



論理セクタ0を読んだはずなんだけど、その値がharibote.img内のどこを

検索しても見当たらないんだよなぁ・・・



読み込みがまずい? それともメモリ位置がおかしい?

もう一度メモリマップを作り直して確実な読み込みバッファを

確保したほうがよさそうだなぁ。



それと、コマンドラインあたりから、メモリ内容をだーーっとダンプするような

のがほしいな。コードで表示してると面倒でいかん・・・・



リビジョン23
 
name: @Guest  Comment:
11:17
ちょっとネタね
 
たははは。

ある意味ではこれはお笑いなので。(^^



いまオイラはFDを読む実験をしてるんだけど、これ、以前にもやったんですよ。

そのときもまあとりあえずはうまくいったんです。

でね? そのとき。



FDからのデータを読み込む場所をメモリに確保するでしょ?

何番地〜とか。

そのとき、なにをどう勘違いしたか、0xa0000番地にしてたのよ(^^;



実験はけっこううまく入ってて、「FD読めたー!わーい!」なんて思ってたら、

ふと気づくと画面上部にノイズが・・・

「なんだこれは!? いつからだ! うむむーー!」ってなもんで

ずいぶん悩んだんですよ。当時。

(こらぁもういわんでもわかるやろ?)



実はね。今回、何回かこれをワザとやったんですよ。

っというのは、バッファ等って、本当に書き込みがなされたかどうか

とかを、すぐにパっと見てわからないじゃない。(表示するコード書いたりせんといかんし)

なので、ワザと。

理由は二つあって、ここはvramの先頭であり、それ以外には絶対しようされないじゃない?。それを逆手に取れば、画面が乱れる以外

一切問題が生じない部分といえるでしょ?

もうひとつは、画面の乱れ。理由がわかっていれば、この乱れが出た瞬間に、「あ、たしかにメモリに転送してるな」

ってのが解るともいえるのです。



・・・まあ、大変幼稚で乱暴な方法ではありますがね。(^^;



とりあえず、メモリへの転送は成功しているようです〜
 
name: @Guest  Comment:
10月 19 (金曜日) 2007
22:53
FDアクセス:とにかくセクタを読んでみる
 
最初からあまり仰々しいことやってもトーシローのオイラには無理なので、

まずは直線的な流れで、ベターーーっとあるセクターを読み込んでみよう!!

じゃ、とりあえずは論理セクター0ね。(^^



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

そんなのを考える。



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



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









 
name: @Guest  Comment:
22:47
FDアクセス:モーターの憂鬱
 
はりぼてWikiによると、AT互換機のFDDは「今現在モーターが回っているか?」という情報を取得できないらしい・・・



なので、OS側で覚えておけということらしいが、疑問がある。

それは起動時のOSそのものの読み込み時に回転するモーターが、はたして今現在とまっているのかどうかという判断だ。



いまでこそサビビは小さいのでOSが動き出した時点ではたぶん止まっていると過程していいだろう。しかし、たとえば将来、設定ファイルや

スタートアップアプリなどをサポートしたという場合、はたして・・・



さて、そんなことを今考えてもしょうがないので、とりあえずモーターは必ず止まっているということを前提として進めていこう。

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

name: @Guest  Comment:
20:18
FDアクセス:割り込み装備
 
[2]キーを押してコマンドが送信された。(送信しろというコード部は実行されたクサイ)



もしこれでOKなら、割り込みが発生するはず。

とりあえず割り込み部分でなにかアクションを行えるようにしてみよう。



・・・おぉっとぉ!



どうも割り込みがこないと思ったら、割り込みマスクをはずしておくの忘れてた!!

(これ、前にもひっかかったんだよなぁ。俺ってマヌケ・・・)





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





bootpac.c内のこんなやつね・・・(^^;

ここを修正してと・・・



よおっしゃぁぁぁぁぁぁ!!!!

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



さーて・・・

testtask内。FDを効率的にアクセスするにはどうしていったらいいだろう。

すこし組み立て(フローチャート?)を考えてみよう。



リビジョン21
 
name: @Guest  Comment:
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
 
name: @Guest  Comment:
Referer  (1)
17:17
メインFIFOに送信されるデータの整理
 
ここでちょっとメインfifoに送信されてくるデータを整理しておこう。えっと・・・



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



よーし。とりあえずこんなところかな。

キリがいいのでFDD関係のfifoデータは3000〜4000ということにするか。



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



inthandler26の関数もあわせて変更・・・っと。
 
name: @Guest  Comment:
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
 
name: @Guest  Comment:
1 2 3 (4) 5 6 7 » 

PopnupBlog V3 Denali created by Bluemoon inc.