MZ-80K2

Tweet

 MZ-80K2は所有していませんし、していたとしてもMZ-80Cなどを語っていれば特筆することもあまりありませんが…強いて言えば

カラーリングが変わりましたね?
キートップの形状も変わりましたね? もしかしてキー自体も変わりました?
標準装備されるRAMが32KBにアップしましたね?
K系としては初の完成品、価格変わらずということを考えると実質値下げ…?

ぐらいですか。特にキーボードを見ているとMZ-80K2というのは輸出版のMZ-80Kを国内向けに仕立て直したもの…という気がしなくもないんですが、それはまぁ現時点では情況証拠レベルの話でしかなく。

 さて、MZ-80K2に引っかけて披露するのは添付されるBASICの話です。MZ-80Kの第一ロットに添付されたと推測されるSP-5001から始まって、SP-5002→SP-5010→SP-5020→SP-5030とバージョンアップしていったわけですが、どのバージョンがどのモデルに添付されたかわかりますか?

 …いやクイズというより情報提供のお願いに近い意味合いもありますが。今のところ、こういう変遷を辿ったのだろうと推測しています。

  SP-5001 SP-5002 SP-5010 SP-5020 SP-5030
MZ-80K  
MZ-80C      
MZ-80K2        
MZ-80K2E        
MZ-1200        

 SP-5030が添付されたMZ-80DUの発売がMZ-80K2の直前なのでおそらく80K2もSP-5030、MZ-80K2はMZ-80Kと交代で登場したので80KにSP-5030が添付されたことはないはず、MZ-80Cの前期マニュアルにはSP-5020が標準添付されているという記述があるのでおそらくSP-5010添付の時代はない…という推測なんですけどね。バージョンの切り替わりタイミングによっては一部に推測とは違うBASICが添付されたこともあるかもしれません。

 K/C系列ということではSP-5030がひとつの完成形ということになるのでしょうか。1980年にMZ-80K2が発売されて以来、MZ-700の登場までBASICが一新されるまで2年以上もの長きにわたりK/C系列の標準BASICであり続けることになったのです。

3つのSP-5030

 月刊I/O誌・1982年2月号のRANDOM BOXに、「MZ-80K用 SP-5030のNew Versionについて」という題のレポート投稿が掲載されました。1981年7月頃に購入したMZ-80K2添付のSP-5030に、パッチを当てるタイプのBASIC強化ユーティリティを適用させてみたところ暴走するので、調べてみるとどうやら新しいバージョンだった、という内容です。

 変更されていたのはほとんどがテープのLOADに関わる箇所で、SP-1002のテープリードルーチンと同じものがBASICの未使用領域に置かれていて、LOADに関してはSP-1002の代わりにそこが呼ばれるようになっているのです。

 テープのLOADがRAM化されているというのはMZ-1200に添付されるSP-5030 V1.0Aと呼ばれるバージョンの特徴として一部で有名でした(エミュレータの高速LOAD対応が無効になってしまうので)。しかしどうやらもっと前からこの変更が存在したということになるみたいなのですよ。

 調べてみたら幸いなことに新旧両方のバージョンのSP-5030が手元にありましたので、V1.0A版と併せて比較してみましょう。

テープ

  旧版 新版 V1.0A版

 便宜上、リリース順に旧版、新版(記事でいうところのNew Version)、V1.0A版…と呼び分けることにしましょう。

 V1.0A版はその後に続くラベルデザインの第一号なので一目瞭然として、問題は旧版と新版の違いです。写真ではわかりにくいですが、旧版はカセットハーフが透明(というかトランスルーセント)なのに対して新版は単に黒いプラスチックでできています。

 またV1.0A版はMZ-2000のMZ-1Z001などでバージョン表記があったのと同じく、裏面に「SP-5030」「V1.0A」と刻印がありますが(表にないから書かないとわかりませんよね)、旧版・新版はともに真っ黒の裏面ですからバージョン表記は見当たりませんね。

 MZシリーズ用のカセットテープは当初から透明のカセットハーフなのですが、どこかの時代で透明ではなくなります。SP-5030にこういう違いがあるのですから、遅くとも1981年前半には切り替わったということではないかと思います。

起動画面

 旧版の起動メッセージ。SP-5020以前からのものと同じですね。

 というか、今にして思えばこのシンプルすぎるくらいのメッセージはワンボードマイコンでBASICインタプリタを動かしたみたいな雰囲気がありますね。良く言えばCP/MでマイクロソフトBASICを動かしたのと似た「お客様」感。「クリーンコンピュータ」ならではなどと言えば納得しそうにもなりますが、むしろこれは「フルキーボードとTV出力を付けた自作のワンボードマイコンに、紙テープからコンバートした12K BASICをロードした」みたいな? いや私はさすがに経験していませんが。

 新版の起動メッセージ。同じかと思いきや…LOADINGメッセージ(ファイル名)が「BASIC SP-5030」からシンプルな「SP-5030」に変更されています。

 そしてV1.0A版の起動メッセージ。ファイル名が「SP-5030」に変更されたのはこのバージョンからだと思い込んでましたよ…。

 そしてMZ-80Bばりの派手なタイトル。正確にはMZ-80AのSA-5510からの影響なんじゃないかと思うのですが。

差分

 フリーエリアに違いがないのでちょっと意外なのですが、BASIC自体のサイズが異なります。イメージ化したファイルのサイズを見てみると、

となっているのです。なお本体サイズはヘッダの128バイトを引けば求められます。

 8ビットマシンの1バイトは血の一滴…改版で増えたプログラムは余裕分を食い潰して収められていると考えられますから、もうちょっとフリーエリアを増やせたんじゃないの? …と思ってしまいます…。

 では簡単にですがダンプリストにて各バージョンの差異をチェックしていきます。使用したのはWinMergeという定番ツールです。本来テキストファイルの差分をマークして必要であれば内容を統合できるというツールですが、バイナリ比較モードがあって、バイト単位で差異が判るようになっています。

 WinMergeでは3つ以上のファイルを同時比較することが可能なのですが、隣同士の比較にとどまり(バージョンの差分を見るためのツールという性格ゆえか)、3つともそれぞれに違うなどというところまでは残念ながら色分けされません。という注意事項を踏まえたうえで…。

 まずは先頭のあたり。

旧版 新版 V1.0A版

 上の方、新版とV1.0A版にだけ色が付いていて旧版には色がないというのは、旧版=新版≠V1.0A版という意味です。以下同様に。

 V1.0A版が違うというのは、起動時の派手なオープニング画面を出力するサブルーチンに飛ばした後の処理が少し違っているからですね。少し下には新版までの起動メッセージがデータとして置かれているのですが、V1.0A版でも色が付いていないということは、実は元のメッセージがずっと残っていたということなんですね。ソースレベルの改造ではなかった(=パッチ当てレベルの改造だった)という可能性がありそうですね。

 次は真ん中あたり。

旧版 新版 V1.0A版

 ここはLOAD命令の処理を行う部分と思われます。モニタ(SP-1002)の0027番地(RDINF)と002A番地(RDDAT)を呼び出す代わりに4049番地と4069番地を呼び出しています。旧版と新版に色が付いているということは、新版になって変更され、V1.0A版は変更されたままになっているというわけですね。

 そして最後の部分。

旧版 新版 V1.0A版

 旧版と新版の色が変わり始めた所が、4049番地に相当します。つまり新版にてテープリードルーチンが置かれた場所は、旧版の一部を含んでいるというわけです。えー、だったら旧版には何にも使われないゴミデータが含まれていたということですか? この部分を不要にする変更とかありませんしね…。

 一方、V1.0A版で追加されている部分はオープニング画面のサブルーチンです。表示するメッセージも見えますね。

 新版→V1.0A版の変更はここに挙げたものの他にもちょこちょこあるんですが、おそらくバグパッチかテスト時に書き込まれたワークだろうと思われます。そんなわけで、バグパッチを除けばテープリードルーチンに関するものが最大級の変更点ということになるのでしょう。

 もしや、テープリードルーチンがRAM化されているのならウェイト係数を書き換えれば2000bpsのテープを読めたりして? などと期待して解析してみたところ、

