So-net無料ブログ作成
English Version

レトロマイコンZ80ボードの構想(その18)BDS-C [Z80]

 CP/Mが動いたのでBD Software社のサイトからパブリックドメインで提供されているBDS-Cで遊んでみました。
 プロトタイプ宣言が使えなかったり引数の型宣言が昔風ですが、十分遊べるレベルです。

 ソースは「PIC24FJ64GAでGAME言語(その4)」の記事に書いたpicle言語のライフゲームソースからBDS-C用にコンバージョンしたので変数名等picle風ですw

 コンパイル時の状況は下記のとおりで、さすがにコンパイル速度は結構早い(約3秒程度)です。

BDS-Cでライフゲームのソースをコンパイル
b>dir B: BDSCPAT LBR : C CCC : C SUB : CC COM B: CC2 COM : CCONFIG COM : CHARIO C : CLIB COM B: CLINK COM : CRCK COM : CRCK DOC : CRCKLST1 CRC B: DEFF CRL : DEFF2 CRL : EXAMPLES LBR : FILES DOC B: -LBR NOT : LBREXT COM : LDIR COM : -READ ME B: SOURCES LBR : UNCRUNCH COM : ZCASM LBR : CCONFIG C B: CCONFIG H : STDIO H : CCONFIG CRL : L2 COM B: CHARIO CRL : DEFF3 CRL b>dir c: C: HELLO C : HELLO CRL : HELLO COM : LIFE C C: L2 C : L2 CRL : L2 COM : HELLO BAK C: FIBO BAK : FIBO CRL : FIBO COM : FIBO C C: LIFE CRL : LIFE COM : TBCPM COM : Z TXT C: LIFE SYM b>cc c:life BD Software C Compiler v1.60 (part I) 37K elbowroom BD Software C Compiler v1.60 (part II) 34K to spare b>clink c:life BD Software C Linker v1.60 Last code address: 131E Externals start at 131F, occupy 0C88 bytes, last byte at 1FA6 Top of memory: EC05 Stack space: CC5F Writing output... 46K link space remaining b>c:life


 実行中の様子が下のキャプチャです。同じパターンの繰り返しになると自動的に乱数でパターン生成するようにしています。

LifeGame with BDS-C on CP/M80


 ソースは次のとおりです。上記のようにpicleソースからコンバージョンしたので変数などがpicle風のままです ^^;

ライフゲーム(BDS-C on CP/M)
/* * Life Game written with BDS-C for CP/M80 * by skyriver 2018/04/15 */ #define X_SIZE 50 #define Y_SIZE 16 #define AR_SIZE ( X_SIZE * Y_SIZE ) int _Cnt[AR_SIZE]; int _Life[AR_SIZE]; int X,Y; int Gen,MaxGen; Clear() { int i; Gen = 0; for ( i = X_SIZE*Y_SIZE-1; i >= 0; i-- ) { _Cnt[i] = 0; _Life[i] = 0; } for ( i = X_SIZE*Y_SIZE/16; i > 0; i-- ) { X = rand() % (X_SIZE/2) + X_SIZE/4; Y = rand() % (Y_SIZE/2) + Y_SIZE/4; _Life[Y*X_SIZE+X] = 1; } putchar(0x1B); /* clear console */ printf("[2J"); } Init() { Clear(); srand( 123 ); } Inc() { int xx,yy,tx,ty; for( yy = Y - 1; yy <= Y+1; yy++ ) { ty = yy; if( ty < 0 ) { ty += Y_SIZE; } else if( ty >= Y_SIZE ) { ty -= Y_SIZE; } for( xx = X - 1; xx <= X+1; xx += 1 + (yy == Y) ) { tx = xx; if( tx < 0 ) { tx += X_SIZE; } else if( tx >= X_SIZE ) { tx -= X_SIZE; } _Cnt[ty*X_SIZE + tx]++; } } } main() { int mark,count,pos; int flg,flgb,scnt; Init(); scnt = 0; do { Gen = Gen+1; if ( Gen > MaxGen ) { MaxGen = Gen; } putchar(0x1B); /* move cursor to home */ printf("[0;0H"); printf("%5d", Gen); printf(" generation (Max:%5d)\n", MaxGen); flg = 0; for ( Y=0; Y<Y_SIZE; Y++ ) { for ( X=0; X<X_SIZE; X++ ) { if (_Life[Y*X_SIZE+X] == 0 ) { mark = '.'; } else { mark = 'O'; Inc(); flg++; } putchar(mark); } putchar('\n'); } for ( pos=Y_SIZE*X_SIZE-1; pos>=0; pos-- ) { count = _Cnt[pos]; _Cnt[pos] = 0; if (count == 3) { _Life[pos]=1; } else { if (count != 2) { _Life[pos]=0; } } } if ( (scnt>5) || (flg == 0) ) { Clear(); scnt = 0; flg = -1; } else { if (flg == flgb ) { scnt++; } else { flgb = flg; scnt = 0; } } } while (1); }



 話は変わりますが、CNCでのPCB化に苦戦しています。
 10cm程度の大きさになると基板面の平面に歪みが出て、部分的にミリング不足で銅層が繋がってしまう現象が発生してしまいます。
 使用している grblControl にはHeightMapを自動的に測定する機能もあるのでこれを利用できるようにしないとある程度のサイズの基板の作成作業が安定しない・・

 現状のミリング結果を貼っておきます。基板切り出し前のもので手で大きめにカットした状態のものです。

 トップ面では左上と右端が切削しきれていません・・orz

トップパターン



 ボトム面は左端が若干、銅層が切断できていない状態です。

ボトムパターン


★2018/04/21 追記
 このサイトにBDS Cについて色々な情報が書いてあり、HTML5で動くMSXエミュレータのWebMSXが紹介されていました。
 上記のLifeGameをMSX用の画面制御に変更してブラウザ表示で動かしてみましたのでキャプチャを貼っておきます。

LifeGame On MSX Webemulator


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(3) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 3

neko Java

「ライフゲーム(BDS-C on CP/M)」のソースをコピーして動かしてみたんだけど動かない。
Inc() ,mark が定義されているけど使われてない。
for ( Y=0; Y=0; pos-- ) とかおかしくないですか。
by neko Java (2018-05-14 17:52) 

skyriver

 コメントありがとうございます。

 preタグを付けていたので安心していましたが、ネットで再確認したところ「Internet ExplorerやNetscapeなど多くのブラウザではpreタグ内でも<と>は特殊文字として扱われる」とのことです^^;

 不等号記号を「&lt;」等に変換した後、chrome表示からのコピペで BDS C で動作することを確認しました。


by skyriver (2018-05-14 20:42) 

neko Java

動きました。
by neko Java (2018-05-15 00:13) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。