2026年7月22日 (水)
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()関数が使えるようになった
- いくつかのバグを修正
- 万年カレンダーが実行できた。
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が使えるようになった
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)が使えるようになった
取り合えず、万年カレンダーが作れるだけの機能の実装を優先しようと思う。
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が使えるようになった
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個同時に使用できるのは検証済
もう業者に出そうかと思いましたが…参考見積価格 8万円…いや無理 (;´Д`)
で、コレは試作1号と言うことで、このまま使えそうな雰囲気ですが歪みが気になるのでボツですね。
2号機を最初から設計し直し、今度はボディー底面を基準面にして制作してます (;^ω^)
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が使えるようになった
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(配列の削除)が出来るようになった
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.
ここまでの成果
- 文字列が使えるようになった
- 配列演算のバグ修正
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が使えるようになった。



