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

📄 sdrv_regioncopy.s01

📁 一种彩屏驱动以及画点,填充图片和填充数据的一些程序
💻 S01
字号:
	NAME	sdrv_regioncopy(16)
	RSEG	BBC_DW3(0)
	EXTERN	DisplayBuffer
	EXTERN	Hdrv_BuffDataTrans
	EXTERN	Hdrv_GetBuffData
	EXTERN	Hdrv_SetWindow
	PUBLIC	Sdrv_RegionCopy
	EXTERN	region_win
	EXTERN	?CLZ80L_4_04_L00
	EXTERN	?SS_DIV_L02
	EXTERN	?S_MUL_L02
	RSEG	BBC_DW3
Sdrv_RegionCopy:
; 1.	/*
; 2.	********************************************************************************
; 3.	*                       ACTOS
; 4.	*                  ui dirver show picture
; 5.	*
; 6.	*                (c) Copyright 2002-2003, Actions Co,Ld.
; 7.	*                        All Right Reserved
; 8.	*
; 9.	* File   : Sdrv_RegionCopy.c
; 10.	* By     : Rcmai
; 11.	* Version: 1> v1.00     first version     10/17/2003 10:46PM
; 12.	********************************************************************************
; 13.	*/
; 14.	#include "display.h"
; 15.	#include "Drv_S6B33B0A.h"
; 16.	
; 17.	#pragma memory=constseg(BBS_DW3)
; 18.	#pragma memory=default
; 19.	
; 20.	#pragma memory=dataseg(BBD_DW3)
; 21.	#pragma memory=default
; 22.	
; 23.	#pragma codeseg(BBC_DW3)
; 24.	
; 25.	////*******************************************************************************/
; 26.	///* void Sdrv_RegionCopy(region_t sregion, region_t tregion)
; 27.	//** FUNCTION:     Sdrv_RegionCopy
; 28.	//**
; 29.	//** Description:  把源区域的数据复制到目的区域
; 30.	//**  input
; 31.	//**     region_t *sregion: 指定源区域 ; 
; 32.	//**     region_t *tregion: 指定目的区域
; 33.	//**
; 34.	//**  output
; 35.	//**     none
; 36.	//********************************************************************************/
; 37.	void Sdrv_RegionCopy(region_t *sregion, region_t *tregion)
; 38.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65522
	ADD	HL,SP
	LD	SP,HL
; 39.	    int block_pixel;//每一小块象素的个数
; 40.	    BYTE block_line; //每一小块的行数
; 41.	    int i;   
; 42.	    //int height_cnt; //高度计数器
; 43.	    region_t sregionram;//临时使用
; 44.	    region_t tregionram;//临时使用
; 45.	    BYTE line_cnt;//行数计数器
; 46.	
; 47.	    BYTE sregiony_tmp;
; 48.	    BYTE tregiony_tmp;    
; 49.	
; 50.	    //把源目区域数据放到临时区作运算
; 51.	    sregionram = *sregion;
	EX	DE,HL
	LD	BC,4
	LDIR
; 52.	    tregionram = *tregion;
	LD	HL,4
	ADD	HL,SP
	EX	DE,HL
	LD	L,(IX-2)
	LD	H,(IX-1)
	LD	C,4
	LDIR
; 53.	
; 54.	    //下面强迫目标区域与源区域大小相同
; 55.	    tregionram.width = sregionram.width;
	LD	B,(IX-16)
	LD	(IX-12),B
; 56.	    tregionram.height = sregionram.height;
	LD	B,(IX-15)
	LD	(IX-11),B
; 57.	
; 58.	    if ( (sregionram.x + sregionram.width) > (region_win.x+region_win.width)                //源区域横向是否超限
; 59.	               || (sregionram.y + sregionram.height) > (region_win.y + region_win.height)   //源区域纵向是否超限
; 60.	               || (tregionram.x + sregionram.width) > (region_win.x+region_win.width)       //目标区域横向是否超限(源与目宽度一样)
; 61.	               || (tregionram.y + sregionram.height) > (region_win.y + region_win.height) ) //目标区域纵向是否超限(源与目宽度一样)
	LD	L,(IX-16)
	LD	B,C
	LD	D,B
	LD	E,(IX-18)
	LD	H,B
	ADD	HL,DE
	LD	C,L
	LD	B,H
	LD	DE,(region_win+2)
	LD	D,0
	LD	HL,(region_win)
	LD	H,D
	ADD	HL,DE
	OR	128
	SBC	HL,BC
	JP	PO,?0014
	XOR	H
?0014:
	JP	M,?0009
	LD	L,(IX-15)
	LD	H,D
	LD	E,(IX-17)
	ADD	HL,DE
	LD	C,L
	LD	B,H
	LD	DE,(region_win+3)
	LD	D,0
	LD	HL,(region_win+1)
	LD	H,D
	ADD	HL,DE
	OR	128
	SBC	HL,BC
	JP	PO,?0015
	XOR	H
?0015:
	JP	M,?0009
	LD	L,(IX-16)
	LD	H,D
	LD	E,(IX-14)
	ADD	HL,DE
	LD	C,L
	LD	B,H
	LD	DE,(region_win+2)
	LD	D,0
	LD	HL,(region_win)
	LD	H,D
	ADD	HL,DE
	OR	128
	SBC	HL,BC
	JP	PO,?0016
	XOR	H
?0016:
	JP	M,?0009
	LD	L,(IX-15)
	LD	H,D
	LD	E,(IX-13)
	ADD	HL,DE
	LD	C,L
	LD	B,H
	LD	DE,(region_win+3)
	LD	D,0
	LD	HL,(region_win+1)
	LD	H,D
	ADD	HL,DE
	OR	128
	SBC	HL,BC
	JP	PO,?0017
	XOR	H
?0017:
	JP	M,?0009
?0002:
?0003:
?0000:
; 62.	    {
; 63.	        return; //超限返回
; 64.	    }
?0001:
; 65.	
; 66.	    //把一个大的矩形分成N个小的矩形块,每个小矩形数据应能用一个page buf 传送完
; 67.	    //   这样可方便在源,目标间进行数据交换(不断换窗口)
; 68.	    block_line = DisplayBufLen/(2*(sregionram.width));
	LD	L,(IX-16)
	LD	H,D
	ADD	HL,HL
	LD	C,L
	LD	B,H
	LD	DE,512
	CALL	?SS_DIV_L02
	LD	(IX-7),E
; 69.	    block_pixel = block_line * (sregionram.width);
	LD	C,(IX-16)
	LD	B,0
	LD	D,B
	CALL	?S_MUL_L02
	PUSH	DE
	POP	IY
; 70.	
; 71.	    line_cnt = sregionram.height;//保存高度值
	LD	B,(IX-15)
	LD	(IX-8),B
; 72.	    sregionram.height = block_line;
	LD	B,(IX-7)
	LD	(IX-15),B
; 73.	    tregionram.height = block_line;
	LD	(IX-11),B
; 74.	
; 75.	    if ((sregion->y) >= (tregion->y))
	LD	L,(IX-2)
	LD	H,(IX-1)
	INC	HL
	PUSH	HL
	LD	L,(IX-4)
	LD	H,(IX-3)
	INC	HL
	LD	A,(HL)
	POP	HL
	CP	(HL)
	JR	C,?0005
?0004:
?0007:
; 76.	    {
; 77.	        //源在目标的下面时,可从上面开始读数据(这样不会覆盖)
; 78.	        while (line_cnt > block_line)
	LD	A,(IX-7)
	CP	(IX-8)
	JR	NC,?0006
?0008:
; 79.	        {
; 80.	            //读出对应区域的图片内容放在暂存中
; 81.	            Hdrv_SetWindow(&sregionram);
	LD	HL,0
	ADD	HL,SP
	EX	DE,HL
	CALL	Hdrv_SetWindow
; 82.	            Hdrv_GetBuffData (DisplayBuffer, block_pixel, NORTransMode_def);
	LD	HL,0
	PUSH	HL
	PUSH	IY
	POP	BC
	LD	DE,DisplayBuffer
	CALL	Hdrv_GetBuffData
	POP	AF
; 83.	            
; 84.	            //把暂时显存区的数据送到LCM
; 85.	            Hdrv_SetWindow(&tregionram);
	LD	HL,4
	ADD	HL,SP
	CALL	?0029
; 86.	            Hdrv_BuffDataTrans(DisplayBuffer, block_pixel*2);    
; 87.	                        
; 88.	            line_cnt -= block_line;
	ADD	HL,SP
	LD	A,(HL)
	SUB	(IX-7)
	LD	(HL),A
; 89.	            sregionram.y += block_line;     //坐标增加
	LD	A,(IX-17)
	ADD	A,(IX-7)
	LD	(IX-17),A
; 90.	            tregionram.y += block_line;
	LD	A,(IX-13)
	ADD	A,(IX-7)
	LD	(IX-13),A
	JR	?0004
?0006:
; 91.	        }
; 92.	
; 93.	        i = sregionram.width * line_cnt;//余下的象素个数
	CALL	?0028
; 94.	
; 95.	        sregionram.height = line_cnt;
; 96.	        tregionram.height = line_cnt;
; 97.	
; 98.	        //读出余下不足一个块的区域内容
; 99.	        Hdrv_SetWindow(&sregionram);
	JP	?0018
	ADD	HL,SP
	JP	?0019
	CALL	Hdrv_SetWindow
; 100.	        Hdrv_GetBuffData(DisplayBuffer, i, NORTransMode_def);                                       
	JP	?0020
	PUSH	HL
	JP	?0021
	LD	DE,DisplayBuffer
	JP	?0022
	POP	AF
; 101.	        
; 102.	        //把暂时显存区的数据送到LCM
; 103.	        Hdrv_SetWindow(&tregionram);
	JP	?0023
	ADD	HL,SP
	JP	?0024
	CALL	Hdrv_SetWindow
; 104.	        Hdrv_BuffDataTrans(DisplayBuffer, i*2);
	JP	?0025
	ADD	HL,HL
	JP	?0026
	LD	DE,DisplayBuffer
	JP	?0027
; 105.	    }
; 106.	    else
	JP	?0009
