2026年8月30日 (日)

【チラシのうら 42日目】約3倍 高速化しました。

Ver 0.4でライフゲームを動かしたら思いのほか遅かったので改良していました。
遅い原因
1) 実行時にソーステキストをトークン分割と評価を行っている。
2) 配列変数の参照時の添え字評価にカリキュレータを使用している
で、1)の解決の為にVer 0.5では評価済トークの状態でソースコードを保持しましたが、メモリー使用量が多くなり過ぎました。
Ver0.6ではソース入力時にキーワードを中間コードに変換して保持する方式に変更。
VisualStudioで開発してArduinoIDEで書き込みしているので、M5Stackに書き込んで動作確認する段になって
ESP32はワード境界を跨げない
事を知りました (;^ω^)
int a[2];
char *b = a;
*(int *)&b[1] = 10 ;
とかやるとカーネルパニックを起こします。
中間コードを uint8_t の配列で構成していたので運悪く(?)ワード境界を跨ぐとカーネルパニックでリセットがかかります。
ワード境界を跨ぐと落ちる問題の回避の為に無駄な処理を入れる羽目になりチョット納得いっていませんが画期的な解決策も思いつかないので取り合えずコレで進めます。
現状でVer0.4比で約3倍の速度向上になっています。

Youtubeショート動画
S21m5basic-ver-06-20260830-101403

| | コメント (0)

2026年8月29日 (土)

【チラシのうら 41日目】便利だわ GitHubCopilot

コード自体はAIに書かせてません、自力で書いてます。
で、AIはエラー原因の調査に使っています。
エラーで止まった時、意図しない動作になった時に原因の特定に使うとデバックがめっちゃ捗ります。

中間コード化が一段落ついて変更前と同じ機能まで回復しました。
※まだVisualStudio(Windows)上だけでM5Stackでは動いてません。

月末が近くてGitHUB Copilotの無料トークンが余っているのでコードレビューに掛けました。
未使用変数とデッドコードの調査を行う心算でプロンプトは
「プログラムの実行に影響を与えない冗長な箇所、参照されない変数、実行されないループなど、実行時に不要なコードを教えてください。」です。

Image21 Image20

で、
・if条件の中で代入
・配列引数の指定ミス
・制限条件の指定ミス
・ローカル変数での上書き
・実行条件の欠落
・変数の上書き
とバグの指摘がボロボロ… (;^ω^)

| | コメント (0)

2026年8月25日 (火)

【チラシのうら 40日目】実行中間コード化(2)

中間コードかたトークンに変換して実行までできました。
最も実行の方は未だLET文しかできていませんが (;^ω^)
変数の管理も変更しているの演算と代入の確認だけで一苦労。
中間コード化する時に変数も中間コード化してしまったので、初期化(NEWコマンド、CLEARコマンド相当の)動作が面倒になっています。
プログラムではない(行番号を付けない)直接実行で新規変数をドカドカ使ったら変数のガベージコレクションが必要になるかも…と言うか必要ですね。
BASICインタプリタの方がちょっとづつしか進まないので息抜き(?)に、プロトペディア用のアイキャッチを作ってみました。

S

| | コメント (0)

2026年8月22日 (土)

【チラシのうら 39日目】実行中間コード化

実は5日経過していたりしますが39日目です。
実行速度を上げるためにプログラムをトークン化した状態で保持しようとましたが、メモリー使用量が増大して保持できるプログラムサイズ自体が少なくなってしまう状態になってしまいました。
文字列で保持すれば1Byteしか取らない+ー=とかのオペレータやA,B,Cなどの1文字の変数もトークンにすると16Byte必要なので当然です (;^ω^)
これでは無理があるのでトークンの圧縮を考えた結果、中間コードに変換して保持すれば毎回字句解析を行うよりは高速にトークンに変換できる…と思い至り再度作り直しています。
変数名も中間コードに変換してしまえば変数の参照が高速化できるのでは?…と言う訳で変数管理も作り直しです。

プログラムコード入力 ⇒ 中間コードに変換 ⇒ プログラムコードに復元
まで、つまり、入力とLISTが出来る所まで再構築できました。
※まだ削除もリネームも出来ないです。

