home *** CD-ROM | disk | FTP | other *** search
-
- *DIF - DIGITAL FILTER GENERATOR
- * THE AC, P, T, AND AR1 WILL BE USED (MAYBE XR0 TOO)
- *
- * DIF X,S,Y,G,RS,(A-LIST),(B-LIST)
- *
- * X IS OPTIONAL INPUT VARIABLE (IF OMITTED AC ASSUMED)
- * Y IS OPTIONAL OUTPUT VARIABLE (IF OMITTED AC IS ASSUMED)
- * S IS STATE VECTOR (SHOULD HAVE ONE WORD PER A/B-LIST ENTRY)
- * G IS THE GAIN (X*G IS INPUT) -13 BIT (+4095 TO -4096)
- * RS IS THE VALUE USED TO SCALE S0 BEFORE OUTPUT (Y) CALCULATION
- * THE VALUE IS IN RIGHT SHIFTS (0 TO 16)
- * PR IS PRECISION OF THE RESULT (0 TO 16, 15, AND 12 ARE THE
- * SIGNIFICANT VALUES WHEN USED WITH RS=12 OR 15)
- * A-LIST IS A LIST OF 13 BIT CONSTANTS, AN, ... ,A1 (REVERSE):
- * S0 := (X*G+A1*S1+A2*S2+ ... +AN*SN)/2**RS
- * B-LIST IS A LIST OF 13 BIT CONSTANTS, BN, ... ,B0 (REVERSE):
- * Y := B0*S0+B1*S1+B2*S2+ ... +BN*SN
- * EACH SM -> SM+1 AS ACCESSED ABOVE
- *
- * IF A-LIST IS BLANK, ONLY THE B-SIDE (POLES) ARE GENERATED
- * Y := X*G+B1*S1+B2*S2+ ... +BN*SN (B0 IS OMITTED)
- * S0 := X (OLD S0-SN-1 TO S1 TO SN)
- * IF B-LIST IS BLANK, ONLY THE A-SIDE (ZEROS) ARE GENERATED
- * S0 := (X*G+A1*S1+A2*S2+ ... +AN*SN)/2**RS
- *
- * AR1 AND AR0 (IF A-LIST EMPTY ONLY) ARE DESTROYED.
-
- COPY MACROS.RLSH
-
- $1DIF $MACRO V,P
- LT:P: *- LOAD THE STATE VAR
- MPYK :V: TIMES THE COEFF
- $END
-
- $2DIF $MACRO P,AA,B
- $1DIF :AA:,:P:
- $IF B.L#=0
- $2DIF :P:,:B:
- $ENDIF
- $END
-
- *
- *THIS MACRO, DDIF, CAN DO A DOT PRODUCT BETWEEN A VECTOR IN
- * DATA RAM AND CONSTANTS IN PROGRAM ROM. FORM:
- * DIF <FIRST LT POSTFIX>,<LT POSTFIX>,<RAM VECTOR>,<COEFFICIENT LIST>
- * <LT POSTFIX> IS D OR A FOR LOAD T (WITH VECTOR ELEMENTS) USING
- * LTA - ELEMENTS WILL NOT BE MOVED AS A SIDE EFFECT
- * LTD - ELEMENTS WILL BE MOVED, S0/SN MOVED TO S1/SN+1
- * <FIRST LT POSTFIX> IS LIKE <LT POSTFIX>, BUT USED ON FIRST LT
- * ONLY. SOMETIMES MAKES SENSE TO MAKE IT BLANK (AS WELL AS A OR D)
- * <RAM VECTOR> IS THE ADDRESS OF THE LAST ELEMENT IN THE VECTOR
- * (USE AR1 AND *- TO ACCESS ELEMENTS)
- * <COEFFICIENT LIST> IS AN, ... , A0, WHERE EACH IS A 13 BIT CONSTANT
- * (FROM +4095 TO -4096) - THESE ARE IN REVERSE ORDER!!!
- *
- * THE FOLLOWING IS FORMED (IN THE AC):
- * P+AC+S0*A0+S1*A1+ ... +SN*AN->AC
- * OR
- * AC+S0*A0+S1*A1+ ... +SN*AN->AC
- *
- * P AND AC MUST BE PRE-INITIALIZED
-
- DDIF $MACRO P0,P,S,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
- LARK AR1,:S: LOAD AR1 WITH :S:
- LARP AR1 SELECT AR1
- $IF A0.L#=0
- $1DIF :A0:,:P0:
- $ENDIF
- $IF A1.L#=0
- $1DIF :A1:,:P:
- $ENDIF
- $IF A2.L#=0
- $1DIF :A2:,:P:
- $ENDIF
- $IF A3.L#=0
- $1DIF :A3:,:P:
- $ENDIF
- $IF A4.L#=0
- $1DIF :A4:,:P:
- $ENDIF
- $IF A5.L#=0
- $1DIF :A5:,:P:
- $ENDIF
- $IF A6.L#=0
- $1DIF :A6:,:P:
- $ENDIF
- $IF A7.L#=0
- $1DIF :A7:,:P:
- $ENDIF
- $IF A8.L#=0
- $1DIF :A8:,:P:
- $ENDIF
- $IF A9.L#=0
- $2DIF :P:,:A9:
- $ENDIF
- APAC FLUSH TO THE AC
- $END
-
- DIF $MACRO X,S,Y,G,RS,PR,A,B
- $IF G.L=0
- $ASG 1 TO G.V
- $ENDIF
- $IF G.V=1
- $IF X.L#=0
- LAC :X:,0 LOAD INPUT TO AC
- $IF A.L=0
- LAR AR0,:X: LOAD INPUT INTO AR0
- $ENDIF
- $ELSE
- $IF A.L=0
- SACL XR0,0 STORE AC IN TEMP
- LAR AR0,XR0 LOAD INPUT INTO AR0
- $ENDIF
- MPYK 0 INIT P
- $ELSE
- $IF X.L=0
- SACL XR0,0 SAVE IN TEMP
- $ASG 'XR0' TO X.S
- $ENDIF
- $IF A.L=0
- LAR AR0,XR0 LOAD INPUT INTO AR0
- $ENDIF
- ZAC INIT AC
- LT :X: LOAD TEMP
- MPYK :G: TIMES GAIN
- $ENDIF
- $IF A.L#=0
- DDIF D,D,:S:+:A.V:-1,:A:
- $IF RS.L=0 NO SHIFT
- SACL :S:,0 SAVE :S:
- $ELSE
- $IF RS.V=16 SHIFT IS 16
- SACH :S:,0 SAVE :S:
- $ELSE
- $IF RS.V=0 NO SHIFT
- SACL :S:,0 SAVE :S:
- $ELSE
- $IF (RS.V=15)&(PR.V<=15) SHIFT 15
- SACH :S:,0 SAVE WITH 15 BIT SHIFT
- $ELSE
- $IF (RS.V=12)&(PR.V<=12) SHIFT 12
- SACH :S:,4 SAVE WITH 12 BIT SHIFT
- $ELSE
- SACX XR0,0 SAVE WHOLE DOUBLE WORD
- RLSH XR1,:S:,:RS:
- LAC XR0,16-:RS:
- OR :S:
- SACL :S:,0 SAVE :S:
- $ENDIF
- $ENDIF
- $ENDIF
- $ENDIF
- $ENDIF
- $IF B.L#=0
- ZAC INIT AC TO ZERO
- DDIF ,A,:S:+:B.V:-1,:B:
- $ENDIF
- $ELSE
- DDIF A,D,:S:+:B.V:-1,:B:
- SAR AR0,:S:
- $ENDIF
- $IF Y.L#=0
- SACL :Y:,0 STORE OUTPUT
- $ENDIF
- $END