mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-12 23:54:04 +09:00
gpu: graphics mode 2
This commit is contained in:
@@ -256,6 +256,8 @@ MMIO
|
|||||||
3: 560x448, 256 Colours, 2 layers (if bank 2 is not installed, will fall back to mode 0)
|
3: 560x448, 256 Colours, 2 layers (if bank 2 is not installed, will fall back to mode 0)
|
||||||
4: 560x448, 4096 Colours, 1 layer (if bank 2 is not installed, will fall back to mode 0)
|
4: 560x448, 4096 Colours, 1 layer (if bank 2 is not installed, will fall back to mode 0)
|
||||||
4096 is also known as "direct colour mode" (4096 colours * 16 transparency -> 65536 colours)
|
4096 is also known as "direct colour mode" (4096 colours * 16 transparency -> 65536 colours)
|
||||||
|
Two layers are grouped to make a frame, "low layer" contains RG colours and "high layer" has BA colours,
|
||||||
|
Red and Blue occupies MSBs
|
||||||
13 RW
|
13 RW
|
||||||
Layer Arrangement
|
Layer Arrangement
|
||||||
If 4 layers are used:
|
If 4 layers are used:
|
||||||
|
|||||||
@@ -285,7 +285,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
|
|||||||
7L -> setGraphicsAttributes(byte)
|
7L -> setGraphicsAttributes(byte)
|
||||||
9L -> { ttyFore = bi }
|
9L -> { ttyFore = bi }
|
||||||
10L -> { ttyBack = bi }
|
10L -> { ttyBack = bi }
|
||||||
12L -> { graphicsMode = bi }
|
12L -> { if (bi >= 3 && sgr.bankCount == 1) graphicsMode = 0 else graphicsMode = bi }
|
||||||
13L -> { layerArrangement = bi }
|
13L -> { layerArrangement = bi }
|
||||||
14L -> { framebufferScrollX = framebufferScrollX.and(0xFFFFFF00.toInt()).or(bi) }
|
14L -> { framebufferScrollX = framebufferScrollX.and(0xFFFFFF00.toInt()).or(bi) }
|
||||||
15L -> { framebufferScrollX = framebufferScrollX.and(0xFFFF00FF.toInt()).or(bi shl 8) }
|
15L -> { framebufferScrollX = framebufferScrollX.and(0xFFFF00FF.toInt()).or(bi shl 8) }
|
||||||
@@ -745,8 +745,8 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
|
|||||||
chrrom.pixels.position(0)
|
chrrom.pixels.position(0)
|
||||||
|
|
||||||
framebuffer2.setColor(-1);framebuffer2.fill()
|
framebuffer2.setColor(-1);framebuffer2.fill()
|
||||||
if (isRefSize && graphicsMode == 1) {
|
if (isRefSize && (graphicsMode == 1 || graphicsMode == 2)) {
|
||||||
val layerOrder = LAYERORDERS4[layerArrangement]
|
val layerOrder = (if (graphicsMode == 1) LAYERORDERS4 else LAYERORDERS2)[layerArrangement]
|
||||||
for (y in 0..223) {
|
for (y in 0..223) {
|
||||||
var xoff = scanlineOffsets[2L * y].toUint().shl(8) or scanlineOffsets[2L * y + 1].toUint()
|
var xoff = scanlineOffsets[2L * y].toUint().shl(8) or scanlineOffsets[2L * y + 1].toUint()
|
||||||
if (xoff.and(0x8000) != 0) xoff = xoff or 0xFFFF0000.toInt()
|
if (xoff.and(0x8000) != 0) xoff = xoff or 0xFFFF0000.toInt()
|
||||||
@@ -755,8 +755,29 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
|
|||||||
if (xoff in -(280 - 1) until 280) {
|
if (xoff in -(280 - 1) until 280) {
|
||||||
for (x in xs) {
|
for (x in xs) {
|
||||||
val colour = layerOrder.map { layer ->
|
val colour = layerOrder.map { layer ->
|
||||||
val colourIndex = framebuffer.pixels.get((280*224*layer) + (y * 280 + x)).toUint()
|
if (graphicsMode == 1) {
|
||||||
Color(paletteOfFloats[4*colourIndex], paletteOfFloats[4*colourIndex+1], paletteOfFloats[4*colourIndex+2], paletteOfFloats[4*colourIndex+3])
|
val colourIndex = framebuffer.pixels.get((280 * 224 * layer) + (y * 280 + x)).toUint()
|
||||||
|
Color(
|
||||||
|
paletteOfFloats[4 * colourIndex],
|
||||||
|
paletteOfFloats[4 * colourIndex + 1],
|
||||||
|
paletteOfFloats[4 * colourIndex + 2],
|
||||||
|
paletteOfFloats[4 * colourIndex + 3]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val lowBits = framebuffer.pixels.get((280 * 224 * layer * 2) + (y * 280 + x)).toUint()
|
||||||
|
val highBits = framebuffer.pixels.get((280 * 224 * (layer*2 + 1)) + (y * 280 + x)).toUint()
|
||||||
|
val r = lowBits.ushr(4).and(15)
|
||||||
|
val g = lowBits.and(15)
|
||||||
|
val b = highBits.ushr(4).and(15)
|
||||||
|
val a = highBits.and(15)
|
||||||
|
Color(
|
||||||
|
r / 15f,
|
||||||
|
g / 15f,
|
||||||
|
b / 15f,
|
||||||
|
a / 15f
|
||||||
|
)
|
||||||
|
}
|
||||||
}.fold(Color(0)) { dest, src ->
|
}.fold(Color(0)) { dest, src ->
|
||||||
// manually alpha compositing
|
// manually alpha compositing
|
||||||
// out_color = {src_color * src_alpha + dest_color * dest_alpha * (1-src_alpha)} / out_alpha
|
// out_color = {src_color * src_alpha + dest_color * dest_alpha * (1-src_alpha)} / out_alpha
|
||||||
|
|||||||
Reference in New Issue
Block a user