?0005:
; 107.	    {
; 108.	        sregiony_tmp = sregionram.y;
	LD	B,(IX-17)
	LD	(IX-5),B
; 109.	        tregiony_tmp = tregionram.y;
	LD	B,(IX-13)
	LD	(IX-6),B
?0011:
; 110.	  
; 111.	
; 112.	        //源在目标的上面时,要从下面开始读数据(这样不会覆盖)
; 113.	        while (line_cnt > block_line)
	LD	A,(IX-7)
	CP	(IX-8)
	JR	NC,?0010
?0012:
; 114.	        {
; 115.	            //读出对应区域的图片内容放在暂存中
; 116.	            sregionram.y = sregiony_tmp + (line_cnt - block_line);//从下面开始读
	LD	A,(IX-8)
	SUB	(IX-7)
	ADD	A,(IX-5)
	LD	(IX-17),A
; 117.	            tregionram.y = tregiony_tmp + (line_cnt - block_line); 
	LD	A,(IX-8)
	SUB	(IX-7)
	ADD	A,(IX-6)
	LD	(IX-13),A
; 118.	            Hdrv_SetWindow(&sregionram);
	LD	HL,0
	ADD	HL,SP
	EX	DE,HL
	CALL	Hdrv_SetWindow
; 119.	            Hdrv_GetBuffData (DisplayBuffer, block_pixel, NORTransMode_def);
	LD	HL,0
	PUSH	HL
	PUSH	IY
	POP	BC
	LD	DE,DisplayBuffer
	CALL	Hdrv_GetBuffData
	POP	AF
; 120.	            
; 121.	            //把暂时显存区的数据送到LCM
; 122.	            Hdrv_SetWindow(&tregionram);
	LD	HL,4
	ADD	HL,SP
	CALL	?0029
; 123.	            Hdrv_BuffDataTrans(DisplayBuffer, block_pixel*2);    
; 124.	                        
; 125.	            line_cnt -= block_line;
	ADD	HL,SP
	LD	A,(HL)
	SUB	(IX-7)
	LD	(HL),A
	JR	?0011
?0010:
; 126.	        }
; 127.	
; 128.	        i = sregionram.width * line_cnt;//余下的象素个数
	CALL	?0028
; 129.	
; 130.	        sregionram.height = line_cnt;
; 131.	        tregionram.height = line_cnt;
; 132.	        sregionram.y = sregiony_tmp;
	LD	B,(IX-5)
	LD	(IX-17),B
; 133.	        tregionram.y = tregiony_tmp;
	LD	B,(IX-6)
	LD	(IX-13),B
; 134.	
; 135.	        //读出余下不足一个块的区域内容
; 136.	        Hdrv_SetWindow(&sregionram);
?0018:
	LD	HL,0
	ADD	HL,SP
?0019:
	EX	DE,HL
	CALL	Hdrv_SetWindow
; 137.	        Hdrv_GetBuffData(DisplayBuffer, i, NORTransMode_def);                                       
?0020:
	LD	HL,0
	PUSH	HL
?0021:
	LD	C,(IX-10)
	LD	B,(IX-9)
	LD	DE,DisplayBuffer
?0022:
	CALL	Hdrv_GetBuffData
	POP	AF
; 138.	        
; 139.	        //把暂时显存区的数据送到LCM
; 140.	        Hdrv_SetWindow(&tregionram);
?0023:
	LD	HL,4
	ADD	HL,SP
?0024:
	EX	DE,HL
	CALL	Hdrv_SetWindow
; 141.	        Hdrv_BuffDataTrans(DisplayBuffer, i*2);        
?0025:
	LD	L,(IX-10)
	LD	H,(IX-9)
	ADD	HL,HL
?0026:
	LD	C,L
	LD	B,H
	LD	DE,DisplayBuffer
?0027:
	CALL	Hdrv_BuffDataTrans
?0009:
; 142.	    }    
; 143.	    
; 144.	
; 145.	}
?0013:
	LD	SP,IX
	POP	IX
	POP	IY
	RET
?0028:
	LD	C,(IX-16)
	LD	B,0
	LD	D,B
	LD	E,(IX-8)
	CALL	?S_MUL_L02
	LD	(IX-10),E
	LD	(IX-9),D
	LD	B,(IX-8)
	LD	(IX-15),B
	LD	(IX-11),B
	RET
?0029:
	EX	DE,HL
	CALL	Hdrv_SetWindow
	PUSH	IY
	POP	HL
	ADD	HL,HL
	LD	C,L
	LD	B,H
	LD	DE,DisplayBuffer
	CALL	Hdrv_BuffDataTrans
	LD	HL,10
	RET
; 146.	
	END

⌨️ 快捷键说明

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