3: 2008-12-23 (火) 15:30:18 [6] | 現: 2024-01-08 (月) 12:58:42 k-tan[7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * ぐいぐい01に関するメモ-15 | + | TITLE:x |
+ | * ぐいぐい01に関するメモ-15 [#rb6fe09e] | ||
-(by [[K]], 2008.12.23) | -(by [[K]], 2008.12.23) | ||
-メモのうち重要な部分をそのうちまとめてまともなページを作る | -メモのうち重要な部分をそのうちまとめてまともなページを作る | ||
- | *** (30) helloの改良の歴史 (118→18) | + | *** (30) helloの改良の歴史 (118→16) [#zad2ee96] |
-(参考として)''DOS''の.COM形式: | -(参考として)''DOS''の.COM形式: | ||
--22バイトが限界 | --22バイトが限界 | ||
Line 57: | Line 58: | ||
---内容[5 0] モード変更("6"+1.5B=2.0B) 長さ[12] 内容[hello, world] 内容[3] | ---内容[5 0] モード変更("6"+1.5B=2.0B) 長さ[12] 内容[hello, world] 内容[3] | ||
--しかしこれでは16.5バイトだ。COM64plusに追いつくにはもっと減らさなければ! | --しかしこれでは16.5バイトだ。COM64plusに追いつくにはもっと減らさなければ! | ||
- | --さらにモード変更について考察した結果、たとえばモード変更をしたくなる場所というのはほとんど決まっていた。ようするに文字列を指定する場所や、バッファを指定する場所である。しかも指定値はほとんど決まって8bit配列モードだった。 | + | --さらにモード変更について考察した結果、モード変更をしたくなる場所というのはほとんど決まっていた。ようするに文字列を指定する場所や、バッファを指定する場所である。しかも指定値はほとんど決まって8bit配列モードだった。 |
--そういうことなら、こんな分かりきったことのために毎回2.0バイトも使うなんて非効率的過ぎる。そこで、APIパケットの文脈がこういう場所に差し掛かったときには、パケットに「モード変更:8bit配列モード」のコードを自動挿入させることにした。ただこれだけだと他のモードにする方法(もしくはモード変更しない方法)がなくなって柔軟性が損なわれるので、この文脈に差し掛かったときのパケット先頭が4bitの"5"なら、この"5"を読み捨てて自動挿入もしないということにした。これでこうなった。 | --そういうことなら、こんな分かりきったことのために毎回2.0バイトも使うなんて非効率的過ぎる。そこで、APIパケットの文脈がこういう場所に差し掛かったときには、パケットに「モード変更:8bit配列モード」のコードを自動挿入させることにした。ただこれだけだと他のモードにする方法(もしくはモード変更しない方法)がなくなって柔軟性が損なわれるので、この文脈に差し掛かったときのパケット先頭が4bitの"5"なら、この"5"を読み捨てて自動挿入もしないということにした。これでこうなった。 | ||
---内容[5 0] モード変更(0.5B) 長さ[12] 内容[hello, world] 内容[3] | ---内容[5 0] モード変更(0.5B) 長さ[12] 内容[hello, world] 内容[3] | ||
Line 70: | Line 71: | ||
['G' 01 で2バイト] [セクション記述子1バイト] | ['G' 01 で2バイト] [セクション記述子1バイト] | ||
[5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマット制御で0.5バイト] | [5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマット制御で0.5バイト] | ||
- | -COM64plusではまだ末尾CALL(EBP)の自動挿入は導入していないらしいが、たぶん導入することになるのではないかと思われる。 | + | --COM64plusではまだ末尾CALL(EBP)の自動挿入は導入していないらしいが、たぶん導入することになるのではないかと思われる。 |
- | + | -''17バイトのhello'': | |
- | * こめんと欄 | + | --2009.01.02に思いついた。APIパケットが1つしかないときは3を全く使わなくてもよくなった(逆にAPIパケットを2つ以上連続させるときは、先頭と末端に3を置く)。またslot番号0はファンクション5番のデフォルトとなり、このデフォルトを変更する場合は!4を置いてその後に目的の値を置くことになった。デフォルトのままでよければ、何も指定しなくていい。 |
+ | ['G' 01 で2バイト] [セクション記述子1バイト] | ||
+ | [5 12 "hello, world" の内容で13.5バイト、フォーマット制御で0.5バイト] | ||
+ | -''16バイトのhello'': | ||
+ | --2009.01.10に思いついた。コンソールへの文字列出力のとき、デフォルトの文字列は当然ASCIIなので(.g01ではモードを変更しないと日本語などは出せない)、いつも7bitしか必要ないのに1bitの0を補って8bit出力していることになっていた。これはなんかムダじゃないか?他ではものすごくがんばっているのにここでこんなムダを容認していいのか?ということで、7バイト出力するごとにMSBを集めて、これが0でなければもう一文字表示できるようにした。 | ||
+ | ['G' 01 で2バイト] [セクション記述子1バイト] | ||
+ | [5 12 "hello, world" の内容で12.5バイト、フォーマット制御で0.5バイト] | ||
+ | --最近ではすっかりこの内部形式に慣れてしまい、27バイト程度で限界だと思えた過去の自分が不思議でしょうがない(笑)。 | ||
+ | * こめんと欄 [#b35e8820] | ||
#comment | #comment |
(This host) = http://osask.net