独自言語 picle on PIC24FJ [PIC]
組込みマイコン用として開発した独自言語 picle のPIC24FJ(インタープリッタ)版を公開します。
言語自体の仕様は ここ を参照してください。
★2016/04/2 追記 {
「独自言語 picle compiler on PIC24FJ」の記事でpicle コンパイラを公開しました。
}
[ 前へ ] 連載記事 [ 次へ ]
言語自体の仕様は ここ を参照してください。
★2016/04/2 追記 {
「独自言語 picle compiler on PIC24FJ」の記事でpicle コンパイラを公開しました。
}
- PCとの接続
PCとのシリアル通信にはUSARTを使用し、19200bps、8bit、パリティ無しで接続する
- RP8:RX(受信) 17番ピン
- RP9:TX(送信) 18番ピン
- 使用可能メモリ
メモリ : 0x1800 - 0x27FF
FLASH : 0xA000 - 0xFFFF (ソース保存用、実アドレスは0x2000-0x7FFF)
★2016/04/02 追記
コンパイラ版では FLASH : 0xA800 - 0xFFFF になります。
- コマンド
下記のコマンドが使用できます。下記で[]内のパラメータは省略可能
ソース管理関連 src adrs ソースのメモリアドレスを adrs に設定。リセット直後は 0x1800
flashメモリ上のソースの先頭に設定することでflashメモリ上のソースに対しても下記の「run」や「l」コマンド等が使用可能
例
:src $a000
size ソースの開始アドレス、終了アドレス及びサイズを表示する
例
:size
1800-1928 : 0128
run src コマンドで設定したソースを実行する。実行中は文字列表示処理実行時にキーセンスを実行しており、スペースキーでポーズ、ESC キーで実行を中断できる。
実行ソース(上記 src コマンドで指定)としてはメモリ上のソースも実行可能ですが、フラッシュ上で動作させた方が配列領域が広く(0x1800~)確保できます。メモリ上で実行した場合の配列領域はソース終了アドレス以降になります。{ } ダイレクトモードで実行する。ソースとして保存せずに入力したステートメントを直に実行できます。
例
:{PrnDec_(123+456*7);}
3315l [開始行][,終了行] ソースを表示するリストコマンドです。パラメータは開始行と終了行でそれぞれ省略可能。本コマンド実行によりソースのエンドアドレスが自動設定される。
src コマンドでソースを選択した後は本コマンドを実行することでソースエンドアドレスが設定される。ソースエディット関連(ソース開始アドレスがメモリの場合に有効) new メモリ上のソースを消去する(リセット直後も実施が必要) i [行番号] 行番号(省略時はソース先頭)の位置にソース挿入。本コマンド後、ソース入力モードになる。ESC キーで終了。
c [行番号] 行番号(省略時はソース先頭)の位置の行を削除し、ソース入力モードになる。ESC キーで終了。
d [開始行番号][,終了行番号 指定の範囲のソース行を削除する。
- フラッシュメモリへのセーブ/ロード
メモリ上のソースをフラッシュメモリへセーブ可能です。
フラッシュメモリへの保存時は Page単位(512word、アドレス上は0x0400単位)で消去するので隣接したソースとオーバーラップしないように注意してください。
- 例1
ソースをフラッシュメモリ(0xa000)にセーブする。表示される数値は保存したサイズです。
:¥> 250
- 例2
フラッシュメモリ(0xa000)のソースをロードする。
:¥< 250
- 例3
ソースをフラッシュメモリ(0xb000)にセーブする。
:¥>$b000 250
- 例4
フラッシュメモリに保存されたソースを一覧表示する。フラッシュ上のアドレスとソースの最初の行の内容が表示されます。
:¥¥
+A000-A128 # Fibonacci in picle language
+B000-B171 # sosuu
+C000-C60D # Life Game in picle language
- 例5
フラッシュメモリ 0xb000に保存されたソースをメモリ 0x1800 にロードする。
:src $1800
:¥<$b000 1015
- 例6
フラッシュメモリ上のソースの削除
空のソースを上書きすることで削除できます。0xb000 から始まるソースを削除する場合は
:new
:¥>$b000 1
- 電源ONで自動起動
電源ONでソースを自動起動したい場合は下記のコマンドでフラッシュメモリに保存します。
自動起動状態で保存されたソースはソース一覧でアドレスの左のマークが'$'になります。
:¥] 296
:¥¥
$A000-A128 # Fibonacci in picle language
+B000-B171 # sosuu
+C000-C60D # Life Game in picle language
- 例1
- 操作例 ★2016/02/08 追記
操作例を以下に示します。
また、 本言語の検討過程の記事 にサンプルソースがいくつかありますので参照してください。
picle Ver0.01b 2016/02/08 by skyriver :¥¥ +A000-A60D # Life Game in picle language +B000-B171 # sosuu +C000-C60D # Life Game in picle language +D000-D128 # Fibonacci in picle language :¥<$d000 296 :l 1:# Fibonacci in picle language 2:# by skyriver 2016/02/02 3: 4:func Fibo( n ) { 5: if ( n < 2 ) { 6: return = n; 7: } else { 8: return = Fibo(n-1) + Fibo(n-2); 9: } 10:} 11: 12:proc main() { 13: var n; 14: 15: PrnStr_( "Fibonacci( 0..20 ) =¥n" ); 16: for ( n = 0 ; n <= 20 ; n=n+1 ) { 17: PrnDec_( Fibo(n) ); 18: PrnStr_( " " ); 19: } 20:} :i4 4:# Fibonacci function 5: :l4,6 4:# Fibonacci function 5:func Fibo( n ) { 6: if ( n < 2 ) { :size 1800-193D : 013D :¥] 317 :¥¥ $A000-A13D # Fibonacci in picle language +B000-B171 # sosuu +C000-C60D # Life Game in picle language +D000-D128 # Fibonacci in picle language :run Fibonacci( 0..20 ) = 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 :
- ハードウェア条件
下図のように PIC24FJ64GA002 に 抵抗とコンデンサをそれぞれ 1個接続するだけで動作可能です。
シリアル接続は RP8:RX(受信)17番ピン、 RP9:TX(送信)18番ピン になります。
シリアルモード : 19200bps、8bit、パリティ無し、Stopビット:1
PIC24FJ64GA002 回路例
- ダウンロード
本記事内容の picle のHEXファイルとサンプルプログラムを下記からダウンロードできます。
picle_001b.zip
※商用利用以外は自由に使用できます。
★2016/02/08 追記 自動起動時の配列領域設定を修正しました。
[ 前へ ] 連載記事 [ 次へ ]
ソース管理関連コマンドとしてダイレクトモードでの実行を書き忘れていたので付け足しました。
実行サンプルとしてはこんな感じです。(下記ではタブ表示がなくなっていますが実際にはちゃんと表示されています)
:{var _a;_a=$1800;do {PrnChar_(_a[0]);if (_a[0]=13) { PrnChar_(10); }_a=_a+1;} while (_a[0]<>0);}
# Fibonacci in picle language
# by skyriver 2016/02/02
func Fibo( n ) {
if ( n < 2 ) {
return = n;
} else {
return = Fibo(n-1) + Fibo(n-2);
}
}
proc main() {
var n;
PrnStr_( "Fibonacci( 0..20 ) =\n" );
for ( n = 0 ; n <= 20 ; n=n+1 ) {
PrnDec_( Fibo(n) );
PrnStr_( " " );
}
}
:size
1800-1928 : 0128
:
by skyriver (2016-02-04 20:50)
拝啓
今日、picleを使わせていただきました。すごいです。\(^o^)/
よくもまあ、小さなcpuにこれだけのものを詰め込んだものです。
驚異的、驚きました。ソースコードの読み込みも良い感じです。
今日、MUTIF09Projectの機械が完成しました。すごいです。
6809はマガイモノをつかませられたようで、サンザンで、動作せず、
嫌いになりつつありましたが、やっとデットロックを乗り越えたよう
です。これから、勉強します。\(^o^)/
それにしても公開されているソフトとハードの完成度に目を
疑うようです。後光が差してみえます。。。
感謝、感謝 !!
by kanzo katuaki (2019-04-01 23:12)
コメントありがとうございます。
picleコンパイラは最初はTL/1を16bit化してPICに載せてみようかという発想から出発しましたが、TL/1の言語仕様が当初は不明だったこともあり、自分が使い易いような独自言語として作り上げました。
PIC24はマイナー(最近はArduinoユーザが大多数、PICでもPIC18/PIC32のユーザが多い)なこともあり、picle言語の推定ユーザ数は現時点で2名ですw(picleを使ってみたという報告を初めて頂きました^^)
グラフィック画面表示等がないのでゲーム作成目的のユーザには響きませんが、本ブログで書いているCP/M-80やCP/M-68Kの自作ボードでも使用しており実用性はそれなりに高いものに仕上がったのではないかと思います^^
by skyriver (2019-04-01 23:56)
拝啓
picleを使わせていただいています。私は、ArduinoIDEぐらいしか使えないので、PICのレジスタ操作になれていません。やっとプログラムを2個完成させました。そして、pic24CPM基板をseeedに注文しました。ほんとうに、picleの完成度の高さに驚いています。さらに、Z80をコントロールするなど、なるほどなぁ~。すごいです! \(^o^)/
蛇足:
new
i
# LED
var Count;
var SecCnt;
var W;
var BLAT;
proc Tint_() {
if ( SecCnt<99 ) {
SecCnt = SecCnt+1;
} else {
SecCnt=0;
Count=Count+1;
}
}
proc main() {
W = $02c8; #port B TRISB OUTPUT
W[0] = W[0]&$ff7f; #port B RB7 is ON/OFF LED
BLAT = $02cc; #port B 出力レジスタ
while (1) {
if (Count%2=0) {
BLAT[0] = BLAT[0]|$80; # LED ON
} else {
BLAT[0] = BLAT[0]&$7f; # LED OFF
}
# PrnDec_( Count );
PrnStr_(""); # if esc then STOP
}
}
蛇足:
new
i
# src_dump
proc main(){
var i,j,ch,mem;
mem=$b000;
for (i=0; i< $004FFF; i=i+1) {
if (i%128 =0) {
PrnStr_("\n\n---- 1 3 5 7 9 b d f");
}
if (i%8 =0) {
PrnStr_("\n");
PrnHex_(i*2+mem);
PrnStr_(": ");
}
PrnHex_(mem[i]);
PrnChar_(' ');
if ( i%8 =7 ) {
for (j=0; j< 8; j=j+1) {
ch=mem[i+j-7]&$ff;
if ((ch<$20)|(ch>$7F)) { PrnChar_('.'); }
else { PrnChar_(ch);}
ch=mem[i+j-7]/$ff;
if ((ch<$20)|(ch>$7F)) { PrnChar_('.'); }
else { PrnChar_(ch);}
}
}
}
}
by kanzo katuaki (2019-04-11 18:51)
コメント書込み時にTABコードがなくなってはいますが、TeraTermにコピペで動作しました^^
LED点滅の方も
https://piclabo.blog.so-net.ne.jp/2018-07-16
の記事で書いたI2CロガーがRB7にLEDを付けていたのでそのままLチカしました。
picleでは自分で調べてレジスタ設定をする必要があり、Arduinoのようにソースを探して動かすスタイルとはかなり異なったスタイルになりますが、隅から隅まで自分で把握できている世界を作り上げられるというところが私は好きです。
by skyriver (2019-04-11 21:37)