19

Many games, for example, Maniac Mansion, or Kissenschlacht, use two screen modes. Oftentimes, a bitmap mode for the main screen, and a text mode for the lower part which displays scores or whatever. Considering how the raster moves across the screen, it's not so hard to implement. It's basically, set up a raster interrupt, and then change the mode in the interrupt routine. Same way you open up the lower and upper borders.

Now, with careful timing, the left and right borders may be opened up too. So I'm wondering if a similar technique can be used to change the screen mode partway across a line, so that the whole screen is divided into, say, a text mode left half and a bitmapped right half. Has this ever been done or could it be done?

2
  • 5
    Definitely not on all scanlines since the C64 famously has 'bad lines' — lines where it is necessary to fetch tile map contents for that row, in which the CPU isn't actually running. So there's nobody about to change screen mode. On all the other lines I'll bet the answer is 'yes', as it is on almost every other comparable machine, but I don't actually know. So don't take that as an answer.
    – Tommy
    Sep 12, 2018 at 14:39
  • 1
    In demos apparently yes: csdb.dk/release/?id=10881
    – Alan B
    Nov 21, 2018 at 16:27

3 Answers 3

17

[TL;DR] vertical rastersplit with different graphic modes is possible with some quirks, in practice one would rather write characters onto a full hires image.

I did some experiments, and found out that it is possible for the VIC chip to switch mode within a rasterline. However a practical application is hindered by the following issues:

  • Every 8th rasterline, the VIC chip is stopping the CPU for about 40 cycles. This is the so-called bad line. The CPU is stunned while the middle part of the screen is drawn, which makes it impossible to switch modes in the middle of a badline. This page has a very good depiction of the phenomen.
  • After switching between modes it seems that the transition is done in parts. First the color mode is changed to hires while the actual hires graphics appear around two chars later. The following image shows an example where the left side of the screen is in char mode while the right side is in hires mode. The last two characters of "COMMODORE" are already colored with hires function while shown as characters:

                             Horizontal split

That being said, when one can live with every 8th line on the left side being hires (could be colored in background color so it would be not visible) and when the two character wide transition border is concealed, a vertical split would be feasible.

See my question How to exactly sync to the raster line for a vertical raster split? for a short code example.

On a second thought, if the overall mode is hires it is possible to represent any text or blockgraphic from textmode, only printing a char requires 8 bytes to be poked instead of one. However, this is still much less effort than the raster split every line.

5
  • 2
    You can prevent badlines by constantly tweaking the y scroll register so that the Vic never finds itself to have reached the first line of a new character row. Unfortunately I think it will just revert to its in-visible-area idle state of fetching and outputting the value at 3FFF on a black background once it runs past where it should have had a bad line, so I don't immediately have a means to make that observation especially helpful.
    – Tommy
    Jan 14, 2019 at 19:55
  • 1
    @Tommy: $3fff in VIC 14-bit addressing. The actual byte read may be at $3fff, $7fff, $bfff or $ffff (always RAM), depending on the VIC page selected by CIA2.
    – Janka
    Jan 15, 2019 at 5:27
  • Unless I'm mistaken, the only system of that era I knew that had official support for this sort of thing was the Nutting chip that was used in some of the Midway arcade games.IIRC it had a register based on the color clock that switched to/from text mode. Gorf used this maybe? I'd love to know if there were other examples that deliberately included this feature. Jan 15, 2019 at 20:37
  • 1
    That is a really interesting find! I've coded quite a bit on the C64, but never knew the VIC had this hidden screen-mode which is a mix of text-mode and bitmap-mode. Granted it's hard to exploit, since it's only there for 2 cycles per $D011-write. And the screen-mode itself isn't too flexible, since the screen-bytes both decides the character to show as well as its foreground + background color (each char is locked to a specific fg and bg color). But still, it might be useful for something - it's like an extended "extended color mode" (256 chars instead of 64 and 16 bg colors instead of 4). Aug 16, 2020 at 22:05
  • I wonder how hard it would have been for the VIC-II to support modes without badlines--either assuming a constant value read from character memory, or blanking every eighth row but repurposing what would be shape data fetches for character fetches? Having every eighth scan line blanked would have been less annoying than having to blank the entire screen.
    – supercat
    Nov 12, 2021 at 20:42
6

I'm going to go out on a limb; after thorough reading of The MOS 6567/6569 video controller (VIC-II) and its application in the Commodore 64:

  • graphics modes are directly selected by the bits in d011 and d016 (so e.g. they're not just latches that are copied somewhere else upon horizontal or vertical retrace); and
  • most of the pipeline is common, and runs at a fixed clock — the selected mode affects address calculation for pushing to a shift register, which is always some translation of the same mode-independent global counters; and translation of whatever comes out of the register.

No mention is made anywhere in the documentation of anything that would cause mode changes to take effect anything other than instantly, and the idea of raster effects that cause vertical boundaries is well-enough established that you can find the occasional argument about it.

Several vertical raster split demos are available on Youtube but alas I was unable to identify one that I could definitively say was a mode change rather than a palette effect.

0

Yes, you can do that, and it has been done on the Commodore 64 before. The prime example is the below part of "Wonderland IX" demo by Censor Design from 1992.

Here is the link to video: https://youtu.be/PMeeJdUCM20?t=1201

And here is the link to the binary. https://csdb.dk/release/?id=11605

4
  • 1
    Could you explain how this answers the question? Looking at the video it's not clear how there's a mix of plain text and graphics. Could you perhaps include a screenshot in your answer and explain what the program is doing? Nov 12, 2021 at 1:33
  • It looks like it could have been done with sprites instead somehow Nov 12, 2021 at 8:53
  • @AlexHajnal I linked a video with a time stamp. The part at this timestamp is graphics on the left, and text on the right. The sprites in the middle are covering the possible artifacts. This answers the questions: can the timed switching be used to do that split (yes, as seen in the demo) and has it been done (yes, in the demo).
    – user23355
    Nov 12, 2021 at 21:48
  • 1
    The demo itself just before the part linked says "TRUE SPLITTER BETWEEN HIRES AND CHARS BE PATIENT" across several screens, ref: youtube.com/watch?v=PMeeJdUCM20&t=1140s
    – Brian
    Nov 12, 2021 at 23:16

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .