CRCチェック

CRCチェックについて
http://www.cdwavmp3.com/dl/other/crc.html


ECCチェックについて
http://community.osdev.info/index.php?ECC



;**********************************************************************
; Filename: miracle.asm *
; Date: 2001/3/26 *
; File Version: *
;**********************************************************************

list p=16F648A ; list directive to define processor
#include ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS
w_temp02 EQU 0x0C ; variable used for context saving

cnt_data EQU 0x26
CE_data EQU 0x27
w_temp EQU 0x28 ; variable used for context saving
w_PORTA_temp EQU 0x29 ;PORTAの入力値の一時保管
cnt_data02 EQU 0x2A
w_PORTA_temp02 EQU 0x2B
CNT2 EQU 0x2C
OUT_SIG1 EQU 0x2D
CNT1 EQU 0x2E
count EQU 0x2F
CNT3 EQU 0x30
CNT5 EQU 0x31
CNT6 EQU 0x32
CNT7 EQU 0x33
SW_CNT EQU 0x34
OSC_001_WAVE EQU 0x35
OSC_002_WAVE EQU 0x36
OSC_003_WAVE EQU 0x37
DATA2 EQU 0x38
CNT8 EQU 0x39
OSC_004_WAVE EQU 0x3A
DATA4 EQU 0x3B
DATA5 EQU 0x3C
DATA1 EQU 0x3D
DATA3 EQU 0x3E
MIDI_BIT_CNT EQU 0x3F
MIDI_BYTE_CNT EQU 0x40


MIDI_NOTE EQU 0x41


time3 EQU 0FFh ;LED time3


sound1_val EQU B'00000000'
sound2_val EQU B'00001101'
sound3_val EQU B'00011010'

;**********************************************************************
ORG 0x000 ; processor reset vector
goto main_setting ; go to beginning of program


org 0x04 ; 割り込みアドレス
btfsc PIE1,TMR1IE ;タイマー1の割り込み?
goto INT_TMR1 ; カウントを開始へジャンプ
btfsc PIE1,TMR2IE ;タイマー2の割り込み?
goto INT_TMR2 ;カウント設定へジャンプ
btfsc INTCON,T0IF ;タイマー0の割り込み?
goto INT_TMR3
retfie ; 別の割り込みなら戻る

;

main_setting
bsf STATUS,RP0 ;メモリーバンクを1にセット
movlw 007h
movwf TRISA ;ポートAをすべて入力に設定
;
movlw 000h
movwf TRISB ;ポートBをすべて出力に設定
;
;
bsf PCON,3 ;内部クロックを4MHzに設定
bcf OPTION_REG,5 ;ICの14pinをCLKOUTに設定
bcf RCSTA,7 ;RCSTAレジスタの7ビット目(RB1ポート)のシリアル通信を無効にする。

movlw 000H ;Wレジスタに80Hをセット
movwf OPTION_REG ;OPTION_REGに80Hをセット PORT-B PULL UPなし
bcf STATUS,RP0 ;メモリーバンクを0にセット

movlw B'00000111'
movwf CMCON ;PORTAをI/Oピンに設定する。

movlw 020h
movwf PORTB ;ポートBを全OFF状態にする。
bsf PORTB,5
bsf w_temp,5
bsf CE_data,5

bsf T1CON,TMR1ON ;タイマ1をON

start
bsf INTCON,T0IE ;タイマ0の割り込みを許可する。
bcf INTCON,GIE ; 全体の割り込みを禁止する
bcf INTCON,RBIE ; ポートBの割り込みを禁止する
bcf INTCON,RBIF ; ポートBの割り込みを削除する
bcf INTCON,INTE ; RB0 の割り込みを禁止する




bsf STATUS,RP0 ; レジスタバンク1を選択
BSF PIE1,TMR1IE ;TMR1オーバーフロー割り込み許可
bsf OPTION_REG,INTEDG ; 立ち上がりで割り込みが反応する
bcf OPTION_REG,NOT_RBPU ; ポートBのプルアップを有効にする
movlw B'00000000' ;
movwf TRISB ; ポートBを全部入力用にする
movlw B'00000' ;
movwf TRISA ; ポートAを全部出力用にする
bcf STATUS,RP0 ; レジスタバンク0を選択

movlw 0x80
movwf TMR0
MOVLW 30H ;Wレジスタに30Hをセット
MOVWF T1CON ;T1CONレジスタ プリスケーラ1:8 停止




