PB-Prog > 資料 FX-870P 解析情報



以下の内容は、株式会社工学社のポケコン・ジャーナルの一部を抜粋したものです。
本ドキュメントについて株式会社工学社、カシオ計算機株式会社に問い合わせる事は、ご遠慮下さい。

1.メモリマップ

FX-870Pは、4つのメモリ・バンク(64KB×4)をもっています。
全体的なメモリ・マップを以下に示します。

バンク0
アドレス 説明
0000H 〜 0BFFH HD61700 内蔵ROM
0C00H 〜 FFFFH システムROM (BASIC,C,CASL)

バンク1
アドレス 説明
0000H 〜 0FFFH 未使用RAM
1000H 〜 1CCFH システムエリア
1CD0H 〜 7FFFH 標準RAM
8000H 〜 FFFFH 増設RAM用空きエリア

バンク2
アドレス 説明
0000H 〜 053FH 標準キャラクタ・フォント
0540H 〜 ????H 海外向けキャラクタ・フォント
????H 〜 0A7FH 不明
0A80H 〜 ????H BASICエラーメッセージテーブル
????H 〜 0BA7H 不明
0BA8H 〜 0EA7H BASICコマンド・テーブル
0EA8H 〜 13F6H 不明
13F7H 〜 2738H F・COM,CASL,FX システムメッセージ用データエリア
2739H 〜 27D3H 不明
27D4H 〜 2AD8H ROMチェックプログラム用データエリア
2AD9H 〜 2E1DH 未使用
2E1EH 〜 38C3H 3Pinでの通信用BASICプログラム等
38C4H 〜 3BCAH C言語コマンドテーブル
3BCBH 〜 4247H 未使用
4248H 〜 47CEH C言語エラーメッセージテーブル
47CFH 〜 4C9BH 不明
4C9CH 〜 FFFFH 未使用

バンク3
アドレス 説明
0000H 〜 0017H I/O
0018H 〜 7FFFH 未使用
8000H 〜 ????H バス・入出力
????H 〜 FFFFH 未使用
DEFSEG=&H1000 とするとBANK3の8000Hが0000Hになる。



2.システムエリア

マニュアルに書いてあるシステム・エリア0000H〜1CD0Hのうち0000H〜0FFFHは使われていません。
残りの1000H〜1CD0Hについて、以下に示します。

・ラベル名については、PB-1000と基本的に同じものは、カシオPB-1000テクニカルハンドブック(T.H.)と同じです。
・ビット指定のところ (LCDSTS など) は左側が1で右側が0です。真偽の場合は,1が真で0が偽です。

データ
ラベル アドレス バイト数 説明
INTOP 1000 256 中間コード・バッファ
LCDST 1100 1 7 6 5 4 3 2 1 0 (bit)
    | | | | | |
    | | | | | +-- KEY入力時/PRINT
    | | | | +---- カーソル表示イネーブル
    | | | +------ 仮想スクリーン/実スクリーン
    | | +-------- カーソル移動範囲指定
    | +---------- カーソルバー ON/OFF
    +------------ 反転表示 (ON/OFF)
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
7 6 5 4 3 2 1 0 (bit)
  | |
  | +-- カナ
  +---- NONCAPS
KYSTA
1114
1
7 6 5 4 3 2 1 0 (bit)
| | | | | | | |
| | | | | | | +-- 0
| | | | | | +---- 0
| | | | | +------ REPEAT ON/OFF
| | | | +-------- REPEAT イネーブル
| | | +---------- コントラスト
| | +------------ APO 禁止
| +-------------- OFF
+---------------- AC
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
MODED
1132
1133
1134
1
1
1
角度モード(0:DEG/1: RAD/2:GRA)
MODE10・・・0/MODE11・・・1
不明

スクリーン・データ
ラベル アドレス バイト数 説明
CSRDT
EDTOP
LEDTP
1135
113B
123C
6
257
768
カーソル点滅用データ・バッファ
入力バッファ
表示ドット・バッファ
CGRAM 153C 24 FCH〜FFH用表示ドット・パターン

I/Oデータ
ラベル アドレス バイト数 説明
RS1 1554 1 7 6 5 4 3 2 1 0 (bit)
| | | | | | | |
| | | | | | | +-- MT/RS-232C
| | | | | | +---- Odd/Evenパリティ
| | | | | +------ ON/OFFパリティ
| | | | +-------- 7/8データ長
| | | +---------- 1/2ストップ・ビット
0 0 0 ・・・・・・ 9,600ボー (使用確認)
0 0 1 ・・・・・・ 4,800ボー
0 1 0 ・・・・・・ 2,400ボー
0 1 1 ・・・・・・ 1,200ボー
1 0 0 ・・・・・・   600ボー
1 0 1 ・・・・・・   300ボー
1 1 0 ・・・・・・   150ボー
1 1 1 ・・・・・・    75ボー (未確認)
RS2 1555 1 7 6 5 4 3 2 1 0 (bit)
            | |
            | +-- 出力用XOFF中
            +---- 入力用SO中
RS3 1556 1 7 6 5 4 3 2 1 0 (bit)
  | | | | | | |
  | | | | | | +-- SI/SO指定
  | | | | | +---- XON/XOFF指定
  | | | | +------ CTS制御指定
  | | | +-------- DSR制御指定
  | | +---------- CD制御指定
  | +------------ 出力用SO中
  +-------------- 入力用XOFF中
RS4 1557 1 7 6 5 4 3 2 1 0 (bit)
      | | | | |
      | | | | +-- バッファ
      | | | +---- not Ready
      | | +------ オーバーラン
      | +-------- パリティ
      +---------- フレーミング
INTCK 1558 1 01H データ受信
RXCNT 1559 258 RS232C, MT用受信バッファ
        1バイト・・・・・受信バイト数
        1バイト・・・・・入力用ポインタ
        256バイト・・・バッファ

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 パスワード格納エリア(XOR 255で入っている)
CASPN
CPN
168B
168C
1
1
CASL プログラム・ナンバー
C言語 プログラム・ナンバー

168D
168E
1
41
不明
不明
FCOMD



FCOM1
FCOM2
16B7



16B8
16B9
1



1
1
F.COMのDEVICE 000000AB
  AB=00・・・RS-232C
  AB=01・・・DISK
  AB=10・・・MT
F.COM PorF
F.COM 番号

16BA 5 不明
OPTCD
SEGAD
16BF
16C0
1
2
オプション・コード
セグメントの値

16C2 1 不明
SETDA 16C3 1 SET 命令のデータ 00AB####
  E・・・A=1/F・・・B=1/####=BCD桁数
