📄 hdda.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 + -