
                                 16Bit per Pixel
                              Interlaced Truecolour
                                 on the Atari TT


        Recently I dealt with the idea of improving my interlaced C2P
        which provides an interlaced 12bit (444) mode on the TT in order
        to reduce the flicker a bit. Well, after playing around with 
        some ideas it occurred to me that it should be possible to 
        actually display 65536 colours on a TT even if its video's DAC 
        only provides a 444 resolution and thus a maximum amount of 4096 
        colours.

        So how can you achieve 16bit colour you might ask. Well, there
        have always been simple tricks yielding to great effects in the 
        demo coding scene, right? Just look at Paradox' recent 
        achievement to make up an interlaced 14bit resolution providing 
        640x400 pixels which of course is far beyond the shifter's 
        original specifications.

        Now the trick that I came up with on the TT is quite easy, not 
        requiring any synced code or anything similar, just plain 
        interlacing between two half-images based on the Jaguar's CrY
        colourspace where colours get divided into a cyan-red part (Cr,
        4-4bit) and into a luminance (Y, 8 bit) which was basically 
        chosen despite its non-standardness to implement fast and easy 
        gouraud-shading in the machine's Blitter AFAIR.

        The CR table (which resides in the jaguar's video chip) can be 
        thought of as a colour-cube whose outline has been distorted to 
        fit a square so that a certain (CrY) colour's chroma value can 
        be addressed in a 2 dimensional array from two 4bit coordinates.

        It seemed obvious that I could use the TT's 8bpp greyscale mode 
        in order to fake the luminance layer in my interlacing scheme 
        and use the 2nd half-image to render the CR part with in a 
        palette taken from the Jaguar's ROM table. 

        Converting from RGB to CrY can be done by computing the RGB
        colours luminance, use that one to normalize the RGB vector and 
        then find the closest match to the 256 ROM table entries. hint: 
        It's completely safe to use Y = max(R,G,B) as the luma and 
        normalization value instead of any perceptual formula or similar 
        as it gives better results in connection with CrY images... 
        However, there are convenient tools, such as TGA2CRY.TTP to 
        convert from RGB to CrY.

        To demonstrate the capabilities of the emulated CrY mode I've 
        made up a little tool called CRYVIEW.TTP which is supposed to 
        run only on the Atari TT and which you should find in this 
        issue's "Filez" folder.

        As you may notice there are some drawbacks: for one thing 
        there's obviously a lot of flicker involved, but I am already 
        working on a method that switches between colour and grey-mode 
        each scanline and flips grey and coloured lines over each VBL so
        the flicker doesn't become that much laminar. 

        Secondly, using an interlaced grey half-image causes the Y layer 
        to be mixed in additively instead of multiplicative which means 
        that a luminance of 0 can't be achieved so that colours can't be 
        darkened completely. The third disadvantage is that the TT's 
        shifter uses palette register 0 to determine the screens border 
        colour which would be a bright blue in the CR table and black in 
        the Y ramp which produced pretty much unacceptable contrast and 
        flicker results. Hence I dropped colour 0 in the CR palette so 
        that colours with a CR value of 0x00 are rendered to the next 
        closer match (0x01) so that the amount of displayable colours is 
        reduced by 256 to 65280 which doesn't make a noticeable 
        difference anyway.


        Ah and btw, a nice thing working in CrY mode is that you can 
        abuse the 68030 pack/unpk instructions which are actually meant 
        for converting BCD numbers to ASCII strings to quickly extract 
        the Cr channels bitfields into high and low byte order and 
        reorder them just as easily. The unpacked version provides you 
        with a pixelformat that lets you mix, average or filter your 
        image data for free. Just take a look into 
        "filez/cryview/cry.s" -> "antialiasImage" to get an idea of 
        what i'm talking about here. there are similar instrucions in 
        the jaguar's GPU suited to process CrY image data, but with the 
        68030 it works as follows:

        ; packed Cr pixels d0.w = **** **** C1C1 R1R1
        ;                  d1.w = **** **** C2C2 R2R2

           unpk        d0,d0,#0    ; #0 specifies an additional offset
           unpk        d1,d1,#0

        ; now unpacked d0.w = **** C1C1 **** R1R1
        ;              d1.w = **** C2C2 **** R2R2

           add.w       d1,d0       ; Average the two pixels
           lsr.w       #1,d0

           pack        d0,d0,#0    ; Reorder into CCCC RRRR format


        As you see the unpacked format reserves a field of four blank 
        pixels above each channel so that you can mix up to 16 pixels. 
        The Y channel can be filtered pretty much straighforward once 
        it's been extracted because it is nothing more than a plain 8bpp 
        channel so you don't need any packing/unpacking in its case. 
        
        Note: You can replace 'unpk' by 'lsl.w #4,dx; lsr.b #4,dx' and
        pack by 'lsl.b #4,dx; lsr.w #4,dx' in this special case on CPUs
        lacking those instructions but this document is aimed at the 
        TT030, anyway.

        If you have any questions regarding that CrY mode or if you are
        interested in a double-pixeled (speed issues) c2p that converts
        from a 16bpp CrY to an interlaced screen on the TT drop me a
        line via ray(at)tscc(dot)de or via IRC (#atariscne) if you
        manage to catch me up there.

        Keep it real, stay Atari.

                                        Ray / tSCc for Alive, 2005-12-20
