N系BASICの中間言語仕様


N系BASICの中間言語仕様の説明です (2022/11/28 新規作成)。

N系BASIC / フォーマット / キャラクターコード / コード / 予約語 / 文字列 / グラフィックキャラクター / 漢字 / 戻る / トップページ


N系BASICの種類

ここではNECのN-BASICから派生した各種BASICの中間言語の仕様をまとめています。
 
まずN系BASICの種類を把握しましょう。 N系BASICは非常に多くの種類がありますが、搭載シリーズごとに違う種類があって それぞれで進化していると捉えると分かりやすいと思います。
 
なお、文法・予約語的には上位互換が保たれていても、 中間言語の予約語テーブルが刷新されていることがあります (ファイルをそのままでは持って来れず、アスキーセーブなら移植可能)。
 
別売のBASIC以外はそれぞれROM-BASICとDISK-BASICがありますが、 基本的な仕様は同じなので(ディスクを扱う命令は通常増えていますが)、 ここでは原則DISK-BASICで解説します。
PC-8000シリーズ
 
N-BASIC→N80-BASIC→N80SR-BASICの順に進化しています。
 
N-BASIC
  • PC-8001で実装されたN系BASICの大本になったBASIC
N80-BASIC
  • PC-8001mkII専用
  • N-BASICのほぼ上位互換
    • 高解像度グラフィック機能(CMD SCREEN, CMD COLORなど)などのいくつかの拡張命令が付与された
    • MOUNT/REMOVEは自動化されたので使わなくなった
N80-漢字BASIC (情報不足)
  • PC-8001mkII/mkIISRに別売漢字ROM(PC-8001mkII-01)を搭載させて漢字を扱えるようにしたBASIC
  • N80-BASICがベースになっているが、詳細は不明
  • 文字列に漢字が使えたが、グラフィック画面に描画するため12行表示になるらしい
N80SR-BASIC
  • PC-8001mkIISR専用
  • N80-BASICのほぼ上位互換
    • グラフィック機能、サウンド機能を中心に強化された
N80SR-拡張BASIC (情報不足)
  • PC-8001mkIISR専用で本体付属のテープ版
  • N80SR-BASICのROM-BASIC版に、COPY/PAINT/ROLL命令が追加
    • N80SR-BASICのDISK-BASIC版のサブセットでもある
N-BASIC(86) (情報不足)
  • PC-9801(16bitの8086系)向けに移植されたN-BASIC
    • MOUNT/REMOVEは自動化されたので使わなくなった
  • ROM-BASICは初代PC-9801専用でかつ別売ROM(PC-9807)が必要、 DISK-BASICは全機種で使える
PC-6000シリーズ/PC-6600シリーズ
 
N60-BASIC→N60-拡張BASIC→N60m-BASIC→N66-BASIC→N66SR-BASICの順に進化していますが、N66SR-BASICで中間言語の予約語テーブルが刷新されています。
 
他機種のBASICに比べてコンパクトに作られています。 ELSEや'で始まるコメントがなく、 予約語が少ないため全て1byteで表現されます。 変数や定数に整数・倍精度がなく、全て単精度で表現されます。
 
N60-BASIC
  • PC-6001向けに実装されたBASIC
  • 通常はRAM16KBモード、 別売RAM&ROMカートリッジ(PC-6006)を接続するとRAM32KBモードも利用可能に
N60-拡張BASIC (N60 EXTENDED BASIC)
  • N60-BASICの拡張版
    • 初代PC-6001は別売カートリッジ(PCS-6001R)を接続して利用可能に、以降の機種では標準搭載
    • ディスクドライブ機能、グラフィック強化(CIRCLE/GET/PUT命令)、タッチパネル機能などが追加
  • N60-BASIC同様にRAM16KBモードとRAM32KBモードがある
N60m-BASIC
  • PC-6001mkII専用
  • N60-拡張BASICのほぼ上位互換
    • TALK/KANJI/MON/DELETE命令の追加
  • N60-BASIC/N60-拡張BASICのようなRAMの違いモードはない(常に64K)
N66-BASIC
  • PC-6601用で、PC-6001mkIISRでも利用可能
  • N60m-BASICの上位互換
    • 中間言語はN60m-BASICとまるきり同じ
    • 機能的な違いはTALK命令で歌えるようになったのみ
N66SR-BASIC
  • PC-6601SR用で、PC-6001mkIISRでも利用可能
  • N66-BASICの後継
    • アスキーセーブ形式としてはN66-BASICのほぼ上位互換
    • 予約語テーブルはN88-BASICとほぼ同じに変更されたので、 N66以前のBASICとの中間言語の互換性は失われた
    • 'コメントに対応し、ELSEも使えるようになった
PC-8800シリーズ
 
N88-BASIC (V1)→N88-BASIC (V2)→N88-日本語BASIC V3の順に進化していますが、N88-日本語BASIC V3で中間言語の仕様が刷新されています。
 
文字列に漢字を入れられるようになったものの、 その実現方法が過渡的で N88-漢字BASIC/N88-日本語BASIC/8801漢字BASIC/新8801漢字BASICと 相互互換性のないバリエーションがV1〜V2の拡張版として乱立してます。
 
N88-BASIC (V1/V2)
  • PC-8801向けに実装されたBASIC
  • PC-8801mkIISR/mkIITRからV2
    • グラフィック・サウンド強化
N88-漢字BASIC
  • N88-BASIC(V1だけのはず)で漢字文字列を扱えるようにした拡張版
    • &HFAでKANJI IN、&HFDでKANJI OUTするJISコードで漢字文字列を表現
  • 初代PC-8801は別売漢字ROMボード(PC-8801-01)が必要(mkII以降は漢字ROM標準搭載)
8801漢字BASIC (参考情報)
  • システムソフトから発売された、N88-BASICの漢字対応拡張版
    • &H7FでKANJI IN/OUTするEUCコードで漢字文字列を表現
    • 半角ひらがなや1/4角文字が漢字文字列の一部として利用可能
新8801漢字BASIC (参考情報)
  • システムソフトから発売された、N88-BASICの漢字対応拡張版
    • &H7FでKANJI IN/OUTするEUCコードで漢字文字列を表現
  • 8801漢字BASICとの違いなど、詳細は不明
N88-日本語BASIC
  • PC-8801mkIIFR/MR以降用
  • N88-BASIC(V2だけのはず)で漢字文字列を扱えるようにした拡張版
    • Shift_JISコードで漢字文字列を表現
N88-日本語BASIC V3 (情報不足)
  • PC-88VAシリーズ専用
    • MS-DOS互換のOSであるPC-Engine(ゲーム機のPC Engineとは無関係)上で動作し、"BASIC"コマンドを入力するとインタープリタ環境に入れる
    • PC-EngineもBASICインタープリタも大部分がPC-88VAのROM上に入っているが、ディスクがないと起動できない
  • N88-日本語BASICの後継
    • 文法・予約語はN88-日本語BASICのほぼ上位互換だが、 中間言語は完全独自(Pコードと呼ばれてたそうです)
    • BASICインタプリタがロード時に自動変換するので N88-BASIC/N88-日本語BASICのファイルも使える
  • 他のN88系BASICとは違い、テキストとして漢字を描画できる
PC-9800シリーズ
 
