;--------------------------------------------------------------------- ; 切り忘れセーフスイッチ(デッドマン・スイッチ) ; 2020.05.05 naka ; ; 指定時間以内にハートビート(タクトスイッチ操作)を送らないと、 ; 電源オフとなるスイッチ。半田ごてなどの消し忘れセーフスイッチ。 ; ; (1). 電源オン時には通電はオフ ; (2). ハートビートを送れば通電となり、指定時間のカウントダウン開始 ; (3). 指定時間内にハートビートを送れば残り時間は初期値にリセット ; (4). 残り時間1分時にビープ音 ; (5). 残り時間3秒でカウントダウンのビープ音 ; (6). 時間切れで連続したビープ音後に通電オフ ; (7). 一旦スイッチがオフになったら、電源を再投入しないと通電しない ; ; ※電源オン後、ハートビート前に時間設定タクトスイッチを押すことで ; 指定時間をカウントアップ(5分~95分まで5分単位)。 ; タクトスイッチ操作を2秒ほど行わないと、設定完了しハートビート待ち。 ; 設定時間はEEPROMに記憶し、電源オフ後も保持。 ; (頻繁に設定変更することは想定していない) ; ; IOピンアサイン ; (1). RA0~1 [out] : 7セグLED(アノード側)RA0:1の位、RA1:10の位 ; (2). RB0~7 [out] : 7セグLED各セグメント(カソード側) ; (3). RA2 [out] : ソリッドステートリレー制御(LEDアノード) ; (4). RA7 [out] : 圧電ブザー ; (5). RA4 [in] : タクトSW(アクティブLow) : ハートビート ; (6). RA5 [in] : タクトSW(アクティブLow) : 時間設定 ; ; その他 ; (1) クロックはPIC内部発振なので精度は±1%程度(15分で9秒位) ; ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F1827 ;CPUの種類 INCLUDE "P16F1827.INC" __CONFIG _CONFIG1, _CPD_OFF & _CP_OFF & _BOREN_ON & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _FOSC_INTOSC & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF & 0x3FFF __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_ON & _STVREN_ON & _LVP_OFF & 0x3FFF ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- ; 表示関係 ;--------------------------------------------------------------------- RABUF EQU 020H ; PORTAバッファ RBBUF EQU 021H ; PORTBバッファ LEDBUF1 EQU 022H ; LED表示バッファ(1桁目; 1の位) LEDBUF2 EQU 023H ; LED表示バッファ(2桁目;10の位) DIG1 EQU 024H ; 残り時間(分)の 1の位 DIG10 EQU 025H ; 残り時間(分)の10の位 DSPFLG EQU 026H ; 0ビット: ドット点滅用フラグ ; 1ビット: 1桁目のドット点滅用フラグ SEGCNT EQU 027H ; LEDのセグメントカウンタ(0~15:2桁分) DIGPTN EQU 028H ; 数字の形状パターン LEDNO EQU 029H ; 表示するLED(01か10)アノード側信号 IDLNO EQU 02AH ; IDLE時のアニメーション番号 ; ;--------------------------------------------------------------------- ; 時間関係 ;--------------------------------------------------------------------- TIMEL EQU 030H ; 1秒カウンタLOW TIMEH EQU 031H ; 1秒カウンタHIGH TIMFLG EQU 032H ; 0ビット: 1秒毎に1になる SEC EQU 033H ; 秒 MIN EQU 034H ; 分 TIMEIDL EQU 035H ; IDLE時のアニメーション時間カウンタ WAITSEC EQU 036H ; スイッチが押されない時間測定カウンタ ; ;--------------------------------------------------------------------- ; 入力関係(タクトスイッチ状態検出) ;--------------------------------------------------------------------- SWFLG EQU 037H ; 0ビット:ハートビートSW状態(0:off, 1:on) ; 1ビット:時間設定SW状態(0:off, 1:on) CHATCNT EQU 038H ; チャタリング除去用カウンタ ; ;--------------------------------------------------------------------- ; ビープ音関係 ;--------------------------------------------------------------------- BCNT EQU 039H ; ビープ用 BWCNT0 EQU 03AH ; ビープ用Waitカウンタ BWCNT1 EQU 03BH ; ビープ用Waitカウンタ ; ;--------------------------------------------------------------------- ; その他 ;--------------------------------------------------------------------- WK1 EQU 03CH WK2 EQU 03DH ; ;--------------------------------------------------------------------- ; EEPROM用 ;--------------------------------------------------------------------- DATA_EE_ADDR EQU 70H DATA_EE_DATA EQU 71H ; ;--------------------------------------------------------------------- ; EEPROMデータ(デフォルト時間:15分) ;--------------------------------------------------------------------- ORG H'F000' DE D'15' ; ;--------------------------------------------------------------------- ; リセットベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 GOTO MAIN ; メイン処理へ ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ; ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CALL INIT ; 初期化 ; CALL TRGHEART ; 最初のハートビート待ち BTFSS SWFLG,1 ; 制限時間設定SWが押された GOTO START CALL SETTIME ; 時間設定を行う GOTO MAIN ; START CALL POWERON ; 電源ON MAINLOOP CALL BEEP CALL GETTIME ; 制限時間をEEPROMから取り出して設定 CALL DSPTIME ; 残り時間表示 CALL INIT2 ; 時間関係のレジスタクリア CDWNLOOP CALL TRGSEC ; 秒トリガ か ハートビート待ち BTFSS TIMFLG,0 ; 秒トリガならカウントダウン GOTO MAINLOOP ; ハートビートなら初期状態に戻る DECSEC BCF TIMFLG,0 ; 秒トリガ解除 CALL BLINKDOT ; ドットの点滅 ; CALL CONTDWN ; カウントダウン BTFSS STATUS,Z ; Z=1ならタイムアウト GOTO CDWNLOOP ; TIMEOUT CALL DSPOFF ; 'OF.'の表示 CALL POWEROFF ; 電源OFF CALL BEEP2 ; タイムアウトBEEP(ポーン) GOTO $ ; ;--------------------------------------------------------------------- ; 割り込み処理でダイナミック表示を行う。 ;--------------------------------------------------------------------- INTRUPT BCF INTCON,T0IF ;割り込みフラグリセット ; INCF TIMEIDL,F ; アニメ用カウンタUP INCF TIMEL,F ; 1秒を計るカウンタUP BTFSC STATUS,Z INCF TIMEH,F ; 桁上げがあったらHIGHカウンタUP ; MOVLW H'03' ; 977になったら1秒とする SUBWF TIMEH,W ; 正確には976.5625で1秒なので、 BTFSS STATUS,Z ; 0.0448%の誤差→90分で約2.4秒長くなる GOTO CHKSW ; しかし内蔵発振の誤差が±1%なので無視できる MOVLW D'209' ; 256*3+209=977 SUBWF TIMEL,W BTFSS STATUS,Z GOTO CHKSW CLRF TIMEL CLRF TIMEH BSF TIMFLG,0 ; 1秒経ったのでTIMFLG(0)=1 ; ; タクトスイッチの状態確認 ; CHKSW DECFSZ CHATCNT,F GOTO CHKSW_E ; BCF SWFLG,0 ; OFF BTFSS PORTA,4 ; ハートビートスイッチ状態確認(active low) BSF SWFLG,0 ; ON ; BCF SWFLG,1 ; OFF BTFSS PORTA,5 ; 時間設定スイッチ状態確認(active low) BSF SWFLG,1 ; ON ; MOVLW D'10' ; 10回(約10ミリ秒)でチャタリング回避 MOVWF CHATCNT CHKSW_E ; DSPLED ; 表示バッファの内容を1セグメント分出力 ; ; SEGCNT:0~7なら1桁目のLED, 8~15なら2桁目 BCF DSPFLG,1 ; 1桁目だけドットを点滅させるフラグ BTFSC SEGCNT,3 GOTO DSPLED2 DSPLED1 ; 1桁目 MOVLW H'01' MOVWF LEDNO MOVF LEDBUF1,W ; 1桁目の値 BTFSC DSPFLG,0 ; ドット点滅フラグ BSF DSPFLG,1 GOTO DSPLED0 DSPLED2 ; 2桁目 MOVLW H'02' MOVWF LEDNO MOVF LEDBUF2,W ; 2桁目の値 DSPLED0 CALL DECSEG ; セグメント表示データに変換 MOVWF DIGPTN BTFSC DSPFLG,1 ; ドット表示 BSF DIGPTN,7 ; ; 今のSEGCNTと一致したら表示(LOWにする) MOVF SEGCNT,W ANDLW H'07' ; 下位3ビット(セグメント番号) CALL DECBIT ; ビット位置に変換 ANDWF DIGPTN,F COMF DIGPTN,W ; 反転(カソード側をLOWにする) MOVWF RBBUF ; PORTBバッファ格納 ; MOVLW B'11111100' ANDWF RABUF,W ; LEDアノードをLOW(一旦両LED消灯) MOVWF PORTA ; MOVF RBBUF,W MOVWF PORTB ; PORTB(カソード側設定) MOVF LEDNO,W IORWF RABUF,W MOVWF PORTA ; PORTA 設定 ; NXTSEG INCF SEGCNT,W ANDLW H'0F' ; SEGCNTは0~15 MOVWF SEGCNT ; RETFIE ; 割り込みから復帰 ; ;--------------------------------------------------------------------- ; 7seg LEDパターン定義 ;--------------------------------------------------------------------- DECSEG CLRF PCLATH ; BRW RETLW B'00111111' ; 0 RETLW B'00000110' ; 1 RETLW B'01011011' ; 2 RETLW B'01001111' ; 3 RETLW B'01100110' ; 4 RETLW B'01101101' ; 5 RETLW B'01111101' ; 6 RETLW B'00000111' ; 7 RETLW B'01111111' ; 8 RETLW B'01101111' ; 9 RETLW B'00000000' ; 10: ; ゼロサプレス用(非表示) RETLW B'11110001' ; 11: F. ; 通電OFF時のF表示 RETLW B'00000001' ; 12: aセグのみ表示 アニメ用 RETLW B'00000010' ; 13: bセグのみ表示 RETLW B'00000100' ; 14: cセグのみ表示 RETLW B'00001000' ; 15: dセグのみ表示 RETLW B'00010000' ; 16: eセグのみ表示 RETLW B'00100000' ; 17: fセグのみ表示 RETLW B'01000000' ; 18: gセグのみ表示 RETLW B'10000000' ; 19: DOTのみ表示 ; DECBIT CLRF PCLATH BRW RETLW B'00000001' ; 0 RETLW B'00000010' ; 1 RETLW B'00000100' ; 2 RETLW B'00001000' ; 3 RETLW B'00010000' ; 4 RETLW B'00100000' ; 5 RETLW B'01000000' ; 6 RETLW B'10000000' ; 7 ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 ; BANKSEL OSCCON MOVLW B'01101010' ; OSC 4MHz MOVWF OSCCON ; BANKSEL ANSELA CLRF ANSELA CLRF ANSELB ; BANKSEL TRISA MOVLW B'00110000' MOVWF TRISA ; ポートAはRA4,5以外出力 MOVLW B'00000000' MOVWF TRISB ; ポートBは全て出力 ; BANKSEL OPTION_REG ; 割り込みタイマーセット MOVLW H'81' ; プリスケーラを1:4にする MOVWF OPTION_REG ; 976.5625Hzで割り込みが入るはず ; clock4MHz -> 1Mcycle ; 1Mcycle/256/4 = 976.5625Hz ; LED 16segmentの書き換え 976.5625/16=約61Hz ; ; アラーム音設定 PWM2 ; 2KHz Duty25%にすると 4KHz圧電ブザー の音圧が上がる ; (村田製作所のサイトから:https://www.murata.com/ja-jp/support/faqs/products/sound/sounder/char/sch0006) ; 2KHz(1.953KHz) デューティ25%(488.25KHz) ; TMR2 PreScale = 4 ; PR2 = 125 ; BANKSEL APFCON0 MOVLW B'0001000' ; CCP2/P2A function is on RA7 MOVWF APFCON0 ; BANKSEL CCP2CON MOVLW B'00001100' ; PWM mode 設定 MOVWF CCP2CON ; MOVLW D'15' MOVWF CCPR2L ; Capture/Compare/PWM Register 2 Low Byte (LSB) ; BANKSEL PR2 MOVLW D'125' ; 2KHz(prescale:4) MOVWF PR2 ; MOVLW H'01' ; TMR2 Prescale 4 MOVWF T2CON ; BANKSEL 0 ; CLRF T1CON ; Timer1カウンタ未使用 ; CLRF PORTA ; PORTクリア CLRF PORTB CLRF RABUF ; PORTバッファクリア CLRF RBBUF CLRF SEGCNT ; LED SEGMENTカウンタクリア MOVLW D'10' MOVWF LEDBUF1 ; LEDバッファ消灯 MOVWF LEDBUF2 ; LEDバッファ消灯 CLRF DSPFLG ; LED表示フラグクリア CLRF SWFLG ; SWフラグクリア CLRF TIMEIDL ; IDLE時のアニメ用時間カウンタクリア CLRF IDLNO ; IDLE時のアニメ番号カウンタクリア MOVLW D'10' ; チャタリング回避カウンタ(約10ms) MOVWF CHATCNT ; BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 RETURN ; INIT2 CLRF TIMEL CLRF TIMEH CLRF TIMFLG ; 時間フラグクリア ; RETURN ; ;--------------------------------------------------------------------- ; 電源ON(IDLE)時 LEDアニメ表示(最初のハートビートまで続く) ;--------------------------------------------------------------------- DSPIDL MOVF TIMEIDL,W SUBLW D'80' ; 128で約0.08秒、8パターンのアニメで約0.6秒 BTFSS STATUS,Z RETURN CLRF TIMEIDL ; MOVF IDLNO,W CALL IDLPTN1 MOVWF LEDBUF1 ; MOVF IDLNO,W CALL IDLPTN2 MOVWF LEDBUF2 ; INCF IDLNO,F ; IDLNOは0~7 MOVLW H'07' ANDWF IDLNO,F RETURN IDLPTN1 ; LED 1 CLRF PCLATH BRW RETLW D'15' RETLW D'10' RETLW D'10' RETLW D'10' RETLW D'10' RETLW D'12' RETLW D'13' RETLW D'14' IDLPTN2 ; LED 2 CLRF PCLATH BRW RETLW D'10' RETLW D'15' RETLW D'16' RETLW D'17' RETLW D'12' RETLW D'10' RETLW D'10' RETLW D'10' ; ;--------------------------------------------------------------------- ; 制限時間の設定 ;--------------------------------------------------------------------- SETTIME CALL GETTIME ; 現状の制限時間をEEPROMから取り出して設定 CALL DSPTIME ; 時間表示 ; SETTIM1 BTFSC SWFLG,1 ; 離されるまで待つ GOTO $-1 CLRF TIMEL ; 秒カウンタクリア CLRF TIMEH CLRF WAITSEC BCF TIMFLG,0 ; SETTIM2 BTFSC SWFLG,1 ; 押されるまで待つ GOTO SETTIM3 ; 押されたので分インクリメント ; BTFSS TIMFLG,0 ; 秒トリガ確認 GOTO SETTIM2 ; トリガ無しなのでループ ; INCF WAITSEC,F BCF TIMFLG,0 ; 秒トリガクリア MOVLW D'2' ; 2秒押されなかったら確定 SUBWF WAITSEC,W BTFSS STATUS,Z GOTO SETTIM2 GOTO SETTIM4 ; 時間確定(EEPROMへ記録) ; SETTIM3 MOVF MIN,W SUBLW D'95' BTFSC STATUS,Z ; 最大95分 CLRF MIN MOVLW D'5' ; 5分毎にインクリメント ADDWF MIN,F CALL DSPTIME ; 時間表示 GOTO SETTIM1 ; SETTIM4 ; EEPROMへ設定時間を記録 MOVLW H'00' MOVWF DATA_EE_ADDR MOVF MIN,W MOVWF DATA_EE_DATA CALL WRTEEPROM ; 書き込み RETURN ; ;--------------------------------------------------------------------- ; 秒トリガ か ハートビート待ち(秒トリガ TIMFLG[0]=1) ;--------------------------------------------------------------------- TRGSEC BTFSC TIMFLG,0 ; 秒トリガ確認 RETURN BTFSS SWFLG,0 ; SW状態確認(押されるのを待つ) GOTO TRGSEC ; CHKREL BTFSC TIMFLG,0 ; 秒トリガ確認 RETURN BTFSC SWFLG,0 ; SW状態確認(離されるのを待つ) GOTO CHKREL RETURN ; SWが押されて、離されたら初期値に戻る ; ;--------------------------------------------------------------------- ; 最初のハートビート待ち(最初のカウントダウントリガ) ;--------------------------------------------------------------------- TRGHEART CALL DSPIDL ; IDLEアニメ表示 BTFSC SWFLG,1 ; 時間設定SW状態確認 RETURN ; 押されていたらリターン BTFSS SWFLG,0 ; ハートビートSW状態確認(押されるのを待つ) GOTO TRGHEART ; CALL DSPIDL ; IDLEアニメ表示 BTFSC SWFLG,0 ; SW状態確認(離されるのを待つ) GOTO $-2 RETURN ; ;--------------------------------------------------------------------- ; 残り時間のカウントダウン(タイムアウトならZ=1でリターン) ;--------------------------------------------------------------------- CONTDWN MOVLW D'1' SUBWF SEC,F ; 秒デクリメント BTFSC STATUS,C ; -1なら分デクリメント GOTO CHKTIM ; ; DECF MIN,F ; 分デクリメント MOVLW D'59' MOVWF SEC CALL DSPTIME ; 残り時間表示 ; CHKTIM ; BEEPを鳴らす時間/タイムアウト確認 MOVF MIN,W ; 1分00秒の確認 SUBLW D'1' BTFSS STATUS,Z GOTO CHKTIM2 ; 次の確認 MOVF SEC,F BTFSS STATUS,Z GOTO CHKTIM2 ; 次の確認 ; CALL BEEP ; 残り1分00秒のBEEP(ピッ) GOTO RETCDWN ; リターン CHKTIM2 MOVF MIN,W ; 0分03,02,01秒の確認 BTFSS STATUS,Z GOTO RETCDWN ; 0分ではないのでリターン ; MOVF SEC,F BTFSS STATUS,Z ; 残り0分00秒(タイムアウト) GOTO CHKTIM3 CALL BEEP2 ; タイムアウトBEEP(ピッピッピッピッ) BSF STATUS,Z RETURN ; タイムアウト時はZ=1でリターン ; CHKTIM3 MOVF SEC,W SUBLW D'3' BTFSC STATUS,C CALL BEEP ; 残り0分03,02,01秒のBEEP ; RETCDWN BCF STATUS,Z ; Z=0でリターン RETURN ; ;--------------------------------------------------------------------- ; ドットの点滅(ON/OFFのトグル、ON) ;--------------------------------------------------------------------- BLINKDOT BTFSS DSPFLG,0 GOTO $+3 BCF DSPFLG,0 GOTO $+2 BSF DSPFLG,0 RETURN ; ;--------------------------------------------------------------------- ; 分を表示(BCD変換して表示バッファに格納) ;--------------------------------------------------------------------- DSPTIME MOVF MIN,W ; 残り時間(分)をWへ CALL BINBCD ; 分をBCD変換 MOVF DIG10,W ; 10の位 BTFSC STATUS,Z MOVLW H'0A' ; ゼロサプレス; 0Aは何も表示しないコード MOVWF LEDBUF2 ; MOVF DIG1,W ; 1の位 MOVWF LEDBUF1 RETURN ;--------------------------------------------------------------------- ; Wレジ値をBCD変換(10の位と1の位に分ける)、10を引き続ける安直な方法 ;--------------------------------------------------------------------- BINBCD MOVWF WK1 MOVLW D'10' CLRF WK2 BINBCDL INCF WK2,F SUBWF WK1,F ; -10 BTFSC STATUS,C GOTO BINBCDL DECF WK2,W MOVWF DIG10 MOVLW D'10' ADDWF WK1,W MOVWF DIG1 RETURN ; ;--------------------------------------------------------------------- ; OFF(OF.)の表示 ;--------------------------------------------------------------------- DSPOFF MOVLW D'0' ; OFF 表示の'0' MOVWF LEDBUF2 MOVLW D'11' ; OFF 表示の'F.' MOVWF LEDBUF1 RETURN ; ;--------------------------------------------------------------------- ; POWER ON/OFF ;--------------------------------------------------------------------- POWERON BCF INTCON,GIE ;全割込み禁止 BSF RABUF,2 ; RA2(ソリッドステートリレー用LED) をON MOVF RABUF,W MOVWF PORTA BSF INTCON,GIE ;全割込み許可 RETURN ; POWEROFF BCF INTCON,GIE ;全割込み禁止 BCF RABUF,2 ; RA2(ソリッドステートリレー用LED) をOFF MOVF RABUF,W MOVWF PORTA BSF INTCON,GIE ;全割込み許可 RETURN ; ;--------------------------------------------------------------------- ; 制限時間を設定(EEPROMデータを読み出す) ;--------------------------------------------------------------------- GETTIME MOVLW H'00' MOVWF DATA_EE_ADDR CALL RDEEPROM ; 前回設定時間をEEPROMから読み出す MOVWF MIN ; 分カウンタ設定 CLRF SEC RETURN ; ;--------------------------------------------------------------------- ; EEPROM読み出し ;--------------------------------------------------------------------- RDEEPROM BANKSEL EEADRL ; MOVF LOW DATA_EE_ADDR,W ; MOVWF EEADRL ; Data Memory ; Address to read BCF EECON1,CFGS ; Deselect Config space BCF EECON1,EEPGD ; Point to DATA memory BSF EECON1,RD ; EE Read MOVF EEDATL,W ; W = EEDATL BANKSEL 0 RETURN ; ;--------------------------------------------------------------------- ; EEPROM書き込み ;--------------------------------------------------------------------- WRTEEPROM BANKSEL EEADRL ; MOVF DATA_EE_ADDR,W ; MOVWF EEADRL ; Data Memory Address to write MOVF DATA_EE_DATA,W ; MOVWF EEDATL ; Data Memory Value to write BCF EECON1,CFGS ; Deselect Configuration space BCF EECON1,EEPGD ; Point to DATA memory BSF EECON1,WREN ; Enable writes BCF INTCON,GIE ; Disable INTs. MOVLW 55h ; MOVWF EECON2 ; Write 55h MOVLW 0AAh ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ;Go write BTFSC EECON1,WR ;wait for write complete GOTO $ - 1 ; BCF EECON1,WREN ;disable EE writes BSF INTCON,GIE ;割り込み許可 BANKSEL 0 ;BANK0に戻す RETURN ; ;--------------------------------------------------------------------- ; BEEP音 1分前(ピッ)、 ; 3秒前から(ピッ、ピッ、ピッ) ; タイムアップ (ピッ、ピッ、...ピツ;5回) ;--------------------------------------------------------------------- BEEP ; ピッ CALL ALMON MOVLW D'30' ; オン時間 0.1秒 CALL BWAIT CALL ALMOFF RETURN ; BEEP2 ; ピッ繰り返し MOVLW D'5' MOVWF BCNT BEEP2L CALL BEEP MOVLW D'20' ; オフ時間 0.07秒 CALL BWAIT DECFSZ BCNT,F GOTO BEEP2L RETURN ; ALMON ; PWM オンでアラームを鳴らす MOVLW H'05' ; B'0000101' TMR2 on, Prescale 4 MOVWF T2CON RETURN ; ALMOFF ; PWMアラームオフ CLRF T2CON RETURN ; BWAIT ; ウェイト時間:Wレジ D'30' = 約0.1秒 MOVWF BWCNT0 BWAITL0 MOVLW D'255' MOVWF BWCNT1 BWAITL1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 DECFSZ BWCNT1,F GOTO BWAITL1 ; DECFSZ BWCNT0,F GOTO BWAITL0 RETURN ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------