PC-1262 内部解析
はじめに
本稿はシャープ ポケットコンピュータ PC-1262のアーキテクチャに関して書籍およびWEBから収集した情報を整理したものに、筆者の独自解析結果を一部加えたものである。
2019年現在において失われつつあるこれらの情報を再度集積し、保管することを目的として作成した。
ROMバージョンについて
参考文献[1]によればPC-1260/PC-1261/PC-1262には3種類のROMバージョンがあり,アドレス$F200の値によって判別することができる。
| $F200の値 | 備考 |
|---|---|
| $C3 | |
| $22 | |
| $54 | 最後期型?PC-1262が該当 |
筆者の手元にある実機が($F200)==$54のPC-1262のみであるため,他のバージョンについての検証を行っていない。ただしPC-1262がPC-1261よりも後に出た価格改定版という経緯から考え,PC-1262であればROMバージョン$54であることがほぼ確実と思われる。
参考文献[2]によればHELP機能のNEXTの使用例がFOTとなっているバージョンが存在するようである。$C3が該当バージョンではないかと想像するものの確認できていない。参考までに$54のNEXTのオンラインHELPを示す。
FOR N=1 TO 5
NEXT N
メモリマップ
アドレス空間
よく知られたことだがPC-1262のCPU ESR-H(SC61860)にはプログラムカウンタがアクセスできる通常のRAM・ROMのアドレス空間64KBと内部RAM 96バイトの二つのアドレス空間がある。周辺デバイスのうちLCDのVRAMのみが通常アドレス空間にマップされ,その他が内部RAMにマップされている。
RAM・ROMメモリマップ
バージョン($F200)==$54
| アドレス | 内容 |
|---|---|
| 0000~1FFF | 内部ROM (8KB) |
| 2000~20BF | VRAM (DISP1) |
| 2800~28BF | VRAM (DISP2) |
| 3000~20BF | VRAM (DISP1 image) |
| 3800~38BF | VRAM (DISP2 image) |
| 4000 | (RAM先頭) |
| 4080~64FF | フリーエリア |
| 6500~65CF | 固定変数エリア |
| 65D0~65FF | リザーブ・エリア |
| 6650~667F | プリント・バッファ |
| 66DB~66DD | CALL文用ジャンプポインタ |
| 66E1~66E2 | BASICプログラム先頭アドレス・ポインタ |
| 66E3~66E4 | BASICプログラム終了アドレス・ポインタ |
| 66F7 | ストリングバッファ・ポインタ |
| 66FC~66FD | 変数ポインタ |
| 6760~67AF | ストリングバッファ・エリア |
| 67FF | (RAM末尾) |
| 6800~7FFF | (未実装) |
| 8000~8044 | ジャンプテーブル(IOCS?) |
| 8045~8391 | フォント |
| A43B~A6B1 | 中間コードテーブル? |
| ~FFFF | (ROM) |
内部RAM
機種違いだが,参考文献[3]がわかりやすい。アドレス$4~$7の外部RAMポインタを参考文献[1]などでX,Yとしているが,システム・サブルーチンの使用する演算レジスタX,Yとの混同を避けるため本稿ではIX,IYと呼称する。
| アドレス | 内容 |
|---|---|
| 0 | I カウンタ |
| 1 | J カウンタ |
| 2 | A アキュムレータ |
| 3 | B アキュムレータ |
| 4~5 | IX 読み込み用 外部RAMポインタ |
| 6~7 | IY 書き込み用 外部RAMポインタ |
| 8 | K 汎用レジスタ |
| 9 | L 汎用レジスタ |
| A | M 汎用レジスタ |
| B | N 汎用レジスタ |
| C~F | 汎用RAM |
| 10~17 | 演算レジスタX |
| 18~1F | 演算レジスタY |
| 20~27 | 演算レジスタZ |
| 28~2F | 演算レジスタW |
| 3A~3D | 行番号サーチの結果 |
| ~5B | スタック |
| 5C | IA I/Oポートレジスタ |
| 5D | IB I/Oポートレジスタ |
| 5E | FO I/Oポートレジスタ |
| 5F | OUTC コントロールポートレジスタ |
システム・サブルーチン
システム・サブルーチン一覧
参考文献[1]より
| 機能 | ($F200) ==$C3 |
$22 | $54 |
|---|---|---|---|
| 印字ルーチンへ入る | 0975 | 0975 | 0975 |
| 印字ルーチンを抜ける | 097F | 097F | 097F |
| (印字)データセット | 9E3A | A09C | A282 |
| (2変数)加算 | 860F | 87CA | 88AE |
| (2変数)減算 | 8626 | 87E1 | 88C5 |
| (2変数)乗算 | 8630 | 87EB | 88CF |
| (2変数)除算 | 863A | 87F5 | 88D9 |
| (2変数)べき乗算 | 8643 | 87FE | 88E2 |
| (1変数)EXP | 8659 | 8814 | 88F8 |
| (1変数)SIN | 8667 | 8822 | 8906 |
| (1変数)COS | 866E | 8829 | 890D |
| (1変数)TAN | 8675 | 8830 | 8914 |
| (1変数)ASN | 867C | 8837 | 891B |
| (1変数)ACS | 8683 | 883E | 8922 |
| (1変数)ATN | 868A | 8845 | 8929 |
| (1変数)DEG | 8698 | 8853 | 8937 |
| (1変数)DMS | 869F | 885A | 893E |
| (1変数)ABS | 8C52 | 8E26 | 8F0D |
| (1変数)INT | 8C2E | 8E02 | 8EE9 |
| (1変数)SGN | 86AD | 8868 | 894C |
| (1変数)RND | 86A6 | 8861 | 8945 |
| (1変数)SQR | 8660 | 881B | 88FF |
| (1変数)LOG | 8652 | 880D | 88F1 |
| (1変数)LN | 864A | 8805 | 88E9 |
| ASC | 87B0 | 8984 | 8A68 |
| CHR$ | 87CF | 89A3 | 8A87 |
| STR$ | 882C | 8A00 | 8AE4 |
| VAL | 888A | 8A5E | 8B42 |
| (比較・数値)<> | 87A1 | 8975 | 8A59 |
| (比較・数値)< | 872E | 88EE | 89D2 |
| (比較・数値)> | 8749 | 891D | 8A01 |
| (比較・数値)= | 878D | 8961 | 8A45 |
| (比較・数値)≦ | 86CC | 8887 | 896B |
| (比較・数値)≧ | 86D9 | 8894 | 8978 |
| (比較・文字)<> | 879C | 8970 | 8A54 |
| (比較・文字)< | 86E1 | 889C | 8980 |
| (比較・文字)> | 86E3 | 889E | 8982 |
| (比較・文字)= | 8751 | 8925 | 8A09 |
| (比較・文字)≦ | 8770 | 897E | 8A62 |
| (比較・文字)≧ | 86C7 | 8882 | 8966 |
| 表示ON | 043B | 043B | 043B |
| 表示OFF | 0437 | 0437 | 0437 |
| 全画面表示 | CB0B | CE2E | D0F3 |
| プリントバッファクリア | 1B2F | 1B2F | 1B2F |
| キースキャン | 03C1 | 03C1 | 03C1 |
| 10進→2進変換 負号あり | 13D2 | 13D2 | 13D2 |
| 10進→2進変換 負号なし | 13DD | 13DD | 13DD |
| 2進→10進変換 負号あり | 10E7 | 10E7 | 10E7 |
| 2進→10進変換 負号なし | 10E0 | 10E0 | 10E0 |
| 行番号 サーチ 2進表現 | B411 | B6DB | B8ED |
| 変数のアドレスサーチ 単純変数 |
1865 | 1865 | 1865 |
| 変数のアドレスサーチ 配列変数 |
157A | 157A | 157A |
参考文献[1]にないもの
| 仮称 | 機能 | ($F200)==$54 |
|---|---|---|
| _MOVE_IY_BA | レジスタBAをIYにコピー | 0222 |
| _MOVE_IX_BA | レジスタBAをIXにコピー | 0225 |
| _LOAD_IX_FONT | フォントアドレスをIXにセット | 135F |
| _PRINT | 全画面表示 | 800F |
全般的にJ=1を前提とした処理があるので注意。
システム・サブルーチン詳細
_PRINT
アドレス
$800F
機能
全画面表示
入力
$6650~$667F (プリント・バッファ)
出力
$2000~$203B,$2040~$207B,$2800~$283B,$2840~$287B (VRAM)
破壊
少なくともA,B,P,Q,I,IX,IY,K,L,DP
前提
J=1,M=?
解説
プリント・バッファに書き込まれた文字列を画面表示する。参考文献[1]に記載の$D0F3ではうまくいかない。(以下のサンプルコードの20行目をCALL &D0F3とすることで確認できる)
$D225からのルーチンで内部RAM $0A(レジスタM)と表示文字が一致した場合に何らかの処理を行っているが,内容を追い切れていない。M=0としておくのが無難と思われる。
サンプルコード
10:FOR I=0 to 47: POKE (&D6650+I),(&41+I): NEXT I
20:CALL &800F: CALL &043B
30:FOR I=0 TO 500: NEXT I
備考
解析の便のため,調査した呼び出し順序を以下に示す。
$800F → $D1D4 (BA=$2000,$2080,$2040,$2840を順次セット) → $D205 (VRAMへの書き込み,DXL/IYSを5回繰り返す) → $D225 → $135F ( _LOAD_IX_FONT )
_LOAD_IX_FONT
アドレス
$135F
機能
フォントアドレスをIXにセット
入力
A
出力
IX
破壊
P,Q,I
前提
J=1
解説
アキュムレータAの内容を文字コードとしてフォントアドレスを計算し,IXに格納する。文字コード$20~に対応するフォントが$8045~にある。
_MOVE_IY_BA
アドレス
$0222
機能
アキュムレータBAをIYにコピー
入力
BA
出力
IY
破壊
P,Q,I
前提
J=1
実装
LP $06
LIQ $02
MVB
解説
アキュムレータBAの値を書き込み用外部RAMポインタIYに代入するマクロ。J=1でなければ正常動作しないはずなので注意。本ルーチンを引数固定で呼び出すルーチンがいくつかあるので,下表に示す。
| アドレス | 機能 |
|---|---|
| $0242 | IY=BA-1 |
| $023E | BA=$67B0,IY=$67B0-1 |
| $0246 | BA=$2080,IY=$2080-1 |
_MOVE_IX_BA
アドレス
$0225
機能
アキュムレータBAをIXにコピー
入力
BA
出力
IX
破壊
P,Q,I
前提
J=1
実装
LP $04
LIQ $02
MVB
解説
アキュムレータBAの値を読み込み用外部RAMポインタIXに代入するマクロ。J=1でなければ正常動作しないはずなので注意。本ルーチンを引数固定で呼び出すルーチンがいくつかあるので,下表に示す。
| アドレス | 機能 |
|---|---|
| $022E | IY=BA-1 |
| $022A | BA=$67B0,IY=$67B0-1 |
| $0232 | BA=$6650,IY=$6650-1 |
| $0238 | BA=$2080,IY=$2080-1 |
各種テーブル
ジャンプテーブル
IOCSと呼ぶ人もいるようだが?
| アドレス | 飛び先 | 機能 |
|---|---|---|
| 8000 | 8930 | |
| 8003 | 8D2F | |
| 8006 | AC85 | |
| 8009 | 879D | |
| 800C | D690 | |
| 800F | D1D4 | 全画面表示 |
| 8012 | A92C | |
| 8015 | AADC | |
| 8018 | D702 | |
| 801B | 9062 | |
| 801E | 8FBD | |
| 8021 | A305 | |
| 8024 | 04B4 | |
| 8027 | 04B6 | |
| 802A | 0516 | |
| 802D | 0518 | |
| 8030 | 054E | |
| 8033 | 0550 | |
| 8036 | 9AF2 | |
| 8039 | 8BFF | |
| 803C | 8C83 | |
| 803F | 8C32 | |
| 8042 | CF55 |
中間コードテーブル
マーク(下位ニブルが文字数),予約語,中間コード,アドレス となっている
| 予約語 | 中間コード | アドレス | マーク |
|---|---|---|---|
| AREAD | E1 | C41F | B5 |
| AND | A1 | 8781 | A3 |
| ABS | 99 | 8781 | A3 |
| ATN | 9F | 8781 | A3 |
| ASN | 9D | 8781 | A3 |
| ACS | 9E | 8781 | A3 |
| ASC | A4 | 8781 | A3 |
| BEEP | C4 | C147 | B4 |
| CONT | B2 | C4C4 | F4 |
| CLEAR | C9 | C17B | C5 |
| CLOAD | B7 | 9695 | E5 |
| CSAVE | B6 | 9513 | C5 |
| COS | 96 | 8781 | E3 |
| CHR$ | A8 | 8781 | A4 |
| CALL | CC | C191 | A4 |
| CLS | CE | C0FA | E3 |
| CHAIN | E5 | 963C | A5 |
| CURSOR | CF | C10C | A6 |
| DIM | CB | BD7B | B3 |
| DEGREE | C1 | C3A8 | E6 |
| DEG | 9B | 8937 | E3 |
| DMS | 9C | 893E | A3 |
| DATA | DC | C41F | A4 |
| END | D8 | C324 | B3 |
| EXP | 93 | 8781 | A3 |
| EQU# | B9 | C624 | 84 |
| FOR | D5 | BE0F | D3 |
| GOTO | C6 | BFC4 | B4 |
| GOSUB | E0 | BFFA | E5 |
| GRAD | C3 | C3B8 | A4 |
| INPUT | DF | C4E5 | F5 |
| IF | D4 | C29D | E2 |
| INT | 98 | 8781 | A3 |
| INKEY$ | AD | 8781 | A6 |
| LIST | B4 | C596 | D4 |
| LLIST | B5 | C7D6 | C5 |
| LPRINT | E2 | C786 | C6 |
| LOG | 92 | 8781 | A3 |
| LN | 91 | 8781 | A2 |
| LET | D6 | C066 | A3 |
| LEN | A6 | 8781 | A3 |
| LEFT$ | AB | 8781 | 85 |
| MEM | AF | 8781 | D3 |
| MEM# | BA | 8781 | C4 |
| MID$ | AA | 8781 | C4 |
| MERGE | B8 | 96BD | C5 |
| NEXT | D9 | BEB2 | D4 |
| NOT | A3 | 8781 | A3 |
| NEW | B1 | BC72 | A3 |
| ON | D3 | C3C0 | F2 |
| OR | A2 | 8781 | A2 |
| DE | C6E1 | B5 | |
| PASS | B3 | C437 | E4 |
| PI | AE | 8781 | C2 |
| PEEK | A7 | 8781 | C4 |
| POKE | CD | C1AE | A4 |
| PAUSE | DD | C348 | E5 |
| RUN | B0 | BD07 | B3 |
| RETURN | E3 | C2D6 | C6 |
| READ | DB | C1EF | A4 |
| RESTORE | E4 | C26D | A7 |
| RND | A0 | 8781 | A3 |
| RANDOM | C0 | C0F7 | A6 |
| RIGHT$ | AC | 8781 | E6 |
| RADIAN | C2 | C3B0 | C6 |
| REM | D7 | C2CF | E3 |
| STOP | DA | C33C | B4 |
| SQR | 94 | 8781 | A3 |
| SIN | 95 | 8781 | A3 |
| SGN | 9A | 8781 | A3 |
| STR$ | A9 | 8781 | A4 |
| STEP | D1 | 0FC1 | A4 |
| THEN | D2 | 0FC1 | F4 |
| TAN | 97 | 8781 | E3 |
| TRON | C7 | C340 | A4 |
| TROFF | C8 | C344 | E5 |
| TO | D0 | 0FC1 | E2 |
| USING | CA | C5F8 | F5 |
| VAL | A5 | 8781 | F3 |
| WAIT | C5 | C384 | 94 |
フォントROM
$8045~
抜けは詰められている
その他
CALL文用ジャンプポインタ
$66DBに$79(JP命令),$66DC~$66DDにCALL文の引数(飛び先)が入る。
CALL文の内部でCALL $66DBとして間接コールを実現している。
リロケータブルプログラムの間接ジャンプに活用可能。
参考文献
- シャープポケットコンピュータ機械語マニュアル,シャープ株式会社 工学社企画・編集,工学社,1986
- PC-1261の小技:マイブーム,Jimmy, http://cyndi.cocolog-nifty.com/blog/2007/07/pc1261_4ea9.html ,2019/01 閲覧
- ポケコン SHARP PC-1401 SC61860 機械語資料,VisualBasist, http://gojigen.myhome.cx/SC61860.html ,2019/01 閲覧
- ポケコンマシン語入門,I/O編集部 編著,工学社,1984