;　　　　　　プログラム名　　　DL_V1.asm
;;
;開発開始　２００２年２月６日　　　　　　　　　　金野
;
;　　　　　２００２年３月２日一応完成
;                 
;１０ＭＨｚロジックアナライザのプログラムが母である
;
;表示装置に５．５インチパッシブカラー液晶モジュールＬＭ３２Ｃ０４１を使用した
;２チャンネル・データロガーのプログラムである。
;
;アセンブラ言語はマイクロチップ社純正ＭＡＳＭ
;
;（１）アナログ入力　
;　　　入力電圧範囲　　　　－２．５Ｖ～＋２．５Ｖ
;　　　入力チャンネル数　　２つ（１ｃｈ＝ＡＮ０／ＲＧ３，　２ｃｈ＝ＡＮ１／ＲＧ２）
;　　　増幅度　　　　　　　１倍～約１００倍
;
;（２）ＡＤ変換
;　　　１０ビット　　（１０，９，８，７，６，５，４，３、２，１）　２バイト必要
;　　　結果は左揃え　Ｈｉバイト＝（１０，９，８，７，６，５，４，３）
;　　　　　　　　　　Ｌｏバイト＝（２，１，０，０，０，０，０，０）
;
;（３）メモリ
;　　　２５６ｋビット＝３２ｋバイト×８ビット
;　　　番地の配当方法
;　　　　０番地　１ｃｈのＨｉ、　１番地　１ｃｈのＬｏ、　
;　　　　２番地　２ｃｈのＨｉ、　３番地　２ｃｈのＬｏ、　以下繰り返し
;
;
;画面の使用方法
;　（１）描写の原点（通常左上）が描写に当たって、左下になる配置とする
;
;
;                  ________________________________
;                  :                               :
;                  :     ________20___________     :   
;                  :    |                     |    :   
;                  :    |                     |    :
;                  :    |        64           |    :   
;                  :  2 |_____________________|    :     
;                  :    |                     |    :   
;                  :    |        64           |    :
;                  :    |                     |    :
;                  :    |_____________________|    :
;          320     :    |                     |    :
;                  :    |                     |    :
;                  :    |        64           |    :
;                  :  1 |_____________________|    :
;                  :    |                     |    :
;                  :    |                     |    :
;                  :    |         64          |    :
;                  :    |_____________________|    :
;              ↑  :     ←       231       →     :
;                  :↑                             : 
;              40  :↑           menu              : 18
;              ↓  : ____________________________  ; 10
;
;                   ←20→      
;                                 240
;
;    menu1  channel      1  2     
;    menu2  sampling time  50μ 100μ 200μ 500μ 1m 2m 5m 10m 20m 50m 0.1s 0.2s 0.5s 1s 2s
;
;ＲＳ－２３２Ｃ送信出力データの並び方（受信側が知っておく必要がある）
;　　　　（１）　samptime    　　サンプリング時間番号　０～１４までの数値
;　　　　　　　　インターバル　　待機時間
;　　　　（２）　８１９２バイト　１チャンネル分２バイト、２チャンネル分２バイト、、繰り返し
;　　　　　　　　インターバル　　待機時間
;　　　　（３）　８１９２バイト　１チャンネル分２バイト、２チャンネル分２バイト、、繰り返し
;　　　　　　　　インターバル　　待機時間
;　　　　（４）　８１９２バイト　１チャンネル分２バイト、２チャンネル分２バイト、、繰り返し
;　　　　　　　　インターバル　　待機時間
;　　　　（５）　８１９２バイト　１チャンネル分２バイト、２チャンネル分２バイト、、繰り返し
;
;　　送信総バイト数＝１バイト（＝添付バイト）＋３２７６８バイト（＝メモリバイト数）
;
;**********************************************************************************************
;
     LIST P=PIC17C756           ;使用するプロセッサの種類を指定する
     #INCLUDE "P17C756.INC"     ;上記のプロセッサ用インクルードファイルを呼び出し、結合する

;PIC本体の初期設定
     __CONFIG  _MC_MODE & _WDT_OFF & _XT_OSC & _BODEN_ON 
                                ;ＰＩＣはマイクロコントローラモード
                                ;これでポートＣその他の端子がＩ／Ｏポートとなる
                                ;ウオッチドックタイマーはオフ
                                ;発信はクリスタル方式
                                ;ブラウンアウトはオン。規定電圧以下となるとリセットする
;**********************************************************************************************
;使用する変数の定義
   CBLOCK h'0020'
      i           ;任意使用のカウンタ変数
      count       ;任意使用のカウンタ変数
      current     ;同上
      temp0       ;カウンター用変数
      temp1       ;カウンター用変数
      temp2       ;カウンター用変数
      temp3       ;カウンター用変数
      linecount   ;行数カウンタ
      retucount   ;列数カウンタ
      jobmode     ;処理の種類の識別用変数
                  ;０＝初期画面表示、　１＝測定結果の画面表示
      proctype    ;データ表示画面において、各処理操作に対応させる変数
                  ;　０＝リセット、　１＝左移動、　２＝縮小、　３＝拡大、　４＝右移動 
      overflow    ;画面表示において、読み出しメモリアドレスのオーバーフロー
                  ;チェックに使用する　第０ビット　オーバーフロー＝１
      remeasure   ;再測定のために使用する変数　第０ビットを使用
                  ;＝０　グラフ処理モード、　＝１　再測定、
      reducount   ;縮小回数値が入る変数　初期値を０としておく
      addressstep ;アドレスアップの値のはいる変数　初期値は４としておく
      adlowback   ;データ描写において、メモリ番地の指定地を
      adhigback   ;一時バックアップする変数

      leftaddlow     ;データ表示画面での左端データのアドレス値が入る変数　　低位８ビット
      leftaddhight   ;　　　　　　　　　　　　　　　　　　　　　　　　　　　高位８ビット
      rightaddlow    ;データ表示画面での右端データのアドレス値が入る変数　　低位８ビット
      rightaddhight  ;　　　　　　　　　　　　　　　　　　　　　　　　　　　高位８ビット
      wideaddlow     ;データ表示画面での左右両端間のデータアドレス数の低位８ビットが入る変数
      wideaddhight   ;　　　　　　　　　　　　　　　　　　　　　　　　高位８ビット
      midaddlow      ;画面に表示されているデータの中間アドレスの低位８ビットが収まる変数
      midaddhight    ;　　　　　　　　　　　　　　　　　　　　　高位８ビット　　
      samptime    ;サンプリング時間番号が入る。初期値＝０（５０μ）としておく。
                  ;１＝１００μ、２＝２００μ、３＝５００μ、４＝１ｍ、５＝２ｍ、６＝５ｍ、７＝１０ｍ、
                  ;８＝２０ｍ　９＝５０ｍ、１０＝０．１ｓ，１１＝０．２ｓ、１２＝０．５ｓ，
                  ;１３＝１ｓ、１４＝２ｓ
      char_number ;メニュー領域に表示する文字分に割り当てる変数
      charcount   ;文字番号カウンタ用変数
      charcode    ;文字の８ビットコードが入る
      datacode    ;メモリの８ビットデータが入る変数

      HightbyteA  ;１１ビット減算用変数
      LowbyteA    ;　Ａ－Ｂ＝Ｃ
      HightbyteB  ;
      LowbyteB    ;
      HightbyteC  ;
      LowbyteC    ;

      timescale_wline ;横軸時間幅を表示する変数　初期値を霧の良い数２００としておく
      timebandcount   ;横軸時間幅を描写する際に使用するカウンタ変数

      Datahig1    ;第１チャンネルの１０ビットＡＤ変換値の高位８ビットが収まる変数
      Datalow1    ;　　　　　　　　　　　下位２ビットが収まる変数
      Datahig2    ;第２チャンネルの１０ビットＡＤ変換値の高位８ビットが収まる変数
      Datalow2    ;　　　　　　　　　　　下位２ビットが収まる変数
      colorset    ;文字色切り替え用変数。第０ビット目を使用。時間長数値を黄色で描写したい。

      bcounter0   ;ＲＳ－２３２Ｃ用変数　１ブロック＝８１９２データ（１６３８４バイト）分を
      bcounter1   ;カウントするための変数　８１９２＝３２×２５６
                  ;bcounter1+bcounter0 で、１６ビットカウンタを作る。高位側のｂ５ビットを
                  ;フラッグとして使用し、データ８１９２個の送信完了の印とする。
                  ;今回、ここで使用しているメモリは２５６ｋビット＝３２ｋバイト×８ビット
                  ;なので、送信は４ブロックとなる。
                  ;受信側のプログラムと相性を合わせること
   ENDC

;*********************************
;使用する端子に固有名詞を定義し、わかりやすく（？）する
;末尾の数値はバンク番号を示している
  #define      VSYNC_1  PORTE,0     ;ＬＣＤ制御端子
  #define      HSYNC_1  PORTE,1     ;　同上
  #define      DCK_1    PORTE,2     ;　同上

  #define      LEDmon_1   PORTE,3   ;動作チェック用ＬＥＤ        

  #define      Mainmenu   PORTA,3   ;主メニューの選択ボタンスイッチ
  #define      Submenu    PORTA,4   ;副メニューの選択ボタンスイッチ
  #define      Decide     PORTA,2   ;メニュー決定ボタンスイッチ

  #define    Addresslow      PORTB  ;１６ビットアドレスの下位８ビット用ポートの名称
  #define    Addresshight_1  PORTC  ;　　　　　　　　　　上位８ビット用ボートの名称（バンク１にある）

  #define     WE_5        PORTG,7   ;メモリのＷ／Ｒ制御ビット
  #define     CS_5        PORTG,5   ;メモリのチップ選択ビット

  #define     Overflow    PORTA,0   ;アドレスオーバーフローフラッグビット。ＩＮＴ／ＲＡ０と接続している
                                    ;この端子がＨレベルになった時、測定終了とする。
  #define     Data_1      PORTD     ;ポートＤが８ビットデータを取り扱うので、そう呼称する。バンク１にある

  #define     RS_232C    PORTA,1    ;ＲＳ－２３２Ｃ送信開始ボタンスイッチの名称

;*********************************
;使用する定数の定義
timebase0   equ     5          ;時間幅設定用定数その０
timebase1   equ   255          ;時間幅設定用定数その１
timebase2   equ   255          ;時間幅設定用定数その２

channum     equ     2          ;測定チャンネル数
Ydiv        equ     4          ;グラフ画面のＹ軸方向の区分数（ｃｈ１の＋、－、ｃｈ２の＋、－）

dott48      equ    48          ;指定遅延定数　４８ドット分
dott8       equ     8          ;指定遅延定数　　８ドット分
linenum     equ    60          ;描写行数　２４０行   
quadline    equ    60          ;６０行分
hdd32       equ    32          ;１水平線当たりの描写ドット数
hdd10       equ    10          ;　３２０ドット=hdd32*hdd10
hdd16       equ    16          ;
hdd24       equ    24

ini_row     equ     1          ;左側面の塗りつぶす列数
char_row    equ     4          ;左側面に表示する１文字分に割り当てる列数（文字幅）
char_heig   equ     8          ;左側面に表示する１文字分に割り当てる列数（文字高さ）
ini_line    equ    40          ;グラフ領域の最下行
fin_line    equ    20  ;40          ;グラフ最上段行と画面最上段行の間の行数
int_line    equ    65  ;60          ;チャンネル間の行数

menu_sline  equ    10          ;メニュー文字表示領域の開始行
menu_wline  equ     8  ;20          ;メニュー文字表示領域の行数 

menu_moji1  equ    16  ;15     ;メニュー（サンプリング時間）の文字群の列数   
menu_moji2  equ    20          ;メニュー欄に表示する横軸時間幅文字の列数

mark_num    equ    32  ;38     ;データ処理での記号群の列数

width       equ   231          ;グラフ幅の列数
height      equ   241          ;グラフ高の行数

timescale_hline    equ  5      ;横軸時間幅描写帯の高さ（ドット数）
timebit200  equ   200          ;時間軸の規定値

;ＡＤ変換チャンネルの指定、かつＡＤ変換器を音とする定数
channel0    equ   b'00000001'  ;ＡＮ０を選択
channel1    equ   b'00010001'  ;ＡＮ１を選択

;**********************************************************************************************
;**********************************************************************************************;
        org      0               ;
        goto   start             ;

;********************************
;割り込み処理
        org      h'18'           ;RA1/T0CKI での割り込み処理の分岐先は１６進数”１８”
handler
      ;当面、測定を中断させて、再測定モードに復帰させてみる
        movlw  b'00101100'       ;割り込みが発生すると、自動的に、それ以後割り込みを禁止している。
        movwf  CPUSTA            ;ｂ４＝０に戻し、再割り込みを許可させる。

        call   LEDon

      ;測定中断なので、後処理が必要
        clrf   Addresslow        ;アドレスカウンタが中断状態なので、クリアする
        movlb 1
        clrf  Addresshight_1     ;
        movlb 5
        bsf   ADCON1,PCFG1       ;アナログ端子をデジタル端子とする
        bsf   WE_5               ;メモリを読み出し可とする
        movlb 0
        bcf   remeasure,0        ;モードをグラフ処理モードとする

        movlw b'11111111'        ;ポートＤ端子を入力に変更
        movlb 1
        movwf DDRD               ;
        movlb 0
        
        call  LCDsetup           ;
        call  postdisplay        ;

        goto   subrepeat         ;再描写ルーチンに飛ぶ  

        return

