<   2015年 06月 ( 17 )   > この月の画像一覧

ポケコン PC-G850Vで電子回路工作(6/11)

MCP3002で2ch分A/D変換で取り込んでみた。
2chアナログ値を発生させるのはArduino界隈で使われているPARALLAX inc.の2-Axis Joystick。
データシートはこれ
参考にした配線図はこちらのサイト様のArduino Unoの図。

配線図はCH1と書いてある3ピンもアナログ入力として使用。
a0034780_2365478.jpg
5/31のSPI通信のコマンドで、ODD/SGNが0だとCH0選択なので1でCH1選択にする。
google sheetのタイミングチャートで表のH4,I4が0→1になるので、データとしては最初の方の0,4→2,6になる。

【Cプログラム】
10  main() {
15 unsigned char a[34]={0,2,6,2,6,0,4,2,6,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
20 char b[3][21]={"003C7EFFFFFDFD723C00",
"003C4EFFFFFDFD723C00",
"003C7EFFFFCDFD723C00"};
21 char u[21]="00000000000000000000";
22 int c,d,i,f=0;
23 unsigned char r;
24 int x=-1,x1=-1,x2=-1,w,m=0,k=0;
28 clrscr();
30 outport(0x60,1);
40 outport(0x61,1);
45 do {
50 c=10;d=0;i=-1;
70 /* while(a[++i]!=99) {*/
80 do {
90 outport(0x62,(a[i] & 0xFE));
100 if((a[i] & 1)!=0){
120 r=inport(0x62);
140 if(c!=10) {
150 if(r==1)
155 d+=(1<<c);
160 if(c==0) { w=(int)(d/8);if(f==0) x=x1; else x=x2;
162 if(x!=w) {
163 gcursor(70+(k++%50),25);
164 if(k==49){gcursor(70+48,25);gprint(u);k=0;}else gprint(b[m++%3]);
165 gotoxy(f*5,4);printf("% 5d",d);
166 line(x+(x<w),f*8,w+(x>w),7+f*8,2,0xFFFF,2);
167 if(f==0){a[5]=2;a[6]=6;x1=w;}else{a[5]=0;a[6]=4;x2=w;}f=1-f;}
168 /*pset(x++,d/22,1); */
169 /*x=(x<144)*x;*/
170 }
175 }
180 c--;
185 }
190 } while(a[i++]!=99);
200 } while(1);
210 }
配列データのアンダーラインの所がCH番号の部分。ここを167行目で書換え、フラグfで0/1でCH番号用に制御する。コマンドをかわりばんこに投げてCH0とCH1を交互に取り出す。x1,x2は前回のx座標、CH0/1用を保存。数字は最大1023なので符号を入れて5桁左詰め。
ちなみにボールはA/D値に変化があれば1ドットずつ右へ転がり50ドット移動したら70ドット目に戻る。

Youtube:ポケコンによる2軸アナログ入力
a0034780_23511766.jpg

動画の縦横が回転してしまった。
[PR]
by k1segawa | 2015-06-11 22:22 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/10)

ビジュアライゼーションを少し。

BALLを8x8で書いて動かしてみる途中のプログラム。
転がる様子をパターンにしてそれっぽく動かすのは、やっぱりセンスと手間がかかるね。
10  main() {
15 unsigned char a[34]={0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
20 char b[3][21]={"003C7EFFFFFDFD723C00",
"003C4EFFFFFDFD723C00",
"003C7EFFFFCDFD723C00"};
21 char u[21]="00000000000000000000";
22 int c,d,i;
23 unsigned char r;
24 int x=-1,w,m=0,k=0;
28 clrscr();
30 outport(0x60,1);
40 outport(0x61,1);
45 do {
50 c=10;d=0;i=-1;
70 /* while(a[++i]!=99) {*/
80 do {
90 outport(0x62,(a[i] & 0xFE));
100 if((a[i] & 1)!=0){
120 r=inport(0x62);
140 if(c!=10) {
150 if(r==1)
155 d+=(1<<c);
160 if(c==0) { w=(int)(d/8);
162 if(x!=w) {
164 gcursor(70+(k++%50),25);
165 if(k==49){gcursor(70+48,25);gprint(u);k=0;}else gprint(b[m++%3]);
166 gotoxy(0,3);printf("%d",d);
167 line(x+(x<w),0,w+(x>w),15,2,0xFFFF,2);x=w;}
168 /*pset(x++,d/22,1); */
169 /*x=(x<144)*x;*/
170 }
175 }
180 c--;
185 }
190 } while(a[i++]!=99);
200 } while(1);
210 }
ポケコンのプログラムをエディタに貼り付けて保存していたのをそのまま貼り付けてみた。まだ改善絶賛進行中なので期待しない事。
[PR]
by k1segawa | 2015-06-10 13:04 | ポケコン | Comments(0)

Windows8.1でWinHlp32.exeを入れてもHLPファイルが読めない(6/9)

上記の件、
Windows8.1にWinHlp32.exe(KB917607)を入れてもHLPファイルが読めない場合の解決法 | DoldoTeaParty様のサイトに詳しい情報が。
[KB3000850 の適用で .hlp が開けなくなる場合の対処方法] - Mr.XRAY様のサイトを参照して、
Windows 8.1: WinHelp32.exe issue after December Patchday様のツールが下の方に次のように載っている。(個人のOneDriveだから直リンしない方がいいよ。簡単にアクセスできるとサーバ負荷が高まってツール自体削除されるかもしれない)
Download “KB917607-Fix” (a zip file) from http://1drv.ms/1AkM3gv
これを「KB3000850 の適用で .hlp が開けなくなる場合の対処方法」様の手順で実行すると読めるようになった。
[PR]
by k1segawa | 2015-06-09 15:46 | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/8)

I2Cでは出力ピンになるので、入力ピンをプルアップ抵抗に繋ぐように変更。
理由はちょっと難しいので後で書く。

【回路図】
a0034780_21352761.jpg


【配線図】
a0034780_214030100.jpg


