あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

リハビリ1

例の移植、少しコードを書きました。
script.hを書くだけで2時間とかダメダメですねえ。


そういえば誰にいっているか不明な話を1つ。
えーと、なんで8ad使っているかという話ですけど、それ以外選択肢がなかったからです。
oggデコーダあれば使用していたのですけどコードがオープンでないというか。
昔、pogoshell pluginであったのは確認しているのですけどね。


oggの知識があって、GBAの仕様を把握して、かつコードを公開してくれるって
2018年ではレアすぎます。そこまでパワーある人ってgithub上でもいないというか。
あとmodかmmlと絡めてドライバ開発本とか書いてくれないかなーとか。


GBA開発は直線的にゲーム作りが進むかというとそうではなくて、
自分なりにテストコード書いて確認する作業もいるしで前に進みずらいですねえ。

raspi環境の整え GBA xxブート

■PC側
共有フォルダ経由でコピー。

copy test.gba \\raspberrypi\pi\multiboot\test.gba


■raspi側
1秒おきに監視。ファイルが更新されたら自動起動

#!/bin/sh


echo "multiboot watch..."
last=`ls --full-time test.gba | awk '{print $6"-"$7}'`

while true; do
        sleep 1
        current=`ls --full-time test.gba | awk '{print $6"-"$7}'`

        if [ $last != $current ] ; then
                echo ""
                echo "updated: $current"
                last=$current
                ./multiboot test.gba
        fi
done


GBA
電源入れなおし。


raspi 3 b+。wifiも内蔵されてますしraspi-configで設定できるしで
すごい簡単になりましたねー。


参考リンク:
ターミナルでサクッとファイル監視して自動実行させるスクリプト

FLASH(SST39VF040)メモ

9/27 少しコードを直しました。
f:id:akkera102:20180925224857p:plain
・書き込みコマンドにnopは必要みたいです。ない場合はうまくいきませんでした。
・EWRAMで作りましたけどIWRAMだとウェイトでうまくいかないかもしれません(特にnop部分)。
 ID取得に0xffが帰ってきたらもっとウェイトが必要です。
・セーブ個数はセクタ単位(0x0 - 0xf)なので1+15個(フラグ管理+しおり)が妥当のようです。
・1セクタ0x1000バイト。容量多くて助かります。
・REG_WSCNT = 0x4317(8 cycles)
・データーシート http://ww1.microchip.com/downloads/en/DeviceDoc/20005023B.pdf


宿題ようやく終わりました・・・たぶん。

#include "flash.h"
#include "libmy/bg.h"