N系BASICとしてはほぼN88-日本語BASIC(86)のみです。 MS-DOSなど他のOSに移植されたり、上位互換のフリーウェア言語が出た後、 QuickBASICなどの現代化されたBASICへと引き継がれていくことになります。
 
なお、従来の8bit機のN系BASICはMicrosoftとNECの共同開発でしたが、 16bit機ではNECの独自開発になっています。 Microsoftは16bit化を機に標準化されたBASICに変えたかったのに対して NECはN88-BASICの資産を活かせる互換性が欲しかったためのようです。
 
N88-BASIC(86) (情報不足)
  • PC-9801(16bitの8086系)向けに実装されたBASIC
    • (86)はCPUの8086系に由来
  • PC-9800シリーズの標準ROM-BASIC
    • DISK-BASIC版も一応ある模様(かな漢字変換ができないN88-日本語BASIC(86)相当)
N88-日本語BASIC(86)
  • PC-9801の標準的なDISK-BASIC
    • 文法・予約語的にはN88-BASICの流れを受け継いでいるが、 中間言語の予約語テーブルは刷新されている
    • &H1B,&H4BでKANJI IN、&H1B,0x48でKANJI OUTするJISコードで漢字文字列を表現
N88-日本語BASIC(86) (MS-DOS版)
  • N88-日本語BASIC(86)のMS-DOS移植版
    • 中間言語としては頭に&HFE、末尾に&H1Aがついている以外は N88-日本語BASIC(86)と原則同じ
    • 日本語の扱いがShift_JISに変更されている
    • OSの違いに関係するCHILD/SYSTEM/CHDIR/MKDIR/RMDIR命令等の追加や、DSKO$/DSKI$の廃止、PEN→MOUSEの変更
N88-日本語BASIC(86) (OS/2版) (情報不足)
  • N88-日本語BASIC(86)のOS/2移植版
  • 情報不足のため、詳細不明
N88-日本語BASIC(86) (Windows版) (情報不足)
  • N88-日本語BASIC(86)のWindows移植版
  • 情報不足のため、詳細不明
  • N88-BASIC(WN)が正式名称かも知れない
EPSON 日本語 Disk BASIC (参考情報)
  • EPSONから発売された、PC-286/386/486/586(PC-9801互換機)用BASIC
    • NEC製DISK-BASICは互換機を弾くエプソンチェック(EPSONプロテクト)がかかっているため
  • N88-BASICと互換性がある
N88-日本語BASIC(LT) (情報不足)
  • N88-日本語BASIC(86) (MS-DOS版)のPC-98LT/98HA専用移植版
  • 情報不足のため、詳細不明
その他
 
他に次のようなBASICもあるようです。
 
N20-BASIC (参考情報)
  • ハンドヘルドコンピュータ(ポケコンに近い)「PC-2001」用のBASIC
  • N-BASICに親和性が高い
N82-BASIC (参考情報)
  • ハンドヘルドコンピュータ「PC-8201」用のBASIC
  • N-BASICのほぼ上位互換
    • BLOAD, BSAVE, EDIT, SOUND命令が追加
    • AUTO, CONSOLE, SWAP, TRON, TROFF, LINE, MON命令が削除
N16-BASIC (参考情報)
  • オフィスコンピュータ(オフコン)「NEC システム20/15」用のBASIC
  • N-BASICとほぼ等しい
N100-BASIC (参考情報)
  • 「PC-100」用のBASIC
    • MS-DOS上で動作する
  • GW-BASICを基本にマウス入力などへの対応を図った
    • GW-BASICはMicrosoftが推していた16bit機用の標準化されたBASIC
    • N系BASICとは互換性が低い
(参考情報)と書かれたBASICについては、原則ここでは扱いません。 (情報不足)に関しては文字通り情報不足で 中間言語の詳しい仕様が分かっていないため、分かっている部分だけ書きます。
各機種の対応BASIC
N N80 N80SR N(86) N60
(16K/32K)
N60拡張
(16K/32K)
N60m N66 N66SR N88
(V1)
N88
(V2)
N88漢字 N88日本語 N88日本語
(V3)
N88(86) N88日本語(86) N88日本語(86)
MS-DOS版
備考
PC-8001
PC-8001mkII
PC-8001mkIISR
PC-6001 N60拡張は要別売カートリッジ
PC-6001mkII
PC-6601
PC-6601SR
PC-6001mkIISR
PC-8801 N88漢字は要別売漢字ROMボード
PC-8801mkII
PC-8801mkIISR
PC-8801mkIITR
PC-8801mkIIFR
PC-8801mkIIMR
NはV1Sモードで"NEW ON 1"命令
PC-8801FH
PC-8801MH
PC-8801FA
PC-8801FE
PC-8801MA/MA2
NはV1Sモードで[N][8][0]押下でリセット
PC-8801FE2
PC-8801MC
Nは[N][8][0]押下でリセット
PC-88VA/VA2/VA3 V3はPC-Engine上で動作
PC-98DO/DO+ NはV1Sモードで[N][8][0]押下でリセット
PC-9800シリーズ
◎=その機種の性能を活かせるメインBASIC ○=過去の資産を活用するための下位互換対応BASIC △=別売ハードウェアが必要なBASIC

基本フォーマット

プログラムテキスト格納先一覧
BASICのプログラムはRAMメモリ上のテキストエリアに格納されます。 下記のブロックが行数分だけ繰り返され、 リンクポインタの値が&H0000のブロックがプログラムの終端を示します。 基本的に各値はリトルエンディアン(下位から上位の順)で配置されます。
 
** ** ** ** ** ** ** ** ** ** ** ** ... 00
リンクポインタ
(2byte)
行番号
(2byte)
プログラムテキストの中間言語
(可変長)
EOL(行末)
(1byte)
 
リンクポインタは次の行のブロックの頭の絶対アドレスを示すため、 テキストエリアがどのアドレスに配置されているのかを気にする必要があります(右図)。 テキストエリアのアドレスは本体の種類や搭載されたRAMの容量、 画面数(PC-6000シリーズ/PC-6600シリーズの起動時のHow Many Pages?で指定した値)などで 変動します。
 
フロッピーディスクやカセットテープにファイルとして保存される時は、 このメモリ上のバイナリデータの並びが原則そのまま記録されます。
 
中間言語 (共通)
 
中間言語はプログラムテキストを頭から順番に 短縮されたコードで置き換えて格納したものです。
 
中間言語コードの&H00〜&H1Fは数値定数などの情報を、 &H20〜&H7Fは対応するキャラクターコードそのまま、 &H80〜&HFFは予約語を表します。 それぞれについて、次項以降で詳しく説明します。
    N-BASIC(32K RAM)の例:
    
8021 2B 80 0A 00 41 F1 1C E8 03 00
リンクポインタ
802B
行番号
10
CHR$(&H41)
A
F1⇒予約語
=
1C⇒整数
1000
00⇒EOL
 
802B 33 80 14 00 91 20 41 00
リンクポインタ
8033
行番号
20
91⇒予約語
PRINT
CHR$(&H20)
(スペース)
CHR$(&H41)
A
00⇒EOL
 
8033 00 00
リンクポインタ
0⇒終端
 
行番号の範囲 (共通)
 
行番号は1〜65529の範囲が通常入力可能な範囲です。 PC-8000シリーズ/PC-6000シリーズ/PC-6600シリーズの各言語では0も使えます。
 
変動するプログラムテキスト格納先 (N80SR-BASIC)
 
N80SR-BASICはプログラムテキスト格納先が変動します。 ROM-BASICの時は&H8000で固定、 DISK-BASICはPEEK(&HEAE6)*256+PEEK(&HEAE5)でその場所を取得できます。
 
リンクポインタではなく長さ (N88-日本語BASIC(86)、N88-日本語BASIC(86) (MS-DOS版))
 
N88-日本語BASIC(86)、N88-日本語BASIC(86) (MS-DOS版)では リンクポインタ方式は廃止され、 同じ場所に1行のデータが占めるbyte数(リンクポインタ自身の2byte含む)が 格納されるように変更されました。
    N88-日本語BASIC(86)の例:
    
???? 0C 00 0A 00 01 41 00 F1 1C E8 03 00
長さ
12byte
行番号
10
01⇒1個のスペース
(スペース)
CHR$(&H41)
A
変数の文字数-1(後述)
 
F1⇒予約語
=
1C⇒整数
1000
00⇒EOL
 
 
ファイル保存時のヘッダー・フッター (N88-日本語BASIC(86) (MS-DOS版))
 
N88-日本語BASIC(86) (MS-DOS版)でファイルに保存すると、 メモリ上のバイナリデータの並びの頭に&HFE(BOM?)、末尾に&H1A(EOF)が追加された データがファイルに保存されます。
 
ファイル末尾のダミーデータ (N-BASIC/N80-BASIC/N80SR-BASIC/N60-BASIC/N60-拡張BASIC/N60m-BASIC/N66-BASIC/N66SR-BASIC/N88-BASIC/N88-漢字BASIC/N88-日本語BASIC/N88-日本語BASIC)
 
BASICインタープリタのフロッピーディスクはFAT8でファイルを保存しますが、 FAT8は正確なファイルサイズデータを保持していません(セクタ単位まで)。 そのため、リンクポインタ値&H0000の末尾より後ろのメモリ上に 残っていた過去のプログラム等のデータがゴミとして入っていることがあります。 この特性を利用してマシン語コードをそこに意図的に格納している プログラムもあります。
 
またディスクイメージからBASICファイルを取り出すツールを使った時、 このような理由でどこまでが末尾か判断できず、 ツールがダミーデータを末尾に余計に入れてしまうこともあります。

中間言語中のキャラクターコード

中間言語で使われる
キャラクターコード
中間言語コードで使われるキャラクターコードは&H20〜&H7Fの範囲です(右図)。 ASCIIコードとは&H5Cが「¥」になっている点が違うので注意しましょう。
 
キャラクターコードとして使われない文字 (共通)
 
キャラクターコードのうち、演算子 は予約語テーブル上に配置されているため、通常使われません。
 
入力されたプログラムテキストは自動で大文字に変換されるため、 英語小文字も原則使われません (小文字をそのまま保持するDATA文は例外)。
 
また、&H00〜&H1Fの範囲の中間言語コードで数値が表現されるため、 数字文字も数の表現としては原則使われません (N60-BASIC/N60-拡張BASIC/N60m-BASIC/N66-BASICでは 数値を表現する中間言語コードがないため使います)。 変数名に数値を含む時には使われます。
 
変数名の文字数情報 (N88-日本語BASIC(86)、N88-日本語BASIC(86) (MS-DOS版))
 
プログラム中に現れる変数名もキャラクターコードそのままですが、 N88-日本語BASIC(86)、N88-日本語BASIC(86) (MS-DOS版)では 変数の頭文字の直後に残り文字数を示す1byteデータが入ります。
    N88-日本語BASIC(86)の例: 変数「DOUBLE」の中間言語
    
44 05 4F 55 42 4C 45
CHR$(&H44)
D
変数の文字数-1
(続く5文字は変数)
CHR$(&H4F)+CHR$(&H55)+CHR$(&H42)+CHR$(&H4C)+CHR$(&H45)
OUDLE

中間言語コード


中間言語コード
&H00〜&H1Fの中間言語コードは数値定数などの情報を表しています(右図)。
 
PC-6000シリーズ/PC-6600シリーズの中間言語コード (N60-BASIC/N60-拡張BASIC/N60m-BASIC/N66-BASIC)
 
PC-6000シリーズ/PC-6600シリーズのBASICでは&H00〜&H1Fの中間言語コードは 割り当てられておらず、定数や行番号等は全てキャラクターコードとして 保持されます。
 
N66SR-BASICだけは他と同様に中間言語コードが 割り当てられるようになりました。
 
飛び先アドレス (共通)
 
「飛び先アドレス」は GOTO命令などの後ろに現れた「飛び先行番号」が指す行のブロックの メモリ上のアドレスに実行時に動的に置き換えられたものです。 ファイルに保存する際には「飛び先行番号」に戻されるため、 メモリ中の中間言語でしか現れません。
 
行番号の直後のスペース (共通)
 
行番号の直後の1つめのスペースは中間言語には現れず、自動で挿入されます。
    N-BASICの例: 10 PRINT
    
0A 00 91
行番号
10
暗黙のスペース
(スペース)
91⇒予約語
PRINT
N-BASICの例: 10 PRINT
0A 00 20 20 91
行番号
10
暗黙のスペース
(スペース)
CHR$(&H20)
(スペース)
CHR$(&H20)
(スペース)
91⇒予約語
PRINT
 
N88-日本語BASIC(86)、N88-日本語BASIC(86) (MS-DOS版)では 自動で挿入されず、スペース1個以上を示す中間言語を消費します。
    N88-日本語BASIC(86)の例: 10 PRINT
    
0A 00 01 C0
行番号
10
01⇒1個のスペース
(スペース×1)
C0⇒予約語
PRINT
N88-日本語BASIC(86)の例: 10 PRINT
0A 00 03 C0
行番号
10
03⇒3個のスペース
(スペース×3)
C0⇒予約語
PRINT
 
浮動小数点数 (共通)
 
単精度型実数の値の範囲は-1.70141E+38~1.70141E+38、 倍精度型実数の値の範囲は-1.701411834604692D+38~1.701411834604692D+38ですが、 単精度は6桁、倍精度は16桁までで表示されます。 それ以上の情報量を持っていても、 単精度であれば7桁目が四捨五入されて6桁以下で表示されます。
 
単精度はE、倍精度はDを使った指数表現で表示されることもあります。 絶対値が大きすぎる時はE+06/D+16から指数表現に切り替わります。 絶対値が小さすぎる時は四捨五入後に整数×10^指数形式にして その指数がそれぞれ-8/-18以下なら指数表現に切り替わります。
    例: 123456→123456 (1.23456E+05相当)
    例: 1234567→1.23457E+06
    例: .0000001→.0000001 (1*10^-7)
    例: .00000001→1E-08 (1*10^-8)
    例: .01234567→.0123457 (123457*10^-7)
    例: .001234567→1.23457E-03 (123457*10^-8)
浮動小数点数 (N60-BASIC/N60-拡張BASIC/N60m-BASIC/N66-BASIC/N66SR-BASIC)
 