MODE1 16C4 1 確認不可能
MODE2 16C5 1 FX-870Pでは常に0と思われる
MODE3 16C6 1 BASIC実行中(RUN)    01H
BASIC停止中(STOP)   02H
その他              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)
1BIT ON 受信オープン/0BIT ON 送信オープン
PRT ON/OFF (1/0)
プリンタ出力文字数
不明
RS232Cデフォルト値(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
機械語エリアの終了アドレス
文字演算ワーク先頭番地
スタック・フリーエリア先頭番地
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

システムスタック・エリア

ユーザースタック・エリア



3.ROMルーチン

現在までに発見されている使用可能なROMルーチンを示します。
ここで使っているルーチンは、T.H.に出ている分についてはT.H.と同じです。

<<解説> >
最初にラベル名とそのルーチンのスタート・アドレスが書いてあります。ルーチンはすべてバンク0にあります。

【機能】  ・・・機能の概略
【入力条件】・・・引数などの必要な条件
【出力条件】・・・実行後に変更されるレジスタなど

ラベル名
アドレス
NEXTC
0049(73)
【機能】

【入力条件】
【出力条件】
IZで指定されているアドレスからサーチを開始し、スペース (20H) 以外のコードが見つかれば、そのコードを$0に入れる。
IZ・・・・・・ポインタ
IZ・・・・・・$0に入力されたコードが存在するアドレス
$0・・・・・・サーチされたコード
ラベル名
アドレス
ENDSC
003C(60)
【機能】

【入力条件】
【出力条件】
NEXTCを実行した後、$0の内容が0,1,2ならばフラグ・レジスタのキャリーをON(1)にする。
IZ・・・・・・$0に入力されたコードが存在するアドレス
$0・・・・・・サーチされたコード
FLG・・・・・キャリー・フラグ 1 : $0=1,2,3
ラベル名
アドレス
OKNMI
002B(43)
【機能】

【入力条件】
【出力条件】
$0のコードが数値(ASCIIコードの30H〜39H,48〜57) のとき、フラグ・レジスタのキャリーをON(1)にする。
$0・・・・・・チェックしようとするコード
$0・・・・・・コード
FLG・・・・・キャリー・フラグ 1 : 数値
ラベル名
アドレス
OKAMI
00AB(171)
【機能】

【入力条件】
【出力条件】
$0のコードがアルファベット大文字 (A〜Z) のとき、フラグ・レジスタのキャリーをON(1)にする。
$0・・・・・・チェックしようとするコード
$0・・・・・・コード
FLG・・・・・キャリー・フラグ 1 : "A"〜"Z"
ラベル名
アドレス
FC07
00E9(233)
【機能】


【入力条件】

【出力条件】
IZで指定されているアドレスからサーチを開始し、スペース(20H) 以外のコードが見つかれば、そのコードと次のコードの2バイトと$1(=7),$2を比べ一致したらゼロ・フラグをON(1)とする。
IZ・・・・・・ポインタ
$2・・・・・・セカンド・コード
$1・・・・・・07H
$2・・・・・・セカンド・コード
FLG・・・・・ゼロ・フラグ 1:一致 0:不一致
IZ・・・・・・Z=0でIZは不変
Z=1でIZは最初に見つかったコードのあるアドレス+2
内容が破壊されるレジスタ $0
☆同一系列のルーチン
  FC06 00EB(235) $1=06H
  FC05 00ED(237) $1=05H
  FC04 00EF(239) $1=04H
で、ほかはFC07とまったく同じ。このルーチンはBASIC命令の判定に用いられているものです。
ラベル名
アドレス
SCF2F
00BB(187)
【機能】

【入力条件】
【出力条件】
NEXTCを実行後、$0の内容を$1(=2FH)が一致したらゼロ・フラグをON(1)にする。
IZ・・・・・・ポインタ
$0・・・・・・入力されたコード
$1・・・・・・2FH("/")
FLG・・・・・ゼロ・フラグ 1:($0)=($1)
IZ・・・・・・Z=0でIZは不変
        Z=1でIZは$0の内容が見つかったアドレス+1
☆同一系列のルーチン
  SCE3A 00BD(189) $1=3AH
  SCE22 00BF(191) $1=22H
  SCE40 00C1(193) $1=40H
  SCE2C 00C3(195) $1=2CH
  SCE28 00C5(197) $1=28H
  SCE29 00C7(199) $1=29H
  SCE2D 00C9(201) $1=2DH
  SCE3B 00CB(203) $1=3BH
  SCE23 00CD(205) $1=23H
  SCE2E 00CE(207) $1=2EH
  SCEXX 00D1(209) $1は自分で入力
で、ほかはSCF2Cとまったく同じ。
ラベル名
アドレス
SCE3B
00D7(215)
【機能】

【入力条件】
【出力条件】
NEXTCを実行後、$0の内容を$1(=2FH)が一致したらゼロ・フラグをON(1)にする。一致しなかったらSNerrとなる。
IZ・・・・・・ポインタ
FLG・・・・・ゼロ・フラグ 1:($0)=($1)
        Z=1のとき
          $0・・・・・・入力されたコード
          $1・・・・・・3BH(";")
          IZ・・・・・・$0が見つかったアドレス+1
        Z=0のとき
          SNerr
☆同一系列のルーチン
  SCE24 00D9(217) $1=24H
  SCE2C 00DB(219) $1=2CH
  SCE2D 00DD(221) $1=2DH
  SCE29 00DF(223) $1=29H
  SCE28 00E1(225) $1=28H
  SCE3D 00E3(227) $1=3DH
  SCEXX 00E5(229) $1は自分で入力
で、ほかはSCE24とまったく同じ。
ラベル名
アドレス
TCAPS
00B6(182)
【機能】

【入力条件】
【出力条件】
$0にあるアルファベット小文字のコードをアルファベット大文字のコードへ変換する。アルファベット小文字以外のコードは変換しない。
$0・・・・・・アルファベット小文字のコード
$0・・・・・・アルファベット大文字のコード
ラベル名
アドレス
CHEXI
009D(157)
【機能】

【入力条件】
【出力条件】
$0のコードが文字の0〜9,A〜F,a〜f(30H〜39H, 41H〜46H,61H〜66H)である場合、$0の内容をバイナリ・データ(00H〜0FH)に変換する。
$0・・・・・・変換しようとするコード
$0・・・・・・変換されたバイナリ・コード
ラベル名
アドレス
CLEME
014C(332)
【機能】

【入力条件】

【出力条件】
$0,1で指定されたアドレスから、$2,3で指定されたバイト数分を 0クリアする。$2,3の内容が0のときは実行しない。
$0,1・・・・クリアするスタート・アドレス
$2,3・・・・クリアするバイト数
IZ・・・・・・クリアが終了したアドレス+1
$5〜$13・すべて0
内容が破壊されるレジスタ $0〜$2,$14
ラベル名
アドレス
CLEDB
9338(37688)
【機能】

【出力条件】
EDTOP(113BH〜123BH),LEDTP (123CH〜153BH)の内容を0クリアし、各ポインタをCLSにセットする。
IX・・・・・・EDCSR(1101H)の内容
IZ・・・・・・MOEDB(1105H)の内容
内容が破壊されるレジスタ $0〜$14
ラベル名
アドレス
DOTDS
930F(37647)
【機能】


【入力条件】
【出力条件】
全画面表示(DSPMD)
LEDTP(123CH〜153BH)+SCTOP(1102H)×6から、3行または4行分の内容をLCDCに転送する。
DSPMD(1109H)の内容によって、3行か4行かを決定する。
なし
内容が破壊されるレジスタ $0〜$15,IX
ラベル名
アドレス
BRSTR
297A(10618)
【機能】
【入力条件】
【出力条件】
$2,$3の内容をACJMP(165CH,165DH)に入れる。
$2,$3・・・データ
なし
内容が破壊されるレジスタ IX
ラベル名
アドレス
CRTKY
23C8(9160)
【機能】

【入力条件】
【出力条件】
コントラスト・キー実行のKEYサンプル・フロー。
[BREAK]キーは、ACJMP(165CH,165DH)で指定されたアドレスへジャンプする。
なし
$0・・・・・・キーコードが入る。
キーコードについては付表を見てください。
内容が破壊されるレジスタ $0〜$11,IX,IZ
ラベル名
アドレス
KYCHK
506E(20590)
【機能】
【入力条件】
【出力条件】
[OFF],[BREAK],[STOP]の各キーをチェックする。
なし
FLG・・・・・[STOP]キーのときは、フラグ・レジスタのZがON(1)になる。
内容が破壊されるレジスタ $0〜$4
ラベル名
アドレス
BKCK
29C5(10693)
【機能】
【入力条件】
【出力条件】
[OFF]のチェック及び[BREAK]キーのサンプリングを行う。
なし
なし
内容が破壊されるレジスタ $0〜$4
ラベル名
アドレス
OUTCR
2AE8(10984)
【機能】

【入力条件】
【出力条件】
デバイスに対して、0DH,0AHを出力する。(CR/LF)
デバイスはOUTDV(1739H)の内容によって決まる。
なし
内容が破壊されるレジスタ $0〜$13,$16,IX
ラベル名
アドレス
PROUT
89A9(35241)
【機能】

【入力条件】
【出力条件】
$16の内容をプリンタに出力する。プリンタにつながっていない場合は、NRerrorとなる。
$16・・・・・プリンタに出力するデータ
なし
内容が破壊されるレジスタ $0〜$6,IX
ラベル名
アドレス
DTBIN
1EE6(7910)
【機能】




【入力条件】
【出力条件】
IZに指定されるアドレスに存在するASCIIコードをバイナリに変換する。
・変換結果が65536以上になる場合は、OVエラーとする。
・数値(30H〜39H)が存在しない場合は0を返す。
・数値(30H〜39H)以外のコードが存在すれば、直ちに終了する。このときスペースは読み飛ばす。
IZ・・・・・・変換しようとするデータが存在するアドレス
IZ・・・・・・30H〜39H以外のデータが存在したアドレス
$17,18・・バイナリ変換後のデータ
内容が破壊されるレジスタ $0〜$3,$16
ラベル名
アドレス
BINM2
0EFD(3837)
【機能】

【入力条件】
【出力条件】
$10〜$18に入っている実数型数値xが-32769<x<65536であれば整数型数値に変換する。範囲外であれば、BSエラーとする。
$10〜$18・・・・実数型数値
$15,16・・・・・・整数型数値
内容が破壊されるレジスタ $10〜$14,$17〜$18,IX
ラベル名
アドレス
BIN01
0EC6(3782)
【機能】

【入力条件】
【出力条件】
$10〜$18に入っている実数型数値xが0≦x<256であれば整数型数値に変換する。範囲外であれば、BSエラーとする。
$10〜$18・・・・実数型数値
$15,16・・・・・・整数型数値
内容が破壊されるレジスタ $10〜$14,$17〜$18,IX
ラベル名
アドレス
BIN11
0ECE(3790)
【機能】

【入力条件】
【出力条件】
$10〜$18に入っている実数型数値xが1≦x<256であれば整数型数値に変換する。範囲外であれば、BSエラーとする。
$10〜$18・・・実数型数値
$15,16・・・・・整数型数値
内容が破壊されるレジスタ $10〜$14,$17〜$18,IX
ラベル名
アドレス
BIN02
0EE2(3810)
【機能】

【入力条件】
【出力条件】
$10〜$18に入っている実数型数値xが0≦x<65536であれば整数型数値に変換する。範囲外であれば、BSエラーとする。
$10〜$18・・・実数型数値
$15,16・・・・・整数型数値
内容が破壊されるレジスタ $10〜$14,$17〜$18,IX
ラベル名
アドレス
BIN12
0EE8(3816)
【機能】

【入力条件】
【出力条件】
$10〜$18に入っている実数型数値xが1≦x<65536であれば整数型数値に変換する。範囲外であれば、BSエラーとする。
$10〜$18・・・実数型数値
$15,16・・・・・整数型数値
内容が破壊されるレジスタ $10〜$14,$17〜$18,IX
ラベル名
アドレス
SIKI
1088(4232)
【機能】



【入力条件】

【出力条件】
式(文字式でもよい)を実行し、結果を求める。
・結果が数値のとき・・・・・・$10〜$18に実数型数値として格納される。
・結果が文字のとき・・・・・・結果はRAMのフリーエリアに格納される。$15,$16に文字列のスタート・アドレス、$17に文字長が入る。
IZ・・・・・・式が格納されているRAMのスタート・アドレス。式中の予約語(関数など)は内部コードに変換されていなければならない。
IZ・・・・・・式の終わり+1のアドレス
・結果が数値のとき
$10〜$18・実数型数値
FLG・・・・・・フラグ・レジスタのキャリーをOFF(0)にする。
・結果が文字のとき
$15,16・・・結果の文字列のスタート・アドレス
$17・・・・・・文字列の長さ
FLG・・・・・・フラグ・レジスタのキャリーをON(1)にする。
ラベル名
アドレス
EXPRW
112F(4399)
【機能】
【入力条件】

【出力条件】
数式を実行し、結果を求める。結果は実数型数値として、$10〜$18 に入る。
IZ・・・・・・数式が格納されているRAMのスタート・アドレス、式中の予約語(関数など)は内部コードに変換されていなければならない。
IZ・・・・・・・・・・数式の最後+1のアドレス
$10〜$18・・・・実数型数値
ラベル名
アドレス
NISIN
0AFA(2810)
【機能】
【入力条件】
【出力条件】
$17の内容(BCD数値)をバイナリに変換する。
$17・・・・・BCD数値
$17・・・・・バイナリ
内容が破壊されるレジスタ $19
ラベル名
アドレス
SIKI2
11D2(4562)
【機能】


【入力条件】

【出力条件】
文字式を実行し、結果を求める。
結果はRAMのフリー・エリアに格納される。$15,$16に文字列のスタート・アドレス、$17に文字長が入る。
IZ・・・・・・文字式が格納されているRAMのスタート・アドレス。
式中の予約語 (関数など) は内部コードに変換されていなければならない。
IZ・・・・・・式の終わり+1のアドレス
$15,16・・結果の文字列のスタート・アドレス
$17・・・・・文字列の長さ
ラベル名
アドレス
INKEY
191D(6429)
【機能】
【入力条件】
【出力条件】
INKEY$のサブルーチン
なし
$15,$16・・・キー入力されたデータを格納してあるアドレス
$17・・・・・・・0=キー入力なし
          1=キー入力あり
内容が破壊されるレジスタ $0〜$5,$18,IX
ラベル名
アドレス
??ERR
下記
【機能】
【入力条件】
【出力条件】
BASICのエラー発生
なし
なし
実行すると、BASICまたはCALモードの入力待ちになる。
エラー名とそのアドレス
  OMERR 2B6D (11117)
  SNERR 2B70 (11120)
  STERR 2B74 (11124)
  TCERR 2B78 (11128)
  BVERR 2B7C (11132)
  NRERR 2B80 (11136)
  RWERR 2B84 (11140)
  BFERR 2B88 (11144)
  BNERR 2B8C (11148)
  NFERR 2B90 (11152)
  FLERR 2B94 (11156)
  OVERR 2B98 (11160)
  MAERR 2B9C (11164)
  DDERR 2BA0 (11168)
  BSERR 2BA4 (11172)
  FCERR 2BA8 (11176)
  ULERR 2BAC (11180)
  TMERR 2BB0 (11184)
  REERR 2BB4 (11188)
  PRERR 2BB8 (11192)
  DAERR 2BBC (11196)
  FOERR 2BC0 (11200)
  NXERR 2BC4 (11204)
  GSERR 2BC8 (11208)
  FMERR 2BCF (11215)
  FDERR 2BD3 (11219)
  OPERR 2BD7 (11223)
  AMERR 2BDB (11227)
  FRERR 2BDF (11231)
  POERR 2BE3 (11235)
  DFERR 2BE7 (11239)
ラベル名
アドレス
BEEP
33B3(13235)
【機能】
【入力条件】
【出力条件】
BASICのBEEP音を発生
なし
なし
内容が破壊されるレジスタ $0〜$3
ラベル名
アドレス
ENLST
508B(20619)
【機能】

【入力条件】
【出力条件】
内部コードに格納されているBASICプログラムを、IZが指定するアドレスから1行分をASCIIコードに変換し、INTOP(1000H〜10FFH)に格納する。
IZ・・・・・・変換するBASICプログラムの行が始まるアドレス
IZ・・・・・・次の行の先頭アドレスまたはプログラム・エンド
内容が破壊されるレジスタ $0〜$16,IX
ラベル名
アドレス
RSOPN
84EC(34028)
【機能】


【入力条件】







【出力条件】
RS-232Cのハード的なオープンを行う。
・ボーレートの設定
・DTR,RTSをONにする。
$00・・・・・・オープンのモード
         01H=送信オープン
         02H=受信オープン
         03H=送受信オープン
$11・・・・・・RS1(1554H)に入れた値
$13・・・・・・RS3(1556H)に入れた値
このルーチンを呼ぶ前に、ワークエリア(RS1〜RS4)を設定しておかないと正常に動作しない。
なし
内容が破壊されるレジスタ $0〜$6,IX
ラベル名
アドレス
RSCLO
8563(34147)
【機能】
【入力条件】
【出力条件】
RS-232Cのハード的なクローズを行う。
なし
なし
内容が破壊されるレジスタ $0〜$3,IX
ラベル名
アドレス
RSGET
8590(34192)
【機能】




【入力条件】
【出力条件】
RS-232Cの受信バッファから1文字取り出す。バッファが空のときは、データを受信するまで待つ。
・XON/XOFFを指定していて、XOFFの状態の場合には、まずバッファから1文字取り出す。そして残りの文字が32文字以下になればXONを送信する。
・エラーが検出した場合には、各エラーにジャンプする。
なし
$0・・・・・・受信データ
内容が破壊されるレジスタ $0〜$4,IX
ラベル名
アドレス
PRTRS
85FB(34299)
【機能】


【入力条件】
【出力条件】
$16の内容をRS-232Cで送信する
・XON/XOFFを指定していて、現在XOFFの状態のときは、XONになるまで待つ。
・SI/SOを指定している場合は、その制御を行う。
$16・・・・・・送信データ
なし
内容が破壊されるレジスタ $0〜$4,IX
ラベル名
アドレス
NTX
865C(34396)
【機能】

【入力条件】
【出力条件】
$0の内容をRS-232Cで送信する
・XON/XOFFやSI/SOの指定に関係なく、$0の内容を送信する。
$0・・・・・・送信データ UAレジスタの上位2Bit=11
なし
ラベル名
アドレス
DOTMK
977F(38783)
【機能】

【入力条件】

【出力条件】
$10,$11で指定されるEDTOP(113BH〜123BH)中のキャラクタが持つドットパターンを、LEDTP(123CH〜153BH)へ作成する。
$10・・・・・・スタート・カーソル・アドレス
$11・・・・・・ENDカーソル・アドレス
なし
内容が破壊されるレジスタ $0〜$11,IX,IZ

CRTKY (23C8H) のキーコード表
L\H 0 1 2 3 4 5 6 7 8 9 A B C D E F
0
F.TOP SPC 0 @ P ' p PRINT 3√ E
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
*[BRK],[STOP],[OFF],[ALL],[RESET],[CASL], [FX],[C],[MODE],[CONTRAST],[↑↓]の各キーは実行。
 [CAPS],[カナ]は状態変化。

INKEY (191D) のキーコード表
L\H 0 1 2 3 4 5 6 7 8 9 A B C D E F
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
*[BRK]は実行、ACJMPでしめされるアドレスに処理を移す。



4.キー・マトリックス

IAレジスタに取り込みたいキーのある出力指定値("A"ならば7)を代入すると、KYレジスタの対応するビットが1になる。
("A"ならば7ビット目が1,つまり、KY=0080Hとなる。)
FX-870Pのキー・マトリックスを以下に示します。


1 2 3 4 5 6 7 8 9
0
Fx ln hyp ( 9 6 3 E
1
CASL log MR M+ 8 5 2 .
2
SHIFT 7 ENG 4 ANS 1 SPC 0
3
INS O P K L , =
4
U I H J N M
5
CALC T Y F G V B
6
IN OUT E R S D X C
7 BRK OFF MEMO Q W RESET A CAPS Z
14
X2 MODE cos tan CLS / - EXE
15
DEGR sin ) ^ BS * +



5.機械語プログラムの作成方法全般について

5.1.BASICへのリターン方法

ユーザー・プログラムは、バンク1 で動いていますが、BASICに戻るときには、バンク0に処理を移さなければなりません。
よって、プログラムの最後に必ずバンク切り替えが必要です。機械語プログラムの最後には必ず、以下のプログラムを加えてください。

XXXX 56 60 54    PST UA,&H54 ; バンク0に切り替え
XXXX F7          RTN         ; RETURN

5.2.ROMコールの方法

FXでのROMコールは、バンク切り替えの必要があります。$17,18に呼び出したいROMルーチンのアドレスを入れてこのサブルーチンを呼び出してください。

DOTDS(全画面表示)を実行して終了するには、

0000 D1 11 0F 93    LDW $17,&H930F ;DOTDS Address
0004 77 OB 00       CAL &H000BH    ;ROM CALL Sub
0007 56 60 54       PST UA,&H54    ;BANK Change
000A F7             RTN            ;RETURN

                    ;ROMコール用サブルーチン
000B D1 0F 23 53    LDW $15,&H5323
000F A6 10          PHSW $16
0011 56 60 54       PST UA,&H54    ;BANK Change
0014 DE 11          JP ($17)       ;未定義命令です
0014 DE 11          JP $17         ;未定義命令です (※)

$15〜$18を使うサブルーチンは適宜メイン・レジスタを振り替えてください。
(※) ポケコン・ジャーナルでは、'JP ($17)' ですが、最新版の HD61700 CROSS ASSEMBLER (HD61) の仕様に従い、'JP $17' とします。コードの意味は変わりません。HD61700 CROSS ASSEMBLER (HD61) に関しては、HD61700 SPIRITS (外部リンク) をご覧下さい。

$28,$29を固定利用する事を条件にすれば、以下のようにコードの簡略化が可能です。

0000 D1 1C 0F 93    LDW $28,&H930F ;DOTDS Address
0004 77 OB 00       CAL &H000BH    ;ROM CALL Sub
0007 56 60 54       PST UA,&H54    ;BANK Change
000A F7             RTN            ;RETURN

                    ;ROMコール用サブルーチン
000B 56 60 54       PST UA,&H54    ;BANK Change
000E 37 21 53       JP &H5321



参考文献

株式会社工学社ポケコン・ジャーナル 1991年7月号の p.90 "FX-870P 解析詳細"
株式会社工学社 ポケコン・ジャーナル 1991年8月号の p.96 "バグ情報"
HD61700 SPIRITS (http://www.geocities.jp/hd61700lab/)


最終更新日:2013年8月27日
Copyright (C) 2013 T.Matsu