« 2026年6月 | トップページ | 2026年8月 »

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)

2026年7月22日 (水)

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

M5Z-80 BASICの筐体が出来ました。
思いのほか面倒だったんで2号機は無理かな (;´∀`)
中身もそろそろM5Stackの画面を使うようにしたいですね。
Windowsで動かないとデバックが超面倒なので基本機能が安定するまではWindowsで開発したい感じなのですが…

16e50c10d76744afb5f9690a3c64bb8f1

44849e0c4f784e16abd113b2b3f33b0c1

| | コメント (0)

2026年7月21日 (火)

【チラシのうら 27日目】万年カレンダーを動かしてみた

基本的な機能は出来た…できたよね (;´∀`)
と言うことで、サンプルにコンソールだけで動かせて作りの簡単な
万年カレンダーを動かしてみました。

…バグ大量発生…(@_@。

  • A+B(変数同士の足し算)が出来ない ※間違った答えを返す
  • USINGの最後の;が無視される ※常に改行される
  • 10÷3の演算結果が整数として処理され、答えが3になるる ※ 10.0÷3なら実数として計算され3.3333になる。
  • ELSEが無いIF文でTHEN区がマルチステートメントになっている場合に、条件がFALSEだとTHENの最後のステートメントが実行される。 ※ELSE区が存在する場合には正常に動作する。
  • 計算式の中で関数を複数回使用すると計算結果が正しくない ※中間評価変数の破壊が原因なので必ず起こる訳ではない。

最後のバグは訳が分からず、中間評価変数の管理方法を変更する…までやったのですが、トークナイザーの再起呼び出し時に中間評価変数の管理テーブルを初期化しているのが原因…でした。
分かってみれば単純なロジックミスですが、単純なミスほど発見しにくい。

コレもうね、遊びだから思い付きと勢いで作ってるけど、お仕事レベルの試験仕様書書いた方が良いのではないかと思い始めてる。
テスト…どんだけ時間掛かるか…(;^ω^) しかも絶賛増設中だし。


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

10 INPUT "YEAR";Y
20 INPUT "MONTH";M
30 DIM D(12)
40 D(1)=31:D(2)=28:D(3)=31:D(4)=30
50 D(5)=31:D(6)=30:D(7)=31:D(8)=31
60 D(9)=30:D(10)=31:D(11)=30:D(12)=31
70 IF (Y MOD 4)=0 THEN D(2)=29
80 IF (Y MOD 100)=0 THEN D(2)=28
90 IF (Y MOD 400)=0 THEN D(2)=29
100 A=Y
110 B=M
120 IF B<3 THEN B=B+12:A=A-1
130 K=A MOD 100
140 J=INT(A/100)
150 H=(1+INT((13.0*(B+1))/5.0)+K+INT(K/4)+INT(J/4.0)+5.0*J) MOD 7
159 X6= X4 MOD 7
160 W=(H+6) MOD 7
165 PRINT
170 PRINT " ";Y;"/";M
180 PRINT " SUN MON TUE WED THU FRI SAT"
190 FOR I=1 TO W
200 PRINT " ";
210 NEXT I
220 FOR DAY=1 TO D(M)
230 PRINT USING "### ";DAY;
240 W=W+1
250 IF W=7 THEN PRINT:W=0
260 NEXT DAY
270 PRINT

READY.
run

YEAR?2026
MONTH?7

 2026/7
SUN MON TUE WED THU FRI SAT
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

READY.


ここまでの成果

  • INT() , FIX()関数が使えるようになった
  • いくつかのバグを修正
  • 万年カレンダーが実行できた。

| | コメント (0)

2026年7月20日 (月)

【チラシのうら 26日目】INPUTを実装してみた

最終的にはCardKB2から入力できるようにするので、キー入力はデバック用の暫定入力です。
入力受付後に代入先の変数を評価すつタイミングの都合で、入力後にSYNTAXエラーが出る仕様になりました。
データ入力自体は DATA文に流用できそう。


------------------------
M5Z-80 BASIC Ver.0.3
------------------------
READY.

input "A=";A
A=?123
READY.

print a
123
READY.

input a,b,c
?123,456,789
READY.

print a,b,c
123 456 789
READY.

input a,b,c
?11,22
?33
READY.

print a,b,c
11 22 33
READY.

input a$
?abc def
READY.

print a$
abcdef
READY.

input a$
?"ABC DEF"
READY.

print a$
ABC DEF
READY.


ここまでの成果

  • INPUTが使えるようになった

| | コメント (0)

2026年7月19日 (日)

【チラシのうら 26日目】PRINT USINGを実装してみた

ヒープ領域破壊の原因が分からず手間取りました。
WindowsやLinuxでは起きないですが、組み込み系では割とある問題らしいです。
グローバル領域に宣言したクラスのコンストラクタとヒープ領域の初期化のどっちが先に実行されるか問題… (;・∀・)
「組み込み系ではコンストラクタ内でメモリー領域を確保してはならない」と言う事でした…
なるほど、WireとかSerialにbegin()メソッドがあるのは そう言う理由だったのですね。

MSX-BASICの文法を参考にしていますが、エラーチェックが甘いのでちょっと不思議な動きになりました。
数値を直接記述した場合、フォーマット指定が文字列でもエラーになりません。
PRINT文解析中に出現した単体の数値は中間変数に評価せず(評価する必要がない)内供表現は文字列のままなのでフォーマット指定が文字列でもエラーにならない…と。
まぁ、コッチの方が動作が柔軟なのでヨシ…と言うことにしておこう。


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

PRINT USING"& & & & ### !";"MSX";"BASIC",2.5,"ABC"
MSX BASIC 2 A
READY.

PRINT USING"& & & & ###. !";"MSX";"BASIC",2.5,"ABC"
MSX BASIC 3 A
READY.

PRINT USING"& & ";"MSX";"BASIC",2.5,123
MSX BASIC 2.5 123
READY.


###. と小数点を付けると実数扱いで小数部ゼロなので表示時に四捨五入
###は整数表示指示なので小数点以下切り捨てにしています。

ここまでの成果

  • 書式付き表示(PRINT USING)が使えるようになった

取り合えず、万年カレンダーが作れるだけの機能の実装を優先しようと思う。

| | コメント (0)

2026年7月18日 (土)

【チラシのうら 25日目】RENUMを実装してみた

RENUMを実装しました。
RENUM実装中に
・ガベージコレクションのバグ発見
・コマンド実行ポータルのバグ発見
・VisualStudioのReleaseモードで動かない⇒ トークナイザーの初期化漏れ
・M5AtomでCoreパニック ⇒ トークナイザーの初期化方法が間違っている
M5AtomでのCoreパニックの原因の特定に苦労しました。※実はデバックに3日掛かっている。
実にくだらないバグでメモリーがたっぷりあると発覚しない(だからWindowsでは動いていた)という…(;^ω^)


------------------------
M5Z-80 BASIC Ver.0.3
------------------------
READY.

10 PRINT "------"
20 print "BEFORE" : gosub 60 : print "AFTER"
30 print "30"
40 print "40"
50 end
60 print "60"
70 print "70"
80 return
READY.

renum 100
READY.

list

100 PRINT "------"
110 PRINT "BEFORE" : GOSUB 150 : PRINT "AFTER"
120 PRINT "30"
130 PRINT "40"
140 END
150 PRINT "60"
160 PRINT "70"
170 RETURN
READY.


ここまでの成果

  • ガベージコレクションのバグ修正
  • RENUMが使えるようになった

| | コメント (0)

2026年7月17日 (金)

M5Z-80がすでに存在していた件

M5Stack FIREで動作するMZ-80Cエミュレータが存在していたのですね。
名称もまる被りのM5Z-80 M5Stack:MZ-80C エミュレータ! … (´・ω・`)ヤッチマッタ…

私はに実際に動作するレトロPC(マイコン)っぽいガジェットが欲しいな…と思って作り始めたので
実機のエミュレータにするつもりは最初からありません。
MSX-BASICを文法・動作・機能の参考にしていますが、互換性とか考えてません。
…最初は考えていたのですが、BASICをZ-80で組む必要はないんじゃないかと思い至りエミュレータにしたらライセンスが面倒くさそう…
そもそも、今更8Bitのマイコンを何に使うの?(←レトロPCに手を出せないのと同じ理由)
と言うことになり、オリジナルのBASIC(目標はN80-BASIC程度の機能)+Z-80エミュレータ(全くノーアイディアだけどオリジナルを作ろうと構想している)で行くこととしました。

名前変えるか… M5-BASIC までは(半分くらい…3割くらい…)出来ているし、筐体はMZ-80Cをイメージしているので他に良い感じの名前を思いつかないのが何とも。

ちなみに筐体は鋭意制作中。
積層跡を消すためのペーパー掛けと塗装に苦心しています、
最初に傾斜を付けたキーボードの表面を基準にしてしまったせいで各所の基準面が傾いたままになり、水平垂直に戻せなず、何か微妙に傾いてる&歪んでる感が…
しかも設計時にM5Stack Core2のサイズで作ってしまったのでM5Stack BASICだと収まりが悪くてM5Stack BASIC用のパーツも追加になるとか、
かみ合わせがきつ過ぎて、仮組みしたらばらせなくなった(SDカードの差し込み口が外せない)…とかトラブル続出してます。
※SDカードを2個同時に使用できるのは検証済

Image11_20260715080901
もう業者に出そうかと思いましたが…参考見積価格 8万円…いや無理 (;´Д`)

で、コレは試作1号と言うことで、このまま使えそうな雰囲気ですが歪みが気になるのでボツですね。
2号機を最初から設計し直し、今度はボディー底面を基準面にして制作してます (;^ω^)

Image9

| | コメント (0)

2026年7月16日 (木)

【チラシのうら 24日目】ON GOTO / ON GOSUBを実装してみた

ON ~ GOTO / ON ~ GOSUB を実装してみました。


------------------------
M5Z-80 BASIC Ver.0.3
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
Stack Free = 6428 bytes
READY.

list
10 SW = 1
20 PRINT "=====":ON SW GOSUB 100,200,300:PRINT "-----"
30 END
100 PRINT "100"
110 RETURN
200 PRINT "200"
210 RETURN
300 PRINT "300"
310 RETURN
READY.

run
=====
100
-----

list
10 SW = 1
20 PRINT "=====":ON SW+1 GOTO 100,200,300:PRINT "-----"
30 END
100 PRINT "100"
110 END
200 PRINT "200"
210 END
300 PRINT "300"
310 END
READY.

run
=====
200
READY.


ここまでの成果

  • ON~GOTOが使えるようになった
  • ON~GOSUBが使えるようになった

| | コメント (0)

2026年7月15日 (水)

【チラシのうら 23日目】ガベージコレクションを実装してみた

文字列変数を扱えるようになったのでガベージコレクションが必要になりました。
領域圧縮のついでにERASE(配列の削除)も実装してみました。
見た目で分かる機能ではないのでデバックコマンドでメモリー状態をダンプしています。


ガベージコレクション実行前
----- strValuePool [0 - 54]
[0004] 456
[0026] 22222
[0032] 66666
[0038] 33333
[0044]
[0045] EOF
[0049]
[0050] EOF

[0000] ....456#..................22222#66666#33333##EOF##EOF#


ガベージコレクション実行後
----- strValuePool [0 - 32]
[0000] 456
[0004] 22222
[0010] 66666
[0016] 33333
[0022]
[0023] EOF
[0027]
[0028] EOF

[0000] 456#22222#66666#33333##EOF##EOF#


ここまでの成果

  • ガベージコレクションが出来るようになった。
  • ERASE(配列の削除)が出来るようになった

| | コメント (0)

2026年7月14日 (火)

【チラシのうら 22日目】文字列変数を追加したら配列の演算バグが発見された

大部分を /* 未実装 */ にしていた文字列変数を実装しました。
で、テスト用に A$(1)=A(2)+A$(3) が実行できず、突き詰めてみたら A=123+B(1) が計算できない事が発覚。
数式演算での配列要素を入れると評価キューが壊れる事が発覚。
原因が分からずデバックに苦労しました。
やっと直った…と思たら甘かった…(´・ω・`)
トークンをシープ領域に展開するようにした(スタック領域の節約)影響で再起呼び出しでバグが出てました。


修正前
------------------------

M5Z-80 BASIC Ver.0.3
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
Stack Free = 6428 bytes
READY.

A(2)=123
READY.

PRINT 321+A(2)+111
555
READY.

C$(2)="ABCDE"
READY.

D$="12345" + C$(2)
READY.

print D$
12345ABCDE
READY.

print 321+A((1+1)/2*2)+111
SYNTAX ERROR
READY.

A((1+1)/2*2) = 567
INVALID DATA
READY.


修正後
------------------------

M5Z-80 BASIC Ver.0.3
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
Stack Free = 6428 bytes
READY.

dim B(10,10)
READY.

A(4) = 4
READY.

B(2,4)=567
READY.

PRINT B((1+1)/2*2 , A((4-2)*4-4));" -- ";A(2+2)
567 -- 4
READY.


ここまでの成果

  • 文字列が使えるようになった
  • 配列演算のバグ修正

| | コメント (0)

2026年7月13日 (月)

【チラシのうら 21日目】GOSUB、RETURN、END文追加してみた

GOSUB、RETURNを追加してみました。
テスト用のコードを書くのに必要だったのでENDもついでに追加しました。
ついでに(三角関数を追加する予定で)とりあえずPIを使えるようにしてみました。


------------------------
M5Z-80 BASIC Ver.0.3
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
Stack Free = 6428 bytes
READY.

10 PRINT "------"
20 print "BEFORE" : gosub 60 : print "AFTER"
30 print "30"
40 print "40"
50 end
60 print "60"
70 print "70"
80 return

run
------
BEFORE
60
70
AFTER
30
40
READY.

print pi
3.141593
READY.


ここまでの成果

  • GOSUB文、RETURN文が使えるようになった。
  • END文が使えるようになった。
  • ついでにPIが使えるようになった。

| | コメント (0)

2026年7月12日 (日)

【チラシのうら 20日目】GOTO文を実装してみた

ループと分岐が出来て、最低限の制御機能が揃いました。


------------------------
M5Z-80 BASIC Ver.0.3
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
Stack Free = 6428 bytes
READY.

list
10 PRINT "10"
20 GOTO 40
30 PRINT "30"
40 PRINT "40"
50 PRINT "50"
60 PRINT "60"
READY.

run
10
40
50
60
READY.

list
10 A = 1
20 IF A=1 THEN 40 ELSE 50
30 PRINT "30"
40 PRINT "40"
50 PRINT "50"
60 PRINT "60"
READY.

run
40
50
60
READY.

10 A=0
READY.

run
50
60
READY.

list
10 A=1
20 IF A=1 GOTO 40 ELSE 50
30 PRINT "30"
40 PRINT "40"
50 PRINT "50"
60 PRINT "60"
READY.

run
40
50
60
READY.


ここまでの成果

  • GOTO文が使えるようになった。
  • IF~THEN <行番号> ELSE <行番号> が使えるようになった。
  • IF~GOTOが使えるようになった。

| | コメント (0)

2026年7月11日 (土)

【チラシのうら 19日目】IF文を実装してみた

MSX形式のIF文で IF~THEN~ELSEが1行で完結する仕様です。
まだGOTO文が実装出来てないので IF <式> THEN <行番号> が実現できてません。
デバック中に他のバグも続々発生 (。-`ω-)
Bが未定義(一度も値を代入されていない)状態で A=B が実行できないとか
FOR I=B TO 3 がダメとか
未定義変数の処理に問題がある事が発覚したので修正ついでに B(2)=10 が実行できるように拡張しました。
次は GOTOの実装ですかね。


------------------------
M5Z-80 BASIC Ver.0.3
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
Stack Free = 6156 bytes
READY.

list
10 A=0
20 IF A=0 THEN PRINT "TRUE" :PRINT "TRUE-2" ELSE PRINT "FALSE" : PRINT "FALSE-2"
READY.

run
TRUE
TRUE-2
READY.

list
10 A=1
20 IF A=0 THEN PRINT "TRUE" :PRINT "TRUE-2" ELSE PRINT "FALSE" : PRINT "FALSE-2"
READY.

run
FALSE
FALSE-2
READY.


ここまでの成果

  • (不完全だけど)IF文が使えるようになった。
  • DIM宣言なしで(0~10)までの1次元配列が使えるようになった。

| | コメント (0)

2026年7月10日 (金)

【チラシのうら 18日目】トークン分割再修正

トークン分割用の作業領域をヒープ領域に移してスタックを節約しM5Atomで動作するようになりました。
M5Atomで動かしたシリアルモニタの画面
Image8

| | コメント (0)

2026年7月 9日 (木)

【チラシのうら 17日目】Stack Over Flow

VisualStudioでは動いていたのですがM5Atomで実行したところStack Over FlowでCore Panicが発生してしまいました。
トークン解析を入れ子にしたせいでStackが足りなくなったようです。


------------------------
M5Z-80 BASIC Ver.0.2x
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
READY.

A=10

Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception).
Debug exception reason: Stack canary watchpoint triggered (loopTask)
Core 1 register dump:
PC : 0x40084e3a PS : 0x00060f36 A0 : 0x800d3b13 A1 : 0x3ffafb60
A2 : 0x3ffafba4 A3 : 0x00000000 A4 : 0x0000130c A5 : 0x3ffb0314
A6 : 0x3ffc2afc A7 : 0x00000130 A8 : 0x800d5114 A9 : 0x3ffafa90
A10 : 0x00000039 A11 : 0x3ffafaa4 A12 : 0x3ffafabc A13 : 0x3ffafafc
A14 : 0x3ffc2afc A15 : 0x3ffafabc SAR : 0x00000004 EXCCAUSE: 0x00000001
EXCVADDR: 0x00000000 LBEG : 0x40084e34 LEND : 0x40084e3f LCOUNT : 0x000000b8


