/var/log/hdk.log

2020 年 1 月上旬


01 (水)

%1 元日

今年もよろしくお願い致します。

のんびり起きてのんびり。

バイクを動かしておこうと思ってちょっとランド坂へ。 新ランドにワゴンのパトカーがいて、そのうしろに乗用車がいて、何? 取り締まり? そして旧ランドから工事中のトンネルが見えているのを発見。 なんと、ここにトンネルができるのか。 知らなかった。 ここから神奈川側に抜けるのかと思いきや、中でカーブして、稲城駅のほうに抜けるのとよみうりランド方面に抜けるのに分岐するらしい。 はぁ。 稲城大橋ユーザーとしては若干微妙な感じが... しかし開通したら旧ランドが本当の意味で旧道になるかもな。 いや、計画では盛土されて廃止されるんだと。 ほう。 なお、よみうりランドは観覧車が動いていたので普通に営業していたようだった。

まぁそれはともかくとして、バイクは今日は FI エラーが発生した。 給油後に 2 回、ドラッグストアで買い物後にも 2 回。 燃料ポンプが動く音はしていた。 いずれもその後は問題なく起動した。 それで、何かのトラブルかと思って調べてみたら、キーシリンダーの接触不良で FI エラーが出る場合があるらしい。 ははーん。 キーシリンダーの接触不良ならとっくに起きている。FI エラーも同じ原因ってことか。 スズキ店に持っていっても芳しくない返事が得られた人がけっこういる模様で、キーシリンダーの交換で有償修理になった人や、交換後も 2 年ほどで再発した人もいそうな感じ。 自分で分解清掃をした人もいるようだが、キーシリンダーには特殊なねじが使われていて分解がやや難しいようだ。 そこで、とりあえず、合わせ目の部分をめがけて KURE CRC 5-56 を吹きかけ、何度か動かしておいた。 これで改善するといいのだが、しないようなら上の隙間のほうからやってみよう。 どうせ交換になるのなら、5-56 で壊してしまっても同じだし、延命できるなら安いものである。

%2 8088

ALU のキャリーフラグはともかく、オーバーフローフラグの出し方がよくわかっていなかったが、何となく考えていたら、わかってきた。 よく言うオーバーフローのチェック方法は、正の数同士を足して負になったか、あるいは、負の数同士を足して正になったか、というやり方だが、それを 16 ビットの演算器でどうするのか? という疑問、実は加算器の最上位ビットの入力 3 つ (足される数、足す数、キャリー) を見ればわかるんだな。

2 の補数表現で 1 ビットの値を、0 か -1 と解釈するとする。 そうすると最上位ビットの足し算は (0 or -1)+(0 or -1)+(0 or 1) となる。 引き算はこれの + が - になる。 答えが 0 か -1 ならオーバーフローしていないということ。 こんなことを思いついたきっかけは、CS:APP という本に出てきた問題で、引数 x が 2 の補数表現の整数の場合に n ビットで表現できるかをチェックする関数を大小比較を使わずに書け、的なものがあって、これを数か月前に解いた時に、x を右シフトして、0 か -1 と一致するか比較する関数として書くとシンプルに書けることに気づいたことだった。

20200101-cfof.c

実験コードはこれ。 フラグレジスターの最下位ビット (キャリーフラグ) とオーバーフローフラグの結果をビット 8 とビット 0 に返す関数で、実際の命令の実行結果と比較する。 足し算や引き算の答えに関しては C の普通の演算結果とどうせ一致するので捨ててある。 このプログラムでは上の理屈を元にテーブルを作ったが、これなら論理回路の組み合わせでも簡単に実現できる。

ところで... 減算は 2 の補数を使って加算器で実現できるのはそうなんだが、8088 は加算も減算も同じ時間で行えるので、減算用の回路が入っているのは間違いない。 で、2 の補数は 1 の補数に 1 を加えたものなので、引く数のビットを否定でひっくり返し、さらに 1 を加えて足せばいい。1 を加えるところは、ADC 命令があるように、0 ビット目にキャリーを足せる仕組みになっているので、そこに 1 を入れればいい。 じゃあキャリーを含めた引き算の SBB 命令は? というと、キャリーがあったらさらに 1 を引くという話なので、1 足さなきゃいい、すなわち、入力のキャリーも反転すればいい。 なんと、答えを得る部分についてはそれだけなのだった。

じゃあ減算結果のフラグは、というと、キャリーは 2 の補数の加算結果の否定か。 そしてオーバーフローは 2 の補数の加算と一致するんだな。

と、書いたところで... Overflow flag - Wikipedia を眺めていたら、References のところに詳細な説明テキストへのリンクを発見。 The CARRY flag and OVERFLOW flag in binary arithmetic というテキストの後半 "How the ALU calculates the Overflow Flag" のところにある。 これによれば、別にキャリーを使わずに普通に入力と答えを比較してもいいし (これも 3 入力で求めることになり、結局組み合わせは同じ)、あるいは、最上位ビットに入っていくキャリー (上のプログラムで求めた msb_c) と、最上位ビットから出ていくキャリー (上のプログラムでビット 8 に出した値) の排他的論理和でもいい、と。 ほほー。 言われてみればそうだな... わかったことをまとめて、上のプログラムの 2 関数を書き直せば、以下のようにテーブルすらなくなる:

uint16_t myadc(uint16_t a,uint16_t b,uint16_t c){
  uint16_t msb_a=a>>15,msb_b=b>>15,msb_c=(((a&0x7fff)+(b&0x7fff)+c)>>15)&1;
  return ((msb_a+msb_b+msb_c)&2?257:0)^msb_c;
}
uint16_t mysbb(uint16_t a,uint16_t b,uint16_t c){
  return myadc(a,~b,!c)^256;
}

なお、補助キャリーフラグはビット 3 から出てくるキャリーというだけで、減算を 2 の補数の加算で行った場合に、出てくるキャリーが否定になる点も含めて、全く同じ。

あと、NOT 命令はフラグが変化しないのでちょっとわからないけど、NEG 命令は 0 からの減算と等しいことを以前発見しているので、3 クロックかかる正体はここにありそう。 つまり普通の SUB 命令と同じように 2 入力 ALU に突っ込んで実行していると思う。

そうそう、そうやって NEG 命令が暗黙の 0 を使うわけだけど、おそらく INC 命令と DEC 命令もそれを使っている。 キャリーに 1 を入れた上で、0 を入れた ADC 命令あるいは SBB 命令相当の動作をするのではないか。 その関係で、キャリーフラグが更新されないんじゃないか。 そういう風に考えると、ADD 命令と SUB 命令の時にはキャリーに 0 を入れた上で計算を始めているかも。 キャリーフラグは更新されちゃうから、そんな内部のこと、知りようもないけどな。

さらに言えば、たぶん NOT 命令は減算用に 1 の補数を求める回路から取り出しているのだろうと思う。 それならフラグに関わるような演算はそもそも何もしていないことになるから、フラグが変わらないのも納得だし、まぁそれを言ったら排他的論理和なんかも加算器の一部を流用しているのかも知れないけど。 そうそう、テンポラリーレジスターに残っている値を JMP FAR AX で取り出した時に、残っているのがなぜ第 2 オペランドなのか不思議に思っていたが、減算用に 1 の補数を求める回路は当然第 2 オペランド側に付けることになるし、ひょっとすると ALU 的にはこっちが第 1 なのかもという気もしてきた。

そうだ、他に未定義のフラグはシフト命令にもあるんだった。AF が常に未定義、OF は複数ビットシフトで未定義。 調べてみないとだな。 なおシフト命令のオーバーフローフラグは最上位ビットが変化したかどうかを表す。 つまり... 左シフトに関しては、同じ値の足し算と同じ結果ということになる。 実行時間が短いから、足し算はしていないはずだけど。

似たような数字がいっぱいで書き間違いがあるかもw とりあえず見た感じ、AF がセットされるのは左シフトのみっぽい。 ビット 3 がセットされていた場合の左シフトで AF がセットされている。 左シフトについては回路規模削減か何かの理由で加算回路の一部を流用しているのかも知れない。 なおローテートはどういうわけか AF SF ZF PF を変更しない。

複数ビットシフト、ここでは CL=4 である。 とにかく何をやっても一定なのが未定義の全ビットがセットされるシフト (?) で、例によって AF がセットされるのは左シフトのみのようだ。 で、OF のほうはというと、順当に 1 ビットシフトを繰り返した時と同じ結果のように見える... よね? 単に最後のシフトあるいはローテートで最上位ビットが変化したかどうか、が反映されているだけに見える。 さぁて... もうひとつ、CL=0 を試しておく必要があった。

これは単にフラグは全く変化しないと見てよさそう。

2020/01/01 のコメントを読む・書く


02 (木)

%1 冬休み 3 日目

久しぶりに関東にいる三が日、暇なので、兄者と「ツインリンクもてぎ "New Year Celebration" 花火と音の祭典」を見に行った。 もてぎの正月花火は 2007 年以来の 2 回目。 水戸北スマート IC が復活しており、適当に記憶を頼りに到着。 事前に電話で確認したところ株主優待は使えるらしいとのことだったので、使うにはちょうどいい機会だとは思いつつ、本当に使えるのか半信半疑で持っていったら本当に使えた。 当日観覧券 2800 円×2 人分と当日駐車券 2100 円がなんと無料! レースやイベントがない普段の日の入場料金は 1 人 1200 円、駐車料金は 1000 円なので、ずいぶん得をした気分になれる。 ただし、そんな優待の代わりに配当金を増やしてくれればいいじゃんという説には触れないでおくものとする。

