sdrv_puts_jp.s01

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

S01
279
字号
	NAME	sdrv_puts_jp(16)
	RSEG	BBC_PUTS(0)
	RSEG	IDATA0(0)
	RSEG	CDATA0(0)
	EXTERN	AsciiSelect
	EXTERN	Sdrv_PutChar
	PUBLIC	Sdrv_PutS
	PUBLIC	StrHeight
	EXTERN	region
	EXTERN	?CLZ80L_4_04_L00
	RSEG	BBC_PUTS
Sdrv_PutS:
; 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_PutS.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_PUTS)
; 18.	#pragma memory=default
; 19.	
; 20.	#pragma memory=dataseg(BBD_PUTS)
; 21.	#pragma memory=default
; 22.	
; 23.	#pragma codeseg(BBC_PUTS)
; 24.	
; 25.	//BYTE lineNum_sav;//行号记录
; 26.	
; 27.	//如果一行都是small ascii则高度为8(默认),如有一行中有一个是汉字或是 large 模式 ascii
; 28.	// 则高度都为 16
; 29.	BYTE StrHeight = ASCII_SMALL_HEIGHT_DEF;//一行字的高度
; 30.	
; 31.	////*******************************************************************************/
; 32.	///*
; 33.	//** FUNCTION:     Sdrv_PutS
; 34.	//**
; 35.	//** Description:  在屏幕上输出一个字符串,如串的长度超过屏幕,则多出部分不显示
; 36.	//**                   指针停在最后一个能显示的字的下一个字符左上角,碰到回车或
; 37.	//**                   串尾时退出,碰到换行时从下一行开始显示
; 38.	//**  input
; 39.	//**     str: 字符串首址 ;
; 40.	//**     strlen: 字符串的长度
; 41.	//**
; 42.	//**  output
; 43.	//**     none
; 44.	//********************************************************************************/
; 45.	non_banked char *Sdrv_PutS(const char *str, signed char strlen)
; 46.	{
	PUSH	IY
	PUSH	IX
	PUSH	BC
	PUSH	AF
	PUSH	AF
	PUSH	AF
	PUSH	DE
	POP	IX
; 47.	    int code;
; 48.	    char result;
; 49.	    char *lastcharpt;//记录上一个字符的指针
; 50.	    BYTE lineNum_sav,rowNum_sav;//行号记录
; 51.	
; 52.	    lineNum_sav = region.y;
	LD	A,(region+1)
	LD	HL,0
	ADD	HL,SP
	LD	(HL),A
; 53.	    rowNum_sav = region.x;
	INC	HL
	LD	A,(region)
	LD	(HL),A
; 54.	
; 55.	        //判断要输出的行的高度
; 56.	    //if (AsciiSelect == FONT_TYPE_SMALL)
; 57.	    //{
; 58.	    //  StrHeight = ASCII_SMALL_HEIGHT_DEF;//一行字符的高度
; 59.	    //}
; 60.	    //else
; 61.	    //{
; 62.	    //  StrHeight = ASCII_LARGE_HEIGHT_DEF;//一行字符的高度
; 63.	    //}
; 64.	
; 65.	    StrHeight = ASCII_LARGE_HEIGHT_DEF;//一行字符的高度
	LD	A,16
	LD	(StrHeight),A
?0001:
; 66.	        
; 67.	    while ( (*str != '\r')      //碰到回车时退出
; 68.	            && (*str != '\0')   //碰到结束符时退出
; 69.	            && (strlen != NULL) )  //碰到字符长度为0时退出
	LD	A,(IX+0)
	CP	13
	JP	Z,?0000
	XOR	A
	OR	(IX+0)
	JP	Z,?0000
	LD	HL,6
	ADD	HL,SP
	XOR	A
	OR	(HL)
	JP	Z,?0000
?0004:
?0003:
?0002:
; 70.	    {
; 71.	        lastcharpt = str;
	LD	HL,2
	ADD	HL,SP
	PUSH	IX
	POP	BC
	LD	(HL),C
	INC	HL
	LD	(HL),B
; 72.	        //下面是碰到换行符时要作换行处理
; 73.	        if (*str == '\n')
	LD	A,(BC)
	CP	10
	JR	NZ,?0009
?0005:
; 74.	        {
; 75.	                str++;
; 76.	                //region.x = 0;
; 77.	                region.x = rowNum_sav;
	DEC	HL
	DEC	HL
	LD	A,(HL)
	LD	(region),A
; 78.	                region.y += StrHeight;
	LD	A,(StrHeight)
	LD	B,A
	LD	A,(region+1)
	ADD	A,B
	LD	(region+1),A
; 79.	                lineNum_sav = region.y;//保存当前行顶的y轴坐标
	DEC	HL
	LD	(HL),A
; 80.	                if (AsciiSelect == FONT_TYPE_SMALL)
?0007:
; 81.	                {
; 82.	                        StrHeight = CHINESE_HEIGHT_DEF;//一行字符的高度
; 83.	                }
; 84.	                else
?0008:
; 85.	                {
; 86.	                        StrHeight = CHINESE_HEIGHT_DEF;//一行字符的高度
	LD	A,16
	LD	(StrHeight),A
	INC	IX
?0009:
?0006:
; 87.	                }
; 88.	
; 89.	        }
; 90.	
; 91.	        //汉字和ASCII的不同处理
; 92.	        if (*str >= 0x81)
	LD	A,(IX+0)
	CP	129
	JR	C,?0011
?0010:
; 93.	        {//汉字
; 94.	            code = *(int *)str;
	LD	L,(IX+0)
	LD	H,(IX+1)
	PUSH	HL
	POP	IY
; 95.	            str++;//汉字指针要比ASCII多加一,
; 96.	            StrHeight = 16;//CHINESE_HEIGHT_DEF+2;//把当前行的高度设为汉字的高度
	INC	IX
	JR	?0023
; 97.	        }
; 98.	        else
?0011:
; 99.	        {//ASCII
; 100.	            code = *str;
	LD	C,(IX+0)
	LD	B,0
	PUSH	BC
	POP	IY
; 101.	            //这里保证ascii码与汉字下对齐
; 102.	           /*
; 103.	            if (AsciiSelect == FONT_TYPE_SMALL)
; 104.	            {
; 105.	                                region.y += (StrHeight-ASCII_SMALL_HEIGHT_DEF);
; 106.	                        }
; 107.	                        else
; 108.	                        {
; 109.	                                region.y += (StrHeight-ASCII_LARGE_HEIGHT_DEF);
; 110.	                        }
; 111.	           */
; 112.	           StrHeight = 16;//CHINESE_HEIGHT_DEF+2;//把当前行的高度设为汉字的高度
?0023:
	LD	A,16
	LD	(StrHeight),A
?0012:
; 113.	        }
; 114.	        str++;
; 115.	        result = Sdrv_PutChar(code);
	PUSH	IY
	POP	DE
	CALL	Sdrv_PutChar
	LD	HL,4
	ADD	HL,SP
	LD	(HL),A
; 116.	        if (!result) //输出字符
	XOR	A
	OR	(HL)
	INC	IX
	JR	NZ,?0014
?0013:
; 117.	        {
; 118.	                //当输出区域超出范围时退出
; 119.	            return lastcharpt;//返回上一个字符的指针,因为当前指针已加一了
	DEC	HL
	DEC	HL
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
; 120.	        }
	JR	?0019
?0014:
; 121.	        (unsigned char)strlen--;//不理负号直接减(因为0xff时表示显示全部)
	INC	HL
	INC	HL
	DEC	(HL)
; 122.	        region.y = lineNum_sav;//恢复当前行顶y的轴坐标
	LD	HL,0
	ADD	HL,SP
	LD	A,(HL)
	LD	(region+1),A
; 123.	                                if ( ((unsigned char)strlen > 200) && (region.x > 188) )
	LD	HL,6
	ADD	HL,SP
	LD	A,200
	CP	(HL)
	JP	NC,?0001
	LD	A,(region)
	LD	B,A
	LD	A,188
	CP	B
	JP	NC,?0001
?0018:
?0017:
?0015:
; 124.	        { 
; 125.	            break;
?0016:
?0000:
; 126.	        }        
; 127.	    }
; 128.	    return str;
	PUSH	IX
	POP	HL
; 129.	}
?0019:
	POP	AF
	POP	AF
	POP	AF
	POP	AF
	POP	IX
	POP	IY
	RET
	RSEG	IDATA0
StrHeight:
	DEFS	1
	RSEG	CDATA0
	DEFB	8
	END

⌨️ 快捷键说明

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