⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdda.asm

📁 源程序是在VisualDSP环境下开发出来的
💻 ASM
字号:
/******************************************************************

** 文件名:hdda.asm

** Copyright (c) 1998-1999 *********公司技术开发部

** 创建人:

** 日 期:2003.03.08

** 修改人:

** 日 期:2003.05.26

** 描 述:asmputchar();RemoveOutsidePoints();TransparentizeRect();

** 版 本:

******************************************************************/
#include "def21160.h"
#include "asm_sprt.h"
#include "hddamacros.h"

.extern _g_nCharHeight;
.extern _g_nCharWidth;
.extern _g_nNumOfResult;
.extern _g_nResult;
.extern _g_nNumOfToBeRotated;
.extern _g_nNumOfRotatedResult;
.extern _g_nRotatedResult;
.extern _g_nCurrentChannel;
.extern init;

/*****************************************************************

** 函数名:asmputchar

** 输 入: int x,int y,int color,int *pLib,int nFlags

** x---字符的x坐标,如果是左对齐输出,基准点在左上角。如果是右对齐输出,基准点在右上角。

** y---字符的y坐标

** color---字符的颜色,是调色板的索引值

** pLib---字符库的地址

** nFlags---字符的属性

** 输 出: 无

** 功能描述:输出单个字符或符号

** 全局变量:g_nCharHeight,g_nCharWidth---输出字符的高和宽,本函数的返回值

** 调用模块:无

** 作 者:

** 日 期:2003.03.08

** 修 改:

** 日 期:2003.05.26

** 版 本:优化

** 修改了的寄存器:	i0,i8;

****************************************************************/
.section/pm seg_pmco;
.global _asmputchar;
_asmputchar:
	entry;
//get the 4th and 5th parameters
	i0=reads(1);//pLib
	r1=reads(2);//nFlags
	//从字库中取得字宽
	r0=dm(2,i0);
	dm(_g_nCharWidth)=r0;
	//如果右对齐,x坐标减去字宽
	btst r1 by 6;
	if not sz r4=r4-r0;
	//如果字符需要旋转,jump _asmputchar_notbefinalresult
	btst r1 by 0;
	if sz jump _asmputchar_notbefinalresult(db);
	//从字库中取得字高
	r0=dm(1,i0);//r0=dm(addofcharlib+1)=height of the character
	dm(_g_nCharHeight)=r0;

	//修改中间结果堆栈中元素个数,当前指针位置,
	r0=dm(_g_nNumOfResult);
	r2=dm(i0,3);
	r2=r0+r2;
	dm(_g_nNumOfResult)=r2;
	//计算堆栈当前指针位置
	r1=-3;//堆栈中每一点占用三个内存单元
	r1=r0*r1(ssi);
	i4=_g_nResult;
	m4=r1;modify(i4,m4);
	i12=i4;modify(i12,-2);
	//取得字符的列数
	m12=dm(i0,m6);
	i8=i0;lcntr=m12;
	//修改i8使其指向字库中第一列横坐标所在位置
	modify(i8,m12);
	//读入第一列横坐标
	r2=pm(i8,m14);
	
	m4=-2;m12=-3;
	//用字符的位置修正第一列横坐标,读入第一列的点数和第一点的纵坐标
	r0=r2+r4,r1=dm(i0,m6),r2=pm(i8,m14);
	do _asmputchar_loop0 until lce;
		lcntr=r1,do _asmputchar_loop1 until lce;
			//用字符的位置修正点的纵坐标,把横坐标和颜色索引送到中间结果堆栈
			r1=r2+r8,dm(i4,m7)=r0,pm(i12,m12)=r12;
_asmputchar_loop1:
			//把纵坐标送到中间结果堆栈,并取得下一点纵坐标,最后一次循环时读入的是下一列的横坐标
			dm(i4,m4)=r1,r2=pm(i8,m14);
_asmputchar_loop0:
		//用字符的位置修正第一列横坐标,读入下一列的点数和第一点的纵坐标
		r0=r2+r4,r1=dm(i0,m6),r2=pm(i8,m14);
	exit;

_asmputchar_notbefinalresult:

	//修改旋转结果堆栈中元素个数,当前指针位置,
	r0=dm(_g_nNumOfToBeRotated);
	r2=dm(i0,3);
	r2=r0+r2;
	dm(_g_nNumOfToBeRotated)=r2;
	//计算堆栈当前指针位置
	r1=dm(_g_nNumOfRotatedResult);
	r0=r0+r1;
	r1=7;//堆栈中每一点占用七个内存单元
	r1=r0*r1(ssi);
	i4=_g_nRotatedResult;
	m4=r1;modify(i4,m4);
	i12=i4;modify(i12,2);
	//取得字符的列数
	m12=dm(i0,m6);
	i8=i0;lcntr=m12;
	//修改i8使其指向字库中第一列横坐标所在位置
	modify(i8,m12);
	//读入第一列横坐标
	r2=pm(i8,m14);
	m4=6;m12=7;
	//用字符的位置修正第一列横坐标,读入第一列的点数和第一点的纵坐标
	r0=r2+r4,r1=dm(i0,m6),r2=pm(i8,m14);
	do _asmputchar_loop2 until lce;
		lcntr=r1,do _asmputchar_loop3 until lce;
			//用字符的位置修正点的纵坐标,把横坐标和颜色索引送到旋转结果堆栈
			r1=r2+r8,dm(i4,m6)=r0,pm(i12,m12)=r12;
_asmputchar_loop3:
			//把纵坐标送到旋转结果堆栈,并取得下一点纵坐标,最后一次循环时读入的是下一列的横坐标
			dm(i4,m4)=r1,r2=pm(i8,m14);
_asmputchar_loop2:
		//用字符的位置修正第一列横坐标,读入下一列的点数和第一点的纵坐标
		r0=r2+r4,r1=dm(i0,m6),r2=pm(i8,m14);
	exit;
_asmputchar.end:	
	
/*****************************************************************

** 函数名:RemoveOutsidePoints

** 输 入: 无

** 输 出: 无

** 功能描述:把超出显示范围的点去除

** 全局变量:无

** 调用模块:无

** 作 者:

** 日 期:2003.03.08

** 修 改:

** 日 期:2003.05.26

** 版 本:待修改

****************************************************************/
	
.section/pm seg_pmco;
.global _RemoveOutsidePoints;
_RemoveOutsidePoints:
	entry;
	save_reg;
	
	
	r0=dm(_g_nNumOfResult);
	r0=pass r0;
	if le jump _asmremoveoutsidepoints_jump0(db);
	r15=WIDTH/2;
	r14=HEIGHT/2;
	
	i4=_g_nResult;
	r1=dm(i4,m7);//取得第一点的x
	r1=r1-r15;
	lcntr=r0,do _asmremoveoutsidepointsloop0 until lce;
	r1=clip r1 by r15,r2=dm(i4,m6);//取得y
	r1=r1+r15;
	r2=r2-r14,dm(i4,-3)=r1;//将修改后的x写回去
	r2=clip r2 by r14;
	r2=r2+r14,r1=dm(i4,2);//取得下一点的x
	
_asmremoveoutsidepointsloop0:	
	r1=r1-r15,dm(i4,-3)=r2;//将修改后的y写回去
	
_asmremoveoutsidepoints_jump0:	
	r0=dm(_g_nNumOfRotatedResult);
	r0=pass r0;
	if le jump _asmremoveoutsidepointsend;
	i4=_g_nRotatedResult;
	r1=dm(i4,1);
	r1=r1-r15;
	lcntr=r0,do _asmremoveoutsidepointsloop1 until lce;
	r1=clip r1 by r15,r2=dm(i4,-1);
	r1=r1+r15;
	r2=r2-r14,dm(i4,7)=r1;
	r2=clip r2 by r14;
	r2=r2+r14,r1=dm(i4,-6);
	
_asmremoveoutsidepointsloop1:	
	r1=r1-r15,dm(i4,7)=r2;
_asmremoveoutsidepointsend:
	restore_reg;
	exit;
_RemoveOutsidePoints.end:	
	
