1: ;------------------------------------------------------------------------ 2: ;PSX_MOD_CHIP 3: ;------------------------------------------------------------------------ |
4: list P=12C508 5: radix dec 6: include "p12c508.inc" |
7: ;------------------------------------------------------------------------ 8: __FUSES _MCLRE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC 9: ;------------------------------------------------------------------------ |
10: cblock 0x07 11: i ;ループカウンタ 12: j ;ループカウンタ 13: k ;ループカウンタ 14: x ;ウエイトを作るときのループカウンタ 15: y ;ウエイトを作るときのループカウンタ 16: xmit ;送信データ 17: index ;ルックアップテーブルのインデックス 18: mode ;4MHzと4.45MHzの切り替え 19: endc |
20: ;------------------------------------------------------------------------ 21: org 0x00 ;スタートアドレス |
22: movwf OSCCAL ;オシレータキャリブレーションレジスタ 23: goto start ;ジャンプ |
24: ;------------------------------------------------------------------------ 25: ;サブルーチン 26: ;------------------------------------------------------------------------ 27: ; 名称 dly50 28: ; 機能 50msのディレイ 29: ; 引数 なし 30: ; 戻値 なし 31: ;------------------------------------------------------------------------ 32: ; 名称 dly_ms 33: ; 機能 "w"msのディレイ 34: ; 引数 w = ディレイ(ms) 35: ; 戻値 なし 36: ;------------------------------------------------------------------------ |
37: dly50 movlw 50 ;50 -> W 38: dly_ms movwf x ;W -> x 39: dy_0 movlw 249 ;1msのループカウンタ(249) 40: movwf y ;249 -> y 41: dy_1 nop ;4 * 249 = 996 42: decfsz y,F ;yをデクリメントもし0ならスキップ 43: goto dy_1 ; 44: decfsz x,F ;xをデクリメントもし0ならスキップ 45: goto dy_0 ; |
1: MOVLW 10 2: MOVWF I 3: LABEL ・ 4: ・ 5: 処理 6: ・ 7: ・ 8: DECFSZ I,F 9: GOTO LABEL |
46: btfss mode,0 ;ディレイモード(4MHz or 4.45MHz?) 47: retlw 3 ;mode<0>が0なら 3 -> W してリターン 48: movlw 36 ;4.45MHzモードなら1113 49: movwf y ;36 -> y 50: dy_2 decfsz y,F ;yをデクリメントもし0ならスキップ 51: goto dy_2 ; 52: retlw 3 ;3 -> W してリターン |
53: ;------------------------------------------------------------------------ 54: ; 名称 sendln 55: ; 機能 4バイト毎にw回送信 56: ; ブロックの先頭に72msのウエイトを入れる 57: ; LSBファースト、4ms/bit、1スタートビット、2ストップビット 58: ; 信号はLowの時はLow出力、Highの時はポートをハイインピーダンスにする 59: ; 引数 w = ブロック数 60: ; 戻値 なし 61: ;------------------------------------------------------------------------ |
62: sendln movwf i ;W -> i 63: sl_0 movlw 72 ;72msのウエイト 64: call dly_ms ; |
65: movlw 4 ; 66: movwf j ;4 -> j 67: sl_1 movf index,W ;index -> W 68: call lines ;今回送信するデータを取得 69: movwf xmit ;xmitへ格納 70: comf xmit,F ;送信用にインバート |
71: 72: movlw 8 ;8ビット 73: movwf k ;8 -> k 74: movlw b'11111011' ;スタートビット 75: tris GPIO ;GP1をハイインピーダンスへ GP2は出力 76: movlw 4 ;4ms待ち 77: call dly_ms ; |
1: MOVLW B'11111110' 2: MOVWF GPIO 3: MOVLW B'11111110' 4: TRIS GPIO 5: 6: MOVLW B'11111100' 7: MOVWF GPIO 8: MOVLW B'11111101' 9: TRIS GPIO |
78: 79: sl_2 rrf xmit,F ;送信するビットを取得(Cに入っている) 80: movlw b'11111001' ;ポートをロウに 81: movwf GPIO ;GP1="0"、GP2="0" 82: btfsc STATUS,C ;ロウならスキップ 83: movlw b'11111011' ;11111011 -> W (GP2出力、GP1はHi-z) 84: btfss STATUS,C ;ハイならスキップ 85: movlw b'11111001' ;11111001 -> W (GP1=GP2=出力) 86: tris GPIO ;ポートセット |
1: movlw b'00110011' 2: movwf abc 3: rrf abc,F |
sl_2 rrf xmit,F ;送信するビットを取得(Cに入っている) movlw b'11111001' ;ポートをロウに movwf GPIO ;GP1="0"、GP2="0" movlw b'11111001' ;11111001 -> W (GP1=GP2=出力) btfsc STATUS,C ;ロウならスキップ movlw b'11111011' ;11111011 -> W (GP2出力、GP1はHi-z) tris GPIO ;ポートセット |
87: movlw 4 ;4ms待ち 88: call dly_ms ; |
89: decfsz k,F ;全ビット送信したか 90: goto sl_2 ;まだならジャンプ |
91: movlw b'11111001' ;ストップビット 92: tris GPIO ;GP1=GP2=出力 93: movlw 8 ;8ms待ち(2ビット分) 94: call dly_ms ; |
95: incf index,F ;indexをインクリメント 96: decfsz j,F ;4(j)バイト送信したか 97: goto sl_1 ;まだならジャンプ 98: decfsz i,F ;iブロック送信したか 99: goto sl_0 ;まだならジャンプ 100: retlw 3 ;3 -> W してリターン |
101: ;------------------------------------------------------------------------ 102: ;送信データ 103: ;------------------------------------------------------------------------ 104: lines addwf PCL,F ;PC + W -> PC 105: dt 'S','C','E','I' ;日本/NTSC 106: dt 'S','C','E','A' ;アメリカ/NTSC 107: dt 'S','C','E','E' ;ヨーロッパ/PAL |
retlw 'S' retlw 'C' retlw 'E' retlw 'I' |
108: ;------------------------------------------------------------------------ 109: ;メイン 110: ;------------------------------------------------------------------------ 111: org 0x0100 112: start movlw b'11000010' ;TMR0プリスケーラを1/8へ(f_osc=4MHz) 113: option ; |
114: movlw b'11111111' ;ポート初期化 115: tris GPIO ;全ポートハイインピーダンス |
116: clrf mode ;0 -> mode |
117: ; 118: ;リセット後約50ms経ったらGP1をロウにする 119: ; 120: call dly50 ;50ms待ち 121: bcf GPIO,1 ;GP1をロウに 122: movlw b'11111101' ;11111101 -> W 123: tris GPIO ;GP1を出力ポートに |
1: BCF GPIO,4 2: BCF GPIO,5 3: MOVLW B'11001111' 4: TRIS GPIO |
124: ; 125: ;約850ms後にGP2をロウにする 126: ; 127: movlw 17 ;17*50ms=850ms 128: movwf i ;17 -> i 129: m01 call dly50 ; 130: decfsz i,F ; 131: goto m01 ; 132: bcf GPIO,2 ;GP2をロウに 133: movlw b'11111001' ;11111001 -> W 134: tris GPIO ;GP1とGP2を出力ポートに 135: ; |
136: ;約314ms後にGP1よりデータを送信する 137: ; 138: movlw 6 ;6*50ms=300ms 139: movwf i ; 140: m02 call dly50 ; 141: decfsz i,F ; 142: goto m02 ; 143: movlw 14 ;14ms 144: call dly_ms ; 145: |
146: m03 clrf index ;0 -> index 147: call sendln ;送信 148: incf mode,F ;mode ++ 149: goto m03 ;ジャンプ 150: end ;終わり |