SSブログ
English Version

パピコン(PC-6001)でGAME言語(その2)GAMEコンパイラ [PC-6001]

 前回の「パピコン(PC-6001)でGAME言語」で書いたようにGAME80のインタプリタがパピコン上で動いたので今回は機能改善とGAMEコンパイラの移植を行いました。

  1. GAME80インタプリタの改善
     前回の初期バージョンではバックスペースに対応していませんでしたが、左カーソルキーのコード(1DH)でカーソルが左移動することが判ったのでBSキーに対応しました。
     更にコントロールXの操作で入力キャンセルにも対応しています。

     起動時の画面を貼っておきます。

    GAME80(PC-6001)起動画面


  2. GAMEコンパイラの移植
     元版のGAME80インタプリタの開始アドレスは8600Hからですが、今回パピコンに移植するにあたり、インタプリタのコードを拡張ROMエリアである4100Hからにし、ワークエリアを8406Hからにリロケートしています。

     このためコンパイラがコンパイル時に埋め込むインタプリタ内の処理アドレスとワークアドレスを変更する必要があります。
     手作業では大変なのでGAMEコンパイラのリロケートツールを作成し一括変換しました。

     リロケート時のログが下記になります。コンパイラソースの行カウント値、行番号、変更前データ、変更後データを表示しています。

    GAME80コンパイラ リロケート時のログ
    C:\src\PC-6001\compiler>perl cnvcomp.pl <GAMECOM.GAM >GAMEC6001.GAM
    
        7    65 : $8D06 -> $8406
       15   220 : $8603 -> $4103
       15   220 : $8603 -> $4103
       25   380 : $8C83 -> $4783
       31   440 : $8B58 -> $4658
       33   460 : $8B85 -> $4685
       34   470 : $8D52 -> $8452
       75  2420 : $8785 -> $4285
       78  2510 : $8C26 -> $4726
       80  2610 : $8C32 -> $4732
       81  2620 : $8C31 -> $4731
       83  2710 : $8C31 -> $4731
       85  2810 : $8B9C -> $469C
       95  3210 : $8A03 -> $4503
       96  3220 : $8A0F -> $450F
       97  3230 : $8A2C -> $452C
      111  3610 : $8A03 -> $4503
      140  4620 : $889E -> $439E
      144  4720 : $8D4E -> $844E
      145  4750 : $8C96 -> $4796
      148  4800 : $8A5B -> $455B
      149  4810 : $8872 -> $4372
      150  4820 : $8881 -> $4381
      151  4830 : $8904 -> $4404
      190  5740 : $8A03 -> $4503
    C:\src\PC-6001\compiler>
    


     このツールはperlを使って作っています。ソースは以下になります。

    GAME80コンパイラ リロケータ(perl)
    #!/usr/bin/perl # convert GAME compiler to any offset # ver 0.02 2020/01/28 skyriver use strict; use warnings; my $OrgStart = 0x8600; my $OrgSrcSt = 0x8E00; my $NewStart = 0x4100; # set here new code start address my $NewSrcSt = 0x8500; # set here new source save address my $OfstCod = $NewStart - $OrgStart; my $OfstDat = $NewSrcSt - $OrgSrcSt; my $Border = $OrgSrcSt - 0x100; # code/data border adrs 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 ); $change += $change < $Border ? $OfstCod : $OfstDat; $change = sprintf( "%04X", $change ); printf( STDERR "\n%5d %5s : \$%s -> \$%s", $LinCnt, $LinNo, $find, $change ); $ln =~ s/\$$find/\$_$change/; } $ln =~ s/\$_/\$/g; printf( "%s\n", $ln ); } } }


     これでコンパイラはできたのですがエミュレータに入れるため、エミュレータ(PC6001V)の「打込み代行」機能を使ってインタプリタに読込ませる段階で1行が64文字程度以上ある行が文字化けでうまく読み込めなかったため、若干ソースをいじって長い行をなくしました。

     コンパイラは自信をコンパイルするのに時間が掛かること、及びコンパイラのソースを開示していいか不明なことからコンパイル後のバイナリで公開する予定ですが、メモリの何処に配置するかが悩ましいところです。
    ※コンパイラのソースに関しては「3チップ構成Pic24CPMマイコン(その7)GAMEコンパイラ」の記事を参照すればGAMEコンパイラのソースを入手できます。

     拡張メモリの5000H-5FFFH、7000H-7FFFHを使用すると実機のROM&RAMカートリッジで試すのが難しくなるというコメントをTwitterで頂いたのですが、コンパイル結果のサイズが1939H程度で4KBの枠には収まりません・・

     そこで下表のように拡張ROMの最後の方にコンパイラを配置することにしました。
     >=$6666でコンパイラが起動します。4桁なので縁起が悪いということもないと思いますw

    No.addresscontent
    14000-4001'A'+'B'(auto exec mark)
    24002-4003初期化処理のエントリアドレス
    34004exit処理
    44006locate処理(変数Aに位置情報 High:ライン、Low:カラム)
    5400C-40FF初期化処理など
    64100-47DFGAMEインタプリタ本体
    76666-7F9EGAMEコンパイラ
    88406-84FFGAMEインタプリタ用ワーク
    98500ソース保存アドレスの初期値


  3. ダウンロード場所
     今回変更したコンパイラ付きGAMEインタプリタは「パピコン(PC-6001)でGAME言語」のページからダウンロードできます。


★2020/01/29 追記
 適切か否かは疑問がありますが、コンパイラの有効性を示す簡単なデモを作ってみました。



 ソースは以下のとおりです。

GAME80コンパイラ デモ(GAME言語)
1' PC-6001 sample2 source
2'  ver 0.01 2020/01/29 by skyriver
100 B=&+1 VRAM=$8200 X=32 Y=15
110 D=VRAM+X M=X*(Y-1)/2-1 $=12
120 I=0,X-1
130  B:I)=" " ;='3=1 B:I)='224+" "
140 @=I+1
150 @
160  I=M @ D(I)=VRAM(I) I=I-1 @=(I<0)
170  I=0,X/2-1 VRAM(I)=B(I) @=I+1
180  I=0,'4
190   R='X-1 ;=B:R)=" " B:R)='224+" " #=210
200   B:R)=" "
210  @=I+1
220  ""
230 @=(0)




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

nice!(0)  コメント(0) 

パピコン(PC-6001)でGAME言語 [PC-6001]

 「ポケコン(PC-G850V)でGAME言語」の記事ではポケコンにGAME言語を移植しましたが、今回はパピコンにTK-80BS用のGAME80インタプリタを移植してみました。

 PC-6001の実機を所有していないのでGAME言語の移植は予定していなかったのですが、今ではパソコン上でエミュレータ(PC6001V)が動くようなので実機ROM無しの状態ではありますが、GAME言語のインタプリタを移植してみました。

 コンソール入出力関連の処理はN60-BASICとROM内ルーチンで互換性のあるPC-6001用互換BASICの処理をコールする形で実装しました。

 画面表示は1075Hの表示ルーチンを使用していますが、この処理はバックスペースでカーソルが移動しないため(実物もそうなのでしょう)、BSキーについては内部的には1文字キャンセルしていますが画面表示上はカーソルが戻らない状態です(GAMEのエディタを使って画面上でソース編集することはあまりないと思うので今後対応するかは未定)。  その代りカーソルキーでカーソルを左右に移動して1ラインのスクリーンエディタのように使えます
★2020/01/28 変更
 BSキーとコントロールXでの入力キャンセルに対応しました。

 また、キー操作としてはスペースキーでポーズ(その後任意のキーで再開)、エスケープキーで中断です。

 実装方法としては拡張ROMの 4000Hからのアドレスに配置したのでこのページからダウンロードしたファイルをエミュレータで拡張ROMとして設定すれば下図のようなGAME言語のインタプリタが自動起動するはずです。

PC-6001でのGAMEインタプリタ起動画面


 Twitterにポストした動画付きコメントも貼っておきます。


 上の動画で実行しているサンプルソースは以下の通りです。VRAMの内容を参照して方向を変更しています。

サンプルソース(GAME言語)
1' PC-6001 sample source
2'  ver 0.01 2020/01/27 by skyriver
100 VRAM=$8200 X=32 Y=15 O="1"
110 B=0 C=0
120 M=1 N=0 $=12
130 @
140  @
150   D=B E=C
160   VRAM:C*X+B)=O O=O+1 ;=O>"z" O="1"
170   B=%((B+M+X)/X)
180   C=%((C+N+Y)/Y)
190  @=(VRAM:C*X+B)<>" ")
200  B=D C=E
210  ;=M<>0 N=M M=0 #=230
220  ;=N<>0 M=-N N=0
230  B=B+M C=C+N
240 @=(VRAM:C*X+B)<>" ")


 今回はROMカートリッジの前半(4000H-5FFFH)に入れる想定なので元版のインタプリタのコードとワークをそれぞれ異なるオフセットで移動しました。

 メモリマップの概要は以下のとおりです。

No.addresscontent
14000-4001'A'+'B'(auto exec mark)
24002-4003初期化処理のエントリアドレス
34004exit処理
44006locate処理(変数Aに位置情報 High:ライン、Low:カラム)
5400C-40FF初期化処理など
64100-47DFGAMEインタプリタ本体
76666-7F9EGAMEコンパイラ
88406-84FFGAMEインタプリタ用ワーク
98500ソース保存アドレスの初期値

★2020/01/28 追記 Ver0.02でメモリマップにコンパイラを追加


【ダウンロード】
GameCompV002_20200128.zip
GAME_V001_20200127.zip(旧バージョン)


【履歴】
  • Ver 0.02 2020/01/28
    BSキー対応、コントロールXキー対応、コンパイラ同梱、詳細はこちらを参照
  • Ver 0.01 2020/01/27 初版 公開

★2020/02/01 追記
 GAMEソースをリナンバ処理するGAMEのソースリストがここにあります。


【参考にさせて頂いた主なサイト】


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

nice!(0)  コメント(0) 

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

 今回ポケコン(PC-G850V)に移植したGAME言語のインタプリタ及びコンパイラの動作確認として、前回の記事「ポケコン(PC-G850V)でGAME言語(その5)LifeGame」でライプゲームを動かしてみました。

 この時は動作確認ということもあり、キャラクタベースで、かつ処理の最適化は考慮していませんでした。
 今回はグラフィック機能を使い1キャラクタを4分割することで解像度を縦横それぞれ2倍にしてライフゲームを動かしてみました。
 データ量が4倍になるのでGAME言語のソースも高速化を考慮し変更しています。

 PC-G850でグラフィック表示するためにはIOCS(BIOS)コールの一つであるパターン表示(BFD0H)をコールするか、I/Oを直に制御するかのどちらかになりますが、今回はIOCSコールを使用しました。

 パターン表示処理への引数はレジスタ経由で

 B:パターン長、D:行位置、E:カラム位置、HL:パターンアドレス

なのでGAME言語からの直接コールではなく、アセンブラ経由でコールしています。

 引数の位置情報はキャラクタ表示時のキャラクタ位置で書込み開始がキャラクタの左端の位置からになるので、1文字分より少ない書込みでは隙間が空いてしまいます。
 このため、書込みは1文字単位(8bit x 6)とし、4ピクセル分なので16通りのビットパターンを持たせました。

 今回作成したライフゲームが動作中のサンプル画面が下図です。前回のものと比べると表示領域がかなり広くなりました。^^

GAME言語でライフゲーム(グラフィック版)


 アセンブラのソースは次のとおりで1回のコールでキャラクタサイズでの一行分画面全体(2020/01/23変更)の表示処理を行っています。

