Comments
Description
Transcript
ぽけこんのほん1(1.36MByte)
- SHARP 製 ポケットコンピュータ PC-E200/G800 系(主対象:G850) - ぽけこんのほん1 第1特集 「ただいまLCD解析中」 第2特集 「中間色のススメ」 第3特集 「漫画の中のポケコン」 著:単色ドット絵向上委員会(C64) ――――――――――――――――――――――――――――――――――――――――――――― ~ 前書 ~ どうも。 「あきひ」といいます。はじめまして。 コミックマーケットに出展しようと思ったきっかけは・・・ -> 大好きなポケコンが廃れていくのを見ていられなかったから -> コミケに行くようになってからポケコン専門のサークルさんがいない事に気づいたから でしょうか。 昔からの法則「なければ自分で作れ」にのっとり、自ら進んでやってみました。 待っていても誰かがやってくれるとは限りません。 私が出展したことをきっかけに、誰かが更にすごいことをやってくれればいいな、とおもいます。 10 年前には当たり前だった技術をいまさら使っても、たいてい驚かれません。 「当たり前のこと」とか「技術力が低い」とかはよく言われることです。 ですが、めげてはいけません。 それでも、私は努力はしているんです。前に進んでいるのです。 私の技術力で持てる限界を目指しましたが、それでも至らない所ばかりかと思います。 が、少しでも楽しんでいただければ幸いと思います。 ――――――――――――――――――――――――――――――――――――――――――――― ~ 目次 ~ 第一特集 「ただいまLCD解析中」 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2 第二特集 「中間色のススメ」 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 11 第三特集 「漫画の中のポケコン」 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・15 ――――――――――――――――――――――――――――――――――――――――――――― 1 企画1:ただいまLCD解析中 ポケコンの伝統のテクニックに「LCD直接操作」というものがあります(LCD: liquid crystal display の こと。液晶画面)。LCD 自身が持つ VRAM にデータを出力するため、ポケコンの最速表示法として過去に重 宝されていました。 プログラマーにはいろんな人がいますが、私は「最速」に惹かれました。IOCS(InputOutputCallSystem、 BIOS といえば通りはいいか)を使用すればそれだけでもかなりの速度を得られます。たいてい、それで十分 です。しかし、過去の私は「とりあえず PC-G850 の LCD 解析」をやってみようと思ってしまいました。そ れが運の尽き、私はかなり時間を費やしました。ちょこちょこと 2 年くらい。 ここでは「どのように」解析したかを順を追って書いていきたいと思います。インターネット上で挙がっ ている数々のポケコンの解析情報は「どのように」解析したかがたいてい載っていません。そういえば、か のポケコンジャーナル誌でも載ったことはないような気がします。思うのですが、どうやって解析したかを 書かないのは何故なんでしょう?それを公開すれば、それを参考に多くの人が更に解析してくれるはずなん ですが・・・ <前提知識編> LCD関係の知識は主にポケコンジャーナル誌上で得ました。先ず、それを紹介します。 (私の 8 割は人の流用でできています。あ、物を投げないでください・・・) ★E-200 編 (PJ89 年 8 月号 PC-E200LCD の解析 MUCC 臼井保博氏の投稿より) I/O マップ(俗に液晶コントローラ部と言われる) 58H:LCD コントロール<OUT で使用> MSB LSB □□□□□□□□ [ ] +――――00:画面出力 01:横アドレス 10:縦アドレス 11:表示開始アドレス 上記を踏まえた上で下記のようになる MSB LSB □□■■■■■□ 0011111[ ] +――0:画面にデータを出力しない 1:画面にデータを出力する MSB LSB □■□□□□□□ 01[ ] +――――横アドレス(6ビット) MSB LSB ■□■■■□□□ 10111[ ] +―――縦アドレス(3ビット) MSB LSB ■■□□□□□□ 00[ ][ ] | +―――表示開始ドット(0~7ドット) +――――― 表示開始アドレス(縦アドレス) 59H:LCD ステータス<IN で使用> MSB LSB □□□□□□□□ [] +――――0:アクセス可能 1:BUSY 2 5AH:LCDRAM データ・ライト<OUT で使用> MSB LSB □□□□□□□□ [ ] +――――RAM データ(横アドレスは自動加算) 5BH:LCDRAM データ・リード<IN で使用> MSB LSB □□□□□□□□ [ ] +――――RAM データ(横アドレスは自動加算。ただしアドレス設定直後のデータは不定 で、もう一度読んだデータが設定したアドレスの正しい値) 画面アドレスイメージ(脇の数字(0~7)が縦アドレス、箱の中の 00H~3CH が横アドレス) |3CH|← →|3CH| ――――――――――――――――――――――――――――――― 0 |00H|01H|―――→|3AH|3BH||3BH|3AH|←―――|01H|00H| 4 1 |00H|01H|―――→|3AH|3BH||3BH|3AH|←―――|01H|00H| 5 2 |00H|01H|―――→|3AH|3BH||3BH|3AH|←―――|01H|00H| 6 3 |00H|01H|―――→|3AH|3BH||3BH|3AH|←―――|01H|00H| 7 ――――――――――――――――――――――――――――――― |3CH|← →|3CH| 各 3CH(主ディスプレイ要素以外)の表すもの MSB 縦0、横3CH 縦 3、横3CH MSB LSB □□□□□□□□ |||+――――TEXT ||+―――――CASL |+――――――PRO +―――――――RUN MSB 縦7、横3CH LSB □□□□□□□□ ||||||+―BATT |||||+――E ||||+―――M |||+――――CONST ||+―――――RAD |+――――――G +―――――――DE MSB 縦4横3CH LSB □□□□□□□□ ||||+―BUSY |||+――CAPS ||+―――カナ |+――――小 +―――――2dF LSB □□□□□□□□ |+――――――STAT +―――――――PRINT 用法としては、 58H に C0H を入力して書き込み開始位置初期化 58H に 40H~を入力して横アドレス指定 58H に B8H~BFH を入力して縦アドレス指定 59H を読んで LCD の書き込みができることを確認してから 5AH を使用して 00H~FFH の値を出力 ・・・という感じでしょうか。 3 ★G-815 編 (PJ93 年 4 月号 PC-G815 の特徴と互換性 小林龍也氏の記事) G-815 からフルドットマトリクス液晶になったため、 E-200 とは異なった LCD 操作を行わなくてはならない。 IO ポート表が変更されている。 E-200 では 58H~5BH に配置されていたものが「コントローラ1」 新たに 54H~57H が「コントローラ2」とされる。 また、50H~52H がそれぞれコントロール、ステータス、データライトの同時アクセスとなった。 画面アドレスイメージ(脇の数字(0~7)が縦アドレス、箱の中の 00H~3BH が横アドレス) ――――――――――――――――――――――――――――――――――― 0 |00H|―――→|3BH||00H|→|0BH||0BH|←|00H||00H|←―――|3BH| 4 1 |00H|―――→|3BH||00H|→|0BH||0BH|←|00H||00H|←―――|3BH| 5 2 |00H|―――→|3BH||00H|→|0BH||0BH|←|00H||00H|←―――|3BH| 6 3 |00H|―――→|3BH||00H|→|0BH||0BH|←|00H||00H|←―――|3BH| 7 ――――――――――――――――――――――――――――――――――― [ ][ ][ ][ ] + + + + | | | | コントローラ2 コントローラ1 コントローラ1 コントローラ2 3CH(各種ステータス点灯)に関しての記事はない 用法としては E200 での処理を応用して 2 回 LCD 操作を行う、という感じだろう。 <IO ポートを叩け!編> 今までの前提知識を得た私は、G850 でも似たことができると思い込んで G815 の LCD 表示ルーチンをち ょこちょこいじって表示ができないかとやっておりました。知ってのとおり、G850 からは今までとは違う 「6行表示」が売りになっているので画面が広くなっております。当時私の考えたことは「恐らく、コント ローラがひとつ増えているのではないか」と言うことです。マニュアルに記載された「ディスプレイ用」と されている I/O ポートは 40h~5FH なので、まだ使える領域がたくさんあったためにそう考えたようです。 ・・・しかし、いくら値をいじっても I/O ポートの値をいじくろうとも画面にパターン表示をすることは かないませんでした。たまに各種ステータスが点灯したり、変な画面効果が現れたりしました。少なくとも 数ヶ月間暇を見てはこの作業をやっていましたが、全くの無駄足だったようです。 <すげえ資料が出てきたもんだぜ編> 上記の I/O ポートをいじくってる時点でインターネット上で「PC-G850 解析資料第六版 (C)あきやん氏」 なる資料が発表されました。どうやって解析したかは知りませんが、I/O ポートの解析をかなり進めている ようでした。しかし、わたしが考えている LCD コントローラの手法とは全く違った方式だったため「まだな んかあるんじゃあないのか」とか思ってその資料で書いてあることは置いといて独自路線を突っ走ることに なってしまいました。今思うとかなり馬鹿です。 しかし、確かこの資料では「LCD 上に出力するのにはどうするのか」が IOCS(資料上では BIOS と表記) しか載っていなかったと記憶しています。その時、41H に出力するとどうなるかが書いてなかったためやっ たんですが、GPRINT の時と同じようにビットパターンを1バイト分だけ出力できることを確認しました。 今思うと、この次点で「LCDRAM データライト」が 41H であると思い込めばよかったんですが、それとは 別に何かあると考えてしまったんですねぇ、当時。 <ROMの中身を解析せよ!編> I/O ポートを無造作にいじって解析する手法に限界を感じていたあたりでふとした疑問が浮かび上がって きました。「はたして表示系の IOCS はどのように処理しているのだろうか」と。そこで私は BFD0(ビット パタン表示)のコール後はどのように処理をしているのだろうか、をマシン語モニタ(D 番地 命令使用)から 探ろうとしました。 ・・・が、自身のつたない技術では少し追っただけで CALL が沢山出てきてわけが解ら なくなってしまいました。表示したデータを紙に写して、ハンド逆アセンブルしたんですが・・・なんとい うか普段しないことをやると、人間どうもうまくいかないものです。 そこで楽をするために「パソコン上に ROM の部分を転送すればいいじゃないか」ということを思いつき ました。この時点ではどうせならポケコンの中身を全部取ってやろうと思っています(目的が多少違ってきて います)。それで行ったことが拙作 Web ページに「ROM の巻」として公開してあります。反響がちょっとは あったのですが、ほとんどの人が見ていないことと、文章量がたいした物ではないことからその記事をここ で再掲載したいと思います(これを人は手抜きと言う)。 4 ~ ROM の巻の再掲載~ G850ROM マニュアルに付録でメモリマップが出てますがC000h~FFFFhのROM1~3の他に4~FのROMがありま す。 昔っからROMは増えていたらしいのですが、シャープさんが何故か載せないんです。 始めROMバンク切り替えてからモニタのWコマンドで出力できるかと思いきや、送信中は送信用のROM(0Eh)に 切り替わってお話にならなかったのです。 あと何故か切り替えた直後にすぐに使用中のROMに戻る現象がおきました。 この現象に何日か頭を悩ませたのですが、 「CPUの割りこみがやばい」ことに気づくのは友人に相談してみてからでし た。 だいたいアセンブラ学び始めて数ヶ月の若僧がそんな命令しりませんって。使わないし。 それで今回の使ったリスト。 モニタで USER 6000 として、TEXTエディタで打ちこんだあとアセンブル。 モニタで G5500 とするか、BASIC で CALL &H5500 としましょう。 10 ORG 5500H ;5500h番地からプログラムを置こう! 20 DI ;CPUの割りこみ禁止! 30 IN A,(19H) ;ROMバンク切り替えポートの値を読んで・・・ 40 PUSH AF ;保存しときます。 50 LD A,0X ;Xは1~FのROM番号が入ります。読みたいROM番号を入れましょう。 60 OUT (19H),A ;ROM切り替えポートにさっきの番号出力。 70 LD HL,0C000H 80 LD DE,1000H 90 LD BC,4000H 100 LDIR ;HL の値を DE に転送後それぞれインクリメント(+1)。それが BC 回繰り返されます。 110 POP AF ;始めのROM状態を読んで・・・ 120 OUT (19H),A ;戻しときましょう。 130 EI ;CPUの割りこみを許可します! 140 RET ;実行終了!! 今回はROMの内容をRAMに移してパソコンに記録して逆アセしたのでした。 (逆アセンブルは Vector で見つけた「hoja」と言う Win 用ソフトを使用) Web ページ上に逆アセンブル後のデータを載せていますが、テキストが ROM 毎に2分割されていて読み にくいです。この問題は解決しており、1ROM で1ファイルができるようにしましたが・・・あれ?載せ てないですねぇ(汗) ROM00 番に関しては 8000H~BFFFH で固定です。C000H~FFFFH に指定ができますが意味はない(指 定は普通はしない) と思います。 と、 いうのもスイッチ ON 後 0000H からたどった時(Z80 は電源オン時 0000H から実行する)、初期処理で C000H~FFFFH に 01 番の ROM を指定していたからなんですが。 以下に、抽出した逆アセンブル後のテキストファイルから得られる情報を掲載します。 ROM00: 基本 ROM。 8000H~BFFFH に必ず入っているものと決め撃ちでいいはず。 IOCS コール->その処理を行うため、ポケコンの基底部といってもいいのではないか。 ROM01: 電源オン時に ROM00 番から指定される。これも基本 ROM に分類されると思う。 RUNMODE や PROGRAMMODE の動作はこれで行っているのでは、と考える。 C292 番地から「MEMORY CREAR O.K.?(Y/N)」の文字が入っている。 C2A9 番地から「ALL RESET」のビットパターンが入っていたりする。 D152 番地から BASIC の命令のテキストが入っている(恐らく、「.」指定時の補完用)。 もちろん隠し命令とか言われてる BEEP とか HDCOPY も入っている。 APPEND って何だ(汗) MANE(?)って何だ(汗) MOD って何だ(汗) SPOUT って何だ(汗) SPINP って何だ(汗) TO(PROMODE専用っぽい)って何だ(汗) # 2 版改訂、FOR~TOですね。 うーん?マニュアル見落とし? ROM02: いまいち役割不明。うーーん。何だろう? 低い ROM 番号が与えられており、シャープ公開の資料には始めから ROM02 があることが書かれていた ので、結構重要な位置にあるとは思うのですが。 5 ROM03: DE35 番地あたりに「TEXT EDITOR」とか EAF4 番地あたりに「CASL」とか EF32 番地より「MACHINE LANGUAGE MONITOR」とか FF05 番地より「LCD CONTRAST」とかいう文字列が見受けられるため、各種メニュー用かと思われる。 また、マシン語モニタで見える情報はこの ROM の情報であるためにマシン語モニタも入ってるはず。 ROM04: 各種データ(テーブル)の集まりと思われる。 DD77 番地あたりからカナ変換の特殊系(?)のテーブルっぽいのとか E066 番地から文字列のビットパターンが入っていたりするので。 (何故 E066 番地だと解ったかと言うと、IOCS の文字表示系を追うと、ROM04 に変更してデータを読み 出していたため) ROM05 E723 番地あたりに「ASSEMBLER」と言う文字列が見えたり、各種アセンブラの命令のテキストがあっ たりするのでアセンブラ機能が入っている ROM と断定できる。 確か、G800 系の進化の過程で、G803 とかで始めについた機能がアセンブラだったので、低い ROM 番号 にあるから間違いではないと思う。ROM 番号で進化の過程がわかりそうなので、次は C 言語か?とか思 うわけです。 ROM06 各所で「PC-G850 V.2 CHECK」と言う文字列が見受けられるため、PC-G850 解析資料第六版に書いて あった「OUT &H69,6」とすると入るデバッグモード用 ROM と思われる。 あれ?C言語じゃない(汗) 各種テストが何をやっているか、どのようにやっているかがわかると思う。解析すれば。 ROM の内容見ると「L.B は LOW BATTERY チェック」のことっぽいとかわかる気がするんですが、解析 資料 6 版上では不明となっているなぁ・・・だからどーやって解析してるんだっつーのって感じだ(すいま せん -> 解析資料作ってる方々)。 ROM07 「RAM CHECK OK」とか言う文字列が見受けられるので、ROM06 で行っている ESD チェックとか言 うやつの専用 ROM か? 豪勢なことに 600 バイトくらいしか値が入っておらず他は FFF9~FFFB 番地以外全部 NOP である。 なんてこった。 ROM08 C3C1 番地当たりに C 言語のメニュー用文字列があるので C 言語用 ROM だろう。 ROM09 これもいまいち役割不明。 ROM0A C 言語用の命令の文字列やコンパイルエラー時の文字列を含んでいるので、これも C 言語用 ROM と思わ れる。コンパイラだけで ROM 一個食ってるのかもしれない。 そう考えると ROM09 も C 言語か? ROM0B これもなんだかC言語用のエラーメッセージの文字列が各所にあります。これも C 言語用 ROM か。 ROM0C またまたC言語用のエラーメッセージの文字列が各所にあります。これも C 言語用 ROM か。 ROM0D これもいまいち役割不明。 ROM0E マシン語モニタ上から普通に C000H~FFFFH をパソコンに転送するとこの ROM の内容が表れます。 60 番台のポートに出力したりすることが多いので、11 ピン I/O 通信部の ROM と考えて間違いなさそうで す。 ROM0F これもいまいち役割不明。 何かのエラーメッセージっぽいのが定義されているけど、それを見てもぴんと来ない。 6 ・・・さて、ROM の内容がなんとなくわかるようになればこっちのものです。とりあえず各種 IOCS の 処理の流れと電源 ON 時(0000H~)の処理を最近追っています。 電源オン時の処理を追いましたが、うわ、追いきれん!って感じです。現在もちょこちょこやってますが、 まだ終わってません。おそらく ROM00 と 01 で数パーセントくらいしか終わってないと思います。ただし、 システム上から各種 IOCS が呼ばれていることがわかったりしました。 んで、IOCS ですが、ポートの 40H 系で各種ディスプレイの設定を行い、OUT 41H で VRAM 上に出力、 もしくは IN 41H で VRAM 上のデータを取得、と言う感じになっていました。 ここまでわかっているのに私は「まだなんかあるはずだ」と考えていました。その対象はシャープ公開の I/O マップで 60H~6FH の「システムポート」や 70H~FFH の「未使用領域」向いたわけです。ここにま だディスプレイ用の何かがあるのではないかと。今考えると、昔の私に「いい加減にしろ」とか言いたい感 じ。ROM の内容を逆アセンブルしたのを見ると 60H~6FH の「システムポート」の番地がポケコンの電源 ON 時の処理で使われていたり、他の場所でもよく使われているので「これだ!」と思ったのですが、手持 ちの資料「PC-G850 の 11 ピンインターフェース解説書」に 60H~67H の説明がありました。・・・といっ ても何が書いてあるかさっぱりなんですが・・・ 11 ピンインターフェース解説書より(おそらく全ての E200/G800 機種に共通) 60H:/SET11 11pin i/f の動作を定義する信号 (OUT/IN で使用) MSB LSB □□□□□□□□ [D1 D2] +――――00:11pin 従来の 11pin i/f として使用可能(デフォルト) 01:8para 独立した 8 本の I/O として使用可能 10:Uart 全 2 重通信のできる i/f 11(not use) 61H:/PICTL 11pin i/f をパラレル i/o として使用するときの各信号の入出力の定義 MSB (OUT で使用) LSB □□□□□□□□ [ lo ] +―――――――1:入力 0:出力 62H:/PIO 11pin i/f をパラレル i/o として使用する場合の信号 MSB (OUT/IN で使用) LSB □□□□□□□□ [ lot ] +―――――――1:入力 0:出力 63H:/RSCTL 11pin i/f を RS232C として使用する場合の入力/出力信号 MSB LSB □□□□□□□□ [CI ER CD DR CS RS ] + + + | | | +―+―+――――――Out put(端子機能) In Put(端子機能)は pull down R outside と表記されている 64H:/ONCD CD 信号による ON の dis/enable 切替 MSB (OUT/IN で使用) LSB □□□□□□□□ [ONCD] +――――0:disable 1:enable Output(端子機能) 65H:M1WAIT CPU /M1 発生時に wait 印加の制御 MSB LSB □□□□□□□□ [M1Wait] +――――0:1wait あり 1:wait なし In / Output(端子機能) 7 (OUT/IN で使用) (OUT/IN で使用) 66H:IOWAIT 20-3FH の間で有効 MSB (OUT/IN で使用) LSB □□□□□□□□ [1OWait] +――――0:2wait あり 1:wait なし In / Output(端子機能) 67H:CSCLK UART 以外へのクロック MSB (OUT/IN で使用) LSB □□□□□□□□ [CSCLK] +――――0:8MHz 1:4MHz 現在持っている資料ではこれしかわかりませんが、IN 69H とやると現在の ROM 番号が解る気がしま す・・・が、よく確かめたわけではないのでなんとも。 逆アセンブルした資料では他に 68H、6BH、6CH が使われていることを確認してますが、用途不明。 この辺を確かめていくとけっこう面白いことが解るかもしれない。 <IOCS を参考に考察編> さて、ここまで来て叩くべき I/O がなくなったので、やっぱり 40H でディスプレイ操作して 41H で出力 するのが G850 以降での正しい VRAM 描画だと思います。・・・そうしたら IOCS 使えばほぼ最速で描画で きる気がするんですが(40H&41H を使用してるため)。最適化して数パーセント速くなるくらいかも。 ここで問題です。それでは画面外のステータスはどうやって表示しているのでしょう?少なくとも IOCS ではドットマトリックス以外に描画しないように工夫してある気がします。デバッグモードの LCD チェック を調べれば解るかもしれません。 ・・・が、とりあえず、独自で IOCS ルーチン真似して画面外に描画してみ ました。普通の描画ルーチンもこれを改良していけるはず。 ~ 画面外描画 ~ 10 ORG 0100H 20CLS:XOR A 30 LD B,24*6 40 LD D,A 50 LD E,A 60 CALL 0BFEEH 70START:LD A,0B0H ;tate 80 OUT (40H),A 90 LD A,144 ;yoko 100 LD C,A 110 AND 0FH 120 LD B,A 130 CALL LCDWT 140 LD A,B 150 OUT (40H),A 160 LD A,C 170 AND 0F0H 180 RRCA 190 RRCA 200 RRCA 210 RRCA 220 OR 10H 230 LD B,A 240 CALL LCDWT 250 LD A,B 260 OUT (40H),A 270 CALL LCDWT 280 LD A,0FFH ;data 290 OUT (41H),A 300 CALL LCDWT 310 IN A,(1FH) 320 RLCA 330 RET C 340 JR START 500LCDWT:IN A,(40H) 510 AND 080H 520 JR NZ,LCDWT 530 RET CLS は画面消去処理 tate で行数指定します。 Bx を 40H に出力、x は 0~5 まで。 IOCS ではマスクが AND B7 になっているので、7 まで OK っぽいが。 yoko で横の出力先を指定。ここでは画面外の 144 ドット目を指定。 0~143 ドット目はドットマトリクス部。 145 ドット目以降は恐らく無効(未確認) 横アドレスは 40H に 0x、x は指定したい横アドレスの下位 4 ビット 1x、x は指定したい横アドレスの上位 4 ビット となるため、RRCA 命令×4 で処理。IOCS もこうしてる。 41H に描きたいビットパターンを出力します。 前の処理で指定したアドレスに描かれます。 STOP キーを検出したら return する処理が入っています。 その後、始めに戻って繰り返し同じ場所にビットパターン描画。 LCDWAIT ルーチンは LCD にアクセス可能かどうか見てる(と思う) IOCS のルーチンそのまんま。 このリストを実行して画面外の各種ステータスの表示ができるようになりました。 8 これで PC-G850 の主要 LCD I/O マップがわかったことになります。 ★G-850 編 (わたし(あきひ)が書いた) LCD 主要 I/O マップ 40H(OUT):LCD コントロール MSB LSB □□□□□□□□ [ ] +――――0H:横アドレスの下位 4 ビット 1H:横アドレスの上位 4 ビット BH:縦アドレス 上記を踏まえた上で下記のようになる MSB LSB □□□□□□□□ 0000[ ] +―――横アドレスの下位 4 ビット指定 MSB LSB □□□■□□□□ 0001[ ] +―――横アドレスの上位 4 ビット指定 MSB LSB ■□■■□□□□ 10110[ ] +―――縦アドレス(3 ビット) 40H(IN):LCD ステータス MSB LSB □□□□□□□□ [] +―――――0:アクセス可能 1:BUSY 41H(OUT):LCDRAM データ・ライト MSB LSB □□□□□□□□ [ ] +――――RAM データ(出力すると横アドレス自動加算) # 2 版改訂 41H(IN):LCDRAM データ・リード MSB LSB □□□□□□□□ [ ] +――――RAM データ(未確認だが、おそらく自動加算あり) # 2 版改訂 画面アドレスイメージ(脇の数字(0~5)が縦アドレス、箱の中の 00H~90H が横アドレス) ―――――――――――――――――――――――― 0 |00H|01H|―――――――――→|8EH |8FH||90H| 1 |00H|01H|―――――――――→|8EH |8FH||90H| 2 |00H|01H|―――――――――→|8EH |8FH||90H| 3 |00H|01H|―――――――――→|8EH |8FH||90H| 4 |00H|01H|―――――――――→|8EH |8FH||90H| 5 |00H|01H|―――――――――→|8EH |8FH||90H| ―――――――――――――――――――――――― 6、7 行目もあるのかもしれないが、ここでは無視。 9 各 90H(主ディスプレイ要素以外)の表すもの MSB 縦0、横90H MSB 縦1、横90H LSB □□□□□□□□ | | +―――小 | +――――――DE +――――――――G MSB 縦5、横90H LSB □□□□□□□□ | +――――CAPS +―――――――――カナ MSB 縦4、横90H LSB □□□□□□□□ | | +――STAT | +―――――――2ndF +―――――――――M MSB 縦3、横90H LSB □□□□□□□□ +―――――CASL MSB 縦2、横90H LSB □□□□□□□□ | | +―――RUN | +―――――PRO +――――――――TEXT LSB □□□□□□□□ || | | +――RAD || | +――――CONST || +――――――PRINT |+――――――――BUSY +―――――――――BATT <終わりに、編> 今回「私方式」で LCD 関係を調査してみましたが、どうにも自信がない状態です。うーん。努力あるのみ? もしかしたら、本当に 40H、41H 以外にも LCD 関係の I/O ポートがあるのかもしれません。 また、もっと効率のいいやり方があるのかもしれません。(アセンブラソースを C 言語に直したりするとか。 最近の組み込み系はアセンブラで記述することはあまり内容なので・・・) 前項で独自に書いた I/O 表ですが、こうしてみると E200->G815 の過程で複雑化した LCD 関係を G850 で根本から書き直したのが良くわかります。 ・・・そのせいで苦労したんですが。かなり解りやすくなったの ではないでしょうか。 今回はLCD解析だけだったけれども、今度は IOCS BFD0H のゲーム用最適化をしてみたいと思います。 (だからタイトルが「ただいま LCD 解析中」なのです。) ここで書いたことが間違っている箇所があるかもしれません。もしかしたら全然違うと言うこともありえ ます。そういう時は、メールなどいただけると助かります。 ここで書いたことが誰かの役に立ちますよう祈りつつ、終わりとしたいと思います。 10 企画2:中間色のススメ ポケットコンピュータは白/黒の 2 階調しか使用できません。これはどうしようもない事実でありま す。しかし、白黒だけで絵を描こうとするとどうしても表現の幅が狭まってしまいます。 そこで拙作 web ページ上で中間色の紹介をしたわけですが、あまりにも実用性が見出せないサンプル で今見るとかなり恥ずかしいものです。 <その当時のサンプルリストと実行画面サンプル> サンプルリスト(E200、G800系) 10 CLS :CLEAR 20 'OUT &H40,&HA7 <―反転した時の効果を見たい人は「’」をはずしてください。 30 GCURSOR (0,7):GPRINT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 40 GCURSOR (0,23):GPRINT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 50 GCURSOR (0,15) 60 GPRINT "FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF" 70 GPRINT "FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF" 80 GOTO 60 実行結果 これは「白->黒->白->・・・」と高速に表示されると人間の目にはその中間である「灰色」に見えてしま うという現象を利用しています。実際に液晶パネルで諧調を表現させようとするときに使用されるこ とがある手法です。 実行結果の画像を見ると分かりますが、最小限過ぎて何の感慨も得られません。何かを表現したわ けではないので当然と言えば当然ですが、これで使用する気になる人はいないのではないでしょうか。 そこで表現力増強作戦と称し、もっと萌え萌えな画像でやってみたらどうなるかをやってみました。 私が取った手法は以下のとおり(PC-G850 用です) 1.白/黒/灰で 144x48 の画像を描く (WindowsXP 上でペイントソフトを用いて描きました) 2.画像を横にして灰色要素を白くしたものと黒くしたものを作成(パレット変更だと楽) 1 2 既にツッコミ所満載ですが・・・ ->絵が下手なのは普段自分は絵を描かない人だから(小学 5 年生レベル) ->リボンだったり髪が長かったりスカートだったりするのは、普通に描くと女の子に見えないので ->しましまなのは中間色のサンプルでこれ以上のものはないと思ったため(しましま大好き) ->各所の書込みが甘々なのは、色が増えるだけで楽して堕落してしまったため 11 3.分解した画像をそれぞれ GPRINT で表示できる形式の文字列に変換します。 (これが解らない人は、マニュアル:BASIC の GPRINT の項を参照してください。) この作業が一番時間がかかり、しかも変換ミスすると直すのが大変です。48x48 ドットのレベルで も軽く 2 時間程度かかってしまうことから見ても、144x48 の画像を 2 回も直す作業は普通にはやっ てられません。 そこで、作業時間の短縮の観点から見て、「HSP」というプログラミング言語に手を出してみま した。見た限り、Windows 上で画像を扱うに際して一番敷居が低そうだったから、と言うのが理由 です。実際にインストールして、命令リファレンスの中から「画像の表示(picload)」 「画像の1画素 の色情報を読み取る(pget x,y)」という2つの命令を見つけました。 「これさえあれば何とかなる気が する」程度の気持ちでHSPチュートリアルを開始しました。 …2 時間後、チュートリアルを終えて更に 2 時間かけて簡単なスクリプトを作りました。(リスト1) 読み込んだ画像の左上から 144x48 の範囲で、色が黒い点(RGB で 0.0.0)の要素の点を変換対象と しています。最後にクリップボードに書き出すので、それを適当なテキストファイルにはっつけて 使用します。もちろん、画像はひとつずつしか変換できないので、1回実行したら違う画像を指定 してください。 仕組み(アルゴリズム)はものすごく単純です。画像の 1x8 の範囲を読み込んで if 文の嵐で0~F の 値を文字列変数に次々と入れるだけです。 これで表示するデータができました。 4. 3 で作成したデータを用いて実際にポケコン用のプログラムを書きます。 実は、ここで問題が発生しました。 なんと、BASIC でプログラムを組んだところ、「書き換えが遅すぎてお話にならない」のです。 目で追えるスピードで画面を書き換えているため、中間色は作り出せていません。これは、表示対象 の画像が大きすぎたのが原因です。まさかこうなるとは思いもよりませんでした。 しょうがないので、マシン語で記述することにしました。(リスト2) マシン語モニタで USER 82B としてからアセンブルしてモニタ上から G100 してください。 それでは、ラベルごとに分解した上で簡単に説明をします。 画像を交互に表示して(点滅させて)中間色を出しています。 CLS:画面クリア。IOCS コール 0BFEEH は文字の n 個表示です。 A の文字コード(00H)を B 分(24*6)、D(Y:00H)E(X:00H)から表示、つまりは全部消去。 START:メインルーチン開始 黒いほうのデータの先頭アドレスを取得 WRITE ルーチンをコールしてデータ描画 綺麗に表示するために WAIT ルーチンをコールして時間調節 白いほうのデータの先頭アドレスを取得 WRITE ルーチンをコールしてデータ描画 綺麗に表示するために WAIT ルーチンをコールして時間調節 IN A,(1FH) -> RLCA -> RETC は STOP キー検出したらプログラム終了と言うこと START ルーチン先頭へ WRITE:IOCS コール 0BFD0 を利用してデータ描画します。 HL に表示したいデータの先頭アドレス(START ルーチンで入れてます) B に表示する回数指定(144:1行分) D は Y 座標指定(00H~05H:5 行) E はX座標指定(00H:必ず 0 から表示) 1行ずつデータを表示しています。 座標設定->IOCS ルーチンで IOCS 呼び出し->ADDADD ルーチンでアドレス更新 ADDADD:IOCS コールの際に指定する HL に描画した分だけアドレス値を追加します IOCS:IOCS 0BFD0H をコールします。その前後でレジスタの退避&復帰を行います。 WAIT:A の 255~0 のデクリメント作業を B 回行って WAIT としています。 B_DATA:黒いほうのDATA W_DATA:白いほうのDATA 表示できましたか?私なりに全力を尽くして絵を描きましたが、まだまだ、と言う感じです。 しかし、これを見た人が「自分もやってみよう」と言う気になれば幸いと思います。 12 リスト1:HSP 用 画像->GPRINT 変換 #include "hspext.as" ; 変換対象の画像を以下に指定。BMP 144x48 の画像に対応 ; ・・・というか BMP 以外はダメ(動作保障外) ; ・・・というか 144x48 以上の解像度の画像を入力しても 144x48 しか変換しないはず ;picload "黒いほう.bmp" picload "しろいほう.bmp" ; 画像の x と y 初期値 x=0 y=7 ; クリップボードへ書き出す文字列(限界 2000 文字) st="" sdim st,2000 ; 6LINE 分繰り返し repeat 6 ; 144 ドット分繰り返し repeat 144 x7=0 : x6=0 : x5=0 : x4=0 : x3=0 : x2=0 : x1=0 : x0=0 ; GPRINT 変換用 pget x,y if (rval=0) & (gval=0) & (bval=0) : x7 = 1 pget x,y-1 if (rval=0) & (gval=0) & (bval=0) : x6 = 1 pget x,y-2 if (rval=0) & (gval=0) & (bval=0) : x5 = 1 pget x,y-3 if (rval=0) & (gval=0) & (bval=0) : x4 = 1 pget x,y-4 if (rval=0) & (gval=0) & (bval=0) : x3 = 1 pget x,y-5 if (rval=0) & (gval=0) & (bval=0) : x2 = 1 pget x,y-6 if (rval=0) & (gval=0) & (bval=0) : x1 = 1 pget x,y-7 if (rval=0) & (gval=0) & (bval=0) : x0 = 1 ; 変換処理下辺 if (x7=0) & (x6=0) & (x5=0) & (x4=0):st+="0" if (x7=0) & (x6=0) & (x5=0) & (x4=1):st+="1" if (x7=0) & (x6=0) & (x5=1) & (x4=0):st+="2" if (x7=0) & (x6=0) & (x5=1) & (x4=1):st+="3" if (x7=0) & (x6=1) & (x5=0) & (x4=0):st+="4" if (x7=0) & (x6=1) & (x5=0) & (x4=1):st+="5" if (x7=0) & (x6=1) & (x5=1) & (x4=0):st+="6" if (x7=0) & (x6=1) & (x5=1) & (x4=1):st+="7" if (x7=1) & (x6=0) & (x5=0) & (x4=0):st+="8" if (x7=1) & (x6=0) & (x5=0) & (x4=1):st+="9" if (x7=1) & (x6=0) & (x5=1) & (x4=0):st+="A" if (x7=1) & (x6=0) & (x5=1) & (x4=1):st+="B" if (x7=1) & (x6=1) & (x5=0) & (x4=0):st+="C" if (x7=1) & (x6=1) & (x5=0) & (x4=1):st+="D" if (x7=1) & (x6=1) & (x5=1) & (x4=0):st+="E" if (x7=1) & (x6=1) & (x5=1) & (x4=1):st+="F" ; 変換処理上辺 if (x3=0) & (x2=0) & (x1=0) & (x0=0):st+="0" if (x3=0) & (x2=0) & (x1=0) & (x0=1):st+="1" if (x3=0) & (x2=0) & (x1=1) & (x0=0):st+="2" if (x3=0) & (x2=0) & (x1=1) & (x0=1):st+="3" if (x3=0) & (x2=1) & (x1=0) & (x0=0):st+="4" if (x3=0) & (x2=1) & (x1=0) & (x0=1):st+="5" if (x3=0) & (x2=1) & (x1=1) & (x0=0):st+="6" if (x3=0) & (x2=1) & (x1=1) & (x0=1):st+="7" if (x3=1) & (x2=0) & (x1=0) & (x0=0):st+="8" if (x3=1) & (x2=0) & (x1=0) & (x0=1):st+="9" if (x3=1) & (x2=0) & (x1=1) & (x0=0):st+="A" if (x3=1) & (x2=0) & (x1=1) & (x0=1):st+="B" if (x3=1) & (x2=1) & (x1=0) & (x0=0):st+="C" if (x3=1) & (x2=1) & (x1=0) & (x0=1):st+="D" if (x3=1) & (x2=1) & (x1=1) & (x0=0):st+="E" if (x3=1) & (x2=1) & (x1=1) & (x0=1):st+="F" ; 次の要素へ x+=1 if x=72:st+="¥n" loop ; 次のラインへ x=0 y=y+8 st+="¥n¥n" loop ;最後にクリップボードへ書き出し clipset st stop 13 リスト2:サンプル中間色表示ルーチン(アセンブラ、注:ポケコンのアセンブラ用なので、行番号が付いています。 ) 0100H 10 ORG 20CLS:XOR A 30 LD B,24*6 40 LD D,A 50 LD E,A 60 CALL 0BFEEH 70START:LD HL,B_DATA 80 CALL WRITE;BLACK 90 CALL WAIT 100 LD HL,W_DATA 110 CALL WRITE;WHITE 120 CALL WAIT 130 IN A,(1FH) 140 RLCA 150 RET C 160 JR START 170WRITE:LD B,144 180 LD E,00H 190 LD D,00H 200 CALL IOCS 210 LD D,01H 220 CALL ADDADD 230 CALL IOCS 240 LD D,02H 250 CALL ADDADD 260 CALL IOCS 270 LD D,03H 280 CALL ADDADD 290 CALL IOCS 300 LD D,04H 310 CALL ADDADD 320 CALL IOCS 330 LD D,05H 340 CALL ADDADD 350 CALL IOCS 360 RET 370ADDADD:PUSH BC 380 LD BC,144 390 ADD HL,BC 400 POP BC 410 RET 420IOCS:PUSH HL 430 PUSH DE 440 PUSH BC 450 CALL 0BFD0H 460 POP BC 470 POP DE 480 POP HL 490 RET 500WAIT:XOR A 510L1:LD B,5 520L2:DJNZ L2 530 DEC A 540 JR NZ,L1 550 RET 600B_DATA:DW 0C000H,00438H,0FAFAH,0F9FAH 610 DW 0F9F9H,079F9H,07979H,07979H 620 DW 07979H,0F9F9H,0F9F9H,0F9F9H 630 DW 0F9F9H,0F9F9H,0FAFAH,004FAH 640 DW 0E018H,00000H,00000H,00000H 650 DW 00000H,00000H,00000H,00000H 660 DW 00000H,00080H,00000H,00000H 670 DW 00000H,00000H,00000H,00000H 680 DW 00000H,00000H,00000H,00000H 690 DW 00000H,00000H,00000H,00000H 700 DW 00000H,00000H,00000H,00000H 710 DW 00000H,00000H,08000H,0C080H 720 DW 0E0C0H,0F0E0H,0F8F0H,0FCF8H 730 DW 0FFFEH,0FFFFH,0FFFFH,0C3C3H 740 DW 00383H,00707H,01F0FH,0FE3FH 750 DW 0F8FCH,0F8F0H,0FFFCH,0FFFFH 760 DW 0FFFFH,0FFFFH,0FFFFH,0FFFFH 770 DW 0FFFFH,0FFFFH,0FFFFH,0FFFFH 800 DW 0FF00H,00000H,0FFFFH,0FFFFH 810 DW 0FDFFH,070F8H,07070H,07070H 820 DW 07070H,0F8F8H,0FDFDH,0FFFFH 830 DW 0F8FDH,0FFFDH,0FFFFH,000FFH 840 DW 0FF00H,00000H,00000H,018E0H 850 DW 00106H,0E472H,08804H,03448H 860 DW 0C1E2H,0E8E7H,0E0F0H,0E0E0H 870 DW 0E0E0H,0F0E0H,0F0F0H,0F0F0H 880 DW 0F0F0H,0D0F0H,0F0B0H,0F0F0H 890 DW 0F0F0H,0F0F0H,0F0F0H,0F0F0H 900 DW 0F8F8H,0FCFCH,0FEFEH,0FFFFH 910 DW 0FFFFH,0FFFFH,0FFFFH,0FFFFH 920 DW 03F7FH,00F1FH,09F0FH,0FFFFH 930 DW 0EFFFH,083C7H,0C3C1H,01FE7H 940 DW 00F1FH,00C06H,0FFFEH,0FFFFH 950 DW 001F9H,00101H,00701H,0FFFFH 960 DW 0FFFFH,001F9H,00301H,00703H 970 DW 01F0FH,0FF7FH,0FFFFH,0FFFFH 980 DW 0FF00H,00000H,0FFFFH,0FFFFH 990 DW 0FDFFH,0F0F8H,0F0F0H,0F0F0H 1000 DW 0F0F0H,0F8F8H,0FDFDH,0FFFFH 1010 DW 0F8FDH,0FFFDH,0FFFFH,000FFH 1020 DW 0FF00H,00000H,00000H,021C0H 1030 DW 09213H,077DEH,03FF4H,0FEFCH 1040 DW 0FFFFH,09FFFH,0F193H,0FFFFH 1050 DW 05FFFH,0030BH,027C3H,00F07H 1060 DW 05F0FH,076BFH,0FFEDH,0FFFFH 1070 DW 0FFFFH,0FFFFH,0FFFFH,0BF7FH 1080 DW 02F5FH,00F17H,0BF1FH,0FFFFH 1090 DW 0FFFFH,0FFFFH,0FFFFH,0F0FBH 1100 DW 0F0C0H,0FEFCH,00F3FH,00307H 1110 DW 08001H,0E1C1H,0FBF3H,078FCH 1120 DW 01038H,07E38H,0FFFFH,08FBFH 1130 DW 08083H,0C080H,0FCF0H,0FFFFH 1140 DW 09FBFH,08087H,08080H,08080H 1150 DW 00000H,0FF80H,0FFFFH,0FFFFH 1200 DW 0FF00H,00000H,0FFFFH,0FFFFH 1210 DW 083FFH,0EFEFH,0EFEFH,0EFEFH 1220 DW 0EFEFH,0EF0FH,0EFEFH,0EFEFH 1230 DW 0EFEFH,0FF83H,0FFFFH,000FFH 1240 DW 0FF00H,00000H,01F00H,0F010H 1250 DW 0F3F0H,068F1H,00C8BH,09F0FH 1260 DW 0FFBFH,088A8H,0FFFFH,0FFFFH 1270 DW 08417H,040C0H,00241H,08000H 1280 DW 00908H,07800H,07378H,0FF6FH 1290 DW 0E71FH,07723H,0D2DFH,0F851H 1300 DW 07874H,07C78H,039BAH,03839H 1310 DW 07C7CH,0FF7FH,0FFFFH,0FFFFH 1320 DW 0FFFFH,0FFFFH,0E8FCH,0FCF0H 1330 DW 0FFFFH,08FBFH,00103H,08000H 1340 DW 0F8F0H,0FEFCH,01F7FH,0070FH 1350 DW 00703H,0CF8FH,0FFFFH,0FCFFH 1360 DW 087FFH,00807H,00F0CH,01017H 1370 DW 07E39H,0FFFFH,0FFFFH,0FFFFH 1400 DW 0FF00H,00000H,0FFFFH,0FFFFH 1410 DW 01FFFH,07F7FH,07F7FH,07F7FH 1420 DW 07F7FH,07F00H,07F7FH,07F7FH 1430 DW 07F7FH,0FF1FH,0FFFFH,000FFH 1440 DW 07F00H,08080H,02040H,003F0H 1450 DW 03F0FH,0FCFFH,0C6F1H,07F9FH 1460 DW 0FFFFH,0C4F4H,07F4BH,0FFFFH 1470 DW 0CFCBH,08793H,08F8FH,0CF87H 1480 DW 0EAC0H,0B8F5H,0F274H,0C4E9H 1490 DW 0F0E3H,0FCF8H,0FFFFH,0CCF6H 1500 DW 03299H,08060H,06110H,08682H 1510 DW 0FECEH,0FCFCH,0FFFDH,0FFFFH 1520 DW 0FFFFH,0FFFFH,0FFFFH,0FFFFH 1530 DW 0FBFFH,0F0F9H,0F1E1H,0FFFAH 1540 DW 0FFFFH,0193FH,00808H,01010H 1550 DW 0FF9EH,0FFFFH,0C3CFH,08081H 1560 DW 0F0E0H,0FDF9H,03E7EH,00C1CH 1570 DW 09008H,0FFDFH,0C7FFH,00103H 1600 DW 00300H,0100CH,02F2FH,04F2FH 1610 DW 04C4FH,04F4FH,04F4FH,04F4FH 1620 DW 04F4FH,04F4FH,04F4FH,04F4FH 1630 DW 04F4FH,04F4CH,04F4FH,0204FH 1640 DW 02020H,01010H,00608H,00001H 1650 DW 00000H,00100H,00703H,01F0FH 1660 DW 01B1EH,03B16H,03F3EH,03F3FH 1670 DW 03F3FH,03F3FH,03F3FH,03F3FH 1680 DW 03F3FH,02D3FH,03F3BH,03F3FH 1690 DW 0FF7FH,0FFFFH,0FFFFH,0FFFFH 1700 DW 0FFFFH,0FDFEH,0FEFEH,0FFFFH 1710 DW 0DFDFH,09F9FH,01F1FH,00F0FH 1720 DW 01F0FH,01F1FH,03F1FH,03F3FH 1730 DW 07F3FH,0FFFFH,0FFFFH,0FFFFH 1740 DW 0FFFFH,0FFFFH,0FEFEH,0FFFEH 1750 DW 0FFFFH,0EFFFH,0C3E7H,0C0C1H 1760 DW 0C3C1H,0C7C3H,0E8C4H,0FCF8H 1770 DW 0FFFFH,0CFFFH,080C3H,0F8C7H 2000W_DATA:DW 0C000H,00438H,00202H,00102H 2010 DW 00101H,00101H,04141H,04141H 2020 DW 04141H,08181H,00101H,00101H 2030 DW 00101H,00181H,00202H,00402H 2040 DW 0E018H,00000H,00000H,00000H 2050 DW 00000H,00000H,00000H,00000H 2060 DW 00000H,00080H,00000H,00000H 2070 DW 00000H,00000H,00000H,00000H 2080 DW 00000H,00000H,00000H,00000H 2090 DW 00000H,00000H,00000H,00000H 2100 DW 00000H,00000H,00000H,00000H 2110 DW 00000H,00000H,08000H,0C080H 2120 DW 0E0C0H,0F0E0H,0F8F0H,0FCF8H 2130 DW 0FFFEH,0FFFFH,01FFFH,00103H 2140 DW 00000H,00000H,00000H,08000H 2150 DW 0E0C0H,0F8F0H,0FEFCH,0FFFFH 2160 DW 0FFFFH,0FFFFH,0FFFFH,0FFFFH 2170 DW 0FFFFH,0FFFFH,0FFFFH,0FFFFH 2200 DW 0FF00H,00000H,00000H,00000H 2210 DW 00000H,00000H,04040H,04040H 2220 DW 04040H,08080H,00101H,00001H 2230 DW 00000H,00181H,00000H,00000H 2240 DW 0FF00H,00000H,00000H,018E0H 2250 DW 00106H,08462H,08804H,03448H 2260 DW 041E2H,02827H,02030H,02020H 2270 DW 02020H,090A0H,09090H,09090H 2280 DW 09090H,09090H,09090H,09090H 2290 DW 01090H,0D090H,0F0D0H,0F0F0H 2300 DW 0F8F8H,07CFCH,07E7EH,0BFBFH 2310 DW 09FBFH,0F907H,00F1FH,00F0FH 2320 DW 00F0FH,00F0FH,01F0FH,07F3FH 2330 DW 08F9FH,08307H,04041H,01020H 2340 DW 00810H,00404H,00102H,00101H 2350 DW 00101H,00101H,00101H,00101H 2360 DW 00701H,001F9H,00301H,00703H 2370 DW 01F0FH,0FF7FH,0FFFFH,0FFFFH 2400 DW 0FF00H,00000H,00000H,00000H 2410 DW 00000H,00000H,00000H,00000H 2420 DW 00000H,00000H,00101H,00001H 2430 DW 00000H,00101H,00000H,00000H 2440 DW 0FF00H,00000H,00000H,021C0H 2450 DW 09213H,0375EH,02FD4H,026C4H 2460 DW 090A1H,09392H,09191H,093F1H 2470 DW 01019H,00202H,024C2H,00804H 2480 DW 0140CH,04424H,024A4H,02424H 2490 DW 0FE48H,0FFFFH,0FFFFH,0BF7FH 2500 DW 02F5FH,00F17H,0BF1FH,0FFFFH 2510 DW 0FFFFH,0FF00H,0FCFEH,0F0F8H 2520 DW 080C0H,00000H,00000H,00000H 2530 DW 00000H,00101H,00202H,00804H 2540 DW 01008H,04020H,08080H,08080H 2550 DW 08080H,08080H,08080H,0C080H 2560 DW 098A0H,08087H,08080H,08080H 2570 DW 00000H,0FF80H,0FFFFH,0FFFFH 2600 DW 0FF00H,00000H,00000H,00000H 2610 DW 00000H,0082EH,00808H,00808H 2620 DW 00808H,0E808H,00808H,00808H 2630 DW 00808H,03E00H,00000H,00000H 2640 DW 0FF00H,00000H,01F00H,0F010H 2650 DW 01110H,068F0H,00C8BH,0950BH 2660 DW 068A8H,088A8H,01088H,0A211H 2670 DW 08001H,04040H,00241H,00000H 2680 DW 00000H,00000H,00300H,0F00CH 2690 DW 0E718H,07723H,0D2DFH,07051H 2700 DW 07870H,07C78H,039BAH,03839H 2710 DW 07C7CH,00778H,0FF7FH,0FFFFH 2720 DW 0FFFFH,0FEFFH,0E8FCH,02090H 2730 DW 04020H,08080H,00000H,00000H 2740 DW 00000H,00000H,00000H,00301H 2750 DW 00703H,00F0FH,02717H,04424H 2760 DW 087FCH,00804H,00808H,01010H 2770 DW 07221H,0FFFFH,0FFFFH,0FFFFH 2800 DW 0FF00H,00000H,00000H,00000H 2810 DW 00000H,04070H,04040H,04040H 2820 DW 04040H,07F00H,04040H,04040H 2830 DW 04040H,0F000H,00000H,00000H 2840 DW 07F00H,08080H,02040H,003F0H 2850 DW 0300CH,00CC3H,04631H,06299H 2860 DW 02494H,04424H,04948H,0A15FH 2870 DW 08F80H,08793H,08B8BH,04785H 2880 DW 02040H,00810H,01214H,0C4A9H 2890 DW 0F0E3H,0FCF8H,0FFFFH,0CCF6H 2900 DW 03098H,08060H,00100H,08682H 2910 DW 0FECEH,0FCFCH,0F9FCH,0EFF7H 2920 DW 0BFDFH,0FF7FH,0FFFFH,0FEFFH 2930 DW 0F8FCH,0F0F8H,0E1E1H,0C2C2H 2940 DW 08484H,00804H,00808H,01010H 2950 DW 02010H,04020H,04040H,08080H 2960 DW 00000H,00101H,00202H,00404H 2970 DW 01008H,03F1FH,0C73FH,00103H 3000 DW 00300H,0100CH,02020H,04020H 3010 DW 04040H,04040H,04040H,04040H 3020 DW 04040H,04040H,04040H,04040H 3030 DW 04040H,04140H,04040H,02040H 3040 DW 02020H,01010H,00608H,00001H 3050 DW 00000H,00100H,00402H,01108H 3060 DW 01312H,02216H,02922H,02821H 3070 DW 02828H,02828H,02828H,02828H 3080 DW 02929H,02929H,02929H,02428H 3090 DW 0FF7FH,0FFFFH,0FFFFH,0FFFFH 3100 DW 0FFFFH,0EDEEH,0EEEEH,0DFDFH 3110 DW 0DFDFH,09F9FH,01F1FH,00F0FH 3120 DW 01F0FH,01E1FH,03B1DH,02F37H 3130 DW 07F3FH,0FFFFH,0FFFFH,0FFFFH 3140 DW 0FFFFH,0FFFFH,0FEFEH,0FCFEH 3150 DW 0F8F8H,0E8F0H,0C2E4H,0C0C1H 3160 DW 0C2C1H,0C4C2H,0E8C4H,0F0F8H 3170 DW 0E0F0H,0C0E0H,080C0H,00807H 実行結果 14 企画 3:漫画の中のポケコン 私は、周りの人に「ポケコンが好きなんです」と言って理解されたためしがありません。 しかし、 「この漫画で出てたよ」と言えば「へーそーなのかー」くらいは言ってくれるような・・・ という希望を込めて適当に漫画の本棚から出してみました。 ああっ 女神さまっ (藤島 康介著、講談社 アフタヌーンKCより) コミックマーケットに来るような男性は一回ぐらい読んだことはあるだろう有名漫画。 螢一君がレポートの計算にポケコンを使用しています。 この場面は 15 巻 森里家MACHINESでも紹介されており、SHARPのPC-1401 を 参考に描かれているということです。 PC-1401 は昭和 58 年 7 月発売、定価 29800 円、59 関数、周辺機器として CE-124(カセット インターフェイス)と CE-126P(24 桁サーマル・プリンタ/カセットインターフェイス)が使えるマ シンです。この機種は関数が自在に使用できるということでベストセラーになったようです。 5巻 Chapt.32 第3の女神さまっ より 6巻 Chapt.39 CONFESSION より ちなみに、森里家MACHINESでは下記の様に紹介されています。 手放せませんコレだけは! かなりデフォルメされているので外見的には別物だが、 型番表示を見ればわかるように、想定モデルはSHARPのPC-1401. CPUは 8bitCPU SC61860 で 16 桁表示、基本計算の他に 関数計算は三角関数、逆三角関数、双曲線関数、逆双曲線関数、対数、指数、角度変換等々、 必要にして十分な機能を持つ。 ポケコンはたくさんのメーカから様々なモデルが出ているが 理系学生は必携(のはず)。 実験に課題に授業にと、公私にわたり、螢一の学生生活に多大な貢献をしてくれた。 最近は理系学生でも関数電卓とか使っているので、ポケコン率が少ないんですよねぇー。 6 巻では、哀れ恐怖の大王の手によって液晶が破壊されてしまいます。 液晶の壊れ方が妙にリアルなところを見ると、実際に作者のポケコンは液晶割れでお陀仏したと 推測されます。 恐怖の大王の話の後、ベルダンディーの力が及ばなかった(治さなかった)のか、ポケコンは一切 登場しなくなります。BMW も治ってなかったしねぇ・・・ 代わりに森里家ではゴミ捨て場から拾ってきた 486 マシンが使用されることになります。合掌。 逮捕しちゃうぞ (藤島 康介著、講談社 パーティーKCより) こちらも同作者による有名漫画。同じくPC-1401 っぽいです。小早川 美幸が所持。 腕相撲大会では活躍したものの、なんと水没。その後 2 度と出てきませんでした。合掌。 1巻 15 FILE.18 墨東署夏美争奪大腕相撲大会 より 2巻 FILE.27 豪雨 強風 後 快晴 より マイコン刑事 (原作:鷹見 吾郎 絵:下條 よしあき、秋田書店 少年チャンピオンKCより) 局所的に有名な漫画。 ファミ通の編集部員によると、4巻が幻と言われるほど出回っていないらしい。 表紙からポケコンが! 1 巻の表紙を飾るポケコンはチラッと見えている型番と、キーボードの配列 より、SHARPのPC-1500 と推測されます。 PC-1500 は昭和 56 年 11 月発売、定価 59800 円、26 桁表示、3.5k メモ リ、周辺機器として CE-140P(7 色カラードットプリンタ)と CE-150(カラー グラフィック・プリンタ/カセット・インターフェイス)が使えるマシンです。 後述のPC-1210 と比べて演算速度が 10 倍になり、パソコンの性能に迫 ったということもあってか、世界でシリーズ累計 100 万台を出荷する大ベ ストセラー機だそうです。 また、漢字が使えるなどして最高級機種とされたPC-1600K はPC- 1500 の後継・上位機種となっています。 1巻 表紙 より ポケコン劇中初登場シーン。 バイクの修理代とガソリン代をポケコ ンで計算する主人公:矢崎大介。 (もちろん怒られます) この当時はコンピュータがこの大きさ というのは信じられなかったのでしょ うねー。 1巻 第1話 マイコン刑事・誕生 より PC-1210 は昭和 55 年 3 月発売、定価 29800 円/43000 円、メモリ 400 ステップ/1424 ステップ、周辺機器として CE-124(カセット・イ ンターフェイス)と CE-125(S)(24 桁サーマル・プリンタ/マイクロ・カ セット・レコーダ)と CE-126P(24 桁サーマル・プリンタ/カセット・ インターフェース)が使えるマシンです。 ちなみに、この機種はポケットコンピュータの栄えある第1号機だっ たりします。 以下、笑うところ。局所的に伝説になっているシーン。 ポケコンを取り上げられる主人公 コンピュータで人の命が救えるかぁ! ああ無常。撃たれるムラさん ああっそうか! 胸ポケットにポケコンを入れておくと 銃で撃たれても安心なんだ!!(すぅぱぁ勘違い) とりあえず、合掌。 (壊れてばっかし) そんなんアリかいな。命救ってます。 ・・・と、いうわけでいかがだったでしょうか。 ここに示した漫画以外にもポケコンが登場する漫画は多々あるかもしれませんが、私が知る限り ではこんなものです。 とりあえず、 「女神さまっに出てるよー」と言えばなんとなく思い出す人もいるかもしれません。 しかし、昔、 「螢一君が乗ってるBMWに乗りたいっ」と言ったら「BMWって何?」と返され たことがあるので、キャラクターの脇で登場するアイテムは女神様に比べて見向きがされにくい のかもしれません。(私は、 「ズイマーパン」と書かれた段ボール箱ですら記憶にあるのだが・・・) また何か、漫画に出てるポケコンがあったら報告したいと思います。 16 <今回のカタログ用カット> あー。あれです。ポケコン(PC-G850)で表示できるように描きました。 1.何の機種を扱ってるか描かなきゃ -> PC-E200/G800 2.とりあえず、女の子っぽいのでも描いておくか -> 右下の絵 3.あ、機種名だけだと何のことだかわからないなぁ ->ポケコン!! の工程で、1 時間程度で締め切りの朝に描きました。 人を描いても「何を描いたんだ?」と真顔で言われたことがある俺の腕では限界がある。 46x55 で描いた画像を 3 倍の 138x165 に直してそのまま印刷するとカットを書く欄にぴったり貼り付けら れます。 次があるのならば 138x165 で白黒で本気で描いてみるのもいいかもしれない。 印刷ツールは「キャラクターツクール Pro」を使っています。ドット絵を出力する際には重宝します。 私だけかもれませんが、某写真屋さんとか塗り屋さんとか O-pixed とか Oixia とかでは勝手に画像補正が かかってドットが荒れて印刷されたり、イメージと違う大きさで印刷されたりします。うーん。 補正かけないで全面印刷したいときは POP PRINT(Woody-Rinn 氏作)を重宝してるが・・・俺だけか? 写真を印刷してもドットがドットドットしてるので俺にとってはいい感じ。 以下に、PC-G850 用の表示用プログラムを載っけます。 5CLS :CLEAR 10GPRINT "FFFF7F7F7F7F7FFFFFFFC7B3ABABAB9BC7FFFFFFFFFFFFFFFFFFFFFFFF7FBFCFEFDF3F7FBFBFDF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 15GCURSOR (0,15) 20GPRINT "FF3896555555D338FFFF71ACAA6AAAA671FFFFFFFFFFFF3F1F0F0F0701060305050B0D4D4E4F17DBE8DB8F0F0703030101010303010973" 25GCURSOR (0,23) 30GPRINT "FF8E75EDDDBD7C06FFFF1CEBFB8CEBEB0CFFFFFF030100000040E0F0F8FCFCFEFEFCFCFC38C133EC235F5F8E8C88000000000004068203" 35GCURSOR (0,31) 40GPRINT "FFC1DFDF43DFDFC1FFFFFFFAF6EEDEBE7FFFF7EFEEF0E0C0808147C7C797D79797FBFDFEFFFFE7820504030206252DE9EBC9E9F3F9FCFF" 45GCURSOR (0,39) 50GPRINT "FF8F777F7C7F778FFFFFFFFFFFFFFFFFFFFFFFE727FFFFBFBFFFFF3F7F7F7F7FFFFF3FBFBFBF3FFFFFFEFCBCBC7EFFFFFF7F7F7FFF7FFF" 55GCURSOR (0,47) 60GPRINT "FFC3DDDDC3DFDFDFFFFFFFFFFFFFFFFFFFFFFFFEF8FEFEFAFAFFFDFCFBFFFFFFFEFFF8FFFFFFF8FFFFF9FFFFFFFFF8FFFFFBFBFBFFFBFF" 100IF INKEY$ =" " THEN END ELSE 100 奥付 誌名 :「ぽけこんのほん1」 制作 :単色ドット絵向上委員会(あきひ) 印刷 :オフィスベンダー南仙台店 発行日:2003 年 8 月 17 日 初版 2004 年 5 月 4 日 2 版(改訂 3 箇所) HP :「秋日和」 http://ha9.seikyou.ne.jp/home/akihi/ メアド:[email protected] ※本当はこの本の内容は無断転載とかして欲しくないんですが、こんなの転載しても得する人は少ないので 「著作権は放棄しないが転載自由」とします。 あくまでもこの本の目的は「ネタが少ないポケコン界にネタを突っ込んでみる」のが目的です。 内容をちょこっと変えてさも自分がやったように書いても、俺が笑うだけです。害はないです。たぶん。 私も私で「私の 80%はものまねで形成されています」状態なので人のことをツッコめないのですが。 18 「諸君 私はポケコンが好きだ」 「諸君 私はポケコンが好きだ」 「諸君 私はポケコンが大好きだ」 「PC-G850 が好きだ PC-U6000 が好きだ VX-4 が好きだ PB-120 が好きだ」 「AI-1000 が好きだ PC-E650 が好きだ FX-890P が好きだ Z-1GR が好きだ PC-E200 が好きだ」 「自宅で 店先で 公園のベンチの上で ロボットコンテストで 会社で 大学で 高専で 高校で エミュ上で」 「この地上に存在する ありとあらゆるポケコンが 大好きだ」 「数式を並べたプログラムが BEEP 音と共に 計算結果をたたき出すのが好きだ」 「接続されたプロッタ・プリンタがグラフを描いていく時など心がおどる」 「苦労して作り上げ、カセットに保存したプログラムが消えているのが好きだ」 「悲鳴を上げてカセットレコーダーから取り出したカセットを壁に叩き付けた時など 胸がすくような気持ちだった」 「画面に並ぶ syntax error の文字列が プログラマの精神を蹂躙するのが好きだ」 「半狂乱の 初心者が 何度も何度もリストを直している様など感動すら覚える」 「隠蔽主義の I/O ポートを解析していく様などは もうたまらない」 「アセンブラの専門書を片手に 逆アセンブルしたポケコン内部のROMデータを 次々と解析していくのも最高だ」 「毎日毎日 16 進数やバグと格闘しながら 作り上げてきたプログラムが 長き長き時の末に初めて完動してくれたときなど 絶頂すら覚える」 「マシン語の暴走でメモリが滅茶苦茶にされるのが好きだ」 「必死に守るはずだったデータが蹂躙され 消され 書き換えられる様は とてもとても悲しいことだ」 「新型のマシンの陰に隠れて 忘れ去られているマシンが好きだ」 「PJに投稿プログラムが一回も載っていないマシンは屈辱の極みだ」 「諸君 私はポケコンを 涙がこみあげるようなポケコンを望んでいる」 「諸君 私に付き従うプログラム投稿誌の大隊戦友諸君。 君達は一体何を望んでいる?」 「更なるポケコンを望むか?」 「新たな一時代を築く鬼のようなポケコンを望むか?」 「8bit の限りを尽くし 三千世界の 32bit を覆す 嵐のようなポケコンを望むか?」 「ポケコン!!」 「ポケコン!!」 「ポケコン!!」 「よろしい。 ならばポケコンだ」 「我々は満身の力をこめて今まさに振り下ろさんとする本体シュートだ」 「だが、この暗い影の中で7年もの間耐え続けてきた我々に、ただのポケコンではもはや足りない!」 「ポケコンを! 一心不乱の輝けるポケコンを!」 「我らはわずかに 数千。パソコンユーザの足下にも及ばぬマイナー集団に過ぎない 」 「だが諸君らはメモリの増設のために IC を削ってまで本体に格納するようなつわものだと 私は信仰している」 「ならば我らは 諸君と私で総兵力 100 万と 1 人のポケコン馬鹿一代集団となる」 「我々を忘却の 彼方へと追いやり web ページにポケコンの情報を載せないメーカーを叩き起こそう」 「髪の毛をつかんで 引きずり降ろし 連中に新型を開発させ 思い出させよう」 「連中に行番号 BASIC の楽しさとマシン語で本体を操る快感を思い出させてやる」 「連中に我々の異常なまでの愛情を思い出させてやる」 「本体とカバーのはざまには奴らの哲学では思いもよらない 事がある事を思い出させてやる」 「一千機の気合と根性のマシンで」 「世界を再度燃え尽きさせてやる」 「第一次ポケコンサークルコミケ復活作戦」 「状況を開始せよ」 「征くぞ 諸君」 2003年 夏 単色ドット絵向上委員会