; ; lap84.asm ビデオスーパーインポーズ ; 赤外線ラップタイマー ; for Microchip PIC16F84 ; Copyright(C)1997 By H.Kashima ; title laptimer processor 16f84 radix dec list c = 128, n = 64 #include __FUSES _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON ; 1/100秒算出のための供給クロック周波数の定義 #define XTAL 3686400 ; 供給クロック #define RTCLK XTAL / 4 ; 内蔵タイマのクロック ; プリスケーラ値 ; #define PSCR 256 ; 1/100秒のタイマ値 ; #define CSEC ( RTCLK / PSCR ) / 100 ; 1/10秒のタイマ値 ; #define DSEC ( RTCLK / PSCR ) / 10 ; 最大計測周回数(メモリーの上限) ; #define MAXLAP 32 ; OSDC表示位置 ; #define LOC( x, y) 24 * y + x ; ワークエリア定義 ; v_addr equ 0x0c ; OSDCアドレス v_char equ 0x0d ; OSDCデータ var1 equ 0x0e ; 汎用 var2 equ 0x0f var3 equ 0x10 var4 equ 0x11 var5 equ 0x12 timeMSB equ 0x13 ; 時計測 timeLSB equ 0x14 odc_datH equ 0x15 ; シフト用 putscnt equ 0x16 ; count temporary for PUT_S v_leng equ 0x16 min equ 0x17 ; 単位変換用 sec equ 0x18 csec equ 0x19 prev_t equ 0x1a ; 直前のタイマー値 c_lap equ 0x1b ; 現在のタイマー値 f_lap equ 0x1c ; ファーステストラップ lap_ptr equ 0x1d div_cnt equ 0x1e ; 割り算カウンタ bit_cnt equ 0x1e ; 割り算カウンタ AL equ 0x1f ; 分子, 余り AH equ 0x20 BL equ 0x21 ; 分母 BH equ 0x22 CL equ 0x23 ; 商 CH equ 0x24 odc_datL equ 0x25 ; シフト用 imp_f equ 0x26 ; impose condition ; OSDCへデータを 0xffに遭遇するまで送出するマクロ ; PUT_S macro x, y, ptr bcf PORTA, A_CS ; /CS を LOにする clrf odc_datH clrf putscnt movlw LOC( x, y) movwf odc_datL call odc_send ; 先頭アドレスの送出 movlw 0x03 ; loop1, set table PCH movwf PCLATH movfw putscnt call ptr movwf odc_datL sublw 0xff btfsc STATUS, Z goto $ + 4 ; goto end call odc_send incf putscnt, F goto $ - 10 ; goto loop1 bsf PORTA, A_CS ; 送出終了, /CS を HIGHにする endm ; MCU 入出力ポートのビット定義 A_DAT equ 0 A_CLK equ 1 A_CS equ 2 B_STA equ 0 B_STP equ 1 B_RST equ 2 B_IR equ 3 B_BUZ equ 4 org 0x000 goto start ; コールドスタート ; MCU 初期化 ; start bsf STATUS, RP0 ; 入出力ポートの初期化 movlw b'10000111' movwf OPTION_REG movlw b'00011000' movwf TRISA movlw b'00001111' movwf TRISB bcf STATUS, RP0 movlw b'00011111' movwf PORTA call odc_init ; OSDCの初期化 ; ; インポーズモードの初期化 ; imp_f bit0:0 ビデオインポーズ, bit0:1 ブルーバック表示 ; bsf imp_f, 0 ; インポーズフラグをセット btfsc PORTB, B_RST ; RESET ボタンの押し下げチェック goto beep bcf imp_f, 0 bcf PORTA, A_CS ; インポーズ ON movlw 0xf8 movwf odc_datL clrf odc_datH call odc_send movlw 0x82 movwf odc_datL call odc_send bsf PORTA, A_CS ; ; ブザーを 200ms鳴らす ; beep bsf PORTB, B_BUZ movlw 20 movwf var2 beep2 clrf TMR0 ; 10msループ beep1 movlw CSEC subwf TMR0, W btfss STATUS, Z goto beep1 decfsz var2, F goto beep2 bcf PORTB, B_BUZ ; ; タイトル表示 ; PUT_S 4, 4, title_s ; ; 5秒間ウェイトする ; tit2 movlw 5 movwf var1 wait3 movlw 20 movwf var2 wait2 call wait50 ; 50msウェイト btfss PORTB, B_STP ; STOPボタンが押し下げられたら goto rstart ; ウェイトをスキップする decfsz var2, F goto wait2 decfsz var1, F goto wait3 ; ; プログラムメインループ ; rstart movlw MAXLAP ; 周回データの初期化 movwf var1 clrlap decf var1, F movfw var1 call set_lap movfw var1 btfss STATUS, Z goto clrlap call odc_cls ; clear screen PUT_S 7, 4, push_s ; print "PUSH START" PUT_S 9, 7, time_s ; print "TOP ** --:" PUT_S 9, 8, time2_s ; print "LAP ** --:" PUT_S 9, 9, time2_s ; print "LAP ** --:" ; ; STARTボタンの押し下げを待つ ; w_sta btfsc PORTB, B_STA ; 押されたか? goto w_sta call wait50 btfsc PORTB, B_STA ; 再度押し下げチェック goto w_sta PUT_S 7, 4, rdy_s ; print "READY!" w_sta2 btfss PORTB, B_STA ; ボタンが離されたか? goto w_sta2 call wait50 btfss PORTB, B_STA ; 再度ボタン解放チェック goto w_sta2 w_ir1 btfss PORTB, B_IR ; 最初の赤外線検出を待つ goto w_ir2 btfsc PORTB, B_STA goto w_ir1 w_ir2 movlw 20 ; set length movwf v_leng movlw LOC(0, 4) ; clear "READY" movwf v_addr movlw 0xff movwf v_char call strclr ; ; 周回時間の計測 ; ; 周回計測用ワークエリア初期化 clrf TMR0 clrf prev_t ; 直前の TMR0値 clrf c_lap ; 現在の周回数 clrf f_lap ; 最速だった周回数 movlw 0xff movwf var4 ; firstest timeMSB movwf var5 ; firstest timeLSB laploop clrf timeLSB ; clear current LAP time clrf timeMSB clrf var2 ; beep, messege flag bsf PORTB, B_BUZ ; buzzer on PUT_S 9, 4, lap_s ; 周回数を中央に表示する incf c_lap, W ; 数値を文字に変換 call itoa bcf PORTA, A_CS ; /CS goes low movlw LOC( 13, 4) movwf odc_datL clrf odc_datH call odc_send ; 先頭アドレス送信 movfw CH movwf odc_datL clrf odc_datH call odc_send ; 10の位 movfw CL movwf odc_datL clrf odc_datH call odc_send ; 1の位 bsf PORTA, A_CS ; /CS goes high movlw LOC(13, 8) ; 最下に周回数を表示する bcf PORTA, A_CS ; /CS goes low movwf odc_datL clrf odc_datH call odc_send movfw CH movwf odc_datL movlw 2 movwf odc_datH call odc_send movfw CL movwf odc_datL call odc_send bsf PORTA, A_CS ; /CS goes high timloop ; ; TMR0 前回値から 1/100秒経つまでウェイトする ; w10ms movfw prev_t subwf TMR0, W ; TMR0値の差分 movwf var1 ; var1 = TMR0 - prev_t movlw CSEC subwf var1, W ; 前回値との差が CSECを越えたか? btfss STATUS, C goto w10ms movlw CSEC addwf prev_t, F ; prev_tに CSECを加算 incf timeLSB, F ; timeLSBに +1 btfss STATUS, Z goto valid incf timeMSB, F btfss STATUS, Z ; 計測値が 10:55:35を越えたら goto valid ; 保存値を 0xffffにする movlw 0xff movwf timeLSB movwf timeMSB valid movlw LOC( 16, 8) ; 計測時間の表示 movwf v_addr clrf odc_datH call msec2time ; ; インポーズモードの切換 ; movfw timeLSB ; 320ms毎に切り替えボタンをチェックする andlw 0x1f btfss STATUS, Z ; timeLSB = 0, 32, 64, 96, 128 ? goto nosw btfsc PORTB, B_RST ; RESETボタン押し下げをチェック goto nosw btfss imp_f, 0 ; 現在のインポーズモードをトグルする goto imp_s1 ; 外部同期にセット bcf imp_f, 0 goto imp_s2 ; 内部同期にセット imp_s1 bsf imp_f, 0 imp_s2 call odc_res ; ; 計測開始から 200msの間ブザーを鳴らす ; nosw movfw timeMSB btfss STATUS, Z ; 2.56秒以上経過なら do_chkへ goto do_chk btfsc var2, 0 ; 現在ブザーが鳴っているか? goto mesclr movlw 20 subwf timeLSB, W btfss STATUS, C ; 200msec以上経過したならブザー消音 goto timloop bcf PORTB, B_BUZ bsf var2, 0 ; ブザー消音完了 ; ; 計測開始時に表示された周回数を2秒後にクリアする ; mesclr btfsc var2, 1 ; 現在 LAP数表示中か? goto do_chk movlw 200 ; if( timeLSB > 200 ) goto timloop subwf timeLSB, W ; 2秒以上経過したなら timloopへ btfss STATUS, C goto timloop movlw 72 ; LAP数表示クリア movwf v_leng movlw LOC( 0, 2) movwf v_addr movlw 0xff movwf v_char call strclr bsf var2, 1 ; LAP表示クリア完了 goto do_chk ; ; トリガー入力のチェック, 計測開始から2秒間は入力が無効になる。 ; do_chk btfss PORTB, B_STA ; check START button goto tim_end btfss PORTB, B_STP ; check STOP button goto c_break btfsc PORTB, B_IR ; check IR goto timloop ; ; 1周の終了処理 ; tim_end incf timeLSB, F ; 1/100秒切り上げ btfsc STATUS, Z incf timeMSB, F movfw c_lap call set_lap ; EEPROMに周回データをセーブ incf c_lap, W ; 周回数を表示する call itoa bcf STATUS, RP0 bcf PORTA, A_CS ; /CS goes low movlw LOC(13, 9) movwf odc_datL clrf odc_datH call odc_send movfw CH movwf odc_datL clrf odc_datH call odc_send movfw CL movwf odc_datL clrf odc_datH call odc_send bsf PORTA, A_CS ; /CS goes high movlw LOC(16, 9) ; 計測時間を表示する movwf v_addr clrf odc_datH call msec2time ; ; ファーステストラップのチェック ; movfw var4 ; if( var4 > timeMSB ) goto flap3 subwf timeMSB, W btfss STATUS, C goto flap3 btfss STATUS, Z ; if( var4 != timeMSB) goto flap4 goto flap4 movfw timeLSB ; if( var5 < timeLSB ) goto flap4 subwf var5, W btfss STATUS, C goto flap4 flap3 movfw c_lap ; Firstest LAP値の保存 movwf f_lap movfw timeMSB movwf var4 movfw timeLSB movwf var5 PUT_S 5, 2, flap_s ; "FIRSTEST.." の表示 incf c_lap, W call itoa bcf PORTA, A_CS ; /CS goes low movlw LOC(13, 7) ; ファーステストラップの表示 movwf odc_datL clrf odc_datH call odc_send movfw CH movwf odc_datL clrf odc_datH call odc_send movfw CL movwf odc_datL clrf odc_datH call odc_send bsf PORTA, A_CS ; /CS goes high movlw LOC(16, 7) ; 最下行にタイムを表示 movwf v_addr clrf odc_datH call msec2time flap4 incf c_lap, F movlw MAXLAP subwf c_lap, W btfss STATUS, Z ; 最大計測周回数に達したら終了 goto laploop ; ; 計測処理の終了 ; c_break decf c_lap, F ; 直前の周回は無効なので周回カウンタを ; -1する ; ; ラップリスト表示の初期化 ; call odc_cls ; 画面消去 PUT_S 5, 0, conte_s ; print "LAP CONTENTS" PUT_S 2, 9, rest_s ; print "PUSH RST ..." clrf var1 ; 表示リストの先頭 LAP番号 incfsz c_lap, W ; 1度も計測結果が無い場合のチェック goto prevlap PUT_S 6, 2, nodat_s ; "NO DATA" を表示 clrf var4 ; up/down キー操作を無効にする goto r_btn ; ; 周回データのプレビュー ; prevlap clrf var4 ; ページボタンのマスク clrf var2 ; テンポラリ movlw LOC( 6, 2) ; var3 = 表示先頭アドレス movwf var3 list1 incf var1, W ; W = var1 + var2 + 1 addwf var2, W call itoa bcf PORTA, A_CS ; /CS goes low movfw var3 ; 周回数の表示 movwf odc_datL ; 先頭アドレス送信 clrf odc_datH call odc_send movfw var1 ; ファーステストラップは addwf var2, W ; 反転表示する subwf f_lap, W btfss STATUS, Z goto list1a movlw 0x04 ; 反転フラグ印加 movwf odc_datH list1a movfw CH movwf odc_datL call odc_send movfw CL movwf odc_datL call odc_send movlw 0xff ; ' '(スペース) movwf odc_datL call odc_send list2a bsf PORTA, A_CS ; /CS goes high movfw var3 addlw 3 ; 現在の表示アドレス +3 movwf v_addr movfw var1 addwf var2, W call get_lap ; EEPROMから周回データをロード call msec2time ; ロードした計測時間の表示 movlw 4 ; if( var2 == 4 ) goto list3 subwf var2, W btfsc STATUS, Z goto list3 movfw var1 ; var5 = var1 + var2 movwf var5 movfw var2 addwf var5, F movfw c_lap ; if( var5 == c_lap) goto list4 subwf var5, W btfsc STATUS, Z ; 最終ページの時次頁処理パス goto list4 incf var2, F ; var2++ movlw 24 ; var3 += 24 (改行) addwf var3, F goto list1 list3 movfw c_lap ; 次頁ありのマーク処理 movwf var5 movfw var1 subwf var5, F movlw 5 subwf var5, F ; var5 = c_lap - var1 - 5 btfss STATUS, C ; if( c_lap < (var1 + 5)) goto list4 goto list4 bcf PORTA, A_CS ; /CS goes low movlw LOC(18, 6) movwf odc_datL clrf odc_datH call odc_send movlw 0x7c ; 下矢印の表示 movwf odc_datL movlw 0x02 ; ブリンクフラグの印加 movwf odc_datH call odc_send bsf PORTA, A_CS ; /CS goes high bsf var4, B_STA ; START(NEXT)ボタンを有効にする list4 movfw var1 ; 先頭ページ以外では上矢印を表示する btfsc STATUS, Z goto list5 bcf PORTA, A_CS ; /CS goes low movlw LOC(18, 2) movwf odc_datL clrf odc_datH call odc_send movlw 0x7b ; 上矢印の表示 movwf odc_datL movlw 0x02 ; ブリンクの印加 movwf odc_datH call odc_send bsf PORTA, A_CS ; /CS goes high bsf var4, B_STP ; 前頁ボタンを有効にする list5 r_btn movlw b'00000111' ; すべてのボタンが離されたか? andwf PORTB, W xorlw b'00000111' btfss STATUS, Z goto r_btn call wait50 movlw b'00000111' ; 離されたか再チェック andwf PORTB, W xorlw b'00000111' btfss STATUS, Z goto r_btn w_btn btfss PORTB, B_STA ; ボタンが押されたかチェック goto w_btn1 btfss PORTB, B_STP goto w_btn1 btfss PORTB, B_RST goto w_btn1 goto w_btn w_btn1 call wait50 btfss PORTB, B_STA ; 押されたか再チェック goto n_page btfss PORTB, B_STP goto p_page btfss PORTB, B_RST goto restart goto w_btn ; ; 次頁に移動する ; n_page btfss var4, B_STA goto w_btn movlw 5 ; var += 5 addwf var1, F goto list6 ; ; 前頁に移動する ; p_page btfss var4, B_STP goto w_btn movlw 5 ; var -= 5 subwf var1, F goto list6 ; ; 周回計測に戻る ; restart goto rstart list6 movlw 24*7 ; 計測リスト表示を消去する movwf v_leng movlw LOC( 0, 2) movwf v_addr movlw 0xff movwf v_char call strclr goto prevlap ; ; サブルーチン群 ; v_lengの長さだけ文字列 v_charで埋める ; strclr bcf PORTA, A_CS movfw v_addr movwf odc_datL clrf odc_datH call odc_send strc1 movfw v_char movwf odc_datL clrf odc_datH call odc_send decfsz v_leng, F goto strc1 bsf PORTA, A_CS return ; 周回データのEEPROM セーブ ; set_lap ; EEPROMにセーブする bcf STATUS, RP0 movwf EEADR bcf STATUS, C rlf EEADR, F movfw timeMSB movwf EEDATA call eewrite incf EEADR, F movfw timeLSB movwf EEDATA call eewrite return ; 周回データのEEPROM ロード ; get_lap ; EEPROMからロードする bcf STATUS, RP0 movwf EEADR bcf STATUS, C rlf EEADR, F bsf STATUS, RP0 bsf EECON1, RD bcf STATUS, RP0 movfw EEDATA movwf timeMSB incf EEADR, F bsf STATUS, RP0 bsf EECON1, RD bcf STATUS, RP0 movfw EEDATA movwf timeLSB return ; EEPROMへの書込み ; eewrite bsf STATUS, RP0 bsf EECON1, WREN ; Write イネーブル movlw 0x55 movwf EECON2 movlw 0xaa movwf EECON2 bsf EECON1, WR wr1 btfsc EECON1, WR goto wr1 bcf EECON1, WREN ; Write イネーブル bcf STATUS, RP0 return ; OSDCへのシリアル送出 ; odc_send bcf STATUS, RP0 movlw 16 movwf bit_cnt loop1 bcf PORTA, A_CLK ; CLK goes low rrf odc_datH, F rrf odc_datL, F btfsc STATUS, C bsf PORTA, A_DAT ; DATA goes high btfss STATUS, C bcf PORTA, A_DAT ; DATA goes lo bsf PORTA, A_CLK ; CLK goes high decfsz bit_cnt, F goto loop1 rrf odc_datH, F rrf odc_datL, F return ; OSDCの初期化 ; odc_init bcf PORTA, A_CS clrf putscnt ini1 movlw 0x03 ; set table PCH movwf PCLATH movfw putscnt call init_d movwf odc_datL clrf odc_datH call odc_send incf putscnt, F movfw putscnt sublw 10 btfss STATUS, Z goto ini1 bsf PORTA, A_CS return ; OSDCの RAMクリア ; odc_cls bcf STATUS, RP0 bcf PORTA, A_CS movlw 0xf8 ; 0xF8 register movwf odc_datL clrf odc_datH call odc_send movlw 0x8a ; RAM erase ext sync btfsc imp_f, 0 movlw 0x8e ; RAM erase int sync movwf odc_datL call odc_send bsf PORTA, A_CS call odc_res return ; OSDC 内部/外部同期切り替え ; odc_res bcf STATUS, RP0 bcf PORTA, A_CS movlw 0xf8 ; 0xF8 register clrf odc_datH movwf odc_datL call odc_send movlw 0x82 ; resume ext sync btfsc imp_f, 0 movlw 0x86 ; resume int sync movwf odc_datL call odc_send bsf PORTA, A_CS return ; 数値を文字列に変換 ; itoa movwf AL movlw 0 ; '0' movwf CH ; CH = degit10 movwf CL ; CL = degit1 bcd1 movlw 10 subwf AL, W btfss STATUS, C goto bcd2 movwf AL ; (AL >= 10 ) incf CH, F goto bcd1 bcd2 movfw AL ; (AL < 10 ) addwf CL, F return ; odc_datLの位置へ timeMSB:timeLSBの値を表示する ; msec2time bcf STATUS, RP0 movfw odc_datH movwf AH bcf PORTA, A_CS ; /CS goes low movfw v_addr movwf odc_datL clrf odc_datH call odc_send ; 先頭アドレスの送出 movfw AH movwf odc_datH incf timeMSB, W ; if( time == 0xffff ) btfss STATUS, Z ; 計測値が 0xffffだった goto mloop2 ; 場合 OVERFLOWを表示 incf timeLSB, W btfss STATUS, Z goto mloop2 clrf putscnt ; print "overflow" movlw 0x04 ; 反転表示 movwf odc_datH mloop1 movlw 0x03 movwf PCLATH movfw putscnt call ovfl_s movwf odc_datL sublw 0xff btfsc STATUS, Z goto mloop4 ; return call odc_send incf putscnt, F goto mloop1 mloop2 movfw timeMSB ; 単位を変換する movwf AH movfw timeLSB movwf AL movlw 0x17 ; 0x1770 = 6000 movwf BH ; 計測値を 6000で割る movlw 0x70 movwf BL call function_div movfw CL ; 商 = 分 movwf min clrf BH ; 0x0064 = 100 movlw 0x64 ; 余りを 100で割る movwf BL call function_div movfw CL ; 商 = 秒 movwf sec movfw AL ; 余り = 1/100秒の値 movwf csec movlw min ; 各値を文字列に変換 movwf FSR mloop3 movfw INDF call itoa ; CH:CL = itoa(W) movfw CH ; 文字列の表示 movwf odc_datL call odc_send movfw CL movwf odc_datL call odc_send incf FSR, F movfw FSR sublw csec + 1 btfsc STATUS, Z goto mloop4 movlw 0x0b ; ':' movwf odc_datL call odc_send goto mloop3 mloop4 bsf PORTA, A_CS ; /CS goes high return ; 割り算 AH:AL / BH:BL = CH:CL ; function_div movlw 0xf0 movwf FSR clrf CL clrf CH position btfsc BH, 7 goto divloop rlf BL, F rlf BH, F incfsz FSR, F goto position return divloop decf FSR, F call neg_bx call add_ax call neg_bx rlf CL, F rlf CH, F btfsc CL, W goto div_2 call add_ax div_2 bcf STATUS, C rrf BH, F rrf BL, F btfsc FSR, 4 goto divloop return neg_bx comf BL, F ; BH:BL 2の補数 comf BH, F incf BL, F btfsc STATUS, Z incf BH, F retlw 0 add_ax movfw BL ; AH:AL += BH:BL addwf AL, F movfw BH btfsc STATUS, C incfsz AH, F addwf AH, W movwf AH iorwf AL, W retlw 0 ; 50msウェイト ; wait50 clrf TMR0 wait50a movlw CSEC * 5 subwf TMR0, W btfss STATUS, Z goto wait50a return ; 文字列データ ; org 0x344 init_d addwf PCL, F dt 0xf0, 0x00, 0xd0, 0x4e dt 0x00, 0x00, 0x00, 0x86 dt 0x0c, 0x86 title_s addwf PCL, F dt 0x18, 0x21, 0xfd, 0xfe, 0xad ; IR字幕ラ dt 0xc1, 0xbe, 0xa3, 0x96, 0xa9 ; ップタイマ dt 0xc5, 0x25, 0x02, 0x0d, 0x00 ; ーV2.0 dt 0x7f, 0x7f, 0x7f, 0x7f, 0x7f dt 0x7f, 0x7f, 0x7f, 0x7f, 0x7f dt 0x7f, 0x7f, 0x7f, 0x7f, 0x01 ; 1 dt 0x09, 0x09, 0x07, 0x62, 0x12 ; 997(C dt 0x63, 0x9a, 0xa0, 0xa9, 0x7f, 0xff ; )カシマ push_s addwf PCL, F dt 0x1f, 0x24, 0x22, 0x17, 0x7f ; PUSH dt 0x22, 0x23, 0x10, 0x21, 0x23, 0xff ; START ovfl_s addwf PCL, F dt 0x1e, 0x25, 0x14, 0x21, 0x15 ; OVERFLOW dt 0x1b, 0x1e, 0x26, 0xff time_s addwf PCL, F dt 0x23, 0x1e, 0x1f, 0x7f, 0x6b ; TOP * dt 0x6b, 0x7f, 0x0a, 0x0a, 0x0b ; * --: dt 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0xff ; --:-- time2_s addwf PCL, F dt 0x1b, 0x10, 0x1f, 0x7f, 0x6b ; LAP * dt 0x6b, 0x7f, 0x0a, 0x0a, 0x0b ; * --: dt 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0xff ; --:-- lap_s addwf PCL, F dt 0x1b, 0x10, 0x1f, 0xff ; LAP rdy_s addwf PCL, F dt 0x7f, 0x7f, 0x21, 0x14, 0x10 ; REA dt 0x13, 0x28, 0x78, 0x7f, 0x7f, 0xff ; DY! flap_s addwf PCL, F dt 0x15, 0x18, 0x21, 0x22, 0x23 ; FIRST dt 0x14, 0x22, 0x23, 0x7f, 0x1b ; EST L dt 0x10, 0x1f, 0x78, 0xff ; AP! rest_s addwf PCL, F dt 0x1f, 0x24, 0x22, 0x17, 0x7f ; PUSH dt 0x21, 0x14, 0x22, 0x14, 0x23 ; RESET dt 0x7f, 0x23, 0x1e, 0x7f, 0x21 ; TO R dt 0x14, 0x23, 0x21, 0x28, 0x7f, 0xff ; ETRY nodat_s addwf PCL, F dt 0x1d, 0x1e, 0x7f, 0x13, 0x10 ; NO DA dt 0x23, 0x10, 0x7f, 0x7f, 0xff ; TA conte_s addwf PCL, F dt 0x1b, 0x10, 0x1f, 0x7f, 0x12 ; LAP C dt 0x1e, 0x1d, 0x23, 0x14, 0x1d ; ONTEN dt 0x23, 0x22, 0xff ; TS end