あーさん日記

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

勝手に私信

あの話。自分は全く知らないのでコメントできなかったりします。
とはいうものの、無反応というのも悪い気がするので素人ながら書かせていただきました。
参考にならない可能性が高いので先に謝らせていただきます・・・(汗。


オプティマイズさんからの転記なので部品は4点。
1. GBA_BUS
2. MBM29LV800TA-90
3. XC9572XL10TQ100
4. PIO_PORT


GBA_BUS。写真みたら基板を起こしてるので、いきなり高難易度です。
PIO_PORTは写真に写っているようにピンの集合体。デバッグ用?
MBM29LV800TA-90は検索するとFujitsuフラッシュメモリ(8Mbit)にヒットします。
XC9572XL10TQ100はXilinxCPLDっぽいですね・・・。配線多すぎ・・・。


僕ならどう勉強していくか・・・。とりあえずいきなり突撃するのはやめときます。
CPLD焼いて、配線つないで、簡単ラクチン!ってことはないかなあ・・・。


配線ミスもあるから特定できないといけないし、
どんなデータが流れているか把握もしないといけないです。
この1台を作る以外にも、実機とROMの通信ログを取得する環境はほしいところ。


えーなので、まず、GBAは諦めます(ぉ。
最初はもっと単純なファミコンGameboyのDumpプログラムから始めると思います。
http://hongkongarduino.web.fc2.com/
https://github.com/drhelius/arduinogameboy


最初は大きさを無視してB5サイズぐらいに広げて、ミスしないように
どうやって配線するか知恵を絞りそうです。


ここでも厳しそうならこちらの1冊を。
部品代こみこみで1万円ぐらいは投資で必要ですけど。
https://www.amazon.co.jp/dp/4062578913/
モニタ、キーボードなしLAN接続のSSH環境がオススメです。


僕はraspberry pi の本しか持っていないので
類似した本をArduinoで探すのもいいと思います。


最後に海外の大御所のリンクです。
http://reinerziegler.de/GBA/gba.htm

Arduboy 実験36

fizzbuzzまで行きました・・・。いやー長かったです。


■メモ
arduinoのbufferを64byteから256byteに増やす - Qiita

・HardwareSerial.h
Serial.println(SERIAL_RX_BUFFER_SIZE, DEC);	// 64
Serial.println(SERIAL_TX_BUFFER_SIZE, DEC);	// 64

・USBAPI.h
Serial.println(SERIAL_BUFFER_SIZE, DEC);	// 64

HardwareSerialは上記2つ。Serialは3つ目だけを使用。
Serialだけしか使っていないのであんまり稼げないかな・・・。

Arduboy 実験35

フレームバッファを一切使わないで描画できるか調べてみました。
結論からいうと条件付きでできるものの、かなり微妙です。


簡単な擬似コードを書くと以下のようになります(SSD1306.pdf p34)。

void OledDrawDot(u8 x, u8 y)
{
	// set page Addressing Mode
	// 中略


	// command mode
	*pCs |=  csMask;
	*pDc &= ~dcMask;
	*pCs &= ~csMask;

	SPI.transfer(0xB0 | (y /  8));	// page start address
	SPI.transfer(0x00 | (x % 16));	// lower start column address
	SPI.transfer(0x10 | (x / 16));	// upper start column address


	// write mode
	*pCs |=  csMask;
	*pDc |=  dcMask;
	*pCs &= ~csMask;

	u8 s = これから書き込む縦8ドット分の現在の情報;	// ※注

	SPI.transfer((1 << (y % 8)) | s);
}

1回の書き込みは縦8ドット単位。問題は、変数sを用意できないことです。
SPI通信の場合、SSD1306のGDDRAMへ読み込みができません。

8.1.3 MCU Serial Interface (4-wire SPI) 
Under serial mode, only write operations are allowed.  

8.1.4 MCU Serial Interface (3-wire SPI)
Under serial mode, only write operations are allowed.  

Arduboyの接続が4か3かわからなかったので両方転記しました。どちらにしてもダメ。
たとえば

	OledDrawDot(0, 0);
	OledDrawDot(0, 3);

という順番で処理をすると、前に描画した0, 0のドットが消えます。
んー、8ドット単位づつの描画を許容するならいいですけど・・・。


あんまり役に立たない情報でした。

raspberry pi multiboot 実験2

wiringPiSPIでいけました。

#include <stdio.h>
#include <stdint.h>
#include <wiringPi.h>

void main(void)
{
	int r = wiringPiSPISetupMode(0, 100000, 3);
	printf("%d\n", r);

	uint8_t buf[4];

	printf("Looking for GBA\n");

	do
	{
		buf[0] = 0x00;
		buf[1] = 0x00;
		buf[2] = 0x62;
		buf[3] = 0x02;

		wiringPiSPIDataRW(0, &buf, 4);

		printf("r:0x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3]);
		usleep(10000);

	} while(buf[0] != 0x72 || buf[1] != 0x02 || buf[2] != 0x62 || buf[3] != 0x02);

	printf("Found GBA!\n");
}

mbedと比べてみると微妙に8bit目が長いです。とりあえず成功。
f:id:akkera102:20160520101221p:plain
ハマリポイントとしては待ち時間のところです。

usleep(1000000);

長すぎるとダメでした。