//---------------------------------------------------------------------------
EWRAM_CODE void FlashInit(void)
{
	BgDrawScreen();
	BgDrawStrCls();

	BgDrawStr(0, 0, "MemoryBackupCubic Test");
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashExec(void)
{
	if(FlashIsExist() == FALSE)
	{
		for(;;){}
	}

	BgDrawPrintf(2, 1, "Type : Flash");
	BgDrawPrintf(2, 2, "Id   : %x", FlashGetId());

	BgDrawPrintf(2, 4, "Erase 0, 1, 2");
	FlashEraseSector(0);
	FlashEraseSector(1);
	FlashEraseSector(2);

	FlashByte(0x0000, 1);
	FlashByte(0x0001, 2);
	FlashByte(0x0002, 3);

	FlashByte(0x1000, 4);
	FlashByte(0x1001, 5);
	FlashByte(0x1002, 6);

	FlashByte(0x2000, 7);
	FlashByte(0x2001, 8);
	FlashByte(0x2002, 9);

	BgDrawPrintf(3,  5, "%x %x %x", FlashRead(0x0000), FlashRead(0x0001), FlashRead(0x0002));
	BgDrawPrintf(3,  6, "%x %x %x", FlashRead(0x1000), FlashRead(0x1001), FlashRead(0x1002));
	BgDrawPrintf(3,  7, "%x %x %x", FlashRead(0x2000), FlashRead(0x2001), FlashRead(0x2002));

	BgDrawPrintf(2,  8, "Erase 1");
	FlashEraseSector(1);

	BgDrawPrintf(3,  9, "%x %x %x", FlashRead(0x0000), FlashRead(0x0001), FlashRead(0x0002));
	BgDrawPrintf(3, 10, "%x %x %x", FlashRead(0x1000), FlashRead(0x1001), FlashRead(0x1002));
	BgDrawPrintf(3, 11, "%x %x %x", FlashRead(0x2000), FlashRead(0x2001), FlashRead(0x2002));

	BgDrawPrintf(2, 12, "Erase Chip");
	FlashEraseChip();

	BgDrawPrintf(3, 13, "%x %x %x", FlashRead(0x0000), FlashRead(0x0001), FlashRead(0x0002));
	BgDrawPrintf(3, 14, "%x %x %x", FlashRead(0x1000), FlashRead(0x1001), FlashRead(0x1002));
	BgDrawPrintf(3, 15, "%x %x %x", FlashRead(0x2000), FlashRead(0x2001), FlashRead(0x2002));

	BgDrawPrintf(2, 16, "Done");
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashByte(u16 adr, u8 dat)
{
	// Byte-Program
	FlashWrite(0x5555, 0xAA);
	FlashWrite(0x2AAA, 0x55);
	FlashWrite(0x5555, 0xA0);
	FlashWrite(adr, dat);

	FlashWait20us();
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashEraseChip(void)
{
	// Chip-Erase
	FlashWrite(0x5555, 0xAA);
	FlashWrite(0x2AAA, 0x55);
	FlashWrite(0x5555, 0x80);
	FlashWrite(0x5555, 0xAA);
	FlashWrite(0x2AAA, 0x55);
	FlashWrite(0x5555, 0x10);

	FlashWait100ms();
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashEraseSector(u16 sec)
{
	_ASSERT(sec < 0x10);


	// Sector-Erase
	FlashWrite(0x5555, 0xAA);
	FlashWrite(0x2AAA, 0x55);
	FlashWrite(0x5555, 0x80);
	FlashWrite(0x5555, 0xAA);
	FlashWrite(0x2AAA, 0x55);
	FlashWrite(sec * 0x1000, 0x30);

	FlashWait25ms();
}
//---------------------------------------------------------------------------
// SST39VF010 : BF D5
// SST39VF020 : BF D6
// SST39VF040 : BF D7
EWRAM_CODE u16 FlashGetId(void)
{
	// ID Entry
	FlashWrite(0x5555, 0xAA);
	FlashWrite(0x2AAA, 0x55);
	FlashWrite(0x5555, 0x90);

	// Read ID
	u8 id0 = FlashRead(0x0000);
	u8 id1 = FlashRead(0x0001);

	// ID Exit
	FlashWrite(0x5555, 0xAA);
	FlashWrite(0x2AAA, 0x55);
	FlashWrite(0x5555, 0xF0);

	return id0 | (id1 << 8);
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashWrite(u16 adr, u8 cmd)
{
	u8* p = (u8*)SRAM + adr;

	*p = cmd;

	__asm("NOP");
}
//---------------------------------------------------------------------------
EWRAM_CODE u8 FlashRead(u16 adr)
{
	u8* p = (u8*)SRAM + adr;

	u8 ret = *p;

	return ret;
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashWait20us(void)
{
	for(vu32 i=0; i<400; i++)
	{
		// 1週 大雑把に0.0625us(1clk = 16Mhz)
		__asm("NOP");
	}
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashWait25ms(void)
{
	for(vu32 i=0; i<3; i++)
	{
		// 1週 16.743ms
		while(REG_VCOUNT >= 160) {};
		while(REG_VCOUNT <  160) {};
	}
}
//---------------------------------------------------------------------------
EWRAM_CODE void FlashWait100ms(void)
{
	for(vu32 i=0; i<10; i++)
	{
		// 1週 16.743ms
		while(REG_VCOUNT >= 160) {};
		while(REG_VCOUNT <  160) {};
	}
}
//---------------------------------------------------------------------------
EWRAM_CODE bool FlashIsExist(void)
{
	u8 t1 = FlashRead(0x7FFF);
	u8 t2 = ~t1;

	FlashWrite(0x7FFF, t2);

	if(FlashRead(0x7FFF) != t2)
	{
		FlashWrite(0x7FFF, t1);

		return TRUE;
	}

	return FALSE;
}

さらに追記:
リハビリ14 - GBAプログラミング跡地

カードリッジのセーブ種類の見分け方

http://gb1gbc1.tripod.com/gba/gba_save.htm

・大体の見分け方(GBA)
ソフトの端子部分を下から覗いて、
基盤の刻印に「AGB-*02」「AGB-*03」「AGB-*11」とあるものは電池なし。
「AGB-*05」「AGB-*06」とあれば基本的にボタン電池入り。
「AGB-*05」の方は時計用?
(Nintendo)から始まる物で「AGB-*05」「AGB-*06」を含む物は現状なし。
量が少ないので断定は出来ませんが、「AGB-*01」はセーブ機能なし。
「AGB-*02」はFLASH、「AGB-*03」はEEPROM、「AGB-*11」はFRAM。
特殊センサーなどが入っているソフトは上記とはまた異なる模様。

Y型ドライバーを使ってソフトを開けると、
基板のどこかに「SRAM FLASH EEPROM FRAM」と書いてあるのでこちらの方が確実です。

私信2

すみません。。拡張ボード回路図を見つつテスターで当てていったら
WR(スロットとボードの半田部分)が繋がっていないことがわかりました。
保障吹っ飛ばしていいので半田つけなおしていいですか?


追記:
治りました。完璧です!


市販は読み込みができるからという妄信で
開発カードリッジを疑ってしまったのが間違いでした。
ほんと申し訳ないです。


コードを追いかけていたら市販の読み込みにWRは使ってなく、
開発カードリッジのromとsav、あと市販のsavは使っていることを
発見したら案の定でした。orz


ビバ、オープンソースです。
数日間お付き合いいただいてありがとうございました!


せめてWRではなくアドレス関係だったらもっと早くわかったのに・・・
というのは愚痴です。(笑
他にテストコマンドがあるのでしたらおっしゃってください。

■raspberry pi b+ -> raspberry pi 3 b+に変更


■開発
pi@raspberrypi:~/cube/raspiadvrw-master $ sudo rpa -c
Main ROM mode =>
  Cartridge type:  Cubic Flash Cartridge
  Size:            256 Mbit


pi@raspberrypi:~/cube/raspiadvrw-master $ sudo rpa -s
(中略)
Backup memory mode =>
  Memory type:  Cubic Flash
  Size:         64 KB


■市販
pi@raspberrypi:~/cube/raspiadvrw-master $ sudo rpa -c
Main ROM mode =>
  Cartridge type:  MASK ROM
  Game title:      MR. DRILLER2


pi@raspberrypi:~/cube/raspiadvrw-master $ sudo rpa -s
(中略)
Backup memory mode =>
  Memory type:  Sram(Fram)
  Size:         32 KB


pi@raspberrypi:~/cube/raspiadvrw-master $ sudo rpa -s -T
Backup memory mode =>
  Memory type:  Sram(Fram)
  Size:         32 KB
BACKUP MEMORY TEST START=>
[##################################################] 100%
[##################################################] 100%
BLANK TEST error:0
[##################################################] 100%
WRITE 0xAA TEST error:0
[##################################################] 100%
[##################################################] 100%
WRITE 0x55 TEST error:0
[##################################################] 100%
BACKUP MEMOEY TEST is Sucess

私信

#256k FRAM AGB-Y11-01 Riviera(基盤を見て確認済み)
pi@raspberrypi:~/cube/raspiadvrw-master $ sudo ./rpa -c
Main ROM mode =>
dev code 0: 002e
dev code 1: ea00
dev code 2: 52a3
dev code 3: 19be
dev code 0: 002e
dev code 1: ea00
dev code 2: ff24
  Cartridge type:  MASK ROM
  Game title:      RIVIERA
pi@raspberrypi:~/cube/raspiadvrw-master $ sudo ./rpa -s
Raspberry Pi ADVANCE Reader Writer v.1.11
Copyright (C) 2018 CUBIC STYLE

rpa [-w gbarom] [-r dstfile] [-l size] [-L size(MB)]-c [-a address]
        -s                      Backup memory mode (Sram, Fram, Flash, ...Not yet supported EEPROM)

        -c                      ROM info
        -r <filename>           Read ROM(or backup memory)
        -w <filename>           Write ROM(or backup memory)
        -e                      block erase
        -E                      chip erase
        -B                      blank check
        -d                      dump
        -a                      rom address
        -b                      block address
        -n                      erase block num
        -h                      this help

Backup memory mode =>
dev code 0: df
dev code 1: a0
dev code 0: df
dev code 1: a0
dev code 0: df
dev code 1: a0
cartridge can not be detected or not supported.


#256k SRAM AGB-E06-01 ミスタードリラー2
pi@raspberrypi:~/cube/raspiadvrw-master $ sudo ./rpa -c
Main ROM mode =>
dev code 0: 002e
dev code 1: ea00
dev code 2: 52a3
dev code 3: 19be
dev code 0: 002e
dev code 1: ea00
dev code 2: ff24
  Cartridge type:  MASK ROM
  Game title:      MR. DRILLER2
pi@raspberrypi:~/cube/raspiadvrw-master $ sudo ./rpa -s
Raspberry Pi ADVANCE Reader Writer v.1.11
Copyright (C) 2018 CUBIC STYLE

rpa [-w gbarom] [-r dstfile] [-l size] [-L size(MB)]-c [-a address]
        -s                      Backup memory mode (Sram, Fram, Flash, ...Not yet supported EEPROM)

        -c                      ROM info
        -r <filename>           Read ROM(or backup memory)
        -w <filename>           Write ROM(or backup memory)
        -e                      block erase
        -E                      chip erase
        -B                      blank check
        -d                      dump
        -a                      rom address
        -b                      block address
        -n                      erase block num
        -h                      this help

Backup memory mode =>
dev code 0: 0b
dev code 1: 04
dev code 0: 0b
dev code 1: 04
dev code 0: 0b
dev code 1: 04
cartridge can not be detected or not supported.

何回かやっているうちに一回のみ
ミスタードリラー2のセーブデータが認識しました。

Backup memory mode =>
  Memory type:  Sram(Fram)
  Size:         32 KB

うーん。別のraspberry piで試してみます。


追記:
他のraspberry pi b+でも結果は同じでした。
一回だけ認識したのはなんだったのか・・。
まとめると以下の状態です。

■市販
ROM 認識する。吸出しOK
BAK 認識しない
■開発用
ROM 認識しない
BAK 認識しない