John M. Strawn, Ph.D.
NeXT Signal Processing Assembly Language Source Code
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 |