Blame as10k1/README

Packit Service b98cfc
Packit Service b98cfc
AS10k1 Assembler version A0.99
Packit Service b98cfc
------------------------------
Packit Service b98cfc
Packit Service b98cfc
This is an assembler for the emu10k1 DSP chip present in the creative SB
Packit Service b98cfc
live, PCI 512, and emu APS sound cards. It is used to make audio effects such 
Packit Service b98cfc
as a flanger, chorus or reverb.
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Author: Daniel Bertrand <d.bertrand@ieee.ca>
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
This version of the assembler was modified for the ALSA driver by
Packit Service b98cfc
Jaroslav Kysela <perex@perex.cz>.
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Usage: as10k1 <asm file> [bin output file] 
Packit Service b98cfc
------
Packit Service b98cfc
Packit Service b98cfc
Making binary DSP programs:
Packit Service b98cfc
Packit Service b98cfc
example, type:
Packit Service b98cfc
Packit Service b98cfc
./as10k1 chorus.asm
Packit Service b98cfc
Packit Service b98cfc
(it creates chorus.bin)
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
Loading Binary DSP files
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
<..TODO..>
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Description of files included
Packit Service b98cfc
------------------------------
Packit Service b98cfc
Packit Service b98cfc
Chorus.asm	-- chorus effect
Packit Service b98cfc
Flanger.asm	-- flanger effect
Packit Service b98cfc
Delay.asm	-- generates Echos, this is _not_ a reverb
Packit Service b98cfc
eq5.asm		-- A 5 band Equalizer (needs a bit more work)
Packit Service b98cfc
fir.asm		-- A low pass filter (A demo of a fir filter implementation)
Packit Service b98cfc
sine.asm	-- A sinewave generator (can be useful for debuging)
Packit Service b98cfc
vibrato.asm	-- A vibrato effect (or is it a tremolo?)
Packit Service b98cfc
vol_ctrl.asm	-- provides support for the hardware volume control
Packit Service b98cfc
emu_constants.asm -- not an effect, just contains handy constants and macros
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
===============================================================================
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Programming Usage:
Packit Service b98cfc
=================
Packit Service b98cfc
Packit Service b98cfc
Assembly Syntax
Packit Service b98cfc
---------------
Packit Service b98cfc
Packit Service b98cfc
Assembly lines generally have four fields seperated by spaces or tabs:
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Name_Field   Opcode_field    Operand_Field   Comment_Field
Packit Service b98cfc
----------   ------------    -------------   -------------
Packit Service b98cfc
[symbol]      [mnemonic]      [operands]       [text]
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
With this assembler, each line can have a maximum of 256 characters and each
Packit Service b98cfc
symbol can be a maximum of 32 characters. Symbols ARE case sensitive, opcodes
Packit Service b98cfc
ARE NOT.
Packit Service b98cfc
Packit Service b98cfc
OPCODES
Packit Service b98cfc
--------
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
All instructions require 4 operands, they have the format
Packit Service b98cfc
Packit Service b98cfc
	<opcode> R,A,X,Y
Packit Service b98cfc
	
Packit Service b98cfc
(note some documentation out there the call the R operand as Z and the A
Packit Service b98cfc
operand as W).
Packit Service b98cfc
Packit Service b98cfc
Here are 16 opcodes.
Packit Service b98cfc
Packit Service b98cfc
   0x0 (MACS) : R = A + (X * Y >> 31)   ; saturation
Packit Service b98cfc
   0x1 (MACS1) : R = A + (-X * Y >> 31)  ; saturation
Packit Service b98cfc
   0x2 (MACW) : R = A + (X * Y >> 31)   ; wraparound
Packit Service b98cfc
   0x3 (MACW1) : R = A + (-X * Y >> 31)  ; wraparound
Packit Service b98cfc
   0x4 (MACINTS) : R = A + X * Y  ; saturation