PC-G850Vでライフゲーム(アセンブリ言語)
;+++++++++++++++++++++++++++++++++++++++ ; PC-G850V Graphic routine test ; set screen with LifeGame's status table ; Ver0.03 2020/01/24 by skyriver ; display all screen with one call ;+++++++++++++++++++++++++++++++++++++++ GPRINT EQU 0BFD0H ; B:count, D:line, E:col, HL:pattern adr CWIDX EQU 20 ; display col CWIDY EQU 6 ; display line TWIDX EQU 24 ; char par line DOTX EQU 6 ; X dots par char DOTY EQU 8 ; Y dots par char DIVX EQU 2 ; X division of char DIVY EQU 2 ; Y division of char ORG 03000H JR PROC WRPOS: DS 2 ; display posiotion(LOW:col, HIGH:line) STSTBL: DS 2 ; status table address PATFLG: DS 1 ; pattern flag 0:normal, 1:special DS 1 ; dummy PATADR: DS 2 ; pattern adr save work WRTTL: LD DE,0*256 + CWIDX LD HL,TITLE0 LD B,TITLE1 - TITLE0 CALL GPRINT LD DE,1*256 + CWIDX LD HL,TITLE1 LD B,TITLE1 - TITLE0 JP GPRINT PROC: LD HL,PAT0 LD A,(PATFLG) OR A JR Z,L010 LD HL,SPAT0 L010: LD (PATADR),HL LD HL,(STSTBL) LD C,CWIDY ; line counter L020: PUSH HL LD DE,CWIDX * DIVX ADD HL,DE EX DE,HL POP HL LD B,CWIDX ; char counter L030: PUSH BC LD A,(HL) INC HL ADD A,A ADD A,(HL) INC HL ADD A,A EX DE,HL ADD A,(HL) INC HL ADD A,A ADD A,(HL) INC HL EX DE,HL PUSH DE PUSH HL ADD A,A ; *2 LD E,A ADD A,A ; *4 ADD A,E ; *6 LD E,A LD D,0 LD HL,(PATADR) ADD HL,DE LD DE,(WRPOS) LD A,E INC A LD (WRPOS),A LD B,DOTX CALL GPRINT POP HL POP DE POP BC DJNZ L030 LD HL,(WRPOS) LD L,0 ; clear Write x-pos INC H LD (WRPOS),HL EX DE,HL ; HL:next ststbl adr DEC C JR NZ,L020 RET ; Title pattern data TITLE0: DB 000H,000H,040H,040H,0C0H,078H DB 026H,011H,00EH,000H,0C0H,008H DB 000H,020H,0A0H,078H,024H,022H DB 082H,044H,020H,020H,020H,0C0H TITLE1: DB 000H,008H,00CH,006H,005H,004H DB 008H,008H,004H,003H,004H,008H DB 008H,066H,085H,068H,008H,0E8H DB 0A7H,0EAH,00AH,069H,049H,0E4H ; pixel bit assign ; +--+--+ ; | 8| 4| ; +--+--+ ; | 2| 1| ; +--+--+ ; pixel pattern(normal) PAT0: DB 000H,044H,000H,000H,044H,000H PAT1: DB 000H,044H,000H,0F0H,0F4H,0F0H PAT2: DB 0F0H,0F4H,0F0H,000H,044H,000H PAT3: DB 0F0H,0F4H,0F0H,0F0H,0F4H,0F0H PAT4: DB 000H,044H,000H,00FH,04FH,00FH PAT5: DB 000H,044H,000H,0FFH,0FFH,0FFH PAT6: DB 0F0H,0F4H,0F0H,00FH,04FH,00FH PAT7: DB 0F0H,0F4H,0F0H,0FFH,0FFH,0FFH PAT8: DB 00FH,04FH,00FH,000H,044H,000H PAT9: DB 00FH,04FH,00FH,0F0H,0F4H,0F0H PATA: DB 0FFH,0FFH,0FFH,000H,044H,000H PATB: DB 0FFH,0FFH,0FFH,0F0H,0F4H,0F0H PATC: DB 00FH,04FH,00FH,00FH,04FH,00FH PATD: DB 00FH,04FH,00FH,0FFH,0FFH,0FFH PATE: DB 0FFH,0FFH,0FFH,00FH,04FH,00FH PATF: DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ; pixel pattern(special) SPAT0: DB 000H,044H,000H,000H,044H,000H SPAT1: DB 000H,044H,000H,0F0H,0B4H,0F0H SPAT2: DB 0F0H,0B4H,0F0H,000H,044H,000H SPAT3: DB 0F0H,0B4H,0F0H,0F0H,0B4H,0F0H SPAT4: DB 000H,044H,000H,00FH,04BH,00FH SPAT5: DB 000H,044H,000H,0FFH,0BBH,0FFH SPAT6: DB 0F0H,0B4H,0F0H,00FH,04BH,00FH SPAT7: DB 0F0H,0B4H,0F0H,0FFH,0BBH,0FFH SPAT8: DB 00FH,04BH,00FH,000H,044H,000H SPAT9: DB 00FH,04BH,00FH,0F0H,0B4H,0F0H SPATA: DB 0FFH,0BBH,0FFH,000H,044H,000H SPATB: DB 0FFH,0BBH,0FFH,0F0H,0B4H,0F0H SPATC: DB 00FH,04BH,00FH,00FH,04BH,00FH SPATD: DB 00FH,04BH,00FH,0FFH,0BBH,0FFH SPATE: DB 0FFH,0BBH,0FFH,00FH,04BH,00FH SPATF: DB 0FFH,0BBH,0FFH,0FFH,0BBH,0FFH ENDADR: ; End Address END
★2020/01/23 変更 画面全体表示 & タイトル表示追加。
    タイトルは適当に作ったこれ⇒
