zh en zh ja fr ja zh ja ja ja zh ja ja ja zh fr ja ja ja ja ja ja zh ja de ja ru ja it ja ru ja ca zh ja en zh pms zh ja ja en ja zh ja ja en zh id ja zh ja zh ja en ja zh ja ko ja zh zh zh ja de ja zh ja ja de ja ar ja en zh id ja zh ja zh ja zh ja zh ja en ja ja ja en ja es zh ja en ja zh en ja ja zh ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja pl fr fr de de fr sv en en fr es zh en en kk ru ja en fr ru el it fr mn en en es de sv fr fr tr en de en en de fr de sv fr fr de es en fr fr de en en ja cs en it sv en de es en en en fr pl en he pt fr en en en en ru en en sv fr en en ru en en ja ja ja pl fr fr fr ru it fr zh en de es en de en en fr en en sv fr min en pl is en en en ja ja en ja ja ja ja ja ja zh ja ja ja hu da en es de en ja en ja fr zh it zh ja ja de ja ja en ja de ja fr zh it zh ja ja fa da en es de en ja de ja fr ja it ja de ja en ja fr ja it ja de ja ja ja ja zh ja ja ja en ja ja de ja fr ja it ja de ja ja ja pt ja ja ja en ja ja su ja ja ja en ja ja it ja ja ja ja ja ja ja en en sv fr de de fr fr fr sv en de en fr it en en en ru pl it en en es en en en fr en es en en en ja ru en en cs de de en ru en en en ja fr en mn sv kk en en fr en fr tr fr az fr fr en en sv fr it fr en sv pt de de de fr el ja en he en fr fr sv ru de es en is min en en en en it en pl fr zh en es sk de ru en ja ja ja ja ja ja zh ja ja ja en ja it ja en zh gd ja en pt ja en fr ja zh ja ja ja ja ja zh ja ja ja zh ja ja ja ja en ja ja ja ja en ja en ja en ja ja en ja ja ja en en fr ko it en be es ru en es de fr en nb de fr en en fr fr fr it en fr fr fr fr en en fr de fr fr fr zh fr fr de fr fr fr nb fr ca ca oc oc fr de fr fr fr fr ca ja ja en ja fr ja en en ja en ja it ja lt ja sv ja sv ja de ja ja ru ja ja ja zh ja ja ja ja ja ja en en sv fr de de fr fr fr sv en de en fr it en en fr en en en en en en ast en fr en en en en sv hu en en en eo en en hbs_lat en en en fr it en km fr de en en pt fi hu en zh nl de en pl de en en en en en en de ru en en ja en en ar en en en en en en en en fr en my en sv hu az it ru en de fr en fa en en en en de en pt kn fr fr it ca en uk fr en la de fr ru pl en hu sv en zh en en es pl fr es ru en tg vi la en ru cv en sl en en en en hy de it en de es de hbs_lat ceb es en en en zh en fr ca en ru nn it it en fr fr en uk fr fr fr zh ja ja zh ja ja ja ja es ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ru ja ja ja en
10 OUT &H40,&HA7
液晶の明暗が反転します。
また、42h,44h,46h~6Ehまで、2刻みで加算したポートに出力しても同等の効果が得られます。そして41hを入力すると、直前に40hに出力した値が返ります。
10 PRINT IMP &H41
これも同様に、6Fhまで2刻みで加算したポートから入力できます。
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が立っていれば、そのキーが押されていることを示します。
キー入力判定サンプルプログラム
以下は全てのキーの判定をグラフィカルに表示するサンプルです。ただし、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$のワークエリアを参照することで値を参照できます。
レジスタAを、レジスタD,Eによって指定されたキャラクタ位置に出力する。
レジスタAを、レジスタD,Eによって指定されたキャラクタ位置からレジスタBの値分出力する。
レジスタHLで指定されたアドレスからレジスタBで指定される文字数の文字列を、レジスタD,Eによって指定されたキャラクタ表示位置から出力する。画面の範囲を越えて出力される場合は、BASICのPRINT文と同様に画面のスクロールが行われる。返り値として、出力完了時のキャラクタ表示座標、文字列終端アドレスはがそれぞれレジスタD,E,HLに格納され、スクロール回数がレジスタCに格納される。
文字列読み出し開始アドレス
文字列読み出し終了アドレス
レジスタHLで指定されたアドレスからレジスタBの値のバイト数分、レジスタD,Eによって指定された座標にグラフィックを出力する。
グラフィック読み出し開始アドレス
実行した瞬間にキーが押されていれば、BIOSキー入力 値対応表に対応する値がレジスタAに格納され、キャリーフラグが立つ。
BIOSキー入力 値対応表に対応する値
実行するとキー入力待ちになり、何かキーを押すとBIOSキー入力 値対応表に対応する値がレジスタAに格納され、キャリーフラグが立つ。
BIOSキー入力 値対応表に対応する値
BIOSキー入力 値対応表
shiftを押していた場合は +80h
2つ以上のキーを押していた場合は52h
コントラスト値。この値を書き換えただけではすぐには画面に反映されない。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ロックとカナロックの状態。bit0は未使用で常に立っている。bit1がCAPSに対応し、bit2がカナに対応する。書き換え可能。LCDの表示はキー入力を行うと更新される。
00000111 ||+---常に1 |+----CAPS +-----カナ
座標としてはこれを8倍した値。詳しくはVRAM表示開始位置を参照のこと。
INKEY$を実行すると0以外の値が入力される。ただし、アスキーコードは入力されない。2つ以上キーを同時押ししていると52hが入力される。
INKEY$を実行するとアスキーコードが入力される。ただし、キーが押されなかったり、2つ以上のキーを同時押ししていた場合は場合はリセットされないので注意が必要。正常に押されていたかどうかは、INKEY1を見て判断する。
説明書には記載されていませんが、BASICの命令としてBEEP命令があります。このBEEP命令は奥が深く、単なるBEEP命令ではありません。言うなれば可変周波数出力命令といったところでしょうか。
では早速、音を出してみましょう・・・と行きたい所ですが、G850にはスピーカーは内臓されていません。まずは外付けスピーカーの増設から始めます。
リード線 30cm前後
圧電ブザーはデジタルアラーム付き時計などから取り出せます。(100円ショップで調達するのがお勧めです)
スピーカーにリード線2本を半田付けします
リード線をG850のシリアルポートの(左から)2番、7番に差し込みます。
以下の命令を実行して「ピー」と聞こえれば完成です。
BEEP命令は、鳴らす回数・周波数(音の高低)・長さを指定できます。
BEEP repeat[,level][,length] ブザーを鳴らす。
ブザーを鳴らす回数。0~65535
ブザーの周波数。0~255(230hz~8khz) 小さいほど高い。省略可。
ブザーの長さ。0~65535 省略可。
周波数は以下の式で算出できます。
1300000/(166+22*level)Hz
長さは、振幅数にあたります。1000Hzの音を1秒間鳴らすには、1000回振幅させればよいです。1秒間鳴らしたい場合は、算出した周波数をそのままlengthに渡せばよいですね。
BEEP命令のlevelへの引数です。
ドレミファソラシドが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
以上の命令を実行すると、次のようなメニューが開かれます。
** PC-G850 V.2 CHECK ** 1:TOTAL 2:LCD 3:KEY 4:B/U 5:SHOCK 6:AGING 7:LB,ESD
全ての項目を実行します。メモリ内容が破壊されます。
キーが反応するか検証します。
メモリの読み書きを検証します。メモリ内容が破壊されます。
ファイル形式に関しての資料をHomma Yoshiyuki様よりご提供頂きましたので、当サイトにて公開致します。
data file 形式 for PC-G850(Homma Yoshiyuki様ご提供)
BASIC中間コード表
G850Sの中間コード表ですが、おそらくはG850と大差無いと思われます。
PC-G850S 中間コード表
(情報元:ポケコンの場所・命令関係)
当資料についてご協力頂きました方々です。大変、感謝しております。
Homma Yoshiyuki様(ポケコンのファイル形式資料のご提供)
トシ様(BIOSルーチン資料、リアルタイムキー入力値対応表のご提供)
2022-09-14 海岸や河川でバーベキューができるか調べる方法
2022-02-02 SequelizeでJSONフィールドをupdateする場合はsetメソッドを使う
2022-01-24 SwitchBotロックをSiriショートカットで「解錠」はできない
2022-01-04 テスラモデル3にTPMSセンサー無しで社外品ホイールとスタッドレスタイヤ を取り付けました
2022-01-01 サーフィンを始めました
2022-01-01 テスラモデル3ロングレンジに乗り換えたらアプデが楽しみになった
2021-12-29 歯列矯正を始めてからよく食べてるもの、完全食、フリーズドライお粥、豆腐 etc
2021-12-28 日光市ワーケーション補助金は最低1名から、申請はメールでOK
2021-11-19 2021年に買ってよかったもの
2021-08-12 自治体コロナワクチン予約は早朝チェックで最速で受けられる
akiyan.com 管理人メモ
自衛隊イラク日報 バグダッド日誌/バスラ日誌 一覧
エンコードマニアックス
オンラインCSS自動整形
はてなブックマーク人気エントリー
Copyright 1997,2022 akiyan.com, All rights reserved.