Compatibility

There are a few things that don't work in Bernie. 3200 color mode or border color effects require precise timing to emulate the CRT raster position accurately.

Similarly, some of the on-the-metal code Garote and I wrote depends on tricks such as mapping the stack into $01 SHR space, with RAMWRT=1 but RAMREAD=0, and then replacing the master IRQ handler with a custom routine that can deal with the stack ambiguity so that IRQs don't have to be disabled during graphic blits. This freezes Bernie up right away. ;)

Reading from the Ensoniq registers to display realtime audio waveform data is also not accurate, this is another high-precision area.

A Better 640 mode

(This was added in 2.0. Thanks André!)

One of the things I'd like to see in Bernie is a smarter 640 mode, one that looks like the AppleColor display, which has a dot pitch just big enough to blur together colors, but still allow sharp text.

Here's my desktop in Bernie now:

[normal]

Here's how I'd like it to look:

[smart]

Here's some pseudocode for "Smart" 640 mode. It all depends on checking the 640 mode palettes to see which colors are dithered:

build_palettes()					//call every time gs_pals change
    for all 16 palettes
	convert gs_pal to mac_pal			//12 bit to 24 bit, etc
	build smart_pal with averages of gs_pal		//same method as small window mode

is_dithered(pair)
    if pair.color1 is the same in all 4 positions of current_pal and
       pair.color2 is the same in all 4 positions of current_pal
	return false
    else
	return true

smart_640_mode()					//blend dithered colors
    for every scanline
	set current_pal to this scanline's palette
	if this scanline is 640 mode
	    for every 2 pixel pair
		if is_dithered(this pair)
		    draw in mac_buffer with one color from smart_pal
		else
		    draw as normal with two colors from mac_pal
	else
	    draw as normal with one color from mac_pal