トークンの保持方法を変えてStackを節約しないと動かない状態になりました。
と言う訳で…作り直し3回目に突入 (´・ω・`)

| | コメント (0)

2026年7月 8日 (水)

【チラシのうら 16日目】FOR文Ver2 完了

MSXの仕様に寄せたおかげで作りが簡素になりました。
2重ループ、マイナスステップもクリア
文法チェックと数式評価のバグが取れなくて悩みましたが何とか動作しました。
今度はRUNモード時のプログラムカウンタの管理が怪しくなっている気がしますが (。-`ω-)


------------------------
M5Z-80 BASIC Ver.0.3
------------------------
Largest Internal = 0(0KByte)
Largest PSRAM = 0(0)
READY.

list

10 FOR I=3 TO 1 STEP -1
20 FOR J=1 TO 3
30 PRINT I;" - ";J
40 NEXT J,I
READY.

run

3 - 1
3 - 2
3 - 3
2 - 1
2 - 2
2 - 3
1 - 1
1 - 2
1 - 3
READY.


作り直し前の機能まで修復できました。

ここまでの成果

  • FOR文で多重ループが使えるようになった
  • STEPにマイナスが使えるようになった

| | コメント (0)

2026年7月 4日 (土)

【チラシのうら 15日目】ずるっこデバック

