SSブログ
English Version

ポケコン(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) 
共通テーマ:趣味・カルチャー