S-BASICとHu-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系の命令も使えるようにしようと考えた…とかいう可能性だってゼロじゃない、なんて気もするんですよね。

 プロッタ関連の命令が同じ機能なのにコードが違うのはちょっと気になります。ここまで同じならそっちも揃えればいいのに? あくまで追加分だから入れられるところに前から詰めていっただけ? この部分だけは担当した人が別で示し合わせもしなかったから? 結局謎は謎のままですか…。

所蔵品一覧に戻る