081207

|



アドレスが出ていないのはCS4#の配線ミスでした。隣りのCS5#につないでいた。
つなぎ直してちゃんと動きました。


プログラム側で必要なのは、A0-A19をI/Oポートのレジスタで出力にしておくこと と、エリア4-7はBSC_CSCRでCS#の出力をすること。エリア0-3はI/Oポートで出 力を設定する。
H8とSRAM(M68AF127BM55)の配線について。
  • E2->CS, E1#->CS#, W#->WE#, G#->OE#。
  • CS#(E1)とCS(E2)はANDでつながっているので、CSはVcc5Vに7Kでプルアップ 固定、CS#をH8のCS#に直結する。
  • 8bitアクセスなのでHWRとWE#(W#)を直結。SRAMのDQ0-DQ7をH8のD8-D15に直結。
  • H8のRD#とOE#(G#)を直結。
  • アドレスラインはSRAMのA0-A16をH8のA0-A16に直結
  • H8側からのCS#もプルアップしてSRAMに接続。バスステートコントローラの参考例でプルアップしてる。端子的には最大2mA。5V、1mAで5KΩ、ここは7KΩにしておきました。(E2のプルアップも)

増設したSRAMのテストプログラムは...
モード5(1MBモード)で起動するとバス幅8bitなのでBSC_ABWCRの設定はなくても いい。BSC_ASZTCRの設定もデフォルトの3ステートでよければそのままでもいい。
void check_ram (uint32_t, uint32_t);

#define	BSC_ABWCR	((volatile uint8_t *)0xfffec)
#define	BSC_ASTCR	((volatile uint8_t *)0xfffed)
#define	BSC_WCR		((volatile uint8_t *)0xfffee)
#define	BSC_WCER	((volatile uint8_t *)0xfffef)
#define	BSC_BRCR	((volatile uint8_t *)0xffff3)
#define	BSC_CSCR	((volatile uint8_t *)0xfff5f)

#define	ADDR1M_AREA4_START	0x80000
#define	ADDR1M_AREA5_START	0xa0000
#define	ADDR1M_AREA_SIZE	0x20000

void
extram_area_init (int area)
{
  uint8_t r = 1 << area;

  *BSC_CSCR |= r; // enable CS#
  *BSC_ABWCR |= r; // 8bit access (data bus: D8-D15)
  *BSC_ASTCR &= ~r; // 2-state access (can't insert wait-state)
}

void
extram_init ()
{
#define	MDCR	(volatile uint8_t *)0xffff1

  extram_area_init (4);
  extram_area_init (5);

  // Set address line (A0-A19) output.
  P1->DDR = 0xff;
  P2->DDR = 0xff;
  P5->DDR = 0xff;

  delay (100000);
  SCI_PRINTF ("hello world. mode=%x\n", *MDCR);
  check_ram (ADDR1M_AREA4_START, ADDR1M_AREA_SIZE);
  check_ram (ADDR1M_AREA5_START, ADDR1M_AREA_SIZE);


  while (/*CONSTCOND*/1)
    asm volatile ("sleep");
}

int
rand ()
{
  static int r = 1;

  r = r * 1103515245 + 12345;
  return r & 0x7fffffff;
}

int
__mulsi3 (uint a, uint b)
{
  int r = 0;

  while (a)
    {
      if (a & 1)
        r += b;
      a >>= 1;
      b <<= 1;
    }

  return r;
}

void
check_ram (uint32_t start, uint32_t size)
{
  uint32_t end = start + size;
  uint8_t *page;
  int i, chunk, x;
  uint32_t s;

  SCI_PRINTF ("Checking RAM...0x%x size %dKB\n", start, size/1024);

  for (chunk = size; chunk > 2; chunk >>= 1)
    {
      SCI_PRINTF ("test chunk %d...", chunk);
      for (s = start; s < end; s += chunk)
	{
	  page = (uint8_t *)s;
	  x = rand ();
	  for (i = 0; i < chunk; i += 4)
	    *(volatile int *)(page + i) = (x ^ i);
	  for (i = 0; i < chunk; i += 4)
	    if (*(volatile int *)(page + i) != (x ^ i))
	      goto bad;
	  x = rand ();
	  for (i = 0; i < chunk; i += 4)
	    *(volatile int *)(page + i) = (x ^ i);
	  for (i = 0; i < chunk; i += 4)
	    if (*(volatile int *)(page + i) != (x ^ i))
	      goto bad;
	}
      SCI_PRINTF ("OK\n");
    }
  SCI_PRINTF ("success.\n");
  return;
 bad:
  SCI_PRINTF ("failed.\n");
  return;
}
もう一つSRAMモジュールを作りました。連結ソケットを使って亀の子にできるようにしてあります。CS#だけパターンカットして別配線に。それ以外のラインは共有できるので、亀の子していけばさらに増設できます。
1列の連結ソケットが手に入ればよかったのだけど、探せなかったので二列の端を 切って使っています。
これはCS5につないで合計256KB増設しました。



ここでこのままがつがつ進めていきたいところだけど、グッと押さえて開発機 を開発するまでの環境を整備。例によって廃棄PCケースから切り出した鉄板で ケースを作りました。ここまでやっておかないとターンアラウンドタイムにイ ライラすることになる。プラプラした接点が外れてハンダ付けなんてことにも なるし。

ちょっと変わったケースの展開なのは、ひっくり返すとそのまま基盤のハンダ 付け作業ができるように、こうしてみました。
VccとGNDはCPUボードを囲むように最初からスズメッキ線で配線しておくべきだっ た。プルダウンとかプルアップの時にとても使う。

この開発機についているおびただしい量のスイッチは、断腸の思いでこれから 取り外しました。

コナミの必殺技コマンダーをHORIのジョイスティックに組みこんで、プログラム用のスイッチや同時押しボタンを付けたもの。これで、龍虎の拳の超必殺技もボタン一発!という「テクの無さはマシンでカバー」という僕のモットーを具現化した ジョイスティック。
せっかく作ったし...と、捨てずに残しておいたのだけど、もう使うこともない しね。
ちょっと名残り惜しいので写真に残しておきます。