指令功能与程序设计实验
实验目的
1、 熟悉开发软件的使用,了解程序的完整的调试过程;
2、 掌握DSP汇编语言编程及调试方法。
实验要求
按照下面的实验内容建立新工程,调试程序,并验证结果。
一、定点除法
在通用DSP芯片中,一般不提供单周期的除法指令,为此必须采用除法子程序来实现。二进制除法是乘法的逆运算。乘法包括一系列的移位和加法,而除法可分解为一系列的减法和移位。下面来说明除法的实现过程。
设累加器为8位,且除法运算为10除以3。除的过程就是除数逐步移位并与被除数比较的过程,如果能减则将位插入商中。
(1) 除数的最低有效位对齐被除数的最高有效位。
00001010
- 00011000
11110010
(2) 由于减法结果为负,放弃减法结果,将被除数左移一位再减。
00010100
- 00011000
11111000
(3) 结果仍为负,放弃减法结果,被除数左移一位再减。
00101000
- 00011000
00010000
(4) 结果为正,将减法结果左移一位后加1,作最后一次减。
00100001
- 00011000
00001001
(5) 结果为正,将结果左移一位加1得最后结果。高4位代表余数,低4位表示商。
00010011
即商为0011=3,余数为0001=1。
TMS320没有专门的除法指令,但使用条件减指令SUBC可以完成有效灵活的除法功能。使用这一指令的唯一限制是两个操作数必须为正。程序员必须事先了解其可能的运算数的特性,如其商是否可以用小数表示及商的精度是否可被计算出来。这里每一种考虑可影响如何使用SUBC指令的问题。下面给出两种不同情况下的除法程序。
(1) 分子小于分母
;=================================================
分子小于分母除法
文件名DIV_A.ASM
;=================================================
title "DIV_A"
include "vectors.h"
def _c_int0
bss NUMERA,1
bss DENOM,1
bss TEMSGN,1
bss QUOT,1
_c_int0: LDP #6H
LT NUMERA
MPY DENOM
PAC
SACH TEMSGN ;取商的符号
LAC DENOM
ABS
SACL DENOM ;使分母为正
ZALH NUMERA ;使分子为正
ABS
RPTK 14
SUBC DENOM ;除循环15次
SACL QUOT
LAC TEMSGN
BGEZ DONE ;若符号为正,则完成
ZAC
SUB QUOT
SACL QUOT ;若为负,则商为负
DONE: B DONE
PHANTOM: RET
.end
这个程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN为暂存单元。
(2) 分子大于分母,规定商的精度
;===========================================
;文件名DIV_B.ASM
;===========================================
.title "DIV_B"
.include "vectors.h"
.def _c_int0
.bss NUMERA,1
.bss DENOM,1
.bss TEMSGN,1
.bss QUOT,1
.bss FRAC,1
FRAC .set 0ch ;规定商的精度
_c_int0:
LDP #6H
LT NUMERA
MPY DENOM
PAC
SACH TEMSGN ;取商的符号
LAC DENOM
ABS
SACL DENOM ;使分母为正
LACK 15
ADD FRAC
SACL FRAC ;计算循环计数器
LAC NUMERA
ABS ;使分子为正
RPT FRAC
SUBC DENOM ;除循环16+FRAC次
SACL QUOT
LAC TEMSGN
BGEZ DONE ;若符号为正,则完成
ZAC
SUB QUOT
SACL QUOT ;若为负,则商为负
DONE: B DONE
PHANTOM: RET
.end
与DIV_A相同,这个程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN为暂存单元。FRAC中规定商的精度,如商的精度为Q13,则调用程序前FRAC单元中的值应为13。
二、采用查表和线性插值法求正弦值
采用查表和线性插值法求正弦值。以下给出线性插值的图形和具体的算式。
图3-1 线性插值法
计算一个角度的正弦值
输入:0~360角度值(对应0H~FFFFH)存放在内部300H单元;输出:SIN(角度)*32767,格式Q15,存放在301H单元。
;========================================
; 文件名sine.asm
;========================================
.include "F2407REGS.H"
.mmregs
.def SIN
.def _ c_int0
.sect "vectors"
.bss angle,1
.bss RESULT,1
b _c_int0
;=========================================
;主程序
;========================================
.text
_c_int0:
.
.
LAR AR1,#60H
MAR *,AR1
LACC #4000H ;π/2
SACL *+
CALL SIN
b $
;===================================================
;SINE子程序
;输入:0~360角度值(对应0H~FFFFH)存放在内部300H单元
;输出:SIN(角度)*32767,格式Q15,存放在301H单元
;==================================================
SIN
LDP #6H
LT angle ;取变量 (x)
MAR *+
LACC #64H
SACL *
MPYU * ;
PAC
SACH *+
SACL *
LACC *,15
AND #0FFFFH,15
SACH *-
BCND equal_sin,eq
LACC #Table_sin ;表格的其始地址
ADD *-
TBLR *+ ;yi
ADD #1H
TBLR * ;装载yi+1的值
LACC *-
SUB *+ ;yi+1-yi
SACL *+
LT *-
MPY *
SPH *- ;在yi+1和yi之间插值
LACC *+
ADD *,1
LDP #6H
SACL RESULT ;存结果
RET
equal_sin
LACC #Table_sin ;表格的其始地址
ADD *- ;指向表格的索引的地址
TBLR *
LACC *+
LDP #6H
SACL RESULT ;存结果
end_interp_sin
RET
Table_sin .include "sine.tab"
Table_sin_end
.end
sine.tab
;====================================================
;Table_sin
;====================================================
.word 0
.word 2057
.word 4107
.word 6140
.word 8149
.word 10126
.word 12062
.word 13952
.word 15786
.word 17557
.word 19260
.word 20886
.word 22431
.word 23886
.word 25247
.word 26509
.word 27666
.word 28714
.word 29648
.word 30466
.word 31163
.word 31738
.word 32187
.word 32509
.word 32702
.word 32767
.word 32702
.word 32509
.word 32187
.word 31738
.word 31163
.word 30466
.word 29648
.word 28714
.word 27666
.word 26509
.word 25247
.word 23886
.word 22431
.word 20886
.word 19260
.word 17557
.word 15786
.word 13952
.word 12062
.word 10126
.word 8149
.word 6140
.word 4107
.word 2057
.word 0
.word -2057
.word -4107
.word -6140
.word -8149
.word -10126
.word -12062
.word -13952
.word -15786
.word -17557
.word -19260
.word -20886
.word -22431
.word -23886
.word -25247
.word -26509
.word -27666
.word -28714
.word -29648
.word -30466
.word -31163
.word -31738
.word -32187
.word -32509
.word -32702
.word -32767
.word -32702
.word -32509
.word -32187
.word -31738
.word -31163
.word -30466
.word -29648
.word -28714
.word -27666
.word -26509
.word -25247
.word -23886
.word -22431
.word -20886
.word -19260
.word -17557
.word -15786
.word -13952
.word -12062
.word -10126
.word -8149
.word -6140
.word -4107
. word -2057
三、 FIR滤波器的定点DSP实现
TMS320定点DSP芯片所提供的单周期乘/累加带数据移动指令和较大的片内RAM空间,使数字滤波器每个滤波样值的计算可以在一个周期内完成。TMS320LF2407内部具有三个片内的DARAM,分为B0、B1和B2三块。其中B0块(256字)可以用软件编程为数据区(CNFD)或程序区(CNFP),执行CNFP后,B0块映射到程序区的FF00H~FFFFH。采用高效的MACD指令,必须用片内RAM,其中B0块必须配置为程序区。
采用MACD指令结合RPTK指令就可以实现单周期的滤波样值计算:
RPTK N-1
MACD(程序地址),(数据地址)
其中,RPTK N-1指令将立即数N-1(要求不大于255)装入到重复计数器,使下一条指令重复执行N次。MACD指令实现下列功能:
(1)将程序在储器地址装入到程序计数器;(2)将存于数据区(B1块)的数据乘以程序区(B0块)的数据;(3)将上次的乘积加到累加器;(4)移动数据,将B1块中的数据向高地址移动一个地址;(5)每次累加后,程序计数器加1,指向下一个单位脉冲响应样值。
为了使用MACD指令,输入样值x(n)和滤波器系数h(n)必须合理地进行存放。图3.2是输入样值x(n)和滤波器系数h(n)在TMS320LF2407内存中的一种存放方法,以下是高效实现FIR滤波方程的汇编程序。
B0块 B1块
FF00H
h(N-1)
x(n)
┇
x(n-1)
3FFH
┇
h(1)
h(0)
x[n-(N-1)
图3.2 TMS320LF2407的存储器组织方法
;N阶FIR滤波的TMS320LF2407程序
;y(n)=x(n-(N-1))h(N-1)+x(n-(N-2))h(N-2)+…+x(n)h(n)
;
CNFP ;B0块配置为程序区
NEXT IN XN,PA0 ;从PA0口取一个样值
LARP AR1
LRLK AR1,3FFH ;AR1指向B1块的底部
MPYK 0 ;P寄存器清零
ZAC ;ACC清零
RPTK N-1 ;重复N-1次
MACD FF00H,*- ;乘/累加
APAC
SACH YN,1
OUT YN,PA1 ;输出滤波器响应y(n)至PA1口
B NEXT ;做下一点滤波
移序说明:
(1)FIR滤波器系数h(0),…,h(N-1)均小于1,可用Q15表示;
(2)输入待滤波样值从PA0口得到,直接送到x(n)对应的存储单元;
(3)滤波后的样值由SACH YN,1指令送至YN存储单元。由于滤波器系数用Q15表示,因此乘累加后在ACC中的值也是Q15,左移1位并取高16位后得到的数应与输入的样值具有相同的Q值了;
(4)滤波后的样值在PA1口输出;
(5)一点滤波结束后,由于MACD指令的作用,所有的输入样值均向高地址移动一个位置,即x[n-(N-2)]移动到x[n-(N-1) ]的位置,x[n-(N-3)]移动到x[n-(N-2)]位置,……,x(n)移动到x(n-1)的位置,从而为下一点滤波做好准备。
四、IIR滤波器的定点DSP实现
在IIR滤波器结构中,直接II型结构是最常用的滤波器结构,因为这种结构的二阶形式可作为有级联型和并联型结构中的基本节。二阶直接II型结构IIR滤波器如图3.3所示。
图3.3 二阶直接II型IIR滤波器
二阶直接II型结构滤波器的差分方程为:
d(n)=x(n)+a1d(n-1)+a2d(n-2)
y(n)=b0d(n)+b1d(n-1)+b2d(n-2)
式中,d(n)、d(n-1)、d(n-2)对应于图中具有不同延迟的中间节点值。以下是实现二阶直接II型IIR滤波器的汇编程序。
本程序实现一个二阶直接II型IIR滤波器
NEXT IN XN,PA0;从PA0口输入一个样值
LAC XN,15 ;ACC=x(n)
LT DN1 ;T=d(n-1)
MPY A1 ;P=a1*d(n-1)
LTA DN2 ;ACC=x(n)+a1*d(n-1),T=d(n-2)
MPY A2 ;P=a2*d(n-2)
APAC ;ACC=x(n)+a1*d(n-1)+a2*d(n-2)
SACH DN,1 ;d(n)=x(n)+a1*d(n-1)+a2*d(n-2)
ZAC ;ACC=0
MPY B2 ;P=b2*d(n-2)
LTD DN1 ;T=d(n-1),ACC=b2*d(n-2),d(n-2)=d(n-1)
MPY B1 ;P=b1*d(n-1)
LTD DN ;T=d(n), ACC=b2*d(n-1)+b1*d(n-1),d(n-1)=d(n)
MPY B0 ;p=b0*d(n)
APAC ;ACC=b2*d(n-2)+b1*d(n-1)+b0*d(n)
SACH YN,1 ;y(n)=b0*d(n)+b1*d(n-1)+b0*d(n)
OUT YN,PA1 ;输出滤波样值至PA1口
B NEXT
程序说明:
(1)在这个例子中,DN、DN1和DN2分别是二阶基本节中三个中间延迟节点d(n)、d(n-1)和d(n-2)的存储器单元,三个存储单元占据三个连续的存储空间,DN在低地址,DN2在高地址,DN1在中间。这是为了保证连续滤波时d(n)、d(n-1)、d(n-2)三个中间结果正确的存储位置。一点滤波结束后,由于LTD指令的作用,d(n)移动到d(n-1)、d(n-1)移动到d(n-2),为下一点滤波做好准备。
(2)A1、A2和B0、B1、B2分别是滤波器系数a1、a2和b0、b1、b2对应的存储单元;
(3)XN为新输入样值x(n)的存储单元,YN为滤波后输出样值y(n)对应的存储单元;
(4)滤波器的五个滤波器系数均小于1,用Q15表示;
(5)滤波器的输入样值从PA0口输入,LAC XN,15指令将输入样值x(n)左移15位后送入累加器ACC,这是为了与下面乘积相加时保证小数点对齐;
(6)SACH DN,1和SACH YN,1指令将ACC中的值左移1位,并将高16位存入d(n)和y(n)。假设x(n)的Q值为0,左移15位后送入ACC,相当于Q15,与乘积相加后的值也为Q15。左移1位相当于得到Q 16的数,而将高16位直接存入d(n)和y(n)又相当于将结果右移16位。因此d(n)和y(n)的Q值又变为0,从而与x(n)的Q值一致。
五、 PID算法实验
程序的入口参数:参考量Vref,测量值V;
程序的出口参数:t=kT时的控制量u(k);
程序中用到的资源:PID的三个参数Kp、Ki、Kd,t=(k-1)T时的控制量u(k-1),t=(k-2)T、t=(k-1)T、t=kT时的误差e(k-2)、e(k-1)、e(k),VCC、SXM、TREG、PREG以及三个临时单元PIDTMP1、PIDTMP2、PIDTMP3;
说明:程序中用到的参数规格化格式在程序注释栏中标明,如Q15×32表示该参数是被规格化为Q15格式值乘以32得到。
;=====================================================
;文件名:PID.asm
;======================================================?
.title "PID"
.include "vectors.h"
.def _c_int0
.bss V,1
.bss VE2,1
.bss VE1,1
.bss VE0,1
.bss PIDTMP1,1
.bss PIDTMP2,1
.bss PIDTMP3,1
.bss KP,1
.bss KI,1
.bss KD,1
.bss U,1
VREF .set 00FFh
_c_int0: LDP #4H ;数据页4 200h~0280h
SETC SXM ;允许符号扩展
LACL VREF ;Vref,Q.15*256
SUB V ;V,Q.15*256
SACL VE2 ;e(k)= Vref-V,Q15*256
SUB VE1 ;e(k-1),Q15*256
SACL PIDTMP1 ;Delta(e(k))=e(k)-e(k-1),Q15/256
SUB VE1
ADD VE0 ;e(k-2),Q15*256
SACL PIDTMP3 ;Delta(e(k)) -Delta(e(k-1))= e(k)-2e(k-1)+e(k-2)
;Q15*256
LT KP ;Kp,Q15*32
MPY PIDTMP1
PAC ;Kp*Delta(e(k)),Q30*8192
RPT #4
SFL ;Kp*Delta(e(k)),Q30*256
SACH PIDTMP1,1 ;Kp*Delta(e(k)),Q15*256
LT KI ;Ki,Q15*32
MPY VE2
PAC ;Ki*e(k),Q30*8192
RPT #4
SFL ;Ki*e(k),Q30*256
SACH PIDTMP2,1 ;Ki*e(k),Q15*256
LT KD ;Kd,Q15*32
MPY PIDTMP3
PAC ;Kd* Delta(e(k))-Delta(e(k-1)),Q30*8192
RPT #4
SFL ;Kd* Delta(e(k))-Delta(e(k-1)),Q30*256
SACH PIDTMP3,1 ;Kd* Delta(e(k))-Delta(e(k-1)),Q15*256
LACL U ;u(k-1),Q15*256
ADD PIDTMP1
ADD PIDTMP2
ADD PIDTMP3
SACL U ;u(k),Q15*256
SUB #4B00H ;150V,Q15*256
BCND PID1,LEQ
SPLK #4A3DH,U ;上限幅
B PID2
PID1: BIT U,0
BCND PID2,NTC
SPLK #0,U ;下限幅
PID2: LACL VE1 ;平移保存
SACL VE0 ;e(k-2)=e(k-1)
LACL VE2
SACL VE1 ;e(k-1)=e(k)
DONE: B DONE
PHANTOM: RET
.end
六、FFT的定点DSP实现
基2的DIT FFT的蝶形如下图
图3-4 基2的DIT FFT的蝶形运算
考虑N点FFT第m级的基2碟形,输出可以表示为:
KN Pm+1=Pm+ W Q
kN Qm+1=Pm- W Qm
这里,Pm和Qm是输入,Pm+1和Qm+1是输出。一般的,Pm,Qm,Pm+1和Qm+1与蝶形因子一样是复数。蝶形因子可以表示为:
KN W =e-j(2π/N)k=cos(x)-jsin(x)
式中,X=(2π/N)k。这样Pm和Qm可以用实部和虚部表示为:
Pm=PR+jPI
Qm=QR+jQI
由上两式可得:
Pm+1=PR+ jPI+[QRcos(x)+QIsin(x)]+j[QIcos(x)-QRsin(x)]
=[PR+QRcos(x)+QIsin(x)]+j[PI+QIcos(x)-QRsin(x)]
Qm+1=PR+ jPI-[QRcos(x)+QIsin(x)]-j[QIcos(x)-QRsin(x) ]
=[PR-QRcos(x)-QIsin(x)+j[PI-QIcos(x)+QRsin(x) ]
假设每个蝶形的输入用Q15表示,幅度小于1,则上式输出的最大幅度为
1+ 1sin(45°)+1cos(45°)=2.414213562
为了避免溢出,可在FFT的每一级用因子2.414213562进行归一化。但是,每一级用这样的一个因子归一化势必增加运算量。考虑到大多数情况属是实数FFT,最大幅度不超过2,因此可在每一级用因子2进行归一化。运用DSP芯片的移位特性,用2归一化不增加任何运算量。这样,如果FFT包含M级,则输出相当于除以2M=N,其中N为FFT的长度。
FFT的运算时间往往被用来衡量DSP芯片性能的一个重要指标,因此,提高FFT的运算速度也是非常重要的。在用DSP芯片实现FFT算法时,应充分利用DSP芯片所提供的各种软硬件资源。例如对于TMS320LF2407,可供利用的一些资源包括:(1)片内RAM,片内B0和B1块可以实现256点复数FFT;(2)比特反转寻址方式,这种寻址方式是专门为FFT运算提供的。
下面是一个8~256点基2复数FFT的TMS320 LF2407汇编程序。
程序说明:
(1)数据页指针DP=0
(2)用到的寄存器:AR0、AR1、AR2、AR3
(3)输入参数:N、M、WKAD、NOM
其中,N=FFT的点数,M=Log2(N),WKAD为系数的存放地址;
32点FFT:N=32,M=5,WKAD=WK32;
64点FFT:N=64,M=6,WKAD=WK64;
128点FFT:N=128,M=7,WKAD=WK128;
256点FFT:N=256,M=8,WKAD=WK256;
NOM:控制FFT运算是否进行归一化
(4)调用FFT子程序前输入数据已经存放在INDATR、INDATI,存放顺序为:
实部:在INDATR,按顺序存放
虚部:在INDATI,按顺序存放
.title "fft"
.include "vectors.h"
.global _c_int0
INPUT .equ 200h ;FFT运算时输入数据的位置
INDATR .equ 9000h ;输入数据实部存放地址
INDATI .equ 9100h ;输入数据虚存放地址
SINTAB .equ 9200h ;系数表在内存中的地址
;内部存储器定义:
N .equ 118 ;FFT点数
M .equ 119 ;pow(2,M)=N
WKAD .equ 120 ;系数的起始地址
NOM .equ 121 ;归一化(0),不归一化(1)
IW .equ 122 ;系数增量
XT .equ 123 ;暂存
YT .equ 124 ;暂存
ID .equ 125 ;DISTANT BETWEEN 2 COMPUTING DATAS
C1 .equ 126 ;循环计数器
C2 .equ 127 ;循环计算器
.text
_c_int0:
LDP #0H
SETC INTM
LALK 256
SACL N
LACK 8
SACL M
LACK 0
SACL NOM
LALK WK256
LRLK AR1,SINTAB
RPTK 255
TBLR *+,AR1 ;将系数表调入SINTAB开始的RAM中
CALL FFT ;作FFT运算
HERE: B HERE
;以下是FFT子程序
FFT: LDP 0
LACC M
SUBK 1
SACL M ;M=M-1
LARP AR1
LALK SINTAB
SACL WKAD
FFT1: LAR AR0,N
LAC N
SUBK 1
SACL N ;N=N-1
LARP AR1
;将输入数据调入片内RAM,存放顺序为:实部、虚部;实部、虚部;……
LRLK AR2,INPUT
LRLK AR1,INDATR
LAR AR3,N
MF1: LAC *+,0,AR1
SACL *BR0+,0,AR3
BANZ MF1,*-,AR2
LRLK AR1,INDATI
LAR AR3,N
MF2: LAC *+,0,AR1
SACL *BR0+,0,AR3
BANZ MF2,*-,AR2
SOVM
SSXM ;符号扩展
SPM 1 ;结果左移一位
LACK 1
SACL ID ;ID=1
LAC N
ADDK 1
SACL IW,1 ;IW=2*N
LAR AR2,M
LOOP3: LRLK AR1,INPUT ;AR1=INPUT P.X
LAC ID,1
SACL ID ;ID=2*ID=2
LAC IW ;IW=IW/2=N
LAC IW,15
SACH C2 ;C2=IW/2=N/2
LAR AR0,ID
LOOP2: LAR AR3,WKAD ;AR3指向WK的起始地址
LAC ID,15
SACH C1 ;C1=ID/2=1
MAR *0+,AR3 ; AR1=AR1+D→Q.X
LOOP1: ZAC
LT *+,AR1
MPY *+,AR3
LT *,AR1
MPYA *-,AR3
SPAC
SACH XT ;XT=Q.X*COS-Q.Y*SIN
ZAC
LT *-,AR1
MPY *+,AR3
LT *,AR1
MPYA *-
APAC
SACH YT ;YT=Q.X*SIN+Q.Y*COS
LAC NOM
BNZ D2 ;IF NOM=1 归一化
*********A_BEGIN ************ ;else 不归一化
MAR *0- ;(AR1)=P.X
LAC *
ADD XT
SACL *0+ ;P.X=XT+P.X
SUB XT,1
SACL *+ ;Q.X=P.X-XT;(AR1)=Q.Y
MAR *0- ;(AR1)=P.Y
LAC *
ADD YT
SACL *0+ ;P.Y+YT
SUB YT,1
SACL *+,0,AR3 ;Q.Y=P.Y-YT
B D ;(AR1)=Q.Y+1→NEXT Q.X
********A_END************
********B_BEGIN**********
D2: MAR *0- ;(AR1)=P.X
LAC *,15
ADD XT,15
SACH *0+ ;P.X=(XT+P.X)/2
SUBH XT
SACH *+ ;Q.X=(P.X-XT)/2;(AR1)=Q.Y
MAR *0- ;(AR1)=P.Y
LAC *,15
ADD YT,15
SACH *0+ ;P.Y=(P.Y+YT)/2
SUBH YT
SACH *+,0,AR3 ;Q.Y=*(P.Y-YT)/2
;(AR1)=Q.Y+1→NEXT Q.X
****** B_END ******
D: LAR AR0,IW
MAR *0+ ;(AR3)=(AR3)+IW→WK.COS
LAR AR0,ID ;(AR0)=ID
LAC C1
SUBK 1
SACL C1 ;C1=C1-1
BGZ LOOP1
LAC C2
SUBK 1
SACL C2 ;C2=C2-1
BGZ LOOP2
LARP AR2
BANZ LOOP3,*-,AR1
RET
;上述程序中,当NOM为1时,FFT运算进行归一化,否则不进行归一化。其中,A_BEGIN到A_END之间的程序为不需要归一化的程序,而B_BEGIN到B_END之间的程序为需要归一化的程序。FFT的运算结果在200H~(200H+2*N-1)的片内
;以下是8点~256点FFT系数表,存放顺序为cos,sin;cos;cos,sin;…
.data
WK8 .equ $
.word 07fffh,00h,05a82h,0a57eh,00h,08001h,0a57eh,0a57eh
WK16 .equ $
.word 07fffh,00h,07642h,0cf05h,05a82h,0a57eh,030fch,089bfh
.word 00h,08001h,0cf04h,089bfh,0a57eh,0a57eh,089beh,0cf05h
WK32 .equ $
.word 07fffh,00h,07d8ah,0e708h,07642h,0cf05h,06a6eh,0b8e4h
.word 05a82h,0a57eh,0471dh,09593h,030fch,089bfh,018f9h,08276h
.word 00h,08001h,0e707h,08276h,0cf04h,089bfh,0b8e3h,09593h
.word 0a57eh,0a57eh,09592h,0b8e4h,089beh,0cf05h,08276h,0e708h
WK64 .equ $
.word 07fffh,00h,07f62h,0f375h,07d8ah,0e708h,07a7dh,0dad8h
.word 07642h,0cf05h,070e3h,0c3aah,06a6eh,0b8e4h,062f2h,0aecdh
.word 05a82h,0a57eh,05134h,09d0eh,0471dh,09593h,03c57h,08f1eh
.word 030fch,089bfh,02528h,08583h,018f9h,08276h,0c8ch,0809eh
.word 00h,08001h,0f374h,0809eh,0e707h,08276h,0dad8h,08583h
.word 0cf04h,089bfh,0c3a9h,08f1eh,0b8e3h,09593h,0aecch,09d0eh
.word 0a57eh,0a57eh,09d0eh,0aecdh,09592h,0b8e4h,08f1dh,0c3aah
.word 089beh,0cf05h,08583h,0dad8h,08276h,0e708h,0809eh,0f375h
WK128 .equ $
.word 07fffh,00h,07fd9h,0f9b9h,07f62h,0f375h,07e9dh,0ed38h
.word 07d8ah,0e708h,07c2ah,0e0e7h,07a7dh,0dad8h,07885h,0d4e1h
.word 07642h,0cf05h,073b6h,0c946h,070e3h,0c3aah,06dcah,0be32h
.word 06a6eh,0b8e4h,066d0h,0b3c1h,062f2h,0aecdh,05ed7h,0aa0bh
.word 05a82h,0a57eh,055f6h,0a129h,05134h,09d0eh,04c40h,09931h
.word 0471dh,09593h,041ceh,09236h,03c57h,08f1eh,036bah,08c4bh
.word 030fch,089bfh,02b1fh,0877ch,02528h,08583h,01f1ah,083d7h
.word 018f9h,08276h,012c8h,08163h,0c8ch,0809eh,0648h,08028h
.word 00h,08001h,0f9b8h,08028h,0f374h,0809eh,0ed38h,08163h
.word 0e707h,08276h,0e0e6h,083d7h,0dad8h,08583h,0d4e1h,0877ch
.word 0cf04h,089bfh,0c946h,08c4bh,0c3a9h,08f1eh,0be32h,09236h
.word 0b8e3h,09593h,0b3c0h,09931h,0aecch,09d0eh,0aa0ah,0a129h
.word 0a57eh,0a57eh,0a129h,0aa0bh,09d0eh,0aecdh,09930h,0b3c1h
.word 09592h,0b8e4h,09236h,0be32h,08f1dh,0c3aah,08c4ah,0c946h
.word 089beh,0cf05h,0877bh,0d4e1h,08583h,0dad8h,083d6h,0e0e7h
.word 08276h,0e708h,08163h,0ed38h,0809eh,0f375h,08027h,0fb9h
WK256 .equ $
.word 07fffh,00h,07ff6h,0fcdch,07fd9h,0f9b9h,07fa7h,0f69h
.word 07f62h,0f375h,07f0ah,0f055h,07e9dh,0ed38h,07e1eh,0ea1eh
.word 07d8ah,0e708h,07ce4h,0e3f5h,07c2ah,0e0e7h,07b5dh,0ddddh
.word 07a7dh,0dad8h,0798ah,0d7dah,07885h,0d4e1h,0776ch,0d1efh
.word 07642h,0cf05h,07505h,0cc22h,073b6h,0c946h,07255h,0c674h
.word 070e3h,0c3aah,06f5fh,0c0e9h,06dcah,0be32h,06c24h,0bb86h
.word 06a6eh,0b8e4h,068a7h,0b64ch,066d0h,0b3c1h,064e9h,0b141h
.word 062f2h,0aecdh,060ech,0ac65h,05ed7h,0aa0bh,05cb4h,0a7beh
.word 05a82h,0a57eh,05843h,0a34ch,055f6h,0a129h,0539bh,09f14h
.word 05134h,09d0eh,04ec0h,09b18h,04c40h,09931h,049b4h,0975ah
.word 0471dh,09593h,0447bh,093dch,041ceh,09236h,03f17h,090a1h
.word 03c57h,08f1eh,0398dh,08dabh,036bah,08c4bh,033dfh,08afch
.word 030fch,089bfh,02e11h,08894h,02b1fh,0877ch,02827h,08676h
.word 02528h,08583h,02224h,084a3h,01f1ah,083d7h,01c0ch,0831dh
.word 018f9h,08276h,015e2h,081e3h,012c8h,08163h,0fabh,080f7h
.word 0c8ch,0809eh,096bh,08059h,0648h,08028h,0324h,0800ah
.word 00h,08001h,0fcdch,0800ah,0f9b8h,08028h,0f695h,08059h
.word 0f374h,0809eh,0f055h,080f7h,0ed38h,08163h,0ea1eh,081e3h
.word 0e707h,08276h,0e3f4h,0831dh,0e0e6h,083d7h,0dddch,084a3h
.word 0dad8h,08583h,0d7d9h,08676h,0d4e1h,0877ch,0d1efh,08894h
.word 0cf04h,089bfh,0cc21h,08afch,0c946h,08c4bh,0c673h,08dabh
.word 0c3a9h,08f1eh,0c0e9h,090a1h,0be32h,09236h,0bb85h,093dch
.word 0b8e3h,09593h,0b64ch,0975ah,0b3c0h,09931h,0b140h,09b18h
.word 0aecch,09d0eh,0ac65h,09f14h,0aa0ah,0a129h,0a7bdh,0a34ch
.word 0a57eh,0a57eh,0a34ch,0a7beh,0a129h,0aa0bh,09f14h,0ac65h
.word 09d0eh,0aecdh,09b17h,0b141h,09930h,0b3c1h,09759h,0b64ch
.word 09592h,0b8e4h,093dch,0bb86h,09236h,0be32h,090a1h,0c0e9h
.word 08f1dh,0c3aah,08dabh,0c674h,08c4ah,0c946h,08afbh,0cc22h
.word 089beh,0cf05h,08894h,0d1efh,0877bh,0d4e1h,08676h,0d7dah
.word 08583h,0dad8h,084a3h,0ddddh,083d6h,0e0e7h,0831ch,0e3f5h
.word 08276h,0e708h,081e2h,0ea1eh,08163h,0ed38h,080f6h,0f055h
.word 0809eh,0f375h,08059h,0f696h,08027h,0f9b9h,0800ah,0fcdch
PHANTOM RET
.end