;********************************
;スタート
start
      ;最初に割り込み処理の条件を設定する
        bcf    CPUSTA,4           ;ｂ４が全ての割り込みを制御。　b4=1 不可、　b4=0 許可
        movlw  b'00000100'       ;ｂ２がＲＡ１ピンでの割り込み制御
        movwf  INTSTA            ;１＝許可、　０＝不可
        movlw  b'01000000'       ;ｂ６がＲＡ１ピンでの割り込み信号のエッジ種類選択
        movwf  T0STA             ;（テーゼロ）１＝立ち上がり、　０＝立ち下がり

        call   initialsetting    ;諸々のパラメータ類の初期設定

mainrepeat
        movlw  b'00000000'       ;ポートＤを出力に変更
        movlb  1
        movwf  DDRD              ;
        movlb  0

        call   firstsetting      ;測定開始前の前処理
        call   LCDsetup          ;ＬＣＤのセットアップ
        call   firstdisplay      ;初期画面描写
        call   parameterset      ;サンプリング時間の選択   

        bcf    CPUSTA,4          ;割り込みで、測定を中断可とする。ｂ４＝０
        bsf    INTSTA,2          ;RA1/T0CKI での割り込みを許可する
        call   measure           ;測定実行

        bsf    CPUSTA,4          ;測定完了後は、割り込みを不可とし、割り込みスイッチは
                                 ;ＲＳ－２３２Ｃ送信スイッチとして使用できるようにする
        bcf    INTSTA,2          ;RA1/T0CKI での割り込みを禁止する

        movlw  b'11111111'       ;ポートＤを入力に変更
        movlb  1
        movwf  DDRD              ;
        movlb  0
        
        call   LCDsetup          ;ＬＣＤのセットアップ
        call   postdisplay       ;測定後の描写
subrepeat
        call   graphjob          ;グラフ処理パラメータの取り込み、そして再描写

        btfss  remeasure,0       ;再測定なのか、
        goto   grajump           ;再描写なのかで
        goto   mainrepeat        ;処理を分岐する
grajump
        call   LCDsetup          ;
        call   graredisplay      ;メニュー設定に従って、グラフを左右移動、縮小、拡大して再描写
        goto   subrepeat                         ;

;++++++++++++++++++++++++++++    
;        call   LEDon
;endless
;        goto   endless
;++++++++++++++++++++++++++++

        goto   jobend           ;実行終了

;**********************************************************************************************
;**********************************************************************************************
;初期設定
initialsetting
    ;ポートの設定  
    ;　ポートＡ　ＲＡ０～ＲＡ５
    ;　　　　　　　　ＲＡ０　　　　　入力端子　　　オーバーフロー検出端子
    ;　　　　　　　　ＲＡ１～ＲＡ４　入力端子　　　ボタンキー制御端子
    ;　　　　　　　　　　　　　　　　　　　　　　　ＲＡ１は強制割り込みに使用できる　
    ;　　　　　　　　ＲＡ５／ＴＸ１　出力端子　　　ＲＳ２３２Ｃ信号出力端子　
    ;　ポートＢ　ＲＢ０～ＲＢ７　全て入力端子　　　アドレス端子
    ;　ポートＣ　ＲＣ０～ＲＣ７　全て出力端子　　　アドレス端子
    ;　ポートＤ　ＲＤ０～ＲＤ７　全て入出力端子　　測定時は、　　　　　　　　出力端子に設定
    ;　　　　　　　　　　　　　　　　　　　　　　　メモリからの読み出し時は、入力端子に設定
    ;　ポートＥ　ＲＥ０～ＲＥ３　全て出力端子
    ;              　ＲＥ０、ＲＥ１，ＲＥ２　　　　ＬＣＤ制御ビット
    ;             　 ＲＥ３　　　　　　　　　　　　モニタＬＥＤ点灯ビット
    ;　ポートＦ　ＲＦ０～ＲＦ７　全て出力端子
    ;           　　 ＲＦ０，ＲＦ１，ＲＦ２　　　　ＬＣＤ赤色強度ビット
    ; 　　 　　　　　ＲＦ３，ＲＦ４，ＲＦ５　　　　ＬＣＤ緑色強度ビット
    ;            　　ＲＦ６，ＲＦ７　　　　　　　　ＬＣＤ青色強度ビット
    ;　ポートＧ　ＲＧ０～ＲＧ７　
    ;　　　　　　　　ＲＧ０　　　　　出力端子　　　ＬＣＤ青色強度ビット
    ;　　　　　　　　ＲＧ１　　　　　出力端子　　　未使用
    ;　　　　　　　　ＲＧ２、ＲＧ３　入力端子　　　アナログ入力端子　
    ;                  注意　この２チャンネルをアナログ入力端子に設定すると、同時に
    ;　　　　　　　　　　　　ＲＦ４，ＲＦ５端子もアナログ端子に設定されることに留意すること
    ;　　　　　　　　ＲＧ４　　　　　出力端子　　　未使用
    ;　　　　　　　　ＲＧ５　　　　　出力端子　　　メモリのＷ／Ｒ制御ビット
    ;　　　　　　　　ＲＧ６　　　　　出力端子　　　未使用　
    ;　　　　　　　　ＲＧ７　　　　　出力端子　　　メモリのチップ選択ビット
    ;関係するポートのバッファをクリア、及び初期設定
        clrf    PORTA        ;ポートＡにはDDRA はない
        clrf    PORTB
        movlw   b'00000000'  ;ポートＢを出力端子に設定
        movwf   DDRB         ;
        movlb   1            ;バンク１に移る
        clrf    PORTC
        clrf    PORTD        ;ポートＣ、Ｄ、Ｅ関係レジスタはバンク１にある
        clrf    PORTE        ;ポートＤはプログラム実行中に、必要に応じて入出力を設定
        movlw   b'00000000'  ;
        movwf   DDRC         ;ポートＣを出力端子に設定
        movwf   DDRD         ;ポートＤを出力端子に設定
        movwf   DDRE         ;ポートＥを出力端子に設定
        movlb   5            ;ポートＦ、Ｇ関係レジスタはバンク５にあるので
        clrf    PORTF        ;
        movlw   b'00000000'  ;
        movwf   DDRF         ;ポートＦを出力端子に設定
        movlw   b'00001100'  ;ポートＧの設定　ＲＧ２／ＡＮ１、ＲＧ３／ＡＮ０を入力端子とする
        movwf   DDRG         ;　　　　　　　　他端子は出力とする
        movlb   0            ;元に戻しておく
    ;ＡＤ変換器の初期設定
        movlb   5            ;ADCON0,ADCON1 レジスタはバンク５にある
        movlw   b'00000001'  ;(b7,b6,b5,b4)=チャンネル指定、　b2=GO/DONE, b1=ADON 
        movwf   ADCON0       ;
        movlw   b'00001110'  ;ＡＤ変換クロックはFoscの８分の１とする。  (b7,b6)=(0,0)
        movwf   ADCON1       ;ＡＤ結果の書式は左揃えとする。               (b5)=(0)
        movlb   0            ;アナログ入力は全てデジタル端子としておく。 (b3,b2,b1)=(1,1,1)
                             ;ＡＮ０，ＡＮ１だけをアナログ入力としたいが、それができない。
                             ;(b3,b2,b1)=(1,1,0) とすると、同時にＲＦ８，ＲＦ９もアナログ端子に
                             ;設定されて、不調を来す。ＲＦ８，ＲＦ９はＬＣＤに接続している。そのため、
                             ;測定開始時に、設定を変更し、測定終了と共に、もとへ戻すことにする。
                             ;　測定開始時　b1=0，　　測定終了時　b1=1　とする
                             ;ＡＤ変換基準電圧は、AVddとAVssとする。       (b0)=(0)  
    ;アドレスビット（ＲＣ＋ＲＢ＝１６ビット）の初期設定
        clrf    Addresslow      ;
        movlb   1
        clrf    Addresshight_1  ;
        movlb   0 
        clrf    leftaddlow     
        clrf    leftaddhight   ;
        clrf    rightaddlow    ;
        clrf    rightaddhight  ;
        clrf    wideaddlow     ;
        clrf    wideaddhight   ;
        clrf    midaddlow      ;
        clrf    midaddhight    ;　　

    ;サンプリング動作に関する初期設定
        clrf    samptime          ;＝０とし、５０μを初期指定

    ;測定の際に使用する変数
        bcf    remeasure,0   ;第０ビット目だけを使用する

    ;横軸時間スケール描写に使用する変数
        movlw   timebit200        ;200を               ;
        movwf   timescale_wline   ;timescale_wline に代入する

     ;ＲＳ－２３２Ｃ（非同期通信）の設定
        bsf     RCSTA1,SPEN       ;RA5/TX1/CK1 端子をシリアルポートに設定
        bsf     TXSTA1,CSRC       ;クロックソースの選択ビット。０，１でも非同期通信では無視される
        bcf     TXSTA1,TX9        ;送信データビット長の選択。＝０で８ビット送信        
        bcf     TXSTA1,TXEN       ;＝０で送信をディセーブルとする
        bcf     TXSTA1,SYNC       ;ＵＳＡＲＴモード選択ビット。＝０で非同期モード
        movlw   15                ;ボーレートの設定
        movwf   SPBRG1            ;２０Ｍクロック時、１９２００ボーに設定

        return

;*****************************************
;測定開始前の前処理　初期設定と分離する必要があった
firstsetting
    ;メモリの初期設定
        movlb  5
        bsf    WE_5               ;書き込み及び読み出し共に不可としておく。
        bsf    CS_5               ;
        movlb  0
    
    ;データ描写画面における初期設定
        clrf   Addresslow         ;アドレスカウンタを
        movlb  1                  ;クリアしておく
        clrf   Addresshight_1     ;
        movlb  0                  ;

        call   memoryclear        ;ＳＲＡＭの内容をクリアして、初期化する。

        clrf   proctype           ;＝０として、リセット文字に対応させておく
        clrf   reducount          ;縮小回数値は、初期値を０としておく
        movlw  4
        movwf  addressstep        ;アドレスステップの初期値は４としておく。理由は序文参照
        clrf   leftaddlow         ;グラフ画面両端の
        clrf   leftaddhight       ;１６ビットアドレス変数の
        clrf   rightaddlow        ;初期値の設定　　（０）－（０）の設定値
        clrf   rightaddhight      ;
        movlw  timebit200         ;横軸時間スケール描写に使用する変数を初期値とする               ;
        movwf  timescale_wline    ;timescale_wline に代入する

        clrf   colorset           ;初期値を０とする
        clrf   Overflow           ;画面表示で使用するオーバー、アンダーフラッグをクリア

        return

;*****************************************
;ＳＲＡＭの内容のクリア
memoryclear
        movlb  5                  ;
        bcf    WE_5               ;メモリを書き込みモードとする
        movlb  1
        clrf   Data_1             ;データポートに０を出力する
mcloop
        movlb  5
        bcf    CS_5               ;メモリチップを能動とし、
        bsf    CS_5               ;続いて、非選択とすることで書き込み操作を完了させる
        movlb  0

        call   addressup          ;アドレスを＋１する
    
        btfss  Overflow           ;アドレスがオーバーフローしたら終了させる
        goto   mcloop
        movlb  5
        bcf    WE_5               ;メモリを読み出しモードに戻しておく
        movlb  0                  ;
        clrf   Addresslow         ;アドレスカウンタを
        movlb  1                  ;クリアしておく
        clrf   Addresshight_1     ;
        movlb  0                  ;

        return

;**********************************************************************************************
;**********************************************************************************************
;ＬＣＤの描写開始前に必須な処理
LCDsetup
        movlb   1
        bcf     VSYNC_1      ;垂直同期準備
        movlb   0
        call    wallpaint    ;３×１行分の時間幅が必要とされているので
        call    wallpaint    ;
        call    wallpaint    ;
        movlb   1
        bsf     VSYNC_1      ;垂直同期開始
        movlb   0
        call    wallpaint    ;水平同期開始まで、４×１行分の時間幅の待機が必要とされているので
        call    wallpaint    ;
        call    wallpaint    ;
        call    wallpaint    ;

        return

;**********************************************************************************************
;**********************************************************************************************
;初期画面描写
firstdisplay
       ;処理の初期設定
        movlw  0
        movwf  jobmode       ;

        call    wallpaint    ;一列の塗りつぶし
        call    chardisp     ;チャンネル番号文字表示
        call    wallpaint    ;１列の塗りつぶし
        call    sideline     ;グラフの測線の描写
        call    dataline     ;各チャンネルの基準横線及びデータ線の描写
        call    sideline     ;グラフの測線の描写
        call    wallpaint    ;二列の塗りつぶし
        call    wallpaint    ;
        
        return

;*********************************************************************************************
;*********************************************************************************************
;サンプリング時間の選択及び決定
;メインスイッチ＝初期状態へ戻す、サブスイッチ＝時間のスクロール、決定スイッチ＝決定し、測定実行
parameterset