2007 年に行った時のことなんかすっかり忘れてしまっていた。 あの時はこんなににぎやかだったかな、と思うくらい、人が多い。 露店も結構来ている感じで、レースの時よりエリアが狭いせいかレース開催日のような人混みである。(なおこの前は予選日だったので、レース開催日のもてぎに来たことはない。) 花火の観覧席は打ち上げ場所に近いほうが自由席。 なんでかと言えば、近すぎて見上げる形になってしまうから。 近さ的には多摩川競艇場の花火に近い感じだが、障害物が全くない上にけっこう大きな玉も上がるので迫力は抜群。 並んで上がるとカメラのレンズにおさまりきらないほど。 当然粉も降ってくるw

帰りはつくばに寄って久しぶりにとん Q、本店は相変わらず待ち時間が長かったのでイーアスのほうで食べた。 帰りは谷田部からスーッと。

花火の写真は撮ってみたが、後日確認することにする。

%2 給油

142 円/l。 燃費計算 21.4km/l。 燃費表示 19.4km/l。

ちょっと、満タンをいい加減にしたので燃料少なめだと思う。 高そうな気がしたせいでもあるが、つくばも神奈川もみんなもっと高かった。

2020/01/02 のコメントを読む・書く


03 (金)

%1 冬休み 4 日目

今日も良い天気。

レンタルカート。 飯能。3 回乗ってベストタイムは 33.823 秒。7 コーナーの走り方を矯正するために、6 コーナー付近からアクセルオフにしてみたところ、意外とタイムが落ちない。 ふんふん。 こうしてみると今までだいぶ突っ込みすぎていたかなという気がする。

なお、まだ三が日だというのに、飯能は結構人が多くて、待ち時間が長くて、やや遅い人達と一緒のグループの時もあって、自分より 0.5 秒前後遅そうな人に追いついた時には、抜けなかった。 登り勾配でスピードが足りない... 9 コーナーでイン側取れたらよかったけど、後ろ見ないで切り込んでくる感じだったのでギリギリで引いて、接触は避けた。

バイクで飯能まで行ったので、早めに帰ろうと思っていたけど人が多かったので、結局 17 時前ぐらいになってしまった。 寒いだけでなく、凍結が心配なので帰宅は早いに越したことはない。 まぁ、結果としては大丈夫だった。

バイクのキーシリンダー接触不良トラブルはとりあえず再発せず。5-56 がきいたか、キーを何度も動かしたのがきいたかはわからない。

%2 Portfolio

8086 ファミリ・ハンドブックに載っている命令実行シーケンスの例では、eb の無条件ジャンプでプリフェッチした後、次のプリフェッチの T2 のタイミングで最初の命令がキューから取り出されている。...T1〜T4 のバスのステートがあり、T4 の終わりのタイミング、クロックの立ち下がりのところで最初のワードがキューに入り、その次の T2 の終わりのタイミングで最初のバイトがキューから取り出される形。 その後キューが空になってフェッチ待ちになるところも、同様に、T4 で入ってからその次の T2 の終わりで取り出されている。 フーン。

で、最初の疑問は MOV AX,即値の 3 バイト命令で、なぜか最初のバイトを取り出してから、次のバイトを取り出すまでに 1 クロックあいていることだった。 だけど冷静に考えたらこれ 4 クロックの命令だ。 だから実は 1 クロックあいてから 2 バイト取り出すと考えるとそこまで変ではないのかも知れない。 例においても最後のバイトを取り出したところまでで MOV 命令は完了していることになっている。 ま、実際には最後のレジスターへの転送は次の命令のところに重なっているのかも知れないけど、その辺の詳細まではわからない。

あと、PUSH 命令でメモリーに書き込むところが、T3 までで PUSH 命令は終わっていて、メモリー書き込みの T4 では次の命令を取り込んでいる。 これもまぁ、そういうものなんだと言われればまぁ、そうなのかな。

それと、ADD SI,即値の 4 バイト命令 4 クロックの謎。4 バイト目をキューから取り出すのと同時に計算が済んでレジスターに反映されるなどというミラクルがあるわけがない。4 バイト目を取り出してテンポラリーレジスターに入れるくらいが関の山。ALU は設定済みだろうから、入力が入れば適切な計算結果が得られ、次のクロックでレジスターに反映できるだろう。 アレ? そうすると 5 クロック目があるのかな? 次の命令の 1 バイト目を取り出す時に実は前の命令の結果を反映している?

さてさて。 これに沿って考えて cwtd を MOV CS 実験でちょっと試していた。

この実験プログラムは実験コードへのジャンプは CALL 命令で行っている。eb00 (jmp .+2) を入れるか入れないかで、後ろに cwtd を 4 個並べるか 3 個並べるかの違いが現れている。 上の例から言えば CALL 命令は T2 とは違ったところから始まっていると考えればいいのか。eb00 は例と同じジャンプ命令なので、そっちは T2 から始まると見ていいと思う。 しかし、cwtd が 5 クロックだと 3 命令では 15 クロックにしかならない。2 が出るためには、MOV CS の完了前時点でその次の 1 バイトまではフェッチが終わっていないと変とすると、どう考えても、そうはならないんだよなぁ... まさか cwtd が 6 クロックなのだろうか... いやいや...

