C64Lib.Core.MOS6569.draw_graphics C# (CSharp) Method

draw_graphics() public method

public draw_graphics ( ) : void
return void
        void draw_graphics()
        {
            if (!draw_this_line)
                return;

            if (ud_border_on)
            {
                draw_background();
                return;
            }

            int p = _chunkyIndex + x_scroll;
            //byte* c = stackalloc byte[4];  // NOTE: stackalloc is not implemented on all .NET Compact Framework CLRs
            //fixed (byte* c = new byte[4])  // One workable alternative to stackalloc, but this allocated memory from the heap (causing more fragmentation)

            //FourBytes fourBytes;
            byte[] colorBuffer = new byte[4];

            //byte* c = &fourBytes.first;  // Another alternative to stackalloc, which is also allocated on the stack and compatible with .NET Compact Framework
            {
                byte colorMask;

                switch (display_idx)
                {

                    case 0:		// Standard text
                        colorBuffer[0] = b0c_color;
                        colorBuffer[1] = colors[color_data];
                        goto draw_std;

                    case 1:		// Multicolor text
                        if ((color_data & 8) != 0)
                        {
                            colorBuffer[0] = b0c_color;
                            colorBuffer[1] = b1c_color;
                            colorBuffer[2] = b2c_color;
                            colorBuffer[3] = colors[color_data & 7];
                            goto draw_multi;
                        }
                        else
                        {
                            colorBuffer[0] = b0c_color;
                            colorBuffer[1] = colors[color_data];
                            goto draw_std;
                        }

                    case 2:		// Standard bitmap
                        colorBuffer[0] = colors[char_data];
                        colorBuffer[1] = colors[char_data >> 4];
                        goto draw_std;

                    case 3:		// Multicolor bitmap
                        colorBuffer[0] = b0c_color;
                        colorBuffer[1] = colors[char_data >> 4];
                        colorBuffer[2] = colors[char_data];
                        colorBuffer[3] = colors[color_data];
                        goto draw_multi;

                    case 4:		// ECM text
                        if ((char_data & 0x80) != 0)
                            if ((char_data & 0x40) != 0)
                                colorBuffer[0] = b3c_color;
                            else
                                colorBuffer[0] = b2c_color;
                        else
                            if ((char_data & 0x40) != 0)
                                colorBuffer[0] = b1c_color;
                            else
                                colorBuffer[0] = b0c_color;
                        colorBuffer[1] = colors[color_data];
                        goto draw_std;

                    case 5:		// Invalid multicolor text
                        //p[0] = p[1] = p[2] = p[3] = p[4] = p[5] = p[6] = p[7] = colors[0];
                        _display.SetPixels(p, 8, colors[0]);

                        if ((color_data & 8) != 0)
                        {
                            // TODO
                            //fore_mask_ptr[0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
                            //fore_mask_ptr[1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
                            fore_mask_buf[fore_mask_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
                            fore_mask_buf[fore_mask_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));

                        }
                        else
                        {
                            // TODO
                            //fore_mask_ptr[0] |= (byte)(gfx_data >> x_scroll);
                            //fore_mask_ptr[1] |= (byte)(gfx_data << (7 - x_scroll));
                            fore_mask_buf[fore_mask_index + 0] |= (byte)(gfx_data >> x_scroll);
                            fore_mask_buf[fore_mask_index + 1] |= (byte)(gfx_data << (7 - x_scroll));

                        }
                        return;

                    case 6:		// Invalid standard bitmap
                        //p[0] = p[1] = p[2] = p[3] = p[4] = p[5] = p[6] = p[7] = colors[0];
                        _display.SetPixels(p, 8, colors[0]);

                        // TODO
                        //fore_mask_ptr[0] |= (byte)(gfx_data >> x_scroll);
                        //fore_mask_ptr[1] |= (byte)(gfx_data << (7 - x_scroll));
                        fore_mask_buf[fore_mask_index + 0] |= (byte)(gfx_data >> x_scroll);
                        fore_mask_buf[fore_mask_index + 1] |= (byte)(gfx_data << (7 - x_scroll));
                        return;

                    case 7:		// Invalid multicolor bitmap
                        //p[0] = p[1] = p[2] = p[3] = p[4] = p[5] = p[6] = p[7] = colors[0];
                        _display.SetPixels(p, 8, colors[0]);

                        // TODO
                        //fore_mask_ptr[0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
                        //fore_mask_ptr[1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
                        fore_mask_buf[fore_mask_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
                        fore_mask_buf[fore_mask_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
                        return;

                    default:	// Can't happen
                        return;
                }

            draw_std:

                // TODO
                //fore_mask_ptr[0] |= (byte)(gfx_data >> x_scroll);
                //fore_mask_ptr[1] |= (byte)(gfx_data << (7 - x_scroll));
                fore_mask_buf[fore_mask_index + 0] |= (byte)(gfx_data >> x_scroll);
                fore_mask_buf[fore_mask_index + 1] |= (byte)(gfx_data << (7 - x_scroll));

                colorMask = gfx_data;

                /*
                _display.SetPixel(p + 7, fourBytes[data & 1]); data >>= 1;
                _display.SetPixel(p + 6, fourBytes[data & 1]); data >>= 1;
                _display.SetPixel(p + 5, fourBytes[data & 1]); data >>= 1;
                _display.SetPixel(p + 4, fourBytes[data & 1]); data >>= 1;
                _display.SetPixel(p + 3, fourBytes[data & 1]); data >>= 1;
                _display.SetPixel(p + 2, fourBytes[data & 1]); data >>= 1;
                _display.SetPixel(p + 1, fourBytes[data & 1]); data >>= 1;
                _display.SetPixel(p + 0, fourBytes[data]);
                */

                _display.SetPixelsStd(p, colorBuffer, colorMask);

                return;

            draw_multi:
                // TODO
                //fore_mask_ptr[0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
                //fore_mask_ptr[1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
                //fore_mask_buf[fore_mask_buf_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
                //fore_mask_buf[fore_mask_buf_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
                fore_mask_buf[fore_mask_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
                fore_mask_buf[fore_mask_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));

                colorMask = gfx_data;

                /*
                _display.SetPixel(p + 7, fourBytes[data & 3]);
                _display.SetPixel(p + 6, fourBytes[data & 3]);
                data >>= 2;

                _display.SetPixel(p + 5, fourBytes[data & 3]);
                _display.SetPixel(p + 4, fourBytes[data & 3]);
                data >>= 2;

                _display.SetPixel(p + 3, fourBytes[data & 3]);
                _display.SetPixel(p + 2, fourBytes[data & 3]);
                data >>= 2;

                _display.SetPixel(p + 1, fourBytes[data & 3]);
                _display.SetPixel(p + 0, fourBytes[data & 3]);
                */

                _display.SetPixelsMulti(p, colorBuffer, colorMask);

                return;
            }
        }