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