【Cプログラム】
main() {
unsigned char a[34]={0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
int c,d,i;
unsigned char r;
int x=-1;int w;

clrscr();
outport(0x60,1);
outport(0x61,1);

do {

c=10;d=0;i=-1;
do {
outport(0x62,(a[i] & 0xFE);
if((a[i] & 1)!=0) {
r=inport(0x62);
if(c!=10) {
if(r==1)
d+=(1<<c);
if(c==0) {
w=(int)(d/8);
if(x!=w) {
gotoxy(0,3);printf("%d\n",d);
line(x+(x<w),0,w+(x>w),15,2,0xFFFF,2);
x=w;
}
}
}
c--;
}
} while(a[i++]!=99);
} while(1);
}
CDSを隠すと、グラフィックの棒グラフが伸びる方向に逆転した。
値は200台から800台で変化するように変わった。あれ?
なぜか調べるのに文字を(0,3)から表示する。
いやいや信号が逆転すると思ってr==1→0に修正したんだけど元に戻した。それにwを表示してたし。
気のせいでした。
a0034780_22255829.jpg


【マイコンとの配線例】
マイコンにRC用サーボモーターを繋げる場合の電源投入時における挙動様の図が、一般的なプルダウン抵抗の説明の図がスイッチを使っているのと違って、今回の場合と似ていて分かり易い。
a0034780_22564363.jpg

左のPortがMCP3002のDoutで出力。右のSignalがポケコンの4ピンで入力に相当。
この時どうやってプルアップ抵抗を付けるのが正しいか、不安だったのだが、こちらのサイト様と偶然同じだった事でこれでよかったんだと一安心。

【蛇足】
ついでにサイト様の一瞬動くというのは、たぶんステッピングモーターであってもHI→LOWになるとモーターがコイルに残っている磁力で逆電流を起こすから、Signalに入力ピンであるにもかかわらず、出力のような電流が流れるのだと思う。つまりI2Cの懸念でプルアップ抵抗に変更した理由と同じ。そしてプルアップであってもPortがLOWになっているという事は、PortがGNDにmicro controller内部で繋がっているという事(ここが私も忘れてしまうところ:重要)なので、その逆電流がPortに流れ込んでしまい、一瞬動くのだと思う。(HIならVCCもHIでSignalから来たHIはどこにもいかず抑え込まれる)
しかしLOWにしないわけにもいかないから、モータサイドで対策する必要がある。
またPortが出力(入力モードならたぶん内部で抵抗がかまされているはず)ピンでLOWになっていると抵抗なしでGNDに繋がっているはずなので、一瞬でもmicro controllerには5Vが直結する事になるので、やはりSignalのピンの直前に1kΩ程度の抵抗をかませた方がいい。(マニュアルは大事)
結局モータの逆電流に関してはモータのユニットの方でダイオードやコンデンサで逆流しないようにするほか無いけど、こういう検討も必要かな。I2Cで入力ピンを出力にもするなら4ピンも1kΩの抵抗が必要。
[PR]
by k1segawa | 2015-06-08 22:04 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/8)

SPI通信について。

スレーブ(SPIモジュール)によってSPI通信のサポートする種類が異なるようだ。

SPI通信といってもクロックの立上がり・立下りでデータを取り出すようにインプリメントするケースや、
最初のMSBFをクロックの最初から取り出すか、1CLK待ってから取り出すようにインプリメントするかを、スレーブが選べるようにしている。

従って4種類あって、MCP3002はそのうちMODE0,0(モード0)とMODE1,1(モード3)の形式のSPI通信をサポートしているようだ。

MCP3002データシート15ページ目図6-1,2

だからと言ってモード0と3を切り替えられるわけではなく、両方とも立上がりでデータを取り出すモードなだけだ。
MSBFも余り神経質にならずにその前に続くStartビットからの流れで取り出せばよく、モード0と3の違いが余りわからない。(下記サイト様のSPIの罠様にはきちんと書いてある)

SPI通信のモードに関しては、以下のサイト様が参考になった。
SPIについて
SPI Transfer Modes | USB-I2C/SPI/GPIO Interface Adapters
SPIの罠

0,0と1,1は立上がり、0,1と1,0は立下りでデータを読み書きする。

SPI通信ができたといってもMCP3002の場合だけなので、別のSPIモジュールの時は同じ手順とは限らないという事。
さらにモードの呼び方まで統一されてないらしい(SPIの罠様参照)ので、きちんとタイミングチャートとモードの対応をデータシートで確認する事。

SPI通信は同期(外部クロックが要らない―自分でクロックを作って送り込める)通信で、かつ単方向信号(双方向でない)なのに、信号線が独立しているからスピードも出る。なのでSDカードの読み書きもSPI通信。
SDカードの構造と内部レジスタ(その1) | ミームス(MEMEs)のサポートページ様や浅草ギ研 A33FでMicroSDカードにアクセスしてみる様などでは、詳しいSD用コマンドが解説されているので、SPI通信の応用にいいかもしれない。
[PR]
by k1segawa | 2015-06-08 19:51 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/8)

そろそろ電池が消耗してきたので、プログラムをPCに退避。

主にTEXTモードで保存した場合を示す。

(1) 12/14の記事を見てケーブルを繋ぐ。
(2) デバイスドライバでCOMポート番号を確認。
(3) 1/4の記事でTeraTermの設定を行う。(128x24にしておくと後で助かる)
(4) ポケコンのTEXTボタン>F(ile)>L(oad)で、LOAD →と出るのでカーソル移動して保存したいプログラムを選ぶ(リターン)。(マニュアルP.177)
※この時BASIC中間コードで保存してある場合、マニュアルP.177によれば、エラー(FILE MODE ERROR)になるので、その時は別途記述する。
(5) << PROGRAM FILE >>というメニューに戻るので、TEXTボタン>S(io)>S(ave)で、PCへ送出。
(6) TeraTermの画面にプログラムが表示されるので、マウスで先頭から末尾+空行1行辺りまで選択して、コントロール+Cを押す。
(7) テキストエディタを開き、余計なものがあってもいいように、コントロール+Aで全選択し、コントロール+Vで上書きする。
(8) (4)でLOADした時の名前を参照する。
(9)名前を付けて保存で、LOADで選択した時の名前を付けて保存する。
(繰り返す場合)
(10) (8)で次のファイルを選択する。
(11) TeraTermの画面でEdit>ClearScreen、Edit>ClearBufferと実行し、余計なものを消す。
(12) (5)に戻って以下同じ。

【ポケコンの方の設定】
TEXTボタン>S(io)>F(ormat)
9600,8,1,none,CR LF,1A,yes,RS/CSに設定

書くととても面倒だが、ポケコン側は単に
TEXTボタン:*** TEXT EDITOR ***モード
└→ F(ile):<< PROGRAM FILE >>モード>L(oad)
もう一度TEXTボタン:
└→ S(io):<< SIO >>モード>S(ave)
を繰り返しているだけ。(たまに間違ってFの代わりにLを押して"--- PRINTING ---"と出るけどONキーをちょっと長押しすれば戻る)
TeraTermも単に受信した文字列をコピーし、画面をクリアしているだけ。
エディタも貼り付けられた文字列を名前を付けて保存しているだけ。(※TeraTermの80行を超える長い行はコピーして貼り付けると改行が付加されるので、行番号のない行は前の行とくっつけて1行に編集する事。あらかじめTeraTermを80x24から128x24ぐらいに変更しておくとよい)

通信さえ整っていれば、これを繰り返しているだけ。通信は最初から全く変更していない。

※LOADでエラーの時は、BASICボタン>LOAD"そのファイル名"で読み出すか、
TEXTモードのように、BASICボタン>FILES(リターン)と入力し、SHIFT+M(LOAD)(マニュアルP.159)で読み出すこともできる。
LOADしようとしたファイルがTEXTだった場合、ERROR 96(マニュアルP.386)が出てBASICじゃない旨を教えてくれる。
その後、TEXTボタン>B(asic)>Text←basicでBASICをTEXT変換する。
この時TEXTプログラムを削除するかY/Nで聞いてくるので、必要ならTEXTを保存してからTEXT変換する。
BASICプログラムとTEXTは両方同時にメモリに存在できるので、落ち着いて行う。
[PR]
by k1segawa | 2015-06-08 13:50 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/7)

念の為BASICでも構造化してみた。構造化はPC-G8系?G85系からなので、PC-E5系はPC-E650とPC-U6000だけかな。

前回のCプログラムを直す形にしたので、PEEK、POKE文によるPC-E5系のINP/OUTの代替命令は残していない。

【構造化BASICでのSPI通信によるA/D変換】
DIM A(33):I=0:X=-1

CLS
OUT &H60,1
OUT &H61,1

REPEAT
READ A(I):I=I+1
UNTIL A(I-1)=99

WHILE 1

C=10:D=0:I=0
WHILE A(I)<>99
OUT &H62,(A(I) AND &HFE)
IF (A(I) AND 1)<>0 THEN
A= INP &H62
IF C<>10 THEN
IF A=1 THEN D=D+(2^C)
IF C=0 THEN
W= INT (D/8)
IF X<>W THEN
LINE(X-(X<W),0)-(W-(X>W),15),X,BF
X=W
ENDIF
ENDIF
ENDIF
C=C-1
ENDIF
I=I+1
WEND
WEND
DATA 0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99
INTは関数なのでマニュアルの先頭に載っている。ただし、Cのintとは負の値の扱いが異なるのでFIX(こちらはBASICの命令)が本来正しい。まあ負の値を取らないのでCに字面だけ合わせてあるが。(X<W)の論理値は、Cの場合の真の値(1)と異なり-1なので符号を逆にしてある。またLINE文はX=XOR、BF=長方形塗りつぶしで、XとBFの間のパターンは省略している。あとREPEAT-UNTILやWHILEなので制御変数Iの初期値や判定が微妙に違うので(太文字)注意。

やっぱり実行すると遅い。Cプログラムと同時にメモリに存在できるので切り替えて実行するとよくわかる。

でもBASICも構造化するとループの範囲や意図が分かり易いし、なによりポケコンの狭い画面でも、横はタブを1にして書くと、Cと違ってセミコロンがない分、何とか収まるし、中かっこでなくENDIFやWENDなので縦も対応が分かり易い。ポケコン上でデバッグしやすい。(Cは一度ノートに書いて入力し机上デバッグする方がいい-画面狭いので)

