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)

2026年7月27日 (月)

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

IF文は1行に IF THEN ELSE が存在するMSX-BASIC仕様にしていましたが、
Chat-GPTに作ってもらったBASICのサンプル(モールス信号変換)のコードが
複数行に記述する IF~THEN~ELSE~ENDIF 構文を使用していました。
※昨日はMSX-BASIC仕様のIF文に書き換えて実行していました。

やっぱりIF~THEN~ELSE~ENDIFはあった方が便利だよなぁ…と言う訳で実装してみました。
IF構文を構造ブロックスタックに積んでないのでELSE区のエラーチェックがいい加減…と言うかエラーチェックしてません。
なのでIF区なしでELSEが出現するとENDIFまでスキップするGOTO文として動作します。 (;´∀`) コレハ コレデ ヨイ キガ シテキタ
この応用で WHILE~WHILEEND / DO~UNTILも実現できそうな気が…


------------------------
M5Z-80 BASIC Ver.0.3a
------------------------

10 REM ******************************
20 REM * MORSE CODE CONVERTER
30 REM ******************************
40 DIM M$(36)
50 RESTORE
60 FOR I=1 TO 36
70 READ M$(I)
80 NEXT
90 INPUT "TEXT";A$
100 FOR I=1 TO LEN(A$)
110 C$=MID$(A$,I,1)
120 IF C$=" " THEN PRINT " / ";:GOTO 200
130 N=ASC(C$)
140 IF N>=97 AND N<=122 THEN N=N-32
150 IF N>=65 AND N<=90 THEN
160 PRINT M$(N-64);" ";
170 GOTO 200
180 END IF
190 IF N>=48 AND N<=57 THEN PRINT M$(N-21);" ";
200 NEXT
210 PRINT
220 END
1000 DATA .-,-...,-.-.,-..,.
1010 DATA ..-.,--.,....,..,.---
1020 DATA -.-,.-..,--,-.,---
1030 DATA .--.,--.-,.-.,...,-
1040 DATA ..-,...-,.--,-..-,-.--
1050 DATA --..
1060 DATA -----,.----,..---,...--
1070 DATA ....-,.....,-....,--...
1080 DATA ---..,----.

READY.

run
TEXT?I LOVE YOU
.. .-.. --- ...- . -.-- --- ..-
READY.


ここまでの成果

  • IF~THEN~ELSE~ENDIF

| | コメント (0)

2026年7月26日 (日)

【チラシのうら 31日目】MID$,ASC,LENの文字列操作関数を実装してみた

動かすとどんどんバグが出るので、サンプルプログラムを動かしていきます。
今回は文字列をモールス信号に変換するコンバータです。
リストを見た時点でMID$,ASC,LENの文字列操作関数の実装が必要ですの実装してみました。
で、今回の例題実行時に見つかったバグですが
- 評価式の中に関数が使用されていた場合に関数値の評価が出来ない。
- 配列添え字を評価した後に中間評価変数が解放されず割り当て領域を使いつくしてしまう。
の2点でした。

モールス信号に変換された結果が正しいのか判断できないのですが (;^ω^)
『シリウスの心臓』のモールス信号と合わせてみて…合ってるんじゃね。


------------------------
M5Z-80 BASIC Ver.0.3a
------------------------
heap check = OK
Largest Internal = 110580(107.988KByte)
free = 199012(194.348KByte)
Largest PSRAM = 0(0)
Stack Free = 6156 bytes
READY.
10 REM ******************************
20 REM * MORSE CODE CONVERTER
30 REM ******************************
40 DIM M$(36)
50 RESTORE
60 FOR I=1 TO 36
70 READ M$(I)
80 NEXT
90 INPUT "TEXT";A$
100 FOR I=1 TO LEN(A$)
110 C$=MID$(A$,I,1)
120 IF C$=" " THEN PRINT " / ";:GOTO 200
130 N=ASC(C$)
140 IF N>=97 AND N<=122 THEN N=N-32
150 IF N>=65 AND N<=90 THEN PRINT M$(N-64);" "; : GOTO 200
190 IF N>=48 AND N<=57 THEN PRINT M$(N-21);" ";
200 NEXT
210 PRINT
220 END
1000 DATA .-,-...,-.-.,-..,.
1010 DATA ..-.,--.,....,..,.---
1020 DATA -.-,.-..,--,-.,---
1030 DATA .--.,--.-,.-.,...,-
1040 DATA ..-,...-,.--,-..-,-.--
1050 DATA --..
1060 DATA -----,.----,..---,...--
1070 DATA ....-,.....,-....,--...
1080 DATA ---..,----.
run

TEXT?ABCDEFG
.- -... -.-. -.. . ..-. --.
READY.

run
TEXT?I LOVE YOU
.. .-.. --- ...- . -.-- --- ..-
READY.
run

TEXT?M5Stack BASIC
-- ..... ... - .- -.-. -.- -... .- ... .. -.-.
READY.


ここまでの成果

  • MID$、LEN、ASCが使えるようになった
  • 評価式に関数を使えないバグ修正
  • 中間評価変数の作業領域が解放されないバグ修正

| | コメント (0)

2026年7月24日 (金)

【チラシのうら 30日目】DATA . READ , RESTOREを実装してみた

例によってバグ満載でサンプルプログラムの実現にまで至りませんでした (;^ω^)
トークナイザーのバグとREAD文自体のバグ、FOR~NEXTのバグで…
何とかDATA、READ、RESTORの基本動作が確認できる所まで出来ました。


------------------------
M5Z-80 BASIC Ver.0.3a
------------------------
heap check = OK
Largest Internal = 110580(107.988KByte)
free = 199012(194.348KByte)
Largest PSRAM = 0(0)
Stack Free = 6156 bytes
READY.

LIST
10 DATA 12,23:PRINT "ABC":DATA 34,45
20 DATA 56,67
30 FOR I=1 TO 5:READ A:PRINT A:NEXT
READY.

RUN
ABC
12
23
34
45
56
READY.

LIST
10 DATA 12,23:PRINT "ABC":DATA 34,45
20 DATA 56,67
30 FOR I=1 TO 10:READ A:PRINT A:NEXT
READY.

RUN
ABC
12
23
34
45
56
67
OUT OF DATA -- in 30
READY.


ここまでの成果

  • DATA , READ , RESTORE が使えるようになった。
  • NEXTのバグ修正

| | コメント (0)

2026年7月23日 (木)

【チラシのうら 28日目】乱数を実装してみた。

RND関数(乱数)を実装してみました。
ESP32にはWi-Fiアンテナのノイズを乱数シードに使用するハードウエア乱数モードがあるので
RANDOMIZEに数値指定/SOFTモード/ESP32モードを付けました。
乱数のサンプルに迷路作成を動かしてみました。
今回もバグ大量発生(;^ω^)
- THEN区のPRINT文字が文字化けする ※参照場所を間違っていた。
- DIM 宣言の添え字に定数値しか使えない ※バグではなく仕様。なぜか定数しか指定できないと思い込んでいた。


------------------------
M5Z-80 BASIC Ver.0.3a
------------------------
heap check = OK
Largest Internal = 110580(107.988KByte)
free = 217448(212.352KByte)
Largest PSRAM = 0(0)
Stack Free = 6156 bytes
READY.

list
10 REM ***********************
20 REM * MAZE GENERATOR
30 REM * 棒倒し法
40 REM ***********************
50 RANDOMIZE ESP32
60 W=21
70 H=21
80 DIM M(W,H)
90 REM ----- 全部通路にする -----
100 FOR Y=0 TO H-1
110 FOR X=0 TO W-1
120 M(X,Y)=0
130 NEXT X
140 NEXT Y
150 REM ----- 外周を壁に -----
160 FOR X=0 TO W-1
170 M(X,0)=1
180 M(X,H-1)=1
190 NEXT
200 FOR Y=0 TO H-1
210 M(0,Y)=1
220 M(W-1,Y)=1
230 NEXT
240 REM ----- 柱を立てる -----
250 FOR Y=2 TO H-3 STEP 2
260 FOR X=2 TO W-3 STEP 2
270 M(X,Y)=1
280 NEXT
290 NEXT
300 REM ----- 棒倒し -----
310 FOR Y=2 TO H-3 STEP 2
320 FOR X=2 TO W-3 STEP 2
330 D=INT(RND(1)*4)
340 IF Y>2 THEN GOTO 380
350 IF D=0 THEN DX=0:DY=-1
360 IF D=1 THEN DX=1:DY=0
370 IF D=2 THEN DX=0:DY=1
375 IF D=3 THEN DX=-1:DY=0
376 GOTO 420
380 D=INT(RND(1)*3)+1
390 IF D=1 THEN DX=1:DY=0
400 IF D=2 THEN DX=0:DY=1
410 IF D=3 THEN DX=-1:DY=0
420 M(X+DX,Y+DY)=1
430 NEXT
440 NEXT
450 REM ----- 表示 -----
460 FOR Y=0 TO H-1
470 FOR X=0 TO W-1
480 IF M(X,Y)=1 THEN PRINT "#";
490 IF M(X,Y)=0 THEN PRINT " ";
500 NEXT
510 PRINT
520 NEXT
530 END
READY.

run
#####################
# # # # #
# ### ##### # # # ###
# # # #
##### # ##### ##### #
# # # # #
### # ####### # # # #
# # # # # #
# # # ##### ### #####
# # # # #
# ### ### # # # ### #
# # # # # # #
# ##### # # ####### #
# # # # #
# # # ### ### ### # #
# # # # # # # #
# ##### ####### # ###
# # # #
# ### # # ### ### # #
# # # # # #
#####################
READY.
run
#####################
# # # #
# ### # # ### ### # #
# # # # # #
# ##### # ### # ### #
# # # #
### ##### # ### ### #
# # # # # #
### ### # # # ### # #
# # # # # # # #
### ########### # # #
# # # #
##### ##### ### #####
# # #
##### ##### #########
# # #
# # # ### # ### ### #
# # # # # #
##### ##### ### #####
# # #
#####################
READY.

ここまでの成果
  • 乱数が使えるようになった。
  • IF THENのバグ修正
  • DIMの仕様ミス修正

     

     

| | コメント (0)

«M5Z-80 BASICの筐体が出来ました。