PC-6000シリーズ/PC-6600シリーズのBASICでは数値は実数1種類のみで、 その内部表現・有効数字桁数も独自形式です。 また上で書いたようにN66SR-BASIC以外は 数字定数もキャラクターコードで表現されるため、 中間言語としてはN66SR-BASICのみで実数表現は現れます。
 
表示される時は8桁までで表示されます。 指数表現に切り替わる基準も独特のようで、 絶対値が大きすぎる時はE+08から、 絶対値が小さすぎる時はE-03から指数表現に切り替わります。
    例: 12345678→12345678 (1.2345678E+07相当)
    例: 123456789→12345679E+08
    例: .01→.01 (1E-02相当)
    例: .001→1E-03
浮動小数点数の中間言語化 (共通)
 
浮動小数点数はマイナス値も表現が可能で 実際に変数の内部形式として利用されていますが、 中間言語の定数ではマイナス値の時は直前に-を表現する 予約語が置かれることで表現されています。 つまり必ず符号反転の演算子を使った計算式になります。
 
単精度・倍精度を明示するために、 定数値の後ろに単精度なら!を 倍精度なら#を付ける仕様がありますが、 明示された時はその型で、 明示されない時は適切な型が自動で判断されて中間言語されます。 整数のつもりで定数を入力しても、数が多い(32768以上や-32768以下)と 単精度・倍精度実数でしか表現できないと判断されて!や#が付与されます。
 
LIST表示される時には改めて!や#の要不要が自動で判断されて、 付与されたり省略された形で表示されます。
    例: 32767と入力→整数で中間言語化→LISTで32767と表示
    例: 32768と入力→整数の範囲を超えているので、単精度型実数で中間言語化→LISTで32768!と表示
    例: 0!と入力→明示されているので、単精度型実数で中間言語化→LISTで0!と表示
    例: 3.14!と入力→単精度型実数で中間言語化→小数点.で整数ではないことが明らかなので、LISTで3.14と表示
    例: 3.141592→四捨五入用の7桁目まででぎりぎり単精度の範囲なので、単精度実数で中間言語化→LISTで3.14159と表示
    例: 3.1415926→単精度の範囲を超えているので、倍精度実数で中間言語化→LISTで3.1415926#と表示
浮動小数点数の内部形式 (共通)
 
単精度・倍精度の実数は浮動小数点で表現していますが、 現在の規格化されている浮動小数点数仕様のIEEE 754とはビット数の割り当て・順番が異なり、 無限大やNaNもありません。 N系BASICは同仕様が策定されるよりも歴史が古く、 CPUに浮動小数点を扱う機能がなかった頃です (8087がIEEE 754の標準実装を目指して作られたらしいです)。
    sgn=符号ビットの値, frac=仮数部のビット数, fi=仮数部の下位からiビット目の値, exp=指数部の値
    x = (1-sgn×2)×(1+fracΣi=12-i×ffrac-i)×2exp-129
仮数部が下位から並んだ後に指数部が来て、 仮数部の最上位ビットの位置に符号が来ます。 単精度は仮数部23bit指数部8bit、倍精度は仮数部55bit指数部8bit、 PC-6000シリーズ/PC-6600シリーズの浮動小数点数は仮数部31bit指数部8bitです。 指数部の下駄履きは129で、1=-128、129=0、255=+126です。
    例: 単精度浮動小数点 x=3.14
    
仮数部(下位) 仮数部(中位) 仮数部(上位) 指数部 exp
f7 f6 f5 f4 f3 f2 f1 f0 f15f14f13f12 f11f10f9 f8 sgnf22f21f20 f19f18f17f16 e7 e6 e5 e4 e3 e2 e1 e0
56 0E 49 82
0101 0111 0000 1110 0100 1001 1000 0010
frac = 23 (単精度), exp = 130 (&H82) x = (1-0×2)×(1+0.5×1+0.25×0+0.125×0+0.0625×1+0.03125×0+0.015625×0+0.0078125×1+…)×2130-129 = 1×1.570…×21 = 3.14…
コメントの開始 (N88-日本語BASIC(86)、N88-日本語BASIC(86) (MS-DOS版))
 
N88-日本語BASIC(86)、N88-日本語BASIC(86) (MS-DOS版)では 中間言語コード&H00にコメントの開始が割り当てられています。 コメントはREM命令か '(シングルクォート)で始まりますが、 どちらを入力した時も直前に中間言語コード&H00が入った後に それぞれのキャラクターコードが並びます。 つまり、コメント開始の実体は&H00で、 REMも'もコメントの一部として扱われています。
    N88-日本語BASIC(86)の例: 100 REM 123
    
0E 00 64 00 01 00 52 45 4D 20 31 32 33 00
長さ
14byte
行番号
100
01⇒1個のスペース
(スペース)
00⇒コメントの開始
 
CHR$(&H52)+CHR$(&H45)+CHR$(&H4D)
REM
CHR$(&H20)+CHR$(&H31)+CHR$(&H32)+CHR$(&H33)
123
00⇒EOL
 
N88-日本語BASIC(86)の例: 200 PRINT'456
0C 00 C8 00 01 C0 00 27 34 35 36 00
長さ
12byte
行番号
200
01⇒1個のスペース
(スペース)
C0⇒予約語
PRINT
00⇒コメントの開始
 
CHR$(&H27)
'
CHR$(&H34)+CHR$(&H35)+CHR$(&H36)
456
00⇒EOL
 
 
このような扱いになったため、 それ以前のN系BASICが持っていた REMや'は予約語テーブルからなくなっています。 さらに厳密に言うと&HFFにREMが登録されていますが、使われていません。
 
また&H00がコメント開始を示すため、 &H00が来たら行末とは判断できなくなっています。 行のbyte数(旧リンクポインタ)で行末か判断しましょう。

予約語テーブル

の予約語
※初代PC-9801にはDRAW/KPLOADがありません
予約語は&H80〜&HFFの1byte〜2byteの中間言語コードで表現されます(右図)。 2byteの時は1byte目が必ず&HFFになります。 N60-BASIC/N60-拡張BASIC/N60m-BASIC/N66-BASICでは 予約語が少ないため1byteに収まっています。
 
また予約語としてテーブルに枠が確保されていながら、 機能が実装されていないケースもあります(右図では灰色にしています)。
 
予約語テーブルの変遷 (共通)
 
予約語テーブルとしては、 N-BASICから発展していったメインのPC-8000/8800シリーズの流れと、 コンパクトにまとまったN60-BASICからのPC-6000/6600シリーズの流れがあります。 後者はN66SR-BASICになった時にN88-BASIC互換の流れに変更されています。
 
その後のPC-9800シリーズ(16bit)では Microsoftとの共同開発を止めたことで権利の問題があったようで 予約語テーブルが一新されています。
ELSEの前の隠し: (共通)
 
IF~THEN~ELSEの 予約語ELSEの中間言語コードの直前には、 必ず隠し:(&H3A)が入ります。 ELSEが中間言語に変換される際に自動で挿入され、 LIST表示する時には隠し:は省略されて表示されます。
 
    N-BASICの例: IF INKEY$<>"" THEN PRINT "on" ELSE PRINT "off"
    
