package android.emu6502 import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.util.AttributeSet import android.view.View open class Display(context: Context, attrs: AttributeSet) : View(context, attrs) { private val numX = 32 private val numY = 32 private val matrix = Array(numX) { IntArray(numY) } private val palette = arrayOf( "#000000", "#ffffff", "#880000", "#aaffee", "#cc44cc", "#00cc55", "#0000aa", "#eeee77", "#dd8855", "#664400", "#ff7777", "#333333", "#777777", "#aaff66", "#0088ff", "#bbbbbb") private val paint: Paint = Paint() private val bgPaint: Paint = Paint() private var listener: Callbacks? = null init { bgPaint.color = Color.BLACK } fun setOnDisplayCallback(callback: Callbacks) { listener = callback } open fun updatePixel(addr: Int, value: Int) { val offsetAddr = addr - 0x200 val x = offsetAddr % numX val y = Math.floor((offsetAddr / numY).toDouble()).toInt() val color = palette[value] matrix[x][y] = Color.parseColor(color) postInvalidate() listener?.onUpdate() } override fun onDraw(canvas: Canvas) { val pixelSizeX = width / numX val pixelSizeY = height / numX matrix.forEachIndexed { i, _ -> matrix[i].forEachIndexed { j, _ -> val color = matrix[i][j] val right = (i * pixelSizeX).toFloat() val top = (j * pixelSizeY).toFloat() if (color != 0) { paint.color = color canvas.drawRect(right, top, right + pixelSizeX, top + pixelSizeY, paint) } else { canvas.drawRect(right, top, right + pixelSizeX, top + pixelSizeY, bgPaint) } } } listener?.onDraw() } interface Callbacks { fun onUpdate() fun onDraw() } fun reset() { matrix.forEachIndexed { i, _ -> matrix[i].forEachIndexed { j, _ -> matrix[i][j] = 0 } } postInvalidate() } }