SSブログ
English Version

ポケコン(PC-G850V)でGAME言語(その3)GAMEコンパイラ [ポケコン]

 前回の「ポケコン(PC-G850V)でGAME言語(その2)」で書いたようにポケコン(G850V)環境でTEXTエディタで編集している内容をGAME言語のソースにコンバートするツールができたので今回はポケコンでGAMEコンパイラを動かしてみました。

 TK-80BS用のGAMEインタプリタは開始アドレスが 8600H ですが、ポケコン(G850)はメモリの後半が ROM なのでインタプリタの開始アドレスを 0400H に変更しています(インタプリタ本体及びワークエリアはそのまま平行移動)。

 従ってGAMEコンパイラを動かすためにはコンパイルの際、埋め込まれるインタプリタ内処理とワークエリアのアドレスを変更する必要があります。
 GAMEコンパイラのソースを眺めてみると $8xxx(xは[0-9,A-F])の部分を

0400H - 8600H

の値を加算したものに変更すれば動きそうです。

 手作業で変更するのは面倒なので変換ツールを作り、一括変換しました。
 変換時のログが下記になります。コンパイラソースの行カウント値、行番号、変更前データ、変更後データを表示しています。

GAMEコンパイラ内のインタプリタ関連アドレス変換ログ
C:\src\G850V\comp>perl cnvcomp.pl <GAMECOM.GAM >GAMEC.GAM

    7    65 : $8D06 -> $0B06
   15   220 : $8603 -> $0403
   15   220 : $8603 -> $0403
   25   380 : $8C83 -> $0A83
   31   440 : $8B58 -> $0958
   33   460 : $8B85 -> $0985
   34   470 : $8D52 -> $0B52
   75  2420 : $8785 -> $0585
   78  2510 : $8C26 -> $0A26
   80  2610 : $8C32 -> $0A32
   81  2620 : $8C31 -> $0A31
   83  2710 : $8C31 -> $0A31
   85  2810 : $8B9C -> $099C
   95  3210 : $8A03 -> $0803
   96  3220 : $8A0F -> $080F
   97  3230 : $8A2C -> $082C
  111  3610 : $8A03 -> $0803
  140  4620 : $889E -> $069E
  144  4720 : $8D4E -> $0B4E
  145  4750 : $8C96 -> $0A96
  148  4800 : $8A5B -> $085B
  149  4810 : $8872 -> $0672
  150  4820 : $8881 -> $0681
  151  4830 : $8904 -> $0704
  190  5740 : $8A03 -> $0803
C:\src\G850V\comp>


 このような処理はGAME言語では荷が重いのでperlを使いました。ソースは以下の通りで使い捨てツールなので凝った作りにはしていません。

GAMEコンパイラ内アドレス変換ツール(perl)
#!/usr/bin/perl # convert GAME compiler to any offset # ver 0.01 2010/01/15 skyriver use strict; use warnings; my $OrgStart = 0x8600; my $NewStart = 0x0400; # set here new start address my $Ofst = $NewStart - $OrgStart; my $LinCnt; # line counter my $LinNo; main(); sub main { my ($ln,$find,$change); while( <> ) { chomp(); $LinCnt++; $ln = $_; if( $ln =~ /^(\d+)/ ) { $LinNo = $1; while ( $ln =~ /\$(8[0-9,A-F]{3})/ ) { $find = $1; $change = eval( "0x" . $find ) + $Ofst; $change = sprintf( "%04X", $change ); printf( STDERR "\n%5d %5s : \$%s -> \$%s", $LinCnt, $LinNo, $find, $change ); $ln =~ s/\$$find/\$$change/; } printf( "%s\n", $ln ); } } }


