この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(右半分)に分かれています。
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ビットとなります)
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へ書き込まれます。
LCDに描画する為の制御情報(画面モード/表示位置)を出力します。
3バイト構成になっており、詳細は以下の通りです。
LCDのコントラストを制御するコマンドです。
コマンドは、最初の1バイト(下位4ビット=12固定)だけで、残りはコントラストデータとなります。
コントラストデータは、0〜7FFFFまでの範囲で設定され、数値が大きいほど濃く表示されます。
ROM内のコントラスト設定値(テーブル)を見ると判るのですが、設定値は単純に連続したデータではなく、
飛び飛び(しかも値の大小も変化する)になっています。
実際に制御する場合には、ROM内のテーブル値を切り替えて転送する様にした方が良いでしょう。
このモードでは、STL命令にて指定されたデータが8ビットずつ順にLCDデータRAMに出力されます。
出力されるデータは、上述(1)で指定された描画モード/出力位置に従って出力されます。
グラフィック表示の場合、LCDCに指定された位置からSTL命令により1バイト出力する毎に
1バイトずつLCD画面にビットデータが表示されます。
出力と同時にLCDC内部の桁位置がオートインクリメント(+2)されるため、連続で表示する場合、
STL命令を繰り返すだけでグラフィックを表示する事ができます。
また左側ブロック(0〜95)から右側ブロック(128〜223)の境界では、きちんと+34されるため、
STLM命令を利用することで、ビットパターンを連続で(ブロック境界を意識することなく)
表示できます。
ただし、LCD1とLCD2は独立しているため、オートインクリメントはサポートされません。
キャラクタ表示の場合、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 |
記事は、あお氏よりご寄稿して頂きました。ご協力誠にありがとうございました。