John M. Strawn, Ph.D.

NeXT Signal Processing Assembly Language Source Code

John Strawn, Ph.D., Expert Witness

This is part of the online resume of Dr. John Strawn, Ph.D. who offers patent and copyright expert witness services and consulting services primarily related to software, signal processing, digital media, and music. Dr. Strawn’s expert witness work draws on his extensive experience in programming, including the experience detailed here.

NeXT was a computer developed by Steve Jobs and publicly released by him in Davies concert hall in San Francisco on October 12, 1988. Personal computers to date featured a hardware architecture with a main processor; to add significant audio or video required installing a separate add in card such as Creative SoundBlaster. The NeXT significantly included a second processor on the motherboard, a signal processing chip from Motorola known as the DSP 56001. My Stanford classmate Julius Smith was hired by NeXT to, among other things, program that chip. Julius developed the software architecture and hired me as a consultant. It was top secret that the NeXT Machine would contain a signal processing chip, and I maintained that confidential information working remotely.

The software architecture (documentation; archived at SourceForge) included high-level language programming which could take advantage of the signal processing chip. In particular, vector and matrix operations were optimized, for example, adding two vectors. The high-level language source code could invoke hand-packed routines on the signal processing chip which were tightly optimized to. I am a specialist at such optimization as part of my DSP consulting work.

The family of 50+ routines that I wrote were in part also documented to serve as a teaching collection of optimization techniques. Click on the links in the table below to view text files containing source code and documentation.

File Name Description Documentation
CVADD.ASM form a complex vector from the elementwise sum of two complex vectors
CVCOMB.ASM form complex vector by combining two real ones
CVCON.ASM form a complex vector from the elementwise conjugate a complex vector
CVFILL.ASM fill complex vector with a constant complex value
CVFILLI.ASM fill complex vector with immediate constant complex value
CVMOV.ASM copy complex vector from one location to another
CVNEG.ASM negate each element of a complex vector
CVREAL.ASM form complex vector from a real vector and 0 imaginary part
CVSUB.ASM subtract the second complex vector from the first to yield a third
FFTR2A.ASM radix 2 FFT
LVEQ.ASM create vector with TRUE/FALSE comparison of two input vectors
MAXMGV.ASM write maximum of absolute value of vector elements to a scalar MAXMGV.txt
MAXV.ASM write maximum of vector elements to a scalar
MINMGV.ASM write minimum of absolute value of vector elements to a scalar
MINV.ASM write minimum of vector elements to a scalar
MMUL.ASM matrix multiply
QC.ASM copy a datum into alu A register and into a standard memory location
SVE.ASM sum vector to a scalar
SVEMG.ASM sum vector element magnitudes to a scalar
SVENOLIM.ASM sum vector to a scalar, but bypass 56000 ALU limiting
SVESQ.ASM sum squares of vector elements to a scalar
SVEUBAR.ASM sum vector to a scalar
SVS.ASM sum signed squares of vector elements to a scalar SVS.txt
VAAM.ASM add two vectors pointwise, multiply by pointwise sum of two vectors VAAM.txt
VABS.ASM take the absolute value of the elements of a vector
VADD.ASM add two vectors, creating a third
VADDNOLI.ASM add two vectors, creating a third, suppressing 56000 limiting on output
VAND.ASM and two vectors, creating a third VAND.txt
VASR.ASM shift right (sign extended) each element of vector
VEQV.ASM not xor two vectors, creating a third
VIMAG.ASM form a real vector from the imaginary part of a complex vector
VLSR.ASM shift right (sign ignored) each element of vector VLSR.txt
VMA.ASM pointwise multiplication of two vectors, add another vector
VMAX.ASM max two vectors, creating a third VMAX.txt
VMIN.ASM min two vectors, creating a third
VMMA.ASM pointwise multiplication of two vectors, add pointwise multiply of two vectors VMMA.txt
VMMSB.ASM pointwise multiplication of two vectors, subtract pointwise multiply of two vector VMMSB.txt
VMSA.ASM pointwise multiplication of two vectors plus scalar add VMSA.txt
VMSB.ASM pointwise multiplication of two vectors, subtract another vector
VMUL.ASM pointwise multiplication of two vectors
VNEG.ASM fill vector with neg of vector
VOR.ASM or two vectors, creating a third
VRAMP.ASM fill a vector with a ramp function
VRAMPI.ASM fill a vector with a ramp
VREAL.ASM form a real vector from the real part of a complex vector
VRVRS.ASM reverse the elements of the vector
VSADD.ASM add scalar to elements of a vector VSADD.txt
VSADDI.ASM add immediate scalar to elements of a vector
VSBM.ASM pointwise difference of two vectors, multiply by another vector VSBM.txt
VSBSBM.ASM subtract two vectors pointwise, multiply by pointwise difference of two vectors VSBSBM.txt
VSMA.ASM vector scalar multiply/add VSMA.txt
VSMSB.ASM multiply vector times scalar, subtract another vector VSMSB.txt
VSMUL.ASM multiply elements of a vector by a scalar
VSMULI.ASM multiply elements of a vector by an immediate scalar
VSQ.ASM square the elements of a vector
VSSQ.ASM multiply each element of a vector by the absolute value of that element VSSQ.txt
VSUB.ASM subtract two vectors, creating a third
VSWAP.ASM swap elements of two vectors