TAV: experimental separate audio format mode

This commit is contained in:
minjaesong
2025-10-22 09:33:15 +09:00
parent 4eec98cdca
commit 758b134abd
6 changed files with 278 additions and 25 deletions

View File

@@ -3,6 +3,7 @@ package net.torvald.tsvm
import com.badlogic.gdx.utils.compression.Lzma
import io.airlift.compress.zstd.ZstdInputStream
import io.airlift.compress.zstd.ZstdOutputStream
import net.torvald.UnsafeHelper
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
@@ -19,30 +20,51 @@ class CompressorDelegate(private val vm: VM) {
*/
fun compFromTo(input: Int, len: Int, output: Int): Int {
val inbytes = ByteArray(len) { vm.peek(input.toLong() + it)!! }
comp(inbytes).let {
it.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
val bytes = comp(inbytes)
vm.getDev(output.toLong(), bytes.size.toLong(), true).let {
if (it != null) {
val bytesReversed = bytes.reversedArray() // copy over reversed bytes starting from the end of the destination
UnsafeHelper.memcpyRaw(bytesReversed, UnsafeHelper.getArrayOffset(bytesReversed), null, output.toLong() - bytes.size, bytes.size.toLong())
}
else {
bytes.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
}
}
return it.size
}
return bytes.size
}
fun compTo(str: String, output: Int): Int {
comp(str).let {
it.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
val bytes = comp(str)
vm.getDev(output.toLong(), bytes.size.toLong(), true).let {
if (it != null) {
val bytesReversed = bytes.reversedArray() // copy over reversed bytes starting from the end of the destination
UnsafeHelper.memcpyRaw(bytesReversed, UnsafeHelper.getArrayOffset(bytesReversed), null, output.toLong() - bytes.size, bytes.size.toLong())
}
else {
bytes.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
}
}
return it.size
}
return bytes.size
}
fun compTo(ba: ByteArray, output: Int): Int {
comp(ba).let {
it.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
val bytes = comp(ba)
vm.getDev(output.toLong(), bytes.size.toLong(), true).let {
if (it != null) {
val bytesReversed = bytes.reversedArray() // copy over reversed bytes starting from the end of the destination
UnsafeHelper.memcpyRaw(bytesReversed, UnsafeHelper.getArrayOffset(bytesReversed), null, output.toLong() - bytes.size, bytes.size.toLong())
}
else {
bytes.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
}
}
return it.size
}
return bytes.size
}
@@ -51,16 +73,32 @@ class CompressorDelegate(private val vm: VM) {
fun decompTo(str: String, pointer: Int): Int {
val bytes = decomp(str)
bytes.forEachIndexed { index, byte ->
vm.poke(pointer.toLong() + index, byte)
vm.getDev(pointer.toLong(), bytes.size.toLong(), true).let {
if (it != null) {
val bytesReversed = bytes.reversedArray() // copy over reversed bytes starting from the end of the destination
UnsafeHelper.memcpyRaw(bytesReversed, UnsafeHelper.getArrayOffset(bytesReversed), null, pointer.toLong() - bytes.size, bytes.size.toLong())
}
else {
bytes.forEachIndexed { index, byte ->
vm.poke(pointer.toLong() + index, byte)
}
}
}
return bytes.size
}
fun decompTo(ba: ByteArray, pointer: Int): Int {
val bytes = decomp(ba)
bytes.forEachIndexed { index, byte ->
vm.poke(pointer.toLong() + index, byte)
vm.getDev(pointer.toLong(), bytes.size.toLong(), true).let {
if (it != null) {
val bytesReversed = bytes.reversedArray() // copy over reversed bytes starting from the end of the destination
UnsafeHelper.memcpyRaw(bytesReversed, UnsafeHelper.getArrayOffset(bytesReversed), null, pointer.toLong() - bytes.size, bytes.size.toLong())
}
else {
bytes.forEachIndexed { index, byte ->
vm.poke(pointer.toLong() + index, byte)
}
}
}
return bytes.size
}
@@ -70,12 +108,19 @@ class CompressorDelegate(private val vm: VM) {
*/
fun decompFromTo(input: Int, len: Int, output: Int): Int {
val inbytes = ByteArray(len) { vm.peek(input.toLong() + it)!! }
decomp(inbytes).let {
it.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
val bytes = decomp(inbytes)
vm.getDev(output.toLong(), bytes.size.toLong(), true).let {
if (it != null) {
val bytesReversed = bytes.reversedArray() // copy over reversed bytes starting from the end of the destination
UnsafeHelper.memcpyRaw(bytesReversed, UnsafeHelper.getArrayOffset(bytesReversed), null, output.toLong() - bytes.size, bytes.size.toLong())
}
else {
bytes.forEachIndexed { index, byte ->
vm.poke(output.toLong() + index, byte)
}
}
return it.size
}
return bytes.size
}
companion object {

View File

@@ -725,7 +725,7 @@ class VM(
private fun relPtrInDev(from: Long, len: Long, start: Int, end: Int) =
(from in start..end && (from + len) in start..end)
private fun getDev(from: Long, len: Long, isDest: Boolean): Long? {
internal fun getDev(from: Long, len: Long, isDest: Boolean): Long? {
return if (from >= 0) usermem.ptr + from
// MMIO area
else if (from in -1048576..-1 && (from - len) in -1048577..-1) {
@@ -745,6 +745,7 @@ class VM(
else if (dev is AudioAdapter) {
if (relPtrInDev(fromRel, len, 64, 2367)) dev.mediaDecodedBin.ptr + fromRel - 64
else if (relPtrInDev(fromRel, len, 2368, 4096)) dev.mediaFrameBin.ptr + fromRel - 2368
else if (relPtrInDev(fromRel, len, 65536, 131072)) dev.pcmBin.ptr + fromRel - 65536
else null
}
else if (dev is GraphicsAdapter) {
@@ -770,7 +771,9 @@ class VM(
if (relPtrInDev(fromRel, len, 0, 250879)) dev.framebuffer.ptr + fromRel - 0
else if (relPtrInDev(fromRel, len, 250880, 251903)) dev.unusedArea.ptr + fromRel - 250880
else if (relPtrInDev(fromRel, len, 253950, 261631)) dev.textArea.ptr + fromRel - 253950
else if (relPtrInDev(fromRel, len, 262144, 513023)) dev.framebuffer2?.ptr?.plus(fromRel)?.minus(253950)
else if (relPtrInDev(fromRel, len, 262144, 513023)) dev.framebuffer2?.ptr?.plus(fromRel)?.minus(262144)
else if (relPtrInDev(fromRel, len, 524288, 775167)) dev.framebuffer3?.ptr?.plus(fromRel)?.minus(524288)
else if (relPtrInDev(fromRel, len, 786432, 1037371)) dev.framebuffer4?.ptr?.plus(fromRel)?.minus(786432)
else null
}
else if (dev is RamBank) {