paraloop
        btfsc  Decide          ;決定スイッチが押されていれば、測定実行に移るため、
        goto   paraend         ;ここでの処理を終了
        btfsc  Mainmenu        ;メインスイッチが押されれば、
        goto   start           ;初期設定に戻る
        btfss  Submenu         ;サブスイッチが押されていれば、メニューのスクロールへ行く
        goto   paraloop        ;押されていなければ、決定キーのチェックに戻る

        incf   samptime        ; 
        movfp  samptime,WREG   ;samptime を＋１する
        sublw  15              ;
        btfsc  ALUSTA,Z        ;１５になったならば、０に戻す
        movlw  0               ;
        btfsc  ALUSTA,Z        ;
        movwf  samptime        ;
        call   LCDsetup        ;
        call   redisplay       ;再描写に行く
        goto   paraloop        ;キーの待機状態へと戻る
paraend
        return

;**********************************************************************************************
;**********************************************************************************************
;測定実行　
;繰り返しで、信号のサンプリング及びメモリへの書き込みをさせ、
;アドレスのオーバーフローが発生した時点（　Overflow がＨレベル）で、測定を終了させる。
measure
     ;ＡＤ変換開始直前の処理。　ＡＮ０、ＡＮ１端子を能動とする
       movlb  5              ;バンク５
       bcf    ADCON1,PCFG1   ;PCFG1=0 とし、アナログ端子が能動となる
       movlb  0              ;

     ;メモリを書き込み能動とする
       movlb  5
       bcf    WE_5           ;書き込み可とする
       movlb  0

measloop 
     ;チャンネル１を選択し、ＡＤ変換をし、メモリに書き込む
       movlb  5              ;
       movlw  channel0       ;ＡＮ０を選択し、ＡＤ変換器をオン   
       movwf  ADCON0         ; 
       movlb  0              ;
       call   ADcon_wri      ;

     ;チャンネル２を選択し、ＡＤ変換をし、メモリの書き込む
       movlb  5              ;
       movlw  channel1       ;ＡＮ１を選択し、ＡＤ変換器をオン    
       movwf  ADCON0         ;
       movlb  0              ;
       call   ADcon_wri      ;

       btfss  Overflow       ;１６ビットアドレスの最高位ビットがＨレベルとなった時、
       goto   measloop       ;アドレスオーバーフローとして、測定を終了させる
                             ;出ないときは、繰り返し測定を行う
       clrf   Addresslow     ;アドレスバスの値をクリアし、
       movlb  1              ;次の処理へはいる
       clrf   Addresshight_1 ;
       movlb  0

     ;ＡＤ変換終了後の処理
       movlb  5              ;バンク５
       bsf    ADCON1,PCFG1   ;PCFG1=1 とし、アナログ端子が全てデジタル端子となる
       bsf    WE_5          ;メモリを読み出し可としておく、
       movlb  0
       bcf    remeasure,0   ;モードをグラフ処理モードに設定する  

       return

;*****************************************
;ＡＤ変換器を充電させ、そしてＡＤ変換実行、そして結果のメモリへの書き込み
ADcon_wri
       movlw  8 ; 5  ;10     ;正確なＡＤ変換をさせるために、
       movwf  temp0          ;必要な待機時間を稼ぐ
adwaitloop                   ;５はだめ、１０は良し
       decfsz temp0,1
       goto   adwaitloop

       movlb  5              ;
       bsf    ADCON0,GO      ;ＡＤ変換実行
nodone
       btfsc  ADCON0,GO      ;ＡＤ変換が完了すれば、
       goto   nodone         ;ＧＯビットは０となる。 
     ;上位８ビットのメモリへの書き込み
       movfp  ADRESH,WREG    ;１０ビットの内上位８ビットをＷに取り込む
       movlb  1              ;データの出力はＤポート。バンク１にある
       movwf  Data_1         ;RD=Data_1 と命名している
       movlb  5              ;
       bcf    CS_5           ;メモリのＣＳ端子を０としてから、１とする。
       bsf    CS_5           ;これでメモリへの書き込みが完了
       movlb  0
       call   addressup      ;メモリアドレスを＋１する
     ;下位２ビット分のメモリへの書き込み    
       movlb  5              ;   
       movfp  ADRESL,WREG    ;１０ビットの内下位２ビットをＷに取り込む
       movlb  1              ;データの出力はＤポート。バンク１にある
       movwf  Data_1         ;RD=Data_1 と命名している
       movlb  5              ;
       bcf    CS_5           ;メモリのＣＳ端子を０としてから、１とする。
       bsf    CS_5           ;これでメモリへの書き込みが完了
       movlb  0              ;
       call   addressup      ;メモリアドレスを＋１する
   
     ;サンプリング時間幅の設定
     ;サンプリング時間数値は変数 samptime の値と対応している

       movfp  samptime,WREG  ;
       sublw  0              ;samptime=0 の時、サンプリング時間幅＝５０μ　
       btfsc  ALUSTA,Z       ;
       call   delay50u       ;
       movlw  0              ;
       cpfseq samptime       ;この処理がないと、下の全部のステップをしなければならない
       goto   stnext1        ;ショートカットをする
       goto   stend          ;
       
stnext1
       movfp  samptime,WREG  ;
       sublw  1              ;samptime=1 の時、サンプリング時間幅＝１００μ　
       btfsc  ALUSTA,Z       ;
       call   delay100u      ;
       movlw  1              ;
       cpfseq samptime       ;この処理がないと、下の全部のステップをしなければならない
       goto   stnext2        ;ショートカットをする
       goto   stend          ;

stnext2
       movfp  samptime,WREG  ;
       sublw  2              ;samptime=2 の時、サンプリング時間幅＝２００μ　
       btfsc  ALUSTA,Z       ;
       call   delay200u      ;
       movlw  2              ;
       cpfseq samptime       ;この処理がないと、下の全部のステップをしなければならない
       goto   stnext3        ;ショートカットをする
       goto   stend          ;

stnext3
       movfp  samptime,WREG  ;
       sublw  3              ;samptime=3 の時、サンプリング時間幅＝５００μ　
       btfsc  ALUSTA,Z       ;
       call   delay500u      ;
       movlw  3              ;
       cpfseq samptime       ;この処理がないと、下の全部のステップをしなければならない
       goto   stnext4        ;ショートカットをする
       goto   stend          ;

stnext4
       movfp  samptime,WREG  ;
       sublw  4              ;samptime=4 の時、サンプリング時間幅＝１ｍ　
       btfsc  ALUSTA,Z       ;
       call   delay1m        ;

       movfp  samptime,WREG  ;
       sublw  5              ;samptime=5 の時、サンプリング時間幅＝２ｍ　
       btfsc  ALUSTA,Z       ;
       call   delay2m        ;

       movfp  samptime,WREG  ;
       sublw  6              ;samptime=6 の時、サンプリング時間幅＝５ｍ　
       btfsc  ALUSTA,Z       ;
       call   delay5m        ;

       movfp  samptime,WREG  ;
       sublw  7              ;samptime=7 の時、サンプリング時間幅＝１０ｍ　
       btfsc  ALUSTA,Z       ;
       call   delay10m       ;

       movfp  samptime,WREG  ;
       sublw  8              ;samptime=8 の時、サンプリング時間幅＝２０ｍ　
       btfsc  ALUSTA,Z       ;
       call   delay20m       ;

       movfp  samptime,WREG  ;
       sublw  9              ;samptime=9 の時、サンプリング時間幅＝５０ｍ　
       btfsc  ALUSTA,Z       ;
       call   delay50m       ;

       movfp  samptime,WREG  ;
       sublw  10             ;samptime=10 の時、サンプリング時間幅＝０．１ｓ　
       btfsc  ALUSTA,Z       ;
       call   delay0.1s      ;

       movfp  samptime,WREG  ;
       sublw  11             ;samptime=11 の時、サンプリング時間幅＝０．２ｓ　
       btfsc  ALUSTA,Z       ;
       call   delay0.2s      ;

       movfp  samptime,WREG  ;
       sublw  12             ;samptime=12 の時、サンプリング時間幅＝０．５ｓ　
       btfsc  ALUSTA,Z       ;
       call   delay0.5s      ;

       movfp  samptime,WREG  ;
       sublw  13             ;samptime=13 の時、サンプリング時間幅＝１ｓ　
       btfsc  ALUSTA,Z       ;
       call   delay1s        ;

       movfp  samptime,WREG  ;
       sublw  14             ;samptime=14 の時、サンプリング時間幅＝２ｓ　
       btfsc  ALUSTA,Z       ;
       call   delay2s        ;
stend
       return

;*****************************************
;５０μ遅延
delay50u
       movlw  5              ;
       movwf  temp0          ;
timeloop0
       decfsz temp0,1        ;
       goto   timeloop0
       return

;１００μ遅延
delay100u
       movlw  44             ;
       movwf  temp0          ;
timeloop1
       decfsz temp0,1        ;
       goto   timeloop1
       return

;２００μ遅延
delay200u
       movlw  123            ;
       movwf  temp0          ;
timeloop2
       decfsz temp0,1        ;
       goto   timeloop2
       return

;５００μ遅延
delay500u
       movlw  32             ;
       movwf  temp0          ;
       movlw  10
       movwf  temp1          ;
timeloop3                    ;３２０＝３２×１０
       decfsz temp1,1        ;
       goto   timeloop3
       movlw  10
       movwf  temp1
       decfsz temp0,1
       goto   timeloop3
       return

;１ｍ遅延
delay1m
       movlw  36             ;
       movwf  temp0          ;
       movlw  20
       movwf  temp1
timeloop4                    ;７２０＝３６×２０
       decfsz temp1,1
       goto   timeloop4
       movlw  20
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop4
       return

;２ｍ遅延
delay2m
       movlw  38             ;
       movwf  temp0          ;
       movlw  40
       movwf  temp1
timeloop5                    ;１５２０＝３８×４０
       decfsz temp1,1
       goto   timeloop5
       movlw  40
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop5
       return

;５ｍ遅延
delay5m
       movlw  40             ;
       movwf  temp0          ;
       movlw  100
       movwf  temp1
timeloop6                    ;４０００＝４０×１００
       decfsz temp1,1
       goto   timeloop6
       movlw  100
       movwf  temp1  
       decfsz temp0,1        ;
       goto   timeloop6
       return

;１０ｍ遅延
delay10m
       movlw  40             ;
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop7                    ;８０００＝４０×２００
       decfsz temp1,1
       goto   timeloop7
       movlw  200
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop7
       return
;２０ｍ遅延
delay20m
       movlw  80             ;
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop8                    ;１６０００＝８０×２００
       decfsz temp1,1
       goto   timeloop8
       movlw  200
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop8
       return

;５０ｍ遅延
delay50m
       movlw  200            ;試験値
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop9                    ;４００００＝２００×２００
       decfsz temp1,1
       goto   timeloop9
       movlw  200
       movwf  temp1 
       decfsz temp0,1        ;
       goto   timeloop9
       return

;０．１ｓ遅延
delay0.1s
       movlw  2
       movwf  temp2
tl10
       movlw  200            ;試験値
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop10                   ;８００００＝２ループ×２００×２００
       decfsz temp1,1
       goto   timeloop10
       movlw  200
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop10
       decfsz temp2,1
       goto   tl10 
       return

;０．２ｓ遅延
delay0.2s
       movlw  4
       movwf  temp2
tl11
       movlw  200            ;試験値
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop11                   ;１６００００＝４ループ×２００×２００
       decfsz temp1,1
       goto   timeloop11
       movlw  200
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop11
       decfsz temp2,1
       goto   tl11 
       return

;０．５ｓ遅延
delay0.5s
       movlw  10
       movwf  temp2
tl12
       movlw  200            ;試験値
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop12                   ;４０００００＝１０ループ×２００×２００
       decfsz temp1,1
       goto   timeloop12
       movlw  200
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop12
       decfsz temp2,1
       goto   tl12
       return

;１ｓ遅延
delay1s
       movlw  20
       movwf  temp2
tl13
       movlw  200            ;試験値
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop13                   ;８０００００＝２０ループ×２００×２００
       decfsz temp1,1
       goto   timeloop13
       movlw  200
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop13
       decfsz temp2,1
       goto   tl13 
       return

;２ｓ遅延
delay2s
       movlw  40
       movwf  temp2
tl14
       movlw  200            ;試験値
       movwf  temp0          ;
       movlw  200
       movwf  temp1
timeloop14                   ;１６０００００＝４０ループ×２００×２００
       decfsz temp1,1
       goto   timeloop14
       movlw  200
       movwf  temp1
       decfsz temp0,1        ;
       goto   timeloop14
       decfsz temp2,1
       goto   tl14
       return

;*****************************************
;１６ビットアドレスを＋１する
addressup
       bcf    ALUSTA,C       ;
       incf   Addresslow     ;低位８ビットを＋１する
       btfss  ALUSTA,C       ;オーバーフローしたら、クリアし、
       goto   addjump        ;
       clrf   Addresslow     ;
       movlb  1
       incf   Addresshight_1 ;高位８ビットを＋１する
       movlb  0              ;  
addjump
       return