Packit Service b98cfc
   0x5 (MACINTW) : R = A + X * Y  ; wraparound (31-bit)
Packit Service b98cfc
   0x6 (ACC3) : R = A + X + Y  ; saturation
Packit Service b98cfc
   0x7 (MACMV) : R = A, acc += X * Y >> 31
Packit Service b98cfc
   0x8 (ANDXOR) : R = (A & X) ^ Y
Packit Service b98cfc
   0x9 (TSTNEG) : R = (A >= Y) ? X : ~X
Packit Service b98cfc
   0xa (LIMIT) : R = (A >= Y) ? X : Y
Packit Service b98cfc
   0xb (LIMIT1): R = (A < Y) ? X : Y
Packit Service b98cfc
   0xc (LOG) : ...
Packit Service b98cfc
   0xd (EXP) : ...
Packit Service b98cfc
   0xe (INTERP) : R = A + (X * (Y - A) >> 31)  ; saturation
Packit Service b98cfc
   0xf (SKIP) : R,CCR,CC_TEST,COUNT  
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Special note on the accumulator: 
Packit Service b98cfc
mac* instruction with ACCUM as A operand     => uses Most significant 32 bits.
Packit Service b98cfc
macint* instruction with ACCUM as A operand  => uses Least significant 32 bits.
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
For more details on the emu10k1 see the dsp.txt file distributed with the
Packit Service b98cfc
linux driver.
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Operands
Packit Service b98cfc
--------
Packit Service b98cfc
Packit Service b98cfc
Operands can be specified as either a symbol or a value. hex values are
Packit Service b98cfc
prefixed by $, octal by @, and binary by %.
Packit Service b98cfc
Packit Service b98cfc
e.g.:
Packit Service b98cfc
Packit Service b98cfc
123 decimal value
Packit Service b98cfc
$123 hex value
Packit Service b98cfc
@123 octal value
Packit Service b98cfc
%01101 binary value
Packit Service b98cfc
Packit Service b98cfc
The operands for emu10k1 instructions are always addresses of registers, there
Packit Service b98cfc
are no instruction which take immediate values.
Packit Service b98cfc
Packit Service b98cfc
Operands currently support basic arithmetic, It does not support bedmas (or is it bodmas)
Packit Service b98cfc
so don't try to use (). Infact don't put spaces either (for now, until I fix this).
Packit Service b98cfc
Packit Service b98cfc
Summary of assembler directives
Packit Service b98cfc
-------------------------------
Packit Service b98cfc
Packit Service b98cfc
	  NAME "string"			;give a name to the patch
Packit Service b98cfc
Packit Service b98cfc
<symbol>  IO				;defines an Input/output pair	
Packit Service b98cfc
<symbol>  CONTROL <symbol>		;defines a controlable GPR	
Packit Service b98cfc
<symbol>  DYNamic <number of storage spaces>	;defines a temporary GPR
Packit Service b98cfc
<symbol>  STAtic <initial value>		;defines a constant GPR /w initial value
Packit Service b98cfc
<symbol>  EQU <Value equated>		;assembly time constant
Packit Service b98cfc
<symbol>  CONstant <value>		;defines a read-only GPR	
Packit Service b98cfc
Packit Service b98cfc
<symbol>  DELAY  <value>		;defines a Delay line
Packit Service b98cfc
<symbol>  TABLE  <value>		;defines a lookup table
Packit Service b98cfc
Packit Service b98cfc
<symbol>  TREAD  <tram id>,<value>	;defines a tram read 
Packit Service b98cfc
<symbol>  TWRITE <tram id>,<value>	;defines a tram write
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
	  INCLUDE <"file name">		;includes an external file
Packit Service b98cfc
Packit Service b98cfc
	  FOR <variable>=<start>:<finish> ;Assembly-time 'for' statement
Packit Service b98cfc
	  ENDFOR			;ends a for loop
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
<symbol>  MACRO	arg1,arg2,arg3....	;used for define a macro
Packit Service b98cfc
	  ENDM				;end a macro definition
Packit Service b98cfc
Packit Service b98cfc
	  END				;ends the code
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Detailed description of directives:
Packit Service b98cfc
----------------------------------
Packit Service b98cfc
Packit Service b98cfc
( <> brackets indicate required fields, [] brackets indicate optional fields)
Packit Service b98cfc
Packit Service b98cfc
DYNamic  directive (replaces DS):
Packit Service b98cfc
Packit Service b98cfc
Defines a storage space from the gpr pool on the emu10k1. The
Packit Service b98cfc
assembler maintains a pointer to the gpr registers (starting at $100). The
Packit Service b98cfc
symbol is assigned the value of the address of the gpr pointer. The pointer is
Packit Service b98cfc
increment by the number following the dynamic directive.
Packit Service b98cfc
Packit Service b98cfc
syntax:
Packit Service b98cfc
<symbol> dynamic 
Packit Service b98cfc
Packit Service b98cfc
or
Packit Service b98cfc
Packit Service b98cfc
<symbol> dyn <number of storage spaces>
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
STAtic directive (replaces DC):
Packit Service b98cfc
Packit Service b98cfc
Similar to dynamic, but places an initial value in the memory location.
Packit Service b98cfc
Packit Service b98cfc
The values specified are slightly different from operands for instructions. 
Packit Service b98cfc
The values are 32 bit signed intergers so that a maximum magnitude of 2^31 can
Packit Service b98cfc
be stored. values can be in signed decimal, unsigned octal, binary and hex, 
Packit Service b98cfc
and in fractional decimal (values between -1 to 1) for filter coefficients.
Packit Service b98cfc
Packit Service b98cfc
A fractional decimal is specified using the '#' prefix and can include an 
Packit Service b98cfc
exponent. These values should be used with the fractional "mac" instructions.
Packit Service b98cfc
Packit Service b98cfc
NEW! fractional numbers are now handle automatically, a value between 1 and 
Packit Service b98cfc
-1 will be converted into fractional form. The old # form still works though.
Packit Service b98cfc
(BUG:confusion occurs at 1 and -1 however, should 1 be represented as $1
Packit Service b98cfc
 or $7ffffff?, currently defaults to $1, so #1 still has some importance)
Packit Service b98cfc
Packit Service b98cfc
examples:
Packit Service b98cfc
	.03412
Packit Service b98cfc
	123E-3
Packit Service b98cfc
	#-0.1236
Packit Service b98cfc
Packit Service b98cfc
syntax:
Packit Service b98cfc
Packit Service b98cfc
<symbol> static <initial value>
Packit Service b98cfc
Packit Service b98cfc
or
Packit Service b98cfc
Packit Service b98cfc
<symbol> sta <initial value>
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
CONTROL
Packit Service b98cfc
Packit Service b98cfc
Control registers are similar to DC, but they also include a min and max value. The control register is used
Packit Service b98cfc
by a mixer app to change values in a GPR (a volume control, for example). 
Packit Service b98cfc
Packit Service b98cfc
syntax:
Packit Service b98cfc
Packit Service b98cfc
<symbol> CONTROL <initial value>,<min>,<max>
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
IO
Packit Service b98cfc
Packit Service b98cfc
Defines an input and an output register.
Packit Service b98cfc
Packit Service b98cfc
<symbol> IO
Packit Service b98cfc
Packit Service b98cfc
It defines two register, but they both use the symbol. The assembler handles it automagically
Packit Service b98cfc
depending on whether you're performing a read (X, Y or Z operand) or a write (R operand) to the GPR.
Packit Service b98cfc
Packit Service b98cfc
-
Packit Service b98cfc
If you insist on having two different symbols for read/write (for readability or whatever), use an EQU, 
Packit Service b98cfc
Packit Service b98cfc
i.e.:
Packit Service b98cfc
Packit Service b98cfc
IN   IO
Packit Service b98cfc
OUT  EQU  IN
Packit Service b98cfc
Packit Service b98cfc
-
Packit Service b98cfc
To force a read from the output (for whatever reason) use <symbol>.o (i.e. OUT.o)
Packit Service b98cfc
Packit Service b98cfc
Writing to an input is not allowed.
Packit Service b98cfc
--
Packit Service b98cfc
CONSTANT
Packit Service b98cfc
Packit Service b98cfc
defines a read-only constant GPR
Packit Service b98cfc
Packit Service b98cfc
When the assembler encounters a CONSTANT define, it'll try three things. First 
Packit Service b98cfc
it'll check to see if the defined constant is a hardware constant, if so 
Packit Service b98cfc
substitutes that instead. Next the assembler check to see if another constant 
Packit Service b98cfc
has alrady been declared with the same value, if so it'll substitute it. Else
Packit Service b98cfc
it'll declare a new GPR for holding the value of the constant.  
Packit Service b98cfc
Packit Service b98cfc
syntax:
Packit Service b98cfc
Packit Service b98cfc
<symbol> constant  <value>
Packit Service b98cfc
Packit Service b98cfc
or
Packit Service b98cfc
Packit Service b98cfc
<symbol> con  <value>
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
Packit Service b98cfc
DELAY LINES
Packit Service b98cfc
Packit Service b98cfc
Delay lines are defined via three directives:
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
DELAY Directive	
Packit Service b98cfc
Packit Service b98cfc
Define Delay, used for allocating an amount of TRAM for a delay line.
Packit Service b98cfc
Packit Service b98cfc
<symbol>  DELAY  <value>
Packit Service b98cfc
Packit Service b98cfc
The symbol is used to identify this delay line.The value is the amount of TRAM 
Packit Service b98cfc
allocated, it may be specified as a decimal,hex, octal, binary or time value. 
Packit Service b98cfc
Packit Service b98cfc
The time value is prefixed with '&' and represents seconds of time.
Packit Service b98cfc
Packit Service b98cfc
e.g.
Packit Service b98cfc
Packit Service b98cfc
foo DELAY &100e-3  ;;a 100msec delay line
Packit Service b98cfc
bar DELAY 1000	;;a 1000 sample delay line
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
TABLE directive
Packit Service b98cfc
Packit Service b98cfc
Define lookup Table
Packit Service b98cfc
Packit Service b98cfc
same as DELAY but for lookup tables. 
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
TREAD Directive
Packit Service b98cfc
Packit Service b98cfc
Define read: used for defining a TRAM read point
Packit Service b98cfc
Packit Service b98cfc
<symbol1>  TREAD <symbol2>,<value>
Packit Service b98cfc
Packit Service b98cfc
The value represents the read point within the delay line. symbol2 defines 
Packit Service b98cfc
which delay line this read belongs to.
Packit Service b98cfc
Packit Service b98cfc
Symbol1 is a pointer to TRAM data register associated with this TRAM read 
Packit Service b98cfc
operation. The assembler will create <symbol1>.a which points to the TRAM
Packit Service b98cfc
address register.
Packit Service b98cfc
Packit Service b98cfc
example:
Packit Service b98cfc
Packit Service b98cfc
fooread TREAD 100e-3,foo
Packit Service b98cfc
	macs  fooread.a,one,two,three   ; writes a new tram read address 
Packit Service b98cfc
	macs  temp,fooread,one,two	; reads the data from the delay line 
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
WRITE Direcive
Packit Service b98cfc
Packit Service b98cfc
Define write: same as TREAD but used for writing data to a delay line.
Packit Service b98cfc
<symbol1>  TWRITE <symbol2>,<value>
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
EQU directive:
Packit Service b98cfc
Packit Service b98cfc
Equates a symbol to a be constant which is substituted at assembly time:
Packit Service b98cfc
Packit Service b98cfc
syntax:
Packit Service b98cfc
Packit Service b98cfc
<symbol> EQU <Value equated>
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
END directive
Packit Service b98cfc
Packit Service b98cfc
The END directive should be placed at the end of the assembly source file. If
Packit Service b98cfc
the END directive is not found, a warning will be generated. All text located
Packit Service b98cfc
after the END directive is ignored.
Packit Service b98cfc
Packit Service b98cfc
Syntax:
Packit Service b98cfc
Packit Service b98cfc
[symbol]  END
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
INCLUDE Directive
Packit Service b98cfc
Packit Service b98cfc
The include directive is used to include external asm files into the current 
Packit Service b98cfc
asm file.
Packit Service b98cfc
Packit Service b98cfc
Syntax:
Packit Service b98cfc
Packit Service b98cfc
	INCLUDE <"file name">
Packit Service b98cfc
Packit Service b98cfc
The file name Must be enclosed in "" or '' .
Packit Service b98cfc
Packit Service b98cfc
examples:
Packit Service b98cfc
Packit Service b98cfc
	include 'qwerty.asm'
Packit Service b98cfc
	include "foobar.asm"
Packit Service b98cfc
	
Packit Service b98cfc
Packit Service b98cfc
--	
Packit Service b98cfc
Packit Service b98cfc
MACRO directive 
Packit Service b98cfc
Packit Service b98cfc
Used for defining a macro
Packit Service b98cfc
Packit Service b98cfc
Defining Macro:
Packit Service b98cfc
Packit Service b98cfc
<symbol> macro arg1,arg2,arg3....
Packit Service b98cfc
	....
Packit Service b98cfc
	<opcode>  arg4,arg1,arg2...  ;;for example
Packit Service b98cfc
	....	
Packit Service b98cfc
	....
Packit Service b98cfc
	endm
Packit Service b98cfc
Packit Service b98cfc
were the <symbol> used is the nmeumonic representing the macro. 
Packit Service b98cfc
Packit Service b98cfc
arg1,arg2,arg3... can be any symbols (auto-defining and local to a macro)
Packit Service b98cfc
as long as the symbol is not already in use outside the macro (i.e. as 
Packit Service b98cfc
a DC, DS, etc.).
Packit Service b98cfc
Packit Service b98cfc
There's no limit to how many arguments can be used.
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Using Macro:
Packit Service b98cfc
Packit Service b98cfc
	<macro nmeumonic> arg1,arg2,arg3....
Packit Service b98cfc
Packit Service b98cfc
where arg1,arg2,arg3,... are values or symbols.
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
Assembly-time For loop
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
usage:
Packit Service b98cfc
Packit Service b98cfc
	For <symbol>=<start>:<stop>
Packit Service b98cfc
		...
Packit Service b98cfc
		...
Packit Service b98cfc
		macs <symbol>,....
Packit Service b98cfc
		...
Packit Service b98cfc
	endfor
Packit Service b98cfc
	
Packit Service b98cfc
<start> and <stop> must be integers
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
--
Packit Service b98cfc
Handling Skips
Packit Service b98cfc
Packit Service b98cfc
the as10k1 assembler handles skips in a special way explained best by an example:
Packit Service b98cfc
Packit Service b98cfc
	skip CRR,CRR,CC_test,.foo
Packit Service b98cfc
	...
Packit Service b98cfc
	...
Packit Service b98cfc
	...
Packit Service b98cfc
.foo	...
Packit Service b98cfc
Packit Service b98cfc
the "." tell the assembler that the symbol is for skipping purposes, it will
Packit Service b98cfc
automatically define a GPR when parsing the skip instruction, and when the second
Packit Service b98cfc
.foo is encountered it will insert the number of instructions to skip. (the skip
Packit Service b98cfc
instruction needs a GPR by design, so don't blame me for the half-assness of it). 
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Features NOT YET Supported
Packit Service b98cfc
==========================
Packit Service b98cfc
Packit Service b98cfc
any ideas?
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc