2019-09-11 00:39:58 +00:00
|
|
|
package razorvine.ksim65.components
|
2019-09-11 00:17:59 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* A parallel output device (basically, prints bytes as characters to the screen)
|
|
|
|
* First address = data byte (8 parallel bits)
|
|
|
|
* Second address = control byte (bit 0 high = write byte)
|
|
|
|
*/
|
|
|
|
class ParallelPort(startAddress: Address, endAddress: Address) : MemMappedComponent(startAddress, endAddress) {
|
2019-09-14 16:58:45 +00:00
|
|
|
private var dataByte: UByte = 0
|
2019-09-11 00:17:59 +00:00
|
|
|
|
|
|
|
init {
|
|
|
|
require(endAddress - startAddress + 1 == 2) { "parallel needs exactly 2 memory bytes (data + control)" }
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun clock() {}
|
|
|
|
override fun reset() {}
|
|
|
|
|
|
|
|
override operator fun get(address: Address): UByte {
|
|
|
|
return if (address == startAddress)
|
|
|
|
dataByte
|
|
|
|
else
|
|
|
|
0
|
|
|
|
}
|
|
|
|
|
|
|
|
override operator fun set(address: Address, data: UByte) {
|
|
|
|
if (address == startAddress)
|
|
|
|
dataByte = data
|
|
|
|
else if (address == endAddress) {
|
|
|
|
if ((data.toInt() and 1) == 1) {
|
2019-09-14 16:58:45 +00:00
|
|
|
val char = dataByte.toChar()
|
2019-09-11 00:17:59 +00:00
|
|
|
println("PARALLEL WRITE: '$char'")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|