;**********************************************************************************************
;**********************************************************************************************
;測定後の画面描写
postdisplay
        movlw   1               ;初期画面表示処理と識別させる
        movwf   jobmode         ;

    ;メモリからデータ読み出すための前処理
       ;メモリを読み出し可能とする
        movlb   5
        bsf     WE_5            ;
        bcf     CS_5            ;
        movlb   0

    ;グラフ描写開始
        ;チャンネル番号などの描写
        call    wallpaint     ;一列の塗りつぶし
        call    chardisp      ;
        call    wallpaint     ;一列の塗りつぶし
        call    sideline      ;グラフの測線の描写

        ;データ点の描写　当面、０～２３１番地までのデータを描写する
        call    dataplot      ;操作記号、文字、チャンネル基準線、データ線の描写

        ;後処理描写
        call    sideline      ;グラフの測線の描写
        call    wallpaint     ;２列の塗りつぶし
        call    wallpaint

        ;横軸時間幅描写の際に使用する定数の設定、変数をクリアしておく
        movlw   timebit200       ;
        movwf   timescale_wline  ;初期値に設定する
        clrf    timebandcount    ;

        return

;**********************************************************************************************
;**********************************************************************************************
;操作記号、文字、チャンネル基準線、データ線の描写
dataplot
        clrf    timebandcount        ;時間幅設定用ドット数設定カウンタ変数をクリアしておく
        clrf    char_number
        clrf    current
        movlw   width
        movwf   linecount

     ;決定された描写する左端データ番号を取り込み、読み出すメモリアドレス値とする
        movfp   leftaddlow,WREG      ;
        movwf   Addresslow           ;決定した１６ビットアドレス値を１６ビットアドレスポートに出力
        movfp   leftaddhight,WREG    ;
        movlb   1
        movwf   Addresshight_1       ;
        movlb   0

     ;メモリを読み出し可とする
        movlb   5                    ;
        bsf     WE_5                 ;目盛りをｒｅａｄモードとし、
        bcf     CS_5                 ;読み出し可とする。
        movlb   0
dploop
        call    HDISP_INI

        call    lowareaplot          ;画面の下部分の描写（操作記号、時間長棒、文字）
        call    whidotto             ;一番下の基準グラフ線の描写

        movfp   Addresslow,WREG      ;
        movwf   adlowback            ;アドレス値をバックアップしておく
        movlb   1
        movfp   Addresshight_1,WREG  ;
        movlb   0
        movwf   adhigback            ;アドレス値をバックアップしておく

       ;メモリから１ＣＨの高位ビットデータを読み出す
        movlb  1
        movfp  Data_1,WREG    ;ポートＤのデータをＷレジスタに取り込み
        movlb  0
        movwf  Datahig1       ;変数 Datahig1 に代入する。メモリのデータが読み出された

       ;グラフ上に２チャンネル分のデータをＬＣＤ画面に描写するために、
       ;１０ビットデータ（０～１０２４）を８分の１に縮小（０～１２８）する
       ;Ｌｏバイトを切り捨て、Ｈｉバイトを右に１回転させるだけで良い
       ;データ値に一致するドットを赤で、一致しないところを青で描写する
        bcf     ALUSTA,C      ;キャリービットをクリアしておく
        rrcf    Datahig1,1    ;高位データ（１０，９，８，７，６，５，４，３）を
                              ;　　　　　（０，１０，９，８，７，６、５，４）とする
        clrf    temp0
dploop5
        movlw   64            ;０Ｖ線を白色で描写する
        cpfseq  temp0         ;
        goto    dpjump0
        call    whidotto
dpjump0
        movfp   temp0,WREG    ;
        cpfseq  Datahig1      ;Datahig1=WREG ならば、スキップする
        goto    dpjump1       ;
        call    viodotto      ;データ点を紫色で描写
        incf    temp0
        movlw   129           ;グラフ画面の縦ビット数
        cpfseq  temp0         ;
        goto    dploop5       ;
        goto    dpjump2       ;
dpjump1
        call    bludotto      ;
        incf    temp0         ;
        movlw   129           ;temp0=129 になったら、ループを終了
        cpfseq  temp0         ;
        goto    dploop5
dpjump2
        call    whidotto      ;中間の基準グラフ線の描写

        call    addressup     ;低位データを読み飛ばす
        call    addressup     ;２ｃｈのデータ番地へ移動する

       ;メモリから２ＣＨの高位ビットデータを読み出す
        movlb  1
        movfp  Data_1,WREG    ;ポートＤのデータをＷレジスタに取り込み
        movlb  0
        movwf  Datahig2       ;変数 Datahig2 に代入する。メモリのデータが読み出された
        bcf    ALUSTA,C       ;キャリービットをクリアしておく
        rrcf   Datahig2,1     ;高位データ（１０，９，８，７，６，５，４，３）を
                              ;　　　　　（０，１０，９，８，７，６、５，４）とする
        clrf    temp0
dploop6
        movlw   64            ;０Ｖ線を白色で描写する
        cpfseq  temp0         ;
        goto    dpjump4
        call    whidotto
dpjump4
        movfp   temp0,WREG    ;
        cpfseq  Datahig2      ;Datalow2=WREG ならば、スキップする
        goto    dpjump5       ;
        call    viodotto      ;データ点を紫色で描写
        incf    temp0         ;
        movlw   129           ;
        cpfseq  temp0         ;
        goto    dploop6       ;
        goto    dpjump6       ;
dpjump5
        call    bludotto      ;
        incf    temp0         ;
        movlw   129           ; 
        cpfseq  temp0         ;
        goto    dploop6       ; 
dpjump6
        call    whidotto      ;１番上の基準グラフ線の描写

        call    addressup     ;低位データを読み飛ばす

        call    higareaplot   ;画面の最上部分の描写

        call    HDISP_FIN

        movfp   adlowback,WREG     ;バックアップしているアドレス番地を読み出し、
        movwf   Addresslow         ;１６ビットアドレスカウンタに入れ直す。
        movfp   adhigback,WREG     ;
        movlb   1
        movwf   Addresshight_1     ;
        movlb   0
      ;メモリアドレスを進める
        bcf     ALUSTA,C           ;キャリービットをクリアしておく
        movfp   addressstep,WREG   ;addressstep 分だけ、アドレスを進める
        addwf   Addresslow,1       ;Addresslow がオーバーフローしたなら、
        btfsc   ALUSTA,C           ;クリアし、Addresshigt_1 を＋１する。
        call    carryjump          ;           

       ;進めたアドレス値がオーバーフローしたときの処理
        movlb   1
        btfss   Addresshight_1,7   ;この時、 Addresshight_1 の第７ビットが１となっている
        goto    dpend
        movlb   0
        movlw   b'11111111'        ;アドレス値をｂ’０１１１１１１１　１１１１１１１１’にする
        movwf   Addresslow         ;
        movlw   b'01111111'        ;
        movlb   1
        movwf   Addresshight_1     ;
        movlb   0
        bsf     overflow,0         ;オーバーフローが発生したので、フラッグを立てる             
dpend
        movlb   0
        decfsz  linecount,1        ;２３１でループ終了。
        goto    dploop             ;目盛りから繰り返しデータを読み出し、ＬＣＤに表示させる

        movfp  Addresslow,WREG     ;描写したデータグラフの右端アドレス値を
        movwf  rightaddlow         ;保持しておく。
        movlb  1
        movfp  Addresshight_1,WREG ;左右移動の時必要となる
        movlb  0
        movwf  rightaddhight       ;
   
        bcf     overflow,0         ;オーバーフローチェッカーをクリアしておく

        return

;**************************
;キャリー処理　１６ビットアドレス＝８ビット＋８ビット
carryjump
        clrf    Addresslow         ;
        movlb   1
        incf    Addresshight_1,1   ;
        movlb   0      
     
        return

;**********************************************************************************************
;**********************************************************************************************
;グラフ処理パラメータの取り込み、そして再描写、ＲＳ－２３２Ｃ送信も選択させる
;  サブメニュー内での条件選択のスクロール
;　　ｉｎｉｔｉａｌ→左移動→縮小→拡大→右移動→ｉｎｉｔｉａｌ
;割り込み／送信スイッチが押されたときには、送信を実行する。
;
graphjob
        bsf    CPUSTA,4           ;測定完了後は、割り込みを不可とし、割り込みスイッチは
                                  ;ＲＳ－２３２Ｃ送信スイッチとして使用できるようにする
        bcf    INTSTA,2           ;RA1/T0CKI での割り込みを禁止する
gjloop
        btfsc  RS_232C            ;このスイッチが押されたとき、ＲＳ－２３２Ｃ送信を実行する
        goto   RS_start           ;送信が終了したら、ここへ戻ってくる。
        
        btfsc  Decide             ;決定キーが押された時点で、画面で設定している条件で再描写に入る
        goto   gjnext1            ;ため、このルーチンを抜け出る

        btfsc  Submenu            ;副メニューキーが押されていれば、副メニューのスクロールへ行く
        goto   gjnext0            ;押されていなければ、決定キーのチェックに戻る

        btfss  Mainmenu           ;主キーが押されていればこのルーチンを抜け出し、
        goto   gjloop             ;
        bsf    remeasure,0        ;再測定モードに戻らせる
        goto   gjend              ; 

     ;左右移動、拡大、縮小、リセット間でのメニューのスクロール 
gjnext0
        incf   proctype,1         ;graphtype を＋１する 
        movfp  proctype,WREG      ;
        sublw  5                  ;
        btfsc  ALUSTA,Z           ;５になったならば、０にクリアする
        clrf   proctype           ;
        call   LCDsetup           ;
        call   graredisplay       ;再描写に行く
        goto   gjloop             ;キーの待機状態へと戻る
gjnext1
        movlw  0                  ;protype=0 の時、データグラフを初期状態に戻す処理
        cpfseq proctype           ;
        goto   gjnext2            ;
        clrf   leftaddlow         ;左端アドレスを初期値の０に戻す
        clrf   leftaddhight       ;
        movlw  4                  ;アドレスステップを初期値の４に戻す
        movwf  addressstep        ;
        clrf   reducount          ;縮小回数をクリアし、初期値に戻す
        movlw   timebit200        ;横軸時間スケール描写に使用する変数を初期値とする               ;
        movwf   timescale_wline   ;timescale_wline に代入する
gjnext2
        movlw  1                  ;proctype=1 の時、左移動処理
        cpfseq proctype           ;
        goto   gjnext4            ;グラフを画面半分だけ右に移動し、左側のデータを開示する

       ;左端と右端の間隔のデータアドレス件数を算出する　そしてその半値を算出する
         movfp  rightaddlow,WREG  ;
        movwf  LowbyteA           ;
        movfp  rightaddhight,WREG ;
        movwf  HightbyteA         ;rightadd(hight+low)-leftadd(hight+low)
        movfp  leftaddlow,WREG    ;を計算する
        movwf  LowbyteB           ;
        movfp  leftaddhight,WREG  ;
        movwf  HightbyteB         ;

        call   subtract           ;
        movfp  HightbyteC,WREG    ;減算で得られた結果を
        movwf  wideaddhight       ;wideaddhight+wideaddlow に代入
        movfp  LowbyteC,WREG      ;
        movwf  wideaddlow         ;
                                  ;その半分の値を求める
        bcf    ALUSTA,C           ;キャリアビットを０としておく
        rrcf   wideaddhight,1     ;右回転する　第７ビットに０が入り、第０ビットの値は ALUSTA,Cに入る
        rrcf   wideaddlow,1       ;右回転する　第７ビット目には ALUSTA,Cの値が入る
                                  ;wideadd には　半値が入ったことになる
       ;表示するための左端のアドレス値を求めるが、４の倍数でなければならない。理由は序文参照
        movfp  leftaddlow,WREG    ;
        movwf  LowbyteA           ;leftadd(hight+low)-wideadd(hight+low)/2
        movfp  leftaddhight,WREG  ;を計算する
        movwf  HightbyteA         ;
        movfp  wideaddlow,WREG    ;
        movwf  LowbyteB           ;
        movfp  wideaddhight,WREG  ;
        movwf  HightbyteB         ;

        call   subtract
        movfp  HightbyteC,WREG    ;減算で得られた結果を
        movwf  leftaddhight       ;leftaddhight+leftaddlow とする
        movfp  LowbyteC,WREG      ;
        movwf  leftaddlow         ;
        bcf    leftaddlow,0       ;leftaddlow の値を４の倍数とする
        bcf    leftaddlow,1       ;
        goto   gjend              ;
gjnext4
        movlw  2                  ;proctype=2 のとき、１／２の縮小処理
        cpfseq proctype           ;画面に表示されるデータ領域を２倍とする
        goto   gjnext6            ;縮小が呼ばれる毎に

        incf   reducount,1        ;縮小が実行される毎に、縮小回数を＋１する

        bcf    ALUSTA,C           ;
        rrcf   timescale_wline,1  ;縮小が実行される毎に、timescale_wline を半分とする
        bcf    ALUSTA,C           ;
        rlcf   addressstep,1      ;１ビットずつ左回転し、２乗倍する
        btfsc  ALUSTA,C           ;addressstep のオーバーフローを
        call   adsteplimit        ;回避する
