diff -urNX /home/volker/exclude-qemu /home/volker/qemu/hw/cirrus_vga.c ./hw/cirrus_vga.c --- /home/volker/qemu/hw/cirrus_vga.c 2006-08-18 17:48:26.000000000 +0200 +++ ./hw/cirrus_vga.c 2006-10-01 19:18:43.721496136 +0200 @@ -2649,11 +2649,18 @@ break; case 0x3ba: case 0x3da: - /* just toggle to fool polling */ - s->st01 ^= ST01_V_RETRACE | ST01_DISP_ENABLE; - val = s->st01; - s->ar_flip_flop = 0; - break; + { + uint64_t usec; + usec = muldiv64(qemu_get_clock(vm_clock), 1000000, ticks_per_sec); + if ((usec % 13888) < 70) { + s->st01 |= ST01_V_RETRACE | ST01_DISP_ENABLE; + } else { + s->st01 = 0; + } + val = s->st01; + s->ar_flip_flop = 0; + } + break; default: val = 0x00; break; diff -urNX /home/volker/exclude-qemu /home/volker/qemu/hw/pcspk.c ./hw/pcspk.c --- /home/volker/qemu/hw/pcspk.c 2006-07-05 01:20:54.000000000 +0200 +++ ./hw/pcspk.c 2006-10-01 19:28:43.952247192 +0200 @@ -38,7 +38,7 @@ unsigned int samples; unsigned int play_pos; int data_on; - int dummy_refresh_clock; + int refresh_clock; } PCSpkState; static const char *s_spk = "pcspk"; @@ -117,10 +117,10 @@ PCSpkState *s = opaque; int out; - s->dummy_refresh_clock ^= (1 << 4); + s->refresh_clock = (((qemu_get_clock(vm_clock) / 15000) & 1) << 4); out = pit_get_out(s->pit, 2, qemu_get_clock(vm_clock)) << 5; - return pit_get_gate(s->pit, 2) | (s->data_on << 1) | s->dummy_refresh_clock | out; + return pit_get_gate(s->pit, 2) | (s->data_on << 1) | s->refresh_clock | out; } static void pcspk_ioport_write(void *opaque, uint32_t addr, uint32_t val) diff -urNX /home/volker/exclude-qemu /home/volker/qemu/hw/vga.c ./hw/vga.c --- /home/volker/qemu/hw/vga.c 2006-09-26 18:04:22.000000000 +0200 +++ ./hw/vga.c 2006-10-01 19:17:09.377838552 +0200 @@ -223,10 +223,17 @@ break; case 0x3ba: case 0x3da: - /* just toggle to fool polling */ - s->st01 ^= ST01_V_RETRACE | ST01_DISP_ENABLE; - val = s->st01; - s->ar_flip_flop = 0; + { + uint64_t usec; + usec = muldiv64(qemu_get_clock(vm_clock), 1000000, ticks_per_sec); + if ((usec % 13888) < 70) { + s->st01 |= ST01_V_RETRACE | ST01_DISP_ENABLE; + } else { + s->st01 = 0; + } + val = s->st01; + s->ar_flip_flop = 0; + } break; default: val = 0x00;