2014年8月2日土曜日

漢字ROM組込み

ここまできたら、漢字ROMにも対応してみる。

ATmega1284Pは、128KBのフラッシュメモリ、4KBのEEPROM、16KBのSRAMを持っている。
パソピアの漢字ROMは128KBなので、漢字ROMも内蔵できるようにしてみる。

SDカードから漢字ROMを読み込んで、フラッシュメモリに書き込めるようにブートローダに対応する。
プチFatFsに対応したためプログラムサイズは8KB近くになった。
ブートローダ領域は、ATmega1284P最大の4096ワード(8KB)にセットする。
LockとFuseビットは、以下のように

Lock Bit
11111111
|||||||+-- LB1
||||||+--- LB2
|||||+---- BLB01
||||+----- BLB02
|||+------ BLB11
||+------- BLB12
++-------- -

0xFF
1 (非プログラム) LB1~0=11:フラッシュとEEPROMメモリに対する一般保護用施錠ビット:施錠しない
1 (非プログラム)
1 (非プログラム) BLB02~01=11:フラッシュメモリの応用領域に対する一般保護用施錠ビット:施錠しない
1 (非プログラム)
1 (非プログラム) BLB12~11=11:フラッシュメモリのブートローダー領域に対する一般保護用施錠ビット:施錠しない
1 (非プログラム)
1 (非プログラム)
Extended
11111100
|||||||+-- BODLEVEL0
||||||+--- BODLEVEL1
|||||+---- BODLEVEL2
+++++----- -

0xFC
0 (プログラム) 低電圧検出(BOD)リセットの制御と検出電圧選択 111:無し,110:1.8V,101:2.7V,100:4.3V
0 (プログラム) BODLEVEL2~0=100:低電圧検出(4.3V)リセット
1 (非プログラム)
1 (非プログラム)
High
11011000
|||||||+-- BOOTRST
||||||+--- BOOTSZ0
|||||+---- BOOTSZ1
||||+----- EESAVE
|||+------ WDTON
||+------- SPIEN
|+-------- JTAGEN
+--------- OCDEN

0xD8
0 (プログラム) ブートローダーを使用。
0 (プログラム) BOOTSZ1~0=00:ブートローダ領域=4096、ページ数=32、ブートリセットアドレス=$F000
0 (プログラム)
1 (非プログラム) 消去でEEPROMを 1:消去, 0:保持
1 (非プログラム) WDTはWDTCSR(ウォッチドックタイマ制御レジスタ)で許可
0 (プログラム)   シリアルプログラミング許可
1 (非プログラム) 1:JTAG禁止, 0:JTAG許可
1 (非プログラム) JTAGデバッグを 1:無効, 0:有効
Low
11110111
|||||||+-- CKSEL0
||||||+--- CKSEL1
|||||+---- CKSEL2
||||+----- CKSEL3
|||+------ SUT0
||+------- SUT1
|+-------- CKOUT
+--------- CKDIV8

0xF7
1 (非プログラム) CKSEL0=1,SUT1~0=11:外部クリスタル発振子、低速上昇電源
1 (非プログラム) CKSEL3~1=011:外部クロック 0.4~20MHz
1 (非プログラム)
0 (プログラム)
1 (非プログラム)
1 (非プログラム)
1 (非プログラム) システムクロック出力許可 (1:不許可)
1 (非プログラム) システムクロック8分周選択はしない

これで128KBのフラッシュメモリは、漢字ROM用の応用プログラム領域120KB+プログラム用のブートローダー領域8KBに分割された。
このままだと漢字ROM領域が8KB不足するので、EEPROM 4KBに圧縮して保存する。
一番圧縮がかかりやすい0x6000~0x7FFFの領域をEEPROMに保存することにする。
EEPROMに圧縮して保存されたデータは、AVR起動時に解凍されて8KBのSRAM領域に展開される

パソピアから漢字データの要求があった場合、アドレスが0x6000~0x7FFFならSRAMから、それ以外はフラッシュ領域からデータを読み込むようにする

漢字ROM PAC2の場合、I/Oポートは以下
I/Oポート
アドレス
リード/ライト内容CAD1CAD0
18hライト漢字ROM PAC2下位アドレス8ビット LowLow
19hライト漢字ROM PAC2中位アドレス8ビット LowHigh
1Ahライト漢字ROM PAC2上位アドレス1ビット HighLow
18h-1Bhリード漢字ROM PAC2リードデータ8ビット --
上位・中位・下位の合計17ビットで128KBのアドレスを指定した後、18h~1Bhのどれかで8ビットデータをリードする。

続いて、漢字ROMをATmega1284Pへ書き込み。

漢字ROMの吸出しは、昔のブログを参照
使用するROMは、初代パソピア用(PA7246)、パソピア7用(PA7247)、どちらでもOK。
ラベルのシールは異なるが、ROMデータは同じっぽい。

SDカードに吸い出した漢字ROMのデータを書き込んでおき、以下の命令でフラッシュROMとEEPROMへ書き込みできるようにした
ld 0 [file name] : SDカードの漢字ROMファイルをAVRへロード
 [file name] : SDカード漢字ROMファイル名
  "/"から始まった場合、絶対パス
 [戻り値]
  Ok : ロードが成功した場合
  (エラー文字列) : エラーが発生した場合

テストプログラムを作って、パソピア7で動作確認
問題なさそう。

初代パソピア用(PA7246)は、ROM BASIC Ver1.1用のサブルーチンがテープで付属している

初代パソピア(Ver1.1)でも、サブルーチンを使って漢字表示できた

表示スピードは、やはりパソピア7の方が速い

0 件のコメント:

コメントを投稿