Horizontal Rastersplits

By Monte Carlos

Very basic rastersplitting can be done by waiting for a certain rasterline an then switch some VIC register. The display has 312 rasterlines at max but the VIC rasterline register ($d012) has only a range of 0 to 255. Therefore bit 7 of $d011 indicates if the rasterline is <256 or >255. Now the questions arises how to wait for a certain rasterline in the whole range without the preassumption of beeing in rasterline x when the wait routine is called. Here is a diagram which examples the situation:

 waiting for a rasterline

Dependent of which rasterline you're currently in, you can simply compare $d012 with the desired rasterline or you must first wait for bit 7 of $d011 to attain the right value and then wait again for the desired line. Even more, retrace has to be taken into account, too.

In total you have to consider 6 different cases:

being in rasterline 0-255 and

being in rasterline 256+ and

waitrasterline:
    cpx #0
    beq wait0To255
    ;from here on we wait for a rasterline > 255
    bit $d011
    bpl *-3
    ;inRasterLineGT255
    cmp $d012
    bcs waitMatchingD012
    bit $d011
    bmi *-3
    bit $d011
    bpl *-3
    bmi waitMatchingD012
wait0To255:
    bit $d011
    bmi *-3
    ;inRasterlineLT256
    cmp $d012
    bcs waitMatchingD012
    bit $d011
    bpl *-3
    bit $d011
    bmi *-3
waitMatchingD012:
    cmp $d012
    bne waitMatchingD012
    rts