LoginSignup
0
0

ORANGE pico で ASCIIART (マンデルブロ集合)

Posted at

ORANGE picoRetro PC Gallery に掲載されているプログラムをパクり移植し、マンデルブロ集合の描画を行ってみた。

プログラム

10 tcolor=rgb(255,255,255)
20 mptr 0
30 mdata 64,160,160,224,160,160,64,0,64,192,64,64,64,64,224,0,64,160,32,64,64,128,224,0,64,160,32,64,32,160
40 mdata 64,0,32,96,160,160,224,32,32,0,224,128,192,160,32,160,64,0,64,160,128,192,160,160,64,0,224,160,32,64
50 mdata 64,64,64,0,64,160,160,64,160,160,64,0,64,160,160,96,32,160,64,0,64,160,160,160,224,160,160,0,192,160
60 mdata 160,192,160,160,192,0,64,160,128,128,128,160,64,0,192,160,160,160,160,160,192,0,224,128,128,192,128,128,224,0
70 mdata 224,128,128,192,128,128,128,0,0,0,0,0,0,0,0,0
80 cls
90 for y=-12 to 12
100 for x=-39 to 39
110 ca!=x*0.0458
120 cb!=y*0.08333
130 a!=ca!
140 b!=cb!
150 for i=0 to 15
160 t!=a!*a!-b!*b!+ca!
170 b!=2*a!*b!+cb!
180 a!=t!
190 if a!*a!+b!*b!>4.0 then break for
200 next
210 gput 4*(x+39),8*(y+12),8,8*i,tcolor
220 next
230 next
240 if inkey()=0 then goto 240

オリジナルのプログラムと比べて、ORANGE pico で動かすため以下の変更を加えている。

  • ASCIIART では横幅約80文字の表示が要求されるが、ORANGE pico のテキスト画面は横幅40文字しかないので、美咲フォント (美咲ゴシック第2) の半角文字をグラフィック画面に描画することで横幅80文字の描画を実現した。
  • ASCIIART のプログラムでは通常の変数に実数が格納できることを仮定しているが、ORANGE pico の通常の変数は整数しか格納できないので、! を追加して浮動小数点数を扱えるようにした。
  • ORANGE pico では浮動小数点数を整数 4 と比較すると Type mismatch エラーが出てしまうので、浮動小数点数 4.0 との比較にした。
  • ASCIIART のプログラムでは GOTO を用いて FOR のループから脱出しているが、ORANGE pico でこれを行なうと fornext の対応関係が崩れて誤動作の原因になるので、break for に置き換えた。
  • 文字の出力処理を変更した。空白 (0-origin で 16番目) を含むフォントデータを数値順に連続して並べることで、条件分岐なしで描画できるようにした。
  • 「OK」に邪魔されずに出力結果を見られるよう、最後にキー入力の待機を追加した。

実行結果

ORANGE pico でマンデルブロ集合

約5秒で描画が完了した。

おまけ:for~next の対応関係の破壊

next を実行せずに for を実行し続ける、以下のプログラムを実行する。

10 cnt=0
20 for i=1 to 5
30 print cnt
40 cnt=cnt+1
50 goto 20

すると、「471」の出力に続いて「Out of memory in 20」が出て出力が止まった。

続けてもう一度実行すると、数値の出力はされず、すぐに「Out of memory in 20」が出た。
一旦 new を実行し、プログラムを入力し直して実行しても、すぐに「Out of memory in 20」が出る状況は変わらなかった。

逆にエラーが出るまで for なしで next を実行し続けることによる復帰を試みたが、効果はみられなかった。

10 next
20 goto 10

このプログラムを実行すると「NEXT without FOR in 10」と表示されるが、その後先ほどのプログラムを実行すると、かわらず数値は出力されずに「Out of memory in 20」が出た。

?rnd(0) などによるリセットを行えば復帰できるようだが、今回はリセットせずに復帰する方法を見つけることはできなかった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0