投稿日: Mar 22, 2017 11:36:23 AM
i8080.inoにハードコーディングしたバイナリには含まれているのですがちょっと触れて置くことにする。
i8080エミュレータはcpuクラスとmachineクラスの2つで構成されてる。
cpuクラスは基本的にどの環境にもっていっても動く(はず)i8080そのもののエミュレータ。
そしてmachineクラスはターゲットとなるデバイスのI/Oを操作するためのもの。
i8080エミュレータからArduinoのI/Oにアクセスするにはi8080の命令、INとOUTを使います。
z80的に書くなら in a,(address)、out (address),aと言う感じになります。
このaddressがmachineクラスのなかではどの機能を呼び出すかというセレクタとして動く訳です。
8bitなので256個の機能をつけられるわけですねー。多いような少ないような。
i8080エミュレータにハードコーディングしてるblink.asmの一部抜粋。
9 ld a,00h ; portD select 10 out (0ffh),a ; set data 11 in a,(001h) ; get DDR D 12 and 03h ; pass UART 13 or 04h ; select PD2 14 out (000h),a ; set DDRD
Arduino、つまりATMega328のポートはPORTD、PORTC、PORTBの三つです。
それぞれmachineクラスでは0~2と番号をふって管理してます。
上のコードではPORTDを選択、0xffにOUTしています。
これがこれから扱うポートだよ、という指定になってます。
再び0xffにOUTするまではずっと同じポートが選択されます。
※PORTセレクトのI/Oアドレスは変更される可能性があります。
in a,(001h)これはDDRDのビットを取得、つまりArduinoのPORTDの方向レジスタをaレジスタへ。
0x02 (0b00000011) とANDしてシリアルのIN/OUTを保護、のちに0x04とORしてDigital 2番のピンをOUTにしています。そんな処理ですね。
TXDとD2がOUT、他はINに設定されるのです。
Arduino的に書くなら
uint8_t pd = DDRD; pd &= 0x03; pd |= 0x04; DDRD = pd;
こんな感じでしょうか。