MOVLW 00H ;Wレジスタに00Hをセット
MOVWF TMR1L ;TMR1Lに下位8ビットデータをセット
MOVLW 00H ;Wレジスタに00Hをセット
MOVWF TMR1H ;TMR1Hに上位8ビットデータをセット
CLRF CNT1 ;CNT1変数を00Hにクリア

bsf INTCON,PEIE ;タイマ1、タイマ2の割り込みを許可する。

bcf PORTA,4 ; 赤いLEDを消す
bsf INTCON,GIE ; 全体の割り込みを許可する
BSF T1CON,TMR1ON ;TMR1のTMR1ONビットをセット カウント開始
movlw 0x00
movwf CNT1
movwf CNT2
movwf CNT3
movwf OSC_001_WAVE
movwf OSC_002_WAVE
movwf OSC_003_WAVE
movwf SW_CNT
movwf OSC_004_WAVE
bsf PORTB,7
clrf MIDI_BIT_CNT
clrf MIDI_BYTE_CNT
movlw 0x08
movwf MIDI_NOTE
movlw 0xAA
movwf MIDI_NOTE + 0x01
movlw 0x55
movwf MIDI_NOTE + 0x02


wait
goto wait ; 割り込みを待つ

setcount
movf PORTB,0 ; PORTB -> W
andlw B'11110000' ; 下位 4 ビットを 0 にする
movwf count ; W -> count
swapf count,1 ; 上位 4 ビットと下位 4 ビットを入れ替える
movf count,0 ; count -> W
movwf PORTA ; W -> PORTA
bcf INTCON,RBIF ; 割り込みをリセット
retfie ; 割り込み処理から復帰

count_begin
clrw ; 0 -> W
movwf PORTA ; LEDを消す
bsf PORTA,4 ; 赤いLEDを点灯
goto wait ; 割り込みを無効にしたまま待つ

INT_TMR1
bcf INTCON,GIE ; 全体の割り込みを禁止する
MOVLW 00H ;Wレジスタに00Hをセット
MOVWF TMR1L ;TMR1Lに下位8ビットデータをセット
MOVLW 00H ;Wレジスタに00Hをセット
MOVWF TMR1H ;TMR1Hに上位8ビットデータをセット

BCF PIR1,TMR1IF ;オーバーフローフラグのクリア
BSF STATUS,RP0 ;メモリーバンクを1にセット
BSF PIE1,TMR1IE ;オーバーフロー割り込み許可
BCF STATUS,RP0 ;メモリーバンクを0にセット

INCF CNT1,F ;変数CNT1に+1する。
MOVF CNT1,W ;WレジスタにCNT1の値をセット
MOVWF PORTB ;PORTBへCNT1の値を出力


;[ if _DATA1 < _DATA2 then goto Xxx ]
;movf CNT1,W
;subwf 0xFF,W
;btfss STATUS,C
;goto Xxx
RETFIE

Xxx
COMF OUT_SIG1
RETFIE ;割り込みを許可してリターン


INT_TMR2
; MOVLW 00H ;Wレジスタに00Hをセット
; MOVWF TMR2L ;TMR1Lに下位8ビットデータをセット
; MOVLW 00H ;Wレジスタに00Hをセット
; MOVWF TMR2H ;TMR1Hに上位8ビットデータをセット
bcf INTCON,GIE ; 全体の割り込みを禁止する
BCF PIR1,TMR2IF ;オーバーフローフラグのクリア
BSF STATUS,RP0 ;メモリーバンクを1にセット
BSF PIE1,TMR2IE ;オーバーフロー割り込み許可
BCF STATUS,RP0 ;メモリーバンクを0にセット

INCF CNT2,F ;変数CNT1に+1する。
MOVF CNT2,W ;WレジスタにCNT1の値をセット
MOVWF PORTB ;PORTBへCNT1の値を出力

RETFIE ;割り込みを許可してリターン


INT_TMR3
bcf INTCON,GIE ; 全体の割り込みを禁止する
BCF INTCON,T0IF ;オーバーフローフラグのクリア
BSF STATUS,RP0 ;メモリーバンクを1にセット
BSF INTCON,T0IE ;オーバーフロー割り込み許可


BCF STATUS,RP0 ;メモリーバンクを0にセット

INCF CNT3,F ;変数CNT1に+1する。

movlw 0x80
movwf TMR0


;[ if _DATA1 = _DATA2 then goto Xxx ]
movf PORTA,w
andlw '00000001'
movwf CHECK_INPUT
btfsc CHECK_INPUT,0
goto CNT_START
goto CNT_CLEAR

CNT_START
INCF OUTPUT_CNT
goto PALSE_OUT

CNT_CLEAR
clrf OUTPUT_CNT
goto PALSE_OUT







END