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に全く流用できないだろうということだけは分かったつもり。
 


