You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

85 lines
2.0 KiB

// Copyright 2020 Justine Alexandra Roberts Tunney
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#define ULAW_BIAS $0x84
// func L16MixSat160(dst, src *int16)
// Explanation: http://i.imgur.com/nejgQ41.jpg
TEXT ·L16MixSat160(SB),4,$0-16
MOVQ dst+0(FP), AX
MOVQ src+8(FP), BX
MOVQ $19, CX
moar: MOVO 0(BX), X0
PADDSW 0(AX), X0
MOVO X0, 0(AX)
ADDQ $16, AX
ADDQ $16, BX
DECQ CX
CMPQ CX, $0
JGE moar
RET
// func LinearToUlaw(linear int64) (ulaw int64)
TEXT ·LinearToUlaw(SB),4,$0-16
MOVQ linear+0(FP), AX
CMPQ AX, $0 // if rax < 0: (Jump if Signed)
JS ifNeg // goto ifNeg
ifPos: ADDQ ULAW_BIAS, AX
MOVQ $0xFF, R13 // mask bits we'll apply later
JMP endIf
ifNeg: MOVQ ULAW_BIAS, BX // rax = ULAW_BIAS - rax
SUBQ AX, BX
MOVQ BX, AX
MOVQ $0x7F, R13 // mask bits we'll apply later
endIf: MOVQ AX, DX
ORQ $0xFF, DX
BSRQ DX, BX // get position of highest bit
SUBQ $7, BX
CMPQ BX, $8 // if rcx >= 8:
JGE loud // goto loud
MOVQ BX, CX
ADDQ $3, CX
SARQ CX, AX
ANDQ $0xF, AX
SHLQ $4, BX
ORQ BX, AX
XORQ R13, AX
MOVQ AX, ulaw+8(FP)
RET
loud: XORQ $0x7F, R13
MOVQ R13, ulaw+8(FP)
RET
// func UlawToLinear(ulaw int64) (linear int64)
TEXT ·UlawToLinear(SB),4,$0-16
MOVQ ulaw+0(FP), AX
NOTQ AX
MOVQ AX, CX
MOVQ AX, DX
ANDQ $0x0F, AX
SHLQ $3, AX
ADDQ $0x84, AX
ANDQ $0x70, CX
SARQ $4, CX
SHLQ CX, AX
ANDQ $0x80, DX
CMPQ DX, $0
JE death
MOVQ $0x84, BX
SUBQ AX, BX
MOVQ BX, linear+8(FP)
RET
death: SUBQ $0x84, AX
MOVQ AX, linear+8(FP)
RET