メモリマップ

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 PRINT 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