| | コメント (0)

2026年8月17日 (月)

【チラシのうら 38日目】実行速度向上施策

LIFE GAMEを実行してみて実行速度の遅さが気になりました。
2次元配列を繰り返し操作するLIFE GAMEとは相性が悪いのだと思う。

遅い要因として考えられるのは2点

  • 1行毎にトークン解析を行っている
    プログラムソースコードではなく解析済みのトークンを記録しておけば繰り返し処理でトークン解析の時間が短縮できる。
    この解析済みトークンにより多くの情報を詰め込めれば、それだけ実行速度の向上につながると思う。
  • 配列変数の評価に時間が掛かる
    定数の事前評価が難しいのと同じ理由で添え字を毎回評価しないといけない。
    配列の添え字、関数の引数、コマンドパラメタの評価を同じメソッドで処理できるように統合した副作用で遅くなっている気がする。

この点を踏まえて、プログラムリスト管理を作り直しました。
作り直し4回目?かな?

トークンに分割した状態でプログラムリストを記憶する方式に変更。
実行速度が1.4倍になりました。

しかし、トークンのデータサイズが大きくてメモリーを圧迫しています。
最大4500トークンまでしか使えない。※多分800~1000行分
もう一歩、トークンデータの圧縮が必要みたいです。

| | コメント (0)

2026年8月13日 (木)

【チラシのうら 37日目】SDカードユニットの交換で問題解決

秋月電子で購入したレギュレータ付きのSDカードユニットに交換しました。
取り合えず実験用ベースに組み込んで動作確認…問題なく一発で動作しました。
ファイル操作関係 FILES、LOAD、SAVE、REMOVEも問題なく動作。

Image18

SDユニットの外形が違うので筐体の再設計…は兎も角…3Dプリントやり直しは避けたいので、何とかSDユニットの土台部分は変えずに形状変更。
Image19
右に1mm幅を広げた方がバランスがよさそうな気がしますが…筐体作り直すの面倒くさい (;´Д`)
3Dプリンタのフィラメントを使い切ってしまっているので、フィラメントが届くまで筐体の改造は休止です。

| | コメント (0)

2026年8月11日 (火)

【チラシのうら 36日目】SDカードユニットがハズレだったっぽい?

SAVE/LOADを実装すべくまる二日試行錯誤しましたが…
どうも外部接続したSDカードユニットがハズレ(?)だったっぽい。
M5Stackとは相性が悪い? そんな感じ。
ちなみにAmazomで購入、5個セット680円だったかな。

電源投入時の起動シーケンスが途中でコケルっぽい。
SDカードを抜き差しすると動くようになる事があって、一度動けば電源を切って暫く放置しない限り大丈夫。
なので「あー動いた ( ^ω^ )」と思って安心すると動かなくなる。
配線が間違えてる訳でもスケッチが悪い訳でもないのに動かない。
完全に動かないなら未だしも時々動く… (;´Д`)
最終的に「こんな不安定なSDカードユニットは使ってらんね!!」って訳で別のユニット(秋月で購入、1個480円)に変更することにしました。
サイズ的にレトロPCっぽい筐体が作り直しになるんだが…
フィラメントを使い切ってしまってオレンジ色のフィラメントしか残ってないし…

使用を諦めたSDカードユニットがこちら
電源が正しく切れない ⇒ SDカードを抜き差しするとリセットが掛かる ⇒ 正常化してアクセセスできるようになる
って事らしい (Chat-GPTの解説によると)
電源をGPIOから操作できるようにしてON/OFF操作を自前でやれば解決すんじゃね?
って意見を出されたけど、そんな面倒な事やってらんねー
Image17

| | コメント (0)

2026年8月 8日 (土)

【チラシのうら 35日目】M5Stackでテキスト表示が出来るようになった

筐体をCardKB用に作り直し
BASICインタプリタも変数管理方法を変更して作り直しました。
いくらメモリー節約にはなりましたが、配列へのアクセス手順が増えて配列使うと遅くなる気が…

コンソールはキャラクタ表示、スクロール、CardKBからの入力が出来るようになりました。
DEL/BSが未実装なので削除は出来ないのですが (;^ω^)
まずは、万年カレンダー表示プログラムが動かせる所までは出来ました。

