6502Android/app/src/main/kotlin/android/emu6502/Display.kt

77 lines
2.0 KiB
Kotlin
Raw Normal View History

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