/*
    DRO interrupt asm    2010/1/25 PICasm テスト
    スリース デジタルノギス読込み

AVRのasm命令  (PICの命令はどうも覚えにくいので試して見ました)

指定したIOレジスタの任意のビットをセットしたりリセットしたりできます.
SBI,CBI
  sbi  P,n  ; Pのnビット目をセット(1にする)
  cbi  P,n  ; Pのnビット目をリセット(0にする)

指定したレジスタの任意のビットの状態によって,次の1命令をスキップします.
SBRS,SBRC
  sbrs  Rd,n  ; Rdレジスタのnビット目が1ならば1命令スキップ
  sbrc  Rd,n  ; Rdレジスタのnビット目が0ならば1命令スキップ
*/

unsigned long dsu_data1l absolute 0x20; // 32bit データ3bit右シフト用
unsigned int  dsu_data1  absolute 0x20;   // 16bit データ取り出し用
char dsu_data2 absolute 0x21;           // 24bit middle byte
char dsu_data3 absolute 0x22;           // 24bit higher byte
char dsu_count absolute 0x23;

//すこしでも解り易い様に命令の置き換え? PIC -> AVR
#define         CLK     0        // クロックビット
#define         DATA    1        // データビット
#define         sbi     bsf      // nビット目をセット(1にする)
#define         cbi     bcf      // nビット目をリセット(0にする)
#define         sbrs    btfss    // nビット目が1ならば1命令スキップ
#define         sbrc    btfsc    // nビット目が0ならば1命令スキップ

void test_asm(){
asm{
    cbi    STATUS,RP0      //set bank 0
    cbi    STATUS,RP1
// 1st byte ---
    movlw  8
    movwf  _dsu_count
LOOP1:
    rrf    _dsu_data1,1    //データを右ローテイト
L11:
    sbrs   PORTB,CLK       //クロックhiチェック hiになるのを待つ
    goto   L11
    sbrc   PORTB,DATA      //データビットチェック
    goto   L12             //データビットHi処理へ
    goto   L13             //データビットLo処理へ
L12:
    sbi    _dsu_data1,7    //データレジスタhiセット
    goto   L14
L13:
    cbi    _dsu_data1,7    //データレジスタloセット
L14:
    sbrs   PORTB,CLK       //クロックloチェック loになるのを待つ
    goto   L14
    decfsz _dsu_count,F    //8bit 読込み終り?
    goto   LOOP1

// 2st byte ---
    movlw  8
    movwf  _dsu_count
LOOP2:
    rrf    _dsu_data2,1
L21:
    sbrs   PORTB,CLK       //btfss  Low -> High then NEXT inst
    goto   L21
    sbrc   PORTB,DATA      //btfsc  set DATA
    goto   L22
    goto   L23
L22:
    sbi    _dsu_data2,7    //bsf  data hi set
    goto   L24
L23:
    cbi    _dsu_data2,7    //bcf  data lo set
L24:
    sbrs   PORTB,CLK       //High -> Low then NEXT inst
    goto   L24
    decfsz _dsu_count,F
    goto   LOOP2

// 3st byte ---
    movlw  8
    movwf  _dsu_count
LOOP3:
    rrf    _dsu_data3,1
L31:
    sbrs   PORTB,CLK       //btfss  Low -> High then NEXT inst
    goto   L31
    sbrc   PORTB,DATA      //btfsc  set DATA
    goto   L32
    goto   L33
L32:
    sbi    _dsu_data3,7    //bsf  data hi set
    goto   L14
L33:
    cbi    _dsu_data3,7    //bcf  data lo set
L34:
    sbrs   PORTB,CLK       //High -> Low then NEXT inst
    goto   L34
    decfsz _dsu_count,F
    goto   LOOP3

  }
  dsu_data1l=dsu_data1l >> 3; //data1,2,3 3bit sgift
}
void main(){
     test_asm();        // 前半24bit
     test_asm();        // 後半24bit
}