GIGAMIX PRESS vol.48が届いた。相変わらずアヤしい見出しと、勢いのある文章が魅力的。
今回、サタベーとMSX-BASICの(単純なループを利用した)ベンチマーク結果が載っているのだが、R800なMSX-BASICの10倍以上の速度を誇るサタベーは意外に使えそうな気配。CPU以外の能力を考えると、R800+V99x8で必死こいてアセンブラプログラムを組むより、サタベーの方が速くなる可能性もありそうで、ハードウェアパワーの進歩に脱帽。
今更、BASIC使いたくないけどね。
今回はフロントライン エキスプレス#10も同封されて、PCMは間に合いそうだけどPS/2なんたらは厳しいとのこと。Gプレ総集編はちゃんと出るらしいので、フェスタで買うことにしよう。意外と安いし。
会社で古いC MAGAZINEを読んでいたら(仕事ではない)、高速な文字列検索法としてBMH法というのが紹介されていた。日本語の説明だけでコードはなかったが、とりあえずCで書いてみたのが次。
#include <stdlib.h> #include <assert.h> // BMH法による検索 unsigned char* BMHSearch(unsigned char* pKey, unsigned int nKeyLen, unsigned char* pData, unsigned int nDataLen) { // 不正な引数 assert(nKeyLen > 0); // Skip tableの初期化 unsigned int nSkipTable[0x100]; for(unsigned int i = 0; i < 0x100; i++) nSkipTable[i] = nKeyLen + 1; for(i = 0; i < nKeyLen; i++) { int nCode; nCode = pKey[i]; if(nSkipTable[nCode] == nKeyLen + 1) nSkipTable[nCode] = nKeyLen - i; } // 検索 unsigned int nDataOffset = 0; while(nDataOffset + nKeyLen <= nDataLen) { unsigned int nOffset; for(nOffset = 0; nOffset < nKeyLen; nOffset++) { if(pKey[nOffset] != pData[nDataOffset + nOffset]) break; } if(nOffset == nKeyLen) return (pData + nDataOffset); // 見つかった else nDataOffset += // 見つからない nSkipTable[pData[nDataOffset + nKeyLen]]; } return NULL; }
純粋なCではないので、C++ compilerでないと通らないかも。
で、これをZ80 assemblerにhand compile(?)してみたのだが、あまり速そうには見えない。自作Libraryの中にBMH.MACとして入れているが、少なくとも短い文字列ではCPIRで一文字目を検索して....という方が速いようである。
何か(Zero Typeの検索とか)に使えるかと思ったのだが、そう甘くはないらしい。
ふじさんが来た。本当は先々週の予定だったのだが、双方用事が入って今日に。
で、RAMさんのページからダウンしたTALKIEデータをまとめて鑑賞。ファイル名だけだと内容が分からない事が多いので、適当に予想しながら見ていたのだが、G-ED.LZHとKOUN.LZHの気合に感動。いやもう、あの揺れがなんとも。
また、内容が化けまくって仕様不能になっていたたんせいRAMを修理して貰った。傍から見ていると、基盤をちょっといじっているだけなのだが、見事に復活。6.25MB環境になって、色々と実験し易くなった。感謝。
ふじさんが帰った後で、貸して貰った2本のビデオ、トイレの花子さん
GS美神 vol.6
を見る。前者はりりか
こどちゃ
の大地丙太郎監督作品で、対象年齢は低いが面白い。大地ファンでなくても見る価値あり。
美神
の方は、原作をかなり忠実に再現しているが、それ以上の物ではないような。原作が好きだから、点が辛いのかも知れないが。
MRP.COMをいじってたら、バグだらけな事が発覚。16KB RAMにインストールできない、動作確認したはずのアンインストールは暴走する、m-n型式のスロット記述を認識出来ないと、もう大変である。
慌ててデバッグしたのだが、どうしてもアンインストールが動いてくれない。なんでかなぁとソースを眺めていて、ようやく理由を発見できたのだが、余りにも間抜けな原因であった。
アンインストールのメインは、
UNINST: CALL CHECK_INST ;常駐しているか? RET NZ ;常駐していなかった PUSH AF CALL CHECK_UNINST ;uninstall可能か? POP BC RET NZ ;uninstall不可 LD L,B ;媒体依存部を呼ぶ(table jump) LD H,0 ADD HL,HL LD DE,UNINST00 ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD DE,UNINST1 ;UNINST1に返る PUSH DE JP (HL)
てな感じなのだが、CALL CHECK_UNINSTの前後にあるPUSH AF/POP BCを入れ忘れて、CALL CHECK_INSTで得た媒体番号が破壊されていた為に、妙なアドレスに制御が移って変な事になっていたわけだ。引数や返値の媒体を指定出来ないアセンブラでは、ありがちなバグである。
TOMBOY#33が届いた。
#34は諸々の事情で9月発行になるそうだが、よく月間体制を維持出来るものだと関心しきりである。
中身の方だが、NASUさんのイベントに関する文章(結構長め)が載っているのには驚いた。で、この文章、フロマガに載った同種のものより質が高いような気がする。なんとなく。
残念だったのはちょっとチャッと
が載らなかったこと。アンナ
の終わった現在、一番楽しみな記事なので、毎号載せて欲しいところである。
アンケート結果を見ると、面白かったコーナーの延べ数が129。この値の1/3強がアンケート返送者と考えられるから、多目に見積もっても50人いるかどうかである。TOMBOYの部数が落ちているのか、返送率が下がっているのか分からないが、かなり危険な数字じゃなかろうか。
講座物ではボビーさんの口より先に手を出そう
が.....状態。やたらとglobal変数好きなのは何故?これじゃ、オブジェクト指向がどうのと言ったところで、全然説得力無いってばさ。
Linux CD-ROMの中身を見る。
PPP他、TCP/IP関係のソースはすぐに見つかったが、全部gzipで圧縮されている。もちろんMSXで使えるgunzipなんて持ってないので、ソースが目の前にありながら読めないという間抜けな状況。
とりあえずgunzipのソースを見れば移植できるかもという、淡い期待を抱いてCD-ROM内を探索するが、見つかったのはgzip圧縮されたgzipソースのみ。これをどうしろと?
大学時代なら、gzipファイルを大学のserverに転送して解凍、出来たファイルをlhaで圧縮してMSXに転送するという技が使えたのだが、今となっては無理である。unxi shellを開放しているRIM-NETを使う手もあるが、まだ契約していないのであった。
ふじさんが遊びに来るはずだったのだが、急用ができたそうでいきなり暇になる。
仕方無いので明日行く予定だった日本橋へ。目的はCD-ROM driveとLinux or FreeBSDである。
まずSOFMAP1号店5FでCD-ROM driveを発見。SCSI 4倍速の外付けで6800円。ちと高いので他を当たることにする。が、6連装で7800円というのしか見つからない。
どちらを買うか迷った挙句、単装6800円の方を入手。6連装はデカくて重くて持って帰るのが大変そうだったのと、構造が複雑な分、故障し易そうな気がしたので。
次はLinuxだが、下らないinstall本が付いてくる物は金の無駄なので、CD-ROM屋を捜すことにする。が、見つからない。いい加減歩き疲れた頃、T・ZONEの看板にPC UNIXの文字を見つける。売り場(4F)に上がってみると、種類がやたらと多くてどれを買えばいいのか分からない。
結局、一番安かったSlackware3.5(2980円)にしたが、これにソースは入っているか?
と質問して店員さんを困らせた。ソースだけが目的なので、どうしても慎重になってしまったのだ。店員さん、ごめん。これを読んでいる事はないと思うけど。
目的は達したので、わんだーらんどという本屋(マンガ屋?)で面白そうなのを物色。日本アニメ史学研究序説
という本に、アニメ版うる星やつら
の評論があったので買う。第1〜2クールが、何故あれほどスカだったのか解る(解った気になれる)資料である。
他にスカタン天国
のVol.1も。馬鹿で笑える関西マンガ。
で、家に帰ってCD-ROM driveをMEGA-SCSIに接続。ESETでD:に割り当てた後、MSX CD extensionを常駐させると問題無く読めた。畏るべし似非職人工房。もっとも一つだけ問題はある。CD extensionが常駐していると、プライマリマッパの不足でEsTermが使えない。
RAM増設する技術はないし、やっぱりGT欲しいぞな。
常駐するだけで何もしないプログラムが完成。
ESC/Pプリンタを、松下製MSXの内蔵ワープロから使えるようにする計画の出だしの部分に相当する物で、これを完成と呼ぶのは妙なのだが、常駐物のフレームと考えれば再利用が効くかも知れない。
とりあえず、常駐先にMapper RAM・16KB RAM・PACを選べることから、それぞれの頭文字を取ってMRP.COMとした。読み方はマープなので、ある種の心配がある人にはお勧めかも知れない(意味不明)。
行きつけの草の根BBSに、RELAを転載。ちなみに、ハードの高速化に走らなくても、ソフトの力でここまで出来るという感動を与えてくれる、史上最強の超高速アセンブラである > RELA
MARIO-NETにバイナリを上げるのは本当に久しぶりで、操作法を調べるのに一苦労であった。アップ報告の書き込みをしようとして、間違えて新規ノートを作っちゃうし。
何はともあれ、無事広まってくれる事を願うばかりである。
ここ数日、渡されたプログラムの拡張という仕事をしているのだが、これが中々恐ろしい。曲がりなりにも現代のプロが書いたコードだから、割と分かり易いしコメントも多い。とりあえず読む分には苦労しないのだが、問題は修正を加えるときである。
ソースはVisual C++で書かれているせいか、全てC++の構文で書かれている。ただし、C++なのは見た目だけで、書いてる人間の頭がCのままだから、それはもう無茶苦茶である。
まず、全ての関数がclassのメンバとして存在するのだが、class内部でしか使われないヘルパ関数も含め、全てpublicメンバ。事情は変数についても同じで、4割がpublicメンバの6割がglobal変数という恐ろしさ。どこで何をいじってるのか、見当もつかない。
もっと分からないのは、
CClass* pClass = new CClass; pClass->Function(); delete pClass;
といったコードがそこら中にある事で、しかも呼ばれた関数ではglobalな領域にデータを書き込むだけという意味の無さ。classの設計も無茶苦茶で、Cで書いたコードをソース毎にclassとしているような感覚がある。
で、ここに修正を加えるわけだが、重要な変数が全部globalなので怖くて仕方がない。結局、後の人間が迷惑被る羽目になるんである。ちきしょ〜。