4: 2009-01-14 (水) 19:04:03 |
5: 2009-01-17 (土) 12:25:04 |
| } | | } |
| } | | } |
- | -これをmakeすると390バイトになります。そして実行するとこんな感じです。 | + | -これをmakeすると375バイトになります。そして実行するとこんな感じです。 |
| >efg01 ex0021.g01 | | >efg01 ex0021.g01 |
| usage>ex0021.g01 [in:]input-file | | usage>ex0021.g01 [in:]input-file |
| 00000010 65 78 65 20 25 31 20 25 32 20 25 33 20 25 34 20 exe %1 %2 %3 %4 | | 00000010 65 78 65 20 25 31 20 25 32 20 25 33 20 25 34 20 exe %1 %2 %3 %4 |
| 00000020 25 35 20 25 36 20 25 37 20 25 38 20 25 39 %5 %6 %7 %8 %9 | | 00000020 25 35 20 25 36 20 25 37 20 25 38 20 25 39 %5 %6 %7 %8 %9 |
- | -他にも「>efg01 ex0021.g01 ex0021.g01」とか「>efg01 -noadc ex0021.g01 ex0021.g01」とかやると結構おもしろいです。390バイトの割になかなか遊べます。 | + | -他にも「>efg01 ex0021.g01 ex0021.g01」とか「>efg01 ex0021.g01 ex0021.org」とかやると結構おもしろいです。375バイトの割になかなか遊べます。 |
| -さて遊んでばかりではいけないので説明をします。最初はcmdusage[ ]ですが、 0x0c がファイルパス型です。ついでなのでまとめておきましょう。 | | -さて遊んでばかりではいけないので説明をします。最初はcmdusage[ ]ですが、 0x0c がファイルパス型です。ついでなのでまとめておきましょう。 |
| |0x0c|ファイルパス型引数| | | |0x0c|ファイルパス型引数| |
| 0x40 | | 0x40 |
| }; | | }; |
- | -次はsethex()です。なにやらとりあえず'0'を足して、'9'より大きくなってしまったら'A'以降になるようになにやら補正していますが、実は「ぐいぐい01」ではこんなことをする必要がありません。文字コード0x10~0x1fがまさに「16進数表示用の文字」ということになっているので、以下のようなプログラムで全く同じ結果が得られます。 | + | -次はsethex()です。とりあえず'0'を足して、'9'より大きくなってしまったら'A'以降になるようになにやら補正していますが、実は「ぐいぐい01」ではこんなことをする必要がありません。文字コード0x10~0x1fがまさに「16進数表示用の文字」ということになっているので、以下のようなプログラムで全く同じ結果が得られます。 |
| void sethex(char *s, int i, int n) | | void sethex(char *s, int i, int n) |
| { | | { |
| } | | } |
| g01_putstr0("\n---------------------------------------------------------------------------\n"); | | g01_putstr0("\n---------------------------------------------------------------------------\n"); |
- | -ということで、この変更を全部適用して(ex0022.c)makeすると351バイトになります。39バイト(10%)も減りました。ばんざい。 | + | -ということで、この変更を全部適用して(ex0022.c)makeすると337バイトになります。38バイト(1割以上)も減りました。ばんざい。 |
| -おっと忘れていました。もし存在しないファイル名などを指定したらどうなるのでしょうか?・・・こうなります。 | | -おっと忘れていました。もし存在しないファイル名などを指定したらどうなるのでしょうか?・・・こうなります。 |
| >efg01 ex0022.g01 hoge.txt | | >efg01 ex0022.g01 hoge.txt |
| -これは現在ファイルオープンエラーを継続不能なエラーとしてシステム側で処理するモードになっているせいです。これを解除すればスロット番号4にオープン失敗のハンドルが格納されて処理を続行することもできます。でもたいていはデフォルトのままのほうが自分で面倒なエラー処理をしなくていいので、楽です。 | | -これは現在ファイルオープンエラーを継続不能なエラーとしてシステム側で処理するモードになっているせいです。これを解除すればスロット番号4にオープン失敗のハンドルが格納されて処理を続行することもできます。でもたいていはデフォルトのままのほうが自分で面倒なエラー処理をしなくていいので、楽です。 |
| ---- | | ---- |
- | -(書き途中) | + | -おまけ |
| + | --abcdw014以降では(IRCでのmiyasakaさんからの要望のおかげで)efg01に対して拡張子.g01を省略できるようになっています。さらに、こんなファイルを「e.bat」として作って c:\windows\ に入れておくともっと便利になります(efg01.exeの絶対パスについては各自自分の環境に合わせて書き直してください)。 |
| + | @c:\tolset\z_tools\efg01.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 |
| + | --これを c:\windows\ に入れておく理由は、デフォルトでここにパスが通っているからです。パスさえ通っていればどこでもいいので、windowsディレクトリに自作のものを入れるのが不安な人は、好きなようにしてください。 |
| + | --さてこれをやっておけば、 |
| + | prompt>e nask |
| + | --とやるだけでnaskのusageが出るようになります(z_toolsに入っているものについてはパスを書く必要がなくなる)。tolset以外の.g01アプリも |
| + | prompt>e アプリのパス |
| + | --で起動できるようになります。なかなか便利なので、興味があれば一度試してみてください。 |
| + | ---- |
| + | -今度はテキストファイルをただ画面に出力するDOSのtypeコマンドみたいなアプリを作ってみます。最初は難しいことを全部避けて、極力簡単にしてみます。 |
| + | -ASCIIのみのテキストファイルしか絶対にin:に指定しないとして、しかも常に2MB未満のサイズだと仮定して問題ないのなら、ここまで単純化できます。ex0023.cです。 |
| + | #include <guigui01.h> |
| + | |
| + | unsigned char cmdusage[] = { |
| + | 0x86, 0x50, |
| + | 0x88, |
| + | 0x40 |
| + | }; |
| + | |
| + | void G01Main() |
| + | { |
| + | char *b = g01_bss1a1; /* mallocを使わなくてもこれで2MBのバッファがもらえる */ |
| + | g01_setcmdlin(cmdusage); |
| + | g01_getcmdlin_fopen_s_0_4(0); |
| + | jg01_fread0_4(2 * 1024 * 1024, b); /* 最大2MB, 終端に0がつく */ |
| + | g01_putstr0(b); |
| + | return; |
| + | } |
| + | -これをmakeすると91バイトになります。簡単すぎて信じられないかもしれませんがそれでもちゃんと機能します。 |
| + | >e ex0023 |
| + | usage>ex0023 [in:]input-file |
| + | |
| + | >e ex0023 make.bat |
| + | ..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 |
| + | |
| + | >e ex0023 Makefile |
| + | TARGET = ex0023 |
| + | MODE = g01 |
| + | OBJS = ex0023.obj |
| + | |
| + | INCPATH = ../z_tools/guigui01/ |
| + | include ../z_tools/com_mak.txt |
| + | -ただしこれではex0023.c自身は表示できません(まあ無理にやっても文字化けする程度で済みますが)。というのはコメント部分に日本語(=非ASCII)が入っているからです。ということで次はそれを何とかしましょう。 |
| + | ---- |
| + | -ということで作ってみたex0024.cです。 |
| + | #include <guigui01.h> |
| + | |
| + | unsigned char cmdusage[] = { |
| + | 0x86, 0x51, |
| + | 0x13, 's', 'j', 'i', 's', 0x20, |
| + | 0x88, |
| + | 0x40 |
| + | }; |
| + | |
| + | void G01Main() |
| + | { |
| + | unsigned char *b = g01_bss1a1, *p, sjis = 0; |
| + | g01_setcmdlin(cmdusage); |
| + | sjis = g01_getcmdlin_flag_o(0); |
| + | g01_getcmdlin_fopen_s_0_4(1); |
| + | jg01_fread0_4(2 * 1024 * 1024, b); |
| + | for (p = b; *p != 0; p++) { |
| + | if (*p < ' ' && *p != '\t' && *p != '\n' && *p != '\r') { |
| + | *p = '.'; |
| + | } |
| + | if (*p == 0x7f) { |
| + | *p = '.'; |
| + | } |
| + | if (*p >= 0x80) { |
| + | if (sjis != 0 && !(0xa0 <= *p && *p <= 0xdf) && p[1] != 0) { /* SJIS全角 */ |
| + | *p = '.'; |
| + | p++; |
| + | } |
| + | *p = '.'; |
| + | } |
| + | } |
| + | g01_putstr0(b); |
| + | return; |
| + | } |
| + | -これをmakeすると181バイトになります。これならちゃんと表示できます。 |
| + | -このプログラムで注意しておくべきところは、bで受け取った中身を書きえているということです。旧OSASKではこのような行為はファイルの書き換えを意味していました(メモリマップトファイルだったので)。しかしjg01_fread系はファイルの内容を「メモリに読み込む」APIなので、書き換えても元のファイルの内容が変更されることはありません。変わるのはメモリの内容だけです(旧OSASKのmapmoduleはファイルにアクセスするために「メモリ空間に割り当てて」いた)。 |
| | | |
| | | |
| * こめんと欄 | | * こめんと欄 |
- | - ex0022が351バイトになって我ながら感動したので、後日ASKAかnaskで全部書いてみようと思いました。半分くらいにならないかなあ? -- [[K]] &new{2009-01-13 (火) 23:51:38}; | + | - ex0022が351バイトになって我ながら感動したので、後日ASKAかnaskで全部書いてみようと思いました(註:abcdw012での話です)。半分くらいにならないかなあ? -- [[K]] &new{2009-01-13 (火) 23:51:38}; |
| - とりあえず200バイトを切ることは確認。 -- ''K'' &new{2009-01-14 (水) 00:53:13}; | | - とりあえず200バイトを切ることは確認。 -- ''K'' &new{2009-01-14 (水) 00:53:13}; |
| - できた。182バイト。半分には行かなかったけど、とりあえず満足。 -- ''K'' &new{2009-01-14 (水) 11:31:04}; | | - できた。182バイト。半分には行かなかったけど、とりあえず満足。 -- ''K'' &new{2009-01-14 (水) 11:31:04}; |
| - そしてabcdw013で168バイト達成。 -- ''K'' &new{2009-01-14 (水) 19:04:03}; | | - そしてabcdw013で168バイト達成。 -- ''K'' &new{2009-01-14 (水) 19:04:03}; |
| + | - abcdw014向けの記述に修正。 -- ''K'' &new{2009-01-17 (土) 10:42:06}; |
| | | |
| #comment | | #comment |