PICgcc
PICとAVR-gccの1対1対応化による可能性†
- AVR-gccの吐き出すコードは基本r16〜r31までしか使わないので、PICのレジスタモデルをこうする。
+-------------+ | r16 | +-------------+ | r17 | +-------------+ | r18 | +-------------+ | r19 | +-------------+--- | r20 | +-------------+ | r21 | +-------------+ | r22 | +-------------+ | r23 | +-------------+--- | r24 | +-------------+ | r25 | +-------------+ | FSR0L | X +-------------+ | FSR0H | +-------------+--- | FSR2L | Y +-------------+ | FSR2H | +-------------+
+-------------+ | FSR1L | SP +-------------+ | FSR1H | +-------------+---
- WREGはr0ということにしよう。
- 常時0を入れておくレジスタはいらないので無視。
- r30,r31は取り除く。
- stackはFSR1を割り当てる。
- r16〜r25は固定番地(access-bank)に置く。(とりあえず0x0000番地から0x0009番地)
- 基本的にどちらも8bitMCUなので、1対1のコード変換が可能なはずだ。
.global memcpy8 .type memcpy8, @function memcpy8: mov r27,r25 mov r26,r24 mov r31,r23 mov r30,r22 .L7: subi r20,lo8(-(-1)) cpi r20,lo8(-1) breq .L6 ld r24,Z+ st X+,r24 rjmp .L7 .L6:
↓
memcpy8: movff r25,FSR0H movff r24,FSR0L movff r23,FSR2H movff r22,FSR2L .L7: movlw lo8(-(-1)) subwf r20,W ; r20-- movwf r20 movfw r20,W movlw lo8(-1) ; r20==(-1)? subwf r20,W bz .L6 movff POSTINC0,r24 movff r24,POSTINC2 goto .L7 .L6:
やっぱりすげーだめなコードだ。
PIC24はどうなっている?†
- PIC24Fは16bitレジスタが16本ある。(って、どっかで聞いたなぁ MSP430だっけ?)
- PIC16の時代から、このように作っておいてくれれば良かったんだよ。
- C30はgccベースらしい。
- PIC24のgccのmdがPIC18Fに全く流用できないだろうということだけは分かったつもり。