おしいな~。これでBASICコンパイラがついてれば構造化BASICならプログラムの入門には最適だな。
だれかPC-E5系のBASICコンパイラBASCOM(BASC102)の構造化BASICへの移植してくれないかな~

【独り言・・・】
ソフト屋さんなので、入れ子構造が見やすい(BASICやCで育った人)と感じるが、ハード屋さんは前の構造化しない方のプログラムの方が見やすいのだろうな~。BASICに限るが、一行一行見て理解する形だと、GOTOのラベルの方が、単なるブロックの}やENDIFより意味がすぐわかるから。全体を見渡すよりべたっとしたリストを好む気がする。もちろん慣れの問題もあると思うが。Cも入れ子構造があまりに深いとわかりづらいから程度問題か。
Cで書いていても、ソフト屋さんは、for、whileのなるべく単純な制御構造に当てはめようと問題自体の分割やアルゴリズムを簡素なものにできないか再検討をするが、ハード屋さんのソースはどこかそういうループに特殊な脱出条件を追加したまま複雑化している気がする。きっとそこまで手間をかけるかどうかなんだろう。
[PR]
by k1segawa | 2015-06-07 23:44 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/7)

センサーを付け替える前にちょっとビジュアライゼーション。

アナログ入力を表現するのに、動的な棒グラフでキャッチ―にしてみた。

