S-BASICとHu-BASICの中間コードを比較する
- BASIC内蔵マシン語モニタのコマンドも出力も同じだよな…。
- 全体のダンプを見てみても雰囲気が似てるな…。
- よく見ると予約語の並びもそっくりじゃないか…。
という具合になんだかよく似てるMZ-700用のBASIC、S-BASIC(1Z-007B)とHu-BASIC(1Z-008B)。ここでは中間コードに注目して、どんなふうに似てるのか調べてみます。参考用に、MZ-80K/C用のSP-5030とX1用のCZ-8BC01の中間コードも並べてみました。
ステートメントの大部分は1バイトの中間コードで表せます。命令数の多くなったHu-BASICではそれが拡張され、FEhおよびFFhに続く1バイトと合わせて2バイトで表すものもあります。SP-5030は黎明期のBASICを若干改良しただけのもので、機能的にもシンプルですから、1バイトの中間コードで収まっていますね。
なおこのデータは紅茶羊羹さんの「We Love MZ-700」にある、S-BASIC/HuBASICプログラムのMZTファイルをテキストファイルに変換できるユーティリティ「bas2txt」に含まれるソースと、Enri's Home PAGEの「mz-80K SP-5030(旧バージョン)」の内容を用いてまとめたものです。
★ステートメント(80h~FDh) |
|
S-BASIC |
Hu-BASIC |
SP-5030 |
CZ-8CB01 |
80 |
GOTO |
GOTO |
REM |
GOTO |
81 |
GOSUB |
GOSUB |
DATA |
GOSUB |
82 |
|
GO |
LIST |
GO |
83 |
RUN |
RUN |
RUN |
RUN |
84 |
RETURN |
RETURN |
NEW |
RETURN |
85 |
RESTORE |
RESTORE |
PRINT |
RESTORE |
86 |
RESUME |
RESUME |
LET |
RESUME |
87 |
LIST |
LIST |
FOR |
LIST |
88 |
|
LLIST |
IF |
LLIST |
89 |
DELETE |
DELETE |
GOTO |
DELETE |
8A |
RENUM |
RENUM |
READ |
RENUM |
8B |
AUTO |
AUTO |
GOSUB |
AUTO |
8C |
|
EDIT |
RETURN |
EDIT |
8D |
FOR |
FOR |
NEXT |
FOR |
8E |
NEXT |
NEXT |
STOP |
NEXT |
8F |
PRINT |
PRINT |
END |
PRINT |
90 |
|
LPRINT |
ON |
LPRINT |
91 |
INPUT |
INPUT |
LOAD |
INPUT |
92 |
|
LINPUT |
SAVE |
LINPUT |
93 |
IF |
IF |
VERIFY |
IF |
94 |
DATA |
DATA |
POKE |
DATA |
95 |
READ |
READ |
DIM |
READ |
96 |
DIM |
DIM |
DEF FN |
DIM |
97 |
REM |
REM |
INPUT |
REM |
98 |
END |
END |
RESTORE |
END |
99 |
STOP |
STOP |
CLR |
STOP |
9A |
CONT |
CONT |
MUSIC |
CONT |
9B |
CLS |
CLS |
TEMPO |
CLS |
9C |
|
CLEAR |
USR |
CLEAR |
9D |
ON |
ON |
WOPEN |
ON |
9E |
LET |
LET |
ROPEN |
LET |
9F |
NEW |
NEW |
CLOSE |
NEW |
A0 |
POKE |
POKE |
BYE |
POKE |
A1 |
OFF |
OFF |
LIMIT |
OFF |
A2 |
MODE |
WHILE |
CONT |
WHILE |
A3 |
SKIP |
WEND |
SET |
WEND |
A4 |
PLOT |
REPEAT |
RESET |
REPEAT |
A5 |
LINE |
UNTIL |
GET |
UNTIL |
A6 |
RLINE |
|
INP# |
|
A7 |
MOVE |
|
OUT# |
|
A8 |
RMOVE |
TRACE |
|
|
A9 |
TRON |
TRON |
|
TRON |
AA |
TROFF |
TROFF |
|
TROFF |
AB |
INP# |
SPEED |
|
|
AC |
|
|
|
|
AD |
GET |
|
THEN |
|
AE |
PCOLOR |
DEFINT |
TO |
DEFINT |
AF |
PHOME |
DEFSNG |
STEP |
DEFSNG |
B0 |
HSET |
DEFDBL |
>< |
DEFDBL |
B1 |
GPRINT |
DEFSTR |
<> |
DEFSTR |
B2 |
KEY |
DEF |
=< |
DEF |
B3 |
AXIS |
|
<= |
|
B4 |
LOAD |
LOAD |
=> |
LOAD |
B5 |
SAVE |
SAVE |
>= |
SAVE |
B6 |
MERGE |
MERGE |
= |
MERGE |
B7 |
|
CHAIN |
> |
CHAIN |
B8 |
CONSOLE |
CONSOLE |
< |
CONSOLE |
B9 |
|
|
AND |
WIDTH |
BA |
OUT# |
OUT |
OR |
OUT |
BB |
CIRCLE |
SEARCH |
NOT |
SEARCH |
BC |
TEST |
WAIT |
+ |
WAIT |
BD |
PAGE |
PAUSE |
- |
PAUSE |
BE |
|
WRITE |
* |
WRITE |
BF |
|
SWAP |
/ |
SWAP |
|
|
|
S-BASIC |
Hu-BASIC |
SP-5030 |
CZ-8CB01 |
C0 |
ERASE |
ERASE |
LEFT$ |
ERASE |
C1 |
ERROR |
ERROR |
RIGHT$ |
ERROR |
C2 |
|
ELSE |
MID$ |
ELSE |
C3 |
USR |
CALL |
LEN |
CALL |
C4 |
BYE |
MON |
CHR$ |
MON |
C5 |
|
LOCATE |
STR$ |
LOCATE |
C6 |
|
MODE |
ASC |
SCREEN |
C7 |
DEF |
KEY |
VAL |
KEY |
C8 |
|
PUSH |
PEEK |
|
C9 |
|
POP |
TAB |
|
CA |
|
LABEL |
SPC |
LABEL |
CB |
|
RANDOMIZE |
SIZE |
RANDOMIZE |
CC |
|
OPTION |
|
OPTION |
CD |
|
LINE |
|
LINE |
CE |
WOPEN |
OPEN |
|
OPEN |
CF |
CLOSE |
CLOSE |
↑ |
CLOSE |
D0 |
ROPEN |
|
RND |
SIZE |
D1 |
|
FIELD |
SIN |
FIELD |
D2 |
|
GET |
COS |
GET |
D3 |
|
PUT |
TAN |
PUT |
D4 |
|
SET |
ATN |
SET |
D5 |
|
FILES |
EXP |
FILES |
D6 |
|
LFILES |
INT |
LFILES |
D7 |
|
DEVICE |
LOG |
DEVICE |
D8 |
|
NAME |
LN |
NAME |
D9 |
KILL |
KILL |
ABS |
KILL |
DA |
|
LSET |
SGN |
LSET |
DB |
|
RSET |
SQR |
RSET |
DC |
|
INIT |
|
INIT |
DD |
|
VDIM |
|
VDIM |
DE |
|
MAXFILES |
|
MAXFILES |
DF |
|
|
|
|
E0 |
TO |
TO |
|
TO |
E1 |
STEP |
STEP |
|
STEP |
E2 |
THEN |
THEN |
|
THEN |
E3 |
USING |
USING |
|
USING |
E4 |
π |
SUB |
|
SUB |
E5 |
|
BASE |
|
BASE |
E6 |
TAB |
TAB |
|
TAB |
E7 |
SPC |
SPC |
|
SPC |
E8 |
|
EQV |
|
EQV |
E9 |
|
IMP |
|
IMP |
EA |
|
XOR |
|
XOR |
EB |
OR |
OR |
|
OR |
EC |
AND |
AND |
|
AND |
ED |
|
NOT |
|
NOT |
EE |
>< |
>< |
|
>< |
EF |
<> |
<> |
|
<> |
F0 |
=< |
=< |
|
=< |
F1 |
<= |
<= |
|
<= |
F2 |
=> |
=> |
CURSOR |
=> |
F3 |
>= |
>= |
|
>= |
F4 |
= |
= |
|
= |
F5 |
> |
> |
|
> |
F6 |
< |
< |
|
< |
F7 |
+ |
+ |
|
+ |
F8 |
- |
- |
|
- |
F9 |
|
MOD |
|
MOD |
FA |
|
\ |
|
\ |
FB |
/ |
/ |
|
/ |
FC |
* |
* |
|
* |
FD |
^ |
^ |
|
^ |
|
|
|
|
★ステートメント(FEh+80h~FEh+AEh) |
|
★関数(FFh+80h~FFh+CFh) |
|
S-BASIC |
Hu-BASIC |
CZ-8CB01 |
80 |
|
|
WINDOW |
81 |
SET |
PSET |
PSET |
82 |
RESET |
PRESET |
PRESET |
83 |
COLOR |
COLOR |
COLOR |
84 |
|
|
CIRCLE |
85 |
|
|
POLY |
86 |
|
|
PAINT |
87 |
|
|
|
88 |
|
|
POSITION |
89 |
|
|
PATTERN |
8A |
|
|
HCOPY |
8B |
|
PLAY |
PLAY |
8C |
|
|
SOUND |
8D |
|
BEEP |
BEEP |
8E |
|
|
PRW |
8F |
|
|
PALET |
90 |
|
|
LAYER |
91 |
|
|
CANVAS |
92 |
|
|
CREV |
93 |
|
|
CFLASH |
94 |
|
CGEN |
CGEN |
95 |
|
PCOLOR |
CSIZE |
96 |
|
SKIP |
EJECT |
97 |
|
RLINE |
CSTOP |
98 |
|
MOVE |
FAST |
99 |
|
RMOVE |
REW |
9A |
|
PHOME |
APSS |
9B |
|
HSET |
TVPW |
9C |
|
GPRINT |
CHANNEL |
9D |
|
AXIS |
VOL |
9E |
|
CIRCLE |
CRT |
9F |
|
TEST |
SCROLL |
A0 |
|
PLOT |
EFFECT |
A1 |
|
PAGE |
GRAPH |
A2 |
MUSIC |
MUSIC |
MUSIC |
A3 |
TEMPO |
TEMPO |
TEMPO |
A4 |
CURSOR |
CURSOR |
CURSOR |
A5 |
VERIFY |
VERIFY |
VERIFY |
A6 |
CLR |
CLR |
CLR |
A7 |
LIMIT |
LIMIT |
LIMIT |
A8 |
|
KLIST |
KLIST |
A9 |
|
|
ASK |
AA |
|
|
KBUF |
AB |
|
CLICK |
CLICK |
AC |
|
BOOT |
BOOT |
AD |
|
DEVI$ |
DEVI$ |
AE |
BOOT |
DEVO$ |
DEVO$ |
|
|
|
S-BASIC |
Hu-BASIC |
CZ-8CB01 |
80 |
INT |
INT |
INT |
81 |
ABS |
ABS |
ABS |
82 |
SIN |
SIN |
SIN |
83 |
COS |
COS |
COS |
84 |
TAN |
TAN |
TAN |
85 |
LN |
LOG |
LOG |
86 |
EXP |
EXP |
EXP |
87 |
SQR |
SQR |
SQR |
88 |
RND |
RND |
RND |
89 |
PEEK |
PEEK |
PEEK |
8A |
ATN |
ATN |
ATN |
8B |
SGN |
SGN |
SGN |
8C |
LOG |
FRAC |
FRAC |
8D |
|
FIX |
FIX |
8E |
PAI |
PAI |
PAI |
8F |
RAD |
RAD |
RAD |
90 |
|
INP |
INP |
91 |
|
CDBL |
CDBL |
92 |
|
CSNG |
CSNG |
93 |
|
CINT |
CINT |
94 |
|
DSKF |
DSKF |
95 |
EOF |
EOF |
EOF |
96 |
|
FPOS |
FPOS |
97 |
|
LOC |
LOC |
98 |
|
LOF |
LOF |
99 |
|
POS |
POS |
9A |
|
FAC |
FAC |
9B |
|
SUM |
SUM |
9C |
|
FRE |
FRE |
9D |
|
|
LPOS |
9E |
JOY |
JOY |
STICK |
9F |
|
|
STRIG |
A0 |
CHR$ |
CHR$ |
CHR$ |
A1 |
STR$ |
STR$ |
STR$ |
A2 |
HEX$ |
HEX$ |
HEX$ |
A3 |
|
OCT$ |
OCT$ |
A4 |
|
BIN$ |
BIN$ |
A5 |
|
MKI$ |
MKI$ |
A6 |
|
MKS$ |
MKS$ |
A7 |
|
MKD$ |
MKD$ |
A8 |
|
SPACE$ |
SPACE$ |
A9 |
|
|
CGPAT$ |
AA |
|
|
KANJI$ |
AB |
ASC |
ASC |
ASC |
AC |
LEN |
LEN |
LEN |
AD |
VAL |
VAL |
VAL |
AE |
|
CVS |
CVS |
AF |
|
CVD |
CVD |
B0 |
|
CVI |
CVI |
B1 |
|
|
|
B2 |
|
|
|
B3 |
ERN |
ERR |
ERR |
B4 |
ERL |
ERL |
ERL |
B5 |
SIZE |
CSRLIN |
CSRLIN |
B6 |
|
STRPTR |
STRPTR |
B7 |
|
DTL |
DTL |
B8 |
|
|
|
B9 |
|
|
|
BA |
LEFT$ |
LEFT$ |
LEFT$ |
BB |
RIGHT$ |
RIGHT$ |
RIGHT$ |
BC |
MID$ |
MID$ |
MID$ |
BD |
|
INKEY$ |
INKEY$ |
BE |
|
INSTR |
INSTR |
BF |
|
HEXCHR$ |
HEXCHR$ |
C0 |
|
MEM$ |
MEM$ |
C1 |
|
SCRN$ |
SCRN$ |
C2 |
|
VARPTR |
VARPTR |
C3 |
STRING$ |
STRING$ |
STRING$ |
C4 |
TI$ |
TIME$ |
TIME$ |
C5 |
|
|
DAY$ |
C6 |
|
|
DATE$ |
C7 |
FN |
FN |
FN |
C8 |
|
USR |
USR |
C9 |
|
|
|
CA |
|
|
|
CB |
|
ATTR$ |
ATTR$ |
CC |
|
|
POINT |
CD |
|
CHARACTER$ |
CHARACTER$ |
CE |
|
|
CMT |
CF |
|
|
MIRROR |
|
|
|
|
★凡例 |
|
S-BASICまたはHu-BASICにしかない |
|
予約語は違うが機能は同じ |
|
同じ予約語はあるが違う中間コードに割り付けられている |
|
なんと言っても興味深いのは、S-BASICが互換対象としているはずのSP-5030とは似ても似つかない並びなのに対して、むしろHu-BASICとほとんど同じというところですね。S-BASICにはSP-5030用のプログラムをコンバートしてまで受け入れるほど互換性を気にしているのに中間コードがまるで違い、逆に中間コードがそっくりなSとHuは互いのBASICテキストファイルを読めなかったり利用できないという…。
中間コードの予約語の並び具合などを見ただけで判断するのは早計だとは思いますけど、見た感じ
CZ-8CB01→Hu-BASIC→S-BASIC
という順番で開発されたんじゃないかと思えてきます。さらに深く妄想すれば、そもそもS-BASICの開発が前提にあったから、X1のBASICを開発しようとした時にMZ系の命令も使えるようにしようと考えた…とかいう可能性だってゼロじゃない、なんて気もするんですよね。
プロッタ関連の命令が同じ機能なのにコードが違うのはちょっと気になります。ここまで同じならそっちも揃えればいいのに? あくまで追加分だから入れられるところに前から詰めていっただけ?
この部分だけは担当した人が別で示し合わせもしなかったから? 結局謎は謎のままですか…。
所蔵品一覧に戻る