2026.10.10
前へ

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


PICBASICコンパイラ

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

[第251回]



●新PICBS02(PIC18F45K50)LEDチカチカ(2)

当連載を最初からお読みいただいている方は理解されてみえると思いますが途中からお読みいただいた方は前回のBASICプログラムが本当にコンパイラによってPICのマシン語コードに翻訳されてそれがPIC18F45K50に書き込まれて実行されたということが今ひとつ実感できないのではと思います。
実際コマンドプロンプト画面を見ただけでは本当に「BASICからPICのマシン語に翻訳されているの?」と半信半疑のお方もいらっしゃるかと。
そこで今回はそのあたりをもう少し詳しく説明することにします。

PICBASICコンパイラは2段階で実行されますがそれは自動的に連続して行なわれます。
最初にBASICプログラムがPICアセンブラプログラムに翻訳されます。
次にそのPICアセンブラプログラムがPICアセンブラによってPICのマシン語命令コードに翻訳されます。

下は前回のBASICプログラム(ソースプログラム)です。
   10 TRISD=0
   20 PORTD=1
   30 wait 0
   32 wait 0
   34 wait 0
   36 wait 0
   40 PORTD=2
   50 wait 0
   52 wait 0
   54 wait 0
   56 wait 0
   60 goto 20


下はそのBASICプログラムがBASICコンパイラによって翻訳され生成されたPICアセンブラプログラムです。
;    10 TRISD=0
    movlw D'0'
    movwf R1c
    movwf TRISD
;    20 PORTD=1
_20
    movlw D'1'
    movwf R1c
    movwf PORTD
;    30 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    32 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    34 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    36 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    40 PORTD=2
    movlw D'2'
    movwf R1c
    movwf PORTD
;    50 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    52 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    54 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    56 wait 0
    movlw D'0'
    movwf R1c
    movwf waitcntr
    call 38
    decfsz waitcntr
    bra $-6
    nop
;    60 goto 20
    goto _20

BASICプログラムが1行ごとにPICの命令に翻訳されています。
もとのBASICプログラム行はコメント行としてリスト中に埋め込まれていますからひとつのBASIC命令がどのようなPICの命令に翻訳されているかがわかるようになっています。
これを読むことでPICのマシン語命令の使い方の参考にしていただけると思います。
このプログラムファイルはもとのBASICプログラム名に拡張子ASMをつけたファイルとして保存されますからあとでメモ帳などのテキストエディタで見ることができます。

下はBASICコンパイラの中で生成されたASMファイル(上のファイル)が読み込まれて今度はPICアセンブラによってアセンブルされてPICのマシン語命令コードに翻訳される過程で生成されたアセンブルリストです。
2040      ;    10 TRISD=0
2040 000e     movlw D'0'
2042 1c6e     movwf R1c
2044 956e     movwf TRISD
2046      ;    20 PORTD=1
2046      _20
2046 010e     movlw D'1'
2048 1c6e     movwf R1c
204a 836e     movwf PORTD
204c      ;    30 wait 0
204c 000e     movlw D'0'
204e 1c6e     movwf R1c
2050 306e     movwf waitcntr
2052 1cec     call 38
2054 00f0 
2056 302e     decfsz waitcntr
2058 fcd7     bra $-6
205a 0000     nop
205c      ;    32 wait 0
205c 000e     movlw D'0'
205e 1c6e     movwf R1c
2060 306e     movwf waitcntr
2062 1cec     call 38
2064 00f0 
2066 302e     decfsz waitcntr
2068 fcd7     bra $-6
206a 0000     nop
206c      ;    34 wait 0
206c 000e     movlw D'0'
206e 1c6e     movwf R1c
2070 306e     movwf waitcntr
2072 1cec     call 38
2074 00f0 
2076 302e     decfsz waitcntr
2078 fcd7     bra $-6
207a 0000     nop
207c      ;    36 wait 0
207c 000e     movlw D'0'
207e 1c6e     movwf R1c
2080 306e     movwf waitcntr
2082 1cec     call 38
2084 00f0 
2086 302e     decfsz waitcntr
2088 fcd7     bra $-6
208a 0000     nop
208c      ;    40 PORTD=2
208c 020e     movlw D'2'
208e 1c6e     movwf R1c
2090 836e     movwf PORTD
2092      ;    50 wait 0
2092 000e     movlw D'0'
2094 1c6e     movwf R1c
2096 306e     movwf waitcntr
2098 1cec     call 38
209a 00f0 
209c 302e     decfsz waitcntr
209e fcd7     bra $-6
20a0 0000     nop
20a2      ;    52 wait 0
20a2 000e     movlw D'0'
20a4 1c6e     movwf R1c
20a6 306e     movwf waitcntr
20a8 1cec     call 38
20aa 00f0 
20ac 302e     decfsz waitcntr
20ae fcd7     bra $-6
20b0 0000     nop
20b2      ;    54 wait 0
20b2 000e     movlw D'0'
20b4 1c6e     movwf R1c
20b6 306e     movwf waitcntr
20b8 1cec     call 38
20ba 00f0 
20bc 302e     decfsz waitcntr
20be fcd7     bra $-6
20c0 0000     nop
20c2      ;    56 wait 0
20c2 000e     movlw D'0'
20c4 1c6e     movwf R1c
20c6 306e     movwf waitcntr
20c8 1cec     call 38
20ca 00f0 
20cc 302e     decfsz waitcntr
20ce fcd7     bra $-6
20d0 0000     nop
20d2      ;    60 goto 20
20d2 23ef     goto _20
20d4 10f0 