【ポケコンによるSPI通信(A/D変換)】
main() {
unsigned char a[34]={0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
int c,d,i;
unsigned char r;
int x=-1;int w;

clrscr();
outport(0x60,1);
outport(0x61,1);

do {

c=10;d=0;i=-1;
do {
outport(0x62,(a[i] & 0xFE);
if((a[i] & 1)!=0) {
r=inport(0x62);
if(c!=10) {
if(r==1)
d+=(1<<c);
if(c==0) {
w=(int)(d/8);
if(x!=w) {
line(x+(x<w),0,w+(x>w),15,2,0xFFFF,2);
x=w;
}
}
}
c--;
}
} while(a[i++]!=99);
} while(1);
}
最初のCS=HIの8は要らないみたいなのでデータから削除。d(アナログ値)をx方向で表現。(0,0)-(アナログ値,15)の長方形の伸び縮みで表す。/8≒1024/144(最大x座標)。wは内部計算を少なくするため。
xは前回のx座標。line文は後ろ3つが2=XOR、0xFFFF=塗り潰しパターン全て、2=長方形塗り潰しを示す。(x<w)は論理値が真なら1、偽なら0を利用。<、>はブログの制限で全角。

youtube:ポケコン SPI通信でアナログ入力
a0034780_2125019.jpg


processingみたいにデザインに凝ると単なるデータもありがたみが増す。昔のNECのPCの画面がジャン=フランソワ・ミレーの絵画「落穂拾い」だったようなもの。
[PR]
by k1segawa | 2015-06-07 21:10 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/7)

今までポケコンで、以下のようなデータの入出力を色々やった。
1.デジタル出力
2.デジタル入力
3.アナログ入力

1番はよくあるLEDを光らせるやつ。
応用としてシフトレジスタを使って1ポートで7セグを点灯させた。
少ない出力ピンで多くの信号を制御する。
デジタル出力であとやってないのはLEDをPWM制御で調光することかな。

2番はスイッチのON/OFFを読み取るやつ。
基本だが、プルアップ・プルダウン抵抗を理解しないと進めない。
応用としてパラレル-シリアル変換ICからの複数スイッチの入力など。
少ない入力ピンでたくさんの信号を受け取れるようにする。

3番はA/D変換ICの入力。
アナログ値を入力するのに、MCP3002というICで、電圧値をデジタル入力に変換して取り込む。
ポケコンでSPI通信ができることが分かったのが収穫。
応用としてタッチパネルや複数のセンサー切り替えや無線によって遠隔地のデータを取り込んだり。

次にI2Cをやろうとしたが、双方向インターフェースというのが必要だった。
SPIは単方向の信号つまり入力か出力に特化したピンでやり取りするのだが、
I2Cは1個のピン?で入力も出力もこなさなければならない。いわゆるバスってやつだ。
ポケコンにもPC-G850Vにはバスが出ていて、命令もシステムバス命令で用意されているが、まだ11ピンしか使ったことがないので敷居が高い。
どうにかできないかと調べていたら、こちらのサイト様にGPIOで出来るようなことが書いてあった。

2.3.4.1. GPIO初期化関数
【以下引用】
ここで注意したいのは、ポートを出力として設定するタイミングです。
今回接続するLCDモジュールは、R/WがHレベルになると、データバス
(DB0-DB7)からデータが出力されます。このときマイコン側もピンが
出力設定になっていると、電気的にショートしてマイコンや
LCDモジュールが破壊されてしまう危険があります。
 例えばマイコン側の出力ピンがHレベルになっている場合には、
マイコン内部でピンが+電源に接続されています。
そしてモジュール側でピンがLレベルになっている場合には、
そのピンは-電源に接続されています。
そうするとこれらのピンが接続されてしまうと、結局は、
+電源と-電源が直接に接続されたのと同じになってしまうのです。
 そのためマイコン側のポートを出力として設定する前には、
LCDモジュール側を確実に入力に設定(R/WをLレベルにする)
しておく必要があります。
 なおこの問題はLCDのモジュールに限ったことではなく、
データの出力と入力を兼用するデバイス全般との接続において注意
すべきポイントです。
【ここまで】

ずっと入出力兼用のピン設定がないか考えていたが、入出力モードを切り替えて使えばいいらしい。
ただプルアップや何かの信号がモード切替のタイミングでHIにならないように、回路設計と相手機器をコントロールしないといけないみたい。

うん。敷居が高いな。SPIができるようになったのだから、I2Cはとりあえずおいておこう。
まだ外部電源の実験やアナログ入力の応用も手広く残っているし。
[PR]
by k1segawa | 2015-06-07 17:16 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(6/5)

少し間違っているのと、ちょっとだけCっぽく構造化したのを書いてみる。

まず、間違いはpsetの文の次のxの144を越さないようにした行。グラフィック座標は(0,0)-(143,47)なので、144と比較して偽なら0になるので0*x=0にしているのだが、その行は本来if文が{}で括られていなければ条件成立時に実行されるようにならない。まあでもこれでもxをインクリメントしてなくても実行しても問題ないので、影響なかったという事。22は≒1024/47である。

あと、このC特有の機能(マニュアルに書いてあった)だが、自動変数の配列の初期化を最初にやっているが、本来staticかグローバルでないと初期値は入れられない。スタックが毎回初期化されるってこと。

それとoutput関数は0x20までとマニュアルには書いてあるがopenしないで使ってるから0x60とか使えているのかな?

で構造化してみたのがこちら。

main() {
unsigned char a[35]={8,0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
int c,d,i;
unsigned char r;
int x=0;

clrscr();
outport(0x60,1);
outport(0x61,1);

do {

c=10;d=0;i=-1;

do {
outport(0x62,(a[i] & 0xFE);
if((a[i] & 1)!=0) {
r=inport(0x62);
if(c!=10) {
if(r==1)
d+=(1<<c);
if(c==0) {
pset(x++,d/22,1);
x=(x<144)*x;
}
}
c--;
}
} while(a[i++]!=99);
} while(1);
}
普通はdo {} while() じゃなく while() {}を使うのだが、末尾の{}の対応が、画面の狭いポケコンでは付けづらいのであえてdo-whileにした。BASICならWENDなのでこんなことしないでもIF文のブロックと区別がつく。
また99との比較を末尾に置いたのでデータは必ず99以外で始まることが前提となる。

この方がgoto文やラベルが無くなって、ループの範囲と意図が伝わりやすい。
さらにコメントも入れてみたが、よけいわかりづらくなった。関数は短くシンプルに。コメントが不要なくらいに。

変数cもデクリメントを条件文の中に入れてもいいが、やりすぎてわかりづらいのでやめた。

BASICも構造化した方が分かり易いかな?

やっぱり構造化言語にとってポケコンの縦も横(タブ2がせいぜい)もスクリーンが小さすぎるな~
[PR]
by k1segawa | 2015-06-06 00:22 | ポケコン | Comments(0)