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