EMU8086はほとんど8254タイマ0を、エミュレートされたことが表示されます
:時/分/秒(切り捨て)にダニの正確な変換のため
8254 channel 0 runs at 1.19318 mhz or ~ 838.0965 nsecs/cycle
System timer interrupts every 65536 cycles ~= 54.9255 ms
or ~ 18.20648 ticks per second
1 ms = 1193.18 cycles
1 hour ~= 65543 ticks ~= 3599.9816 secs
24 hour ~= 1573040 (hex 1800B0) ticks ~= 86399.998 secs
例Cコード:PCシステムは、依然としてタイミング値であり、ここで、エミュレート
32ビット×16ビットの乗算ルーチンでは、フロア((2^32)/除数)で乗算することができます。 32×32ビット乗算ルーチンに
uint32_t i, tick, hour, minute, second;
/* ... */
i = tick<<10;
hour = (uint32_t)(((uint64_t)i*63)>>32);
i -= hour*67116375;
if(i >= 67116375){
hour++;
i -= 67116375;
}
i <<= 4;
minute = (uint32_t)(((uint64_t)i*239)>>32);
i -= minute*17897700;
if(i >= 17897700){
minute++;
i -= 17897700;
}
second = (uint32_t)(((uint64_t)i*14398)>>32);
i -= second*298295;
if(i >= 298295){
second++;
i -= 298295;
}
、単一減算チェックを省略することができる。
i = tick<<10;
hour = (uint32_t)(((uint64_t)i*2147243323u)>>57);
i -= hour*67116375;
i <<= 4;
minute = (uint32_t)(((uint64_t)i*4026081231u)>>56);
i -= minute*17897700;
second = (uint32_t)(((uint64_t)i*1887225577u)>>49);
i -= second*298295;
Iは、INT 1AH/02を試して、私はエラー得た:「INT 1AH、AH = 02Hを - サポートされている割り込みのリストを参照してください」 - emu8086を使用しています。 – Tom
最後の除算を100( "スケールバック")にするのはなぜですか?秒はすでに 'AX'レジスタに入っています。 –
@SepRoland dunno、brain fart? :)ありがとう! – Jester