Compare commits

...

6 Commits

Author SHA1 Message Date
Peter Ferrie
b869a0ccbc
Merge d4d3c59b8c into 4946dbd1e9 2024-04-09 23:28:52 -05:00
Brendan Robert
4946dbd1e9 Fix incomplete music decoding bug 2024-04-09 23:28:47 -05:00
Peter Ferrie
d4d3c59b8c defer case check to be faster 2023-09-03 15:08:16 -07:00
Peter Ferrie
c540527370 another fix 2023-09-03 14:42:51 -07:00
Peter Ferrie
3f359cf3ff fix a couple of bugs, compare a bit faster 2023-09-03 14:41:10 -07:00
Peter Ferrie
b258ed441a decompress faster 2023-09-02 11:30:15 -07:00
5 changed files with 57 additions and 51 deletions

View File

@ -113,6 +113,7 @@
<version>1.0.0.Final</version> <version>1.0.0.Final</version>
<executions> <executions>
<execution> <execution>
<?m2e execute onConfiguration,onIncremental?>
<id>add-module-infos</id> <id>add-module-infos</id>
<phase>generate-resources</phase> <phase>generate-resources</phase>
<goals> <goals>

View File

@ -189,7 +189,6 @@ public class SoundMixer extends Device {
buffers.add(buffer); buffers.add(buffer);
return buffer; return buffer;
} }
public static class SoundBuffer { public static class SoundBuffer {
public static int MAX_BUFFER_ID; public static int MAX_BUFFER_ID;
private ShortBuffer currentBuffer; private ShortBuffer currentBuffer;

View File

@ -47,14 +47,25 @@ public class Media {
totalDuration = STBVorbis.stb_vorbis_stream_length_in_seconds(decoder); totalDuration = STBVorbis.stb_vorbis_stream_length_in_seconds(decoder);
sampleRate = info.sample_rate(); sampleRate = info.sample_rate();
isStereo = info.channels() == 2; isStereo = info.channels() == 2;
if (isStereo) {
totalSamples *= 2;
}
tempSampleBuffer = MemoryUtil.memAllocShort(totalSamples); tempSampleBuffer = MemoryUtil.memAllocShort(2048);
STBVorbis.stb_vorbis_get_samples_short_interleaved(decoder, isStereo?2:1, tempSampleBuffer); sampleBuffer = ShortBuffer.allocate(totalSamples);
int sampleCount = 1;
int currentOffset = 0;
while (sampleCount > 0) {
sampleCount = STBVorbis.stb_vorbis_get_samples_short_interleaved(decoder, isStereo?2:1, tempSampleBuffer);
if (sampleCount == 0) {
break;
}
// copy sample buffer into byte buffer so we can deallocate, then transfer the buffer contents
sampleBuffer.put(currentOffset, tempSampleBuffer, 0, sampleCount * (isStereo ? 2 : 1));
tempSampleBuffer.rewind();
currentOffset += sampleCount * (isStereo ? 2 : 1);
}
STBVorbis.stb_vorbis_close(decoder); STBVorbis.stb_vorbis_close(decoder);
tempSampleBuffer.rewind();
// copy sample buffer into byte buffer so we can deallocate, then transfer the buffer contents
sampleBuffer = ShortBuffer.allocate(totalSamples*2);
sampleBuffer.put(tempSampleBuffer);
sampleBuffer.rewind(); sampleBuffer.rewind();
} catch (RuntimeException ex) { } catch (RuntimeException ex) {
throw ex; throw ex;

View File

@ -33,8 +33,9 @@ DEBUG = 0
decomp !zone { decomp !zone {
jsr .chkdst jsr .chkdst
ldy #0 ; In lit loop Y must be zero ldy #0 ; In lit loop Y must be zero
sec
.fill1A jsr .getbt2 .fill1A jsr .getbt2
jmp .fill1B bne .fill1B ; always taken
.incdst inc pDst+1 .incdst inc pDst+1
.chkdst ldx pDst+1 .chkdst ldx pDst+1
@ -174,19 +175,19 @@ decomp !zone {
bne .gshift ; always taken bne .gshift ; always taken
; Get another 8 bits into our bit buffer. Destroys X. Preserves A. Requires Y=0. ; Get another 8 bits into our bit buffer. Destroys X. Preserves A. Requires Y=0.
; Carry is always set on entry, Z always clear on exit
; Alternately, use .getbt2 to preserve X and destroy A ; Alternately, use .getbt2 to preserve X and destroy A
.getbts tax .getbts tax
.getbt2 lda (pSrc),y .getbt2 lda (pSrc),y
inc pSrc
beq .src3A
.src3B sec
rol rol
sta bits sta bits
txa txa
inc pSrc
beq .src3A
rts rts
.src3A inc pSrc+1 .src3A inc pSrc+1
bne .src3B ; always taken rts
} ; end of zone } ; end of zone

View File

@ -364,7 +364,7 @@ export asm memcpy(pSrc, pDst, len, auxWr)#0
inc pTmp+1 inc pTmp+1
bne .pglup ; always taken bne .pglup ; always taken
.part: .part:
cpx #0 txa
beq .done beq .done
- lda (tmp),y - lda (tmp),y
sta (pTmp),y sta (pTmp),y
@ -390,8 +390,8 @@ export asm memset(pDst, val, len)#0
lda evalStkL,x ; len lo lda evalStkL,x ; len lo
pha pha
lda evalStkH,x ; len hi lda evalStkH,x ; len hi
tax
beq + beq +
tax
lda tmp lda tmp
- sta (pTmp),y - sta (pTmp),y
iny iny
@ -420,10 +420,10 @@ export asm readAuxByte(ptr)#1
sta $10-1,y sta $10-1,y
dey dey
bne - bne -
jmp $10
.rdauxb
sei ; prevent interrupts while in aux mem sei ; prevent interrupts while in aux mem
sta setAuxRd sta setAuxRd
jmp $10
.rdauxb
lda (pTmp),y lda (pTmp),y
sta clrAuxRd sta clrAuxRd
cli cli
@ -462,19 +462,19 @@ end
export asm finishString(isPlural)#1 export asm finishString(isPlural)#1
!zone { !zone {
+asmPlasmRet 1 +asmPlasmRet 1
ldy prevCSWL+ABS_OFFSET ; put the cout vector back to default
sty cswl
ldy prevCSWL+1+ABS_OFFSET ; put the cout vector back to default
sty cswh
ldy #0 ; dest offset in Y (will be incremented before store)
cpy inbuf
beq .done1 ; failsafe: handle zero-length string
tax ; test for isPlural == 0 tax ; test for isPlural == 0
beq + beq +
lda #$40 ; for setting V later lda #$40 ; for setting V later
+ sta tmp ; save isPlural flag + sta tmp ; save isPlural flag
lda prevCSWL+ABS_OFFSET ; put the cout vector back to default
sta cswl
lda prevCSWL+1+ABS_OFFSET ; put the cout vector back to default
sta cswh
clv ; V flag for prev-is-alpha clv ; V flag for prev-is-alpha
ldy #0 ; dest offset in Y (will be incremented before store)
ldx #0 ; source offset in X (will be incremented before load) ldx #0 ; source offset in X (will be incremented before load)
cpx inbuf
beq .done ; failsafe: handle zero-length string
.fetch .fetch
inx inx
lda inbuf,x ; get next input char lda inbuf,x ; get next input char
@ -488,11 +488,11 @@ export asm finishString(isPlural)#1
dey ; undo copy of the paren dey ; undo copy of the paren
stx tmp+1 ; save position in input stx tmp+1 ; save position in input
dex ; needed for failsafe operation
bit tmp ; set copy flag (V) initially to same as isPlural flag bit tmp ; set copy flag (V) initially to same as isPlural flag
.findsl ; see if there's a slash within the parens .findsl ; see if there's a slash within the parens
inx inx
cpx inbuf cpx inbuf
bcs .done ; failsafe: handle missing end-paren
lda inbuf,x lda inbuf,x
ora #$80 ; normalize hi-bit for comparisons below ora #$80 ; normalize hi-bit for comparisons below
cmp #"/" cmp #"/"
@ -503,11 +503,8 @@ export asm finishString(isPlural)#1
pha pha
plp plp
+ cmp #")" ; scan until ending paren + cmp #")" ; scan until ending paren
beq + bne .findsl ; loop to scan next char
cpx inbuf ldx tmp+1 ; get back to start of parens
bcc .findsl ; loop to scan next char
bcs .done ; failsafe: handle missing end-paren (always taken)
+ ldx tmp+1 ; get back to start of parens
; copy mode flag is now in V: if slash present, single=copy, plural=nocopy ; copy mode flag is now in V: if slash present, single=copy, plural=nocopy
; if no slash: single=nocopy, plural=copy ; if no slash: single=nocopy, plural=copy
.plup .plup
@ -541,6 +538,7 @@ export asm finishString(isPlural)#1
.done .done
sty inbuf ; save new length sty inbuf ; save new length
.done1
lda #<inbuf ; return pointer to string lda #<inbuf ; return pointer to string
ldy #>inbuf ldy #>inbuf
rts rts
@ -575,8 +573,8 @@ export asm blit(isAux, srcData, dstScreenPtr, nLines, lineSize)#0
lsr ; to carry bit lsr ; to carry bit
bcc + bcc +
ldy #15 ; put aux copy routine in zero page ldy #15 ; put aux copy routine in zero page
- lda .cpaux + ABS_OFFSET,y - ldx .cpaux + ABS_OFFSET,y
sta $10,y stx $10,y
dey dey
bpl - bpl -
+ pla ; get line count + pla ; get line count
@ -694,8 +692,9 @@ export asm puts(str)#0
sta pTmp sta pTmp
lda #'!' lda #'!'
ldx #1 ldx #1
sty pTmp+1 tya
beq + ; safety: print '!' instead of null string beq + ; safety: print '!' instead of null string
sty pTmp+1
ldy #0 ldy #0
lda (pTmp),y lda (pTmp),y
tax tax
@ -913,9 +912,8 @@ export asm rawDisplayStr(pStr)#0
lda (pTmp),y lda (pTmp),y
sta tmp sta tmp
- cpy tmp - cpy tmp
bcc + bcs ++
rts iny
+ iny
lda (pTmp),y lda (pTmp),y
ora #$80 ora #$80
cmp #"^" cmp #"^"
@ -929,7 +927,8 @@ export asm rawDisplayStr(pStr)#0
+ sty tmp+1 + sty tmp+1
jsr DisplayChar jsr DisplayChar
ldy tmp+1 ldy tmp+1
bne - bne - ; always taken
++rts
end end
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
@ -991,8 +990,8 @@ export asm streqi(a, b)#1
lda evalStkL+1,x lda evalStkL+1,x
sta pTmp sta pTmp
lda evalStkH+1,x lda evalStkH+1,x
sta pTmp+1
beq .null beq .null
sta pTmp+1
ldy #0 ldy #0
lda (tmp),y lda (tmp),y
cmp (pTmp),y cmp (pTmp),y
@ -1004,21 +1003,16 @@ export asm streqi(a, b)#1
+ tax ; count up to (verified same) length of the strings + tax ; count up to (verified same) length of the strings
- iny - iny
lda (tmp),y lda (tmp),y
cmp #('z'&$7F)+1 ; convert to upper case eor (pTmp),y
bcs + beq + ; matched
cmp #$20 ; check for case bit
bne .noteqi ; abort on alpha inequality
ora (tmp),y ; convert to lower case
cmp #('z'&$7F)+1
bcs .noteqi ; abort on inequality
cmp #'a'&$7F cmp #'a'&$7F
bcc + bcc .noteqi ; abort on inequality
sbc #$20 + dex
+ sta ysav
lda (pTmp),y
cmp #('z'&$7F)+1 ; convert to upper case
bcs +
cmp #'a'&$7F
bcc +
sbc #$20
+ cmp ysav
bne .noteqi ; abort on inequality
dex
bne - bne -
lda #1 lda #1
ldy #0 ; okay, they're equal. Return 1 (not just any char; so that PLASMA when...is can work) ldy #0 ; okay, they're equal. Return 1 (not just any char; so that PLASMA when...is can work)