2度目の作り直しで、ようやくLET,DIM,PRINT命令が出来ました。
LETとDIMは結構バグがあって動作確認する毎にバグが見つかる状態 (;^ω^)
で、今のところM5Stackに固有の機能は使っていないので実機で動かすよりWindowsで動かしてデバックした方が手っ取り早くね?
と言う事で ダミーのArduino.h main.cpp を定義して VisualStudioでデバックしています。
ブレークポイントと変数ダンプの有難さよ (*´з`)

Image7_20260703172501

まだ直しきれてないのは RUN,CLEAR,NEW,LIST,FOR,NEXT
実質、残ってるのは FOR~NEXT だけですね。
FORの評価方法はガラット変えてMSX-BASICに合わせる予定なので作りは前回よりも遥かにシンプルになる見込みです。

 

| | コメント (0)

2026年7月 3日 (金)

【チラシのうら 14日目】仕様の再検討

FOR~NEXTのブロック認識以外に終了判定にも欠陥がある事に思い至りました。
STEPがマイナス値の場合を考えてませんでした。
FOR I=3 TO 1 STEP -1 とかの場合ですね。
終了判定を STEPがプラスの場合でしか考えてませんでした。
で、お手本…と言うか、今動かせるBASICがコレしかないので参考にしているポケコン PC-G850Vの動作を見てみました。

Image4_20260701175101
流石に… 感覚的には、この仕様はナイわ~ と思う
どうしてこうなるのかは分かるけど…チョットねぇ
Chat-GPTに N80-BASICの仕様はどうなってるの? を質問たところ「MicroSoft BASICではループブロックは実行されない。」との回答だったのですが・・・

と言う所で ブラウザで動作する PC-8001エミュレータ を見つけたので試してみました。
Image5_20260701180701
えっ!? この仕様あってるの?
ん~MSXエミュレータ動かしてみるかな・・・
※MSXマガジン永久保存版3のMSXエミュレータを使ってみました。
※最新版は MSX-BASICでゲームを作ろう にMSXPLAYerのダウンロードキーが付いています。
Image6_20260701182401
あれ~? MSXもこの仕様ですね。
C/C++、Javaの仕様を意識しすぎて複雑になってました、参考にすべきはFORTRANのDO文でしたね。
この仕様だとFOR評価時に評価がFALSEでもNEXTに飛ばなくてよいのでブロック判定が楽なんので、この仕様を参考にしようと思います。
GitHUBにMSX BASICのリファレンスがあったので書式はコレに準拠ですかね。

MSX MAGAZINE 永久保存版3 Amazonで中古 1万3千円の値段がついてる (;^ω^)
2005年発行 定価2800円 … 持ってるんだが… すげーな。
ちなみに MSX MAGAZIN 永久保存版 も持っているのですが、コッチはそんな高値が付いてないですね。
付属のゲームソフトとかMSXエミュレータのバージョン(Windows10以降で動かないっぽい)の関係でしょうか。

| | コメント (0)

2026年7月 2日 (木)

「スーパーの裏でヤニ吸うふたり」のフィギア・・・風の画像

「スーパーの裏でヤニ吸うふたり」のフイギュア、良いなぁ欲しいなぁ…とは思いますが 6万8千円はなぁ…
なので、Chat-GPTでフィギュア画像を生成してみました。
何か画像生成の精度が高くなっているような。

Chatgpt-image-2026629-18_07_30

佐々木さんには消えてもらいました (w

Chatgpt-image-2026629-18_09_59

ねんどろいど風のも生成してみました。
田山さん ねんどろいどはチョット欲しいかも。

Chatgpt-image-2026629-18_15_46

| | コメント (0)

2026年7月 1日 (水)

【チラシのうら 14日目】ブロック認識に欠陥がある事に気づきました。

IF~THEN~ELSE~ENDIF を実装仕様とした所でブロック認識に欠陥がある事に気づきました。
FORの二重ループで最初のFORが最初からループ条件を満たさない場合ですね。
FOR評価時にNEXTを探しますが、二重ループになっていると間違ったNEXTをブロックの終端と判断してしまいます(多分)。
試してみたらCOREパニック起こしてりせっとが掛かりました。
ブロック認識の改善が必要です (´・ω・`)