コンソール周りはVisualStudioでのデバックが出来ないので面倒です。
しばらくはコンソール周り、入力編集機能の拡張ですかね。

Image13


ここまでの成果

  • M5Stackの画面にテキスト表示が出来るようになった。
  • 16進数を扱えるようになった。

 

| | コメント (0)

2026年8月 1日 (土)

【チラシのうら 34日目】CardKB2に絶望した…

コンソールの制作に取り掛かり、キャラクタ表示、シリアルポートから入力、スクロールまで出来るようになった所でCardKB2からの入力を作り始めたところで…
はぁ!?

以下はBLE HIDモードでのみ動作します:
Fn + 1: Esc 出力
Fn + D: カーソル上(↑)
Fn + X: カーソルダウン(↓)
Fn + Z:カーソル左(←)
Fn + C:右カーソル(→)

絶望した…

BLE HIDモード使い勝手が悪いんだよ。
マッチングが鬱陶しいし[ESC]押すと接続が切れるし…
CardKB2を使おうと思ったのは、この筐体を作り始めた時にCardKBが売り切れだったのでカタログ落ちしたのだと思って、現状で手に入らないパーツで組むのは如何なものか…と思ったからなんです。
が、今見たら普通に売ってる (;^ω^) 単なる在庫切れだった模様
じゃぁCardKBで作れば解決ですね…折角作った筐体Ver3も無駄になるけど。
でも多分、何度も繰り返したデザインのノウハウは無駄にならないと信じて作り直しましょう。

めっちゃ良い感じに仕上がったのにお蔵入りなんだぜ… (´・ω・`)
D5989ebace0841ddab5bc85c4c3ca6f71

| | コメント (0)

2026年7月30日 (木)

【チラシのうら 33日目】MSX-BASICの文法をみて思う事

DEFINTを実装しようとたところで…


[ 機能 ]
指定された変数を整数型に定義します。

[ 書式 ]
DEFINT <範囲>[,<範囲>...]

[ 文例 ]
DEFINT A-I,N

[ 解説 ]
<範囲> は英文 1 文字ですか - で定義範囲を指定します。
DEFINT よりは型定義による変数が優先されます。
定義されていない型定義を行なっていない変数は
倍精度実数型扱いとなります。
CLEAR によって定義は解除されます。

DEFINT を実行する事で、
変数のメモリ管理が少なくなり処理が高速になる事から、
初期設定として DEFINT A-Z とする手段が有効です


う~ん、私のBASICだと、この宣言を実現するとメモリー使用量は増えるし速度は遅くなります。
何か、変数の管理方法が根本的に違うみたいですね。
そもそ変数型指定が有るのに宣言が必要なのか?問題が…

変数管理方法をもう一度考え直した方が良いかも(2回目)…
と言う訳で、ちょっと萎えたのでコンソールを作り始めてみました。

コンソールの構造を考え始めた時点で…VRAMが確保できない…圧倒的なメモリー不足…
CoreS3なら確保できるか?状態ですが M5Stack BASICでBASICのシャレは捨てたくないので、何とか実現できる方法を考えます。
PC-8001(TRS-80も同じ)方式と一方方向の書き込みの合わせ技にするしかないかな、ちょっと変な仕様になるけど何かの互換機・エミュレータを作っているのではないから雰囲気が出ればヨシ
…と言うことにしておこう。

漢字の扱いはArduinoIDE自体がUTF-8(2バイト文字と3バイト文字が混在している)仕様なのがなんとも、Shift-JISだったら簡単だったのですが。
そもそも、キャラクタセットをどうするか?
表示は出来てもプログラムとして入力できないからプログラム時にはUTF-8コードで代用するしない。
JIS 8Bitコードにしておいて一部をPCGとスプライト…はVRAMが確保できないから無理なのでPATTERNで代用するか。

フォントは東雲フォントを使うつもりでいたのですが、それ以前にキャラクタセットを作らないと進まないっぽい。

| | コメント (0)

«【チラシのうら 32日目】IF~THEN~ELSE~ENDIFを実装してみた