SHARP PC-G850 解析資料
目次
- ChangeLog
- 表示制御ポート
- VRAM表示開始位置
- キーマトリクス
- BIOSルーチン
- ワークエリア
- BEEP命令
- 検品モード
- ファイル形式
- BASIC中間コード表(情報元:ポケコンの場所・命令関係)
- 謝辞
ChangeLog
- トシ様よりご提供のBIOSルーチン(文字連続出力、グラフィック出力、リアルタイムキー入力、ウェイトキー入力)とBIOSキー入力 値対応表を追加しました。(2003-05-22)
- 全面的に改修。ファイル形式、BASIC中間コード表を追加。(2003-05-21)
表示制御ポート
仕様表
値は、ポート40hに出力します。
値 | 内容 | 補足 |
---|---|---|
0n | GCURSORの横座標下位8ビット。
GCURSOR(n, )と同等 |
下と併用します |
1n | GCURSORの横座標上位8ビット。
GCURSOR(n*16, )と同等 |
上と併用します |
2n |
|
|
3n | n=カーソル点滅速度。 小さいほど点滅が早くなります。 |
3以下はLCD全体が不安定になるので、使用を控えた方が無難です。 |
40~7F | VRAM表示開始位置のセット。40が0、7Fが63に対応しています。0~63まで指定できます。 | |
80~9F | LCDコントラスト調整。小さいほど明るい。80hが最も明るく、9Fhが最も暗い。 | I/Oに出力しただけでは表面的な調整にしかなりませんので、ワークエリアCNTLSTに保存された値を読み出して相対的に調整して書き出した後に、I/Oに値を出力するのがベターです。 |
An | LCDの表示方法。
|
ミラーモードは面白いのですが、モード表示(CAPS、2ndF等)がおかしな事になってしまうので、あまり使えません。 |
Bn | GCURSORの縦座標指定。但し、8ドット単位でしか指定出来ません。
GCURSOR( ,n*8)とほぼ同等 |
この座標指定はVRAM上での絶対的な指定です。VRAM表示開始位置を考慮して相対的に指定しないと、表示上ずれることがあります。 |
Cn | LCDの部分的非表示
|
画面の見た目上の表示範囲を狭くできます。 また、9、A、B、C、D、Eでも同様の効果が得られます。 |
Dn | 不明 | |
En |
|
|
Fn | 不明 |
例
10 OUT &H40,&HA7
液晶の明暗が反転します。
また、42h,44h,46h~6Ehまで、2刻みで加算したポートに出力しても同等の効果が得られます。そして41hを入力すると、直前に40hに出力した値が返ります。
10 PRINT IMP &H41
これも同様に、6Fhまで2刻みで加算したポートから入力できます。
VRAM表示開始位置
VRAM表示開始位置をずらしてみる
- まず、G850の電源を入れて下さい。このとき開始ラインは「0」になっています。
- 開始ラインを「8」にします。「OUT &H40,&H48」と打ち込み、リターンキーを押してください
- 一瞬だけ画面が上に8ドットずれて、すぐに元に戻ります。
解説
G850の液晶は144x48ドットですが、メモリ上では144x64ドットあります。縦16ドットは常に隠れています。この16ドットは何のためにあるのかというと、高速なスクロールを行う際に使われます。たとえばBASICインタプリタが1行づつスクロールを行う際は、隠れている領域に先に書き込み、その後、開始位置を8ドットずらしてスクロールを行っています。
そして、PROGRAMモードでコードを書いてスクロールすると開始位置が変わります。CLSを実行しても開始位置そのままです。この状態で、開始位置を考慮せずにマシン語からグラフィック出力位置を指定して出力すると、表示上ずれることがあります。BASICのGCURSOR命令はこの開始座標を考慮しているのでずれません。
ALLマシン語でプログラムを構成するなら、最初に開始位置を0に設定してしまえばよいのですが、BASICと併用する場合はそうもいきません。BASICインタプリタに処理を渡してしまうと、インタプリタが開始位置を変えてしまうからです。また、文字出力系のBIOSルーチンを使用する場合も注意が必要です。文字列を出力して画面をスクロールさせてしまうと、これも同様に開始位置を変えられてしまいます。
システムが保存している開始位置は790Dhの下位4ビットで参照できます。実際の値はそれを8倍したもので、1なら8、2なら16になります。この値はあくまでもシステムが保存のために使用しているだけなので、ここの値を書き換えても画面上の表示開始位置は変わりません。変えたい場合はポート40に40~7Fの値を出力することで画面上の表示開始位置を指定できます。1ドット単位で指定できるのでスムーズな縦スクロールが実現出来ます。
でも
マシン語からグラフィックを扱う場合、この「VRAM表示開始位置」を考慮しなければなりません。ですが、再起動で表示開始位置がリセットされますので、面倒くさければ常に再起動してからプログラムを走らせるようにすれば良いです。
縦スクロールサンプルプログラム
画面がす~っとスクロールしていくサンプルプログラムです。
10 FOR A=0 TO 63
20 OUT &H40,&H40+A
30 NEXT
キーマトリクス
キーマトリクスを利用すると同時押しが判定できます。ただし、適切なウェイトを入れないと正しいキー入力は得られません。
以下にキーマトリクスの対応表を用意しました
キーマトリクス対応表
出力bitを11hか12hに出力し、10hを入力します。入力された値に対応するbitが立っていれば、そのキーが押されていることを示します。
出力bit→ 入力bit↓ |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
7 | ) | R・CM | M+ | Enter | ↑ | , | K | U |
6 | / | * | - | + | ↓ | M | J | Y |
5 | 9 | 6 | 3 | = | SPACE | N | H | T |
4 | 8 | 5 | 2 | . | TAB | B | G | R |
3 | 7 | 4 | 1 | 0 | カナ | V | F | E |
2 | π | INS | CON | ON | CAPS | C | D | W |
1 | BS | O | ; | → | TXT | X | S | Q |
0 | P | I | L | ← | BASIC | Z | A | OFF |
出力bit→ 入力bit↓ |
7 | 6 |
---|---|---|
7 | CLS | MDF |
6 | F←→E | 1/x |
5 | tan | ( |
4 | log | yx^ |
3 | in | x2 |
2 | cos | √ |
1 | sin | →DEG |
0 | 2ndF | nPr |
キー入力判定サンプルプログラム
以下は全てのキーの判定をグラフィカルに表示するサンプルです。ただし、3つ以上の同時押しである条件を満たす同時押しを行った場合、間違った判定が出てしまいます。試しているうちにその条件の傾向が分かるでしょう。G850のキーマトリクスの仕様上、回避は不可能です。
10 CLS
20 LINE(7,16)-(18,7),B
30 A=1
40 GCURSOR(8,15)
50 FOR B=1 TO 7
60 OUT &H11,A
70 A=A*2
80 GPRINT INP &H10;
90 NEXT
100 OUT &H11,0
110 FOR B=1 TO 2
120 OUT &H12,B
130 GPRINT INP &H10;
140 NEXT
150 OUT &H12,0
160 GOTO 30
ちなみに、BASICと併用してプログラムを組む際にINKEY$の値をマシン語に渡したい場合は、マシン語からINKEY$のワークエリアを参照することで値を参照できます。
BIOSルーチン
仕様表
ルーチン名 | アドレス | 破壊レジスタ | 内容 |
---|---|---|---|
引数 | 返り値 | ||
文字出力 | BE62h |
|
レジスタAを、レジスタD,Eによって指定されたキャラクタ位置に出力する。 |
|
無し | ||
文字連続出力 | BFEEh | 不明 | レジスタAを、レジスタD,Eによって指定されたキャラクタ位置からレジスタBの値分出力する。 |
|
無し | ||
文字列出力 | BFF1h |
|
レジスタHLで指定されたアドレスからレジスタBで指定される文字数の文字列を、レジスタD,Eによって指定されたキャラクタ表示位置から出力する。画面の範囲を越えて出力される場合は、BASICのPRINT文と同様に画面のスクロールが行われる。返り値として、出力完了時のキャラクタ表示座標、文字列終端アドレスはがそれぞれレジスタD,E,HLに格納され、スクロール回数がレジスタCに格納される。 |
|
|
||
ルーチン名 | アドレス | 破壊レジスタ | 内容 |
引数 | 返り値 | ||
グラフィック出力 | BFD0h | 不明 | レジスタHLで指定されたアドレスからレジスタBの値のバイト数分、レジスタD,Eによって指定された座標にグラフィックを出力する。 |
|
不明 | ||
リアルタイムキー入力 | BE53h | 不明 | 実行した瞬間にキーが押されていれば、BIOSキー入力 値対応表に対応する値がレジスタAに格納され、キャリーフラグが立つ。 |
無し |
|
||
ウェイトキー入力 | BCFDh | 不明 | 実行するとキー入力待ちになり、何かキーを押すとBIOSキー入力 値対応表に対応する値がレジスタAに格納され、キャリーフラグが立つ。 |
無し |
|
||
シャットダウン | C110h | 無し | 電源をOFFにする。 |
無し | 無し |
BIOSキー入力 値対応表
上位4ビット→ 下位4ビット↓ |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | OFF | Q | W | E | R | T | Y | U | A | S | D | F | G | H | J | |
1 | K | Z | X | C | V | B | N | M | , | BASIC | TEXT | CAPS | カナ | TAB | SPACE | ↓ |
2 | ↑ | ← | → | ANS | 0 | . | = | + | RETURN | L | ; | CONST | 1 | 2 | 3 | - |
3 | M+ | I | O | INS | 4 | 5 | 6 | * | R-CM | P | BS | π | 7 | 8 | 9 | / |
4 | ) | nPr | →DEG | √ | x2 | yx^ | ( | 1/x | MDF | 2ndF | sin | cos | ln | log | tan | F⇔E |
5 | CLS | ON |
- shiftを押していた場合は +80h
- 2つ以上のキーを押していた場合は52h
ワークエリア
仕様表
ワークエリア名 | アドレス | 内容 |
---|---|---|
コントラスト | 779Ch | コントラスト値。この値を書き換えただけではすぐには画面に反映されない。I/Oポートに値を出力すると画面に反映される。インタプリタ等に処理が移ったときも画面に反映される。
|
CAPS/カナロック | 7901h | CAPSロックとカナロックの状態。bit0は未使用で常に立っている。bit1がCAPSに対応し、bit2がカナに対応する。書き換え可能。LCDの表示はキー入力を行うと更新される。
00000111 ||+---常に1 |+----CAPS +-----カナ |
VRAM表示開始位置 | 790Dh | 座標としてはこれを8倍した値。詳しくはVRAM表示開始位置を参照のこと。 |
INKEY1 | 7966h | INKEY$を実行すると0以外の値が入力される。ただし、アスキーコードは入力されない。2つ以上キーを同時押ししていると52hが入力される。 |
INKEY2 | 7E00h | INKEY$を実行するとアスキーコードが入力される。ただし、キーが押されなかったり、2つ以上のキーを同時押ししていた場合は場合はリセットされないので注意が必要。正常に押されていたかどうかは、INKEY1を見て判断する。 |
BEEP命令
説明書には記載されていませんが、BASICの命令としてBEEP命令があります。このBEEP命令は奥が深く、単なるBEEP命令ではありません。言うなれば可変周波数出力命令といったところでしょうか。
準備
では早速、音を出してみましょう・・・と行きたい所ですが、G850にはスピーカーは内臓されていません。まずは外付けスピーカーの増設から始めます。
道具・材料
圧電ブザーはデジタルアラーム付き時計などから取り出せます。(100円ショップで調達するのがお勧めです)
工程
- スピーカーにリード線2本を半田付けします
- リード線をG850のシリアルポートの(左から)2番、7番に差し込みます。
テスト
以下の命令を実行して「ピー」と聞こえれば完成です。
BEEP 1
BEEP命令の仕様
BEEP命令は、鳴らす回数・周波数(音の高低)・長さを指定できます。
- 書式
- BEEP repeat[,level][,length] ブザーを鳴らす。
- repeat
- ブザーを鳴らす回数。0~65535
- level
- ブザーの周波数。0~255(230hz~8khz) 小さいほど高い。省略可。
- length
- ブザーの長さ。0~65535 省略可。
周波数は以下の式で算出できます。
1300000/(166+22*level)Hz
長さは、振幅数にあたります。1000Hzの音を1秒間鳴らすには、1000回振幅させればよいです。1秒間鳴らしたい場合は、算出した周波数をそのままlengthに渡せばよいですね。
音階対応表
BEEP命令のlevelへの引数です。
C | C+ | D | D+ | E | F | F+ | G | G+ | A | A+ | B |
---|---|---|---|---|---|---|---|---|---|---|---|
7 | |||||||||||
21 | 18 | 15 | 14 | 12 | 10 | 8 | |||||
49 | 46 | 43 | 40 | 37 | 35 | 30 | 26 | 22 | |||
105 | 99 | 93 | 87 | 82 | 77 | 72 | 68 | 64 | 60 | 56 | 52 |
219 | 200 | 194 | 182 | 172 | 162 | 152 | 143 | 135 | 127 | 119 | 112 |
246 | 232 |
サンプルプログラム
ドレミファソラシドが0.5秒間隔で鳴ります。
10 DATA 105,93,82,77,68,60,52,49
20 FOR A=1 TO 8
30 READ B
40 C=650000/(166+22*B)
50 BEEP 1,B,C
60 NEXT
検品モード
OUT &H69,6
以上の命令を実行すると、次のようなメニューが開かれます。
** PC-G850 V.2 CHECK ** 1:TOTAL 2:LCD 3:KEY 4:B/U 5:SHOCK 6:AGING 7:LB,ESD
- 1:TOTAL
- 全ての項目を実行します。メモリ内容が破壊されます。
- 2:LCD
- 液晶を検証します。
- 3:KEY
- キーが反応するか検証します。
- 4:B/U
- 不明
- 5:SHOCK
- 不明
- 6:AGING
- 不明
- 7:LB,ESD
-
- 1:LB
- 不明。
- 2:ESD
- メモリの読み書きを検証します。メモリ内容が破壊されます。
ファイル形式
ファイル形式に関しての資料をHomma Yoshiyuki様よりご提供頂きましたので、当サイトにて公開致します。
- data file 形式 for PC-G850(Homma Yoshiyuki様ご提供)
BASIC中間コード表
G850Sの中間コード表ですが、おそらくはG850と大差無いと思われます。
下位4ビット→ 上位4ビット↓ |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | MON | |||||||||||||||
1 | RUN | NEW | CONT | PASS | LIST | LLIST | CLOAD | RENUM | LOAD | DELETE | FILES | LCOPY | ||||
2 | CSAVE | OPEN | CLOSE | SAVE | RANDOMIZE | DEGREE | RADIAN | GRAD | BEEP | WAIT | GOTO | TRON | TROFF | CLEAR | USING | |
3 | DIM | CALL | POKE | GPRINT | PSET | PRESET | ERASE | LFILES | KILL | |||||||
4 | OUT | PIOSET | POIPUT | SPOUT | SPINP | HDCOPY | ENDIF | REPEAT | UNTIL | |||||||
5 | CLS | LOCATE | TO | STEP | THEN | ON | IF | FOR | LET | REM | END | NEXT | STOP | READ | DATA | |
6 | INPUT | GOSUB | LNINPUT | LPRINT | RETURN | RESTORE | GCURSOR | LINE | CIRCLE | |||||||
7 | PAINT | OUTPUT | APPEND | AS | ELSE | WHILE | WEND | SWITCH | CASE | DEFAULT | ENDSWITCH | |||||
8 | MDF | REC | POL | TEN | RCP | SQU | CUR | HSN | HCS | HTN | AHS | AHC | AHT | |||
9 | FACT | LN | LOG | EXP | SQR | SIN | COS | TAN | INT | ABS | SGN | DEG | DMS | ASN | ACS | ATN |
A | RND | AND | OR | NOT | PEEK | XOR | INP | PIOGET | POINT | PI | FRE | |||||
B | EOF | LOF | NCR | NPR | CUB | |||||||||||
C | MOD | FIX | ||||||||||||||
D | ASC | VAL | LEN | VDEG | ||||||||||||
E | INKEY$ | MID$ | LEFT$ | RIGHT$ | ||||||||||||
F | CHR$ | STR$ | HEX$ | DMS$ |
謝辞
当資料についてご協力頂きました方々です。大変、感謝しております。
- 堂下様
- 天方貴久様
- 横谷絵理奈様
- NPK様
- のなま様
- しょういち様
- ZOID様
- うっちー様
- Homma Yoshiyuki様(ポケコンのファイル形式資料のご提供)
- トシ様(BIOSルーチン資料、リアルタイムキー入力値対応表のご提供)