; generated by ARM C/C++ Compiler, 5.03 [Build 24]
; commandline ArmCC [--list --split_sections --debug -c --asm --interleave -o.\obj\dataflashprog.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\dataflashprog.d --cpu=Cortex-M0 --apcs=interwork -I.\ -I..\..\..\..\Library\CMSIS\Include -I..\..\..\..\Library\Device\Nuvoton\NUC200Series\Include -I..\..\..\..\Library\StdDriver\inc -IC:\Keil\ARM\RV31\INC -IC:\Keil\ARM\CMSIS\Include -IC:\Keil\ARM\Inc\?ST\STM32F10x -D__MICROLIB --omf_browse=.\obj\dataflashprog.crf ..\DataFlashProg.c]
                          THUMB

                          AREA ||i.DataFlashRead||, CODE, READONLY, ALIGN=2

                  DataFlashRead PROC
;;;40     
;;;41     void DataFlashRead(uint32_t addr, uint32_t size, uint32_t buffer)
000000  b5f8              PUSH     {r3-r7,lr}
;;;42     {
000002  460c              MOV      r4,r1
;;;43         /* This is low level read function of USB Mass Storage */
;;;44         int32_t len;
;;;45     
;;;46         /* Modify the address to MASS_STORAGE_OFFSET */
;;;47         addr += MASS_STORAGE_OFFSET;
000004  2101              MOVS     r1,#1
000006  0409              LSLS     r1,r1,#16
000008  4616              MOV      r6,r2                 ;42
00000a  1845              ADDS     r5,r0,r1
;;;48     
;;;49         len = (int32_t)size;
;;;50     
;;;51         SYS_UnlockReg();
00000c  f7fffffe          BL       SYS_UnlockReg
;;;52         FMC_Open();
000010  f7fffffe          BL       FMC_Open
;;;53     
;;;54         while(len >= FLASH_PAGE_SIZE) {
000014  2701              MOVS     r7,#1
000016  027f              LSLS     r7,r7,#9
000018  e00c              B        |L1.52|
                  |L1.26|
;;;55             FMC_ReadPage(addr, (uint32_t *)buffer);
00001a  4631              MOV      r1,r6
00001c  4628              MOV      r0,r5
00001e  f7fffffe          BL       FMC_ReadPage
;;;56             addr   += FLASH_PAGE_SIZE;
000022  35ff              ADDS     r5,r5,#0xff
;;;57             buffer += FLASH_PAGE_SIZE;
000024  36ff              ADDS     r6,r6,#0xff
000026  35ff              ADDS     r5,r5,#0xff           ;56
000028  36ff              ADDS     r6,r6,#0xff
;;;58             len  -= FLASH_PAGE_SIZE;
00002a  3cff              SUBS     r4,r4,#0xff
00002c  3502              ADDS     r5,#2                 ;56
00002e  3602              ADDS     r6,#2                 ;57
000030  3cff              SUBS     r4,r4,#0xff
000032  3c02              SUBS     r4,#2
                  |L1.52|
000034  42bc              CMP      r4,r7                 ;54
000036  daf0              BGE      |L1.26|
;;;59         }
;;;60     
;;;61         FMC_Close();
000038  f7fffffe          BL       FMC_Close
00003c  4901              LDR      r1,|L1.68|
00003e  2000              MOVS     r0,#0
000040  6008              STR      r0,[r1,#0]
;;;62         SYS_LockReg();
;;;63     }
000042  bdf8              POP      {r3-r7,pc}
;;;64     
                          ENDP

                  |L1.68|
                          DCD      0x50000100

                          AREA ||i.DataFlashWrite||, CODE, READONLY, ALIGN=2

                  DataFlashWrite PROC
;;;77     
;;;78     void DataFlashWrite(uint32_t addr, uint32_t size, uint32_t buffer)
000000  b5f7              PUSH     {r0-r2,r4-r7,lr}
;;;79     {
000002  460e              MOV      r6,r1
;;;80         /* This is low level write function of USB Mass Storage */
;;;81         int32_t len, i, offset;
;;;82         uint32_t *pu32;
;;;83         uint32_t alignAddr;
;;;84     
;;;85         /* Modify the address to MASS_STORAGE_OFFSET */
;;;86         addr += MASS_STORAGE_OFFSET;
000004  2101              MOVS     r1,#1
000006  0409              LSLS     r1,r1,#16
000008  b082              SUB      sp,sp,#8              ;79
00000a  1845              ADDS     r5,r0,r1
;;;87     
;;;88         len = (int32_t)size;
;;;89     
;;;90         SYS_UnlockReg();
00000c  f7fffffe          BL       SYS_UnlockReg
;;;91         FMC_Open();
000010  f7fffffe          BL       FMC_Open
;;;92     
;;;93         if ( len == FLASH_PAGE_SIZE && ((addr & (FLASH_PAGE_SIZE-1)) == 0) ) {
000014  2401              MOVS     r4,#1
000016  0264              LSLS     r4,r4,#9
000018  42a6              CMP      r6,r4
00001a  d117              BNE      |L2.76|
00001c  05e9              LSLS     r1,r5,#23
00001e  d115              BNE      |L2.76|
;;;94             FMC_Erase(addr);
000020  4628              MOV      r0,r5
000022  f7fffffe          BL       FMC_Erase
;;;95     
;;;96             while (len >= FLASH_PAGE_SIZE) {
000026  e00e              B        |L2.70|
                  |L2.40|
;;;97                 FMC_ProgramPage(addr, (uint32_t *) buffer);
000028  4628              MOV      r0,r5
00002a  9904              LDR      r1,[sp,#0x10]
00002c  f7fffffe          BL       FMC_ProgramPage
;;;98                 len    -= FLASH_PAGE_SIZE;
;;;99                 buffer += FLASH_PAGE_SIZE;
000030  9804              LDR      r0,[sp,#0x10]
000032  3eff              SUBS     r6,r6,#0xff           ;98
000034  30ff              ADDS     r0,r0,#0xff
000036  30ff              ADDS     r0,r0,#0xff
000038  3eff              SUBS     r6,r6,#0xff           ;98
00003a  3002              ADDS     r0,#2
;;;100                addr   += FLASH_PAGE_SIZE;
00003c  35ff              ADDS     r5,r5,#0xff
00003e  3e02              SUBS     r6,#2                 ;98
000040  35ff              ADDS     r5,r5,#0xff
000042  3502              ADDS     r5,#2
000044  9004              STR      r0,[sp,#0x10]
                  |L2.70|
000046  42a6              CMP      r6,r4                 ;96
000048  daee              BGE      |L2.40|
00004a  e047              B        |L2.220|
                  |L2.76|
;;;101            }
;;;102        } else {
;;;103            do {
;;;104                alignAddr = addr & 0x1FE00;
00004c  21ff              MOVS     r1,#0xff
00004e  4628              MOV      r0,r5
000050  0249              LSLS     r1,r1,#9
000052  4008              ANDS     r0,r0,r1
;;;105    
;;;106                /* Get the sector offset*/
;;;107                offset = ( addr & (FLASH_PAGE_SIZE-1) );
000054  05ef              LSLS     r7,r5,#23
000056  9000              STR      r0,[sp,#0]
000058  0dff              LSRS     r7,r7,#23
;;;108    
;;;109                if ( offset || (size < FLASH_PAGE_SIZE) ) {
00005a  d103              BNE      |L2.100|
00005c  2001              MOVS     r0,#1
00005e  0240              LSLS     r0,r0,#9
000060  4286              CMP      r6,r0
000062  d207              BCS      |L2.116|
                  |L2.100|
;;;110                    /* Non 4k alignment. Note: It needs to avoid add MASS_STORAGE_OFFSET twice. */
;;;111                    DataFlashRead(alignAddr - MASS_STORAGE_OFFSET, FLASH_PAGE_SIZE, (uint32_t)&g_sectorBuf[0]);
000064  2101              MOVS     r1,#1
000066  0249              LSLS     r1,r1,#9
000068  9800              LDR      r0,[sp,#0]
00006a  01cb              LSLS     r3,r1,#7
00006c  4a1f              LDR      r2,|L2.236|
00006e  1ac0              SUBS     r0,r0,r3
000070  f7fffffe          BL       DataFlashRead
                  |L2.116|
;;;112    
;;;113                }
;;;114    
;;;115                /* Update the data */
;;;116                pu32 = (uint32_t *)buffer;
;;;117                len = FLASH_PAGE_SIZE - offset;
000074  2001              MOVS     r0,#1
000076  0240              LSLS     r0,r0,#9
000078  1bc4              SUBS     r4,r0,r7
;;;118                if (size < len)
00007a  9b04              LDR      r3,[sp,#0x10]
00007c  42a6              CMP      r6,r4
00007e  d200              BCS      |L2.130|
;;;119                    len = size;
000080  4634              MOV      r4,r6
                  |L2.130|
;;;120    
;;;121                for (i=0; i<len/4; i++) {
;;;122                    g_sectorBuf[offset/4 + i] = pu32[i];
000082  17f9              ASRS     r1,r7,#31
000084  0f89              LSRS     r1,r1,#30
000086  19c9              ADDS     r1,r1,r7
000088  1089              ASRS     r1,r1,#2
00008a  468e              MOV      lr,r1
00008c  17e1              ASRS     r1,r4,#31             ;121
00008e  0f89              LSRS     r1,r1,#30             ;121
000090  2000              MOVS     r0,#0                 ;121
000092  1909              ADDS     r1,r1,r4              ;121
000094  1089              ASRS     r1,r1,#2              ;121
000096  468c              MOV      r12,r1                ;121
000098  e008              B        |L2.172|
                  |L2.154|
00009a  0081              LSLS     r1,r0,#2
00009c  585a              LDR      r2,[r3,r1]
00009e  4671              MOV      r1,lr
0000a0  180f              ADDS     r7,r1,r0
0000a2  4912              LDR      r1,|L2.236|
0000a4  00bf              LSLS     r7,r7,#2
0000a6  187f              ADDS     r7,r7,r1
0000a8  1c40              ADDS     r0,r0,#1              ;121
0000aa  603a              STR      r2,[r7,#0]            ;121
                  |L2.172|
0000ac  4584              CMP      r12,r0                ;121
0000ae  dcf4              BGT      |L2.154|
;;;123                }
;;;124    
;;;125                FMC_Erase(alignAddr);
0000b0  9800              LDR      r0,[sp,#0]
0000b2  f7fffffe          BL       FMC_Erase
;;;126    
;;;127                for(i=0; i<16; i++) {
0000b6  2700              MOVS     r7,#0
                  |L2.184|
;;;128                    FMC_ProgramPage(alignAddr + (i << 8), (uint32_t *) g_sectorBuf + (i << 8));
0000b8  480c              LDR      r0,|L2.236|
0000ba  02b9              LSLS     r1,r7,#10
0000bc  1809              ADDS     r1,r1,r0
0000be  9800              LDR      r0,[sp,#0]
0000c0  023a              LSLS     r2,r7,#8
0000c2  1810              ADDS     r0,r2,r0
0000c4  f7fffffe          BL       FMC_ProgramPage
0000c8  1c7f              ADDS     r7,r7,#1              ;127
0000ca  2f10              CMP      r7,#0x10              ;127
0000cc  dbf4              BLT      |L2.184|
;;;129                }
;;;130    
;;;131                size -= len;
;;;132                addr += len;
;;;133                buffer += len;
0000ce  9804              LDR      r0,[sp,#0x10]
0000d0  1b36              SUBS     r6,r6,r4              ;131
0000d2  1900              ADDS     r0,r0,r4
0000d4  192d              ADDS     r5,r5,r4              ;132
;;;134    
;;;135            } while (size > 0);
0000d6  9004              STR      r0,[sp,#0x10]
0000d8  2e00              CMP      r6,#0
0000da  d1b7              BNE      |L2.76|
                  |L2.220|
;;;136        }
;;;137    
;;;138        FMC_Close();
0000dc  f7fffffe          BL       FMC_Close
0000e0  4903              LDR      r1,|L2.240|
0000e2  2000              MOVS     r0,#0
0000e4  6008              STR      r0,[r1,#0]
;;;139        SYS_LockReg();
;;;140    }
0000e6  b005              ADD      sp,sp,#0x14
0000e8  bdf0              POP      {r4-r7,pc}
;;;141    
                          ENDP

0000ea  0000              DCW      0x0000
                  |L2.236|
                          DCD      ||.bss||
                  |L2.240|
                          DCD      0x50000100

                          AREA ||i.FMC_Erase||, CODE, READONLY, ALIGN=2

                  FMC_Erase PROC
;;;151     */
;;;152    static __INLINE int32_t FMC_Erase(uint32_t u32addr)
000000  490a              LDR      r1,|L3.44|
;;;153    {
;;;154        FMC->ISPCMD = FMC_ISPCMD_PAGE_ERASE; /* Set ISP Command Code */
000002  2222              MOVS     r2,#0x22
000004  60ca              STR      r2,[r1,#0xc]
;;;155        FMC->ISPADR = u32addr;               /* Set Target ROM Address. The address must be page alignment. */
000006  6048              STR      r0,[r1,#4]
;;;156        FMC->ISPTRG = 0x1;                   /* Trigger to start ISP procedure */
000008  2001              MOVS     r0,#1
00000a  6108              STR      r0,[r1,#0x10]
;;;157        __ISB();                             /* To make sure ISP/CPU be Synchronized */
00000c  f3bf8f6f          ISB      
                  |L3.16|
;;;158        while(FMC->ISPTRG);                  /* Waiting for ISP Done */
000010  6908              LDR      r0,[r1,#0x10]
000012  2800              CMP      r0,#0
000014  d1fc              BNE      |L3.16|
;;;159    
;;;160        /* Check ISPFF flag to know whether erase OK or fail. */
;;;161        if(FMC->ISPCON & FMC_ISPCON_ISPFF_Msk)
000016  6808              LDR      r0,[r1,#0]
000018  0640              LSLS     r0,r0,#25
00001a  d504              BPL      |L3.38|
;;;162        {
;;;163            FMC->ISPCON = FMC_ISPCON_ISPFF_Msk;
00001c  2040              MOVS     r0,#0x40
00001e  6008              STR      r0,[r1,#0]
;;;164            return -1;
000020  2000              MOVS     r0,#0
000022  43c0              MVNS     r0,r0
;;;165        }
;;;166        return 0;
;;;167    }
000024  4770              BX       lr
                  |L3.38|
000026  2000              MOVS     r0,#0                 ;166
000028  4770              BX       lr
;;;168    
                          ENDP

00002a  0000              DCW      0x0000
                  |L3.44|
                          DCD      0x5000c000

                          AREA ||i.FMC_ProgramPage||, CODE, READONLY, ALIGN=2

                  FMC_ProgramPage PROC
;;;65     
;;;66     uint32_t FMC_ProgramPage(uint32_t u32StartAddr, uint32_t * u32Buf)
000000  b5f0              PUSH     {r4-r7,lr}
;;;67     {
;;;68         uint32_t i;
;;;69     
;;;70         for (i = 0; i < FLASH_PAGE_SIZE/4; i++) {
000002  2200              MOVS     r2,#0
000004  2621              MOVS     r6,#0x21
000006  4b09              LDR      r3,|L4.44|
000008  2701              MOVS     r7,#1
                  |L4.10|
;;;71             FMC_Write(u32StartAddr + i*4, u32Buf[i]);
00000a  0094              LSLS     r4,r2,#2
00000c  1825              ADDS     r5,r4,r0
00000e  590c              LDR      r4,[r1,r4]
000010  60de              STR      r6,[r3,#0xc]
000012  605d              STR      r5,[r3,#4]
000014  609c              STR      r4,[r3,#8]
000016  611f              STR      r7,[r3,#0x10]
000018  f3bf8f6f          ISB      
                  |L4.28|
00001c  691c              LDR      r4,[r3,#0x10]
00001e  2c00              CMP      r4,#0
000020  d1fc              BNE      |L4.28|
000022  1c52              ADDS     r2,r2,#1              ;70
000024  2a80              CMP      r2,#0x80              ;70
000026  d3f0              BCC      |L4.10|
;;;72         }
;;;73     
;;;74         return 0;
000028  2000              MOVS     r0,#0
;;;75     }
00002a  bdf0              POP      {r4-r7,pc}
;;;76     
                          ENDP

                  |L4.44|
                          DCD      0x5000c000

                          AREA ||i.FMC_ReadPage||, CODE, READONLY, ALIGN=2

                  FMC_ReadPage PROC
;;;30     
;;;31     uint32_t FMC_ReadPage(uint32_t u32StartAddr, uint32_t * u32Buf)
000000  b5f0              PUSH     {r4-r7,lr}
;;;32     {
;;;33         uint32_t i;
;;;34     
;;;35         for (i = 0; i < FLASH_PAGE_SIZE/4; i++)
000002  2200              MOVS     r2,#0
000004  4b09              LDR      r3,|L5.44|
000006  4616              MOV      r6,r2
000008  2701              MOVS     r7,#1
                  |L5.10|
;;;36             u32Buf[i] = FMC_Read(u32StartAddr + i*4);
00000a  0094              LSLS     r4,r2,#2
00000c  1825              ADDS     r5,r4,r0
00000e  60de              STR      r6,[r3,#0xc]
000010  605d              STR      r5,[r3,#4]
000012  611f              STR      r7,[r3,#0x10]
000014  f3bf8f6f          ISB      
                  |L5.24|
000018  691d              LDR      r5,[r3,#0x10]
00001a  2d00              CMP      r5,#0
00001c  d1fc              BNE      |L5.24|
00001e  689d              LDR      r5,[r3,#8]
000020  1c52              ADDS     r2,r2,#1              ;35
000022  510d              STR      r5,[r1,r4]
000024  2a80              CMP      r2,#0x80              ;35
000026  d3f0              BCC      |L5.10|
;;;37     
;;;38         return 0;
000028  2000              MOVS     r0,#0
;;;39     }
00002a  bdf0              POP      {r4-r7,pc}
;;;40     
                          ENDP

                  |L5.44|
                          DCD      0x5000c000

                          AREA ||i.SYS_UnlockReg||, CODE, READONLY, ALIGN=2

                  SYS_UnlockReg PROC
;;;1402     */
;;;1403   static __INLINE void SYS_UnlockReg(void)
000000  b510              PUSH     {r4,lr}
;;;1404   {
;;;1405     while(SYS->REGWRPROT != SYS_REGWRPROT_REGPROTDIS_Msk) {
;;;1406       SYS->REGWRPROT = 0x59;
000002  2159              MOVS     r1,#0x59
;;;1407       SYS->REGWRPROT = 0x16;
000004  2316              MOVS     r3,#0x16
000006  4805              LDR      r0,|L6.28|
;;;1408       SYS->REGWRPROT = 0x88;  
000008  2288              MOVS     r2,#0x88
00000a  e002              B        |L6.18|
                  |L6.12|
00000c  6001              STR      r1,[r0,#0]            ;1406
00000e  6003              STR      r3,[r0,#0]            ;1407
000010  6002              STR      r2,[r0,#0]
                  |L6.18|
000012  6804              LDR      r4,[r0,#0]            ;1405
000014  2c01              CMP      r4,#1                 ;1405
000016  d1f9              BNE      |L6.12|
;;;1409     }
;;;1410   }
000018  bd10              POP      {r4,pc}
;;;1411   
                          ENDP

00001a  0000              DCW      0x0000
                  |L6.28|
                          DCD      0x50000100

                          AREA ||.bss||, DATA, NOINIT, ALIGN=2

                  g_sectorBuf
                          %        512

;*** Start embedded assembler ***

#line 1 "..\\DataFlashProg.c"
	AREA ||.rev16_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___15_DataFlashProg_c_95daee1a____REV16|
#line 118 "..\\..\\..\\..\\Library\\CMSIS\\Include\\core_cmInstr.h"
|__asm___15_DataFlashProg_c_95daee1a____REV16| PROC
#line 119

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___15_DataFlashProg_c_95daee1a____REVSH|
#line 132
|__asm___15_DataFlashProg_c_95daee1a____REVSH| PROC
#line 133

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
