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


PICBASICコンパイラ

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

[第31回]



●ON n GOTO文

また何日か間が空いてしまいました。
今回のテーマ、ON n GOTO文のところがなかなかに手間で苦戦しておりました。
ちょっと前のところで書きましたようにPICBASICコンパイラとしては大体はできあがっていたのですが、考えるところがあってそれを全部壊してしまって最初からもう一度再構築する作業をしております。
ON n GOTO文も一度はちゃんと働くところまでできていたのですがそれも全部壊して再構築したらうまく動かなくなってしまいました。
この部分は結構面倒なことをやっていたところで、全部壊したつもりでもあちこちに断片が残っていてそれが邪魔をしていました。
毎度のことなのですが土曜も日曜も早朝から取り組んで作業した結果やっと元通りに働くようになりました。

ON n GOTO文は複数のGOTO文を併記して、その何番目を実行するかを n で指定する文です。
いつものようにテストプログラムをロードしました。

/LOAD BSONGOTOT1
でBSONGOTOT1.TXTファイルをロードしました。
簡単なサンプルプログラムなのですが、やっていることは結構複雑なのでマシン語コードに変換するとご覧の通りそれなりのサイズのプログラムになります。
16進コードの表示部分がいつもよりも多いので最初の部分がスクロールして見えなくなっています。
BASICプログラムのテキストファイルをロードするといつものようにマシン語コードへのコンバート作業から最後のマシン語オブジェクトファイルの作成までが自動的に行なわれます。

結果的にBASICのソースプログラムを表示するのは手順としては逆になってしまいます。

LISTコマンドでロードしたBASICのソースプログラムを表示しました。
動作確認のテストですので例としてa=3を設定しています。
aの値で選択されるGOTO文の行き先の行番号は100、200、300、400の4通りです。
a=3ですから3番目の300行が実行されます。
/runコマンドを入力しました。
/runコマンドで今作成されたPICのマシン語プログラムがPICに書き込まれ、続いてそのマシン語プログラムが直ちに実行されます。
書き込み中を示すwriting...のあと
256bytes writtenで書き込みが完了したことを表示、そのあとすぐに
program startedでプログラムの実行が開始されます。
プログラムはデバッグ動作のためにWindowsパソコンにUSB接続したPICで行なわれます。
300行が実行された結果
300end
と表示されたあとSTOP文でブレークしてWindows(コマンドプロンプト)に制御が戻りました。
もとのプログラムはBASICですが実際に実行されているのはPICに書き込まれたマシン語コードなのでブレークしたポイントもマシン語のプログラムアドレスで表示されます。
アドレス20C6でブレークしました。
そのアドレスはもとのBASICプログラムでは400行の直前の位置(つまり300行の終わり)です。

PICBASICコンパイラによって作成されたマシン語プログラムリストファイルです。
2000      ;    10 a=3
2000 030e     movlw D'3'
2002 306e     movwf a
2004      ;    20 on a goto 100,200,300,400
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 _200
201e 10f0 
2020 4def     goto _300
2022 10f0 
2024 63ef     goto _400
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 print "200end":stop
206e      _200
206e 320e     movlw 32
2070 16ec     call 2c
2072 00f0 
2074 300e     movlw 30
2076 16ec     call 2c
2078 00f0 
207a 300e     movlw 30
207c 16ec     call 2c
207e 00f0 
2080 650e     movlw 65
2082 16ec     call 2c
2084 00f0 
2086 6e0e     movlw 6e
2088 16ec     call 2c
208a 00f0 
208c 640e     movlw 64
208e 16ec     call 2c
2090 00f0 
2092 26ec     call 4c
2094 00f0 
2096 12ec     call 24
2098 00f0 
209a      ;   300 print "300end":stop
209a      _300
209a 330e     movlw 33
209c 16ec     call 2c
209e 00f0 
20a0 300e     movlw 30
20a2 16ec     call 2c
20a4 00f0 
20a6 300e     movlw 30
20a8 16ec     call 2c
20aa 00f0 
20ac 650e     movlw 65
20ae 16ec     call 2c
20b0 00f0 
20b2 6e0e     movlw 6e
20b4 16ec     call 2c
20b6 00f0 
20b8 640e     movlw 64
20ba 16ec     call 2c
20bc 00f0 
20be 26ec     call 4c
20c0 00f0 
20c2 12ec     call 24
20c4 00f0 
20c6      ;   400 print "400end":stop
20c6      _400
20c6 340e     movlw 34
20c8 16ec     call 2c
20ca 00f0 
20cc 300e     movlw 30
20ce 16ec     call 2c
20d0 00f0 
20d2 300e     movlw 30
20d4 16ec     call 2c
20d6 00f0 
20d8 650e     movlw 65
20da 16ec     call 2c
20dc 00f0 
20de 6e0e     movlw 6e
20e0 16ec     call 2c
20e2 00f0 
20e4 640e     movlw 64
20e6 16ec     call 2c
20e8 00f0 
20ea 26ec     call 4c
20ec 00f0 
20ee 12ec     call 24
20f0 00f0 

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

PICBASICコンパイラ[第31回]
2023.6.4upload

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