sdrv_puts_thai.s01
来自「一种彩屏驱动以及画点,填充图片和填充数据的一些程序」· S01 代码 · 共 241 行
S01
241 行
NAME sdrv_puts_thai(16)
RSEG BBC_PUTS(0)
RSEG IDATA0(0)
RSEG CDATA0(0)
EXTERN AsciiSelect
EXTERN CheckSymbol
EXTERN NextSFlag
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
LD IX,0
ADD IX,SP
PUSH BC
PUSH AF
PUSH AF
PUSH AF
PUSH AF
PUSH DE
POP IY
; 47. int code;
; 48. //char nextcode;
; 49. char result;
; 50. char *lastcharpt;//记录上一个字符的指针
; 51. BYTE lineNum_sav,rowNum_sav;//行号记录
; 52.
; 53. lineNum_sav = region.y;
LD A,(region+1)
LD (IX-10),A
; 54. rowNum_sav = region.x;
LD A,(region)
LD (IX-9),A
; 55.
; 56. //判断要输出的行的高度
; 57. //if (AsciiSelect == FONT_TYPE_SMALL)
; 58. //{
; 59. // StrHeight = ASCII_SMALL_HEIGHT_DEF;//一行字符的高度
; 60. //}
; 61. //else
; 62. //{
; 63. // StrHeight = ASCII_LARGE_HEIGHT_DEF;//一行字符的高度
; 64. //}
; 65.
; 66. StrHeight = ASCII_LARGE_HEIGHT_DEF;//一行字符的高度
LD A,16
LD (StrHeight),A
?0001:
; 67.
; 68. while ( (*str != '\r') //碰到回车时退出
; 69. && (*str != '\0') //碰到结束符时退出
; 70. && (strlen != NULL) ) //碰到字符长度为0时退出
LD A,(IY+0)
CP 13
JR Z,?0000
XOR A
OR (IY+0)
JR Z,?0000
XOR A
OR (IX-2)
JR Z,?0000
?0004:
?0003:
?0002:
; 71. {
; 72. lastcharpt = str;
PUSH IY
POP HL
LD (IX-8),L
LD (IX-7),H
; 73. //下面是碰到换行符时要作换行处理
; 74. if (*str == '\n')
LD A,(IY+0)
CP 10
JR NZ,?0009
?0005:
; 75. {
; 76. str++;
; 77. //region.x = 0;
; 78. region.x = rowNum_sav;
LD A,(IX-9)
LD (region),A
; 79. region.y += StrHeight;
LD A,(StrHeight)
LD B,A
LD A,(region+1)
ADD A,B
LD (region+1),A
; 80. lineNum_sav = region.y;//保存当前行顶的y轴坐标
LD (IX-10),A
; 81. if (AsciiSelect == FONT_TYPE_SMALL)
?0007:
; 82. {
; 83. StrHeight = CHINESE_HEIGHT_DEF;//一行字符的高度
; 84. }
; 85. else
?0008:
; 86. {
; 87. StrHeight = CHINESE_HEIGHT_DEF;//一行字符的高度
LD A,16
LD (StrHeight),A
INC IY
?0009:
?0006:
; 88. }
; 89.
; 90. }
; 91.
; 92. //汉字和ASCII的不同处理
; 93. if (*str >= 0xa0)
LD A,(IY+0)
CP 160
JR C,?0011
?0010:
; 94. {//汉字
; 95. //nextcode = *(str+1);
; 96. //if((nextcode == 0xd1)||((nextcode >= 0xd4)&&(nextcode <= 0xda))||
; 97. // ((nextcode >= 0xe7)&&(nextcode <= 0xee)))NextSFlag = 1;
; 98. //else NextSFlag = 0;
; 99. //NextSFlag = CheckSymbol(nextcode);
; 100. NextSFlag = CheckSymbol(*(str+1));
LD E,(IY+1)
LD D,0
CALL CheckSymbol
LD (NextSFlag),A
?0011:
; 101. }
; 102. //else
; 103. //{//ASCII
; 104. code = *str;
LD E,(IY+0)
LD D,0
; 105. StrHeight = 16;//CHINESE_HEIGHT_DEF+2;//把当前行的高度设为汉字的高度
LD A,16
LD (StrHeight),A
; 106. //}
; 107. str++;
; 108. result = Sdrv_PutChar(code);
CALL Sdrv_PutChar
; 109. if (!result) //输出字符
OR A
INC IY
JR NZ,?0013
?0012:
; 110. {
; 111. //当输出区域超出范围时退出
; 112. return lastcharpt;//返回上一个字符的指针,因为当前指针已加一了
LD L,(IX-8)
LD H,(IX-7)
; 113. }
JR ?0018
?0013:
; 114. (unsigned char)strlen--;//不理负号直接减(因为0xff时表示显示全部)
DEC (IX-2)
; 115. region.y = lineNum_sav;//恢复当前行顶y的轴坐标
LD A,(IX-10)
LD (region+1),A
; 116. if ( ((unsigned char)strlen > 200) && (region.x > 188) )
LD A,200
CP (IX-2)
JR NC,?0001
LD A,(region)
LD B,A
LD A,188
CP B
JP NC,?0001
?0017:
?0016:
?0014:
; 117. {
; 118. break;
?0015:
?0000:
; 119. }
; 120. }
; 121. return str;
PUSH IY
POP HL
; 122. }
?0018:
LD SP,IX
POP IX
POP IY
RET
RSEG IDATA0
StrHeight:
DEFS 1
RSEG CDATA0
DEFB 8
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?