★2020/01/24 変更 MAX更新時のパターン追加

 また、GAME言語のソースは下記になります。ループ内では乗算及び除算の計算回数を少なくする等の変更を行いました。

 ソースサイズが小型で小メモリの環境向きであることもGAME言語の特徴ですね。

PC-G850Vでライフゲーム(GAME言語)
1' Life Game V0.02 2020/01/24 by skyriver 10 X=20*2 Y=6*2 W=$102 20 Q=&+1 R=5 U=0 S=Q+R+1 CNT=X*Y+S 30 M=0 L=$3000 40 "Seed(Ret:def)" F=? ;=F=0 F=777 50 '=F >=$104 >=$300A 60 W(0)=$0215 "Max" 70 W(0)=$0415 "Gen" 80 !=2000 100 @ 102 P=0 T=T+1 L:6)=0 110 ;=T>M M=T L:6)=1 W(0)=$0314 ?(4)=M 112 W(0)=$0514 ?(4)=T 114 L(1)=0 L(2)=S >=$3000 K=S 120 B=0,Y-1 130 A=0,X-1 140 ;=K:0)<>0 P=P+1 !=1000 150 K=K+1 160 @=A+1 180 @=B+1 200 I=0,X*Y-1 210 Z=CNT:I) CNT:I)=0 220 ;=(Z<2)+(Z>3) S:I)=0 230 ;=Z=3 S:I)=1 240 @=I+1 250 ;=V>5 !=2000 V=0 #=300 260 !=3000 270 ;=P=H V=V+1 #=300 280 H=P V=0 300 @=(0) 1000' count up around cell 1010 F=X*B+A CNT:F)=CNT:F)-1 1020 E=B-1,B+1 1030 G=E ;=E<0 G=Y-1 1040 ;=G=Y G=0 1050 G=G*X 1060 D=A-1,A+1 1070 F=D ;=F<0 F=X-1 1080 ;=F=X F=0 1090 F=F+G 1100 CNT:F)=CNT:F)+1 1110 @=D+1 1120 @=E+1 1130 ] 2000' clear 2010 T=0 I=X*Y-1 @ S:I)=0 CNT:I)=0 I=I-1 @=(I<0) 2020 I=0,X*Y/20 2030 F=('X/2)+(X/4) B=('Y/2)+(Y/4) S:X*B+F)=1 2040 @=I+1 2050 ] 3000' check FixPattern P <- count 3010 Q:U)=P P=0 U=U+1 ;=U>R U=0 3020 I=0,R P=P+Q:I) @=I+1 3030 ]
★2020/01/23 変更 タイトル表示対応
★2020/01/24 変更 乱数seed設定追加(Returnでデフォルト値)

 尚、GAME言語のインタプリタやコンパイラ等は「ポケコン(PC-G850V)でGAME言語」からダウンロードできます。

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


