gpu: graphics mode 2

This commit is contained in:
minjaesong
2022-04-20 10:34:41 +09:00
parent 219845e565
commit 82c5d75b26
2 changed files with 28 additions and 5 deletions

View File

@@ -256,6 +256,8 @@ MMIO
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)
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
Layer Arrangement
If 4 layers are used:

View File

@@ -285,7 +285,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
7L -> setGraphicsAttributes(byte)
9L -> { ttyFore = bi }
10L -> { ttyBack = bi }
12L -> { graphicsMode = bi }
12L -> { if (bi >= 3 && sgr.bankCount == 1) graphicsMode = 0 else graphicsMode = bi }
13L -> { layerArrangement = bi }
14L -> { framebufferScrollX = framebufferScrollX.and(0xFFFFFF00.toInt()).or(bi) }
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)
framebuffer2.setColor(-1);framebuffer2.fill()
if (isRefSize && graphicsMode == 1) {
val layerOrder = LAYERORDERS4[layerArrangement]
if (isRefSize && (graphicsMode == 1 || graphicsMode == 2)) {
val layerOrder = (if (graphicsMode == 1) LAYERORDERS4 else LAYERORDERS2)[layerArrangement]
for (y in 0..223) {
var xoff = scanlineOffsets[2L * y].toUint().shl(8) or scanlineOffsets[2L * y + 1].toUint()
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) {
for (x in xs) {
val colour = layerOrder.map { layer ->
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])
if (graphicsMode == 1) {
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 ->
// manually alpha compositing
// out_color = {src_color * src_alpha + dest_color * dest_alpha * (1-src_alpha)} / out_alpha