sdrv_charoutrect_thai.s01

来自「一种彩屏驱动以及画点,填充图片和填充数据的一些程序」· S01 代码 · 共 350 行

S01
350
字号
	NAME	sdrv_charoutrect_thai(16)
	RSEG	BBC_PUTS(0)
	EXTERN	BlackCharToColor
	EXTERN	CharPointBuffer
	EXTERN	CheckCharMode
	EXTERN	DisplayBuffer
	EXTERN	Hdrv_BuffDataTrans
	EXTERN	Hdrv_SetDrawMode
	EXTERN	Hdrv_SetWindow
	EXTERN	PutCharErrFlag
	PUBLIC	Sdrv_CharOutRect
	EXTERN	Sdrv_GetFontPoint
	EXTERN	region
	EXTERN	?CLZ80L_4_04_L00
	RSEG	BBC_PUTS
Sdrv_CharOutRect:
; 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_charOutrect.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 codeseg(UI_RCODE)
; 18.	
; 19.	#pragma memory=constseg(BBS_PUTS)
; 20.	#pragma memory=default
; 21.	
; 22.	#pragma memory=dataseg(BBD_PUTS)
; 23.	#pragma memory=default
; 24.	
; 25.	#pragma codeseg(BBC_PUTS)
; 26.	
; 27.	
; 28.	
; 29.	////*******************************************************************************/
; 30.	///*
; 31.	//** FUNCTION:     Sdrv_CharOutRect
; 32.	//**
; 33.	//** Description:  在指定的区域上打出一个字符,超出区域部分不显示,没有超出屏幕的部分将正常显示。
; 34.	//**
; 35.	//**  input
; 36.	//**     code: 字符的码值
; 37.	//**     CRregion: 要求输出的区域
; 38.	//**     colcnt:   要求从汉字的哪一列开始输出   
; 39.	//**  output
; 40.	//**     bool: 当指定列数超出该字的总列数时返回FALSE,否则返回TRUE
; 41.	//********************************************************************************/
; 42.	
; 43.	non_banked bool Sdrv_CharOutRect(int code, region_t *CRregion, BYTE colcnt)
; 44.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	DE
	PUSH	AF
	PUSH	BC
	POP	IY
; 45.	    char charmode;
; 46.	    bool putchar_result;
; 47.	    char tmpwidth;
; 48.	
; 49.	    if (CRregion->width == NULL)
	INC	BC
	INC	BC
	LD	A,(BC)
	OR	A
	JP	Z,?0021
?0000:
; 50.	    {    
; 51.	        return FALSE;
; 52.	    }
?0001:
; 53.	    PutCharErrFlag = RESULT_PUTCHAR_OK; //默认为OK
	XOR	A
	LD	(PutCharErrFlag),A
; 54.	    Hdrv_SetDrawMode(DrawModeV_def);    //把显示模式设置成竖向显示模式(与旧字库兼容)
	LD	DE,1
	CALL	Hdrv_SetDrawMode
; 55.	    Sdrv_GetFontPoint(code, CharPointBuffer);//取点阵
	LD	BC,CharPointBuffer
	LD	E,(IX-2)
	LD	D,(IX-1)
	CALL	Sdrv_GetFontPoint
; 56.	    
; 57.	    charmode = CheckCharMode(code);
	LD	E,(IX-2)
	LD	D,(IX-1)
	CALL	CheckCharMode
	LD	(IX-3),A
; 58.	    //SFlag = CheckSymbol(code);         
; 59.	/////////////////////////////////////////////////     
; 60.	        region.x = CRregion->x;
	LD	A,(IY+0)
	LD	(region),A
; 61.	        region.y = CRregion->y;
	LD	A,(IY+1)
	LD	(region+1),A
; 62.	        region.width = CRregion->width;          
	LD	A,(IY+2)
	LD	(region+2),A
; 63.	/////////////////////////////////////////////////         
; 64.	    switch(charmode)
	LD	A,(IX-3)
	CP	0
	JR	NZ,?0009
?0003:
; 65.	    {    
; 66.	    case CharMode0608://06*08点阵模式(ascii小字体)     
; 67.	
; 68.	        if (colcnt >= 6)
	LD	A,(IX+6)
	CP	6
	JR	NC,?0022
?0004:
; 69.	        {//计数值超出
; 70.	            Hdrv_SetDrawMode(DrawModeH_def);    //把显示模式设置成横向显示模
; 71.	            return FALSE;
; 72.	        }
?0005:
; 73.	        //确定输出区域
; 74.	        //region.x = CRregion->x;
; 75.	        //region.y = CRregion->y;
; 76.	        //region.width = CRregion->width;
; 77.	        region.height = ASCII_SMALL_HEIGHT_DEF;       
	LD	A,8
	LD	(region+3),A
; 78.	        Hdrv_SetWindow(&region);
	LD	DE,region
	CALL	Hdrv_SetWindow
; 79.	
; 80.	        //取最小的值.
; 81.	        tmpwidth = (CRregion->width < (6-colcnt))? (CRregion->width):(6-colcnt); 
	LD	C,(IX+6)
	LD	B,0
	LD	HL,6
	AND	A
	SBC	HL,BC
	LD	C,L
	LD	B,H
	LD	L,(IY+2)
	LD	H,0
	OR	128
	SBC	HL,BC
	JP	PO,?0017
	XOR	H
?0017:
	JP	P,?0007
	LD	A,(IY+2)
	JR	?0008
?0007:
	LD	A,6
	SUB	(IX+6)
?0008:
	LD	(IX-4),A
; 82.	
; 83.	        //把黑白字模转为彩色字模放在Buff中
; 84.	        BlackCharToColor(ASCII_SMALL_WIDTH_DEF, CharPointBuffer);
	LD	BC,CharPointBuffer
	LD	DE,6
	JR	?0019
; 85.	        //把暂时显存区的数据送到LCM
; 86.	        Hdrv_BuffDataTrans(DisplayBuffer+colcnt*ASCII_SMALL_HEIGHT_DEF*2, 
; 87.	                                        ASCII_SMALL_HEIGHT_DEF*tmpwidth*2);
; 88.	
; 89.	        //region.x += ASCII_SMALL_WIDTH_DEF;//坐标移到下一个字的左上角
; 90.	        break;
?0009:
	CP	1
	JR	NZ,?0002
; 91.	        
; 92.	    case CharMode0816://08*16点阵模式(ascii大字体)
; 93.	        //设置字模输出的大小//上半个字
; 94.	        //region.width = ASCII_LARGE_WIDTH_DEF;
; 95.	        if (colcnt >= 8)
	LD	A,(IX+6)
	CP	8
	JR	C,?0011
?0010:
; 96.	        {//计数值超出
; 97.	            Hdrv_SetDrawMode(DrawModeH_def);    //把显示模式设置成横向显示模
?0022:
	LD	DE,0
	CALL	Hdrv_SetDrawMode
; 98.	            return FALSE;
?0021:
	XOR	A
; 99.	        }
	JR	?0016
?0011:
; 100.	        //确定输出区域
; 101.	        //region.x = CRregion->x;
; 102.	        //region.y = CRregion->y;
; 103.	        //region.width = CRregion->width;
; 104.	        region.height = ASCII_LARGE_HEIGHT_DEF/2;
	LD	A,8
	LD	(region+3),A
; 105.	        region.y += ASCII_LARGE_HEIGHT_DEF/2;//Y坐标加8准备输出下区(下半个字) 
	LD	A,(region+1)
	ADD	A,8
	LD	(region+1),A
; 106.	        Hdrv_SetWindow(&region);
	LD	DE,region
	CALL	Hdrv_SetWindow
; 107.	
; 108.	        //取最小的值.
; 109.	        tmpwidth = (CRregion->width < (8-colcnt))? (CRregion->width):(8-colcnt);
	LD	C,(IX+6)
	LD	B,0
	LD	HL,8
	AND	A
	SBC	HL,BC
	LD	C,L
	LD	B,H
	LD	L,(IY+2)
	LD	H,0
	OR	128
	SBC	HL,BC
	JP	PO,?0018
	XOR	H
?0018:
	JP	P,?0013
	LD	A,(IY+2)
	JR	?0014
?0013:
	LD	A,8
	SUB	(IX+6)
?0014:
	LD	(IX-4),A
; 110.	
; 111.	        //把黑白字模转为彩色字模放在Buff中(上区)
; 112.	        //BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer);
; 113.	        BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer + ASCII_LARGE_WIDTH_DEF);
	LD	BC,CharPointBuffer+8
	LD	DE,8
	CALL	?0023