------------------------
M5Z-80 BASIC Ver.0.2x
------------------------
Largest Internal = 110580(107.988KByte)
Largest PSRAM = 0(0)
READY.

list
10 FOR I=1 TO 3
20   PRINT "==="
30   FOR J=1 TO 3
40     PRINT "I=";I;" J=";J
50   NEXT
60   PRINT "---"
70 NEXT
READY.

run
===
I=1 J=1
I=1 J=2
I=1 J=3
---
===
I=2 J=1
I=2 J=2
I=2 J=3
---
===
I=3 J=1
I=3 J=2
I=3 J=3
---
READY.

10 for i=5 to 3
READY.

list
10 FOR I=5 TO 3
20 PRINT "==="
30 FOR J=1 TO 3
40 PRINT "I=";I;" J=";J
50 NEXT
60 PRINT "---"
70 NEXT
READY.

run
---
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0x400d2ad8 PS : 0x00060f30 A0 : 0x800d3191 A1 : 0x3ffb2170
A2 : 0x3ffc2134 A3 : 0x00000000 A4 : 0x00000000 A5 : 0xffffffff
A6 : 0x3ffb21bc A7 : 0x3ffc2138 A8 : 0x00000500 A9 : 0xabba1234
A10 : 0x00000007 A11 : 0x3f400281 A12 : 0x000000ff A13 : 0x0000ff00
A14 : 0x00ff0000 A15 : 0xff000000 SAR : 0x00000004 EXCCAUSE: 0x0000001c
EXCVADDR: 0xabba124c LBEG : 0x40085369 LEND : 0x4008536d LCOUNT : 0x00000000


 

| | コメント (0)

« 2026年6月 | トップページ | 2026年8月 »