というバグの修正が目的であることがわかりました。単なるRAM化じゃなかったのか…。

 モーターオンしてからのウェイトは、もしかするとPLAYボタンを押した時のノイズが音声系に混入して不意に読み取られるようなトラブルがあったのかもしれません。"1"の確認漏れが何か影響するならモニタのLOADコマンドも不安定になるはずで、こちらは偶然リカバーできているのを仕様通りに修正しただけなのかもしれません。いやもしかしたら、こちらの原因でも不安定になっちゃう個体が存在したんでしょうか? BASICでのみの修正ですから、プログラムのLOADというよりシーケンシャルデータのリードの方に対応したかった可能性もありますね。

 この修正でSP-1002のテープリードルーチンのうちかなりの部分をこちらにコピーしているんですが、それでいて1バイトリードやウェイトなど肝心なサブルーチンはROMのものを使っているので、ウェイト係数を書き換えたりなどして2000bpsに対応させることなどできないことも判明しました。

まとめ

 雑誌などでの開発者インタビューでは、「クリーンコンピュータ」はバグ対策の産物だったという回想が語られています。まさにこのSP-5030までのバージョンアップ、そして新版・V1.0A版でのバグパッチはその特性を最大限に活かしたものだったと言えますね…と言いたいところなのですが、「ハイスピードBASIC」として別売されたものはともかく、このSP-5030のみに見られる改版は特にアナウンスされず知る人ぞ知る存在で、クリーンコンピュータの恩恵とは縁のないものとなりました。バグがそれほど深刻なものではなかったからなのでしょうか。

 しかし新版などというバージョンがあったということは、さっきもちょっと触れたエミュレータ(MZ700WIN)でハマった人がいたんじゃないかと思うのですが、どうだったんでしょうね? MZ700WINではモニタまたはBASICにフックしてロードを短縮する機構があったのですが、当時の認識としてV1.0A版はモニタでのフックが効かないことが知られていて、BASICへフックするよう小細工するMZTフォーマット用ヘッダデータが用意されていたのです。逆に言えばMZ-1200に添付されていないSP-5030なら専用ヘッダデータがなくても短縮ロードが使えることになっていました。

 ですが上で見たように新版にて既にロードに関してROMを使わなくなっていたのですから、専用ヘッダデータにすげ替える必要があったわけです。そんなことも露知らず、当時「普通にイメージ化したら使えるはずですよ〜」などとアドバイスしていたかもしれないわけで…あるいは対処法が見つからず、SP-5030は起動するもののロードできなくて途方に暮れた人もいたのでしょうか…。だとしたらお役に立てず申し訳ない…。

CURSOR文の謎 

 ある日おンおン(@UVA4lmbucQ5DJud)さんがご自身の所有するBASICプログラムが入ったテープからイメージ化作業をされていた際、不思議な現象に遭遇して次のようなつぶやきをポストされました。

