2023.6.7
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第33回]



●ON n GOTO文(3)

今回もON n GOTO文です。
[第31回]および前回ではGOTO文の行き先として行番号を指定しましたが、ON n GOTO文でも普通のGOTO文と同様行き先にラベルを指定することができます。
今回はGOTO文の行き先にラベルを使ったテストです。
普通は行番号だけとかラベルだけというような使い方が多いと思いますが今回はテストですから行番号とラベルを混ぜたプログラムを作りました。
テストプログラムbsongotot2.txtをロードしました。

PICBASICのテキストプログラムをロードするとそのテキストプログラムをもとにしてPICアセンブラソースプログラムファイルがコンバート作成されて最終的にPICマシン語コードファイルが作成されます。

ここでひとこと。
前回を注意深くお読みいただいた方はPICBASICコンパイラの進行の様子がいつもと違っていることに気がつかれたかもしれません。
いつもはBASICのテキストプログラムをロードするとそこでPICBASICコンパイラが起動してBASICのテキストプログラムからPICアセンブラソースプログラムファイルがコンバート作成されてさらにPICアセンブラが起動してPICマシン語コードファイルが作成されるところまでが自動的に行なわれます。
ところが前回はその部分が/RUNコマンドが実行されたあとで行なわれた後さらにそこからPICマシン語プログラムコードがPICに書き込まれたあとそのマシン語プログラムが実行されました。
前回は先にロードされ実行されたBASICプログラムの一部を書き換えました(行番号10のa=3をa=5に書き換えました)。
PICBASICコンパイラはBASICテキストプログラムを監視していてそれが一部でも書き換えられたら再度最初からコンバート作業をやり直さなければならないというようにプログラムしてあります。
通常ならば/LOADコマンドの実行によってコンパイル作業が行なわれるのですが前回はそのあとでBASICテキストプログラムが書き換えられたのにそのまま/RUNコマンドが実行されたので、そこでまずコンパイル作業が再実行されてマシン語プログラムが再作成されたあとでいつものように/RUNのプロセスが実行されたのです。

今回の説明に戻ります。
LISTコマンドでBASICのテキストプログラムを表示しました。

GOTO文の行き先は100、*abc、300、*xyzです。
今回はa=2を指定しましたからプログラムが正しく実行されればラベル*abcの行(200行)が実行されてそこでブレークするはずです。
/runコマンドを実行しました。
さきほど作成されたマシン語コードがPICに書き込まれたあとそのマシン語プログラムが実行されて
*abc end
と表示されたあとアドレス20A6でブレークしました。
そのことを示す
break [20A6]
の表示のあと
break before line#=300
と表示されて300行が表示されました。
マシン語プログラムのアドレス20A6はもとのBASICプログラムでは300行の直前の位置(つまり200行の終わり)です。

PICBASICコンパイラによって作成されたマシン語プログラムリストファイルです。
2000      ;    10 a=2
2000 020e     movlw D'2'
2002 306e     movwf a
2004      ;    20 on a goto 100,*abc,300,*xyz
2004 3050     movf a,w
2006 1c6e     movwf R1c
2008 1c06     decf R1c,f
200a 040e     movlw 4
200c 1c5c     subwf R1c,w
200e 0ce2     bc $+1a
2010 1c46     rlncf R1c,f
2012 1c46     rlncf R1c,f
2014 2eec     call 5c
2016 00f0 
2018 21ef     goto _100
201a 10f0 
201c 37ef     goto abc
201e 10f0 
2020 53ef     goto _300
2022 10f0 
2024 69ef     goto xyz
2026 10f0 
2028      ;    30 print "end":stop
2028 650e     movlw 65
202a 16ec     call 2c
202c 00f0 
202e 6e0e     movlw 6e
2030 16ec     call 2c
2032 00f0 
2034 640e     movlw 64
2036 16ec     call 2c
2038 00f0 
203a 26ec     call 4c
203c 00f0 
203e 12ec     call 24
2040 00f0 
2042      ;   100 print "100end":stop
2042      _100
2042 310e     movlw 31
2044 16ec     call 2c
2046 00f0 
2048 300e     movlw 30
204a 16ec     call 2c
204c 00f0 
204e 300e     movlw 30
2050 16ec     call 2c
2052 00f0 
2054 650e     movlw 65
2056 16ec     call 2c
2058 00f0 
205a 6e0e     movlw 6e
205c 16ec     call 2c
205e 00f0 
2060 640e     movlw 64
2062 16ec     call 2c
2064 00f0 
2066 26ec     call 4c
2068 00f0 
206a 12ec     call 24
206c 00f0 
206e      ;   200 *abc:print "*abc end":stop
206e      abc
206e 2a0e     movlw 2a
2070 16ec     call 2c
2072 00f0 
2074 610e     movlw 61
2076 16ec     call 2c
2078 00f0 
207a 620e     movlw 62
207c 16ec     call 2c
207e 00f0 
2080 630e     movlw 63
2082 16ec     call 2c
2084 00f0 
2086 200e     movlw 20
2088 16ec     call 2c
208a 00f0 
208c 650e     movlw 65
208e 16ec     call 2c
2090 00f0 
2092 6e0e     movlw 6e
2094 16ec     call 2c
2096 00f0 
2098 640e     movlw 64
209a 16ec     call 2c
209c 00f0 
209e 26ec     call 4c
20a0 00f0 
20a2 12ec     call 24
20a4 00f0 
20a6      ;   300 print "300end":stop
20a6      _300
20a6 330e     movlw 33
20a8 16ec     call 2c
20aa 00f0 
20ac 300e     movlw 30
20ae 16ec     call 2c
20b0 00f0 
20b2 300e     movlw 30
20b4 16ec     call 2c
20b6 00f0 
20b8 650e     movlw 65
20ba 16ec     call 2c
20bc 00f0 
20be 6e0e     movlw 6e
20c0 16ec     call 2c
20c2 00f0 
20c4 640e     movlw 64
20c6 16ec     call 2c
20c8 00f0 
20ca 26ec     call 4c
20cc 00f0 
20ce 12ec     call 24
20d0 00f0 
20d2      ;   400 *xyz:print "*xyz end":stop
20d2      xyz
20d2 2a0e     movlw 2a
20d4 16ec     call 2c
20d6 00f0 
20d8 780e     movlw 78
20da 16ec     call 2c
20dc 00f0 
20de 790e     movlw 79
20e0 16ec     call 2c
20e2 00f0 
20e4 7a0e     movlw 7a
20e6 16ec     call 2c
20e8 00f0 
20ea 200e     movlw 20
20ec 16ec     call 2c
20ee 00f0 
20f0 650e     movlw 65
20f2 16ec     call 2c
20f4 00f0 
20f6 6e0e     movlw 6e
20f8 16ec     call 2c
20fa 00f0 
20fc 640e     movlw 64
20fe 16ec     call 2c
2100 00f0 
2102 26ec     call 4c
2104 00f0 
2106 12ec     call 24
2108 00f0 

さきほどの画面で表示されたブレークアドレス20A6はもとのBASICプログラムでは300行の先頭位置にあるマシン語コードのアドレスになっています。
その前の200行を実行した最後のアドレス(20A2)にあるSTOP文に対応するマシン語命令CALL 24(STOP文のあとのブレーク処理をするためシステムルーチンをCALLしています)を実行したあとブレークしたのですが、CPUにはその次のアドレスが読み込まれたあとでブレークするのでブレークしたときは次のアドレス(20A6)が表示されます。

PICBASICコンパイラ[第33回]
2023.6.7upload

前へ
次へ
ホームページトップへ戻る