8 クロック (であろう) 命令を使用してのこの実験。T2 から始まっているなら、いい具合に次も T2 から始まるわけ。 計算上は 3737 が終わったところでキューには 3 バイトで次の 1 バイトのフェッチが T2 ってところ。 そこで MOV CS (2 バイト 2 クロック) をやれば、キューが 1 バイトになり、いい感じかな?

そうだ、キューが満タンになったケースも本の例に載っているが、キューが減り始めてからだいぶ経ってからプリフェッチが再開されるのも気になる。 バスはアイドル状態 Ti になるとされているが、キューが 2 バイトあいた次に Ti が 1 回あって、さらにその次の Ti で命令フェッチのシグナルが出て、その次に T1 から始まる感じ。8088 だとキューはバイト単位の 4 つだが、満タン状態で次の命令に移ると、その次のサイクルであいたな、って気づいて、さらにその次のサイクルで準備段階、さらにその次で T1 ってことだから、例えば、もし MOV CS 実験で満タン状態で MOV CS を実行した場合、2 バイト 2 クロックで MOV CS が完了し、その間に次のフェッチはまだ開始すらしておらず、いや待って。 それだと 2 が出そうだが、MUL 命令あたりで実験すれば 3 って出るぞ? あれ?

やっぱりミラクルがあるのだろうか。MOV CS にしたって、2 バイト 2 クロックだけど、反映が実は 3 クロック目に行われているみたいな。 それで、プリフェッチのアドレスが、T1 よりもさらにひとつ前のクロックで確定するのであれば... そうであれば、確かに MUL 命令の実験で 3 が出るのも説明できそうだけど、3737 が 2 になるのが変か? わからん。

2020/01/03 のコメントを読む・書く


04 (土)

%1 どようび

またチーズを調達しにコストコへ。 バイクで行ったが例の接触不良も再発せず順調だった。

2005 年のテレビドラマ『女王の教室』、TVer で続きの 9 話が出ていた。 当時の MacBook, いや、PowerBook だな、2005 年だもん。 当時の iBook じゃなくて、PowerBook G4 のほうだな。 まぁ、そこだけなら見た目は今でもちょっと分厚いくらいでそんなに違和感ない。Mac OS X の画面に少し懐かしさはあるが、今の若者が見てもそんなに古さは感じないのではないか。 それより、光学メディアだ。 バックアップ (と言ってはいないが、実際バックアップだろう) はここにあると言って見せたのが、CD-R か DVD-R かはわからないけど光学メディアなのだ。 あぁ。 フロッピーディスクや光磁気ディスクじゃないだけマシだけど、なんか急に時代を感じるシーンになってしまう。2005 年はまだ、PowerBook に光学ドライブがついていたし、USB メモリーはそこまで普及していなかったかな。

Hg-Git という Mercurial のプラグインを使ってみたんだけど、とりあえず枝分かれのないシンプルな Mercurial repository を Git 化するのは、これを使うと簡単にできることがわかった。 説明を読んだ時は Git repository を Mercurial で扱うというのが主な使い方だと思ったけど、push もできるので、空の Git repository に push してしまえば、Git 化もできるというわけ。 つまり mq どっぷりの自分のある意味古くさい使い方もそのままに、いつの間にか push 先は Git なんてことも可能に... いや、待った、アレだ。 自分の mq の使い方はひどくて、作業途中のバックアップ用に時々 push -f しているのがあるんだった。 それは Mercurial が無名の複数 heads を扱えるからで、push -f するたびに送信先で head が増えていく。Git ではこの技は使えない、いちいち名前をつけなければならない。 まぁ、公開用としてはそういうことはしないからいいと思う。 でも、コピーやリネームの情報は消える。Git には残しようがないのだから仕方がない話だけど。

%2 Portfolio

MOV CS 実験で POP CS 実験をしてみた。

 53 c745de0f43 eb00

これを頭に付ければ POP CS になるという仕掛け、いろいろ試したけど 2〜4 しか出なかった。 フーン。 ま、いいや。MOV CS で 2 バイト命令を試そう。

ウーン。8d00 は 9 クロックのはずで 8d01 は 10 クロックのはず。 確かに 8d01 のほうが早くプリフェッチキューが伸びることははっきり見えている。 問題は 8d00 の繰り返しで 2 と 3 が交互になる件と、8d01 の繰り返しで一度は 3 になるものの、その後 2 に減ってそのまま伸びない件。 何かがハマる感じ、たぶんキューが満タンになるところが関係していると考えられる。

例の本の図を信じて、eb00 の後はプリフェッチが T2 から始まっているとする。 最初から 2 バイト命令なので、最初は足りない。 そうすると T4 が済むまで 2 バイト目はキューに入っていなくて、さらに、図を信じれば次の T2 のタイミングでやっと 2 バイト目が処理されると考えられる。 そうすると 8d00 の次の命令の時にはキューにはもう 2 バイト入っていて、バスサイクルはそのさらに次のバイトの T2 になっている。8d01 と見比べると、MOV CS の時に 2 バイト入って T2 だと 1 が出て、2 バイト入って T3 だと 2 が出るということか? 8d00 8d00 の場合 2 つ目はプリフェッチ待ちなしに 9 クロックになるはず。T2 から始まって 2 バイト入って T3 になり、2 と出る。 確かに整合性はあるかな? そう考えて見ていくと、3 バイト入って T2 までは 2 と出る。8d01 の場合だと最初の 8d01 完了時点で 2 バイト入って T3 になり、8d01 8d01 では 3 バイト入って T1, 8d01 8d01 8d01 で 3 バイト入って T3 で、それで 3 と出るからやはり整合性はありそう。

MOV CS が 2 バイト 2 クロックのはずというところは大丈夫か。3 バイト入って T3 で MOV CS を開始した場合、MOV CS と INC がひとつキューにあって、すぐ次の T4 でもうひとつの INC はキューに入る。T3 で命令取り込みで 1 バイト削るからおそらく T4 で続けて次のフェッチが開始されて、それが %cs の変更前、まぁ、なるほど、変ではなさそう。

さて繰り返しの件は何なのか。3 バイト入って T3 から 8d00 を実行すると、次は 3 バイト入って T4 か。 その時に 2 が出るというのか。 そして、さらに続けて 8d00 を実行した場合、その 1 クロック目、T4 で一度満タンになったキューが、2 クロック目では空いていることが発覚し、例の図を信じれば、4 クロック目にまた T1 からスタートすることになる。 とすると次の命令で 3 バイト入って T3 になるから、また 3 になる。 おや? これなら整合性は保てているか。

8d01 のほうはどうだろう。3 バイト入って T3 から 8d01 を実行すると、ちょうどキューが満タンになる T4 の次のサイクルが次の命令、それだと 2 が出る? 本当か? んで続けて 8d01 だと、やはり 4 クロック目に T1 からスタートし、次の命令で 3 バイト入って T4 だろうな。 さっきの 8d00 の件から言えばそれで 2 は出るのかもな。 そこからはさっきの 8d00 の件と同様のサイクルで毎回 3 バイト入って T4 になってしまい、伸びないということか。

問題は満タンになった直後が次の命令だと 2 になるのかどうか。MUL 命令では 3 になるのだから、なんかおかしい気もする。

と疑問は残りつつまぁまぁいい感じかと満足していたのに変なのを見つけてしまった。

なぜだ... なぜなんだ... なんもわからん...

2020/01/04 のコメントを読む・書く


05 (日)

%1 花火の写真

この前の。

1 2 3 4 5 6 7 8 9 10

こんな感じで広角レンズ無しのカメラにはなかなか厳しい近さであったw

%2 DMA

8086/8088 絡みの資料を見ていると、HOLD 信号と HLDA 信号というのがあって、DMA が使うものらしい。 外部から HOLD 信号を入れることで、CPU にバスを明け渡せと指示する。CPU はちょうどいいところでバスを明け渡し HLDA 信号で acknowledge する。

で、疑問に思ったのは、CPU の入出力アクセスに時間が掛かる場合は READY 信号を使って CPU を待たせることができるのだから、HOLD 信号なんて必要ないのでは、と。 そもそも、アドレスとデータでピンを共有しているので、それを分離するための回路が別に必要で、アドレスとデータはラッチされているはずだし、メモリーやデバイスが応答するまで READY 信号で引き延ばせるのだから、DMA 転送の間はそれで引き延ばせばいいのでは、と。 なんなら DMA と CPU で違うメモリーモジュールやデバイスへのアクセスをするなら、待たせなくてもいいんだから、性能も稼げる。

というふうに思っていたら、それをバスマスターって言うんだな。 ははーん。 どうやっても、アドレスをデコードしてメモリーに入力して、というような回路は最低でも必要になるが、読み書きの方向を示す信号やらクロックやらは共通でもいい。 だから、シンプルに 1 本のバスにすべてのメモリーやデバイスをぶら下げておいて、基本的に CPU が使うが DMA 転送したい時だけ HOLD 信号で CPU に手放させる、というのが、昔の PC でフロッピーディスクなどのアクセスに使われていた DMA 転送だったんだ。 やつは確か 1 バイトか 2 バイト単位の転送だったので、ちょろっとバスを借りて転送してすぐ返す、というのの繰り返しだったのだろう。 フロッピーディスクは確か、32KiB/s ぐらいの転送スピードだったかな。1 バイト単位でも 1 秒あたり 3 万回ほどバスを借りればいいだけだから、ほんの 5MHz 程度で動く昔の PC でも、CPU が動くにはじゅうぶん余裕があったのだろう。 いや、でも確か、フロッピーディスクの I/O って CPU で (PIO で) やると全力で読み取りとか書き込みとかだったような気がするぞ? アレってコントローラーが READY 信号で待たせていた? DMA の場合はどうなっていたんだっけな。

なんでそんな簡単なことを知らないかと言えば JX には DMA がついていなかったからさ... (言い訳)

%3 Portfolio

POP CS で、どうせ 2〜4 しか出ないなら INC 入れる意味ないかなと以下のようにした。

 53 c745de0f90 eb00

これを省略して [] としておくことにして、MOV CS の場合と比べてみる。

MOV CS の時とまったく傾向が違って、変な繰り返しも起きない。

うん。 やっぱりわからん。

きのうの、8d00 37 が 3 になる件がどうしても引っ掛かる。37 は 1 だし、3737 は 2 だし、373737 で 3 なのに、8d00 37 で 3 というのはどういうわけなのか。 いろいろ、タイミングがズレているのかもと考えてみたけど、ズレじゃ説明できないんだよな。 確かに、8d00 の時にプリフェッチが間に合っていなくて待ちが入るのはそうだけど、8d00 で 1 なのに 8d00 37 で 3 だもんな。 訳がわからない。

2020/01/05 のコメントを読む・書く


06 (月)

%1 冬休み 5 日目

特に何もしないうちに冬休み最終日。 こんなに何もしなかったの、2010 年以来じゃないかな。 その 2010 年は Wii を買ってゲームを買ってとお金を使ったようだが、この年末年始はレンタルカートくらいしか使っていない。

ホンダドリーム店に行って、大型二輪のレンタルバイクと試乗車について話を聞いてみた。 試乗車はアフリカツイン、でけぇなおい。 足つきはそんなに悪くないんですよというので、試しにまたがらせてもらったところ、確かにそんなに悪くはないが、やはりシートは低いとは言えない。 ちょっと細身に作ってあるせいみたい。 レンタルでは VFR だか何とか言うのと NC と、CB があって、どれが人気というよりはまんべんなく来るという。 確かに大型二輪はあんまりレンタルできる店ないからな。 このへんだとハーレー系の店とホンダと、あとは 2 りんかんだが (近隣にこれだけそろっているのは割と恵まれているほう)、そっちにはホンダの大型二輪はないみたいで。VFR は見た感じ結構前傾姿勢なので、レンタル 4 時間はつらそうな気がする。NC はオートマチック (DCT) で風防付きのモデルで、まずこれは乗ってみたい気がする。 車重も教習車と大きくは変わらないし、エンジンは CB400SF よりも最高出力が低いが、最高出力・最大トルクともに低めの回転数で出るようになっていて、個人的には公道で乗っても自分の好みに近いはずと思っている。 あと、CB1300? はだいぶ重そうだし気が引けるが、CB1100 は少し小柄で、乗れそうな感じがした。 スペック見ると CB1300 のほうが全幅は小さいな。 でも車重はやはり CB1100 のほうが軽い。 なお、レンタルは事前に予約をしてくれとのこと。 その日までにきちんと整備をしてお貸ししますと。 ほう。2 りんかんで普通二輪は何度か借りたけど、一度も予約したこと無かったなw

テレビドラマ『女王の教室』、最終回。 最終回でもエンディングはいつも通りのダンスと EXILE の EXIT。 久しぶりに見たけど、この「鬼教師」は、口は悪いが児童の自主的な発言を遮らないんだよな。 一通り最後まで聞き、その上できついことを言う。 まぁ、罰として掃除しろとか立っとけとか、問題の多い指導法ではあった。 反対に笑顔で言っていることも穏やかなのになぜだか厳しい教師というのもいるというのは、大学で知ったこと。

テレビドラマ『弁護士のくず』、9 話。 これも久しぶりに見たけど、原作と設定違うのに割とよくできているんだよな。 追憶の映画のパンフレットのところ、ぼかし入っていたな。1973 年の映画の本物だったか? この前の『結婚できない男』も、金田裕之の顔写真がきれいに消されていたようだが、こっちはその役を演じていた高知東生が薬物所持で執行猶予になったのがきっかけらしい。

%2 Portfolio

99 (cwtd) の繰り返しを試す。 面倒なので x 数で省略しているがテストプログラムはそんな形式に対応していないので展開して実行した。

これもやはり 2 と 3 を行き来するんだな。LEA 命令の 2 バイト 9 クロックと似ているのでやっぱり 5 クロックなんだな、きっと。 そして最初のところはジャンプか CALL かで何かがひとつ分違う感じだな。 ふーん。

2020/01/06 のコメントを読む・書く


07 (火)

%1 かようび

仕事始め。

松屋のビーフシチュー定食、ちとしょっぱい気もするが肉は軟らかくておいしかった。

テレビドラマ『弁護士のくず』、「またやるからみてね〜」なんつって、2 も作りたそうな最終回だったけど、これ作者の裁判沙汰もあってか続編なかったんだよな。 まぁ裁判のほうは結局は作者勝訴なので別にやってもよかったんだろうけど、時期的には裁判以外にリーマンショックその他の影響もあったのかも知れない。 あとこうして再放送 (っていうのかな) を見るとドコモダケが山盛り登場しているのはちょっと違和感あるな。 間違いなく当時のスポンサーが NTT ドコモだったんだろうけど、13 年も前のスポンサーなんてわかんないもんな。 まぁ何も知らなければかわいいぬいぐるみ程度でいいのかも知れないけど。 それと、パロディも時事ネタになってしまうな。 最終回だけでも、「逃げる場所はありませんよ!」(もろ時期も曜日も同じで他局でやっていたテレビドラマ『7 人の女弁護士』のネタらしい)、みのもんたの「ズバッ」(『みのもんたの朝ズバッ!』)、など、他番組のパロディが入っているが、どちらも知らなければわからないやつ、というか前者は知らなかった。

%2 Portfolio

プリフェッチキューの動きがあまりにもわからないので、5 クロックのはずの 99 と 3 クロックのはずの 90 を並べると MOV CS 後の実行命令数がどういうふうに変化するかを見てみようと思った。 まずは簡単なテスト。

90 だけで見るのはちょっと 99x5 や 99x4 のところを見ると難しさがありそう。99 を基本に見るのがよさそうだな。

8d00 99... のパターンで 4 つまで 2 が続くのが気になるが、CALL 命令で入った時に 1 が 3 つ続くのと似た話だろうか? それ以外はうまい具合に 1 ずつズレていっていて悪くない。 さて...

待って! まさかの 24 個で 1 周! ここまで手入力で試していたけど、絶対ミスる! 自動化しよう。

 c7064101ebbd c7043939 8006800002 7902 cd20

先月末のテストプログラムの入力の頭にこれを付ければ、99 の繰り返しを自動的に試せる。 これを [] として、例えばだな...

あれ? 8d00 37 のケースが上と違うじゃないか。 どうなっているんだ? と思っていろいろ試したのが下のやつで、eb00 (JMP 命令) を挟んでも何かがリセットされていない感じだな。 プリフェッチキューのせいじゃないのか? でも MUL 命令を挟むと戻るわけか。8d00 37 はこれでも 24 個で 1 周する繰り返しのようだ。8d01 37 は 1 周がわからん。

こっちは素直だな。 そういえば先月も別のクロック数推定で変なのあったから試してみる。

ウーン。 予想に反してこれも素直だな。 しかし何かなこれ、まるで循環小数を見ているかのようで。

2020/01/07 のコメントを読む・書く


08 (水)

%1 すいようび

暖かくなるという予報もあったが寒い日。

ランチのカレー (激辛) がいつもより辛い気がした。 いつもと言っても前回行ったのが 11 月だけど。

カルロスゴーンの会見、自分のやったことを正当化するのはまぁそうだろうなと思ったけど、罪はともかくとして、日本の人質司法の批判についてはまったくもってその通りで、先月逮捕された国会議員もまったく同じ流れで意味不明な長期勾留だし、漏れてはならない情報の捜査機関からの漏洩もされて世論の印象操作がされているし、おまけにカルロスゴーンは釈放時に家族にすら会えない謎な制約を課されたままきていて、そればかりは日本の司法がクソという他ない。2007 年の映画『それでもボクはやってない』でもそういう部分が描かれていたが、未だに取り調べの可視化も義務化されていないし、取り調べに弁護士の同席もないし、取り調べる側が創造したストーリーに基づいて自白を迫られるという、クソな部分はそのままなんだなということを再確認することになった。 なぜか日本の捜査機関は間違いを絶対に認めないまま突き進む。 あの記憶に新しい、ミュージシャンのお茶から薬物だってそうだった。 間違いだと気づいたらさっさと釈放すりゃいいのに、めいっぱい勾留するわけだ。 その部分は間違いなく見直されなければならないし、他の先進国の人々から見れば、朝鮮民主主義人民共和国で逮捕された人が隙を見て逃げ出したというのとたいして変わらない見方になりそうだと思う。

%2 Portfolio

5 クロック命令 99 の代わりに 4 クロック命令 27 を並べる実験。

 c7064101ebbd c7043237 8006800002 7902 cd20

1 バイト読み取りも 4 クロックだとすれば、普通なら MOV CS 後に実行される INC 命令の数は変わらないのだが...

繰り返しが長くても 16 個になったか? きのうの 24 個に比べればまだ納得できそうな数字である。 とにかく LEA 命令と AAA 命令の組み合わせがポイントのよう。 やはりジャンプ直後でも影響が残っている様子で、MUL 命令を使えば影響は残らない様子も確認できる。

さて、このへんで少し入力をミスって、フリーズしたので Portfolio をリセットしたら、フルリセットになってすべて初期化されてしまったw ドライブの中身まで普通にアクセスできる RAM に置かれている時点で、いつでも壊すおそれはあったのだが、ついにやらかした。 11 月に書いたプログラムを com2txt で変換したテキストを入力するところからやり直しだ (ノ∀`)

プログラムを打ち直したところで... 同じ 4 クロックの、9e SAHF 命令にしてみよう。

 c7064101ebbd c7043945 8006800002 7902 cd20

これに上の組み合わせでは結果は変わらなかった。 もうひとつ、9f LAHF 命令も試したところ、結果が違った。

 c7064101ebbd c7043946 8006800002 7902 cd20

あれ...? LAHF 命令も 4 クロックのはずだけど...?

違うのか?

こうして見比べた感じでは 2 クロックか。 ふうん。 ...じゃねぇよ、どの資料にも 4 クロックって載っていたよ!

2020/01/08 のコメントを読む・書く


09 (木)

%1 鉄道

日本の都市部の鉄道はダイヤが正確で、みたいな話はよくあるけど、その正確さには間違いなく差がある。 路線によっては 2, 3 分の遅れでも遅れていますと案内が入るらしい。 らしいというか、つくばエクスプレスなんかほんの 1 分くらいの遅れをアナウンスしていた記憶がある。 が、JR 東日本の中央線快速なんかは毎日のように遅れている。5 分くらいの遅れはいつものことで、自動放送で「ただいま約○○分遅れになっております」と流れていても駅員や車掌のアナウンスは何もないというのも珍しくはない。 なお 5 分未満の遅れだとその自動放送すらない。 逆にめちゃくちゃ遅れてしまった時には「大幅に遅れております」みたいな謎な自動放送が流れることもある。

と、感覚で言っても伝わらないが、具体的なデータがある:

東京圏「遅れが多い路線」ワースト10 通勤ダイヤを乱す“あの理由”  | 文春オンライン

2016 年度のデータだが、トップが中央総武緩行線、3 位が中央線快速となっている。 やっぱりね。

そんな感じで年明け早々毎日列車が遅れているw 今日はダイヤが乱れていたせいか、珍しく押し込み係も見かけた。 そうそう、「少しでもすいているドアからご乗車ください」などという駅員や車掌のアナウンスが聞こえる時というのは、都会の列車に慣れていないと、どうみてもどのドアも入れそうにない感じにしか見えない。 それが、少し慣れてくると、ドア付近の車内の床がどのくらい見えているかを見て、あっ、まだここなら入れるな、みたいになってくる。 慣れまくっている風な人は車内に片足突っ込んでそれで発車を待ち、ドアが閉まる時にぐいっと車内に吸い込まれる。 あれはまねできない...

%2 Portfolio

きのうの続き。

 c7064101ebbd c7043237 8006800002 7902 cd20

ウーン。

あっ、あれ? ジャンプの前が AAD 命令だと起きないの? えぇ? もう少し確認。

あぁ、そうか。37 AAA 命令は 8 クロックとされていて、資料によっては 4 クロックなんだけど、これ、もしかしてアキュームレーターの中身によって実行時間が違うのか! LEA 命令の足し算は {BX,BP}+{SI,DI} の組み合わせなので、このテストコードではどうしてもコード列の長さの影響が現れてしまうんだ。 自動的に伸ばす実験で、自動的に長さが伸びて値が変化していたんだ。 ははー。 これは見落としていた。 っていうか、だから、またしても資料がおかしいという話でもあるんだけど、無駄に難しく考えてしまっていた。

いやいや、それなら d50a eb00 8d00 37 はどう説明できるか?

! で長さを合わせることで %si の内容を一致させ、ジャンプ命令も入れているのに、こんなに差が付く。AAD 命令の前に XOR 命令を入れることで、こ、ああー、フラグ、AF か!?

どうやらそういうことっぽいな! AAA 命令は、AL の下位 4 ビットが 9 を超えているか AF がセットされている時に、AL と AH に足し算をして (80286 以降は AX に足し算をして)、そうでなければ足し算をしない命令なので、確かに実行時間が違っていても不思議はないけれども、なるほどね。AAD 命令の AF が undefined なのもあって余計に混乱した。AF がセットされちゃえば、AAA 命令は常に足し算をすることになるので、それで遅いってことね。

あれ? いやむしろ足したほうが速い? これ足すと AF セットされるので続けてやるとずっと足し続けることになる。 ということはシフト命令でキュー埋めてからやればいいか。

ウーン。4 クロックより速いわけではないのか?

そうだな、4 クロックより遅そう。

うん、訳がわからなくなってきた。 まぁでも、そういうことみたいなので、土曜日の疑問のひとつはとにかく、アキュームレーターの中身で説明ができそうなので、それを頭に入れつつ次に進めよう。

2020/01/09 のコメントを読む・書く


Powered by Tomsoft Diary System 1.7.4

/var/log/hdk.log コメント一覧

トップ / 日記索引 / 日記 (2020 年 1 月上旬)

Hideki EIRAKU