教えてSP-5030に詳しい方!
SP-5030から実装されたCURSOR命令、Enriさんのページ(https://t.co/mzyTKqoWoA)では「*0A8H(0F2H)はコードは0A8Hとして実行、プログラムは0F2Hとして書き込む」ですが、0xA8と0xF2が混在するテープデータがあります。書込時に0xA8となる条件ってあります? pic.twitter.com/esOE4ou7nE

— おンおン (@UVA4lmbucQ5DJud) July 20, 2025

 ええ〜っとちょっと待ってください。1行の中に2つあるCURSOR命令はそれぞれ中間コードが違ってて、でもリストはちゃんと表示されている…何が起こってるんですか??

 手元で確認してみても、入力直後は0xF2としてメモリに格納されているのですが、モニタなどから0xA8に書き換えてもリスト表示自体には変化がなく、それどころか実行しても正しく動作します。完全に中間コードが二つ存在しています。

 0xF2と0xA8のどちらが本来あるべき中間コードなのか? は先にCURSOR命令が実装されたSP-6010と比較するとよくわかります。「S-BASICとHu-BASICの中間コードを比較する」にてSP-5030の中間コードを比較として掲載しましたが、改めてSP-6010と相違部分をピックアップして比べてみましょう。

    SP-5030 SP-6010   SP-5030 SP-6010   SP-5030 SP-6010
  A0 BYE BYE   E0 ERROR F0   RESUME
  A1 LIMIT LIMIT   E1 EOF( F1   XOPEN
  A2 CONT CONT   E2 F2 CURSOR CURSOR
  A3 SET SET   E3 F3  
  A4 RESET RESET   E4 F4  
  A5 GET GET   E5 F5  
  A6 INP# INP#   E6 F6  
  A7 OUT# OUT#   E7 F7  
  A8 (CURSOR)     E8 DIR F8  
  A9       E9 DELETE F9  
  AA       EA SWAP FA  
  AB       EB KILL FB  
  AC       EC RENAME FC  
  AD THEN THEN   ED LOCK FD  
  AE TO TO   EE CHAIN      
  AF STEP STEP   EF UNLOCK      

 SP-6010を見てみると、CURSOR命令はディスク関連の予約語の続きに配置されています。SP-5030より前にSP-6010が作られていますので(SP-6010にはSP-5020が含まれている)、互換性を考えれば0xF2の方が正しいことになります。

 んんん? どゆこと? 0xA8でも正常動作させる理由がわかりません。リスト中のCURSOR命令を0xA8で入力するためにはメモリエディタ的なやつで編集するしかなく、なんならそれを含む行をBASICで編集すると0xF2に書き換えられてしまいます。普通に入力する手段がないわけです。

 そしておンおンさんによれば、なんと全てのCURSOR命令の中間コードが0xA8であるというプログラムも発見されているとのこと。プログラム自体はベーマガ掲載作品なのでほぼ間違いなく一般ユーザーが入力したものだと考えられ…上記の1行中に混在しているのは原理的にもメモリ編集したものである可能性が高いですが、まさか全部書き換えるってのは暇人にも程があるというもので…。

 とは言え、SP-5030で両方に対応しているということは、それが公式であり、それ以前に「何か」があったということなんですよ。その何かとは、だいたいこういうことだったんじゃないかと思います。

  1. SP-6010の開発で、要望の多かった表示位置の絶対指定機能を盛り込むことになり、CURSOR命令が新設された。ディスク関連の命令の追加と同時に行われたので、CURSOR命令はディスク関連命令の続きのコード(0xF2)として定義されることになった。
  2. その後テープBASICにもCURSOR命令を追加することになり、細かい修正も含めて新しくSP-5030として開発された。この時コードテーブルの空き(0xA8)にCURSOR命令を配置した。
  3. SP-6010とSP-5030でCURSOR命令に互換性がないことが発覚。しかしそれはSP-5030の最初の出荷の後の出来事であった。
  4. 急遽SP-5030を改造し、CURSOR命令については0xA8と0xF2の両方の中間コードを許容するようにした。

要は既に市場に出てしまったのでそのフォローが必要だった…ぐらいの動機がないとこんなことにはならないだろうということですね。購入者を特定して交換とかできればいいんでしょうがおそらく既に困難で、やむなく改版で対応して現在に至る…という推測です。

 だからどこかに0xA8しか受け付けないSP-5030が存在する可能性があるのです。上記の旧版はどちらの中間コードでも動作しましたから、旧版の前にもうひとつあることになります。

 さらにいろんな可能性を考えてみると、例えばSP-5020にシャープからCURSOR命令を追加するパッチが出ていて、その中間コードが0xA8だった…という推測もできるのですけど、中間コードテーブルの真ん中にCURSOR命令を割り込ませるパッチはかなりしんどそうだし、まぁないかな…。

 I/Oプラザ(記事下の余白にある読者投稿欄)なんかに「自作プログラムを友人宅のMZにロードしたらリストがおかしくなった、自分のも友人のもSP-5030なのになんでだろう」みたいなのが載ってても良さそうなんですが、見つからないですかね…?

展示品一覧に戻る