/* データリード */
                 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;

Wikiの [ 一覧一覧 最終更新最終更新 ヘルプヘルプ   RSSRSS]