gjnext6
        movlw  3                  ;proctype=3 のとき、２倍の拡大処理
        cpfseq proctype           ;画面に表にされるデータ領域を半分とする
        goto   gjnext8            ;
        movlw  0                  ;
        cpfsgt reducount          ;既存の縮小回数が０の時には、拡大処理は行わないこととする
        goto   gjnext8            ;
        rrncf  addressstep,1      ;拡大が呼ばれる毎に、１ビットずつ右回転し、１／２乗倍する
        decf   reducount,1        ;拡大が実行される毎に、－１する

        bcf    ALUSTA,Z           ;
        rlcf   timescale_wline    ;拡大が実行される毎に、timescale_wline を２倍する 
gjnext8
        movlw  4                  ;proctype=4 のとき、右移動処理
        cpfseq proctype           ;
        goto   gjend              ;グラフを画面半分だけ左に移動し、右側のデータを開示する
       ;表示されている１５ビットデータアドレスの中間値を算出する　２つを加算して２で割る
        movfp  leftaddhight,WREG  ;
        addwf  rightaddhight,0    ;左右端の高位７ビットアドレス値の加算
        movwf  midaddhight        ;

        movfp  leftaddlow,WREG    ;
        addwf  rightaddlow,0      ;左右端の低位８ビットアドレスの加算
        movwf  midaddlow          ;
        btfsc  ALUSTA,C           ;低位８ビットの加算でキャリーがあったときの処理
        incf   midaddhight,1      ;　高位５ビットに＋１をする
        rrcf   midaddhight,1      ;右回転する　第０ビットの値は ALUSTA,Cに入る
        rrcf   midaddlow,1        ;右回転する　第７ビット目には ALUSTA,Cの値が入る

       ;算出した中間値を表示画面の左端のアドレス値とするが、４の倍数でなければならない
       ;理由は序文参照。低位８ビットアドレスの下の２ビットを強制的に０に置き換える
        movfp  midaddlow,WREG     ;
        movwf  leftaddlow         ;
        bcf    leftaddlow,0       ;(*,*,*,*,*,*,*,*)=(*,*,*,:,*,*,0,0)
        bcf    leftaddlow,1       ;
        movfp  midaddhight,WREG   ;
        movwf  leftaddhight       ;
gjend
        return

;*************************
;アドレスステップ数値の上限を設ける
adsteplimit
        movlw  b'10000000'        ;ステップ数値を
        movwf  addressstep        ;上限値とする
        decf   reducount,1        ;縮小回数を元に戻す
        bcf    ALUSTA,C           ;キャリービットをクリアしておく
        rlcf   timescale_wline,1  ;timescale_wline をを元に戻す
       
        return

;**********************************************************************************************
;**********************************************************************************************
;ＲＳ－２３２Ｃ送信を行う
;パソコン側の受信プログラムは、既存のアナログデータメモリ用のパソコン側での受信プログラムを
;転用できる送信方法とする。
;　先頭に、サンプリング時間番号を送信し、引き続いて、
; ８１９２バイトを１ブロックとして、連続して４ブロック（＝３２Ｋバイト）を送信する。
;
RS_start
       ;送信前の下準備
        clrf   Addresslow       ;アドレスカウンタのクリア 
        movlb  1
        clrf   Addresshight_1   ;
        movlb  5
        bsf    WE_5             ;目盛りを読みだしモードとする
        movlw  b'11111111'      ;
        movlb  1
        movwf  DDRD             ;ポートＤを入力端子とし、メモリからのデータを取り込ませる
        movlb  0

       ;サンプリング時間番号の送信
        movfp  samptime,WREG    ;samptime の値を
        movwf  TXREG1           ;送信レジスタに入れ、
        bsf    TXSTA1,TXEN      ;送信を開始する
        movlb  1
RSwait0
        btfss  PIR1,TX1IF       ;送信完了まで待機 
        goto   RSwait0          ;
        movlb  0

       ;メモリからデータを読み出し、順次送信をする
blockloop
        call   RS_interval      ;少し待機
        call   bcounter_initial ;ブロック内のデータカウンタをクリア
RSloop
        movlb  5
        bcf    CS_5             ;メモリを能動とする
        movlb  1
        movfp  Data_1,WREG      ;ポートＤからＷレジスタにデータを取り込み、
        movlb  0                ;
        movwf  TXREG1           ;送信専用レジスタに入れ、
        bsf    TXSTA1,TXEN      ;送信を可とする
        movlb  1
RSwait1
        btfss  PIR1,TX1IF       ;TXREG1 の内容が空になるまで待機。１データの送信完了待ち
        goto   RSwait1          ;空になると、TX1IF＝１となる
        movlb  5
        bcf    CS_5             ;メモリを非選択とする
        movlb  0
        call   addressup        ;メモリアドレスカウンタを＋１する
        btfsc  Overflow         ;オーバーフローフラッグが立てば、
        goto   RS_end           ;全データの送信が完了したので、送信を終了する

        call   bcounter_inc     ;１つデータを送信したので、ブロック内データ数カウンタを＋１する
        btfss  bcounter1,5      ;ｂ５＝１となったとき、８１９２個のデータを送信したので、
                                ;blockloop へ行く。ｂ５＝０の時には、未だなので、
                                ;RSloop1 へ行き、繰り返してデータを送信させる。
        goto   RSloop           ;
        goto   blockloop        ;
RS_end
        return

;**********************************
;１ブロック内の送信したデータ数をカウントするカウンタをクリアする
bcounter_initial
        clrf   bcounter1        ;bcounter1（上位６ビット）＋　bcounter0（下位８ビット）で、
        clrf   bcounter0        ;１４ビットカウンタとする。 
                                ;bcounter1 のｂ５をフラッグとして使用する。
                                ;８１９２をカウントすれば、ｂ５＝１となる
        return 

;**********************************
;送信されたデータ数をカウントする
bcounter_inc
        incfsz bcounter0,1      ;低位８ビットカウンタを＋１し、００００００００とならなければ、
        return                  ;戻る、００００００００となったならば、キャリーアップをする。
        incf   bcounter1,1      ;下位８ビットならのキャリーアップとして、＋１する

        return

;**********************************
;送信されるデータブロック間に適当な時間幅を持たせる
RS_interval
        movlw  0
        movwf  temp0            ;２５６×１０で約５００μ秒の時間幅
        movlw  0                ;２５６×２５６では約１２．５ｍ秒
        movwf  temp1
rsloop
        decfsz temp0,1
        goto   rsloop
        decfsz temp1,1
        goto   rsloop

        return

;**********************************************************************************************
;**********************************************************************************************
;１５ビット減算　Ａ＞Ｂの時、Ａ－Ｂ＝Ｃ
;　　　　　　　　Ａ＜Ｂの時、Ａ－Ｂの計算はしないでＣ＝０として戻らせる
subtract
        movlw  b'01111111'      ;高位バイトの最上位ビットだけ０とする
        andwf  HightbyteA,1     ;
        movlw  b'01111111'
        andwf  HightbyteB,1     ;

        ;Ａ＜Ｂの時、Ａ－Ｂの計算はしないでＣ＝０として戻らせる
        movfp  HightbyteB,WREG  ;
        cpfsgt HightbyteA       ;
        goto   subnext1         ;HightbyteA <= HightbyteB
        goto   subproc          ;HightbyteA >  HightbyteB
subnext1
        movfp  HightbyteB,WREG  ;
        cpfslt HightbyteA       ;
        goto   subnext2         ;HightbyteA = HightbyteB が残っている
        goto   zeroproc         ;HightbyteA < HightbyteB
subnext2
        movfp  LowbyteB,WREG    ;この時点で、HightbyteA=HightbyteB だけが残っている
        cpfsgt LowbyteA         ;
        goto   zeroproc         ;HightbyteA=HightbyteB, LowbyteA<LowbyteB
        goto   subproc          ;HightbyteA=HightbyteB, LowbyteA>LowbyteB
zeroproc
        clrf   HightbyteC       ;両バイトともクリアする
        Clrf   LowbyteC         ;
        goto   subend
subproc
        movfp  LowbyteB,WREG    ;
        cpfsgt LowbyteA         ;LowbyteA>LowbyteB ならばスキップ
        goto   revproc          ;LowbyteA<LowbyteB ならば別の処理へいく
       
        movfp  LowbyteB,WREG
        subwf  LowbyteA,0       ;LowbyteA-LowbyteB を計算し、
        movwf  LowbyteC         ;LowbyteC に代入
        movfp  HightbyteB,WREG  ;
        subwf  HightbyteA,0     ;HightbyteA-HightbyteB を計算し、
        movwf  HightbyteC       ;HightbyteC に代入
        goto   subend
revproc                         ;LowbyteA<LowbyteB の時の処理
        movfp  LowbyteB,WREG    ;
        sublw  255              ;255-LowbyteB の計算をして、Ｗレジスタに保持
        addwf  LowbyteA,0       ;Ｗ＋LowbyteA をＷレジスタに保持
        addlw  1                ;Ｗレジスタに１を加える
        movwf  LowbyteC         ;
        decf   HightbyteA,1     ;キャリー分を引く
        movfp  HightbyteB,WREG  ;
        subwf  HightbyteA,0     ;HightbyteA-HightbyteB を計算し、
        movwf  HightbyteC       ;HightbyteC に代入    
subend
        return

;*********************************************************************************************
;*********************************************************************************************
;グラフ処理画面再描写
graredisplay
        movlw   1
        movwf   jobmode       ;グラフ画面処理モード

        call    wallpaint     ;一列の塗りつぶし
        call    chardisp      ;
        call    wallpaint     ;一列の塗りつぶし
        call    sideline      ;グラフの測線の描写

        call    dataplot      ;操作記号、文字、チャンネル基準線、データ線の描写

        call    sideline      ;グラフの測線の描写
        call    wallpaint     ;２列の塗りつぶし
        call    wallpaint
        
        return

;*********************************************************************************************
;*********************************************************************************************
;画面の下部分の描写（操作記号、時間長棒、文字）
lowareaplot
        movlw   menu_sline
        movwf   temp0        ;最下段１０行を青色で塗りつぶす
dploop1
        call    bludotto     ;
        decfsz  temp0,1      ;
        goto    dploop1

       ;左移動、縮小、拡大、右移動、リセットの各記号ビットを描写する

        movlw   0
        movwf   charcount
        movfp   char_number,WREG
        sublw   0                ;
        btfss   ALUSTA,Z         ;
        goto    mark1
        call    Leftdisp         ;左移動記号の描写
        goto    markdispend
mark1
        movlw   1
        movwf   charcount
        movfp   char_number,WREG
        sublw   1                ;
        btfss   ALUSTA,Z         ;
        goto    mark2
        call    Redudisp         ;縮小記号の描写
        goto    markdispend
mark2
        movlw   2
        movwf   charcount
        movfp   char_number,WREG
        sublw   2                ;
        btfss   ALUSTA,Z         ;
        goto    mark3
        call    Extidisp         ;拡大記号の描写
        goto    markdispend
mark3
        movlw   3
        movwf   charcount
        movfp   char_number,WREG
        sublw   3                ;
        btfss   ALUSTA,Z         ;
        goto    mark4
        call    Rightdisp        ;右移動の描写
        goto    markdispend
mark4
        movlw   4
        movwf   charcount
        movfp   char_number,WREG
        sublw   4                ;
        btfss   ALUSTA,Z         ;
        goto    mark5
        call    Resetdisp        ;リセット文字の描写
        goto    markdispend

       ;空欄領域を描写する
mark5
        movlw   5
        movwf   charcount
        movfp   char_number,WREG
        sublw   5                ;
        btfss   ALUSTA,Z         ;
        goto    mark6
        call    charspacedisp
        goto    markdispend

       ;サンプリング時間文字を描写する
mark6
        movlw   6
        movwf   charcount
        movfp   char_number,WREG
        sublw   6                ;
        btfss   ALUSTA,Z         ;
        goto    mark7
        call    selsamptime
        goto    markdispend

       ;空欄領域を１つ分描写する
mark7
        movlw   7
        movwf   charcount
        movfp   char_number,WREG
        sublw   7                ;
        btfss   ALUSTA,Z         ;
        goto    mark8
        call    charspacedisp
        goto    markdispend

       ;時間長棒を黄色で描写し、時間数値も時も黄色で描写する
mark8
        movlw   8
        movwf   charcount
        movfp   char_number,WREG
        sublw   8
        btfss   ALUSTA,Z
        goto    mark9
        bsf     colorset,0      ;第０ビット目を１とする
        call    seltimewidth
        bcf     colorset,0      ;初期値に戻す
        goto    markdispend

      ;右端に空き桁が残っている。青ドットで塗りつぶす
mark9
        movlw   9
        movwf   charcount
        movfp   char_number,WREG
        sublw   9
        btfss   ALUSTA,Z
        goto    markdispend
        call    charspacedisp
        goto    markdispend

       ;記号描写後、グラフ領域の下途中まで、青ドットで塗りつぶす
markdispend
        movlw   menu_sline       ;
        addlw   menu_wline       ;
        addlw   timescale_hline  ;
        sublw   ini_line         ;ini_line-(menu_sline+menu_wline+timescale_hline) を計算し、
        movwf   temp0            ;temp0 に代入