8B 20 E9 F2 F0 22 22 20 D8 20
8B⇒予約語
IF
CHR$(&H20)
(スペース)
E9⇒予約語
INKEY$
F2⇒予約語
<
F0⇒予約語
>
CHR$(&H22)+CHR$(&H22)
""
CHR$(&H20)
(スペース)
D8⇒予約語
THEN
CHR$(&H20)
(スペース)
91 20 22 6F 6E 22 20
91⇒予約語
PRINT
CHR$(&H20)
(スペース)
CHR$(&H22)+CHR$(&H6F)+CHR$(&H6E)+CHR$(&H22)
"on"
CHR$(&H20)
(スペース)
3A A1 20
CHR$(&H3A)
: (隠し)
A1⇒予約語
ELSE
CHR$(&H20)
(スペース)
91 20 22 6F 66 66 22
91⇒予約語
PRINT
CHR$(&H20)
(スペース)
CHR$(&H22)+CHR$(&H6F)+CHR$(&H66)+CHR$(&H66)+CHR$(&H22)
"off"
 
ELSEが文頭にくるようにすることで、 THENの後ろのマルチステートメントの処理の一環として ELSEが処理できて効率的なためだと思われます。
 
'の前の隠し:REM (N-BASIC/N80-BASIC/N80SR-BASIC/N60-BASIC/N60-拡張BASIC/N60m-BASIC/N66-BASIC/N66SR-BASIC/N88-BASIC/N88-漢字BASIC/N88-日本語BASIC)
 
コメントの開始を表す'(シングルクォート)の直前には、 必ず隠し:(&H3A)と隠し予約語REMが入ります。 'が中間言語に変換される際に自動で挿入され、 LIST表示する時には隠し:REMは省略されて表示されます。
 
'は文の途中に書くことができますが、 BASICインタープリタにとっては文の区切りがある方が 処理しやすいため隠し:が入るのだと思われます。 コメントの開始の実体は隠しREMが担っており、 'はコメントの一部の扱いになります。
    N-BASICの例: 200 PRINT'456
    
C8 00 91 3A 8F E4 34 35 36 00
行番号
200
91⇒予約語
PRINT
CHR$(&H3A)
: (隠し)
8F⇒予約語
REM (隠し)
E4⇒予約語
'
CHR$(&H34)+CHR$(&H35)+CHR$(&H36)
456
00⇒EOL
 
N-BASICの例: 210 PRINT:'456
D2 00 91 3A 3A 8F E4 34 35 36 00
行番号
210
91⇒予約語
PRINT
CHR$(&H3A)
:
CHR$(&H3A)
: (隠し)
8F⇒予約語
REM (隠し)
E4⇒予約語
'
CHR$(&H34)+CHR$(&H35)+CHR$(&H36)
456
00⇒EOL
 
N-BASICの例: 220 '456
DC 00 3A 8F E4 34 35 36 00
行番号
220
CHR$(&H3A)
: (隠し)
8F⇒予約語
REM (隠し)
E4⇒予約語
'
CHR$(&H34)+CHR$(&H35)+CHR$(&H36)
456
00⇒EOL
 
 
なお、REM命令でのコメントの時はこのような扱いはなく、 素直にREMを示す中間言語コードが並ぶのみです。
    N-BASICの例: 100 REM 123
    
64 00 8F 20 31 32 33 00
行番号
100
8F⇒予約語
REM
CHR$(&H20)+CHR$(&H31)+CHR$(&H32)+CHR$(&H33)
123
00⇒EOL
 
 
GO TO命令 (共通)
 
GOTO命令は"GO TO"とも書けますが、 予約語テーブルとしては"GOTO"のみがあるために、 GO TOと入力した後にLISTするとGOTOに変化することになります。
 
一方でDEF USR命令などはDEF, USR 両方に予約語が割り当てられているため、間にスペースを入れることも 省略することもできるようになっています。
 
PRINTの省略記号? (共通)
 
?記号をPRINT命令の代わりに使うことが出来ますが、 ?記号はPRINTの予約語として中間言語化されるため、 入力後にLIST表示するとPRINTに置き換わっています。
 
予約語テーブルを使っていない予約語 (共通)
 
NAME AS命令の"AS"は キャラクターコードの1文字ずつを並べて表現されています。
 
予約語テーブルを使っていない予約語 (N88-日本語BASIC(86) (MS-DOS版))
 
N88-日本語BASIC(86) (MS-DOS版)では予約語 CHDIR, MKDIR, RMDIRが 空文字の予約語として登録されている0xEFの後ろに キャラクターコードの1文字ずつを並べて表現されています。
    N88-日本語BASIC(86) (MS-DOS版)の例: CHDIR "B:¥BASIC"
    
EF 43 48 44 49 52 20 22 42 3A 5C 42 41 53 49 43 22
EF⇒予約語
(空文字)
CHR$(&H43)+CHR$(&H48)+CHR$(&H44)+CHR$(&H49)+CHR$(&H52)
CHDIR
CHR$(&H20)
(スペース)
CHR$(&H22)+CHR$(&H42)+…
"B:¥BASIC"

文字列・コメント中のキャラクターコード


文字列・コメント中のキャラクターコード
文字列・コメント中は&H00〜&H1Fの中間言語コードや予約語テーブルは使われず、 より広い範囲でキャラクターコードが使われます(右図)。
 
&H20〜&H7Fの範囲の文字に加えて、 &HA1〜&HDFの半角カタカナ   、 グラフィックキャラクター   (後述)、 漢字に対応している場合は漢字コードそのもの   や KANJI IN/OUTコード   (後述)、 中間言語コード&H0Aの改行が実装されてるなら改行   も入ります。
 
標準化された規格との違い (共通)
 
これらをまとめると右図のキャラクターコード表が完成しますが、 現在の規格化されているどの仕様とも違う点に注意して下さい。
 
7bit範囲&H00〜&H7Fを ISO/IEC 646 (ASCIIコード)と比べると &H5Cが「¥」になっている点が違います。
 
8bit範囲全体を JIS X 0201 (JIS C 6220、ANKコード)と比べると &H7Eの字形が「 ̄」(オーバーライン)ではなく「~」(チルダ)に なっている点が違います。 グラフィックキャラクター   もNEC独自の拡張なので、規格化された仕様にはありません。
 
また、&H7Cの字形は正確には「│」(縦線)ではなく「¦」(破断線)です。
 
