diff --git a/firmware/render/render.c b/firmware/render/render.c index 7691bd0..75ca908 100644 --- a/firmware/render/render.c +++ b/firmware/render/render.c @@ -314,7 +314,7 @@ void DELAYED_COPY_CODE(render_loop)() } break; case SOFTSW_HIRES_MODE: //4 - if(current_softsw & SOFTSW_DGR) + if((current_softsw & (SOFTSW_80COL | SOFTSW_DGR)) == (SOFTSW_80COL | SOFTSW_DGR)) { render_dhgr(); } diff --git a/firmware/render/render_hires.c b/firmware/render/render_hires.c index 5fa2cfc..6ab986f 100644 --- a/firmware/render/render_hires.c +++ b/firmware/render/render_hires.c @@ -91,8 +91,14 @@ static void DELAYED_COPY_CODE(render_hires_line)(bool p2, uint line) // pixel uint oddness = 0; + // The 'AN3 trick' is used by Prince of Persia and several demos for the IIe. + // It relies on setting AN3 but not turning on 80 column mode. This causes a 90 degree + // phase shift relative to the color carrier which can be used as a quick palette shift + // effect. + uint phase_shift = (IS_SOFTSWITCH(SOFTSW_DGR)) ? 1 : 0; + // Load in the first 14 dots - uint32_t dots = (uint32_t)hires_dot_patterns[line_mem[0]] << 15; + uint32_t dots = (uint32_t)hires_dot_patterns[line_mem[0]] << (15 + phase_shift); for(uint i=1; i < 41; i++) { @@ -100,9 +106,9 @@ static void DELAYED_COPY_CODE(render_hires_line)(bool p2, uint line) uint b = (i < 40) ? line_mem[i] : 0; if(b & 0x80) { // Extend the last bit from the previous byte - dots |= (dots & (1u << 15)) >> 1; + dots |= (dots & (1u << (15 + phase_shift))) >> 1; } - dots |= (uint32_t)hires_dot_patterns[b] << 1; + dots |= (uint32_t)hires_dot_patterns[b] << (1 + phase_shift); // Consume 14 dots for(uint j=0; j < 7; j++)