mdloop1
        call    bludotto
        decfsz  temp0,1
        goto    mdloop1

       ;時間スケール描写帯を原点から一定の幅を黄色で、残りを青色で塗りつぶす
        incf    timebandcount,1       ;カウンタ変数を＋１する

        movfp   reducount,WREG        ;縮小回数をＷレジスタに取り込む
        sublw   0                     ;
        btfss   ALUSTA,Z              ;
        goto    mdnext1               ;reducount=0 の時は、
        movfp   timescale_wline,WREG  ;
        cpfsgt  timebandcount         ;timebandcount>timescale_wline の時、下の命令を飛ばす
        goto    mdn01
        goto    mdn02
mdn01   call    yellowbanddraw        ;横軸時間幅を黄色で塗りつぶす
        goto    mdnextend
mdn02   call    bluebanddraw          ;残りを青色で塗りつぶす
        goto    mdnextend
mdnext1 
        movfp   reducount,WREG        ;縮小回数をＷレジスタに取り込む
        sublw   1                ;
        btfss   ALUSTA,Z         ;
        goto    mdnext2               ;reducount=1 の時の処理
        movfp   timescale_wline,WREG  ;
        cpfsgt  timebandcount         ;timebandcount>timescale_wline の時、下の命令を飛ばす
        goto    mdn11
        goto    mdn12
mdn11   call    yellowbanddraw        ;横軸時間幅の全長／２を黄色で塗りつぶす
        goto    mdnextend
mdn12   call    bluebanddraw          ;残りを青色で塗りつぶす
        goto    mdnextend
mdnext2 
        movfp   reducount,WREG        ;縮小回数をＷレジスタに取り込む
        sublw   2                ;
        btfss   ALUSTA,Z         ;
        goto    mdnext3               ;reducount=2 の時の処理
        movfp   timescale_wline,WREG  ;
        cpfsgt  timebandcount         ;timebandcount>timescale_wline の時、下の命令を飛ばす
        goto    mdn21
        goto    mdn22
mdn21   call    yellowbanddraw        ;横軸時間幅の全長／２を黄色で塗りつぶす
        goto    mdnextend
mdn22   call    bluebanddraw          ;残りを青色で塗りつぶす
        goto    mdnextend
mdnext3 
        movfp   reducount,WREG        ;縮小回数をＷレジスタに取り込む
        sublw   3                ;
        btfss   ALUSTA,Z         ;
        goto    mdnext4               ;reducount=3 の時の処理
        movfp   timescale_wline,WREG  ;
        cpfsgt  timebandcount         ;timebandcount>timescale_wline の時、下の命令を飛ばす
        goto    mdn31
        goto    mdn32
mdn31   call    yellowbanddraw        ;横軸時間幅の全長／２を黄色で塗りつぶす
        goto    mdnextend
mdn32   call    bluebanddraw          ;残りを青色で塗りつぶす
        goto    mdnextend
mdnext4 
        movfp   reducount,WREG        ;縮小回数をＷレジスタに取り込む
        sublw   4                ;
        btfss   ALUSTA,Z         ;
        goto    mdnext5               ;reducount=4 の時の処理
        movfp   timescale_wline,WREG  ;
        cpfsgt  timebandcount         ;timebandcount>timescale_wline の時、下の命令を飛ばす
        goto    mdn41
        goto    mdn42
mdn41   call    yellowbanddraw        ;横軸時間幅の全長／２を黄色で塗りつぶす
        goto    mdnextend
mdn42   call    bluebanddraw          ;残りを青色で塗りつぶす
        goto    mdnextend
mdnext5 
        movfp   reducount,WREG        ;縮小回数をＷレジスタに取り込む
        sublw   5                ;
        btfss   ALUSTA,Z         ;
        goto    mdnextend             ;reducount=5 の時の処理
        movfp   timescale_wline,WREG  ;
        cpfsgt  timebandcount         ;timebandcount>timescale_wline の時、下の命令を飛ばす
        goto    mdn51
        goto    mdn52
mdn51   call    yellowbanddraw        ;横軸時間幅の全長／２を黄色で塗りつぶす
        goto    mdnextend
mdn52   call    bluebanddraw          ;残りを青色で塗りつぶす
mdnextend 

       return

;**************************
       ;グラフ領域の最下部まで、黄色ドットで塗りつぶす
yellowbanddraw
        movlw   timescale_hline  ;
        movwf   temp0            ;temp0 に代入
mdloop5
        call    yeldotto
        decfsz  temp0,1
        goto    mdloop5
        return
;**************************
       ;グラフ領域の最下部まで、青色ドットで塗りつぶす
bluebanddraw
        movlw   timescale_hline  ;
        movwf   temp0            ;temp0 に代入
mdloop8
        call    bludotto
        decfsz  temp0,1
        goto    mdloop8
        return

;**************************
;画面の最上部分の描写
higareaplot
        movlw   fin_line       ;
        movwf   temp0 
dploop9
        call    bludotto       ;青色ドット列の描写
        decfsz  temp0,1
        goto    dploop9

        return

;***********************
Lowdraw
        btfsc   overflow,0     ;
        call    reddotto       ;オーバーフローした時点で
        btfss   overflow,0     ;データ線は赤色で描写

        call    whidotto       ;１個の白色ドット
        movlw   29
        movwf   temp1          ;空き領域を青色で塗りつぶす
ldloop
        call    bludotto
        decfsz  temp1,1
        goto    ldloop

        return

;***********************
Higdraw
        movlw   15
        movwf   temp1
hdloop1
        btfsc   overflow,0     ;
        call    reddotto       ;オーバーフローした時点で
        btfss   overflow,0     ;データ線は赤色で描写

        call    whidotto       ;１５個の白色ドット
        decfsz  temp1,1
        goto    hdloop1     

        movlw   15
        movwf   temp1          ;空き領域を青色で塗りつぶす
hdloop2
        call    bludotto
        decfsz  temp1,1
        goto    hdloop2

        return

;********************************
;リセット記号の描写
Resetdisp
        movfp   current,WREG
        call    characterReset
        movwf   charcode

        movfp   proctype,WREG    ;
        sublw   0                ;proctype=0 の時、
        btfsc   ALUSTA,Z         ;
        call    seldottojob      ;赤文字描写する
        btfss   ALUSTA,Z
        call    dottojob

        incf    current,1
        movfp   current,WREG
        sublw   mark_num         ;current=mark_num となったときには
        btfss   ALUSTA,Z         ;Ｚ＝１となる。その時点で current をクリアする
        goto    resetend
        clrf    current
        incf    char_number      ;表示文字番号を＋１する
resetend
        return

;********************************
;左移動記号の描写
Leftdisp
        movfp   current,WREG
        call    characterLeft
        movwf   charcode

        movfp   proctype,WREG    ;
        sublw   1                ;proctype=1 の時、
        btfsc   ALUSTA,Z         ;
        call    seldottojob      ;赤文字描写する
        btfss   ALUSTA,Z
        call    dottojob

        incf    current,1
        movfp   current,WREG
        sublw   mark_num         ;current=mark_num となったときには
        btfss   ALUSTA,Z         ;Ｚ＝１となる。その時点で current をクリアする
        goto    leftend
        clrf    current
        incf    char_number      ;表示文字番号を＋１する
leftend
        return

;********************************
;縮小記号の描写
Redudisp
        movfp   current,WREG
        call    characterRedu
        movwf   charcode

        movfp   proctype,WREG    ;
        sublw   2                ;proctype=2 の時、
        btfsc   ALUSTA,Z         ;
        call    seldottojob      ;赤文字描写する
        btfss   ALUSTA,Z
        call    dottojob

        incf    current,1
        movfp   current,WREG
        sublw   mark_num         ;current=mark_num となったときには
        btfss   ALUSTA,Z         ;Ｚ＝１となる。その時点で current をクリアする
        goto    reduend
        clrf    current
        incf    char_number      ;表示文字番号を＋１する
reduend
        return

;********************************
;拡大記号の描写
Extidisp
        movfp   current,WREG
        call    characterExti
        movwf   charcode

        movfp   proctype,WREG    ;
        sublw   3                ;proctype=3 の時、
        btfsc   ALUSTA,Z         ;
        call    seldottojob      ;赤文字描写する
        btfss   ALUSTA,Z
        call    dottojob

        incf    current,1
        movfp   current,WREG
        sublw   mark_num         ;current=mark_num となったときには
        btfss   ALUSTA,Z         ;Ｚ＝１となる。その時点で current をクリアする
        goto    extiend
        clrf    current
        incf    char_number      ;表示文字番号を＋１する
extiend
        return

;********************************
;右移動記号の描写
Rightdisp
        movfp   current,WREG
        call    characterRight
        movwf   charcode

        movfp   proctype,WREG    ;
        sublw   4                ;proctype=4 の時、
        btfsc   ALUSTA,Z         ;
        call    seldottojob      ;赤文字描写する
        btfss   ALUSTA,Z
        call    dottojob

        incf    current,1
        movfp   current,WREG
        sublw   mark_num         ;current=mark_num となったときには
        btfss   ALUSTA,Z         ;Ｚ＝１となる。その時点で current をクリアする
        goto    rightend
        clrf    current
        incf    char_number      ;表示文字番号を＋１する
rightend
        return

;********************************
;選択されたサンプリング周波数文字を抽出し、描写する
selsamptime
        movfp   samptime,WREG    ;
        sublw   0                ;samptime=0 ならば、５０μ
        btfsc   ALUSTA,Z         ;
        call    char50udisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   1                ;samptime=1 ならば、１００μ
        btfsc   ALUSTA,Z         ;
        call    char100udisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   2                ;samptime=2 ならば、２００μ
        btfsc   ALUSTA,Z         ;
        call    char200udisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   3                ;samptime=3 ならば、５００μ
        btfsc   ALUSTA,Z         ;
        call    char500udisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   4                ;samptime=4 ならば、１ｍ
        btfsc   ALUSTA,Z         ;
        call    char1mdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   5                ;samptime=5 ならば、２ｍ
        btfsc   ALUSTA,Z         ;
        call    char2mdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   6                ;samptime=6 ならば、５ｍ
        btfsc   ALUSTA,Z         ;
        call    char5mdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   7                ;samptime=7 ならば、１０ｍ
        btfsc   ALUSTA,Z         ;
        call    char10mdisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   8                ;samptime=8 ならば、２０ｍ
        btfsc   ALUSTA,Z         ;
        call    char20mdisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   9                ;samptime=9 ならば、５０ｍ
        btfsc   ALUSTA,Z         ;
        call    char50mdisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   10               ;samptime=10 ならば、０．１ｓ
        btfsc   ALUSTA,Z         ;
        call    char0.1sdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   11               ;samptime=11 ならば、０．２ｓ
        btfsc   ALUSTA,Z         ;
        call    char0.2sdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   12               ;samptime=12 ならば、０．５ｓ
        btfsc   ALUSTA,Z         ;
        call    char0.5sdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   13               ;samptime=13 ならば、１ｓ
        btfsc   ALUSTA,Z         ;
        call    char1sdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   14               ;samptime=14 ならば、２ｓ
        btfsc   ALUSTA,Z         ;
        call    char2sdisp       ;を描写する

        return

;********************************
;選択された時間長棒を抽出し、描写する
seltimewidth
        movfp   samptime,WREG    ;
        sublw   0                ;samptime=0 ならば、５０μの２００倍で
        btfsc   ALUSTA,Z         ;１０ｍ
        call    char10mdisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   1                ;samptime=1 ならば、１００μの２００倍で
        btfsc   ALUSTA,Z         ;２０ｍ
        call    char20mdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   2                ;samptime=2 ならば、２００μの２００倍で
        btfsc   ALUSTA,Z         ;４０ｍ
        call    char40mdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   3                ;samptime=3 ならば、５００μの２００倍で
        btfsc   ALUSTA,Z         ;０．１ｓ
        call    char0.1sdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   4                ;samptime=4 ならば、１ｍの２００倍で
        btfsc   ALUSTA,Z         ;０．２ｓ
        call    char0.2sdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   5                ;samptime=5 ならば、２ｍの２００倍で
        btfsc   ALUSTA,Z         ;０．４ｓ
        call    char0.4sdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   6                ;samptime=6 ならば、５ｍの２００倍で
        btfsc   ALUSTA,Z         ;１ｓ
        call    char1sdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   7                ;samptime=7 ならば、１０ｍの２００倍で
        btfsc   ALUSTA,Z         ;２ｓ
        call    char2sdisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   8                ;samptime=8 ならば、２０ｍの２００倍で
        btfsc   ALUSTA,Z         ;４ｓ
        call    char4sdisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   9                ;samptime=9 ならば、５０ｍの２００倍で
        btfsc   ALUSTA,Z         ;１０ｓ
        call    char10sdisp      ;を描写する
        movfp   samptime,WREG    ;
        sublw   10               ;samptime=10 ならば、０．１ｓの２００倍で
        btfsc   ALUSTA,Z         ;２０ｓ
        call    char20sdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   11               ;samptime=11 ならば、０．２ｓの２００倍で
        btfsc   ALUSTA,Z         ;４０ｓ
        call    char40sdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   12               ;samptime=12 ならば、０．５ｓの２００倍で
        btfsc   ALUSTA,Z         ;１００ｓ
        call    char100sdisp     ;を描写する
        movfp   samptime,WREG    ;
        sublw   13               ;samptime=13 ならば、１ｓの２００倍で
        btfsc   ALUSTA,Z         ;２００ｓ
        call    char200sdisp       ;を描写する
        movfp   samptime,WREG    ;
        sublw   14               ;samptime=14 ならば、２ｓの２００倍で
        btfsc   ALUSTA,Z         ;４００ｓ
        call    char400sdisp       ;を描写する

        return