&H60に「`」(バッククォート)が、&HFCに「\」(バックスラッシュ)が 割り当てられたのはPC-9800シリーズ初期の途中からです。 資料によって矛盾する情報があって正確なところははっきりしませんが、 1986年11月発売以降の機種から割り当てられたとの理解で 大きくは間違ってはいないと思います。 つまり、PC-9801/E/F/M/U/VF/VM0/VM2/VM4/UV2が未実装の機種です。
 
ひらがなモード (N80SR-BASIC)
 
N80SR-BASICにはCONSOLE命令でテキスト画面をひらがなモードにすることが可能で、 &HA1〜&HDFの半角カタカナが半角ひらがなで表示されます。 これは画面モードによってフォントが入れ替わる機能なので、 プログラムテキスト上の文字列としては出てきません。
 
グラフィックシンボルモード (N88-日本語BASIC)
 
N88-日本語BASICではSCREEN命令で、 漢字文字列が表示される日本語モードから グラフィックキャラクターが表示されるグラフィックシンボルモードに 変更することができます。 漢字コードの上位byteとグラフィックキャラクターが使う 範囲が&H81〜&H9F, &HE0〜&HEFで重複しており、 両方を同時には使えないためです。 グラフィックシンボルモードはN88-BASICのキャラクターコードと同じになるので、 N88-日本語BASICの文字コードの説明は日本語モードの状態で説明します。

グラフィックキャラクター

グラフィックキャラクター(グラフィックシンボル)はキャラクターコードに含まれている記号   で、 GRPHキーを押しながら対応するキーを押すことで入力できます。
 
グラフィックキャラクターは大きく分けて、PC-8000/8800/9800シリーズ向けと PC-6000/6600シリーズ向けの2種類があります。
 
漢字のグラフィックキャラクター (共通)
 
キャラクターコードの中に「年」などの漢字が含まれていますが、 これらは漢字の文字の形をしているグラフィックキャラクターの1つにすぎません。 文字列としての漢字はまた別の扱いがされています(後述)。
    N-BASICの例: PRINT "ドル円"
    
91 20 22 C4 DE D9 F1 22
91⇒予約語
PRINT
CHR$(&H20)
(スペース)
CHR$(&H22)+CHR$(&HC4)+CHR$(&HDE)+CHR$(&HD9)+CHR$(&HF1)+CHR$(&H22)
"ドル円"
 
&H00〜&H20のグラフィックキャラクター (N60-BASIC/N60-拡張BASIC/N60m-BASIC/N66-BASIC/N66SR-BASIC)
 
&H00〜&H20に割り当てられているグラフィックキャラクターは、 2byteで表現されます。 1byte目は&H14、2byte目はそのコードに&H30を足した値が置かれます。
    N60-BASICの例: PRINT "2022年"
    
95 20 22 32 30 32 32 14 38 22
95⇒予約語
PRINT
CHR$(&H20)
(スペース)
CHR$(&H22)+CHR$(&H32)+CHR$(&H30)+CHR$(&H32)+CHR$(&H32)
"2022
14⇒CHR$(&H38-&H30)
CHR$(&H22)
"
 
セミグラフィック (N60m-BASIC/N66-BASIC/N66SR-BASIC)
 
PC-6001mkII以降のPC-6000/6600シリーズには さらに表示アトリビュートの指定(特殊な色指定のような方法)で &H00〜&HFFを通常のキャラクターコードとは異なる見た目にする セミグラフィック機能があります。 これはプログラムテキスト上の文字列としては出てきません。
 
漢字コードがShift_JIS表現の言語のグラフィックキャラクター (N88-日本語BASIC/N88-日本語BASIC(86) (MS-DOS版))
 
漢字をShift_JISで表現している言語では コードがグラフィックキャラクターと被ってしまうため、 文字列・コメント中にグラフィックキャラクターが使えません (漢字コードの一部として判定されてしまう)。 なおキャラクターコードとして廃止されたわけではないため、 グラフィックシンボルモードやVRAM直書き、 N88-日本語BASIC(86) (MS-DOS版)では CHR$()で グラフィックキャラクターを画面に表示することはできます。
    N88-日本語BASICの例: POKE &HF3C7,&HEC
    N88-日本語BASIC(86) (MS-DOS版)の例: PRINT CHR$(&HEC)

漢字コード

漢字の扱いについてはややこしいので、順番にまとめてきます。
 
漢字ROMの有無 (共通)
 
まず本体が漢字ROM(フォント情報)を持っていないことには漢字を表示できません。 また過渡期でもあったので、 現在の規格化されている範囲の文字の全てが使えるとも限りません。 実際、当時の漢字コードはNEC漢字コードやNEC JISと呼ばれていたようです。
 
各機種の漢字ROM
漢字ROM搭載状況 表示領域
PC-8001 漢字ROMなし テキスト領域しか存在せず
PC-8001mkII
PC-8001mkIISR
別売の漢字ROMボード(PC-8001mkII-01)で、 第一水準2965文字+非漢字約700文字 テキスト/グラフィック領域の重ね合わせ可能
漢字はグラフィック領域
PC-6001 漢字ROMなし テキスト/グラフィック領域は排他利用
PC-6001mkII
PC-6601
PC-6601SR
PC-6001mkIISR
漢字ROM内蔵で、専用漢字1024文字
別売の拡張漢字ROMカートリッジ(PC-6601-01/PC-6007SR)で、第一水準2965文字+非漢字約100文字?
テキスト/グラフィック領域は排他利用
漢字はグラフィック領域
PC-8801 別売のPC-8801用漢字ROMボード(PC-8801-01/PC-8801-01K)で、 第一水準2965文字と非漢字約700文字 テキスト/グラフィック領域の重ね合わせ可能
漢字はグラフィック領域
PC-8801mkII 漢字ROM内蔵で、第一水準2965文字+非漢字約700文字
PC-8801mkIISR
PC-8801mkIITR
PC-8801mkIIFR
漢字ROM内蔵で、第一水準2965文字+非漢字約700文字
別売のマルチボードA(PC-8801-20)で、第二水準3384文字
PC-8801mkIIMR
PC-8801FH
PC-8801MH
PC-8801FA
PC-8801FE/FE2
PC-8801MA/MA2
PC-8801MC
漢字ROM内蔵で、第一水準2965文字+第二水準3384文字+非漢字約700文字
PC-88VA/VA2/VA3 漢字ROM内蔵で、第一水準2965文字+第二水準3384文字+非漢字896(885?)文字+利用者定義文字188文字 テキスト/グラフィック領域の重ね合わせ可能
漢字はテキスト領域
PC-9801 別売の漢字ROMボード(PC-9801-01/PC-9801-10)で、 第一水準2965文字+非漢字885文字
別売の第2水準漢字ROMチップ(PC-9801-12/K)で(PC-9801-10上にのみ搭載可)、第二水準3384文字
別売の拡張漢字ROMチップ(PC-9801-18)で、拡張漢字388文字
テキスト/グラフィック領域の重ね合わせ可能
漢字はテキスト領域
PC-9801E 別売の漢字ROMボード(PC-9801-10)で、 第一水準2965文字+非漢字885文字+利用者定義文字63字
別売の第2水準漢字ROMチップ(PC-9801-12/K)で、第二水準3384文字
別売の拡張漢字ROMチップ(PC-9801-18)で、拡張漢字388文字
PC-9801F/M 漢字ROM内蔵で、第一水準2965文字+非漢字885文字+利用者定義文字63字
別売の第2水準漢字ROMチップ(PC-9801-12/K)で、第二水準3384文字
別売の拡張漢字ROMチップ(PC-9801-18)で、拡張漢字388文字
PC-9801U 漢字ROM内蔵で、第一水準2965文字+第二水準3384文字+非漢字885文字+利用者定義文字63字
別売の拡張漢字ROMチップ(PC-9801-28)で、拡張漢字388文字
PC-9801VF/VM
PC-9801UV
PC-9801VX0/2/4
漢字ROM内蔵で、第一水準2965文字+第二水準3384文字+非漢字885文字+利用者定義文字188字
別売の拡張漢字ROMチップ(PC-9801-28)で、拡張漢字388文字
PC-9801VX01/21/41
PC-9801RX/EX/UX/DX
PC-9800シリーズ(386以上搭載機)
漢字ROM内蔵で、第一水準2965文字+第二水準3384文字+非漢字885文字+拡張漢字388文字+利用者定義文字188字
 
漢字のコード (共通)
 
漢字コードは基本的にJISコードが使われていますが、 正確には旧JIS(JIS C 6226-1978、JIS X 0208-1978、78JIS)が 始めから最後までどの機種であっても使われています。 現在JISコードと言うと新JIS(JIS X 0208-1983、83JIS)を指すことが多いですが、 漢字ROMが導入された頃は旧JISの時代で、 互換性を重視してそのまま継続したのだと思われます。
 
なお、PC-98ハイレゾ機は新JISになっていたようです。 PC-286/386/486/586(PC-9801互換機)では 新JISの追加・字形変更が適用されていて、 後期の機種では新JISへの字体交換がシステム設定で可能になっています。
 
「第一水準」「第二水準」は旧JISそのままで、 「非漢字」に分類される 記号・英数字・かな文字・カナ文字・ギリシャ文字・キリル文字も 旧JISと一致していますが、それ以外の非漢字はNEC独自拡張です。 新JISで&H2821〜&H2840に罫線素片が追加されていますが それには対応せず、独自コードに罫線素片を割り当てています。
 
NEC非漢字は16bit機(PC-9800シリーズ/PC-88VAシリーズ)から追加されています。 &H2D21~&H2D7Cに追加された特に「NEC特殊文字」(98文字・NEC拡張)と呼ばれる範囲は 後からJIS X 0213-2000(JIS2000、新拡張JISコード)に組み込まれています。
 
「拡張漢字」はJIS X 0212の補助漢字やJIS X 0213の第三水準・第四水準ではなく NEC独自拡張でしたが、 NEC特殊文字にすでに含まれている「ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㈱№℡∵」以外の文字は 後からWindows-31J(CP932)で「NEC選定IBM拡張文字」と呼ばれる仕様として 組み込まれています。 言い換えるなら、 拡張漢字はNEC選定IBM拡張文字と「ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㈱№℡∵」を指します。
 
これ以外に漢字ROMの頭には「半角文字」と「1/4角文字」のフォントが 必ず入っているようです。 16bit機(PC-9800シリーズ/PC-88VAシリーズ)の説明書の一部からは 掲載されなくなっていますが、残っています (例:PUT (100,100),KANJI(&H0091)で半角「あ」が描画できます)。 それぞれ400ラインモード/200ラインモードの時の テキスト領域に表示される文字と同じグリフですが、 半角文字の方はグラフィックキャラクターが入る &H0080〜&H009F、&H00E0〜&H00FFの範囲に半角ひらがなのフォントが入っています (テキスト領域にひらがなを表示する機能がない機種であっても)。 なお、この半角文字・1/4角文字はグラフィック領域への描画時にのみ使える 特殊な扱いになっており(テキスト領域用のフォントは別のROMに入っています)、 JISコードの範囲外に割り当てられています。
 
NECの漢字コード ()
コード範囲 分類 内容
0020~00FF 半角文字 8×16ドットサイズの記号・英数字・かな・カナの221文字(または`、を除いた219文字)
0100~01FF 1/4角文字 8×8ドットサイズの記号・英数字・カナ・グラフィックキャラクターの246文字(または`\を除いた244文字)
2121~277E JIS非漢字 旧JISの記号108文字+英数字62文字+かな83文字+カナ86文字+ギリシャ48文字+キリル66文字で合計453文字
2921~2B7E NEC非漢字(2バイト半角) 機種依存の半角の英数字95文字+カナ94文字+罫線78文字+記号15文字で合計282文字(または「`」を除いた281文字)
2C24~2C6F NEC非漢字(全角罫線素片) 機種依存の全角罫線76文字(新JISの罫線素片とは互換性なし)
2D21~2D7C NEC非漢字(NEC特殊文字) NEC特殊文字で丸数字・ローマ数字・単位・年号などの83文字(または「㍻」を除いた82文字)
3021~4F53 第一水準 旧JISの第一水準2965文字
5021~737E 第二水準 旧JISの第二水準3384文字
7621~777E 利用者定義文字 利用者定義文字のRAM188文字
63文字の機種は頭の63文字分のみ使用
7921〜7C7E NEC選定IBM拡張文字 NEC選定IBM拡張文字374文字
拡張漢字388文字の一部
0001〜0400 P6専用漢字 教育漢字996文字+都道府県名19文字+その他9文字(札幌盛仙甲津那覇啓)で合計1024文字
 