★2020/01/21 追記 {
 Twitterにアップした動画は編集ミスやtypoが・・・・orz
 編集時に何とかしようと思うと後が大変なので録画時に気合を入れてミスをなくすのがbetterですね(自分への教訓)
}
★2020/01/23 追記 {
 今回のLifeGameのプログラムはソースエンド位置を保持する'&'の値の次のアドレスからテーブル用ワークとして使っています。
 ビデオ内では実施していませんでしたが、ソース先頭アドレスである'='の設定だけでは'&'はアップデートされないため、'&'をアップデートするための == コマンドを行ってからプログラム実行するようにしてください。
}

 以下は今回作成したライフゲームの自動起動HEXファイルの作成についての個人的なメモ書きです。

 GAMEソースの開始アドレス(=空エリア)は0C00Hからで次のようにメモリに配置した。

No.startendcontents
10C02H0D6DHassembled object
20D70H134AHcompiled object
31350H1716Hwork area


 更にGAME内に下記のパッチを入れ、コンパイルしたプログラムが自動起動するようにした。
・0406 21 0C 00 -> 21 4F 13  change '=' and '&' value
・0420 21 8D 0A -> C3 70 0D  jump to compiled object

 GAMEインタプリタを含む自動起動HEXファイルは以下からダウンロードできます。
 ※使用メモリ領域は 0100H-1716H で、G100で起動します。

 注意:インタプリタに上記のパッチを入れているので通常のGAME言語インタプリタを使用する場合は再度インタプリタのダウンロード(もしくは上記のパッチを元に戻す)が必要です。

lifeAuto20200124.zip

★2020/01/24 変更 {
 ・いつも同じパターンだとつまらないので起動時に乱数のseed入力追加
 ・MAX記録時のドット表示を別パターン化
GAME言語でライフゲーム(2020/01/24版)
}
★2020/01/26 追記
 起動時の乱数初期値を987で入力すると途中で面白い模様のパターンになるのを発見w


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

nice!(0)  コメント(1) 

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

 前回の「ポケコン(PC-G850V)でGAME言語(その4)GAME高速化」で書いたようにポケコン(PC-G850V)に移植したGAME言語のインタプリタの動作も速くなり、環境的には一段落したので定番のライフゲームを動かしてみました。

 グラフィックを使えば細かくできるでしょうが、GAMEコンパイラの動作確認の意味合いも込めてまずはキャラクタベースで動かしました。

 短い周期の定常パターンであれば検出したら乱数で新しい種パターンを自動生成するようにしていますが、LCD画面が狭いのでそのうちに長い周期の定常パターンになってしまいます・・・

 動作確認目的なのでソースは綺麗に整理してはいませんが下記の通りです。
 結果として今回ポケコンに移植したGAME言語のインタプリタ及びコンパイラで問題の検出はありませんでした。

PC-G850Vでライフゲーム(GAME言語)
1' Life Game V0.01 2020/01/19 by skyriver 10 X=20 Y=6 W=$102 >=$104 12 '=21583 M=0 20 Q=&+1 R=5 U=0 S=Q+R+1 CNT=X*Y+S 30 !=2000 100 @ 102 P=0 W(0)=$15 T=T+1 "Gen" 110 W(0)=$0114 ?(4)=T ;=T>M M=T 112 W(0)=$0315 "Max" 114 W(0)=$0414 ?(4)=M W(0)=0 120 B=0,Y-1 130 A=0,X-1 140 Z="." ;=S:X*B+A)<>0 Z=$87 P=P+1 !=1000 150 $=Z 160 @=A+1 170 / 180 @=B+1 200 I=0,X*Y-1 210 Z=CNT:I) CNT:I)=0 220 ;=(Z<2)+(Z>3) S:I)=0 230 ;=Z=3 S:I)=1 240 @=I+1 250 ;=(V>5)+(P=0) !=2000 V=0 #=300 260 !=3000 270 ;=P=H V=V+1 #=300 280 H=P V=0 300 @=(0) 1000' count up around cell 1010 E=B-1,B+1 1020 G=%((E+Y)/Y)*X 1030 D=A-1,A+1 1040 F=%((D+X)/X)+G 1050 CNT:F)=CNT:F)+1 1060 @=D+1+(E=B) 1070 @=E+1 1080 ] 2000' clear 2010 T=0 I=X*Y-1 @ S:I)=0 CNT:I)=0 I=I-1 @=(I<0) 2020 I=0,X*Y/10 2030 F=('X/2)+(X/4) B=('Y/2)+(Y/4) S:X*B+F)=1 2040 @=I+1 2050 ] 3000'check FixPattern P <- count 3010 Q:U)=P P=0 U=U+1 ;=U>R U=0 3020 I=0,R P=P+Q:I) @=I+1 3030 ]


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