;*********************************************************************************************
;*********************************************************************************************
;画面再描写
redisplay
        movlw   0
        movwf   jobmode       ;初期画面表示と同じ

        call    wallpaint     ;一列の塗りつぶし
        call    chardisp      ;
        call    wallpaint     ;一列の塗りつぶし
        call    sideline      ;グラフの測線の描写
        call    dataline      ;サンプリング時間文字、チャンネル基準線の描写
        call    sideline      ;グラフの測線の描写
        call    wallpaint     ;２列の塗りつぶし
        call    wallpaint
        
        return

;*********************************************************************************************
;*********************************************************************************************
;一列を青色で塗りつぶす
wallpaint
        call    red000
        call    gre000
        call    blu111
        call    HDISP_INI

        movlw   hdd32        ;１行３２０ドット分を実行する
        movwf   temp0
        movlw   hdd10
        movwf   temp1        ;
wploop
        movlb   1
        bsf     DCK_1
        bcf     DCK_1
        movlb   0
        decfsz  temp0,1
        goto    wploop
        movlw   hdd32
        movwf   temp0
        decfsz  temp1,1
        goto    wploop

        call    HDISP_FIN
       
        return

;*****************************************
;チャンネル番号文字の描写　４列
;文字は緑色　空きビットは青色
chardisp
        movlw   4              ;
        movwf   count          ;文字の列数
        clrf    current
chloop0    
        call    HDISP_INI

        movlw   ini_line       ;下面を青色ドットで埋める
        movwf   temp0
chloop1
        call    bludotto       ;
        decfsz  temp0,1
        goto    chloop1

        movlw   60             ;チャンネル文字下まで
        movwf   temp0          ;
chloop2 
        call    bludotto       ;青ドットで埋める
        decfsz  temp0,1        ;
        goto    chloop2        ;

        movfp   current,WREG   ;
        call    character1     ;文字”１”を表示
        movwf   charcode       ;
        call    dottojob       ;

        movlw   122  ;112            ;次のチャンネル文字下まで
        movwf   temp0          ;
chloop3 
        call    bludotto       ;青ドットで埋める
        decfsz  temp0,1        ;
        goto    chloop3        ;

        movfp   current,WREG
        call    character2     ;文字”２”を表示
        movwf   charcode       ;
        call    dottojob       ;

        movlw   70  ;80  ;60             ;チャンネル文字上を
        movwf   temp0          ;
chloop4 
        call    bludotto       ;青ドットで埋める
        decfsz  temp0,1        ;
        goto    chloop4        ;

        incf    current,1

        movlw   fin_line       ;
        movwf   temp0 
chloop5
        call    bludotto       ;最上画面を青色ドット列で埋める
        decfsz  temp0,1
        goto    chloop5

        call    HDISP_FIN

        decfsz  count,1
        goto    chloop0
   
        return

;******************************************************
;選択されていない設定文字処理、及び時間長文字の処理　
;文字ビットを緑色、空きを青色とする。時間長文字は黄色とする
dottojob
        btfsc   colorset,0   ;時間長文字の処理へ
        goto    djnext       ;飛ぶ

        btfsc   charcode,7   ;選択文字の処理
          call    gredotto
        btfss   charcode,7
          call    bludotto
        btfsc   charcode,6
          call    gredotto
        btfss   charcode,6
          call    bludotto
        btfsc   charcode,5
          call    gredotto
        btfss   charcode,5
          call    bludotto
        btfsc   charcode,4
          call    gredotto
        btfss   charcode,4
          call    bludotto
        btfsc   charcode,3
          call    gredotto
        btfss   charcode,3
          call    bludotto
        btfsc   charcode,2
          call    gredotto
        btfss   charcode,2
          call    bludotto
        btfsc   charcode,1
          call    gredotto
        btfss   charcode,1
          call    bludotto
        btfsc   charcode,0
          call    gredotto
        btfss   charcode,0
          call    bludotto
        goto    djend
djnext
        btfsc   charcode,7   ;時間長文字の処理
          call    yeldotto
        btfss   charcode,7
          call    bludotto
        btfsc   charcode,6
          call    yeldotto
        btfss   charcode,6
          call    bludotto
        btfsc   charcode,5
          call    yeldotto
        btfss   charcode,5
          call    bludotto
        btfsc   charcode,4
          call    yeldotto
        btfss   charcode,4
          call    bludotto
        btfsc   charcode,3
          call    yeldotto
        btfss   charcode,3
          call    bludotto
        btfsc   charcode,2
          call    yeldotto
        btfss   charcode,2
          call    bludotto
        btfsc   charcode,1
          call    yeldotto
        btfss   charcode,1
          call    bludotto
        btfsc   charcode,0
          call    yeldotto
        btfss   charcode,0
          call    bludotto
djend
        return

;******************************************************
;選択された設定文字処理　　文字ビットを赤、空きを青とする
seldottojob
        btfsc   charcode,7
          call    reddotto
        btfss   charcode,7
          call    bludotto
        btfsc   charcode,6
          call    reddotto
        btfss   charcode,6
          call    bludotto
        btfsc   charcode,5
          call    reddotto
        btfss   charcode,5
          call    bludotto
        btfsc   charcode,4
          call    reddotto
        btfss   charcode,4
          call    bludotto
        btfsc   charcode,3
          call    reddotto
        btfss   charcode,3
          call    bludotto
        btfsc   charcode,2
          call    reddotto
        btfss   charcode,2
          call    bludotto
        btfsc   charcode,1
          call    reddotto
        btfss   charcode,1
          call    bludotto
        btfsc   charcode,0
          call    reddotto
        btfss   charcode,0
          call    bludotto

        return

;*********************************************************************************************
;*********************************************************************************************
;グラフの側線を描写する
;ini_lineで指定される数だけ青色ドットを、中間を白色線分、残りを青色として描写する
sideline
        movlw   1             ;
        movwf   linecount     ;
slloop1 
        call    HDISP_INI

        movlw   ini_line      ;
        movwf   temp0
slloop2
        call    bludotto      ;青色ドット列の描写
        decfsz  temp0,1
        goto    slloop2

       ;続いて、中間の２５５ドット分＋５ドット分を白色として描写
        movlw   255           ;
        movwf   temp0
slloop3
        call    whidotto      ;白色ドットを選択
        decfsz  temp0,1 
        goto    slloop3
        call    whidotto
        call    whidotto
        call    whidotto
        call    whidotto
        call    whidotto

       ;最後に、上部に青ドットを描写 
        movlw   fin_line      ;
        movwf   temp0
slloop4
        call    bludotto      ;青色ドットの選択
        decfsz  temp0,1
        goto    slloop4

        call    HDISP_FIN

        decfsz  linecount,1   ;
        goto    slloop1

        return

;*********************************************************************************************
;*********************************************************************************************
;サンプリング時間文字、各チャンネルの領域区分線、基準線、データ線の描写
;文字は緑又は赤、区分線と基準線は白色、空白領域は青色で描写
dataline
        clrf    char_number
        clrf    current
        movlw   width
        movwf   linecount
dlloop10
        call    HDISP_INI

        movlw   menu_sline
        movwf   temp0        ;最下段に青色ドットを描写
dlloop1
        call    bludotto     ;
        decfsz  temp0,1      ;
        goto    dlloop1

        movlw   0
        movwf   charcount
        movfp   char_number,WREG
        sublw   0                ;0-char_number を計算
        btfss   ALUSTA,Z         ;演算結果がゼロの時のみ、Ｚ＝１
        goto    moji1
        call    char50udisp       ;char_number=0 のとき、５０ｕの表示処理に入る
        goto    chardispend
moji1
        movlw   1
        movwf   charcount
        movfp   char_number,WREG
        sublw   1                ;1-char_number を計算
        btfss   ALUSTA,Z         ;演算結果がゼロの時のみ、Ｚ＝１
        goto    moji2
        call    char100udisp       ;char_number=1 のとき、１００ｕの表示処理に入る
        goto    chardispend
moji2
        movlw   2
        movwf   charcount
        movfp   char_number,WREG
        sublw   2                ;2-char_number を計算
        btfss   ALUSTA,Z         ;演算結果がゼロの時のみ、Ｚ＝１
        goto    moji3
        call    char200udisp       ;char_number=2 のとき、２００ｕの表示処理に入る
        goto    chardispend
moji3
        movlw   3
        movwf   charcount
        movfp   char_number,WREG
        sublw   3                ;3-char_number を計算
        btfss   ALUSTA,Z         ;演算結果がゼロの時のみ、Ｚ＝１
        goto    moji4
        call    char500udisp       ;char_number=3 のとき、５００ｕの表示処理に入る
        goto    chardispend
moji4
        movlw   4
        movwf   charcount
        movfp   char_number,WREG
        sublw   4                ;
        btfss   ALUSTA,Z         ;
        goto    moji5
        call    char1mdisp       ;char_number=4 のとき、１ｍ
        goto    chardispend
moji5
        movlw   5
        movwf   charcount
        movfp   char_number,WREG
        sublw   5                ;5-char_number を計算
        btfss   ALUSTA,Z         ;演算結果がゼロの時のみ、Ｚ＝１
        goto    moji6
        call    char2mdisp       ;char_number=5 のとき、２ｍの表示処理に入る
        goto    chardispend
moji6
        movlw   6
        movwf   charcount
        movfp   char_number,WREG
        sublw   6                ;
        btfss   ALUSTA,Z         ;
        goto    moji7
        call    char5mdisp       ;５ｍ
        goto    chardispend
moji7
        movlw   7
        movwf   charcount
        movfp   char_number,WREG
        sublw   7                ;
        btfss   ALUSTA,Z         ;
        goto    moji8
        call    char10mdisp      ;１０ｍ
        goto    chardispend
moji8
        movlw   8
        movwf   charcount
        movfp   char_number,WREG
        sublw   8                ;
        btfss   ALUSTA,Z         ;
        goto    moji9
        call    char20mdisp      ;２０ｍ
        goto    chardispend
moji9
        movlw   9
        movwf   charcount
        movfp   char_number,WREG
        sublw   9                ;
        btfss   ALUSTA,Z         ;
        goto    moji10
        call    char50mdisp      ;５０ｍ
        goto    chardispend
moji10
        movlw   10
        movwf   charcount
        movfp   char_number,WREG
        sublw   10               ;
        btfss   ALUSTA,Z         ;
        goto    moji11
        call    char0.1sdisp     ;０．１ｓ
        goto    chardispend
moji11
        movlw   11
        movwf   charcount
        movfp   char_number,WREG
        sublw   11               ;
        btfss   ALUSTA,Z         ;
        goto    moji12
        call    char0.2sdisp     ;０．２ｓ
        goto    chardispend
moji12
        movlw   12
        movwf   charcount
        movfp   char_number,WREG
        sublw   12               ;
        btfss   ALUSTA,Z         ;
        goto    moji13
        call    char0.5sdisp     ;０．５ｓ
        goto    chardispend
moji13
        movlw   13
        movwf   charcount
        movfp   char_number,WREG
        sublw   13
        btfss   ALUSTA,Z
        goto    moji14
        call    char1sdisp       ;１ｓ
        goto    chardispend
moji14
        movlw   14
        movwf   charcount
        movfp   char_number,WREG
        sublw   14
        btfss   ALUSTA,Z
        goto    moji15
        call    char2sdisp       ;２ｓ
        goto    chardispend
moji15
    
       ;文字の表示部分　　終了　++++++++++++++++++++++++++++++++++++++++++++

chardispend
        movlw   menu_sline       ;menu_slineとmenu_wlineを加算し、
        addlw   menu_wline       ;結果はＷレジスタに
        sublw   ini_line         ;ini_lineからＷレジスタの内容を引く
        movwf   temp0            ;残りグラフの最下段まで青で塗りつぶす
dlloop6
        call    bludotto         ;
        decfsz  temp0,1          ;
        goto    dlloop6

       ;int_line毎に白色ドットを描写、その間は青色ドットを描写
        movlw   Ydiv
        movwf   temp0
        incf    temp0,1          ;
dlloop7
        call    whidotto         ;白色の指定。

        movlw   int_line
        movwf   temp1
        decf    temp1,1          ;
dlloop8
        call    bludotto
        decfsz  temp1,1
        goto    dlloop8
        decfsz  temp0,1
        goto    dlloop7

        movlw   fin_line         ;
        movwf   temp0
dlloop9
        call    bludotto         ;青色ドット列の描写
        decfsz  temp0,1
        goto    dlloop9

        call    HDISP_FIN

        decfsz  linecount,1
        goto    dlloop10
 
enddatadisp

        return

;*****************************************
;サンプリング時間文字、横軸時間長棒文字、及び空白の抽出
char50udisp
        movfp   current,WREG   ;
        call    character50u
        call    comsamptime
        return