★2020/01/16 追記 Twitterにポストしたメッセージを貼っておきます。


 「MSX-DOS上でのGAME言語のベンチマーク」の記事でベンチマークに今回のポケコンでのGAMEインタプリタとコンパイラの結果を追記しました。
 G850V(Z-80:8MHz)でのGAMEインタプリタは予想に反してかなり遅い結果で、同じコードが動いているPic24CPM ボード(Z-80:16MHz)のCP/M-80でのGAME80インタプリタの10倍程度遅いです。

 インタプリタ自体は同じコードなのでキーセンス処理が原因かと思い、キー入力チェック無しにリターンするようにしましたが変化はなく、現時点では原因不明です。

 今回移植したGAMEコンパイラの結果も追記していますが、コンパイラの方はクロック相応の速度が出ているようです。

 GAMEコンパイラを同梱したファイルは「ポケコン(PC-G850V)でGAME言語」のページで公開しています。

 GAMEコンパイラのソースを公開していいのか不明(GAME本体のソースも同様)なのでコンパイル後のHEXファイルのみ付けていますが、「3チップ構成Pic24CPMマイコン(その7)GAMEコンパイラ」の記事を参照すればGAMEコンパイラのソースを入手できます。


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

ポケコン(PC-G850V)でGAME言語(その2) [ポケコン]

 前回の「ポケコン(PC-G850V)でGAME言語」の記事で書いたようにポケコン(G850V)でGAME言語が動き出しましたがパソコン側からポケコンへGAMEソースを渡す手段がありませんでした。

 今回はTEXTモードで編集した内容をGAMEのソースに変換することでこの課題を解決しました。TEXTモードでの編集内容をGAME側に持ってこれるようになると
  • ソース編集の機能アップ
  •  GAMEに内蔵されているエディタはお世辞にも使い易いとは言えません(ポケコン環境では尚更)
     G850のエディタは肥大するプログラムサイズを小さくするため(だと思う)、BASICのような行番号付きエディタなのであまり評判は良くないようですが、GAMEのエディタと比べれば格段に使い易いと思います。

  • パソコンから受信可能
     パソコン内のGAME言語ソースをシリアル通信でG850のTEXTエディタへ送信可能なので、TEXTエディタの内容をGAMEソースに取り込めればパソコンからのファイル受信手段の課題も解決できます。
     またポケコン側で変更したGAME言語のソースをパソコンへ送信することもできるようになります(モニタのWコマンドでもできますが終了アドレスを確認する等の手間が必要)

 問題はTEXTエディタで編集中の内容がメモリの何処にあり、どんなフォーマットなのか・・ですが、GAME言語が動くようになったのでメモリ上の特定パターンの検索もGAME言語を使えば容易にできます。
 自身の機能を使って機能拡充していくので、ある意味ブートストラップ的な開発と言えるかもしれませんw

 TEXTエディタで「10 SKYRV」+CR の一行だけを入れた状態でGAME言語でメモリ検索したところ、メモリ上では下記のような状態で配置されていました。

TEXTエディタ内容のメモリ内での状態
  2060 02 c6 07 cd
       67 01 c9 ff
       00 0a 07 20
       53 4B 59 52   SKYR
  2070 56 0d ff c5   V..
       32 43 02 fe


 2067HのFFHの前と2072HのFFHの後は見るからにプログラムコードのようですね。
 このことからフォーマットは次のようになっているようです。
  1. FFH:ヘッダマーク
  2. 行番号:2バイト(ビッグエンディアン)
  3. 文字数:1バイト
  4. テキスト内容:文字数分
  5. 行数分、上記2~4の繰り返し
  6. FFH:フッダマーク

 次に開始アドレスである 2067H が保存されているメモリをGAME言語を使って検索してみた結果、77B9H7973Hが該当することが判りました。
 この両者はUSERコマンドでユーザメモリ領域を変更しても追従してくるので違いが不明(もしかしたらバックアップで2重持ち?)ですが、ネット情報ではG850のワークエリアは79xxHのものが多かったので7973Hを採用することにしました。

 フォーマットと場所が判ってしまえば、あとは既知のGAMEソースフォーマットに変換するだけなので簡単です。
 こういう処理はGAME言語なら手軽に作成できます。作成したソースは下記のとおりです。

TEXTエディタ内データからGAME言語ソースへの変換処理
1' Conv file to GAME src
2' Ver0.02 by skyriver
100 "[Text->Game converter]"/
110 E=$7973 E=E(0)+1 ;=E:-1)<>$FF "err" #=-1
120 F=E S=0
130 ;=F:0)<>$FF S=S+F:2)+2 F=F+F:2)+3 #=130
140 ??=E "-" ??=F " Size:$" ??=S /
150 "Src(Ret:$C00) " S=? ;=S<$C00 S=$C00
160 T=S
200 S(0)=E(0)
210 ;=E:0)=$FF / ??=T "-" ??=S #=-1
220 / ?(5)=S:0)*256+S:1)
230 S=S+2 C=E:2) E=E+3
240 @ S:0)=E:0)
250  E=E+1 S=S+1 C=C-1
260 @=(C=0)
270 S:-1)=0
280 #=200
★2020/01/24 最新版にアップデート


 今回はその他に
  • 'CAPS'キー対応
     メッセージ等に小文字が使えないとやはり不便なので'CAPS'キーに対応しました。
     LCDのCAPS表示の制御方法が未確認なのでカーソル形状を変えるUIにしています。
  • '2nd'キー対応
     やはり片手打ちができないと不便なので'2nd'キーにも対応しました。
     但し、"PRINT"等のような複数文字出力には対応していません(これは'SHIFT'キーも同様)

 今回の機能追加したものは「ポケコン(PC-G850V)でGAME言語」のページでダウンロードできます。

 上記のGAME言語で作ったTEXTエディタのデータをGAME言語のソースに変換するツールのソース及びそのHEXファイル(1E00H~)を同梱しているのでG850のモニタ機能でのRコマンドでパソコンからG850のメモリにシリアル転送できます。


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

ポケコン(PC-G850V)でGAME言語 [ポケコン]

 「ポケコン(PC-G850V)の購入」の記事で書いたようにポケコン(G850V)の中古を購入し、パソコンとのファイル送受信もできるようなったのでGAME言語(TK80-BS用のGAME80)を移植してみました。

 かなり前にCASIO製ポケコン(FX-890)GAME言語(C言語で作ったインタプリタとGAME80コンパイラを8086用に移植したコンパイラ)を移植したことがあります(かなり前ですがポケコンポケット通信(2020/01/22 修正)というBBSにアップした)。

 今回はPC-G850VにGAME80のインタプリタを移植してみました。
 FX-890ではハード依存である入出力処理がコンソール入出力イメージのBIOSコールで提供されていたのでポケコンとのI/F部分は割合楽でしたが、G850はコンソール入出力イメージのルーチンが無いので自前でテキストVRAMを持ったりする分、少し手間がかかりました。

 GAME言語のソースの送受信機能をまだ実装していないので手打ちでソースを入れることになりますが、それなりに動くようになりましたので公開いたします。
★2020/01/22 追記 {
 「ポケコン(PC-G850V)でGAME言語(その2)」にTEXTモードの編集内容からGAMEソースに変換するコンバータについて記載しました。
}

 全てアセンブラで記述していて、動作確認もまだ十分ではないのでバグがある可能性もあります。
 暴走した場合、メモリを破壊する可能性もありますので必要なファイル等はバックアップしてから試すようにしてください。
 最悪、ファイルが破壊された場合、こちらでは保証できませんので自己責任でお願いします。

 下のキャプチャがエミュレータでのGAME言語の起動画面です。

