ページへ戻る

− Links

 印刷 

GUIGUI01​/memo16 のバックアップ差分(No.4) :: OSASK計画

osaskwiki:GUIGUI01/memo16 のバックアップ差分(No.4)

« Prev[4]  Next »[5]
3: 2008-12-23 (火) 23:01:36 ソース[6] 4: 2008-12-23 (火) 23:01:36 ソース[7]
Line 41: Line 41:
 EDI = 0; CALL([ESI]); DB(0x50, 0x53, 0xb2, 0xb4, 0xb6, 0x30);  EDI = 0; CALL([ESI]); DB(0x50, 0x53, 0xb2, 0xb4, 0xb6, 0x30);
-このパケットは普通に見れば[5 0 5 3 0x32 0x34 0x36 3]となります。しかし0x32は'2'のキャラクターコードなので、ここではあえて[5 0 5 3 "246" 3]と書くことにします。またこの3番目の5はこの文脈では!5という意味で、結果として何の意味も持たないので、これを消すことにします(詳細は後で説明します)。そうすると、結局[5 0 3 "246"][3]となります。パケットはコマンドの切れ目で切ると見やすいのでこう書いています。 -このパケットは普通に見れば[5 0 5 3 0x32 0x34 0x36 3]となります。しかし0x32は'2'のキャラクターコードなので、ここではあえて[5 0 5 3 "246" 3]と書くことにします。またこの3番目の5はこの文脈では!5という意味で、結果として何の意味も持たないので、これを消すことにします(詳細は後で説明します)。そうすると、結局[5 0 3 "246"][3]となります。パケットはコマンドの切れ目で切ると見やすいのでこう書いています。
--これは旧OSASKのパケットととてもよく似ていて(数値はいろいろ違いますが)、slot0で文字数3で文字コードが並んでいるだけなのです。[3]はパケット終端です。これを実行するとアプリに戻ります。+-これは旧OSASKのパケットととてもよく似ていて(数値はいろいろ違いますが)、slot=0で文字数=3で文字コードが並んでいるだけなのです。[3]はパケット終端です。これを実行するとアプリに戻ります。
-これを応用すれば、まずEAX一文字を表示するputcが簡単に作れます。 -これを応用すれば、まずEAX一文字を表示するputcが簡単に作れます。
 EDI = 0; CALL([ESI]); DB(0x50, 0x51, 0x60, 0x03);  EDI = 0; CALL([ESI]); DB(0x50, 0x51, 0x60, 0x03);
Line 47: Line 47:
-しかしこのままでは終了ファンクションと同じで大して面白くありません。面白いのはここからです。!5の後に、!6_504_0_!5_1_3_0...と続けることができます。つまりこういうことです。 -しかしこのままでは終了ファンクションと同じで大して面白くありません。面白いのはここからです。!5の後に、!6_504_0_!5_1_3_0...と続けることができます。つまりこういうことです。
 EDI = 0; CALL([ESI]); DB(0x50, 0x56, 0xdf, 0x80, 0x51, 0x30, 0x32, 0x34, 0x36, 0x30);  EDI = 0; CALL([ESI]); DB(0x50, 0x56, 0xdf, 0x80, 0x51, 0x30, 0x32, 0x34, 0x36, 0x30);
--これは[5 0 !6 504 0 1 3 0 "246"][3]という意味になります(余計な!5は消しました)。!6_504_0_1_3というのが特別なもので、!6_504_0は「モード変更直接」次の1が8bit配列モード、次の3が「文字数兼モード長」です。8bit配列モードになれば、数値をいちいちgh4でエンコードしなくていいのです。普通にcharで書けます。ちなみに文字数3の後の0は、ただのパディングですが、これは必ず0でなければいけません。適当な数値を入れると誤動作します。+-これは[5 0 !6 504 0 1 3 0 "246"][3]という意味になります(余計な!5は消しました)。!6_504_0_1_3というのが特別なもので、!6_504_0は「モード変更直接」、次の1が8bit配列モード、次の3が「文字数兼モード長」です。8bit配列モードになれば、数値をいちいちgh4でエンコードしなくていいのです。普通にcharで書けます。ちなみに文字数3の後の0は、ただのパディングですが、これは必ず0でなければいけません。適当な数値を入れると誤動作します。
-しかし実は、機能番号5のフォーマットは、[5 slot (!6 504) mod (1) len str]となっています(mod=0の場合)。この()で囲まれた部分は、!5で打ち消さなければ自動で挿入される部分です。つまり自動挿入をあてにするなら、 -しかし実は、機能番号5のフォーマットは、[5 slot (!6 504) mod (1) len str]となっています(mod=0の場合)。この()で囲まれた部分は、!5で打ち消さなければ自動で挿入される部分です。つまり自動挿入をあてにするなら、
 EDI = 0; CALL([ESI]); DB(0x50, 0x03, 0x32, 0x34, 0x36, 0x30);  EDI = 0; CALL([ESI]); DB(0x50, 0x03, 0x32, 0x34, 0x36, 0x30);
« Prev[4]  Next »[5]