2012-07

2012-06 FM3 RX62N SH2A Android


7月


持ち越し案件

  • USBオシロみたいな奴。 --- 実は済んでなかった。
  • MinGWクロスgccのビルド。
  • STM32F4で何か --- 何もしていない。





まだやってる。Android-x86

VMware PlayerでAndroid ICS(インストール編)

  • 上記URLを参考に、本家x86サイトのandroid-x86-4.0-RC1-eeepc.iso を使ってもいちどやってみたところ、
  • LANは使えるようになった。

問題は、

  • (1)SDカードは認識しない。
  • (2)マーケットのアカウントが作れない。(既存アカウントの入力も出来ない)黒い画面のまま。
  • (3)プライベートなhtmlページに貼り付けたapkのダウンロードも永遠に終わらない。

単に(1)が原因なだけかもしれない。
VirtualBoxは嫌いだから使ってないけど、VBox版だとどうだっけ?もう覚えてない。


  • そんなに頑張らなくても、いまやx86ネィテイブOpenGLありのバイナリー付きの純正SDKもあるんだけど。
  • だけど、SDKに付いてるAndroidは、どういうわけか使いにくいんだよね。なんでだろ。
  • Android-x86サイトは更新止まってるっぽいなー。





ATtiny2313でCUI時計を製作中。

  • CUI時計?聞き慣れない名前だ。
  • こんな奴
       TIMER OUT
         |
+---------------+
つ ATtiny2313   |
+---------------+
   (Xtal)
 ||
 |\-------------- TxD
 \--------------- RxD
  • ATtiny2313にはXtalだけを実装。
  • USART経由で時刻を知ったり、設定したりする。
  • 指定した時刻になるとTIMER OUTにシグナルを送る(目覚まし)


  • Xtalは3.58MHzを使用したけれど、4MHzとか8MHzでもOK。
  • CLKPRを制御して、3.58MHz/128=27kHz程度で動作させる。
  • 0.1秒程度の頻度でタイマー割り込みを設定しておき、割り込み処理内で時計を実装しておく。
  • メインルーチンは、スタンバイ状態にしてSLEEP命令を実行させる。
  • Xtalやその分周比の都合で、正確な0.1秒が得られないので、一定回数の割り込みごとに進み遅れの補正が行なえるようにする。(n回分の割り込みに対して、1回だけ0.1秒の加算を省略、あるいは追加する)


  • TxD/RxD経由で(低いボーレートで)時計合わせと目覚まし時刻設定をする。
  • 毎朝目覚まし時間になると、電気機器などの起床あるいはサイレン発生などをトリガーする。
  • 電源は、乾電池、スーパーキャパシタ、あるいはNiMHなどの蓄電池。
  • 消費電流はスタンバイ状態で100〜300μA程度になった。

うーん、もう一声。

  • ていうかスーパーキャパシタ0.1Fで10分持たないんだよ〜。何とかして!


とりあえず出来たので公開:





RETROF-16のエミュレータを製作中です。

retrof-16とは?

  • duo6750さんが作成中の(21世紀に実在する)
  • TTLのみで作るコンピュータです。
  • 下記サイトに詳細があります。


ダウンロードはこちら

実行例写真

/ATMEL_AVR/upload/R16/r16sim.png


出来てるところ

  • Windows/Linux上のgcc/makeでビルドできる。
  • なんとなく命令セットをエミュレートしているように見える。
  • 逆アセンブルもする。
  • GUIっぽいものを追加しました。←ここが新しいところ
    • SPACEキーを押すと実行速度を変えられます


出来てないところ

  • バイナリーファイルのロードとかがない。---実装済み
  • アセンブラがない。 ---作成済み.
  • 入出力系の実装がない。 ---LEDとトグルSWを実装
  • フレームバッファの表示が無い。---実装。




R16用アセンブラを書き始めました。

  • (流用するための)Z80用のアセンブラとして使えそうなものは・・・
    • sdcc に付属しているもの。
    • ASxxxx Cross Assemblers (リンク先不明)
  • どちらもリロケータブルオブジェクトを生成してlinkという感じです。
  • ASxxxx はz80のほかに6502とか6800とか過去の8bit CPUを網羅する勢いのクロスアセンブラだったのですが、 現在の入手先が分かりません。
  • なので、とりあえずスクラッチから書き始めることにしました。


ダウンロード


  • R16 asmソースを入力して、バイナリーとリストを出力します。
  • バイナリーは常に0番地から始まるイメージです。




文法?

  • なんか6800風に作っていたのですが、どうやら違うみたいです。
  • z80風?
     LD 10   (これが即値?)
     ST R255 (Reg8 実際は6800のゼロページ $ff みたいなもの)
     LD *R10 (Reg8間接)

では、JMPは?

 JMP 10     (即値風だが、番地指定)
 JMP $1234  (Imm16をPCに代入する)
 JMP R15    (Reg8間接ということ?)
 JMP *R15   (Reg8の二重間接?)

ここまでは理解できるとして、Abs,PC+Rel,PC-Rel,PC+Rel+Cは?

 JMP +10    (PC相対で+10番地先)
 JMP -10    (PC相対で-10番地先)
 JMP +R14   (PC相対で Reg8番地先)
 JMP -R14   (PC相対で-Reg8番地先)
 JMP +*R15   (PC相対で [Reg8]番地先)
 JMP -*R15   (PC相対で-[Reg8]番地先)
 JMP C+*R15   (PC相対でC+[Reg8]番地先)





今週のお悩み相談室

  • R16に関しては・・・
  • アセンブラにマクロ機能は必須だと思う。
  • 定数式のサポートも必須だと思う。
  • duo6750さんの言っている簡易C言語のようなものはずいぶん昔(1985年くらい)に作ったやつがあって それはasm16.zipのサブディレクトリに入れておいた。
  • こんなやつ
main()
{
	r8=1;
	sub();
	if(r15 >= 4) {
		r3++;
	}
}

sub()
{
	r4=r5;
	r4+=r6;
}

main:
       mov     r8,1
       call    sub
       cp      r15,4
       jc      __el000
       inc     r3
__el000:
       ret
sub:
       mov     r4,r5
       add     r4,r6
       ret
  • これはz80用と8086用があって、実用にしていた。
  • r16用にするためには上記のマクロアセンブラがないと無理。
  • それから、マクロアセンブラがあっても、命令にcall/retがないと無理。

昔、call/retの無いCPU(SC/MP-IIのこと)を使い倒していた時期があって、ソフトウェア的なcall/retを実装したことがあったけれど、かなり効率悪かった。

  • 結局悟ったのは、ミニコン方式のBAL(Branch and Link)命令で戻り先を示す汎用レジスタ(r4とかそんなやつ)を
  • サブルーチンの先頭でstaticな固定アドレスに保存しておいて、リターン時にその固定アドレス間接でjmpするしかない。
  • ってことだ。

SC/MP-II語で書くとこんな感じ。

  • 呼び出し
     LDI subr_hi   (accにサブルーチンアドレスの上位即値を入れる)
     XPAH P3       (accとP3Hを交換)
     LDI subr_lo
     XPAL P3
     XPPC P3       (PCとP3を交換)
  • 呼び出された側
    ra_save: DW 0
    subr:
     XPAH 
     ST  ra_save+1(PC)  (PC相対アドレッシングしか存在しないこの屑CPU)
     XPAL
     ST  ra_save(PC)
      .... サブルーチンの処理.
    
     #戻りたい.  
     LD  ra_save+1(PC)
     XPAH P3
     LD  ra_save(PC)
     XPAL P3
     XPPC P3       (PCとP3を交換)

上に書いた命令のすべては、z80では

 call subr
 ret

の2命令で済むってことが分かって、SC/MP-IIを捨てた。

全部、時間の無駄、クロックの無駄、人生の無駄。






とか、言いつつ、作ってしまった。

ダウンロード:

上記のような文法を受け入れるC風言語アセンブラです。

アセンブラ側にマクロ機能を実装すべきところを、今のところ手抜きしてハードコーディングしてあります。

ソースはどれも短いので、適当に改造してください。

実行例)

/*
 ===========================================
 *	RETROF-16 Sample Program
 ===========================================
 */

//==========================================
	org(0);
	jmp(_start);	// 100番地へjmp.
//==========================================
	org(0x100);
_start:
	r15=0x100;	// Set Stack.
//==========================================
	r4=0;	// VRAM書き込みポインタ.
	r5=0;	// VRAM書き込みデータ
	do {
		do {
			ld(r5);
			#stv *r4

			r4++;
			and(0x1f);	// ポインタが32の倍数?
			if(z) {
				r5++;	// 書き込みデータを+1
				out(r4);// LEDの表示データ.
			}
		}while(r4 != 65527); //最後の7dotは書かない.
		r4=0;			// ポインタを0に戻す.
	}while(1);

//==========================================
//	以下の関数は未テスト(実行されない)
//==========================================
main()
{
	r8=1;
	sub();
	if(r15 >= 4) {
		r3++;
	}
}

sub()
{
	r4=r5;
	r4+=r6;
	r4-=3;
	r4-=267;
	sub(300);
	and(ffffh);
	r4|=0x1fff;
	r4&=0x55aa;
}
  • マクロ処理&アセンブル結果
0000:                                            org  0 
0000:04ff                                        jmp  _start 
0100:                                            org  0100h 
0100:                                 _start:          
0100:b000 0100 d40f                              mov  r15,0100h 
0103:8000 d404                                   mov  r4,0 
0105:8000 d405                                   mov  r5,0 
0107:                                 __do000:         
0107:                                 __do001:         
0107:9005                                        ld   r5 
0108:e204                                        stv  *r4 
0109:9004 8801 d404                              inc  r4 
010c:8a1f                                        and  01fh 
010d:4504                                        jne  __el002 
010e:9005 8801 d405                              inc  r5 
0111:d604                                        out  r4 
0112:                                 __el002:         
0112:b000 fff7 9c04                              cp   r4,65527 
0115:490f                                        jne  __do001 
0116:                                 __od001:         
0116:8000 d404                                   mov  r4,0 
0118:0812                                        jmp  __do000 
0119:                                 __od000:         
0119:                                 main:            
0119:900f 8c01 d40f 900e 8801 e40f               enter  
011f:8001 d408                                   mov  r8,1 
0121:d80e 040d                                   call sub 
0123:8004 9c0f                                   cp   r15,4 
0125:4603                                        jc   __el003 
0126:9003 8801 d403                              inc  r3 
0129:                                 __el003:         
0129:a00f d40e 900f 8801 d40f 3000 000e            leave  
0130:                                 sub:             
0130:900f 8c01 d40f 900e 8801 e40f               enter  
0136:9005 d404                                   mov  r4,r5 
0138:9004 9806 d404                              add  r4,r6 
013b:9004 8c03 d404                              sub  r4,3 
013e:9004 bc00 010b d404                         sub  r4,267 
0142:bc00 012c                                   sub  300 
0144:ba00 ffff                                   and  ffffh 
0146:9004 b600 1fff d404                         or   r4,01fffh 
014a:9004 ba00 55aa d404                         and  r4,055aah 
014e:a00f d40e 900f 8801 d40f 3000 000e            leave  


SYMBOL LIST:
                 = 334	(0x14e)
__od000          = 281	(0x119)
__od001          = 278	(0x116)
__do000          = 263	(0x107)
__do001          = 263	(0x107)
__el002          = 274	(0x112)
__el003          = 297	(0x129)
sub              = 304	(0x130)
main             = 281	(0x119)
_start           = 256	(0x100)





Raspberry Piに最適化した「Raspbian」OSリリース、Webブラウズデモ(動画)

engadget

ただし Dom 氏はRasberry Pi をオーバークロックして、もともと700MHzのところを1GHz で動かしています。
オーバークロックは保証の範囲外。
  • おいおい。
  • オーバークロックはいいが、メモリーが256MBから足せない問題をまず何とかしてくれたまえ。


  • しかし、改造OSが出るまでハードウェア浮動小数が無効だったなんて・・・。
  • アーキテクチャーがARM11なので、Thumb-2命令セットは使用できない。Classic ARMな命令セットを使うしかない。(Thumbだとやや遅くなる)





楽天Kobo TouchのLinux

中身はARMなLinux

内部メモリーは市販のマイクロSDらしい。


  • ちょっとだけ遊べそうなんだけど、こないだ買ったEPC-IIにubuntu入れて1日で飽きて、それ以来全く起動すらしていない。電池も完全に切れたまま。
  • なので、反省して、この手のガジェットには手を出さないこととした。
  • AndroidやiPadがPCの代わりになる?・・・なわけがない。開発に使えない*1。エディタも使えない*2。中途半端なOS*3。キーボードすら無いし*4
  • EPC-IIは飽きたら玄箱の代わりにWebサーバーにするつもりだったんだけど、HDD容量的に玄箱代わりは無理なのでやめた。*5





安物メモリー買いのデータ失い。

まあ、べつにデータ失っちゃいないけど。

  • KINGMAXのmicroSD(16GB)が799円と特価だったので買ってみた。
  • mp3を適当にコピーしてmp3プレイヤーに入れようとしたところ、ベリファイエラー多発。2曲のうち1曲くらいの割合でコンペアエラーする。
  • しかたないので、Windowsからフォーマット。したけれど、フォーマットが延々と時間掛かって終わらない。
  • 気が短いので、カード抜いてもう一度フォーマットしようとしたけど、ディレクトリが化けたままで二度と書き込みできない体になった。
  • Linuxから、
    # dd if=/dev/zero of=/dev/sdc count=1
  • これすら、まともに実行できない。やったところで抜き差ししたら元の化けディレクトリに戻る。つまり書込み禁止状態になってる感じ。


  • 次の日、同じ店に行って、こんどはTranscendの8GB(特価399円)×2を買ってきた。
  • 何故って、その日は16GBが899円だったのよ。KINGMAXは跡形も無かった。


  • Transcendの8GBは2枚とも良品だった。
  • 8GBあれば、ubuntuは楽勝で入るし、mp3なら(1曲4MB平均で)2000曲入る。CD100枚相当か。物理的にスケールおかしいんじゃないのか。

どーでもいいけど、microSDメモリー安すぎ。

  • kobo Touch の内蔵Flashとか中華Padの内蔵Flashの中身が、そのまんまmicroSDだったりするのも頷ける。






*1 何を開発するかにもよる。Arduinoのコマンドラインビルドならなんとかなるかな。
*2 ubuntu入れればviとかemacsは使える。ただ、メモリーが300MB程度しか使えない(ハードウェア上は512MB)GUIはVNC経由の描画なのでとても使えたもんじゃない
*3 そう、よくハングするらしい。アンドロイドは。電源入らなくなってリセットとかもあるらしい。
*4 EPC-IIには英語キーボードがちゃんと付いている。が一般的にはAndroidやiOSはキーボードなし
*5 じゃなくって、環境移行するのが面倒なのと、玄箱がちゃんと動いているのでその必要が無かった。