     
 }
 
+private struct VICColorPipeline: BinaryConvertible {
+    
+    //MARK: Registers
+    fileprivate var ec: UInt8 = 0 // Border Color
+    fileprivate var b0c: UInt8 = 0 // Background Color 0
+    fileprivate var b1c: UInt8 = 0 // Background Color 1
+    fileprivate var b2c: UInt8 = 0 // Background Color 2
+    fileprivate var b3c: UInt8 = 0 // Background Color 3
+    fileprivate var mm0: UInt8 = 0 // Sprite Multicolor 0
+    fileprivate var mm1: UInt8 = 0 // Sprite Multicolor 1
+    fileprivate var m_c: [UInt8] = [UInt8](repeating: 0, count: 8) // Color Sprite
+    //MARK: -
+
+    static func extract(_ binaryDump: BinaryDump) -> VICColorPipeline {
+        return VICColorPipeline(ec: binaryDump.next(), b0c: binaryDump.next(), b1c: binaryDump.next(), b2c: binaryDump.next(), b3c: binaryDump.next(), mm0: binaryDump.next(), mm1: binaryDump.next(), m_c: binaryDump.next(8))
+    }
+    
+}
+
 internal struct VICState: ComponentState {
     
     //MARK: Memory

                if state.ecm {
                    switch (state.pipe.graphicsVideoMatrix & 0xC0) >> 6 {
                    case 0:
                        state.screenBuffer[state.bufferPosition] = colors[Int(state.b0c)]
                    case 1:
                        state.screenBuffer[state.bufferPosition] = colors[Int(state.b1c)]
                    case 2:
                        state.screenBuffer[state.bufferPosition] = colors[Int(state.b2c)]
                    case 3:
                        state.screenBuffer[state.bufferPosition] = colors[Int(state.b3c)]
                    default:
                        break
                    }
                } else {
                    state.screenBuffer[state.bufferPosition] = colors[Int(state.b0c)]
                }
            }
            state.graphicsShiftRegister <<= 1
        } else {
            switch (state.graphicsShiftRegister & 0xC0) >> 6 {
            case 0:
                state.screenBuffer[state.bufferPosition] = colors[Int(state.b0c)]
            case 1:
                state.screenBuffer[state.bufferPosition] = colors[Int(state.b1c)]
            case 2:
                graphicsPixel = Int(state.b2c)
            case 3:
                graphicsPixel = Int(state.pipe.graphicsColorLine) & 0x07
            default:

        //TODO: this will cause the next 2 frames to be skipped, as the actual buffers are in VIC, figure this later
        //      Good enough for now
        let screenBuffer = UnsafeMutableBufferPointer<UInt32>(start: calloc(512 * 512, MemoryLayout<UInt32>.size).assumingMemoryBound(to: UInt32.self), count: 512 * 512)
        return VICState(ioMemory: binaryDump.next(64), videoMatrix: binaryDump.next(40), colorLine: binaryDump.next(40), mp: binaryDump.next(), screenBuffer: screenBuffer, currentCycle: binaryDump.next(), currentLine: binaryDump.next(), m_y: binaryDump.next(8), yScroll: binaryDump.next(), rsel: binaryDump.next(), den: binaryDump.next(), bmm: binaryDump.next(), ecm: binaryDump.next(), raster: binaryDump.next(), me: binaryDump.next(), xScroll: binaryDump.next(), csel:binaryDump.next(), mcm: binaryDump.next(), mye: binaryDump.next(), vm: binaryDump.next(), cb: binaryDump.next(), ir: binaryDump.next(), ier: binaryDump.next(), mdp: binaryDump.next(), mmc: binaryDump.next(), mm: binaryDump.next(), md: binaryDump.next(), vc: binaryDump.next(), vcbase: binaryDump.next(), rc: binaryDump.next(), vmli: binaryDump.next(), displayState: binaryDump.next(), rasterX: binaryDump.next(), rasterInterruptLine: binaryDump.next(), ref: binaryDump.next(), mc: binaryDump.next(8), mcbase: binaryDump.next(8), yExpansion: binaryDump.next(8), pipe: binaryDump.next(), nextPipe: binaryDump.next(), colorPipe: binaryDump.next(), nextColorPipe: binaryDump.next(), addressBus: binaryDump.next(), dataBus: binaryDump.next(), memoryBankAddress: binaryDump.next(), bufferPosition: binaryDump.next(), badLinesEnabled: binaryDump.next(), isBadLine: binaryDump.next(), baPin: binaryDump.next(), baLowCount: binaryDump.next(), currentSprite: binaryDump.next(), spriteDma: binaryDump.next(8), spriteDisplay: binaryDump.next(8), anySpriteDisplaying: binaryDump.next(), spriteSequencerData: binaryDump.next(8), spriteShiftRegisterCount: binaryDump.next(8), spriteShiftRegisterPixelsPerShift: binaryDump.next(8), graphicsShiftRegister: binaryDump.next())
    }
    
    var description: String {
