SHARP PC-G850 解析資料

SHARP PC-G850

目次

ChangeLog

表示制御ポート

仕様表

値は、ポート40hに出力します。

内容 補足
0n GCURSORの横座標下位8ビット。

GCURSOR(n, )と同等

下と併用します
1n GCURSORの横座標上位8ビット。

GCURSOR(n*16, )と同等

上と併用します
2n
n=4
LCD電圧OFF。ぱっと見は電源が入っていない様に見えます。
n=5
LCD電圧on。
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の表示方法。

n=0
ミラーモード off
n=1
ミラーモード on
n=4
塗りマスク off
n=5
塗りマスク on
n=6
明暗反転 off
n=7
明暗反転 on
n=8
電圧増加 on?
n=9
電圧増加 off?
n=E
消しマスク off
n=F
消しマスク on
ミラーモードは面白いのですが、モード表示(CAPS、2ndF等)がおかしな事になってしまうので、あまり使えません。
Bn GCURSORの縦座標指定。但し、8ドット単位でしか指定出来ません。

GCURSOR( ,n*8)とほぼ同等

この座標指定はVRAM上での絶対的な指定です。VRAM表示開始位置を考慮して相対的に指定しないと、表示上ずれることがあります。
Cn LCDの部分的非表示

n=0
電圧OFFキャンセル
n=1
左16ドット
n=2
モード表示含む 右10ドット
n=3
左32ドット
n=4
左32ドット モード表示含む 右10ドット
n=5
モード表示含む 右42ドット
画面の見た目上の表示範囲を狭くできます。
また、9、A、B、C、D、Eでも同様の効果が得られます。
Dn 不明
En
n=2
80h(コントラスト最明)と同等。
Fn 不明

10 OUT &H40,&HA7

液晶の明暗が反転します。

また、42h,44h,46h~6Ehまで、2刻みで加算したポートに出力しても同等の効果が得られます。そして41hを入力すると、直前に40hに出力した値が返ります。

10 PRINT IMP &H41

これも同様に、6Fhまで2刻みで加算したポートから入力できます。

VRAM表示開始位置

VRAM表示開始位置をずらしてみる

  1. まず、G850の電源を入れて下さい。このとき開始ラインは「0」になっています。
  2. 開始ラインを「8」にします。「OUT &H40,&H48」と打ち込み、リターンキーを押してください
  3. 一瞬だけ画面が上に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が立っていれば、そのキーが押されていることを示します。

11hに出力
10hから入力
出力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
12hに出力
10hから入力
出力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
  • AF
  • BC
  • DE
  • HL
  • IX
レジスタAを、レジスタD,Eによって指定されたキャラクタ位置に出力する。
A
アスキーコード
D
行位置
E
桁位置
無し
文字連続出力 BFEEh 不明 レジスタAを、レジスタD,Eによって指定されたキャラクタ位置からレジスタBの値分出力する。
A
アスキーコード
B
出力する数
D
行位置
E
桁位置
無し
文字列出力 BFF1h
  • AF
  • BC
  • DE
  • HL
  • IX
レジスタHLで指定されたアドレスからレジスタBで指定される文字数の文字列を、レジスタD,Eによって指定されたキャラクタ表示位置から出力する。画面の範囲を越えて出力される場合は、BASICのPRINT文と同様に画面のスクロールが行われる。返り値として、出力完了時のキャラクタ表示座標、文字列終端アドレスはがそれぞれレジスタD,E,HLに格納され、スクロール回数がレジスタCに格納される。
B
出力文字数
D
E
HL
文字列読み出し開始アドレス
C
スクロールUP回数
D
E
HL
文字列読み出し終了アドレス
ルーチン名 アドレス 破壊レジスタ 内容
引数 返り値
グラフィック出力 BFD0h 不明 レジスタHLで指定されたアドレスからレジスタBの値のバイト数分、レジスタD,Eによって指定された座標にグラフィックを出力する。
B
出力バイト数
D
横座標
E
縦座標
HL
グラフィック読み出し開始アドレス
不明
リアルタイムキー入力 BE53h 不明 実行した瞬間にキーが押されていれば、BIOSキー入力 値対応表に対応する値がレジスタAに格納され、キャリーフラグが立つ。
無し
A
BIOSキー入力 値対応表に対応する値
ウェイトキー入力 BCFDh 不明 実行するとキー入力待ちになり、何かキーを押すとBIOSキー入力 値対応表に対応する値がレジスタAに格納され、キャリーフラグが立つ。
無し
A
BIOSキー入力 値対応表に対応する値
シャットダウン 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ポートに値を出力すると画面に反映される。インタプリタ等に処理が移ったときも画面に反映される。

10 PRINT "now:";PEEK(&H779C)
20 INPUT "change(0-31):";A
30 POKE &H779C,A
40 OUT &H40,&H80+A
50 GOTO 10
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円ショップで調達するのがお勧めです)

工程

  1. スピーカーにリード線2本を半田付けします
  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様よりご提供頂きましたので、当サイトにて公開致します。

BASIC中間コード表

G850Sの中間コード表ですが、おそらくはG850と大差無いと思われます。

PC-G850S 中間コード表
(情報元:ポケコンの場所・命令関係
下位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 PRINT 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ルーチン資料、リアルタイムキー入力値対応表のご提供)