📄 lcd_gbk.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -olcd_gbk.o --depend=lcd_gbk.d --device=DARMP --apcs=interwork -O3 -IC:\Keil\ARM\INC\Philips --omf_browse=lcd_gbk.crf LCD_GBK.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
GBK_Ini PROC
;;;28 uint8 GBK_Ini()//gbk初始化
;;;29 {
000000 e92d4010 PUSH {r4,lr}
;;;30 GBK12 = FAT_Open("\\st12.sys");//打开文件,得到簇号
000004 e28f0f91 ADR r0,|L1.592|
000008 ebfffffe BL FAT_Open
00000c e59f4248 LDR r4,|L1.604|
;;;31 if(GBK12 == 1)return 1;
000010 e3500001 CMP r0,#1
000014 e5840000 STR r0,[r4,#0] ;30 ; GBK12
000018 0a000004 BEQ |L1.48|
;;;32 //GBK16 = FAT_Open("\\st16.sys");
;;;33 //if(GBK16 == 1)return 1;
;;;34 //GBK2UNI = FAT_Open("\\gbk2uni.sys");
;;;35 //if(GBK2UNI == 1)return 1;
;;;36 UNI2GBK = FAT_Open("\\uni2gbk.sys");
00001c e28f0f8f ADR r0,|L1.608|
000020 ebfffffe BL FAT_Open
;;;37 if(UNI2GBK == 1)return 1;
000024 e3500001 CMP r0,#1
000028 e584000c STR r0,[r4,#0xc] ;36 ; UNI2GBK
00002c 1a000002 BNE |L1.60|
|L1.48|
000030 e3a00001 MOV r0,#1
|L1.52|
000034 e8bd4010 POP {r4,lr}
;;;38
;;;39 //将簇号转成扇区号
;;;40 GBK12 = (uint32)FirstDataSector+(uint32)(GBK12 - 2)*(uint32)SectorsPerClust;//calculate the actual sector number
;;;41 GBK16 = (uint32)FirstDataSector+(uint32)(GBK16 - 2)*(uint32)SectorsPerClust;//calculate the actual sector number
;;;42 GBK2UNI = (uint32)FirstDataSector+(uint32)(GBK2UNI - 2)*(uint32)SectorsPerClust;//calculate the actual sector number
;;;43 UNI2GBK = (uint32)FirstDataSector+(uint32)(UNI2GBK - 2)*(uint32)SectorsPerClust;//calculate the actual sector number
;;;44
;;;45 return 0;
;;;46 }
000038 e12fff1e BX lr
|L1.60|
00003c e5942000 LDR r2,[r4,#0] ;40 ; GBK12
000040 e59f1228 LDR r1,|L1.624|
000044 e2423002 SUB r3,r2,#2 ;40
000048 e59f2224 LDR r2,|L1.628|
00004c e5911000 LDR r1,[r1,#0] ;40 ; FirstDataSector
000050 e1d220b0 LDRH r2,[r2,#0] ;40 ; SectorsPerClust
000054 e2400002 SUB r0,r0,#2 ;43
000058 e0231392 MLA r3,r2,r3,r1 ;40
00005c e5843000 STR r3,[r4,#0] ;41 ; GBK12
000060 e5943004 LDR r3,[r4,#4] ;41 ; GBK16
000064 e0201092 MLA r0,r2,r0,r1 ;43
000068 e2433002 SUB r3,r3,#2 ;41
00006c e0231392 MLA r3,r2,r3,r1 ;41
000070 e5843004 STR r3,[r4,#4] ;42 ; GBK16
000074 e5943008 LDR r3,[r4,#8] ;42 ; GBK2UNI
000078 e2433002 SUB r3,r3,#2 ;42
00007c e0231392 MLA r3,r2,r3,r1 ;42
000080 e5a43008 STR r3,[r4,#8]! ;43 ; GBK2UNI, UNI2GBK
000084 e5840004 STR r0,[r4,#4] ;43
000088 e3a00000 MOV r0,#0 ;45
00008c eaffffe8 B |L1.52|
;;;47
ENDP
Unicode_to_GBK PROC
;;;50 uint8 Unicode_to_GBK(uint8 *ch)
;;;51 {
000090 e92d4030 PUSH {r4,r5,lr}
000094 e24ddf81 SUB sp,sp,#0x204
000098 e1a05000 MOV r5,r0
;;;52 uint16 temp;
;;;53 uint16 sector_offset;//扇区偏移
;;;54 uint16 byte_offset;//字节偏移
;;;55 uint8 buffer[512];
;;;56 temp = get16_little(ch);//由于FAT中文件民unicode码是 地字节在前,所以要按uint型读
00009c ebfffffe BL get16_little
;;;57 temp -= 0x4e00;//减去基础数据
0000a0 e2400c4e SUB r0,r0,#0x4e00
0000a4 e1a00800 LSL r0,r0,#16
0000a8 e1a00820 LSR r0,r0,#16
;;;58 temp *= 2;//每个汉字两个字节
0000ac e3e01801 MVN r1,#0x10000
0000b0 e0010080 AND r0,r1,r0,LSL #1
;;;59 sector_offset = temp/BytesPerSector;//计算出扇区偏移,确定存在哪个扇区
0000b4 e59f11bc LDR r1,|L1.632|
0000b8 e1d110b0 LDRH r1,[r1,#0] ; BytesPerSector
0000bc ebfffffe BL __aeabi_uidivmod
;;;60 byte_offset = temp%BytesPerSector;//存在哪个字节
0000c0 e1a04001 MOV r4,r1
;;;61 if(FAT_ReadSector(UNI2GBK + sector_offset,buffer))return 1;//读那个扇区
0000c4 e59f1190 LDR r1,|L1.604|
0000c8 e59f21ac LDR r2,|L1.636|
0000cc e591100c LDR r1,[r1,#0xc] ; UNI2GBK
0000d0 e5922000 LDR r2,[r2,#0] ; FAT_ReadSector
0000d4 e0800001 ADD r0,r0,r1
0000d8 e28d1004 ADD r1,sp,#4
0000dc e1a0e00f MOV lr,pc
0000e0 e12fff12 BX r2
0000e4 e3500000 CMP r0,#0
0000e8 13a00001 MOVNE r0,#1
0000ec 1a000006 BNE |L1.268|
;;;62 *ch = buffer[byte_offset];//将数据读出
0000f0 e28d0004 ADD r0,sp,#4
0000f4 e7d01004 LDRB r1,[r0,r4]
;;;63 *(ch+1) = buffer[byte_offset+1];
0000f8 e0800004 ADD r0,r0,r4
0000fc e5c51000 STRB r1,[r5,#0] ;62
000100 e5d00001 LDRB r0,[r0,#1]
000104 e5c50001 STRB r0,[r5,#1]
;;;64 return 0;
000108 e3a00000 MOV r0,#0
|L1.268|
00010c e28ddf81 ADD sp,sp,#0x204
000110 e8bd4030 POP {r4,r5,lr}
;;;65 }
000114 e12fff1e BX lr
;;;66
ENDP
GBK_to_Unicode PROC
;;;68 {
;;;69 return 0;
000118 e3a00000 MOV r0,#0
;;;70 }
00011c e12fff1e BX lr
;;;71
ENDP
Read_One_GBK12 PROC
;;;72 uint8 Read_One_GBK12(uint8 *ch)
;;;73 {
000120 e92d4ff0 PUSH {r4-r11,lr}
;;;74 uint32 temp1;
;;;75 uint8 temp2;
;;;76 uint16 sector_offset;
;;;77 uint16 byte_offset;
;;;78 uint8 buffer[512];
;;;79 temp1=*ch;
000124 e5d01000 LDRB r1,[r0,#0]
;;;80 temp2=*(ch+1);
000128 e5d00001 LDRB r0,[r0,#1]
00012c e24ddf81 SUB sp,sp,#0x204 ;73
;;;81 if(temp1<0x81||temp2<0x40)return 1;
000130 e3510081 CMP r1,#0x81
000134 23500040 CMPCS r0,#0x40
000138 3a00002f BCC |L1.508|
;;;82 temp1-=0x81;
;;;83 temp2-=0x40;
00013c e2400040 SUB r0,r0,#0x40
000140 e2411081 SUB r1,r1,#0x81 ;82
000144 e20000ff AND r0,r0,#0xff
;;;84 temp1*=192;//xx7f and xxff are included
000148 e3a020c0 MOV r2,#0xc0
;;;85 temp1+=temp2;
00014c e0200291 MLA r0,r1,r2,r0
;;;86 temp1*=24;
000150 e3a01018 MOV r1,#0x18
000154 e0000091 MUL r0,r1,r0
;;;87 sector_offset = temp1/BytesPerSector;
000158 e59fb118 LDR r11,|L1.632|
00015c e1db10b0 LDRH r1,[r11,#0] ; BytesPerSector
000160 ebfffffe BL __aeabi_uidivmod
;;;88 byte_offset = temp1%BytesPerSector;
;;;89 if(FAT_ReadSector(GBK12 + sector_offset,buffer))return 1;
000164 e59f90f0 LDR r9,|L1.604|
000168 e59fa10c LDR r10,|L1.636|
00016c e1a06800 LSL r6,r0,#16 ;87
000170 e5990000 LDR r0,[r9,#0] ; GBK12
000174 e1a05801 LSL r5,r1,#16 ;88
000178 e59a2000 LDR r2,[r10,#0] ; FAT_ReadSector
00017c e1a06826 LSR r6,r6,#16 ;87
000180 e1a05825 LSR r5,r5,#16 ;88
000184 e0800006 ADD r0,r0,r6
000188 e28d1004 ADD r1,sp,#4
00018c e1a0e00f MOV lr,pc
000190 e12fff12 BX r2
000194 e3500000 CMP r0,#0
000198 1a000017 BNE |L1.508|
00019c e59f80dc LDR r8,|L1.640|
;;;90 if(byte_offset>488)
0001a0 e3550f7a CMP r5,#0x1e8
0001a4 e28d7004 ADD r7,sp,#4 ;89
;;;91 {
;;;92 for(temp2 = 0,temp1 = byte_offset;temp2<(BytesPerSector - byte_offset);temp2++,temp1++)GBK_Buffer[temp2] = buffer[temp1];
;;;93 if(FAT_ReadSector(GBK12 + sector_offset + 1,buffer))return 1;
;;;94 for(temp1 = 0;temp2<24;temp2++,temp1++)GBK_Buffer[temp2] = buffer[temp1];
;;;95 }
;;;96 else for(temp2 = 0,temp1 = byte_offset;temp2<24;temp2++,temp1++)GBK_Buffer[temp2] = buffer[temp1];
0001a8 93a00000 MOVLS r0,#0
0001ac 9a00001e BLS |L1.556|
0001b0 e1db10b0 LDRH r1,[r11,#0] ;92
0001b4 e3a04000 MOV r4,#0 ;92
0001b8 e0410005 SUB r0,r1,r5 ;92
|L1.444|
0001bc e1500004 CMP r0,r4 ;92
0001c0 c7d71005 LDRBGT r1,[r7,r5] ;92
0001c4 c2855001 ADDGT r5,r5,#1 ;92
0001c8 c7c81004 STRBGT r1,[r8,r4] ;92
0001cc c2841001 ADDGT r1,r4,#1 ;92
0001d0 c20140ff ANDGT r4,r1,#0xff ;92
0001d4 cafffff8 BGT |L1.444|
0001d8 e5990000 LDR r0,[r9,#0] ;93 ; GBK12
0001dc e59a2000 LDR r2,[r10,#0] ;93 ; FAT_ReadSector
0001e0 e0800006 ADD r0,r0,r6 ;93
0001e4 e2800001 ADD r0,r0,#1 ;93
0001e8 e28d1004 ADD r1,sp,#4 ;93
0001ec e1a0e00f MOV lr,pc ;93
0001f0 e12fff12 BX r2 ;93
0001f4 e3500000 CMP r0,#0 ;93
0001f8 0a000008 BEQ |L1.544|
|L1.508|
0001fc e3a00001 MOV r0,#1 ;93
|L1.512|
000200 e28ddf81 ADD sp,sp,#0x204 ;93
000204 e8bd4ff0 POP {r4-r11,lr} ;93
;;;97 return 0;
;;;98 }
000208 e12fff1e BX lr
|L1.524|
00020c e7d71000 LDRB r1,[r7,r0] ;94
000210 e2800001 ADD r0,r0,#1 ;94
000214 e7c81004 STRB r1,[r8,r4] ;94
000218 e2841001 ADD r1,r4,#1 ;94
00021c e20140ff AND r4,r1,#0xff ;94
|L1.544|
000220 e3540018 CMP r4,#0x18 ;94
000224 3afffff8 BCC |L1.524|
000228 ea000006 B |L1.584|
|L1.556|
00022c e7d71005 LDRB r1,[r7,r5] ;96
000230 e2855001 ADD r5,r5,#1 ;96
000234 e7c81000 STRB r1,[r8,r0] ;96
000238 e2800001 ADD r0,r0,#1 ;96
00023c e20000ff AND r0,r0,#0xff ;96
000240 e3500018 CMP r0,#0x18 ;96
000244 3afffff8 BCC |L1.556|
|L1.584|
000248 e3a00000 MOV r0,#0 ;97
00024c eaffffeb B |L1.512|
|L1.592|
000250 5c737431 DCB "\\\163\164\61"
000254 322e7379 DCB "2.sy"
000258 73000000 DCB "s\0\0\0"
|L1.604|
00025c 00000000 DCD ||.data||
|L1.608|
000260 5c756e69 DCB "\\\165\156\151"
000264 3267626b DCB "2gbk"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -