📄 lcd_gbk.lst
字号:
1 .file "LCD_GBK.c"
2 __SREG__ = 0x3f
3 __SP_H__ = 0x3e
4 __SP_L__ = 0x3d
5 __tmp_reg__ = 0
6 __zero_reg__ = 1
7 .global __do_copy_data
8 .global __do_clear_bss
10 .text
11 .Ltext0:
91 .global Unicode_to_GBK
93 Unicode_to_GBK:
1:LCD\LCD_GBK.c **** /*****************************************************/
2:LCD\LCD_GBK.c **** /* File name : LCD_GBK.c */
3:LCD\LCD_GBK.c **** /* Description : code for displaying a GBK characters, */
4:LCD\LCD_GBK.c **** /* Platform : AVRStudio4.13 + WinAVR20070525 for AVR */
5:LCD\LCD_GBK.c **** /* Author : Michael Zhang - 章其波 */
6:LCD\LCD_GBK.c **** /* Email : sudazqb@163.com */
7:LCD\LCD_GBK.c **** /* MSN : zhangqibo_1985@hotmail.com */
8:LCD\LCD_GBK.c **** /* Date : 2007-1-2 */
9:LCD\LCD_GBK.c **** /* NOT FOR COMMERCIAL USE, ALL RIGHT RESERVED! */
10:LCD\LCD_GBK.c **** /*****************************************************/
11:LCD\LCD_GBK.c **** /* Change Log: */
12:LCD\LCD_GBK.c **** /* 20071109: add a faster display function for 3310 */
13:LCD\LCD_GBK.c **** /* 20070102: original version */
14:LCD\LCD_GBK.c **** /*****************************************************/
15:LCD\LCD_GBK.c ****
16:LCD\LCD_GBK.c ****
17:LCD\LCD_GBK.c **** #include"LCD_GBK.h"
18:LCD\LCD_GBK.c ****
19:LCD\LCD_GBK.c **** unsigned long GBK12,GBK16,GBK2UNI,UNI2GBK;//用于存放四个文件的起始扇区
20:LCD\LCD_GBK.c **** extern unsigned long FirstDataSector;//第一个数据扇区
21:LCD\LCD_GBK.c **** extern unsigned int SectorsPerClust;//每簇扇区数
22:LCD\LCD_GBK.c **** extern unsigned int BytesPerSector;//每扇区字节数
23:LCD\LCD_GBK.c ****
24:LCD\LCD_GBK.c **** unsigned char GBK_Buffer[32];//单个汉字点阵数据缓冲
25:LCD\LCD_GBK.c ****
26:LCD\LCD_GBK.c **** unsigned char GBK_Ini()//gbk初始化
27:LCD\LCD_GBK.c **** {
28:LCD\LCD_GBK.c **** GBK12 = FAT_Open("\\st12.sys");//打开文件,得到簇号
29:LCD\LCD_GBK.c **** if(GBK12 == 1)return 1;
30:LCD\LCD_GBK.c **** GBK16 = FAT_Open("\\st16.sys");
31:LCD\LCD_GBK.c **** if(GBK16 == 1)return 1;
32:LCD\LCD_GBK.c **** GBK2UNI = FAT_Open("\\gbk2uni.sys");
33:LCD\LCD_GBK.c **** if(GBK2UNI == 1)return 1;
34:LCD\LCD_GBK.c **** UNI2GBK = FAT_Open("\\uni2gbk.sys");
35:LCD\LCD_GBK.c **** if(UNI2GBK == 1)return 1;
36:LCD\LCD_GBK.c ****
37:LCD\LCD_GBK.c **** //将簇号转成扇区号
38:LCD\LCD_GBK.c **** GBK12 = (unsigned long)FirstDataSector+(unsigned long)(GBK12 - 2)*(unsigned long)SectorsPerClust;/
39:LCD\LCD_GBK.c **** GBK16 = (unsigned long)FirstDataSector+(unsigned long)(GBK16 - 2)*(unsigned long)SectorsPerClust;/
40:LCD\LCD_GBK.c **** GBK2UNI = (unsigned long)FirstDataSector+(unsigned long)(GBK2UNI - 2)*(unsigned long)SectorsPerClu
41:LCD\LCD_GBK.c **** UNI2GBK = (unsigned long)FirstDataSector+(unsigned long)(UNI2GBK - 2)*(unsigned long)SectorsPerClu
42:LCD\LCD_GBK.c ****
43:LCD\LCD_GBK.c **** return 0;
44:LCD\LCD_GBK.c **** }
45:LCD\LCD_GBK.c ****
46:LCD\LCD_GBK.c **** unsigned char Unicode_to_GBK(unsigned char *ch)
47:LCD\LCD_GBK.c **** {
94 push r12
95 push r13
96 push r14
97 push r15
98 0000 AF92 push r16
99 0002 BF92 push r17
100 0004 CF92 push r28
101 0006 DF92 push r29
102 0008 EF92 in r28,__SP_L__
103 000a FF92 in r29,__SP_H__
104 000c 0F93 subi r28,lo8(512)
105 000e 1F93 sbci r29,hi8(512)
106 0010 CF93 in __tmp_reg__,__SREG__
107 0012 DF93 cli
108 0014 CDB7 out __SP_H__,r29
109 0016 DEB7 out __SREG__,__tmp_reg__
110 0018 C050 out __SP_L__,r28
111 001a D240 /* prologue end (size=19) */
112 001c 0FB6 movw r12,r24
114 0020 DEBF .LM1:
115 0022 0FBE movw r26,r24
116 0024 CDBF ld r16,X+
117 ld r17,X
48:LCD\LCD_GBK.c **** unsigned int temp;
49:LCD\LCD_GBK.c **** unsigned int sector_offset;//扇区偏移
50:LCD\LCD_GBK.c **** unsigned int byte_offset;//字节偏移
51:LCD\LCD_GBK.c **** unsigned char buffer[512];
52:LCD\LCD_GBK.c **** temp = *((unsigned int*)ch);//由于FAT中文件民unicode码是 地字节在前,所以要按uint型读
119 968))
120 sbci r17,hi8(-(-19968))
122 002a 0D91 .LM3:
123 002c 1C91 lsl r16
53:LCD\LCD_GBK.c **** temp -= 0x4e00;//减去基础数据
124 r17
126 002e 0050 .LM4:
127 0030 1E44 lds r10,BytesPerSector
54:LCD\LCD_GBK.c **** temp *= 2;//每个汉字两个字节
128 r11,(BytesPerSector)+1
130 0032 000F .LM5:
131 0034 111F movw r24,r16
55:LCD\LCD_GBK.c **** sector_offset = temp/BytesPerSector;//计算出扇区偏移,确定存在哪个扇区
132 w r22,r10
133 call __udivmodhi4
134 0036 A090 0000 ldi r24,lo8(0)
135 003a B090 0000 ldi r25,hi8(0)
56:LCD\LCD_GBK.c **** byte_offset = temp%BytesPerSector;//存在哪个字节
57:LCD\LCD_GBK.c **** if(FAT_ReadSector(UNI2GBK + sector_offset,buffer))return 1;//读那个扇区
136 r18,UNI2GBK
137 lds r19,(UNI2GBK)+1
138 003e C801 lds r20,(UNI2GBK)+2
139 0040 B501 lds r21,(UNI2GBK)+3
140 0042 0E94 0000 add r22,r18
141 0046 80E0 adc r23,r19
142 0048 90E0 adc r24,r20
143 004a 2091 0000 adc r25,r21
144 004e 3091 0000 lds r30,FAT_ReadSector
145 0052 4091 0000 lds r31,(FAT_ReadSector)+1
146 0056 5091 0000 movw r14,r28
147 005a 620F sec
148 005c 731F adc r14,__zero_reg__
149 005e 841F adc r15,__zero_reg__
150 0060 951F movw r20,r14
151 0062 E091 0000 icall
152 0066 F091 0000 tst r24
153 006a 7E01 breq .L2
155 006e E11C .LM6:
156 0070 F11C ldi r24,lo8(1)
157 0072 A701 ldi r25,hi8(1)
158 0074 0995 rjmp .L4
159 0076 8823 .L2:
161 .LM7:
162 movw r24,r16
163 007a 81E0 movw r22,r10
164 007c 90E0 call __udivmodhi4
165 007e 00C0 movw r30,r24
167 .LM8:
168 add r14,r24
169 0080 C801 adc r15,r25
170 0082 B501 movw r26,r14
171 0084 0E94 0000 ld r24,X
172 0088 FC01 movw r26,r12
58:LCD\LCD_GBK.c **** *ch = buffer[byte_offset];//将数据读出
173
174 .LM9:
175 008a E80E add r30,r28
176 008c F91E adc r31,r29
177 008e D701 ldd r24,Z+2
178 0090 8C91 movw r30,r12
179 0092 D601 std Z+1,r24
180 0094 8C93 ldi r24,lo8(0)
59:LCD\LCD_GBK.c **** *(ch+1) = buffer[byte_offset+1];
181 5,hi8(0)
182 .L4:
183 0096 EC0F /* epilogue: frame size=512 */
184 0098 FD1F subi r28,lo8(-512)
185 009a 8281 sbci r29,hi8(-512)
186 009c F601 in __tmp_reg__,__SREG__
187 009e 8183 cli
188 00a0 80E0 out __SP_H__,r29
189 00a2 90E0 out __SREG__,__tmp_reg__
190 out __SP_L__,r28
191 pop r29
192 00a4 C050 pop r28
193 00a6 DE4F pop r17
194 00a8 0FB6 pop r16
195 00aa F894 pop r15
196 00ac DEBF pop r14
197 00ae 0FBE pop r13
198 00b0 CDBF pop r12
199 00b2 DF91 pop r11
200 00b4 CF91 pop r10
201 00b6 1F91 ret
202 00b8 0F91 /* epilogue end (size=18) */
203 00ba FF90 /* function Unicode_to_GBK size 100 (63) */
208 00c4 AF90 .Lscope1:
211 .global GBK_to_Unicode
213 GBK_to_Unicode:
215 .LM10:
216 .LFBB2:
217 /* prologue: frame size=0 */
218 /* prologue end (size=0) */
220 .LM11:
221 ldi r24,lo8(0)
60:LCD\LCD_GBK.c **** return 0;
61:LCD\LCD_GBK.c **** }
62:LCD\LCD_GBK.c ****
63:LCD\LCD_GBK.c **** unsigned char GBK_to_Unicode(unsigned char *ch)
64:LCD\LCD_GBK.c **** {
222 */
223 ret
224 /* epilogue end (size=1) */
225 /* function GBK_to_Unicode size 3 (2) */
65:LCD\LCD_GBK.c **** return 0;
66:LCD\LCD_GBK.c **** }
227 pe2:
230 00ca 90E0 .global Read_One_GBK12
232 00cc 0895 Read_One_GBK12:
234 .LM12:
235 .LFBB3:
236 /* prologue: frame size=512 */
237 push r4
238 push r5
239 push r6
240 push r7
241 push r8
67:LCD\LCD_GBK.c ****
68:LCD\LCD_GBK.c **** unsigned char Read_One_GBK12(unsigned char *ch)
69:LCD\LCD_GBK.c **** {
242 r10
243 push r11
244 push r12
245 push r13
246 00ce 4F92 push r14
247 00d0 5F92 push r15
248 00d2 6F92 push r16
249 00d4 7F92 push r17
250 00d6 8F92 push r28
251 00d8 9F92 push r29
252 00da AF92 in r28,__SP_L__
253 00dc BF92 in r29,__SP_H__
254 00de CF92 subi r28,lo8(512)
255 00e0 DF92 sbci r29,hi8(512)
256 00e2 EF92 in __tmp_reg__,__SREG__
257 00e4 FF92 cli
258 00e6 0F93 out __SP_H__,r29
259 00e8 1F93 out __SREG__,__tmp_reg__
260 00ea CF93 out __SP_L__,r28
261 00ec DF93 /* prologue end (size=25) */
262 00ee CDB7 movw r30,r24
264 00f2 C050 .LM13:
265 00f4 D240 ld r24,Z
266 00f6 0FB6 mov r22,r24
267 00f8 F894 ldi r23,lo8(0)
268 00fa DEBF ldi r24,lo8(0)
269 00fc 0FBE ldi r25,hi8(0)
271 .LM14:
272 0100 FC01 ldd r17,Z+1
70:LCD\LCD_GBK.c **** unsigned long temp1;
71:LCD\LCD_GBK.c **** unsigned char temp2;
72:LCD\LCD_GBK.c **** unsigned int sector_offset;
73:LCD\LCD_GBK.c **** unsigned int byte_offset;
74:LCD\LCD_GBK.c **** unsigned char buffer[512];
75:LCD\LCD_GBK.c **** temp1=*ch;
273 M15:
274 cpi r22,lo8(129)
275 0102 8081 cpc r23,__zero_reg__
276 0104 682F cpc r24,__zero_reg__
277 0106 70E0 cpc r25,__zero_reg__
278 0108 80E0 brsh .+2
279 010a 90E0 rjmp .L9
76:LCD\LCD_GBK.c **** temp2=*(ch+1);
280 68,0,77,.LM16-.LFBB3
281 .LM16:
282 010c 1181 cpi r17,lo8(64)
77:LCD\LCD_GBK.c **** if(temp1<0x81||temp2<0x40)return 1;
283 sh .+2
284 rjmp .L9
286 0110 7105 .LM17:
287 0112 8105 subi r22,lo8(-(-129))
288 0114 9105 sbci r23,hi8(-(-129))
289 0116 00F4 sbci r24,hlo8(-(-129))
290 0118 00C0 sbci r25,hhi8(-(-129))
292 .LM18:
293 011a 1034 ldi r18,lo8(192)
294 011c 00F4 ldi r19,hi8(192)
295 011e 00C0 ldi r20,hlo8(192)
78:LCD\LCD_GBK.c **** temp1-=0x81;
296 (192)
297 call __mulsi3
299 0122 7040 .LM19:
300 0124 8040 subi r17,lo8(-(-64))
301 0126 9040 add r22,r17
79:LCD\LCD_GBK.c **** temp2-=0x40;
80:LCD\LCD_GBK.c **** temp1*=192;//xx7f and xxff are included
302 23,__zero_reg__
303 adc r24,__zero_reg__
304 0128 20EC adc r25,__zero_reg__
306 012c 40E0 .LM20:
307 012e 50E0 ldi r18,lo8(24)
308 0130 0E94 0000 ldi r19,hi8(24)
81:LCD\LCD_GBK.c **** temp1+=temp2;
309 0,hlo8(24)
310 ldi r21,hhi8(24)
311 0134 1054 call __mulsi3
312 0136 610F movw r10,r22
313 0138 711D movw r12,r24
315 013c 911D .LM21:
82:LCD\LCD_GBK.c **** temp1*=24;
316 4,BytesPerSector
317 lds r25,(BytesPerSector)+1
318 013e 28E1 movw r14,r24
319 0140 30E0 ldi r16,lo8(0)
320 0142 40E0 ldi r17,hi8(0)
322 0146 0E94 0000 .LM22:
323 014a 5B01 movw r24,r12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -