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.
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:
Here's how I'd like it to look:
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