さらに細かいことを書きますと、NEC非漢字(NEC特殊文字)には 元号も含まれており、1990年頃に「㍻」(&H2D5F)が追加されています。
 
テキスト領域の1byteキャラクターコードでは 「`」(バッククォート)「\」(バックスラッシュ)が PC-9800シリーズ初期に追加されていますので、 これらが未実装の時期には漢字ROMにも載っていません。 具体的には半角文字の`(&H0060)・1/4角文字の`(&H0160)と\(&H01FC)・ NEC非漢字(2バイト半角)の`(&H00A4)がこれに該当します。
 
半角文字のカタカナの区点「、」(&H00A4)や 1/4角のグラフィックキャラクターの一部 (&H0180〜&H018E, &H0190〜&H019B, &H01E4〜&H01E7)が 公式の説明書上でグリフがないケースが見られますが、 時期に一貫性がなく 実機で試すと実際にはグリフがあったケースも確認しているので、 誤植ではないかと私は捉えています。
 
漢字の分類のサポート文字数 (共通)
 
「各機種の漢字ROM」表の搭載文字数は各機種のカタログスペックから まとめていますが、非漢字と拡張漢字がどの範囲を示しているのかが どこにも明示されておらず、はっきりしていません。 上記のように時期によって文字数は増減しているのにも関わらず 仕様上は文字数が変動していませんし、 「NECの漢字コード」のどの分類の合計とも一致しません。
 