★2020/01/20 追記 {
 尚、GAME言語のインタプリタやコンパイラ等は「ポケコン(PC-G850V)でGAME言語」からダウンロードできます。

 下記の動画では次の操作を行っています。
  1. GAMEソースのロード
     エミュレータなので一瞬で終了していますが、パソコン側にあるライフゲームのGAME言語のソースをシリアル通信でTEXTエディタ領域にロードする。
  2. TEXTエディタ内データの変換
     GAMEインタプリタを起動し、ロードしたTEXTエディタ内のソースデータを4E00Hに置いておいた変換ツールにより、GAME言語のソースに変換する(変換後のソースは0C00Hからにセーブ)
  3. 変換ソースの確認
     変換したソースをリスト表示して確認する。
  4. コンパイル
     変換したソースを3400Hに配置しておいたコンパイラでコンパイルする。
  5. 実行
     コンパイルしたオブジェクトを実行する。
}


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

nice!(0)  コメント(0) 

ポケコン(PC-G850V)でGAME言語(その4)GAME高速化 [ポケコン]

 前回記事の「ポケコン(PC-G850V)でGAME言語(その3)GAMEコンパイラ」の最後の方に書いたように、ベンチマーク測定の結果、GAMEコンパイラはそれなりの速度ですがインタプリタはかなり遅い結果でした。

 気になったので原因を調査しました。結果、やはりキーセンス処理で時間が掛かっていたようです。

 今回のキーセンスセンス処理ではG850のIOCS(BIOS)処理であるリアルタイムキー入力(0BE53H)を使用しています。
 ネット情報ではIOCSのコールの中ではキーマトリックス回路にセンスビットを出力する度に0.2msのソフトタイマを実行しているようです。

 また、キー入力があった(Cy:1)場合に、Aレジスタで帰ってくるキーマトリックスデータを自前の処理でデコードし有効なキーが押されているか確認しています。この処理も通常のキー入力バッファ内のキャラクタ数を確認するような処理よりは重くなります(でもこの処理はキーが押されている間だけなので影響は少ない)。

 一方、GAMEインタプリタではキーセンス処理をコールするところが次の2ヶ所ありました。
  1. ソースのステートメント解析部
    予期せぬループ状態になった場合にBREAKできるように、ステートメントを解析する度にキーセンス処理をコールしている。
  2. 文字列出力部
    文字列出力後にキーセンス処理をコールしている。

 後者はあまり影響ないのですが、前者のコールは頻繁に発生するので前述のような今回の実装では実行速度に大きな影響が出ていました。
(因みにGAMEコンパイラは高速化のために後者だけコールしています)

 対策として上記 i のケースでのキーセンス処理を間引いてコールすることにしました。
 間引き数と実行時間の関係は下記の通りです。

No.コール比率ベンチマーク実行時間[sec]
1/1553(9m13s)
1/16113(1m53s)
1/3298(1m38s)
1/6491(1m31s)
1/12887(1m27s)
1/25685(1m25s)


 この結果から間引き率は1/64としました。

★2010/01/17 追記 {
 上表に1/128と1/256を追記。256ではブレークキー('TAB')の感度低下が感じられた。
 Ver0.02dで1/128に変更しました。
}

 今回高速化したGAME言語のインタプリタは「ポケコン(PC-G850V)でGAME言語」のページからダウンロードできます。

 今回の変更でバージョンを 0.02c としました。

 また、ベンチマーク結果は「MSX-DOS上でのGAME言語のベンチマーク」の記事にまとめています。

GAME言語起動画面


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

nice!(0)  コメント(0)