ページへ戻る
印刷
GUIGUI01/memo27
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:GUIGUI01/memo27 をテンプレートにして作成
開始行:
TITLE:x
* ぐいぐい01に関するメモ-27
-(by [[K]], 2009.01.13)
-メモのうち重要な部分をそのうちまとめてまともなページを作る
*** (39) GOで「ぐいぐい01」アプリを作る(5)
-[[GUIGUI01/memo26]]の続きです。
----
-今回の最初のプログラムは、いわゆるファイルダンプです。フ...
#include <guigui01.h>
unsigned char cmdusage[] = {
0x86, 0x50,
0x01, 'i', 'n', 0x0c, 9, 0x01, 'p', 'u', 't', '-', '...
0x40
};
void sethex(char *s, int i, int n)
{
int j;
for (j = n - 1; j >= 0; j--) {
s[j] = '0' + (i & 0xf);
i >>= 4;
if (s[j] > '9') {
s[j] += 'A' - '0' - 10;
}
}
return;
}
void G01Main()
{
unsigned char buf[16], s[8];
int i, j, k;
g01_setcmdlin(cmdusage);
g01_getcmdlin_fopen_s_0_4(0); /* 0はreadモード, 4はs...
g01_putstr0(" offset +0 +1 +2 +3 +4 +5 +6 +7 +8 +9...
g01_putstr0("---------------------------------------...
for (i = 0;; i += 0x10) {
j = jg01_fread1(4, 16, buf);
if (j == 0) {
break;
}
sethex(s, i, 8);
g01_putstr1(8, s); /* g01_putstr1()は文字数を指...
g01_putstr0(" ");
for (k = 0; k < 16; k++) {
if (k < j) {
sethex(s, buf[k], 2);
g01_putstr1(2, s);
g01_putc(' ');
} else {
g01_putstr0(" ");
}
}
g01_putc(' ');
for (k = 0; k < 16; k++) {
if (k < j) {
if (0x20 <= buf[k] && buf[k] <= 0x7e) {
g01_putc(buf[k]);
} else {
g01_putc('.');
}
}
}
g01_putc('\n');
}
}
-これをmakeすると375バイトになります。そして実行するとこ...
>efg01 ex0021.g01
usage>ex0021.g01 [in:]input-file
>efg01 ex0021.g01 make.bat
offset +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +...
--------------------------------------------------------...
00000000 2E 2E 5C 7A 5F 74 6F 6F 6C 73 5C 6D 61 6B 65 2...
00000010 65 78 65 20 25 31 20 25 32 20 25 33 20 25 34 2...
00000020 25 35 20 25 36 20 25 37 20 25 38 20 25 39 ...
-他にも「>efg01 ex0021.g01 ex0021.g01」とか「>efg01 ex002...
-さて遊んでばかりではいけないので説明をします。最初はcmdu...
|0x0c|ファイルパス型引数|
|0x1c|整数型引数|
|0x2c|フラグ型引数|
|0x3c|文字列型引数|
-関数sethex()はsetdecを16進数用に改造しただけのものです。
-それでG01Main()の g01_getcmdlin_fopen_s_0_4(0); で、引数...
-スロット番号というのはファイルハンドルの入れ物みたいなも...
- j = jg01_fread1(4, 16, buf); というのは、スロット番号4...
-freadのうしろの1が気になるかもしれませんが、「ぐいぐい01...
----
-ex0021は分かりやすさ重視で簡略表現を避けていましたが、今...
-まずはやっぱりcmdusage[ ]です。実はusage内の説明部分で「...
unsigned char cmdusage[] = {
0x86, 0x50,
0x01, 'i', 'n', 0x0c, 6, 0x01, 'p', 'u', 't', '-', 0...
0x40
};
-しかししかし。そもそも「in:input-file」という表現そのも...
unsigned char cmdusage[] = {
0x86, 0x50,
0x88,
0x40
};
-次はsethex()です。とりあえず'0'を足して、'9'より大きくな...
void sethex(char *s, int i, int n)
{
int j;
for (j = n - 1; j >= 0; j--) {
s[j] = 0x10 + (i & 0xf);
i >>= 4;
}
return;
}
-ただしこれは注意してほしいのですが、この文字コードが使え...
-最後はこれです。 j = jg01_fread1(4, 16, buf); これは j =...
-あとはこれです。
g01_putstr0(" offset +0 +1 +2 +3 +4 +5 +6 +7 +8 +9...
g01_putstr0("---------------------------------------...
-これを以下のように改造しました。
g01_putstr0(" offset ");
for (k = 0x10; k < 16 + 0x10; k++) {
g01_putstr0(" +");
g01_putc(k);
}
g01_putstr0(" ");
for (k = 0x10; k < 16 + 0x10; k++) {
g01_putc(k);
}
g01_putstr0("\n-------------------------------------...
-ということで、この変更を全部適用して(ex0022.c)makeする...
-おっと忘れていました。もし存在しないファイル名などを指定...
>efg01 ex0022.g01 hoge.txt
File read open error: hoge.txt
-これは現在ファイルオープンエラーを継続不能なエラーとして...
----
-おまけ
--abcdw014以降では(IRCでのmiyasakaさんからの要望のおかげ...
@c:\tolset\z_tools\efg01.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
--これを c:\windows\ に入れておく理由は、デフォルトでここ...
--さてこれをやっておけば、
prompt>e nask
--とやるだけでnaskのusageが出るようになります(z_toolsに...
prompt>e アプリのパス
--で起動できるようになります。なかなか便利なので、興味が...
----
-今度はテキストファイルをただ画面に出力するDOSのtypeコマ...
-ASCIIのみのテキストファイルしか絶対にin:に指定しないとし...
#include <guigui01.h>
unsigned char cmdusage[] = {
0x86, 0x50,
0x88,
0x40
};
void G01Main()
{
char *b = g01_bss1a1; /* mallocを使わなくてもこれで2...
g01_setcmdlin(cmdusage);
g01_getcmdlin_fopen_s_0_4(0);
jg01_fread0_4(2 * 1024 * 1024, b); /* 最大2MB, 終端...
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自身は表示できません(まあ無理にや...
----
-ということで作ってみた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 !...
*p = '.';
}
if (*p == 0x7f) {
*p = '.';
}
if (*p >= 0x80) {
if (sjis != 0 && !(0xa0 <= *p && *p <= 0xdf)...
*p = '.';
p++;
}
*p = '.';
}
}
g01_putstr0(b);
return;
}
-これをmakeすると181バイトになります。これならちゃんと表...
-このプログラムで注意しておくべきところは、bで受け取った...
* こめんと欄
- ex0022が351バイトになって我ながら感動したので、後日ASKA...
- とりあえず200バイトを切ることは確認。 -- ''K'' &new{200...
- できた。182バイト。半分には行かなかったけど、とりあえず...
- そしてabcdw013で168バイト達成。 -- ''K'' &new{2009-01-1...
- abcdw014向けの記述に修正。 -- ''K'' &new{2009-01-17 (土...
#comment
終了行:
TITLE:x
* ぐいぐい01に関するメモ-27
-(by [[K]], 2009.01.13)
-メモのうち重要な部分をそのうちまとめてまともなページを作る
*** (39) GOで「ぐいぐい01」アプリを作る(5)
-[[GUIGUI01/memo26]]の続きです。
----
-今回の最初のプログラムは、いわゆるファイルダンプです。フ...
#include <guigui01.h>
unsigned char cmdusage[] = {
0x86, 0x50,
0x01, 'i', 'n', 0x0c, 9, 0x01, 'p', 'u', 't', '-', '...
0x40
};
void sethex(char *s, int i, int n)
{
int j;
for (j = n - 1; j >= 0; j--) {
s[j] = '0' + (i & 0xf);
i >>= 4;
if (s[j] > '9') {
s[j] += 'A' - '0' - 10;
}
}
return;
}
void G01Main()
{
unsigned char buf[16], s[8];
int i, j, k;
g01_setcmdlin(cmdusage);
g01_getcmdlin_fopen_s_0_4(0); /* 0はreadモード, 4はs...
g01_putstr0(" offset +0 +1 +2 +3 +4 +5 +6 +7 +8 +9...
g01_putstr0("---------------------------------------...
for (i = 0;; i += 0x10) {
j = jg01_fread1(4, 16, buf);
if (j == 0) {
break;
}
sethex(s, i, 8);
g01_putstr1(8, s); /* g01_putstr1()は文字数を指...
g01_putstr0(" ");
for (k = 0; k < 16; k++) {
if (k < j) {
sethex(s, buf[k], 2);
g01_putstr1(2, s);
g01_putc(' ');
} else {
g01_putstr0(" ");
}
}
g01_putc(' ');
for (k = 0; k < 16; k++) {
if (k < j) {
if (0x20 <= buf[k] && buf[k] <= 0x7e) {
g01_putc(buf[k]);
} else {
g01_putc('.');
}
}
}
g01_putc('\n');
}
}
-これをmakeすると375バイトになります。そして実行するとこ...
>efg01 ex0021.g01
usage>ex0021.g01 [in:]input-file
>efg01 ex0021.g01 make.bat
offset +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +...
--------------------------------------------------------...
00000000 2E 2E 5C 7A 5F 74 6F 6F 6C 73 5C 6D 61 6B 65 2...
00000010 65 78 65 20 25 31 20 25 32 20 25 33 20 25 34 2...
00000020 25 35 20 25 36 20 25 37 20 25 38 20 25 39 ...
-他にも「>efg01 ex0021.g01 ex0021.g01」とか「>efg01 ex002...
-さて遊んでばかりではいけないので説明をします。最初はcmdu...
|0x0c|ファイルパス型引数|
|0x1c|整数型引数|
|0x2c|フラグ型引数|
|0x3c|文字列型引数|
-関数sethex()はsetdecを16進数用に改造しただけのものです。
-それでG01Main()の g01_getcmdlin_fopen_s_0_4(0); で、引数...
-スロット番号というのはファイルハンドルの入れ物みたいなも...
- j = jg01_fread1(4, 16, buf); というのは、スロット番号4...
-freadのうしろの1が気になるかもしれませんが、「ぐいぐい01...
----
-ex0021は分かりやすさ重視で簡略表現を避けていましたが、今...
-まずはやっぱりcmdusage[ ]です。実はusage内の説明部分で「...
unsigned char cmdusage[] = {
0x86, 0x50,
0x01, 'i', 'n', 0x0c, 6, 0x01, 'p', 'u', 't', '-', 0...
0x40
};
-しかししかし。そもそも「in:input-file」という表現そのも...
unsigned char cmdusage[] = {
0x86, 0x50,
0x88,
0x40
};
-次はsethex()です。とりあえず'0'を足して、'9'より大きくな...
void sethex(char *s, int i, int n)
{
int j;
for (j = n - 1; j >= 0; j--) {
s[j] = 0x10 + (i & 0xf);
i >>= 4;
}
return;
}
-ただしこれは注意してほしいのですが、この文字コードが使え...
-最後はこれです。 j = jg01_fread1(4, 16, buf); これは j =...
-あとはこれです。
g01_putstr0(" offset +0 +1 +2 +3 +4 +5 +6 +7 +8 +9...
g01_putstr0("---------------------------------------...
-これを以下のように改造しました。
g01_putstr0(" offset ");
for (k = 0x10; k < 16 + 0x10; k++) {
g01_putstr0(" +");
g01_putc(k);
}
g01_putstr0(" ");
for (k = 0x10; k < 16 + 0x10; k++) {
g01_putc(k);
}
g01_putstr0("\n-------------------------------------...
-ということで、この変更を全部適用して(ex0022.c)makeする...
-おっと忘れていました。もし存在しないファイル名などを指定...
>efg01 ex0022.g01 hoge.txt
File read open error: hoge.txt
-これは現在ファイルオープンエラーを継続不能なエラーとして...
----
-おまけ
--abcdw014以降では(IRCでのmiyasakaさんからの要望のおかげ...
@c:\tolset\z_tools\efg01.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
--これを c:\windows\ に入れておく理由は、デフォルトでここ...
--さてこれをやっておけば、
prompt>e nask
--とやるだけでnaskのusageが出るようになります(z_toolsに...
prompt>e アプリのパス
--で起動できるようになります。なかなか便利なので、興味が...
----
-今度はテキストファイルをただ画面に出力するDOSのtypeコマ...
-ASCIIのみのテキストファイルしか絶対にin:に指定しないとし...
#include <guigui01.h>
unsigned char cmdusage[] = {
0x86, 0x50,
0x88,
0x40
};
void G01Main()
{
char *b = g01_bss1a1; /* mallocを使わなくてもこれで2...
g01_setcmdlin(cmdusage);
g01_getcmdlin_fopen_s_0_4(0);
jg01_fread0_4(2 * 1024 * 1024, b); /* 最大2MB, 終端...
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自身は表示できません(まあ無理にや...
----
-ということで作ってみた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 !...
*p = '.';
}
if (*p == 0x7f) {
*p = '.';
}
if (*p >= 0x80) {
if (sjis != 0 && !(0xa0 <= *p && *p <= 0xdf)...
*p = '.';
p++;
}
*p = '.';
}
}
g01_putstr0(b);
return;
}
-これをmakeすると181バイトになります。これならちゃんと表...
-このプログラムで注意しておくべきところは、bで受け取った...
* こめんと欄
- ex0022が351バイトになって我ながら感動したので、後日ASKA...
- とりあえず200バイトを切ることは確認。 -- ''K'' &new{200...
- できた。182バイト。半分には行かなかったけど、とりあえず...
- そしてabcdw013で168バイト達成。 -- ''K'' &new{2009-01-1...
- abcdw014向けの記述に修正。 -- ''K'' &new{2009-01-17 (土...
#comment
ページ名: