メモリマップ
IOエリア
0x2800 Display RAM
0x3400 Bank Registers
0x3e00 Key Port
システムエリア
0xffd7 BASICプログラム開始アドレス(LOW)
0xffd8 BASICプログラム開始アドレス(HIGH)
0xffd9 BASICプログラム終了アドレス(LOW)
0xffda BASICプログラム終了アドレス(HIGH)
0xfff6 RAM CARDの開始アドレス(LOW)
0xfff7 RAM CARDの開始アドレス(HIGH)
0xfff8 RAM CARDの終了アドレス(LOW)
0xfff9 RAM CARDの終了アドレス(HIGH)
V-RAMマップ
シンボル
0x283c 7 6 CAL 5 RUN 4 PRO 3 AER 2 HYP 1 ( ) 0 BATT
|
0x283d 7 6 5 4 3 DBL 2 SHIFT 1 DEF 0 BUSY |
0x287c 7 6 PRINT 5 STAT 4 MATRIX 3 G 2 RAD 1 M 0 E |
0x287d 7 6 5 4 3 DE 2 SML 1 小 0 カナ |
ROMの吸い出し方法
①内部ROM(0x0000-0x1fff)
内部ROMは直接読み出せないのでMVWP(0x35)命令でユーザーRAM領域に書き出したあとCSAVEMで保存します。
ユーザーRAM領域は容量が少ないので、0x1000バイトずつ分割して保存し、あとで結合します。
こちらのサイトにやり方とツールがあり、使わせてもらってます。
1470Uの場合、こんな感じで実施します。
e200 : 00 03 10 e2 40 84 18 07
e208 : 02 0f 34 02 ff 34 00 01
e210 : 82 13 04 08 90 35 90 db
e218 : 04 26 2f 0d 2f 12 37
e240 : xx xx 00 e3 (xx xxは転送元の開始アドレス)
e300 〜 F2FF (転送先の領域)
e209の0x0fは転送するバイト数を表している。
0-255のループを何回繰り返すかという意味。0-15の繰り返しなので256x16=4096(=0x1000)。
このプログラムを使って、0x0000-0x0fff, 0x1000-0x1fffの2回分やります。
1. POKE &E240,0,0
CALL &E200
CSAVEM &E300,&F2FF
2. POKE &E241,0x10
CALL &E200
CSAVEM &E300,&F2FF
CSAVEMで保存したwavファイルは、先ほどのリンク先にあるツールcload.plにてROMイメージファイルに変換します。
②バンクROM(0x4000-0x7fff)
こっちは非常に面倒臭い!
バンク切り替えはマシン語プログラム動作中しかできない(と思う)ので、
1. バンクを切り替えてバンクデータをユーザーRAM領域にコピーするプログラムを実行する
2. CSAVEMでwavファイルに保存
0x1000バイトずつしかできないので、1バンクで4回繰り返し実施する
というのを0-7バンク分実施する (気が狂いそう^^)
メモを取りながらやらないとオペレーションミスすると思う。
バンクはバンクレジスタを使って切り替える。
コピーするためのプログラムは内部ROMを吸い出す時に使ったものをそのまま流用する。(MVWP命令じゃなくてもいいんだけど)
e200 : 02 00 10 34 00 52 00 03
e208 : 10 e2 40 84 18 07 02 0f
e210 : 34 02 ff 34 00 01 82 13
e218 : 04 08 90 35 90 db 04 26
e220 : 2f 0d 2f 12 02 00 10 34
e228 : 00 52 37
e240 : xx xx 00 e3 (xx xxは転送元の開始アドレス)
e300 〜 f2ff (転送先の領域)
e201がバンク指定
e203,e204で指定している0x3400はバンクレジスタ
プログラム終了時にバンクレジスタを0に戻してます。
※このプログラムをBASICからコールするとリターン時にバンク0にしている関係でエラーになる気がします(確認中。。。)
内部ROMを吸い出した要領で、
0x4000-0x4fff
0x5000-0x5fff
0x6000-0x6fff
0x7000-0x7fff
を、0-7バンク分繰り返して実施する。
キーマトリクス
IA1-IA8はスキャンしたい行のbitを立てた数値をOUTAしたあとにINAすることで押されているキーを判別する。
KS1-KS7はKeyPortの0x3e00にスキャンしたい行の値(bitではない)を書き込んだあとにINAすることで判別する。
なんでbitになっていないんだろう。。。気持ち悪い。
BASIC中間コード
&FEとの組み合わせで2バイトコードで表現する。
&1FはGOTO命令などのジャンプ先ラインナンバーの前に置くコード。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
0 | RUN | CSAVE | DIM | LTEXT | CLS | PAINT | MDF | FACT | RND | EOF | ERN | ASC | CHR$ | |||
1 | NEW | OPEN | CALL | GRAPH | CURSOR | INPUT | OUTPUT | REC | LN | AND | DSKF | ERL | VAL | STR$ | ||
2 | CONT | CLOSE | POKE | LF | TO | GOSUB | APPEND | POL | LOG | OR | LOF | LEN | HEX$ | |||
3 | PASS | SAVE | GPRINT | CSIZE | STEP | AREAD | AS | ROT | EXP | NOT | LOC | |||||
4 | LIST | CONSOLE | COLOR | THEN | LPRINT | ARUN | DECT | SQR | PEEK | |||||||
5 | LLIST | RANDOM | ON | RETURN | AUTOGOTO | HEX | SIN | XOR | ||||||||
6 | CLOAD | DEGREE | BASIC | DEFDBL | IF | RESTORE | TEN | COS | NCR | |||||||
7 | MERGE | RADIAN | TEXT | DEFSNG | FOR | CHAIN | RCP | TAN | NRR | |||||||
8 | LOAD | GRAD | LET | ERROR | SQU | INT | OPEN$ | |||||||||
9 | RENUM | BEEP | REM | CUR | ABS | INKEY$ | ||||||||||
A | AUTO | WAIT | ERASE | END | LLINE | HSN | SGN | MID$ | ||||||||
B | DELETE | GOTO | LFILES | NEXT | RLINE | HCS | DEG | LEFT$ | ||||||||
C | FILES | TRON | KILL | STOP | GLCURSOR | HTN | DMS | RIGHT$ | ||||||||
D | INIT | TROFF | COPY | READ | SORGN | AHS | ASN | |||||||||
E | CONVERT | CLEAR | NAME | DATA | CROTATE | AHC | ACS | PI | ||||||||
F | Binary | USING | SET | PAUSE | CIRCLE | AHT | ATN | MEM |