雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
3: 2007-01-22 (月) 11:30:42 ソース バックアップ No.3 を復元して編集 現: 2024-01-06 (土) 22:39:09 ソース 編集
Line 31: Line 31:
  char counter = 3;   char counter = 3;
  int p;   int p;
 + 
   struct FIFO32 timerfifox;    struct FIFO32 timerfifox;
   struct TIMER *timerx;    struct TIMER *timerx;
   int timerbuf[128];    int timerbuf[128];
 + 
   fifo32_init(&timerfifox,128,timerbuf,0);    fifo32_init(&timerfifox,128,timerbuf,0);
 + 
   timerx = timer_alloc();    timerx = timer_alloc();
   timer_init(timerx,&timerfifox,128);    timer_init(timerx,&timerfifox,128);
   timer_settime(timerx,100);    timer_settime(timerx,100);
- +  
- +  
- +  
 + 
  //3秒待ち   //3秒待ち
     for(;;){      for(;;){
Line 50: Line 50:
     p = fifo32_get(&timerfifox);      p = fifo32_get(&timerfifox);
     if (counter == 0){break;}      if (counter == 0){break;}
 + 
     if( p == 128 ){      if( p == 128 ){
     sprintf(s, "Wait %dSec...\n",counter);      sprintf(s, "Wait %dSec...\n",counter);
Line 59: Line 59:
         io_sti();          io_sti();
  }   }
 + 
       io_sti();        io_sti();
- +  
- +  
- +  
 + 
  //0x03f4のチェック   //0x03f4のチェック
     sprintf(s, "Check 0x03f4");      sprintf(s, "Check 0x03f4");
     cons_putstr0(cons, s);      cons_putstr0(cons, s);
     cons_newline(cons);      cons_newline(cons);
 + 
  char a;   char a;
  a = io_in8(0x03f4);a = a & 0x11;   a = io_in8(0x03f4);a = a & 0x11;
Line 77: Line 77:
     cons_newline(cons);      cons_newline(cons);
  }   }
 + 
  //コマンドの送信   //コマンドの送信
       sprintf(s, "Start command send...");        sprintf(s, "Start command send...");
     cons_putstr0(cons, s);      cons_putstr0(cons, s);
     cons_newline(cons);      cons_newline(cons);
- +  
 + 
     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}      while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
     io_out8(0x03f5, 0x07);      io_out8(0x03f5, 0x07);
     sprintf(s, "Send 0x03f5 [0x07]\n");      sprintf(s, "Send 0x03f5 [0x07]\n");
     cons_putstr0(cons, s);      cons_putstr0(cons, s);
 + 
     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}      while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 + 
     io_out8(0x03f5, 0x00);      io_out8(0x03f5, 0x00);
     sprintf(s, "Send 0x03f5 [0x00]\n");      sprintf(s, "Send 0x03f5 [0x00]\n");
     cons_putstr0(cons, s);      cons_putstr0(cons, s);
 + 
     //モーターの回転&実験      //モーターの回転&実験
 + 
     io_out8(0x03f2, 0x1c);      io_out8(0x03f2, 0x1c);
     sprintf(s, "Morter Spin!\n");      sprintf(s, "Morter Spin!\n");
     cons_putstr0(cons, s);      cons_putstr0(cons, s);
     //3秒待ち・・・      //3秒待ち・・・
 + 
  //3秒待ち   //3秒待ち
     counter = 3;      counter = 3;
Line 108: Line 108:
     p = fifo32_get(&timerfifox);      p = fifo32_get(&timerfifox);
     if (counter == 0){break;}      if (counter == 0){break;}
 + 
     if( p == 128 ){      if( p == 128 ){
     sprintf(s, "Wait %dSec...\n",counter);      sprintf(s, "Wait %dSec...\n",counter);
Line 117: Line 117:
         io_sti();          io_sti();
  }   }
 + 
       io_sti();        io_sti();
