1-1. メモリ・マップ
FX-870P,VX-4は4つのメモリ・バンク(64KB×4)を持っている。
全体のメモリ・マップは図1に示す。特徴は,以下の通り。
![]() |
図1.FX-870P メモリ・マップ |
---|
開始アドレス (16進) | ROM 内容 |
---|---|
0000H | 標準キャラクタ・フォント |
0540H | 海外向けキャラクタ・フォント |
0A80H | BASIC エラーメッセージテーブル |
0EA8H | 未使用 |
13F7H | F.COM, CASL, FX, システムメッセージ用データエリア |
2739H | 未使用 |
27D4H | ROM チェックプログラム用データエリア |
2AD9H | 未使用 |
2E1EH | 3 pinでの通信用BASICプログラム等 |
38C4H | C言語コマンドテーブル |
3BCBH | 未使用 |
4248H | C言語エラーメッセージテーブル |
47CFH | 不明 |
4C9CH | 未使用 |
1-2. システム・エリア(BASIC時)
BANK1の0000H~0FFFHは未使用。1000H~1CD0Hは、システムエリアとして、表2 のように使用されている。
データ分類 | LABEL | ADDRESS (16進) | BYTE数 | 説明 |
---|---|---|---|---|
データ | INTOP | 1000 | 256 | 中間コード・バッファ |
LCDST | 1100 | 1 | 7bit:NONE 6bit:NONE 5bit:反転表示(ON/OFF) 4bit:カーソルバー ON/OFF 3bit:カーソル移動範囲指定 2bit:仮想スクリーン/実スクリーン 1bit:仮想表示イネーブル 0bit:KEY 入力時/PRINT | |
EDCSR SCTOP TOEDB BOEDB MOEDB |
1101 1102 1103 1104 1105 |
1 1 1 1 1 |
カーソル位置 実スクリーン・トップ(上位3ビット・下位5ビット0) 論理行トップ(上位3ビット・下位5ビット0) 論理行ボトム(上位3ビット・下位5ビット1) 論理行トップ(INPUT時) | |
TOARE BOARE |
1106 1107 |
1 1 |
カーソル移動範囲トップ カーソル移動範囲ボトム | |
EDCNT DSPMD SCROL |
1108 1109 110A |
1 1 1 |
入力した最後の文字の位置+1 00H=ノーマル表示/01H=PF表示 80H=4行スクロール/60H=3行スクロール/40H=2行スクロール/20H=1行スクロール | |
ELVAD |
110B 110D |
2 6 |
コントラスト・データ(ROMのアドレス) 不明 | |
キー・データ | KEYMD | 1113 | 1 | 6bit:カナ 5bit:NONCAPS |
KYSTA | 1114 | 1 | 7bit:AC 6bit:OFF 5bit:APO禁止 4bit:コントラスト 3bit:REPEAT イネーブル 2bit:REPEAT ON/OFF 1bit:0 0bit:0 | |
CHATA | 1115 | 1 | チャタリングの時間カウント用 | |
KEYCM KEYIN | 1116 1117 | 1 2 | KO KI | |
KYREP | 1119 111A | 1 1 | キーリピート・カウント時間 不明 | |
KECNT | 111B | 22 | キー・バッファ 1バイト: 00Hポインタ基準 2バイト: バッファ中ポインタ 1バイト: 10Hバッファ長 2バイト: バッファ開始アドレス 16バイト: バッファ | |
1131 | 1 | 不明 | ||
BASIC データ1 | ANGFL RNDFL | 1132 1133 1134 | 1 1 1 |
角度モード(0:DEG, 1:RAD, 2:GRA) 0:演算後丸めをする(MODE10), 1:演算後丸めをしない(MODE11)・・・(注1) 不明 |
スクリーン・データ | CSRDT EDTOP LEDTP | 1135 113B 123C | 6 257 768 |
カーソル点滅用データ・バッファ 入力バッファ 表示ドット・バッファ |
CGRAM | 153C | 24 | キャラクタ・コード FCH~FFH用表示ドット・パターン | |
I/O データ | RS1 | 1554 | 1 | 7,6,5bit: (1 1 1)・・・ 75 baud(未確認) (1 1 0)・・・ 150 baud (1 0 1)・・・ 300 baud (1 0 0)・・・ 600 baud (0 1 1)・・・ 1,200 baud (0 1 0)・・・ 2,400 baud (0 0 1)・・・ 4,800 baud (0 0 0)・・・ 9,600 baud(使用確認) 4bit: ストップ・ビット 1/2 3bit: データ長(bit) 7/8 2bit: パリティ ON/OFF 1bit: パリティ Odd/Even 0bit: MT/RS-232C |
RS2 | 1555 | 1 | 1bit: 入力用 SO中 0bit: 出力用 XOFF中 | |
RS3 | 1556 | 1 | 7bit: NONE 6bit: 入力用 XOFF中 5bit: 出力用 SO中 4bit: CD 制御指定 3bit: DSR 制御指定 2bit: CTS 制御指定 1bit: XON/XOFF 指定 0bit: SI/SO 制御指定 | |
RS4 | 1557 | 1 | 4bit: フレーミング 3bit: パリティ 2bit: オーバーラン 1bit: not Ready 0bit: バッファ | |
INTCK | 1558 | 1 | 01H・・・データ受信 | |
RXCNT | 1559 | 258 | RS-232C, MT用受信バッファ 1byte: 受信バッファ数 1byte: 入力用ポインタ 256byte: 受信バッファ | |
165B | 1 | 不明 | ||
ACJMP | 165C | 2 | BREAK時のジャンプ先アドレス | |
BASIC データ2 | WORK1 | 165E | 28 | WORK バッファ |
167A | 4 | 未使用(?) | ||
VAR1 VAR2 VAR3 VAR4 | 167E 167F 1680 1681 |
1 1 1 2 |
変数用ワーク 変数用ワーク 変数用ワーク 変数用ワーク | |
PASS | 1683 | 8 | パスワード格納エリア(XOR255 で入っている) | |
CASPN CPN | 168B 168C | 1 1 |
CASL プログラム・ナンバー C言語 プログラム・ナンバー | |
| 168D 168E | 1 41 | 不明 不明 | |
FCOMD FCOM1 FCOM2 | 1687 1688 1689 |
1 1 1 |
F.COMのデバイスで,(000000AB)B. AB=00・・・RS-232C AB=01・・・DISK AB=10・・・MT F.COM P/F F.COM 番号 | |
16BA | 5 | 不明 | ||
OPTCD SEGAD | 16BF 16C0 | 1 2 |
オプション・コード セグメントの値 | |
16C2 | 1 | 不明 | ||
SETDA | 16C3 | 1 | SET命令のデータ (00AB####)Bで, E…A=1/F…B=1/####=BCD桁数 | |
MODE1 | 16C4 | 1 | 確認不可能 | |
MODE2 | 16C5 | 1 | FX-870P/VX-4では常に0と思われる。 | |
MODE3 | 16C6 | 1 | 01H: BASIC実行中(RUN) 02H: BASIC停止中(STOP) 00H: その他 | |
NOWFL NOWLN EXEDE | 16C7 16C9 16CB 16CD |
2 2 2 2 | 下と同じ 現在使用しているファイルの番地 現在実行している行番号 現在実行している命令の番地 | |
16CF | 12 | 不明 | ||
DATPA CONTA ERRFL EJPDE ERRLN ERRDE ERRN EJPFG TRAFG INPER STAT OUTDV IOSTS PRSW PTABC RSFG RND ANSAD FDDBF |
16DB 16DD 16DF 16E1 16E3 16E5 16E7 16E8 16E9 16EA 16F1 1739 173A 173B 173C 173D 173E 1740 1749 174A 1753 1770 1790 1793 |
2 2 2 2 2 2 1 1 1 2 72 1 1 1 1 1 2 9 1 9 29 35 3 258 |
DATA文ポインタ CONT時に実行を再開するポインタ ON ERROR 有効ファイル DIR アドレス ON ERROR 飛び先ポインタ エラー発生行番号 エラー発生文ノアドレス エラー番号 00H:通常処理中/01H:ON ERROR処理中 00H:TROFF/01H:TRON INPUT エラー時の戻りアドレス STAT 用データ 出力デバイス(00:表示, 02:プリンタ, 04:FCB) IBIT ON 受信オープン/OBIT ON 送信オープン PRT ON/OFF (1/0) プリンタ出力文字数 不明 RS-232Cデフォルト値(RS1,RS3のDATA) 乱数データ 不明 ANS用データ 不明 FILE ワーク(?) 不明 FDD バッファ | |
メイン・データ | IOBF SSTOP SBOT FORSK GOSSK TONDT DTTB TOSDT PTSDT P0STT P1STT P2STT P3STT P4STT P5STT P6STT P7STT P8STT P9STT F0STT F1STT F2STT F3STT F4STT F5STT F6STT F7STT F8STT F9STT MEMEN DIREN CALC IOBUF |
1895 1897 1899 189B 189D 189F 18A1 18A3 18A5 18A7 18A9 18AB 18AD 18AF 18B1 18B3 18B5 18B7 18B9 18BB 18BD 18BF 18C1 18C3 18C5 18C7 18C9 18CB 18CD 18CF 18D1 18D3 19D5 |
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 258 258 |
I/O バッファの先頭番地 文字演算ワーク先頭番地 スタック・フリーエリア先頭番地 FOR スタック・ポインタ GOSUB スタック・ポインタ 数値変換データ 変数テーブル 文字変数データ 文字データ・フリーエリア P0先頭番地 P1先頭番地 P2先頭番地 P3先頭番地 P4先頭番地 P5先頭番地 P6先頭番地 P7先頭番地 P8先頭番地 P9先頭番地 F0先頭番地 F1先頭番地 F2先頭番地 F3先頭番地 F4先頭番地 F5先頭番地 F6先頭番地 F7先頭番地 F8先頭番地 F9先頭番地 ファイル・フリーエリア先頭番地 RAMエンド・アドレス カルク用バッファ SAVE/LOAD用I/Oバッファ |
スタック | SSPBT SSPTP USPBT USPTP | 1AD7 1BD7 1BD7 1CD0 |
256 0 249 0 | システムスタック・エリア ユーザースッタク・エリア |
1-3. ROM ルーチン
現在までに確認されている使用可能なBANK1のROM ルーチンを表3に示す。『PB-1000テクニカル・ハンドブック』と同じルーチンについては名前はそのままで,それ以外はこたちゃんが命名。
なお,ROM ルーチンの機械語プログラムからの呼び出し方は,1-5.で説明する。
ラベル名 | アドレス | 機能 |
---|---|---|
NEXTC | 0049H (73) | IZで指定されるアドレスからサーチを開始し,スペース(20H)以外のコードが見つかれば,そのコードを$0に入れる。 [入力] IZ: サーチ開始アドレス [出力] IZ: $0にあるコードが存在するアドレス $0: スペースでない最初のコード |
ENDSC | 003CH (60) | NEXTC を実行して,$0の値が0,1,2ならば,フラグ・レジスタのキャリーをON(1) [入力] IZ: サーチ開始アドレス [出力] IZ: $0にあるコードが存在するアドレス $0: スペースでない最初のコード FLG: キャリー・フラグ=1@$0=0,1,2 |
OKNMI | 002BH (43) | $0の値が数字(ASCIIコードの30H~39H)のとき,フラグ・レジスタのキャリーをON(1)にする。 [入力] $0: チェックするコード [出力] $0: コード FLG: キャリー・フラグ=1@$0=30H~39H |
OKAMI | 00ABH (171) | $0の値がアルファベト大文字(A~Z)のとき,フラグ・レジスタのキャリーをON(1)にする。 [入力] $0: チェックするコード [出力] $0: コード FLG: キャリー・フラグ=1@$0="A"~"Z" |
FC07 | 00E9H (233) | IZで指定されるアドレスからサーチを開始し,スペース(20H)以外のコードが見つかれば,そのコードと次のアドレスのコードの2バイトに対して$1(7が格納される), $2を比較する。その結果,一致したらゼロ・フラグをON(1)にする。 [入力] IZ: サーチ開始アドレス $2: セカンド・コード [出力] $1: 07H $2: セカンド・コード FLG: ゼロ・フラッグ 1@一致/0@不一致 IZ: 最初に見つけたコードのアドレス+2@Z=1/不変@Z=0 内容が破壊されるレジスタ $0 ☆同一系列のルーチン FC06 00EBH(235) $1=06H FC05 00EDH(237) $1=05H FC04 00EFH(239) $1=04H で,他はFC07と全く同じ。このルーチンはBASIC命令の判定に用いられる。 |
SCF2F | 00BBH (187) | NEXTCを実行後,$0の値と$1(=2FH)が一致したら,ゼロ・フラグをON(1)にする。 [入力] IZ: サーチ開始アドレス [出力] $0: スペースでない最初のコード $1: 2FH FLG: ゼロ・フラッグ 1@($0)=($1)/0@($0)<>($1) IZ: 最初に見つけたコードのアドレス+1@Z=1/不変@Z=0 ☆同一系列のルーチン SCF3A 00BDH(189) $1=3AH SCF22 00BFH(191) $1=22H SCF40 00C1H(193) $1=40H SCF2C 00C3H(195) $1=2CH SCF28 00C5H(197) $1=28H SCF29 00C7H(199) $1=29H SCF2D 00C9H(201) $1=2DH SCF3B 00CBH(203) $1=3BH SCF23 00CDH(205) $1=23H SCF2E 00CFH(207) $1=2EH SCFXX 00D1H(209) $1=直前自分で入力した値 で,他はSCF27と全く同じ。 |
SCE3B | 00D7H (215) | NEXTCを実行後,$0の値と$1(=3BH)が一致したら,ゼロ・フラグをON(1)にする。一致しなかったら,SNerrとなる。 [入力] IZ: サーチ開始アドレス [出力] FLG: ゼロ・フラッグ 1@($0)=($1)/0@($0)<>($1) Z=1のとき $0: スペースでない最初のコード $1: 3BH(";") IZ: 最初に見つけたコードのアドレス+1 Z=0のとき SNerr ☆同一系列のルーチン SCE24 00D9H(217) $1=24H SCE2C 00DBH(219) $1=2CH SCE2D 00DDH(221) $1=2DH SCE29 00DFH(223) $1=29H SCE28 00E1H(225) $1=28H SCF3D 00E3H(227) $1=3DH SCEXX 00E5H(229) $1=直前自分で入力した値 で,他はSCE3Bと全く同じ。 |
TCAPS | 00B6H (182) | $0にあるアルファベット小文字コードをアルファベット大文字コードへ変換する。アルファベット小文字コード以外の場合,変換しない。 [入力] $0: アルファベット小文字コード [出力] $0: アルファベット大文字コード |
CHEXI | 009DH (157) | $0にあるコードが文字の0から9,A~F,a~f(30H-3H, 41H-46H, 61H-66H)である場合,$0が16進数文字として数値(00H-0FH)に変換する。 [入力] $0: 16進数の文字コード [出力] $0: 16進数変換値(00H-0FH) |
CLEME | 014CH (332) | $0, $1で指定サレタアドレスから,$2, $3で指定されたバイト数分を0クリアする。$2, $3が0の場合,実行しない。 [入力] $0, $1: クリアするスタート・アドレス $2, $3: クリアするバイト数 [出力] IZ: クリアが終了したアドレス+1 $5~$13: 全て0 内容が破壊されるレジスタ $0~$2, $14 |
CLEDB | 9338H (37688) | BANK1のEDTOP(113BH-123BH), LEDTP(123CH-153BH)の内容を0クリアし,各ポインタをCLSにセットする。 [出力] IX: EDCSR(1101H)の内容 IZ: MOEDB(1105H)の内容 内容が破壊されるレジスタ $0~$14 |
DOTDS | 930FH (37647) | DSPMD(1109H)の内容にしたがって,全画面表示を行う。LEDTP(123CH-153BH)+SCTOP(1102H)×6から,3行または4行の内容をLCDに転送する。 [入力] DSPMD(1109H)の内容によって,3行か4行かを決定する。 [出力] なし 内容が破壊されるレジスタ $0~$15, IX |
BRSTR | 297AH (10618) | $2, $3の内容をACJMP(165CH, 165DH)に入れる。 [入力] $2, $3: データ [出力] なし 内容が破壊されるレジスタ IX |
CRTKY | 23C8H (9160) | コントラスト・キー実行のKEYサンプル・フロー。BREAKキーはACJMP(165CH, 165DH)で指定されたアドレスへジャンプする。 [入力] なし [出力] $0: キーコード(表4 参照)が入る。 内容が破壊されるレジスタ $1~$11, IX, IZ |
KYCHK | 506EH (20590) | OFF, BREAK, STOPの各キーをチェックする。 [入力] なし [出力] FLG:ゼロ・フラグ=1@STOPキー 内容が破壊されるレジスタ $0~$4 |
BKCK | 29C5H (10693) | OFFキーのチェックおよびBREAKキーのサンプリングを行う。 [入力] なし [出力] なし 内容が破壊されるレジスタ $0~$4 |
OUTCR | 2AE8H (10984) | デバイスに対して,0DH,0AH(CR, LF)を出力する。 [入力] デバイスはOUTDV(1739H)の内容によって決まる。 [出力] なし 内容が破壊されるレジスタ $0~$13, $16, IX |
PROUT | 89A9H (35241) | $16の内容をプリンタに出力する。プリンタに繋がっていない場合,NRerrorとなる。 [入力] $16: プリンタに出力するデータ [出力] なし 内容が破壊されるレジスタ $0~$6, IX |
DTBIN | 1EE6H (7910) | IZで指定されるアドレスに存在するASCIIコードを10進数として数値に変換する。 ・変換結果が65536以上になる場合,OVエラーとなる。 ・数字文字(30H-39H)が存在しない場合,0を返す。 ・数字文字(30H-39H)以外のコードが存在すれば,直ちに終了。このとき,スペースは読み飛ばす。 [入力] IZ: 数値に変換しようとする文字列の先頭のアドレス [出力] IZ: "0"-"9"(30H-39H)以外のデータが存在するアドレス $17, $18: 変換結果の値 内容が破壊されるレジスタ $0~$3, $16 |
BINMZ | 0EFDH (3837) | $10~$18に入っている実数型数値x が-32769 $10~$18: 実数型数値 [出力] $15, $16: 整数型数値 内容が破壊されるレジスタ $10~$14, $17~$18, IX |
BIN01 | 0EC6H (3782) | $10~$18に入っている実数型数値x が 0<=x<256であれば,整数型数値に変換する。範囲外であれば,BSエラーとなる。 [入力] $10~$18: 実数型数値 [出力] $15, $16: 整数型数値 内容が破壊されるレジスタ $10~$14, $17~$18, IX |
BIN11 | 0ECEH (3790) | $10~$18に入っている実数型数値x が 1<=x<256であれば,整数型数値に変換する。範囲外であれば,BSエラーとなる。 [入力] $10~$18: 実数型数値 [出力] $15, $16: 整数型数値 内容が破壊されるレジスタ $10~$14, $17~$18, IX |
BIN02 | 0EE2H (3810) | $10~$18に入っている実数型数値x が 0<=x<65536であれば,整数型数値に変換する。範囲外であれば,BSエラーとなる。 [入力] $10~$18: 実数型数値 [出力] $15, $16: 整数型数値 内容が破壊されるレジスタ $10~$14, $17~$18, IX |
BIN12 | 0EE8H (3816) | $10~$18に入っている実数型数値x が 1<=x<65536であれば,整数型数値に変換する。範囲外であれば,BSエラーとなる。 [入力] $10~$18: 実数型数値 [出力] $15, $16: 整数型数値 内容が破壊されるレジスタ $10~$14, $17~$18, IX |
SIKI | 1088H (4232) | 式(文字式でもよい)を実行し,結果を求める。 ・結果が数値のとき,$10~$18に実数型数値として格納される。 ・結果が文字列のとき,RAMのフリー・エリアに格納され,$15, $16に文字列のスタート・アドレス,$17に文字長が入る。 [入力] IZ: 式が格納されているRAMのスタート・アドレス。式中の予約語(関数など)は内部コードに変換されてなければならない。 [出力] IZ: 式の終わり+1のアドレス ・結果が数値のとき $10~$18: 実数型数値 FLG: キャリーをOFF(0)にする。 ・結果が文字列のとき $15, $16: 文字列のスタート・アドレス $17: 文字列の長さ FLG: キャリーをON(1)にする。 |
EXPRW | 112FH (4399) | 数式を実行し,結果を求める。 [入力] IZ: 式が格納されているRAMのスタート・アドレス。式中の予約語(関数など)は内部コードに変換されてなければならない。 [出力] IZ: 式の終わり+1のアドレス $10~$18: 実数型数値 |
NISIN | 0AFAH (2810) | $17の値がBCD数値として.バイナリ変換する。 [入力] $17: BCD数値 [出力] $17: バイナリ変換値 内容が破壊されるレジスタ $19 |
SIKI2 | 11D2H (4562) | 文字式を実行し,結果を求める。 [入力] IZ: 式が格納されているRAMのスタート・アドレス。式中の予約語(関数など)は内部コードに変換されてなければならない。 [出力] IZ: 式の終わり+1のアドレス $15, $16: 文字列のスタート・アドレス $17: 文字列の長さ |
INKEY | 191DH (6429) | INKEY$のサブルーチン。 [入力] なし [出力] $15, $16: キー入力されたデータ(表5参照)が格納されたアドレス $17: 0@キー入力なし/1@キー入力あり 内容が破壊されるレジスタ $0~$5, $18, IX |
??err | 下記 | BASICのエラー発生。実行後,BASICまたはCALモードの入力待ちになる。 [入力] なし [出力] なし エラー名とそのアドレスは,以下の通り。 LBERR ・・・ 2B5EH (11102)(注1,2) OMERR ・・・ 2B6DH (11117) SNERR ・・・ 2B70H (11120) STERR ・・・ 2B74H (11124) TCERR ・・・ 2B78H (11128) BVERR ・・・ 2B7CH (11132) NRERR ・・・ 2B80H (11136) RWERR ・・・ 2B84H (11140) BFERR ・・・ 2B88H (11144) BNERR ・・・ 2B8CH (11148) NFERR ・・・ 2B90H (11152) FLERR ・・・ 2B94H (11156) OVERR ・・・ 2B98H (11160) MAERR ・・・ 2B9CH (11164) DDERR ・・・ 2BA0H (11168) BSERR ・・・ 2BA4H (11172) FCERR ・・・ 2BA8H (11176) ULERR ・・・ 2BACH (11180) TMERR ・・・ 2BB0H (11184) REERR ・・・ 2BB4H (11188) PRERR ・・・ 2BB8H (11192) DAERR ・・・ 2BBCH (11196) FOERR ・・・ 2BC0H (11200) NXERR ・・・ 2BC4H (11204) GSERR ・・・ 2BC8H (11208) FMERR ・・・ 2BCFH (11215) FDERR ・・・ 2BD3H (11219) OPERR ・・・ 2BD7H (11223) AMERR ・・・ 2BDBH (11227) FRERR ・・・ 2BDFH (11231) POERR ・・・ 2BE3H (11235) DFERR ・・・ 2BE7H (11235) |
BEEP | 33B3H (13235) | BASICのBEEP音を発生。 [入力] なし [出力] なし 内容が破壊されるレジスタ $0~$3 |
ENLST | 508BH (20619) | 内部コードで格納されているBASICプログラムを,IZが指定するアドレスから1行分をASCIIコードに変換し,INTOP(1000H-10FFH)に格納する。 [入力] IZ: 変換するBASICプログラムの行が開始するアドレス [出力] IZ: 次の行の先頭アドレスまたはプログラム・エンド(0) 内容が破壊されるレジスタ $0~$16, IX |
RSOPN | 84ECH (34028) | RS-232Cのハード的なオープンを行う。 ・ボーレートの設定 ・DTR, RTSをONにする。 [入力] $00: オープンのモード=01H@送信/02H@受信/03H@送受信 $11: RS1(1554H)に入れた値 $13: RS3(1556H)に入れた値 このルーチンを呼ぶ前に,ワークエリアのRS1~RS4を設定しておかなければ,正常に動作しない。 [出力] なし 内容が破壊されるレジスタ $0~$6, IX |
RSCLO | 8563H (34147) | RS-232Cのハード的なクローズを行う。 [入力] なし [出力] なし 内容が破壊されるレジスタ $0~$3, IX |
RSGET | 8590H (34192) | RS-232Cの受信バッファから1文字取り出す。バッファが空の時は,データを受信するまで待つ。 ・XON/XOFFを指定していて,XOFFの状態の場合,まずバッファから1文字取り出す。そして残りの文字が32文字以下になれば,XONを送信する。 ・エラーを検出した場合,各エラーにジャンプする。 [入力] なし [出力] $0: 受信データ 内容が破壊されるレジスタ $1~$4, IX |
PRTRS | 85FBH (34299) | $16のデータをRS-232Cで送信する。 ・XON/XOFFを指定していて,XOFFの状態の場合,XONになるまで待つ。 ・SI/SOを指定している場合は,その制御を行う。 [入力] $16: 送信データ [出力] なし 内容が破壊されるレジスタ $0~$4, IX |
NTX | 865CH (34396) | $0の内容をRS-232Cで送信する。 ・XON/XOFF,SI/SOの指定に関係なく,$0の内容を送信する。 [入力] $0: 送信データ UAレジスタの上位2bit=11 [出力] なし |
DOTMK | 977FH (38783) | $10, $11で指定されるEDTOP(113BH-123BH)中のキャラクタが持つドット・パターンを,LEDTP(123CH-153BH)へ作成する。 [入力] $10: スタート・カーソル・アドレス $11: エンド・カーソル・アドレス [出力] なし 内容が破壊されるレジスタ $0~$11, IX, IZ |
上位 4ビット | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | ||
下 位 4 ビ ッ ト |
0 | F.TOP | SPC | 0 | @ | P | ‘ | p | 3√ | Ε | タ | ミ | ENG | P0 | |||
1 | F.END | DEL | ! | 1 | A | Q | a | q | SYSTEM | √ | X2 | ア | チ | ム | TAB | P1 | |
2 | L.TOP | INS | " | 2 | B | R | b | r | CLEAR | hyp | X3 | イ | ツ | メ | MR | P2 | |
3 | # | 3 | C | S | c | s | CONT | SET | ウ | テ | モ | Min | P3 | ||||
4 | $ | 4 | D | T | d | t | RENUM | FACT | エ | ト | ヤ | M+ | P4 | ||||
5 | L.CAN | % | 5 | E | U | e | u | RUN | RAN# | オ | ナ | ユ | M- | P5 | |||
6 | L.END | & | 6 | F | V | f | v | EDIT | π | ヲ | カ | ニ | ヨ | IN | P6 | ||
7 | ' | 7 | G | W | g | w | log | nPr | ァ | キ | ヌ | ラ | OUT | P7 | |||
8 | BS | ( | 8 | H | X | h | x | ln | nCr | ィ | ク | ネ | リ | CALC | P8 | ||
9 | ) | 9 | I | Y | i | y | ex | HEX$ | ゥ | ケ | ノ | ル | ANS | P9 | |||
A | * | : | J | Z | j | z | sin | DEGR | ェ | コ | ハ | レ | |||||
B | HOME | + | ; | K | [ | k | { | cos | DMS | ォ | サ | ヒ | ロ | ||||
C | CLS | → | , | < | L | ¥ | l | | | tan | POL( | ャ | シ | フ | ワ | |||
D | EXE | ← | - | = | M | ] | m | } | sin-1 | REC( | ュ | ス | ヘ | ン | |||
E | ↑ | . | > | N | ^ | n | ~ | cos-1 | &H | ョ | セ | ホ | ゙ | MEMO | |||
F | ↓ | / | ? | O | _ | o | tan-1 | 10x | ッ | ソ | マ | ゚ | LINE | ||||
上位 4ビット | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | ||
下 位 4 ビ ッ ト |
0 | SPC | 0 | P | ‘ | p | ENG | ||||||||||
1 | 1 | A | Q | a | q | ||||||||||||
2 | INS | 2 | B | R | b | r | MR | ||||||||||
3 | OFF | 3 | C | S | c | s | |||||||||||
4 | 4 | D | T | d | t | M+ | |||||||||||
5 | 5 | E | U | e | u | ||||||||||||
6 | 6 | F | V | f | v | IN | |||||||||||
7 | 7 | G | W | g | w | OUT | |||||||||||
8 | BS | ( | 8 | H | X | h | x | CALC | |||||||||
9 | ) | 9 | I | Y | i | y | ANS | ||||||||||
A | * | J | Z | j | z | ALL RESET | |||||||||||
B | + | K | k | MODE | |||||||||||||
C | CLS | → | , | L | l | ||||||||||||
D | EXE | ← | - | = | M | m | |||||||||||
E | ↑ | . | N | ^ | n | MEMO | |||||||||||
F | ↓ | / | O | o | LINE | ||||||||||||
1-4. キー・マトリックス
表6 にFX-870Pのキー・マトリックスを示す。キーの取得には,まずIAレジスタに取り込みたいキーのある出力指定値("6"ならば7)を代入して,
キーが押下されていれば,KYレジスタの対応するビットが1になる("6"ならば0ビット目が1になる。つまり,KY=0001H)。
2,4,6,8とSPCを同時入力で読み取れるサンプル・プログラムをリスト1に示す。
このプログラムをCALLすると,$0に以下のように結果が入って戻ってくる。
(bit) | |||||||
IAレジスタのキー出力指定値 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
KY レ ジ ス タ の 出 力 ビ ッ ト 位 置 |
0 | |||||||||
1 | ||||||||||
2 | ||||||||||
3 | ||||||||||
4 | ||||||||||
5 | ||||||||||
6 | ||||||||||
7 | ||||||||||
14 | ||||||||||
15 | ||||||||||
ADRS | CODE | LABEL | MNEMONIC | コメント | |
---|---|---|---|---|---|
xx00 | 02 60 1F | KEY: | LD | $0,$31 | ;結果入力レジスタのクリア($31=0) |
xx03 | 57 00 08 | PST | IA,&H08 | ;SPACEのチェック | |
xx06 | 42 01 04 | LD | $1,&H04 | ||
xx09 | 77 2D xx | CAL | SCAN | ||
xx0C | 57 00 06 | PST | IA,&H06 | ;8のチェック | |
xx0F | 42 01 02 | LD | $1,&H02 | ||
xx12 | 77 2D xx | CAL | SCAN | ||
xx15 | 57 00 08 | PST | IA,&H08 | ;2のチェック | |
xx18 | 42 01 02 | LD | $1,&H02 | ||
xx1B | 77 2D xx | CAL | SCAN | ||
xx1E | 57 00 05 | PST | IA,&H05 | ;4のチェック | |
xx21 | 42 01 04 | LD | $1,&H04 | ||
xx24 | 77 2D xx | CAL | SCAN | ||
xx27 | 57 00 07 | PST | IA,&H07 | ;6のチェック | |
xx2A | 42 01 01 | LD | $1,&H01 | ||
xx2D | 18 60 | SCAN: | BIU | $0 | ;$0をビット・アップ |
xx2F | 9F 22 | GRE | KY,$2 | ;マトリックス・キースキャン | |
xx31 | 0C 62 01 | AN | $2,$1 | ;チェックするキーのビットを残してクリア | |
xx34 | F0 | RTN | Z | ;チェックするキーが押されていなければ,戻る | |
xx35 | 0E 60 1E | OR | $0,$30 | ;最下位ビットを立てる($30=1) | |
xx38 | F7 | RTN | |||
ADRS | CODE | LABEL | MNEMONIC | コメント | |
---|---|---|---|---|---|
xx2D | 18 60 | SCAN: | BIU | $0 | ;マトリックスキャン |
xx2F | 9F 22 | GRE | KY,$2 | ;ダミー入力 | |
xx31 | 9F 24 | GRE | KY,$4 | ;本入力 | |
xx33 | 81 62 04 | SBCW | $2,$4 | ;キーチェック | |
xx36 | B4 8A | JR | NZ,SCAN | ;押されていなければ戻る。→戻ると,$0が余分にビット・アップするので,結果がおかしくなる!! | |
xx38 | 0C 62 01 | AN | $2,$1 | ;チェックするキーのビットを残してクリア | |
xx3B | F0 | RTN | Z | ;チェックするキーが押されていなければ,戻る | |
xx3C | 0E 60 1E | OR | $0,$30 | ;最下位ビットを立てる($30=1) | |
xx3F | F7 | RTN | |||
FX-870P/VX-4には,日立のHD61700という8-bit CPUが使われている。このCPUは,以下のレジスタを持つ(図2)。
なお,詳細は「HD61700クロス・アセンブラ」の「2-2.レジスタ構成」などを参照のこと。
ADRS | CODE | LABEL | MNEMONIC | コメント | |
---|---|---|---|---|---|
xxxx | 56 60 54 | PST | UA,&H54 | ;バンク0に切り替え | |
xxxx | F7 | RTN | ;RETURN | ||
ADRS | CODE | LABEL | MNEMONIC | コメント | |
---|---|---|---|---|---|
0000 | D1 11 0F 93 | LDW | $17,&H930F | ;DOTDS(全画面表示)のアドレス | |
0004 | 77 0B 00 | CAL | RMCLL | ;ROMコールの実行 | |
0007 | 56 60 54 | PST | UA,&H54 | ;PCのBANKを0に切り替え指定 | |
000A | F7 | RTN | ;BASICに戻る | ||
000B | D1 0F 23 53 | RMCLL: | LDW | $15,&H5323 | ;ROMコール・ルーチン |
000F | A6 10 | PHSW | $16 | ;&H5323をシステムスタックにPUSH | |
0011 | 56 60 54 | PST | UA,&H54 | ;PCのBANKを0に切り替え指定 | |
0014 | DE 11 | JP | $17 | ;BIOSコール | |
ADRS | CODE | LABEL | MNEMONIC | コメント | |
---|---|---|---|---|---|
000B | D1 0F 23 53 | RMCLL: | LDW | $15,&H5323 | ;ROMコール・ルーチン |
000F | A6 10 | PHSW | $16 | ;&H5323をシステムスタックにPUSH | |
0011 | 56 60 54 | PST | UA,&H54 | ;PCのBANKを0に切り替え指定 | |
0014 | DE 11 | JP | $17 | ;BIOSコール | |
ADRS | CODE | LABEL | MNEMONIC | コメント | |
---|---|---|---|---|---|
0000 | D1 1C 0F 93 | LDW | $28,&H930F | ;DOTDS(全画面表示)のアドレス | |
0004 | 77 0B 00 | CAL | RMCLL | ;ROMコールの実行 | |
0007 | 56 60 54 | PST | UA,&H54 | ;PCのBANKを0に切り替え指定 | |
000A | F7 | RTN | ;BASICに戻る | ||
000B | RMCLL: | ;ROMコール・ルーチン | |||
000B | 56 60 54 | PST | UA,&H54 | ;PCのBANKを0に切り替え指定 | |
000E | 37 21 53 | JP | &H5321 | ; | |
AD | $2, $SX | ;特定レジスタによる$30(=1)のインダイレクト指定。メインレジスタ指定より1バイトコードが短くできる。 | |
AD | $2, $1 | ;ここでは,$1=1とする | |
AD | $2, 1 | ;イミディエット値 1によるインクリメント | |
LD | $2, $SY | ;特定レジスタによる$31(=0)のインダイレクト指定。メインレジスタ指定より1バイトコードが短くできる。 | |
LD | $2, 0 | ;イミディエット値 0の代入 | |
XR | $2, $2 | ;自分自身の排他的論理和。 | |
LDW | $0, $SY | ;特定レジスタによる$31(=0)のインダイレクト指定。メインレジスタ指定より1バイトコードが短くできる。 |
XRW | $2, $2 | ;ワードでの自分自身の排他的論理和。 |
2つの隠し命令が見つかった。
①MODE命令
文法は,
MODE 引数1(引数2)
で,引数1の値によって機能が分かれる。
10, 11: PJ 1991年7月号の『FX-870P解析詳細』では不明だったが,MODE10で四則演算後に丸め処理を行い,MODE11で丸めを行わないようになる。
110: BANK1にある機械語プログラムをCALLする。引数2はアドレス。
200,201: FDのセクタのREAD,WRITE命令。引数2は(トラック, サーフェイス, セクタ)で,トラックは0-79,
サーフェイスは0-1,セクタは1-8である。どちらがREADかは不明。
②CALCJMP命令
引数なしの命令で,CALCキーを押したのと同じで,INキーで入力した計算式を実行する。
ただし,CALモードでしか実行できず,BASICモードではFCerrorとなる。
P0~F9のプログラムおよびC, CASLのソースファイルを格納できる(テキスト)ファイルエリアのファイルは,システムエリアのP0STT~F9STTに
それぞれのデータの格納される先頭番地が格納されている。プログラム(BASIC)の終端コードは00H,ファイルの終端コードは1AHであり,どちらも最低1バイトは消費し,
全部で20バイトは消費するようになっている。また,VX-4のマニュアルではファイルエリアから全21バイトが引かれたものをユーザーエリアとしており,メモリの最後の1バイトは消費
されないようである。ファイルの終端コード 1AH は,多くのOSでファイルの終端コード(EOF; End Of File)として使われていて有名である。
また,各ファイルの間に,無駄なデータが発生しないように,メモリー・ブロック転送とP1STT~MEMENの変更をシステムが自動的に行っている。
ただし,P0STTはユーザーがCLEAR文等を行わない限り変更されず,システム側が勝手に変更することはない。
プログラムエリアのP0~P9には,BASICのプログラムが格納され,BASICのプログラム方式はPB-100と全く同じ。
リスト5のBASICサンプル・プログラムは,表7のように格納される。
各行は,行の長さ(1byte), 行番号(2byte), スペース(1byte), BASICコード(可変長),行終端コード(1byte)で構成される。
行の長さは,行番号~行終端コードの総バイト数で,これが0の場合,プログラムの終了を表す。行番号は,リトル・エンディアンの2バイトである。
スペースは,行番号とBASICコードの間にある空白であり,&H20で固定。BASICコードは,予約語がビッグ・エンディアンの2バイトの内部コードに変換された文字列である。
予約語には,処理先ありと関数のように処理先のない予約語があり,それぞれ表8, 9にそれぞれの内部コードを示す。行終端コードは0で固定である。
|
|
| ||||||||||
|
|
プログラムの実行・CALモード等で変数を使ったとき,変数テーブルにまだ登録されていない,すなわち,初めて使った数値変数・文字変数は,BASICのシステムによって自動登録され,実体化される。
また,配列変数はBASICシステムが自動的に実体化できず,DIM文でユーザーが意図的に宣言して実体化させる必要がある(恐らく,無駄なメモリ消費防止のため)。
以上のようにして,BASICのワークエリアに実体化・格納された状況を図3 に示す。
変数の種類 | 変数テーブル使用量 (byte) | データ格納先 | データ格納サイズ (byte) |
---|---|---|---|
数値変数 | (変数名の文字数)+4 | 数値データエリア | 8 |
配列数値変数 | 1+(次元数)×2+(配列要素数)×8 | ||
文字変数 | 文字変数データエリア | (代入した文字列の文字数)+1 | |
配列数値変数 | 1+(次元数)×2+(配列要素数)+(全配列要素で代入した文字列の文字数) | ||
|
| |||||||||
カシオのポケコンは,論理演算などの一部を除いて,数値計算はBCD浮動小数点データで計算を行い,
全ての数値変数・配列数値変数はBCD 浮動小数点データとして格納されている。
PB-1000のBCD 浮動小数点フォーマットと内部格納形式は,ポーランドのPiotor Piatek氏によって説明されている(文献(14))。
しかし,説明不足なところもあり理解しにくいところもあるので,ここで説明する。
まず,結論を言うと,数値データのデータ格納形式は,
DIUW | $7 | ;Digit Up of ($8, $7) pair | |
OR | $6, $7 | ;$6 <- $6 or $7, where the upper digit of $7 and the lower one are equal to (e0) and zero respectively. | |
LD | $7, $8 | ;$7 <- $8 | |
LD | $8, $7 | ;$8 <- $7 | |
LD | $7, $6 | ;$7 <- $6 | |
DIDW | $8 | ;Digit Down of ($8,$7) | |
AN | $6,&H0F | ;clear the upper digit of $6 | |
PHUM | $7, 8 | ;PushH User-stack Multibyte for ($7,・・・,$0) | |
PHU | $8 | ;PusH User-stack for $8 | |
PPU | $8 | ;PoP User-stack for $8 | |
PPUM | $0, 8 | ;PoP User-stack Multibyte for ($7,・・・,$0) | |
LDW | $7, $6 | ;($8,$7) <- ($7,$6) |
PHU | $8 | ;PusH User-stack for $8 | |
PHUM | $7, 8 | ;PushH User-stack Multibyte for ($7,・・・,$0) | |
今回,FX-870P / VX-4 の内部情報を独自に調べるため,幾つかのプログラムを作って調査を行った。 以下に,主要なプログラムのリスト,プログラムの簡単な解説と使い方を説明する。 このようなプログラムは,本来,不必要であるが,ファイルへの出力など,一部,参考になるだろう。
リスト B-1. CHKPFAV4.BAS | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
リスト B-2. OUTWRKV4.BAS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
100 ' CHKAV4.BAS |
110 ' check A, numerical variable |
120 ' to inspcet the inner represenation |
130 ' for FX-870P,VX-4 |
140 ' programmed by 123 |
150 ' since 28th,Oct.,2010 |
200 AD=&H18A1 |
210 DTTB=PEEK(AD)+PEEK(AD+1)*256 |
220 AD=&H18A3 |
230 TSDT=PEEK(AD)+PEEK(AD+1)*256: 'TOSDT |
240 ' |
250 FOR AD=DTTB TO TSDT-1 |
260 IF PEEK(AD)=&H28 AND PEEK(AD+1)=1 AND PEEK(AD+2)=&H41 THEN 310 |
270 NEXT |
280 PRINT "Failed to find var A!" |
290 END |
300 ' |
310 AD=PEEK(AD+3)+PEEK(AD+4)*256 |
320 PRINT "A= ";A |
330 FOR II=0 TO 7 |
340 PRINT RIGHT$(HEX$(PEEK(AD+II)),2);" "; |
350 NEXT |
360 PRINT |
370 END |
380 ' end of program |
100 ' CHKAZ1.BAS |
110 ' check A, numerical variable |
120 ' to inspcet the inner represenation |
130 ' for FX-890P,Z-1 |
140 ' programmed by 123 |
150 ' since 28th,Oct.,2010 |
200 AD=&H196F |
210 PRINT "A= ";A |
220 FOR II=0 TO 7 |
230 PRINT RIGHT$(HEX$(PEEK(AD+II)),2);" "; |
240 NEXT |
250 PRINT |
260 END |
270 ' end of program |