つじつまがあうように無理矢理解釈するなら、 非漢字885文字にはテキスト表示用609文字との記載があるので、 グラフィック領域専用の半角文字・1/4角文字で 885-609=276文字が割り当てられていることが分かります。 半角文字でテキスト表示用文字とは異なる グリフの割り当てられている半角ひらがなの63文字と、 1/4角文字から制御コードと`\を除いた213文字を合わせると ちょうど276文字になります。 テキスト表示用609文字はJIS非漢字の453文字と、 NEC非漢字の全角(全角罫線素片76文字+NEC特殊文字から㍻を除いた82文字)158文字の 合計で611文字、 JIS非漢字の213D(―)・2143(|)とNEC非漢字の全角罫線素片をグリフが被ってると みなせば609文字になります。 やや強引な計算ではありますが。
 
拡張漢字の388文字は、 NEC選定IBM拡張文字の元となった「IBM拡張文字」の文字数と一致します。 IBM拡張文字は文字コードがJISコードの範囲外だったので、 JISコード内に収めるためにNECが独自に配置し直したのがNEC選定IBM拡張文字です。 この時にすでにNEC特殊文字に採用済みの「ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㈱№℡∵」を 除外しているためにNEC選定IBM拡張文字は374文字になります。 このため、おそらくNEC選定IBM拡張文字とNEC特殊文字側にある14文字をあわせて IBM拡張文字と同等であることを示すために 388文字と表記したのではないかと思います (NEC特殊文字は非漢字にもカウントされてはいますが)。
 
漢字の使われ方 (共通)
 
初期の頃は漢字文字をグラフィック領域に絵として描画することのみができました。 CMD PUT KANJI, PUT@ KANJI, KANJI命令と言語ごとに指定方法はまちまちですが、 いずれもJISコード(PC-6001mkII/PC-6601/PC-6601SR/PC-6001mkIISRに標準搭載の1024文字は1〜2024の専用コード)をプログラムで指定します。
    N80-BASICの例: CMD PUT (100,100),KANJI(&H3441)
    N80SR-BASICの例: PUT@ (100,100),KANJI(&H3441)
    N60m-BASIC(Page≧2)の例: SCREEN 3,2,2:KANJI (10,10),2,1
その次にテキスト領域と位置合わせをしたり、 テキスト文字もグラフィック領域に描画することで、 BASICインタープリタ上で漢字が文字列の一部として使えるように 見せかけるようになります。 言語名に漢字BASIC/日本語BASICと入っている言語はこの方式です。 ここから中間言語の中に漢字コードが入ってくることになります。
    各種漢字BASIC/日本語BASICの例: PRINT "日本語"
16bit機(PC-9800シリーズ/PC-88VAシリーズ)の時代になると、テキスト領域に漢字が描画できるようになり、 本当の意味で漢字が文字として扱えるようになりました。
 
ひとくちに漢字対応と言ってもこのような違いがあるので、 違いを意識していないと混乱します。
 
漢字BASICと日本語BASIC (N80-漢字BASIC/N88-漢字BASIC/N88-日本語BASIC/N88-日本語BASIC(86)/N88-日本語BASIC(86) (MS-DOS版))
 
上で書いたように、BASICインタープリタ上で漢字が文字列の一部として 使えるようになったBASICが漢字BASIC/日本語BASICです。
 
漢字1文字ごとに入力(4桁の文字コードもしくはローマ字変換等) できるようになったBASICを漢字BASIC、 文節変換等で文章として漢字を入力できるようになったBASICを日本語BASICと 呼び分けているようです。
 
漢字コードのJISコード表現 (N88-漢字BASIC/N88-日本語BASIC(86))
 
JISコードで漢字を表現する場合、 KANJI INと呼ばれる特別なキャラクターコードの並び(エスケープシーケンス)が 出現すると漢字状態となり、 以後の2byteずつがJISコードとして扱われます。 同様にKANJI OUTのキャラクターコードの並びが出現すると通常状態に戻ります。
 
JISコードの標準化された規格として ISO-2022-JP (ISO/IEC 2022) または JIS X 0208 で エスケープシーケンスが定義されていますが、 いずれも使っておらず独自の並びが使われています。
 
N88-漢字BASICでは&HFAがKANJI IN、&HFDがKANJI OUTコードです。 漢字状態中は2byteの漢字コードが並びます。 下位・上位それぞれの最上位ビットが1になることがありますが、 その条件は良く分かりませんでした。 読み取るだけならそれぞれの最上位ビットを0に変えて解釈すれば問題ありません。
    N88-漢字BASICの例: "88漢字"
    
22 38 38 FA 41 34 7A BB FD 22
CHR$(&H22)
"
CHR$(&H38)+CHR$(&H38)
88
FA⇒KANJI IN
 
JISコード3441
JISコード3B7A
FD⇒KANJI OUT
 
CHR$(&H22)
"
 
N88-日本語BASIC(86)ではESC K(&H1B, &H4B)がKANJI IN、 ESC H(&H1B, &H48)がKANJI OUTコードです。 プリンタPC-PR201の制御コードにあわせてあるようです。 2byteの漢字コードが上位→下位の順番に並びますので注意して下さい。
    N88-日本語BASIC(86)の例: "98漢字"
    
22 39 38 1B 4B 34 41 3B 7A 1B 48 22
CHR$(&H22)
"
CHR$(&H39)+CHR$(&H38)
98
1B 4B⇒KANJI IN
 
JISコード3441
JISコード3B7A
1B 48⇒KANJI OUT
 
CHR$(&H22)
"
 
漢字コードのShift_JISコード表現 (N88-日本語BASIC/N88-日本語BASIC(86) (MS-DOS版))
 
Shift_JISコードで漢字を表現する場合、 通常の1byteキャラクターコードと混在して並びます。 Shift_JISコードの上位コードは0x81〜0x9Fもしくは0xE0〜0xEFになるため、 この範囲にあるなら漢字コードの一部、 それ以外なら通常の1byteキャラクターコードとして扱えます。 漢字コードだった時は上位→下位の順番に並びますので注意して下さい。
    N88-日本語BASIC(86) (MS-DOS版)の例: "98漢字"
    
22 39 38 8A BF 8E 9A 22
CHR$(&H22)
"
CHR$(&H39)+CHR$(&H38)
98
8A⇒SJISコード8ABF
8E⇒SJISコード8E9A
CHR$(&H22)
"
 
漢字コードのEUCコード表現 (参考情報) (8801漢字BASIC/新8801漢字BASIC)
 
EUCコードで漢字を表現する場合、JISコードの時と同様にKANJI IN/OUTで 漢字状態と通常状態の行き来をします。 本来のEUCコードはこのような状態の行き来を不要とするための仕様ですが、 8801漢字BASIC/新8801漢字BASICではこのような扱い方がされています。 EUCコードでは1byte目が&H8Eの領域に半角カナが割り当てられていますが、 その仕様は使われていません。 EUCコードで表現していると言うよりはJISコードで表現して、 最上位ビットを常に1にしていると捉えた方が良いかも知れません。
 
8801漢字BASIC/新8801漢字BASICでは&H7FがKANJI IN/OUT両方を兼ねています。 &H7Fが出現する度に漢字状態と通常状態を行き来します。 2byteの漢字コードが上位→下位の順番に並びますので注意して下さい。
    8801漢字BASIC/新8801漢字BASICの例: "88漢字"
    
22 38 38 7F B4 C1 BB FA 7F 22
CHR$(&H22)
"
CHR$(&H38)+CHR$(&H38)
88
7F⇒KANJI IN
 
EUCコードB4C1
EUCコードBBFA
7F⇒KANJI OUT
 
CHR$(&H22)
"
 
純正BASICでは漢字ROMの半角文字・1/4角文字は文字列中に使えませんが (グラフィック領域に漢字を描画する言語であっても)、 8801漢字BASIC/新8801漢字BASICではこれらを独自のコードに割り当てることで 使えるようにしています。 中間言語中のEUCコードは 半角文字は&H80A0〜&H83BF、1/4角文字は&H8480〜&87BF (下位は&H80〜&HBFのみの範囲)になります(本来のEUCコードの範囲外です)。 漢字ROMの&H0020~&H01FFのコードとは2進数で 1000 0*** 10** **** ⇔ 0000 000* **** **** のように相互変換します。
    8801漢字BASIC/新8801漢字BASICの例: 半角文字「あ」
    
中間言語のEUCコード(上位) 中間言語のEUCコード(下位)
1 0 0 0 0 b8b7b6 1 0 b5b4 b3b2b1b0
82 91
1000 0010 1001 0001
NECの漢字コード(上位) NECの漢字コード(下位)
0 0 0 0 0 0 0 b8 b7b6b5b4 b3b2b1b0
00 91
0000 0000 1001 0001
 

戻る