mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-11 21:51:50 +09:00
TAV: experimental separate audio format mode
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user