sdrv_charoutrect_latin1.s01
来自「MP3 整个 SDK」· S01 代码 · 共 399 行
S01
399 行
NAME sdrv_charoutrect_latin1(16)
RSEG BBC_PUTS(0)
EXTERN BlackCharToColor
EXTERN CharPointBuffer
EXTERN DisplayBuffer
EXTERN Hdrv_BuffDataTrans
EXTERN Hdrv_SetDrawMode
EXTERN Hdrv_SetWindow
EXTERN PutCharErrFlag
PUBLIC Sdrv_CharOutRect
EXTERN Sdrv_GetFontPoint
EXTERN putCharChFlag
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,?0031
?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 = CharMode0608;
; 58. charmode = CharMode0816;
; 59. switch(charmode)
LD A,1
CP 0
JR NZ,?0009
?0003:
; 60. {
; 61. case CharMode0608://06*08点阵模式(ascii小字体)
; 62.
; 63. if (colcnt >= 6)
LD A,(IX+6)
CP 6
JP NC,?0032
?0004:
; 64. {//计数值超出
; 65. Hdrv_SetDrawMode(DrawModeH_def); //把显示模式设置成横向显示模
; 66. return FALSE;
; 67. }
?0005:
; 68. //确定输出区域
; 69. region.x = CRregion->x;
; 70. region.y = CRregion->y;
; 71. region.width = CRregion->width;
; 72. region.height = ASCII_SMALL_HEIGHT_DEF;
; 73. Hdrv_SetWindow(®ion);
CALL ?0035
; 74.
; 75. //取最小的值.
; 76. 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,?0023
XOR H
?0023:
JP P,?0007
LD A,(IY+2)
JR ?0008
?0007:
LD A,6
SUB (IX+6)
?0008:
LD (IX-4),A
; 77.
; 78. //把黑白字模转为彩色字模放在Buff中
; 79. BlackCharToColor(ASCII_SMALL_WIDTH_DEF, CharPointBuffer);
LD BC,CharPointBuffer
LD DE,6
JP ?0033
; 80. //把暂时显存区的数据送到LCM
; 81. Hdrv_BuffDataTrans(DisplayBuffer+colcnt*ASCII_SMALL_HEIGHT_DEF*2,
; 82. ASCII_SMALL_HEIGHT_DEF*tmpwidth*2);
; 83.
; 84. //region.x += ASCII_SMALL_WIDTH_DEF;//坐标移到下一个字的左上角
; 85. break;
?0009:
CP 1
JR NZ,?0015
; 86.
; 87. case CharMode0816://08*16点阵模式(ascii大字体)
; 88. //设置字模输出的大小//上半个字
; 89. //region.width = ASCII_LARGE_WIDTH_DEF;
; 90. if (colcnt >= 8)
LD A,(IX+6)
CP 8
JR NC,?0032
?0010:
; 91. {//计数值超出
; 92. Hdrv_SetDrawMode(DrawModeH_def); //把显示模式设置成横向显示模
; 93. return FALSE;
; 94. }
?0011:
; 95. //确定输出区域
; 96. region.x = CRregion->x;
; 97. region.y = CRregion->y;
; 98. region.width = CRregion->width;
; 99. region.height = ASCII_LARGE_HEIGHT_DEF/2;
; 100. Hdrv_SetWindow(®ion);
CALL ?0035
; 101.
; 102. //取最小的值.
; 103. 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,?0024
XOR H
?0024:
JP P,?0013
LD A,(IY+2)
JR ?0014
?0013:
LD A,8
SUB (IX+6)
?0014:
LD (IX-4),A
; 104.
; 105. //把黑白字模转为彩色字模放在Buff中(上区)
; 106. //BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer);
; 107. BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer + ASCII_LARGE_WIDTH_DEF);
LD BC,CharPointBuffer+8
LD DE,8
CALL ?0038
; 108. //把暂时显存区的数据送到LCM
; 109. Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(ASCII_LARGE_HEIGHT_DEF/2)*2,
; 110. (ASCII_LARGE_HEIGHT_DEF/2)*tmpwidth*2);
; 111.
; 112. region.y += ASCII_LARGE_HEIGHT_DEF/2;//Y坐标加8准备输出下区(下半个字)
LD A,(region+1)
ADD A,8
LD (region+1),A
; 113. Hdrv_SetWindow(®ion);
CALL ?0036
; 114. //BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer + ASCII_LARGE_WIDTH_DEF);
; 115. BlackCharToColor(ASCII_LARGE_WIDTH_DEF, CharPointBuffer);
LD BC,CharPointBuffer
LD DE,8
JP ?0033
; 116. //把暂时显存区的数据送到LCM
; 117. Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(ASCII_LARGE_HEIGHT_DEF/2)*2,
; 118. (ASCII_LARGE_HEIGHT_DEF/2)*tmpwidth*2);
; 119. //坐标移到下一个字的左上角
; 120. //region.x += ASCII_LARGE_WIDTH_DEF;
; 121. //region.y -= ASCII_LARGE_HEIGHT_DEF/2;
; 122. break;
?0015:
CP 2
JP NZ,?0002
; 123.
; 124. case CharMode1616://16*16点阵模式(汉字)
; 125. //设置字模输出的大小(上半个汉字)
; 126. if (colcnt >= 16)
LD A,(IX+6)
CP 16
JR C,?0017
?0016:
; 127. {//计数值超出
; 128. Hdrv_SetDrawMode(DrawModeH_def); //把显示模式设置成横向显示模
?0032:
LD DE,0
CALL Hdrv_SetDrawMode
; 129. return FALSE;
?0031:
XOR A
; 130. }
JR ?0022
?0017:
; 131. //确定输出区域
; 132. region.x = CRregion->x;
; 133. region.y = CRregion->y;
; 134. region.width = CRregion->width;
; 135. region.height = CHINESE_HEIGHT_DEF1-8;
; 136. Hdrv_SetWindow(®ion);
CALL ?0035
; 137.
; 138. //取最小的值.
; 139. tmpwidth = (CRregion->width < (16-colcnt))? (CRregion->width):(16-colcnt);
LD C,(IX+6)
LD B,0
LD HL,16
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,?0025
XOR H
?0025:
JP P,?0019
LD A,(IY+2)
JR ?0020
?0019:
LD A,16
SUB (IX+6)
?0020:
LD (IX-4),A
; 140.
; 141. //把黑白字模转为彩色字模放在Buff中
; 142. putCharChFlag=8;
LD A,8
LD (putCharChFlag),A
; 143. BlackCharToColor(CHINESE_WIDTH_DEF1, CharPointBuffer + CHINESE_WIDTH_DEF1);//+8
LD BC,CharPointBuffer+16
LD DE,16
CALL BlackCharToColor
; 144. putCharChFlag=8;
LD A,8
LD (putCharChFlag),A
; 145. //BlackCharToColor(CHINESE_WIDTH_DEF, CharPointBuffer);
; 146.
; 147. //把暂时显存区的数据送到LCM
; 148. Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(CHINESE_HEIGHT_DEF1-8)*2,
; 149. (CHINESE_HEIGHT_DEF1-8)*tmpwidth*2);
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
; 150. region.y += CHINESE_HEIGHT_DEF1-8;//Y坐标加8准备输出下区(下半个汉字) 8
LD A,(region+1)
ADD A,8
LD (region+1),A
; 151. region.height = CHINESE_HEIGHT_DEF1-8;
; 152. Hdrv_SetWindow(®ion);
CALL ?0037
; 153. //BlackCharToColor(CHINESE_WIDTH_DEF, CharPointBuffer + CHINESE_WIDTH_DEF);
; 154. BlackCharToColor(CHINESE_WIDTH_DEF1, CharPointBuffer);
LD BC,CharPointBuffer
LD DE,16
?0033:
CALL ?0038
; 155. //把暂时显存区的数据送到LCM
; 156. Hdrv_BuffDataTrans(DisplayBuffer+colcnt*(CHINESE_HEIGHT_DEF1-8)*2,
; 157. (CHINESE_HEIGHT_DEF1-8)*tmpwidth*2);
; 158.
; 159. break;
?0021:
; 160.
; 161. default:
; 162. break;
?0002:
; 163. }
; 164. Hdrv_SetDrawMode(DrawModeH_def); //把显示模式设置成横向显示模
LD DE,0
CALL Hdrv_SetDrawMode
; 165. return TRUE;
LD A,1
; 166.
; 167.
; 168. }
?0022:
LD SP,IX
POP IX
POP IY
RET
?0035:
LD A,(IY+0)
LD (region),A
LD A,(IY+1)
LD (region+1),A
LD A,(IY+2)
LD (region+2),A
?0037:
LD A,8
LD (region+3),A
?0036:
LD DE,region
JP Hdrv_SetWindow
?0038:
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 + -
显示快捷键?