GAME言語起動画面


 Twitterにポストした動画付きメッセージも貼っておきます。


 動かすまでの手順は以下のとおりです。

  1. ロード方法
    1. 'BASIC'押下後、"MON"コマンドでモニタモードへ移行
    2. "USER4FFF"コマンドでユーザー領域確保
       GAME言語のソースが0C00Hから保存されるのでこのアドレス値+ソースサイズを考慮し、適当に値を決めます。
       GAMEコンパイラを使用する場合は4FFF以上を推奨
       尚、一度設定すれば次回からはこの操作は不要です。
    3. 'R'コマンドでHEXファイル受信状態にします。
    4. シリアル通信でこのサイトからダウンロードしたHEXファイルをG850へ送信します。
      参考)TeraTermの場合は "Setup" -> "Serial port"でTransmit delayのディレー値を
          1 msec/char    0 msec/line
      に設定すると私の環境では9600bpsの場合でもエラーが発生しませんでした。

    ★追記 2022/01/01
     「ポケコン(G850)用超高速Hexローダーの制作」の記事で拙作の高速ヘキサファイルローダー(DropHx)を公開しました。ロード速度は30倍程度です。

  2. 起動方法
    1. 'BASIC'押下後、"MON"コマンドでモニタモードへ移行
    2. "G100"のコマンドでGAME言語が起動します。
    3. GAME言語起動後、ソースを入れて十分に遊ぶ
    4. 'BREAK'キー押下でモニタモードに戻ります。
       GAME言語を終了しても入力したGAMEソースはメモリ上に残っています。
       再度、GAME言語を起動した際に
         A== A:0)=0 ==
       を実行すればメモリ上のソースが復活します。但し、先頭行の行番号が256以上の場合、行番号の上位バイトがゼロになります。

  3. GAME言語起動中の主な操作キー
    • 'BREAK'
       GAME言語を終了し、モニタモードに戻ります。
    • 'SPACE'
       画面表示中に押下すると表示がポーズされます。
       ポーズ後、何かしらのキーを押すことでポーズが解除されます。
    • 'TAB'
       プログラム実行中に押すことでプログラムが中断します。
       文字列表示処理でキーセンスしているので何も表示しない場合は、'TAB'キーが受け付けられないので、画面表示がない処理では""で長さ0の文字列表示を入れておくと中断できるようになります。
    • '2ndF'と'CAPS'キー
       現時点では対応していません。
       ★2020/01/22 追記
        '2ndF'と'CAPS'キーに簡易的な対応を実施済みです。

  4. メモリマップ概要
     オリジナルのインタプリタの開始アドレスは8600Hですが、G850では上位メモリはROMなので開始アドレスを0400Hに変更しています。
     インタプリタ内の処理及びワークをそのまま平行移動しているのでコンパイラを移植する場合、コンパイル時の呼び出し先やメモリ参照先のアドレスを前述の開始アドレスの変更分ずらせば動作するはずです。

    addresscontent
    0100-0101 初期化処理へのジャンプ命令
    0102 LCD表示X位置(0-23)ここを書き換えて表示位置指定が可能 
    0103 LCD表示Y位置(0- 5)同上
    0104 画面クリア処理(>=$104 で実行可能)
    0107 GAME言語の終了(モニタへ戻る) 'BREAK'ボタンでも可能
    013D-0380 G850用の表示及びキー入力等の処理
    0400- GAMEインタプリタ本体
    0C00- 起動後のソース保存開始アドレス


【ダウンロード】

GAME_G850_V002d_20200117.zip
GAME_G850_V002c_20200116.zip(旧バージョン)

【履歴】
・2020/01/17 Ver0.02d GAMEインタプリタをチューニングし若干高速化
・2020/01/16 Ver0.02c GAMEインタプリタをチューニングし高速化
・2020/01/15 Ver0.02b GAMEコンパイラを同梱
・2020/01/14 Ver0.02a 'BS'処理修正
・2020/01/14 Ver0.02 'CAPS'及び'2nd'キーに対応しました。
・2020/01/12 Ver0.01 by skyriver


【参考にさせて頂いた主なサイト】
  • akiyan.com 「SHARP PC-G850 解析資料」
    「BIOSルーチン」や「ワークエリア」等、G850関連の情報が豊富に記載されています。
  • 秋日和
    「ぽけこんのほん2(0.97MByte)」にキーセンス方法が記載されいて非常に参考になります。
     私もアセンブラでI/O直接読込みをやってみましたがシステム側のタイマ割込みで常にセンスされているようで安定した読込みができませんでした・・^^;
  • ポケコン PC-G850の解析とソフト集
    ワークエリアやI/O等の情報が参考になりました。
  • POKE COM
    入手からクロス開発環境まで広範囲な情報がまとめられています。


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

ポケコン(PC-G850V)の購入 [ポケコン]

 Amazonを散歩していたら、ポケコン(PC-G850V)でマニュアル付き(更に箱付き)で結構綺麗な状態と思われるものがあったので購入してみました。

 CPUがZ-80(8MHz)というところが良いですよねぇ^^
 以前からZ-80のポケコンが欲しいと思っていたので、まぁそれほど高いものでもないしポチリました。
 850系列ではG850とG850Sは液晶が壊れやすいようで(半田ごてを当てて修理する方法もあるそうですが)、その後に出たG850Vではこの問題が解消されているらしいのでAmazonで見つけた機種がG850Vであったことも背中を後押ししました。

 届いたものは下の写真のように結構綺麗で良かったです^^

購入したポケコン(PC-G850V)


 パソコンとのファイルの送受信ができないと何かと不便なので、まずは通信ケーブルの作成です。

 G850Vに関してはネット上に情報が豊富にあることもこの機種を選んだ理由で、「PC-G850用USB通信ケーブルを作ろう!」等のサイト情報を参考にさせて頂き、通信ケーブルを作ってみました。

 G850Vからのシリアル系の信号は5V系ですが、レベル変換無しでRS-232Cと接続できるようにするためか(推測ですが)、出力されている信号が反転しているようです。
 USB-シリアル基板によってはファーム変更により論理変更できるものもあるようですが、USBシリアル基板は既に沢山持っているので、今回は外付けのロジックICで論理を反転しました。

 74HC04も手持ちでありましたが、74HC00が沢山あったので74HC00を使っています。
 回路は下図のとおりで、CNCでプリント基板化してみようかとも思いましたが、この程度の配線数であればユニバーサル基板で作る方が速いので久々に秋月さんの両面ガラエポC基板を使って半田付けです^^

 左側にあるUSB-Serialのピン番号を連番に振っていますが、実際は使用するUSBシリアル基板に合わせて接続します。
 2つのプルアップ抵抗はポケコンに接続しない状態でも入力が浮いた状態になるのを防止(CMOSデバイスなので)するためと、ポケコン側の出力がハイインピーダンスの際、inactiveな状態(負論理なので)にするためです。(★2020/01/18 追記)

G850V用の通信基板の回路図
※ 本ケーブル制作で問題が発生した場合に保証はできませんので自己責任でお願いします。


 完成した通信ケーブル(基板?)が下の写真です。
 今回はebayで買った複数色のラッピングワイヤーで色分けして配線してみましたw

通信基板(表面) 通信基板(裏面)


 結果は問題なく、送受信できました(まぁ配線数も少ないし、ミスが発生する確率は低いでしょうけど)

 ついでに「MSX-DOS上でのGAME言語のベンチマーク」の記事に載せているベンチマークの測定結果一覧にPC-G850Vの結果も追記しておきました。


★追記 2022/07/19
 「ポケコン(G850)用超高速Hexローダーの制作」の記事でhexファイルを高速でダウンロードできる超高速Hexダウンローダーを公開しました。


★追記 2023/11/22
 「ポケコン(PC-G850)用小型シリアルケーブルの作成」の記事にポケコン用のコンパクトなシリアルケーブルの作成について書きました。

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

2020年が明けましたね [日記]

 早いもので令和初の新年がやってきました。

 今年の抱負等を書き、きちんと目標を立てた方がパフォーマンスは上がるかもしれませんが、このブログは仕事ではないので今後も楽しさ最優先でやっていきたいと思います。

 ここでは今年の年賀状の記録としてブログに貼っておきますw
 いつものようにインクジェット用年賀にプリント基板作成用に購入したページプリンタで印刷しました。

 今年もよろしくお願い致します。


年賀状


タグ:新年 年賀状
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー