CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

ICSPプログラム(3)

フラッシュROMの指定アドレスにデータを書き込む関数はこんな具合になります。
関数の後半はポーリングにより書換えが完了したかのチェックになっています

int amd_write(char far *adr,unsigned char data)
{
  char far *p;
  long chip;
  unsigned char x;
  int  r;
  long retry;
	
  chip=FP_OFF(adr) & 3;
  p=lng2ptr(FROM_BASE+(0x5555L<<2)+(long)chip);
  *p=0xaa;
  p=lng2ptr(FROM_BASE+(0x2aaaL<<2)+(long)chip);
  *p=0x55;
  p=lng2ptr(FROM_BASE+(0x5555L<<2)+(long)chip);
  *p=0xa0;

  *adr=data;			/* データ書き込み */

  retry=0;
  for(;;){
    x=*adr;			/* data polling  */
    if((x&0x80)==(data&0x80)){
      r=0;		                     /* normal end   */
      break;
    }
    if(x&0x20){		          /* time out    */
      x=*adr;		          /* data polling  */
      if((x&0x80)==(data&0x80)){
        r=0;	                     /* normal end   */
        break;
      }
      r=1;		                     /* break;    */
    }
    if(retry++ > 60000){
      r=0;
      break;
    }
  }
  if(r) amd_reset(chip);		/* エラーリセット */
  return r;
}
このほかにバイナリコードのローダ、ROMのセクタイレーズ、ベリファイのモジュールを
組込み、完成したICSP処理の実行例です

①モニタからROMライタプログラムをロード
②ROMライタプログラムを起動
③新しいモニタ(Ver0.05)のバイナリイメージをロード
④ボードリセット(モニタはまだVer0.04)
⑤再度ROMライタプログラムを起動
⑥セクタイレーズ
⑦イレーズチェック
⑧ROMプログラム
⑨ベリファイチェック
⑩ボードリセット
⑪新しいモニタ(Ver0.05)が起動

イメージ 1