- 追加された行はこの色です。
- 削除された行はこの色です。
/* データリード */
timer_cancel(timer); /* モーターOFFを阻止 */
for (j = 0; j < 5; j++) {
/* FIFOからコマンドを5個取得する */
data[j] = fifo32_get(&task_fdc->fifo);
}
sprintf(s, "DATA: [0]%d [1]%d [2]%02x [3]%d [4]%d", data[0], data[1], data[2], data[3], data[4]);
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline, 0xffffff, s);
newline+=16;
/* 読み込みmain */
now_c = data[0] / 36; /* セクタ */
now_h = (data[0] / 18) % 2; /* ヘッダ */
now_s = 1 + data[0] % 18; /* セクタ */
addr = data[2]; /* DMACに渡すアドレス */
sprintf(s, "SET: C=%d H=%d S=%d", now_c, now_h, now_s);
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline, 0xffffff, s);
newline+=16;
fdc_seek(now_c, now_h);
sprintf(s, "SEEK: Result=%d C=%d", fdc_stat.result, fdc_stat.cylinder);
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline, 0xffffff, s);
newline+=16;
for (k = 0; k < data[1]; k++) {
/* DMACの設定 */
io_out8(0x000b, 0x06); /* モード設定:デマンド,アドレス増加方向,メモリへ書き込み,ch2 */
io_out8(0x0005, 0xff); /* バイト数の設定(1セクタずつ) */
io_out8(0x0005, 1);
io_out8(0x0004, addr & 0xff); /* メモリ番地の設定 */
io_out8(0x0004, (addr >> 8) & 0xff);
io_out8(0x0081, (addr >> 16) & 0xff);
io_out8(0x000a, 0x02); /* マスタのch2のDMAをマスク解除 */
/* コマンド送信アタタタタタ!!!*/
while((io_in8(0x03f4) & 0x11) != 0) { task_sleep(task_fdc); } // 送信準備
fdc_sendcommand(0xE6); /* 読み込みコマンド */
fdc_sendcommand(now_h<<2); /* ヘッダ<<2 */
fdc_sendcommand(now_c); /* シリンダ */
fdc_sendcommand(now_h); /* ヘッダ */
fdc_sendcommand(now_s); /* セクタ */
fdc_sendcommand(0x02); /* セクタ長 */
fdc_sendcommand(0x12);
fdc_sendcommand(0x01);
fdc_sendcommand(0xFF);
//putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 8, newline, 0xffffff, "B");
io_hlt();
while (fifo32_status(fdc_fifo) == 0) { task_sleep(task_fdc); } // 割り込み待ち
fifo32_get(fdc_fifo);
for (j = 0; j < 7; j++) {
result[j] = fdc_receivedata();
}
io_out8(0x000a, 0x06); /* マスタのch2のDMAをマスク */
//putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 16, newline, 0xffffff, "C");
//newline+=16;
io_hlt();
if ((result[0] & 0xc0) != 0x00) {
/* 異常終了 */
/* とりあえず今のところはループカウントから1を引いてやり直し */
errcnt++;
sprintf(s, "Result: [0]%02x [1]%02x [2]%02x %02x %02x %02x %02x", result[0], result[1], result[2], result[3], result[4], result[5], result[6]);
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline, 0xffffff, s);
sprintf(s, " C=%d H=%d S=%d", now_c, now_h, now_s);
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline+16, 0xffffff, s);
newline+=32;
if (errcnt == 3) {
fdc_seek0();
fdc_seek(now_c, now_h);
k--;
continue;
} else if (errcnt == 6) {
errcnt = 0;
} else {
k--;
continue;
}
}
errcnt = 0;
addr += 512;
now_s++;
if (now_s == 19) {
now_h++;
now_s = 1;
if (now_h == 2) {
now_c++;
now_h = 0;
fdc_seek(now_c, now_h);
sprintf(s, "SEEK: Result=%d C=%d", fdc_stat.result, fdc_stat.cylinder);
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline, 0xffffff, s);
newline+=16;
}
sprintf(s, "SET: C=%d H=%d S=%d", now_c, now_h, now_s);
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline, 0xffffff, s);
newline+=16;
}
if (592 <= newline) {
boxfill((unsigned int *) (binfo->vram), binfo->scrnx, 0x3a6ea5, 0, 0, 400, 600);
newline=0;
}
}
sprintf(s, "%x %x", *((unsigned char *) 0x00400000), *((unsigned char *) 0x00400001));
putfonts((unsigned int *) (binfo->vram), binfo->scrnx, 0, newline, 0xffffff, s);
newline+=16;