; 114.	        //把暂时显存区的数据送到LCM
; 115.	        Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(ASCII_LARGE_HEIGHT_DEF/2)*2,
; 116.	                                        (ASCII_LARGE_HEIGHT_DEF/2)*tmpwidth*2);
; 117.	
; 118.	        region.y -= ASCII_LARGE_HEIGHT_DEF/2;//Y坐标加8准备输出下区(下半个字)
	LD	A,(region+1)
	ADD	A,248
	LD	(region+1),A
; 119.	        Hdrv_SetWindow(&region);        
	LD	DE,region
	CALL	Hdrv_SetWindow
; 120.	        //BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer + ASCII_LARGE_WIDTH_DEF);
; 121.	        BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer);
	LD	BC,CharPointBuffer
	LD	DE,8
?0019:
	CALL	?0023
; 122.	        //把暂时显存区的数据送到LCM
; 123.	        Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(ASCII_LARGE_HEIGHT_DEF/2)*2, 
; 124.	                                        (ASCII_LARGE_HEIGHT_DEF/2)*tmpwidth*2);
; 125.	        //坐标移到下一个字的左上角
; 126.	        //region.x += ASCII_LARGE_WIDTH_DEF;
; 127.	        //region.y -= ASCII_LARGE_HEIGHT_DEF/2;
; 128.	        break;
?0015:
; 129.	#if  0    
; 130.	    case CharMode1616://16*16点阵模式(汉字)
; 131.	        //设置字模输出的大小(上半个汉字)
; 132.	        if (colcnt >= 16)
; 133.	        {//计数值超出
; 134.	            Hdrv_SetDrawMode(DrawModeH_def);    //把显示模式设置成横向显示模
; 135.	            return FALSE;
; 136.	        }
; 137.	        //确定输出区域
; 138.	        region.x = CRregion->x;
; 139.	        region.y = CRregion->y;
; 140.	        region.width = CRregion->width;
; 141.	        region.height = CHINESE_HEIGHT_DEF/2;
; 142.	        region.y += CHINESE_HEIGHT_DEF/2;//Y坐标加8准备输出下区(下半个汉字)
; 143.	        Hdrv_SetWindow(&region);
; 144.	
; 145.	        //取最小的值.
; 146.	        tmpwidth = (CRregion->width < (16-colcnt))? (CRregion->width):(16-colcnt); 
; 147.	
; 148.	        //把黑白字模转为彩色字模放在Buff中
; 149.	        //putCharChFlag=4;
; 150.	        BlackCharToColor(CHINESE_WIDTH_DEF, CharPointBuffer + CHINESE_WIDTH_DEF);
; 151.	        //putCharChFlag=8; 
; 152.	        //BlackCharToColor(CHINESE_WIDTH_DEF, CharPointBuffer);
; 153.	
; 154.	        //把暂时显存区的数据送到LCM
; 155.	        Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(CHINESE_HEIGHT_DEF/2)*2, 
; 156.	                                        (CHINESE_HEIGHT_DEF/2)*tmpwidth*2);        
; 157.	        region.y -= CHINESE_HEIGHT_DEF/2;//Y坐标加8准备输出下区(下半个汉字)
; 158.	        region.height = CHINESE_HEIGHT_DEF/2;
; 159.	        Hdrv_SetWindow(&region);        
; 160.	        //BlackCharToColor(CHINESE_WIDTH_DEF, CharPointBuffer + CHINESE_WIDTH_DEF);        
; 161.	        BlackCharToColor(CHINESE_WIDTH_DEF, CharPointBuffer);
; 162.	        //把暂时显存区的数据送到LCM
; 163.	        Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(CHINESE_HEIGHT_DEF/2)*2, 
; 164.	                                        (CHINESE_HEIGHT_DEF/2)*tmpwidth*2);
; 165.	                                                        
; 166.	        break;
; 167.	#endif        
; 168.	    default:
; 169.	        break;
?0002:
; 170.	    }
; 171.	    Hdrv_SetDrawMode(DrawModeH_def);    //把显示模式设置成横向显示模
	LD	DE,0
	CALL	Hdrv_SetDrawMode
; 172.	    return TRUE;
	LD	A,1
; 173.	
; 174.	
; 175.	}
?0016:
	LD	SP,IX
	POP	IX
	POP	IY
	RET
?0023:
	CALL	BlackCharToColor
	LD	L,(IX-4)
	LD	H,0
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	C,L
	LD	B,H
	LD	L,(IX+6)
	LD	H,0
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	DE,DisplayBuffer
	ADD	HL,DE
	EX	DE,HL
	CALL	Hdrv_BuffDataTrans
	RET
	END

⌨️ 快捷键说明

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