- +  
 + 
    //モーターストップ     //モーターストップ
     io_out8(0x03f2, 0x0c);      io_out8(0x03f2, 0x0c);
     sprintf(s, "Morter STOP!!!!!\n");      sprintf(s, "Morter STOP!!!!!\n");
     cons_putstr0(cons, s);      cons_putstr0(cons, s);
- +  
 + 
       timer_free(&timerx);        timer_free(&timerx);
 + 
    return;     return;
 }  }
Line 147: Line 147:
と、こうなるね。ではさっそく・・・ と、こうなるね。ではさっそく・・・
 +えーと。解りやすいってことで、セクター19〜32を対象にしてみよう。(詳しくは[[ここ:http://thebbl.hideyosi.com/modules/bwiki/index.php?cmd=read&page=IPL%B8%A6%B5%E6]]見てね。
 +
 +え〜っと。論理セクター19は、ヘッド0でシリンダが1、セクター1がそうだね。ええと、読み込み用のDMSは0x00000000〜0x00ffffffの中にしか取れないのかぁ・・・。ええとどこにしようかな?。とりあえず、P171のメモリマップでみると頭のほうが空いてるみたいだから、0x000A0000〜0x000B0000あたりにしておこうかな。
 +
 +
 + /*FDの実験*/
 + void cmd_fdtest(struct CONSOLE *cons)
 + {
 +  char s[30];
 +  char counter = 3;
 +  int p;
 +  char reza;
 + 
 +   struct FIFO32 timerfifox;
 +   struct TIMER *timerx;
 +   int timerbuf[128];
 + 
 +   fifo32_init(&timerfifox,128,timerbuf,0);
 + 
 +   timerx = timer_alloc();
 +   timer_init(timerx,&timerfifox,128);
 +   timer_settime(timerx,100);
 + 
 + 
 + 
 + 
 +  //3秒待ち
 +     for(;;){
 +       io_cli();
 +     p = fifo32_get(&timerfifox);
 +     if (counter == 0){break;}
 + 
 +     if( p == 128 ){
 +  sprintf(s, "Wait %dSec...\n",counter);
 +  cons_putstr0(cons, s);
 +  counter--;
 +  timer_settime(timerx,100);
 +   }
 +         io_sti();
 +  }
 + 
 +       io_sti();
 + 
 + 
 + 
 + 
 +   //0x03f4のチェック
 +     sprintf(s, "Check 0x03f4");
 +     cons_putstr0(cons, s);
 +     cons_newline(cons);
 + 
 +  char a;
 +  a = io_in8(0x03f4);a = a & 0x11;
 +  if ( a == 0 ) {
 +     sprintf(s, "OK! 0x03f4 & 0x11 is 0!");
 +     cons_putstr0(cons, s);
 +     cons_newline(cons);
 +  }
 + 
 +  //コマンドの送信
 +     sprintf(s, "Start command send...");
 +     cons_putstr0(cons, s);
 +     cons_newline(cons);
 + 
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0x07);
 +     sprintf(s, "Send 0x03f5 [0x07]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 + 
 +     io_out8(0x03f5, 0x00);
 +     sprintf(s, "Send 0x03f5 [0x00]\n");
 +     cons_putstr0(cons, s);
 +     //---------------------------------------
 + 
 + 
 +     //DMAの初期化
 +     io_out8(0x00d6, 0xc0); /* マスタのch0をカスケードモードに */
 +     io_out8(0x00c0, 0x00); /* スレーブのDMAを許可 */
 +     io_out8(0x000a, 0x06); /* マスタのch2のDMAをマスク */
 + 
 +     //読み込み用にセットアップ
 +     //モード設定:デマンド・アドレス増加方向・メモリへの書き込み・ch2
 +     io_out8(0x000b, 0x06);
 +     // バイト数の設定
 +     io_out8(0x0005, 0xff); io_out8(0x0005, 1 * 2 - 1);
 +     io_out8(0x0004, 0x000a0000 & 0xff);
 +     io_out8(0x0004, (0x000a0000 >> 8) & 0xff);
 + 
 +     io_out8(0x0081, (0x000a0000 >> 16) & 0xff); /* メモリ番地の設定 */
 +     io_out8(0x000a, 0x02); /* マスタのch2のDMAをマスク解除 */
 + 
 +     //読み込み用のFDCコマンド発行!
 +     //  (FDCへのコマンド送信開始)(FATの情報を)
 + 
 +     //E6] [H<<2] [C] [H] [S] [02] [12] [01] [FF] (INT)
 +     //: [ST0] [ST1] [ST2] [C] [H] [S] [02]
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0xE6);
 +     sprintf(s, "Send 0x03f5 [0xE6]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0x00<<2);
 +     sprintf(s, "Send 0x03f5 [0x00<<2]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0x01);
 +     sprintf(s, "Send 0x03f5 [0x01]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0x01);
 +     sprintf(s, "Send 0x03f5 [0x01]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0x02);
 +     sprintf(s, "Send 0x03f5 [0x02]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0x7F);
 +     sprintf(s, "Send 0x03f5 [0x7F]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0x12);
 +     sprintf(s, "Send 0x03f5 [0x12]\n");
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0x80 ){}
 +     io_out8(0x03f5, 0xFF);
 +     sprintf(s, "Send 0x03f5 [0xFF]\n");
 +     cons_putstr0(cons, s);
 + 
 +     //  (FDCが実行)
 + 
 +  //3秒待ち
 +     counter=3;
 +     for(;;){
 +       io_cli();
 +     p = fifo32_get(&timerfifox);
 +     if (counter == 0){break;}
 + 
 +     if( p == 128 ){
 +  sprintf(s, "Wait %dSec...\n",counter);
 +  cons_putstr0(cons, s);
 +  counter--;
 +  timer_settime(timerx,100);
 +   }
 +         io_sti();
 +  }
 + 
 +       io_sti();
 + 
 + 
 +     //  (FDCからのINT)
 +  sprintf(s, "Come on! INT!\n");
 +  cons_putstr0(cons, s);
 + 
 +     //  (FDCからリザルトステータス読み取り)
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0xC0 ){}
 +     reza = io_in8(0x03f5);
 +     sprintf(s, "[ST0]&0xC0=%X,",reza & 0xC0);
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0xC0 ){}
 +     reza = io_in8(0x03f5);
 +     sprintf(s, "ST1=%X,",reza);
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0xC0 ){}
 +     reza = io_in8(0x03f5);
 +     sprintf(s, "ST2=%X,",reza);
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0xC0 ){}
 +     reza = io_in8(0x03f5);
 +     sprintf(s, "[C]=%X,",reza);
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0xC0 ){}
 +     reza = io_in8(0x03f5);
 +     sprintf(s, "[H]=%X,",reza);
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0xC0 ){}
 +     reza = io_in8(0x03f5);
 +     sprintf(s, "[S]=%X\n",reza);
 +     cons_putstr0(cons, s);
 + 
 +     while(io_in8(0x03f4) & 0xC0 != 0xC0 ){}
 +     reza = io_in8(0x03f5);
 +     sprintf(s, "Last Code =  %X\n",reza);
 +     cons_putstr0(cons, s);
 +   //-------------------------------------------
 + 
 +   //マスタのch2のDMAをマスク */
 +   io_out8(0x000a, 0x06);
 + 
 +       timer_free(&timerx);
 +  return;
 + }
 + /*---------------------*/
 +
 +おぉぉぉ!!! 
 +失敗っぽいけど、qemuから
 + FLOPPY ERROR: fdctrl_read_data: can't read data in CMD state
 +なるエラーが複数行きているぞ。とにもかくにも、反応はしているようだ。
 +
 +そうなると怪しいのが、DMACの設定の辺りだと思うが・・・