2019年4月14日日曜日

C#(でのマンデルブロー描画)の高速化

画面のBitmapをいちど(アンセーフな)配列に持ってきて
直接弄る方法を比較してみた。
元ネタはここ

結果は
普通にSetPixelを使うと127mSだったがUnsafeArrayの使用で42mSと3倍に高速化

やはり実行が速い言語はいろいろと試行するのが速いので弄りやすい。

2019年4月12日金曜日

Lazarusへのリベンジ

昨日、Lazarusを使ってfree pascalでmandelbrotの描画の記述を試みたが失敗したことを書いた。

でも悔しかったので昨夜からちょっと調べてみたら流石にDelphiの代用を標榜するだけあってネット上の情報がほとんどそのまま当てはまって、実に納得のいく形でソースを記述できて動いた。結果は下図
左上がC#で最速、135mS
続いて右上が今回記述したLazarusで1422mS
右下が99BASICで13秒(=13000mS)
左下が98(というかEPSON互換機)のエミュレータAnex86の上で
N88BASICを動かしてそのうえで描いたMandelbrotで98画面の都合で
(2割領域の少ない)640x400ドットでの描画だけど8分28秒=508秒
すなわち508,000mS
速度比はC#を1とすると
C#:Lazarus:99basic:anex86(PC98N88Basic)=1:10.5:96.3:3762.9
          ≒1:10:100:3800
で、ちょっと比較するのが怖いぐらいの速度差である。

でもLazarusを思い通りに動かして記述できたことは実にうれしい。
このストンと落ちる納得感が明日への活力になる。

2019年4月10日水曜日

情報量の大切さ

大好きなプログラム言語のひとつがPascalである

でもWindowsよりも前に触っていた記憶(まあ、主にMS-DOSの時代だ)による

で、cp/mを弄ってみたいっていうのも、あの頃を思えばオーパーツとしか思えない
TurboPascalで当時を想ってみたいってことが多い

最近、free pascalのIDEであるところのLazarusの2.0が正式にリリースされたのを知って
遅まきながらWindowsでやってみようとインストールしてみた。
実に使いやすそうな感じだったのだが…
残念なことに躓くこと夥しい。
で、そんなときはgoogle先生のお世話になる。しかしネット上に情報が無いのだ。
その昔、TurboPascalをBorlandから世に出したヘルスバーグが、その後Microsoftに移って上梓したC#はどうだろう。同じ作者のものなのに情報が溢れるほどある。
google先生にお伺いを立てれば大抵の疑問はすぐに回答が得られる。
早速やってみると・・・・
BASICで書いたMandelbrotをC#で動かしてみると100倍も高速で動く。

やっぱ情報量が多いってめっちゃ大事。

※もちろん言語の力やライブラリーの使いやすさと充実しているかどうかも大事で、
C#の場合はそのあたりがめちゃくちゃ充実していることも大きい
ベンチマーク系の処理で処理時間を求めて表示したいことは多いけどC#のばあいだと
Stopwatch sw = new Stopwatch();
sw.Start();
// 処理を行う
sw.Stop();
Debug.WriteLine("Elapsed time (ms) = " + sw.ElepasedMilliseconds);
みたいにStopwatchってライブラリー(オブジェクト)があって、スタートメソッド呼んで、測りたい処理実行してストップメソッド呼んでそのあと徐にストップウォッチの結果を然るべき形式で見せてくれるメソッドで取り出してやるだけでOK! わかりやすい
C#はいたるところでこんな仕組みがあるので楽々ソフト作りができる。


2019年4月8日月曜日

久しぶりのOS達

気が向いたら変なことに没頭するのが悪い癖

その一つが古いOSで遊ぶこと
cp/mについて調べていたら何となくPC98のソフトはどうだったっけと思い立ち
anex86をNASから引っ張ってきて動かしてみた。
画面をドットバイドットにするのが上手くいかない。
いつものmandelbrotの描画テストをやってみた。
実行環境はN88BASIC(DOS)で発散までの繰り返し上限は100で640x400のエリアに
対して計算させている。
実行時間は8分28秒だから508秒か 遅いのだろうね。

もう一つ気が向いてvirtualboxの中でwindows98seも動かしてみた。

背景のanexは縦横を2倍した感じでサイズを模索してた時のものでその前でwin98seが
動いているのが見えるけどhyper-vを生かしておくと速いけど動作が不安定。
仕方なく外しているとかなり遅いけど安定して動く。
virtualboxの追加ドライバーはこんな古い16bitのOSでは使えないので640x480の基本的なVGAの画面サイズから他の大きなものにするのにかなり苦労をした。
仮想ハードウェアの構成やディスプレードライバーなどこちらのサイトを参考にさせていただいた、ありがたし。

こんどはarmの説明を見てarduinoのasm命令を試してみよう。
多分、今の自分が一番cp/mやDOSでやってみたいのがturbo pascalを使ったasm交じりのプログラミングだと思うから・・

2019年4月6日土曜日

古いPC環境とソフトウェアエミュレートの価値

最近、PC向けとしては最古のOSであるcp/mで遊んでいる
きれいなグラフィックスや表計算ソフトなどが動くわけではなくて、
文字だけの所謂DOS窓でソフトウェアを作ったり文字だけで表現されたゲームをしたりできるだけなのだがPC黎明期のあこがれのOSに触れられるだけで垂涎の体なのである

当初は8bitCPUの8080用に開発された(上位互換のz80でも動く)が後には16bitCPUの8086や68000用にも用意開発された ただし16bit用ではMS-DOSの後塵を拝した

現在cp/mそのものやそのうえで稼働した様々なソフトウェアが事実上フリーなものとしてネットで配布されている - The Unofficial CP/M Web site
そのほとんどが英語オンリーだけど8bit機であるし実験的な利用を考えると十分と言える

その実行環境は大きく分けて3つに分類できると思う。
  1. 実機:昔ならPC-8801系にメモリーボードなどを加えて別売のcp/mを購入するような形で実現したものであろうけど、比較的最近だと有志によって作成された基盤にいくらかのLSIチップをのせてシングルボードコンピュータとしてPCとUSBケーブルでシリアルインターフェースにつないで利用することになる
    例1:Z80-MBC2 z80とそのほかの3つのICで構成(128KBのRAMでCP/M3も稼働)
       IOやバスの調停をAVRのATMega32Aにさせている
       CPUの駆動クロックは4MHzと8MHzの切り替え
       オレンジピコさん(レア部品多数)での取り扱い
    例2:SBCZ80 古典電脳物語や8080伝説の鈴木哲哉氏の制作
       CPUの駆動クロックは2.5MHzと5MHzの切り替え(ハンダジャンパ)
       この方の他のSBCはスイッチサイエンスで扱いがあるけど、これはまだ
       (部品点数が多いうえにZ80-SIOなどディスコンが心配)
    例3:Pic24CPMボード z80最速の20MHz用を使って16MHzで動く。
       例1のAVRと違いシステムのコントロールチップにPIC24を使用
       プリント基板のガーバーデータなども公開されているし最も
       作ってみたくなる存在 RAMがディスコンか?
       (今ならHM628128ALP-7もオレンジピコにある)
  2. PC上のエミュレータ
    そもそもCPUクロックで千倍とかの差があるのでソフトウェアで8bit機の動作をさせることに何の支障もない 
    (もしあるとすれば5kgの手荷物を大型トラックで運んでる違和感か)
    でも実機との比較ができると良いことも多いので手元で環境は仕込んでおきたい
    例1:Windows32bit用にいくつか出ている
       1)takeda氏のcp/m player
       2)vecterのcp/m executor
       3)altair 8800のエミュ 日本語紹介ページ オリジナル配布サイト
      altair使いやすくてめっちゃいいのだけど^eがエミュレータからのエスケープで
      エディタが使いにくいです
    例2:linux用だとyaze 日本語紹介ページ
     実は環境はそれぞれのエミュレータで錯綜していてmacとかでも動くものも多い
     日本製の2本はwindowsの32bitコンソール専用だけにファイルの準備が楽
     altairとyazeはcp/mの環境から忠実に再現しようとしているので母艦との
     ファイル交換がひと工夫必要

    で、z80などをエミュレートするけどwindowsPCでやっちゃうと牛刀割鶏な感が
    否めないってエンジニア心が言うもんだから別のハードウェアでエミュレートするって選択肢も浮上する それが・・・・
     
  3. 他のCPU(ARMとATmegaがほとんどだけど)エミュレート
    例1:CP/M on an AVR 面白そうだけど4bit D-RAM入手がね・・
    例2:cpm8266 日本語で① その② ESP8266(WROOM-02)で入手性良し
       内臓のフラッシュROMをファイルシステムとして使うため4MB必須
       外部とのファイル転送方法を確立する必要あり
    例3:RunCPM 日本語紹介ページ(詳しくて夢膨らむ) M5Stackでも
       対応するボードは多岐にわたっており入手性に不安なし
       安定性などで cpm8266のほうが良いって記述もある
       でもm5stackでいろいろ遊ぶうちの一つの選択肢としては悪くない
    例4:cp-mega88 作者はとよしまさん(日本人!!) 解説 ご本人解説
       各種の環境で動くけど速くはない 忠実に8bitCPUを再現か?
       本来(?)のハードのガーバナー情報など
    例5:mbedでcp/mエミュ Nucleoは触ってみたいボード 生Z80とのコラボも!
       こちらのコメント欄のやり取りではNucleo F401あんまり速くないみたい 
とりあえずはPCのエミュで慣れつつcpm8266、runCPM、mbedなどで遊ぼう

dosvaxj3が更新されていた。

 最近、エミュレータ系をあまり触っていなかったのだけど久しぶりに見てみたらタイトルのようにdosvaxj3が更新されていた。 on emulatorでセルフにcなどのソースを書いて実行するのに母艦側の特定のフォルダをドライブとしてマウント出来たり普通に母艦のimeで漢字が入力でき...