このファイルも拡張子LSTのファイルとして保存されます。

下は前回実行した作業のログです。
全体だと長くなるので終わり近くの部分をお見せします。
>list
   10 TRISD=0                                                                 
   20 PORTD=1                                                                 
   30 wait 0                                                                  
   32 wait 0                                                                  
   34 wait 0                                                                  
   36 wait 0                                                                  
   40 PORTD=2                                                                 
   50 wait 0                                                                  
   52 wait 0                                                                  
   54 wait 0                                                                  
   56 wait 0                                                                  
   60 goto 20                                                                 
>/save ledtest1.txt
12lines save ok
>/run
contmk=0,convmk=0,bswrmk=1
*convert*
end of convert
*** p18asm ***
load ledtest1.asm
objbfi=150 bytes
00 0E 1C 6E 95 6E 01 0E - 1C 6E 83 6E 00 0E 1C 6E 
30 6E 1C EC 00 F0 30 2E - FC D7 00 00 00 0E 1C 6E 
30 6E 1C EC 00 F0 30 2E - FC D7 00 00 00 0E 1C 6E 
30 6E 1C EC 00 F0 30 2E - FC D7 00 00 00 0E 1C 6E 
30 6E 1C EC 00 F0 30 2E - FC D7 00 00 02 0E 1C 6E 
83 6E 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 
00 00 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 
00 00 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 
00 00 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 
00 00 23 EF 10 F0 
save object file
150bytes save ok
save list file
*** end asm ***
end
objbfi=150
writing[00][0e][1c][6e][95][6e][01][0e][1c][6e][83][6e][00][0e][1c][6e][30][6e][
1c][ec][00][f0][30][2e][fc][d7][00][00][00][0e][1c][6e].[30][6e][1c][ec][00][f0]
[30][2e][fc][d7][00][00][00][0e][1c][6e][30][6e][1c][ec][00][f0][30][2e][fc][d7]
[00][00][00][0e][1c][6e].[30][6e][1c][ec][00][f0][30][2e][fc][d7][00][00][02][0e
][1c][6e][83][6e][00][0e][1c][6e][30][6e][1c][ec][00][f0][30][2e][fc][d7].[00][0
0][00][0e][1c][6e][30][6e][1c][ec][00][f0][30][2e][fc][d7][00][00][00][0e][1c][6
e][30][6e][1c][ec][00][f0][30][2e][fc][d7].[00][00][00][0e][1c][6e][30][6e][1c][
ec][00][f0][30][2e][fc][d7][00][00][23][ef][10][f0][12][00][ff][ff][ff][ff][ff][
ff][ff][ff].
160bytes written
1275,xa=80,x=00[6c][65][64][74][65][73][74][31][00][00][00][00][00][00][00][00][
00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
filename=ledtest1
program started
^B

851,senddata end

 sin data=4
859,inbfend=4
break [090A]

break in line#=76538
wait 0 
>/exit

リモート接続を終了しました
logfile closed at Fri Oct 09 20:56:09 2026

PICアセンブラによって翻訳され生成されたPICマシン語コードがPIC18F45K50に送られるところがモニタされています。

PICBASICコンパイラ[第251回]
2026.10.10 upload

前へ

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