char100udisp
        movfp   current,WREG   ;
        call    character100u
        call    comsamptime
        return
char200udisp
        movfp   current,WREG   ;
        call    character200u
        call    comsamptime
        return   
char500udisp
        movfp   current,WREG   ;
        call    character500u
        call    comsamptime
        return   
char1mdisp
        movfp   current,WREG   ;
        call    character1m
        call    comsamptime
        return   
char2mdisp 
        movfp   current,WREG   ;
        call    character2m
        call    comsamptime
        return
char5mdisp 
        movfp   current,WREG   ;
        call    character5m
        call    comsamptime
        return
char10mdisp
        movfp   current,WREG   ;
        call    character10m
        call    comsamptime
        return
char20mdisp
        movfp   current,WREG   ;
        call    character20m
        call    comsamptime
        return
char40mdisp
        movfp   current,WREG   ;
        call    character40m
        call    comsamptime
        return
char50mdisp
        movfp   current,WREG   ;
        call    character50m
        call    comsamptime
        return
char0.1sdisp
        movfp   current,WREG   ;
        call    character0.1s
        call    comsamptime
        return
char0.2sdisp
        movfp   current,WREG   ;
        call    character0.2s
        call    comsamptime
        return
char0.4sdisp
        movfp   current,WREG   ;
        call    character0.4s
        call    comsamptime
        return
char0.5sdisp
        movfp   current,WREG   ;
        call    character0.5s
        call    comsamptime
        return
char1sdisp
        movfp   current,WREG   ;
        call    character1s
        call    comsamptime
        return
char2sdisp
        movfp   current,WREG   ;
        call    character2s
        call    comsamptime
        return
char4sdisp
        movfp   current,WREG   ;
        call    character4s
        call    comsamptime
        return
char10sdisp
        movfp   current,WREG   ;
        call    character10s
        call    comsamptime
        return
char20sdisp
        movfp   current,WREG   ;
        call    character20s
        call    comsamptime
        return
char40sdisp
        movfp   current,WREG   ;
        call    character40s
        call    comsamptime
        return
char100sdisp
        movfp   current,WREG   ;
        call    character100s
        call    comsamptime
        return
char200sdisp
        movfp   current,WREG   ;
        call    character200s
        call    comsamptime
        return
char400sdisp
        movfp   current,WREG   ;
        call    character400s
        call    comsamptime
        return
charspacedisp
        movfp   current,WREG   ;
        call    characterNL
        call    comsamptime
        return

;*****************************************
;文字描写部分の共通部分をサブルーチン化
comsamptime
        movwf   charcode

        movfp   samptime,WREG  ;
        subwf   charcount,0    ;samptime=charcount のとき、
        btfsc   ALUSTA,Z       ;対応する文字を赤色で表示
        call    seldottojob    ;
        btfss   ALUSTA,Z       ;
cstjump
        call    dottojob       ;

        incf    current,1
        movfp   current,WREG
        sublw   menu_moji1     ;current=menu_moji1 となったときには
        btfss   ALUSTA,Z       ;Ｚ＝１となる。その時点でcurrent をクリアする
        goto    comstend   
        clrf    current
        incf    char_number,1  ;表示文字番号を＋１する
comstend
        return  

;*********************************************************************************************
;*********************************************************************************************
;１行描写するための必須な初期処理
HDISP_INI
        movlb   1
        bcf     HSYNC_1        ;水平同期準備
        bsf     DCK_1          ;３×DCK_1以上の時間幅が必要と指定されているので
        bcf     DCK_1          ;
        bsf     DCK_1          ;
        bcf     DCK_1
        bsf     DCK_1
        bcf     DCK_1
        bsf     DCK_1
        bcf     DCK_1
        bsf     HSYNC_1        ;水平同期開始
        movlb   0

       ;行の先頭分の空の４８ドット分を実行する
        movlw   dott48
        movwf   temp0
hiloop   
        movlb   1
        bsf     DCK_1          ;ドットクロックを
        bcf     DCK_1          ;１パルス出力
        movlb   0
        decfsz  temp0,1        ;
        goto    hiloop
        
        return

;*********************************************************************************************
;*********************************************************************************************
;１行描写した際に必須な終了処理
HDISP_FIN
       ;行の最後分の空きの８ドット分を実行する
        movlw   dott8
        movwf   temp0
hfloop   
        movlb   1
        bsf     DCK_1          ;ドットクロックを
        bcf     DCK_1          ;１パルス出力
        movlb   0
        decfsz  temp0,1        ;
        goto    hfloop

        return

;*****************************************
;赤色ドットの描写
reddotto
        call    red111         ;赤色の指定。
        call    gre000
        call    blu000
        movlb   1
        bsf     DCK_1
        bcf     DCK_1
        movlb   0

        return

;*****************************************
;緑色ドットの描写
gredotto
        call    red000         ;緑色の指定。
        call    gre111
        call    blu000
        movlb   1
        bsf     DCK_1
        bcf     DCK_1
        movlb   0

        return

;*****************************************
;青色ドットの描写
bludotto
        call    red000         ;青色の指定。
        call    gre000
        call    blu111
        movlb   1
        bsf     DCK_1
        bcf     DCK_1
        movlb   0

        return

;*****************************************
;白色ドットの描写
whidotto
        call    red111         ;白色の指定。
        call    gre111
        call    blu111
        movlb   1
        bsf     DCK_1
        bcf     DCK_1
        movlb   0

        return

;*****************************************
;黄色ドットの描写
yeldotto
        call    red111         ;黄色の指定。
        call    gre111
        call    blu000
        movlb   1
        bsf     DCK_1
        bcf     DCK_1
        movlb   0

        return

;*****************************************
;紫色ドットの描写
viodotto
        call    red111         ;紫色の指定。
        call    gre000
        call    blu111
        movlb   1
        bsf     DCK_1
        bcf     DCK_1
        movlb   0

        return

;*****************************************
;配色ルーチン
    ;赤色データ
red000  
       movlb   5
       bcf     PORTF,0
       bcf     PORTF,1
       bcf     PORTF,2
       movlb   0
       return
red111  
       movlb   5
       bsf     PORTF,0
       bsf     PORTF,1
       bsf     PORTF,2
       movlb   0
       return
    ;緑色データ
gre000  
       movlb   5
       bcf     PORTF,3
       bcf     PORTF,4
       bcf     PORTF,5
       movlb   0
       return
gre111  
       movlb   5
       bsf     PORTF,3
       bsf     PORTF,4
       bsf     PORTF,5
       movlb   0
       return
    ;青色データ
blu000  
       movlb   5
       bcf     PORTF,6
       bcf     PORTF,7
       bcf     PORTG,0
       movlb   0
       return
blu111  
       movlb   5
       bsf     PORTF,6
       bsf     PORTF,7
       bsf     PORTG,0
       movlb   0
       return

;*********************************************************************************************
;*********************************************************************************************
;一定時間幅設定ルーチン　その０　長時間幅用　約１秒
;timebase0 の値で変更可能　
timewidlong
      movlw   timebase0    ;＝５　　　約１．０秒
      movwf   temp0        ;
twloop3
      clrf    temp1        ;
      clrf    temp2        ;
twloop0
      decfsz  temp1,1      ;
      goto    twloop0
      decfsz  temp2,1      ;
      goto    twloop0
      decfsz  temp0,1      ;
      goto    twloop3 
      return

;******************************************
;一定時間幅設定ルーチン　その１　短時間幅用
;timebase1 timebase2 の値で設定自在　
timewidshort
      movlw   timebase1    ;２５６×２５６　約０．４秒
      movwf   temp1        ;１２８×１２８　約０．１秒
      movlw   timebase2    ;
      movwf   temp2        ;　
twloop1
      decfsz  temp1,1      ;
      goto    twloop1
      movlw   timebase1    ;
      movwf   temp1        ;
      decfsz  temp2,1      ;
      goto    twloop1
      return

;******************************************
;モニタＬＥＤの点灯　検査用に使用できる
LEDon
      movlb   1
      bsf     LEDmon_1
      movlb   0
      return

;*********************************************************************************************
;*********************************************************************************************
;チャンネル番号表示文字
;数字”１”
character1
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000001'
       retlw   b'11111111'
       retlw   b'00000000'
       return

;数字”２”
character2
       addwf   PCL,1
       retlw   b'11100001'
       retlw   b'10010001'
       retlw   b'10010001'
       retlw   b'10001110'
       return

;*****************************************
;サンプリング時間表示文字
;文字”５０ｕ”
character50u
       addwf   PCL,1  
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'10001111'
       retlw   b'10001001'
       retlw   b'01110001'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'10000000'
       retlw   b'11111000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”１００ｕ”
character100u
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'10000000'
       retlw   b'11111000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”２００ｕ”
character200u
       addwf   PCL,1
       retlw   b'11100001'
       retlw   b'10010001'
       retlw   b'10001110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'10000000'
       retlw   b'11111000'
       retlw   b'00000000'
       return

;文字”５００ｕ”
character500u
       addwf   PCL,1
       retlw   b'10001111'
       retlw   b'10001001'
       retlw   b'01110001'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'10000000'
       retlw   b'11111000'
       retlw   b'00000000'
       return

;文字”１ｍ”
character1m
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'10000001'
       retlw   b'11111111'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11110000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”２ｍ”
character2m
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11100001'
       retlw   b'10010001'
       retlw   b'10010001'
       retlw   b'10001110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11110000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”５ｍ”
character5m
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'10001111'
       retlw   b'10001001'
       retlw   b'10001001'
       retlw   b'01110001'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11110000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop

;文字”１０ｍ”
character10m
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'10000001'
       retlw   b'11111111'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11110000'
       retlw   b'00000000'
       return

;文字”２０ｍ”
character20m
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11000001'
       retlw   b'10100001'
       retlw   b'10010001'
       retlw   b'10001110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11110000'
       return

;文字”４０ｍ”
character40m
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00111110'
       retlw   b'00100000'
       retlw   b'00100000'
       retlw   b'11111111'
       retlw   b'00100000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11110000'
       return

;文字”５０ｍ”
character50m
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'10001111'
       retlw   b'10001001'
       retlw   b'10001001'
       retlw   b'01110000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'11110000'
       return

;文字”０．１ｓ”
character0.1s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”０．２ｓ”
character0.2s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'11000001'
       retlw   b'10100001'
       retlw   b'10011110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       return

;文字”０．４ｓ”
character0.4s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10000000'
       retlw   b'00111110'
       retlw   b'00100000'
       retlw   b'00100000'
       retlw   b'11111111'
       retlw   b'00100000'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       return

;文字”０．５ｓ”
character0.5s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'10001111'
       retlw   b'10001001'
       retlw   b'01110001'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”１ｓ”
character1s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'10000001'
       retlw   b'11111111'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”２ｓ”
character2s
       addwf   PCL,1
       retlw   b'11000001'
       retlw   b'10100001'
       retlw   b'10011110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”４ｓ”
character4s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00111110'
       retlw   b'00100000'
       retlw   b'00100000'
       retlw   b'11111111'
       retlw   b'00100000'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return


;文字”１０ｓ”
character10s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'10000001'
       retlw   b'11111111'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop


;文字”２０ｓ”
character20s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11000001'
       retlw   b'10100001'
       retlw   b'10011110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”４０ｓ”
character40s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00111110'
       retlw   b'00100000'
       retlw   b'00100000'
       retlw   b'11111111'
       retlw   b'00100000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;文字”１００ｓ”
character100s
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       return

;文字”２００ｓ”
character200s
       addwf   PCL,1
       retlw   b'11000001'
       retlw   b'10100001'
       retlw   b'10011110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       retlw   b'00000000'
       return

;文字”４００ｓ”
character400s
       addwf   PCL,1
       retlw   b'00111110'
       retlw   b'00100000'
       retlw   b'11111111'
       retlw   b'00100000'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'01111110'
       retlw   b'10000001'
       retlw   b'01111110'
       retlw   b'00000000'
       retlw   b'10010000'
       retlw   b'10101000'
       retlw   b'01001000'
       return

;*****************************************
;文字”空白”
characterNL
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;*****************************************
;左移動記号　
characterLeft
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;縮小記号　
characterRedu
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;拡大記号　
characterExti
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return


       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       nop




;右移動記号　
characterRight
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'01111110'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00111100'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00011000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'11111111'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;リセット記号　
characterReset
       addwf   PCL,1
       retlw   b'00000000'
       retlw   b'10000001'
       retlw   b'11111111'
       retlw   b'10000001'
       retlw   b'00000000'
       retlw   b'11111000'
       retlw   b'00001000'
       retlw   b'00001000'
       retlw   b'11111000'
       retlw   b'00000000'
       retlw   b'11111010'
       retlw   b'00000000'
       retlw   b'00001000'
       retlw   b'11111100'
       retlw   b'10001000'
       retlw   b'00000000'
       retlw   b'11111010'
       retlw   b'00000000'
       retlw   b'01110010'
       retlw   b'10001010'
       retlw   b'10001010'
       retlw   b'11111100'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'11111111'
       retlw   b'10000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       retlw   b'00000000'
       return

;***********************************************************************************
;***********************************************************************************
;プログラムの実行終了
jobend
limit
      goto limit

      end