/*****************************************************************

** 函数名:TransparentizeRect

** 输 入: int OriginNumOfResult,int OriginNumOfRotatedResult,int x1,int y1,int x2,int y2

** OriginNumOfResult---需要检测的中间结果堆栈的开始点数

** OriginNumOfRotatedResult---需要检测的旋转结果堆栈的开始点数

** x1---区域左上角的横坐标

** y1---区域左上角的纵坐标

** x2---区域右下角的横坐标

** y2---区域右下角的纵坐标

** 输 出: 无

** 功能描述:把指定范围内的点去除

** 全局变量:_g_nNumOfResult,_g_nNumOfRotatedResult

** 调用模块:无

** 作 者:

** 日 期:2003.03.08

** 修 改:

** 日 期:2003.05.26

** 版 本:

****************************************************************/
	
.section/pm seg_pmco;
.global	_TransparentizeRect;
_TransparentizeRect:
	save_reg;
	//中间结果堆栈中的当前点数
	r15=dm(_g_nNumOfResult);
	//需要检测的点数
	r4=r15-r4;
	if le jump _asm_transparentizerect_jump0;
	//计算当前堆栈位置地址
	r1=-3;
	r1=r15*r1(ssi);
	m4=r1;
	i4=_g_nResult;
	modify(i4,m4);
	i12=i4;
	//i4指向要检测点的y
	modify(i4,2);
	//i12指向最后一点的color
	modify(i12,1);
	
	r1=reads(1);
	r2=reads(2);
	r3=reads(3);m4=-4;
	
	r6=dm(i4,1);
	
	lcntr=r4,do _asm_transparentizerect_loop0 until lce;
	comp(r6,r1),r5=dm(i4,2);
	if lt jump _asm_transparentizerect_loop0;
	comp(r6,r3);
	if gt jump _asm_transparentizerect_loop0;
	comp(r5,r12);
	if lt jump _asm_transparentizerect_loop0;
	comp(r5,r2);
	if gt jump _asm_transparentizerect_loop0;
_asm_transparentizerect_exchange0:
	//r6=dm(i4,m4)=modify(i4,-4);的目的是使i4向后移四个单元指向刚检测过点的color 
	r15=r15-1,r6=dm(i4,m4),r7=pm(i12,m14);
	dm(i4,m6)=r7;r6=pm(i12,m14);
	dm(i4,m6)=r6;r5=pm(i12,m14);
	dm(i4,2)=r5;	
_asm_transparentizerect_loop0:
	r6=dm(i4,1);
	
	dm(_g_nNumOfResult)=r15;

//get rid of the point in rect of rotatedresult;	
_asm_transparentizerect_jump0:
	r15=dm(_g_nNumOfRotatedResult);
	r4=r15-r8;
	if le jump _asm_transparentizerect_end;
	r1=reads(1);
	r2=reads(2);
	r3=reads(3);
	r6=7;
	r6=r15*r6(ssi);
	m4=r6;
	i4=_g_nRotatedResult;
	modify(i4,m4);
	i12=i4;
	modify(i4,-6);
	modify(i12,-1);
	m4=12;
	
	r6=dm(i4,-1);
	lcntr=r4,do _asm_transparentizerect_loop1 until lce;
	comp(r6,r1),r5=dm(i4,-6);
	if lt jump _asm_transparentizerect_loop1;
	comp(r6,r3);
	if gt jump _asm_transparentizerect_loop1;
	comp(r5,r12);
	if lt jump _asm_transparentizerect_loop1;
	comp(r5,r2);
	if gt jump _asm_transparentizerect_loop1;
_asm_transparentizerect_exchange1:
	r15=r15-1,r6=dm(i4,m4),r7=pm(i12,m15);
	dm(i4,m7)=r7;r7=pm(i12,m15);
	dm(i4,m7)=r7;r7=pm(i12,m15);
	dm(i4,m7)=r7;r7=pm(i12,m15);
	dm(i4,m7)=r7;r7=pm(i12,m15);
	dm(i4,m7)=r7;r7=pm(i12,m15);
	dm(i4,m7)=r7;r7=pm(i12,m15);
	dm(i4,-6)=r7;	
_asm_transparentizerect_loop1:
	r6=dm(i4,-1);
	dm(_g_nNumOfRotatedResult)=r15;
_asm_transparentizerect_end:	
	restore_reg;
	exit;
_TransparentizeRect.end:	

/*****************************************************************

** 函数名:bigchar

** 输 入: int x,int y,int color,int *pLib,int nFlags

** x---字符的x坐标,如果是左对齐输出,基准点在左上角。如果是右对齐输出,基准点在右上角。

** y---字符的y坐标

** color---字符的颜色,是调色板的索引值

** pLib---字符库的地址

** nFlags---字符的属性

** 输 出: 无

** 功能描述:输出单个字符或符号

** 全局变量:g_nCharHeight,g_nCharWidth---输出字符的高和宽,本函数的返回值

** 调用模块:无

** 作 者:

** 日 期:2003.03.08

** 修 改:

** 日 期:2003.05.26

** 版 本:优化

** 修改了的寄存器:	i0,i8;

****************************************************************/

.section/pm seg_pmco;
.global _asmbigchar;
_asmbigchar:
	entry;
//get the 4th and 5th parameters
	i0=reads(1);//pLib
	r1=reads(2);//nFlags
	//从字库中取得字宽
	r0=dm(2,i0);
	r0=lshift r0 by 1;//宽度乘以2
	dm(_g_nCharWidth)=r0;
	//如果右对齐,x坐标减去字宽
	btst r1 by 6;
	if not sz r4=r4-r0;
	//从字库中取得字高
	r0=dm(1,i0);//r0=dm(addofcharlib+1)=height of the character
	r0=lshift r0 by 1;//高度乘以2
	dm(_g_nCharHeight)=r0;

	//修改中间结果堆栈中元素个数,当前指针位置,
	r0=dm(_g_nNumOfResult);
	r2=dm(i0,3);
	r2=lshift r2 by 2;//点数乘以4
	r2=r0+r2;
	dm(_g_nNumOfResult)=r2;
	//计算堆栈当前指针位置
	r1=-3;//堆栈中每一点占用三个内存单元
	r1=r0*r1(ssi);
	i4=_g_nResult;
	m4=r1;modify(i4,m4);
	i12=i4;modify(i12,-2);
	//取得字符的列数
	m12=dm(i0,m6);
	i8=i0;lcntr=m12;
	//修改i8使其指向字库中第一列横坐标所在位置
	modify(i8,m12);
	//读入第一列横坐标
	r2=pm(i8,m14);
	r2=lshift r2 by 1;
	m4=-2;m12=-3;
	//用字符的位置修正第一列横坐标,读入第一列的点数和第一点的纵坐标
	r0=r2+r4,r1=dm(i0,m6),r2=pm(i8,m14);
	do _asmbigchar_loop0 until lce;
		lcntr=r1,do _asmbigchar_loop1 until lce;
			//用字符的位置修正点的纵坐标,把横坐标和颜色索引送到中间结果堆栈
			r2=lshift r2 by 1,pm(i12,m12)=r12;
			r1=r2+r8,dm(i4,m7)=r0,pm(i12,m12)=r12;
			r9=r0+1,dm(i4,m4)=r1,pm(i12,m12)=r12;
			r10=r1+1,dm(i4,m7)=r9;
			dm(i4,m4)=r1,pm(i12,m12)=r12;
			dm(i4,m7)=r9;dm(i4,m4)=r10;
			dm(i4,m7)=r0;
_asmbigchar_loop1:
			//把纵坐标送到中间结果堆栈,并取得下一点纵坐标,最后一次循环时读入的是下一列的横坐标
			dm(i4,m4)=r10,r2=pm(i8,m14);
		r2=lshift r2 by 1;
_asmbigchar_loop0:
		//用字符的位置修正第一列横坐标,读入下一列的点数和第一点的纵坐标
		r0=r2+r4,r1=dm(i0,m6),r2=pm(i8,m14);
	exit;
_asmbigchar.end:	
/*****************************************************************

** 函数名: _initial

** 输 入: int nChannel

** nChannel---要开通的视频通道号,共有[0,5]6个通道,如果nChannel>5或nChannel<0则保持选中原有的通道不变

** 输 出: 无

** 功能描述:init函数面向c的封装

** 作 者:

** 日 期:2003.07.24

** 修改人:

** 日 期:2003.07.24

** 版 本:

****************************************************************/

.SECTION/PM     seg_pmco;
.GLOBAL _initial;
_initial:
entry;
save_reg;
	r1=dm(_g_nCurrentChannel);
	r4=pass r4;
	if lt r4=r1;
	r0=5;
	comp(r4,r0);
	if gt r4=r1;
	call init;
restore_reg;	
exit;
_initial.end:

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -