CASIO PB-1000 FOREVER!

LCD制御プロトコル
(PB-1000/C,FX-870P,VX-3,VX-4,AI-1000用)


このLCD制御法は、ポケコンジャーナル1993/12号に再掲載されたN.Hayashi(はっくん)氏の
「DOTDS互換ルーチン」に、私(あお)がPB-1000/C/FX-870Pを独自に解析した結果を加えた物です。
PB-1000/C、FX-870P、VX-4で動作する事を確認しています。
未確認ですが、HD61700を搭載した他の機種(AI-1000/VX-3)でも同様に使えると思われます。

注意:この内容はCASIO計算機(株)が保証する物ではありません。
本ドキュメントについてCASIOに問い合わせる事はご遠慮下さい。)

1.はじめに

 CASIO旧機種系(HD61700システム)のLCD制御については、
モダン社刊行の 「カシオPB-1000テクニカルハンドブック」に
「ディスプレイ・ドライバ・ コントロール・レジスタ(LCD制御レジスタ)」に関する記述があり、
何らかの レジスタ経由で制御する必要があると言うことは、古くから知られていました。

しかし肝心のアクセス方法が未公開で、しかもCASIOから提供されたLCD制御用の DOTDS(&H022C)処理は、
読み出し不可能なMPU内蔵ROMに配置されていたため、 その制御方法は長い間謎のままでした。

こたちゃん氏の「KC-DisAssembler」(PJ 1990/8号)により判明した未公開命令(PPO命令)を 使う事によって、
このレジスタにアクセスできることに気がつき、さらに別の未公開命令を 併用する事で、
完全なLCDコントロールが可能である事を解析したのが、N.Hayashi(はっくん) 氏です。

氏はその成果の一部を「BUG RACE」(PJ 1993/10号)にて「DOTDS互換ルーチン」として発表したの ですが、
不幸なことにその「DOTDS互換ルーチン」はPJ編集部のミスにより掲載されず(おぃ)、
2ヶ月後(PJ 1993/12号P74)のバグ情報コーナーにひっそりと載ることになりました。
(あれじゃほとんど誰も気がつかないって・・笑)

その後、N.Hayashi(はっくん)氏は、「X-Assembler Ver.6」(PJ 1995/2号)にてSTL命令という形で
上述の未公開命令をサポートしたのですが、またしても不幸なことに(紙面ページ数の都合でしょうか?)
LCD制御方法は発表されず、結果として多くの人にはLCD制御方法が謎のまま、
CASIO旧機種の時代は 静かに終わって行ったのでした。
(既に1993/12の時点でCASIO旧機種系(PB-1000/FX-870P等)の ソフトは発表されにくくなっていたようですが・・)

忘れられたLCD制御に関する記述が再び日の目を見るのは、2003年になってからでした。
「CASIO PB-1000/C Forever!」を主催するJUN AMANO氏が「X-Assembler Ver6」にLCD制御命令が
組み込まれている事を見つけ、同じ作者が発表した「DOTDS互換ルーチン」が
1993/12号のバグ情報にあるのを発見しました。(ある意味世紀の発見?)

本記事は、N.Hayashi(はっくん)氏の「DOTDS互換処理」を参考に、
さらにFX-870P/PB-1000/Cの ROM内ルーチンを解析することで埋もれてしまったLCD制御方法を再発掘しています。
(10年早ければ・・・。笑)


2.LCDC(LCDコントローラ)仕様

 PB-1000/Cにて利用しているLCDコントローラ(以下LCDC)は日立製HD44353で、2系統搭載(LCD1/LCD2)されています。
特徴は以下の通り。

・MPU内蔵の専用命令(PPO/STL)によるダイレクトLCDコントロール
・LCD1/LCD2合計で192×32ドットのフルグラフィック表示(FX-870P/VX-4は、191×32ドット)
・ビットイメージ/キャラクタ表示が可能
・通常表示(上書き)以外にOR、XOR表示が可能
・LCDデータRAM書き込みにて、表示アドレス(桁位置)のオートインクリメントをサポート
(インクリメント値は2(または34)固定なので、ビットイメージ表示でのみ利用可能です)
・コントラスト制御機能

FX-870P/VX-4のLCDCでは上記機能に加え、モード表示(CAPS、BASIC、DEG、PAD、GRA表示)を行う事が可能です。
(その代わり、最大191ドットしか表示できない仕様となっています)


2−1.LCDビットメモリ構成

 LCD構成図を示します。
LCDは2系統で構成されていて、それぞれLCD1(左半分)とLCD2(右半分)に分かれています。

LCD構成

LCD1(およびLCD2)は、さらに行単位で4つに分かれており、それぞれ行位置(0〜3)を設定する事でアクセスします。
また各行は、アドレス0〜95までのブロック1と128〜223までのブロック2に分けることができます。

LCD単体(画面半分)のビットメモリ構成を示します。

図を見ると判りますが、LCDへのアクセスは、8ビット単位(Bit0〜7)で行われます。
横方向(桁アドレス)は8ビット単位に2ずつ更新されていますが、奇数アドレス(1,3,5・・)から
データ書き込みを行うと、4ビットシフトした位置から8ビット分のデータが表示されます。
(書き込まれる順番は、桁アドレスの若い方から上位4ビット→下位4ビットとなります)

LCDビットマップ

FX-870P/VX-4では、LCD2の右端(桁位置=222)にCAPS、BASIC、DEG、PAD、GRA表示が割り付けられており、
そのため、PB-1000/C、AI-1000より1桁少ない(191×32)表示となっています。
(図の水色部がFX-870P/VX-4のみ表示される箇所です)


2−2.LCD制御レジスタ構成
LCD制御レジスタ構成 (8bit:write only)

 LCD制御レジスタは8ビット構成で、PPO命令によって出力先(コマンド、コントラスト、データRAM)を設定しておき、
STL命令にて各種制御コマンドを出力する仕様になっています。
現在、3つの指定方法が確認されています。(他にも有るかも知れません)

(1) コマンド制御指定
(2) コントラスト制御指定
(3) データRAM指定

ディスプレイドライバコントロールレジスタ構成


2−3.出力コマンド/データ構成

 PPOによる出力先に応じてSTL命令によって出力される制御コマンド/データ構成です。
コマンド出力は3バイト構成で1バイト単位で順に出力されます。
データ出力は、STL命令で指定されたデータが、そのままLCDへ書き込まれます。

(1)コマンド制御指定時

LCDに描画する為の制御情報(画面モード/表示位置)を出力します。
3バイト構成になっており、詳細は以下の通りです。

グラフィック/キャラクタ表示コマンド構成

(2)コントラスト制御指定時

 LCDのコントラストを制御するコマンドです。
コマンドは、最初の1バイト(下位4ビット=12固定)だけで、残りはコントラストデータとなります。
コントラストデータは、0〜7FFFFまでの範囲で設定され、数値が大きいほど濃く表示されます。

コントラスト制御コマンド構成

ROM内のコントラスト設定値(テーブル)を見ると判るのですが、設定値は単純に連続したデータではなく、
飛び飛び(しかも値の大小も変化する)になっています。
実際に制御する場合には、ROM内のテーブル値を切り替えて転送する様にした方が良いでしょう。

(3)データRAM指定時

 このモードでは、STL命令にて指定されたデータが8ビットずつ順にLCDデータRAMに出力されます。
出力されるデータは、上述(1)で指定された描画モード/出力位置に従って出力されます。

グラフィック表示の場合、LCDCに指定された位置からSTL命令により1バイト出力する毎に
1バイトずつLCD画面にビットデータが表示されます。
出力と同時にLCDC内部の桁位置がオートインクリメント(+2)されるため、連続で表示する場合、
STL命令を繰り返すだけでグラフィックを表示する事ができます。

また左側ブロック(0〜95)から右側ブロック(128〜223)の境界では、きちんと+34されるため、
STLM命令を利用することで、ビットパターンを連続で(ブロック境界を意識することなく) 表示できます。
ただし、LCD1とLCD2は独立しているため、オートインクリメントはサポートされません。

データRAM書き込み制御

 キャラクタ表示の場合、STL命令でキャラクタコードを1バイト出力する毎に、LCDCに指定された
位置から6バイト分のキャラクタイメージが出力されます。

キャラクタコード出力と同時にオートインクリメントも行われるのですが、ビットイメージ単位で
インクリメント(STLにて1バイト書き込み毎に+2、ブロック境界にて+32)する仕様となっているため、
STLMによるキャラクタの連続表示は利用できません。(横1ビットずつずれて表示される)
実際に使う場合は、1文字表示毎に表示位置を指定してやる必要があります。


3.LCDC制御サンプル

 LCD制御サンプルソースです。内容の詳細については上述の説明を参考にしてください。
基本的には、これらを組み合わせることで任意の制御を行うことが可能です。
FX-870P/VX-4で実行後にBASICに戻るときはRTN前にPST UA,&H54を追加してください。
BASEを任意のアドレスでEQU宣言すれば、クロスアセンブラ「HD61」でアセンブル可能です。


3−1.グラフィック表示
画面(0,0)にグラフィック(人間パターン8x8)を表示します。
ORG BASE
START BASE
←任意のアドレスに配置してください。
LD $0,&H82 グラフィック表示モードにする
LD $1,0 桁位置 0
LD $2,0 行位置 0
PPO &HDF LCDコマンドレジスタを指定する
STLM $0,3 制御コマンド設定
PPO &HDE LCDデータ書き込み指定
PRE IX,DATA
LDM $0,(IX+$31),8
表示データ読み込み
STLM $0,8 グラフィック表示
; PST UA,&H54 (FX-870P/VX-4のみ追加)
RTN
DATA: DB &H04,&H22,&H24,&HF8,&HD4,&H24,&H02,&H00 グラフィックデータ

3−2.キャラクタ表示
画面(0,0)にキャラクタ"A"(=&H41)を表示します。
表示するキャラクタコードの上位と下位が逆になるのに注意してください。(&H41表示→&H14を指定)
ORG BASE ←任意のアドレスに配置してください。
START BASE
LD $3,&H14 表示キャラクタ"A"(&H41)をセット
LD $0,&H83 キャラクタ表示モードにする
LD $1,0 桁位置 0 を指定
LD $2,0 行位置 0 を指定
PPO &HDF LCDコマンドレジスタを指定する
STLM $0,3 (制御コマンド設定)
PPO &HDE LCDデータ書き込み指定
STL $3 1文字表示
; PST UA,&H54 (FX-870P/VX-4のみ追加)
RTN

3−3.コントラスト制御
コントラストを最低にします。
元に戻すには、実行後、再度CONTRAST設定をして下さい。
ORG BASE ←任意のアドレスに配置してください。
START BASE
LD $0,0 コントラストデータ(=0)を設定
LDW $1,0
OR $0,12 コントラストモード(=12固定)を設定
PPO &HC3 コントラスト制御指定 
STLM $0,3 コントラストデータ書き込み 
; PST UA,&H54 (FX-870P/VX-4のみ追加)
RTN

記事は、あお氏よりご寄稿して頂きました。ご協力誠にありがとうございました。

戻る