原创 K9F1208的读写、擦除

2010-3-27 17:00 1166 2 2 分类: MCU/ 嵌入式

//======================================================


// mcu:SPCE061A
// 文件名称: SamsungflashV12.asm
// 功能描述:   K9F1208的读写、擦除
// 使用方法:
//    建议使用以下顺序
//    初始化过程:
//     InitSamsungFlash()    
//    写过程:
//     InitWriteSamsungFlash() -> FillSamsungFlash(Data) -> ... -> StopWriteSamsungFlash()
//    读过程:
//     InitReadSamsungFlash()  -> ExtractSamsungFlash()  -> ...-> StopReadSamsungFlash()
//    流控制:
//     GetColAddr()
//     GetPage()
//     GetBlock()
//
//    Note:
//    1. 注意每次读/写操作都要调用初始化和结束函数 
//    2. 为了避免错误,请不要交迭使用读/写操作
//    3. 当program/erase错误发生的时候, 用户必须根据自己的文件系统自行处理
//       请参考_SP_FillSamsungFlash和_SamsungEraseBlock,这里假定没有错误产生
// 完成日期:   2004-4-12
// V12修改日期:2004-12-25     
//========================================================================================
.INCLUDE hardware.inc;


.PUBLIC _SP_InitSamsungFlash
.PUBLIC _SP_FillSamsungFlash
.PUBLIC _SP_ExtractSamsungFlash
.PUBLIC _SP_InitReadSamsungFlash
.PUBLIC _SP_InitWriteSamsungFlash
.PUBLIC _SP_StopWriteSamsungFlash
.PUBLIC _SP_StopReadSamsungFlash
.PUBLIC _SP_SamsungEraseBlock
.PUBLIC _SP_SamsungMassErase
.PUBLIC _SP_GetColAddr
.PUBLIC _SP_GetPage
.PUBLIC _SP_GetBlock
.PUBLIC _SP_SamsungReadByte
.PUBLIC _SP_SamsungWriteByte
.PUBLIC _SP_SamsungReadPageW
.PUBLIC _SP_SamsungWritePageW


.public _SP_SamsungReadWord      //Add by xinqiang 2004.12.24
.public _SP_SamsungReadWord_1
.public _SP_SamsungWriteWord     //Add by xinqiang 2004.12.24
.PUBLIC _SP_InitReadSamsungFlash_1
// Flash 控制信号
.DEFINE RE_BIT  0x04//0x02//0x01  
.DEFINE WE_BIT  0x02//0x20//0x02  
.DEFINE CE_BIT  0x04  
.DEFINE ALE_BIT 0x20//0x10//0x08  
.DEFINE CLE_BIT 0x10//0x08//0x10  
.DEFINE BASE_CONF 0x003e//0x003a//e
.define BASE_MASK 0x00c1//4     //用来MASKIOB口中没有用到的IO位


// K9F1208的地址边界
.define C_Flash_EN 0xff7f     //Add by xinqiang 2004.12.24
.define C_Flash_UN 0x0080     //Add by xinqiang 2004.12.24


.DEFINE C_PageBin   0x0000       
.DEFINE C_PageEnd   0x1FFFF     
.DEFINE C_BlockBin  0x0000     
.DEFINE C_MaxBlock  0x0FFF      // 4096 block


.DEFINE Port_IOA_Attrib     P_IOA_Attrib
.DEFINE Port_IOA_Dir      P_IOA_Dir
.DEFINE Port_IOA_Data       P_IOA_Data
.DEFINE Port_IOA_Buffer     P_IOA_Buffer
.DEFINE Port_IOB_Attrib     P_IOB_Attrib
.DEFINE Port_IOB_Dir        P_IOB_Dir
.DEFINE Port_IOB_Data       P_IOB_Data
.DEFINE Port_IOB_Buffer     P_IOB_Buffer
.DEFINE Port_TimeBaseSetup  P_TimeBase_Setup       
.DEFINE Port_Watchdog_Clear P_Watchdog_Clear     
.DEFINE Port_SystemClock    P_SystemClock        


// 数据Buffer
.DEFINE C_PageSize 0x200     // 512  bytes
.DEFINE C_MaxPageBufferBytes 0x80  // 128  bytes 2*C_MaxPageBuffer
.DEFINE C_MaxPageBuffer 0x40   // 64   words


.IRAM
.VAR R_CurrAddr = 0
.VAR R_CurrPage = C_PageBin
.VAR R_WriteIndex = 0
.VAR R_ReadIndex  = C_MaxPageBuffer


.var R_ReadIndex_First    //第一次要读的数据个数 word
.var R_ReadIndex_Secon    //第二次要读的数据个数


.var R_Addr25 = 0     //Edit by xinqiang 2004.12.20 增加高位的地址寄存器
.var R_PageBin = C_PageBin


.RAM
T_PageBuffer: .DW C_MaxPageBuffer dup(0)
.TEXT
.public _InitSignalLine
_InitSignalLine: .proc
 r1 = RE_BIT|WE_BIT//CE_BIT|RE_BIT|WE_BIT;
 [Port_IOB_Buffer]=r1;
// r1 = 0x0080      //change
// [Port_IOA_Buffer] = r1   ///...end
 .endp


//--------------------------------------------------------------------
//-- 宏名: M_SaveIoSetting for IOA & IOB   M_SaveIOSetting_1 for IOB
//-- 参数: 无
//-- 把IO设置保存到堆栈
//--------------------------------------------------------------------
M_SaveIoSetting: .MACRO
    R5 = [Port_IOB_Buffer];
    R5 &= 0xFFD0
    push R5 to [SP]
 R5 = [Port_IOA_Buffer];
 R5 &= 0xFF00
 push R5 to [SP]
.ENDM


M_SaveIoSetting_1:.MACRO
 r5 = [Port_IOA_Buffer]
 r5 &= C_Flash_EN
 [Port_IOA_Data] = r5
 r5 = [Port_IOB_Buffer];
 r5 &= BASE_CONF//0x00d0
 push r5 to [sp]
.endm
//--------------------------------------------------------------------
//-- 宏名: M_RetrieveIoSetting for IOA & IOB   M_RetrieveIoSetting_1 for IOB 
//-- 参数: 无
//-- 从堆栈恢复IO设置
//--------------------------------------------------------------------
M_RetrieveIoSetting: .MACRO
 pop R5 from [SP]
 [Port_IOA_Data] = R5
 pop R5 from [SP]
 R5 |= CE_BIT
 [Port_IOB_Data] = R5
.ENDM
M_RetrieveIoSetting_1: .MACRO
 pop R5 from [SP]
// R5 |= CE_BIT
 [Port_IOB_Data] = R5
 r5 = [Port_IOA_Buffer]
 r5 |= C_Flash_UN
 [Port_IOA_Data] = r5
.ENDM
//--------------------------------------------------------------------
//-- 宏名: M_InitIOAOut for IOA & IOB   M_InitIOAOut_1 for IOB
//-- 参数: 无
//--------------------------------------------------------------------
M_InitIOAOut: .MACRO
 R5 = [Port_IOA_Attrib]
 R5 |= 0x00FF
 [Port_IOA_Attrib] = R5
 R5 = [Port_IOA_Dir]
 R5 |= 0x00FF
 [Port_IOA_Dir] = R5
.ENDM
M_InitIOAOut_1: .MACRO
 R5 = [Port_IOB_Attrib]
 R5 |= 0xff00
 [Port_IOB_Attrib] = R5
 R5 = [Port_IOB_Dir]
 R5 |= 0xff00
 [Port_IOB_Dir] = R5
.ENDM
//--------------------------------------------------------------------
//-- 宏名: M_InitIOAIn for IOA & IOB   M_InitIOAIn_1 for IOB
//-- 参数: 无
//--------------------------------------------------------------------
M_InitIOAIn: .MACRO
 R5 = [P_IOA_Attrib]
 R5 &= 0xFF00
 [P_IOA_Attrib] = R5
 R5 = [P_IOA_Dir]
 R5 &= 0xFF00
 [P_IOA_Dir] = R5
.ENDM
M_InitIOAIn_1: .MACRO
 R5 = [P_IOB_Attrib]
 R5 &= 0x00ff
 [P_IOB_Attrib] = R5
 R5 = [P_IOB_Dir]
 R5 &= 0x00ff
 [P_IOB_Dir] = R5
.ENDM
//--------------------------------------------------------------------
//-- 宏名: M_SendReadCmd
//-- 参数: column,page,portA,portB
//-- 发送 0x00, 0x01 or 0x50
//--------------------------------------------------------------------
M_SendReadCmd: .MACRO column,page,portA,portB
 R5 = SP
 portA = [R5+1]  
 portB = [R5+2]  
 R5 = (CLE_BIT|RE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5
 R5 = 0x0000      //read0 命令
 cmp column, 256
 jb ?NotChArea
 column -= 256
 R5 = 0x0001       //read1 命令
 cmp column, 256
 jb ?NotChArea
 column -= 256
 R5 = 0x0050       //read2 命令
?NotChArea:
 R5 |= portA
 [Port_IOA_Data] = R5
 R5 = (CLE_BIT|RE_BIT|WE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5   //WE高电平
 R5 = (WE_BIT|ALE_BIT|RE_BIT) //CLE低电平 , WE高电平 , ALE高电平 , RE高电平
 R5 |= portB
 [Port_IOB_Data] = R5
 //.....写地址.....................
 portB |= (ALE_BIT|RE_BIT)
 [Port_IOB_Data] = portB   //WE低电平
 column |= portA
 [Port_IOA_Data] = column  //Address0 - 7
 [Port_IOB_Data] = R5   //WE, ALE, RE高电平
 [Port_IOB_Data] = portB   //WE低电平
 column = page & 0x00FF
 column |= portA
 [Port_IOA_Data] = column  //Address9 - 16
 [Port_IOB_Data] = R5   //WE, ALE高电平
 [Port_IOB_Data] = portB   //WE低电平
 page = page LSR 4
 page = page LSR 4
 page |= portA
 [Port_IOA_Data] = page   //Address17 - 22
 [Port_IOB_Data] = R5   //WE, ALE高电平


 [Port_IOB_Data] = portB   //WE低电平
 push r1 to [sp]
 r1 = [R_Addr25]//0     //Edit by xinqiang 2004.12.20 从寄存器地址中读取高位地址
 [Port_IOA_Data] = r1   //Address25
 pop r1 from [sp]
 [Port_IOB_Data] = R5   //WE, ALE高电平


 R5 = SP
 portB = [R5+2]
 R5 = (WE_BIT|RE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5   //WE高电平 , RE高电平 , ALE低电平  
.ENDM


//--------------------------------------------------------------------
//-- 宏名: M_SendWriteCmd
//-- 参数: column,page,portA,portB
//-- 发送 0x80
//--------------------------------------------------------------------
M_SendWriteCmd: .MACRO column,page,portA,portB
 R5 = SP
 portA = [R5+1]  
 portB = [R5+2] 
 R5 = (CLE_BIT|RE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5
 R5 = 0x0000
 cmp column, 256
 jb ?NotChArea
 column -= 256
 R5 = 0x0001
 cmp column, 256
 jb ?NotChArea
 column -= 256
 R5 = 0x0050
?NotChArea:
 R5 |= portA
 [Port_IOA_Data] = R5
 R5 = (CLE_BIT|RE_BIT|WE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5
 R5 = (CLE_BIT|RE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5
 R5 = 0x0080       // 连续数据输入命令
 R5 |= portA
 [Port_IOA_Data] = R5
 R5 = (CLE_BIT|RE_BIT|WE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5   //WE高电平
 R5 = (WE_BIT|ALE_BIT|RE_BIT) //CLE低电平 , WE高电平 , ALE高电平 , RE高电平
 R5 |= portB
 [Port_IOB_Data] = R5
 //.....写地址.....................
 portB |= (ALE_BIT|RE_BIT)
 [Port_IOB_Data] = portB   //WE低电平
 column |= portA
 [Port_IOA_Data] = column  //Address0 - 7
 [Port_IOB_Data] = R5   //WE, ALE, RE高电平
 [Port_IOB_Data] = portB   //WE低电平
 column = page & 0x00FF
 column |= portA
 [Port_IOA_Data] = column  //Address9 - 16
 [Port_IOB_Data] = R5   //WE, ALE高电平
 [Port_IOB_Data] = portB   //WE低电平
 page = page LSR 4
 page = page LSR 4
 page |= portA
 [Port_IOA_Data] = page  //Address17 - 22
 [Port_IOB_Data] = R5  //WE, ALE高电平  


//for debug,no a25
 [Port_IOB_Data] = R4  //WE低电平
 push r1 to [sp]
 r1 = [R_Addr25]//0     //Edit by xinqiang 2004.12.20 从寄存器中读取高位地址
 [Port_IOA_Data] = r1   //Address25
 pop r1 from [sp]
 [Port_IOB_Data] = R5  //WE, ALE高电平
//


 R5 = SP
 portB = [R5+2]
.ENDM


//--------------------------------------------------------------------
//-- 宏名: M_StartProgram
//-- 参数: portA,portB
//-- Send 0x10
//--------------------------------------------------------------------
M_StartProgram: .MACRO portA,portB
 R5 = (CLE_BIT|RE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5  //WE低电平 , RE高电平 , CLE高电平


 R5 = 0x0010     //program 命令
 R5 |= portA
 [Port_IOA_Data] = R5  //WE低电平 , RE高电平 , CLE高电平
 R5 = (CLE_BIT|RE_BIT|WE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5
.ENDM
M_StartProgram_1: .MACRO portA,portB
 R5 = (CLE_BIT|RE_BIT)
 R5 |= portB
 [Port_IOB_Data] = R5  //WE低电平 , RE高电平 , CLE高电平
 r5 &= 0x00ff
 R5 |= 0x1000     //program 命令
 [Port_IOB_Data] = R5  //WE低电平 , RE高电平 , CLE高电平
 R5 |= WE_BIT//(CLE_BIT|RE_BIT|WE_BIT)
 [Port_IOB_Data] = R5
.ENDM
//--------------------------------------------------------------------
//-- 函数名: _SP_InitSamsungFlash
//-- 参数: 无
//-- 返回值: 无
//2004.12.23  Edit by xinqiang Zhang for change the IO
//--------------------------------------------------------------------
_SP_InitSamsungFlash: .proc
_InitSamsungFlash:
 push R1 to [SP]
 R1 = 0
 [Port_TimeBaseSetup] = R1
// [Port_SystemClock] = R1
// R1 = 0x01
// [Port_Watchdog_Clear] = R1
// R1 = [Port_IOA_Attrib]
// R1 |= C_Flash_UN//0xFF00
// [Port_IOA_Attrib] = R1
// R1 = [Port_IOA_Dir]
// R1 |= C_Flash_UN//0xFF00
// [Port_IOA_Dir] = R1
 
 R1 = [Port_IOB_Attrib]
 R1 &= BASE_MASK//0x00c0//0xFFD0
 R1 |= BASE_CONF
 [Port_IOB_Attrib] = R1
 R1 = [Port_IOB_Dir]
 R1 &= BASE_MASK//0x00c0//0xFFD0
 R1 |= BASE_CONF
 [Port_IOB_Dir] = R1
// R1 = [Port_IOB_Buffer]
// R1 |= CE_BIT     //////note that for next time will change it to IOA
// [Port_IOB_Data] = R1
 pop R1 from [SP]
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_InitWriteSamsungFlash
//-- 语法: InitWriteSamsungFlash()
//-- 参数: 无
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_InitWriteSamsungFlash: .proc
 
 PUSH R1,R5 TO [SP];     //Edit by xinqiang 2004.12.20
 r5 = sp+8       //....
// r3 = [r5++]
 r1 = [r5++]       //page number
 r2 = [r5]       //block number
// [R_CurrAddr]=R3;
    R3 = 0;
    [R_WriteIndex]=R3;
    [R_CurrAddr]=R3;
    r2 = r2 rol 4
    r2 = r2 rol 1
    r3 = r2&0xffe0
    r2 = r2 rol 4
    r2 = r2&0x0001
    r1 = r1|r3
 //   R1 = C_PageBin;
    [R_CurrPage]=R1; 
    [R_PageBin]=r1;    //Edit by xinqiang
    
    [R_Addr25]=r2;
 POP R1,R5 FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_StopWriteSamsungFlash
//-- 语法: SP_StopWriteSamsungFlash()
//-- 参数: 无
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_StopWriteSamsungFlash: .proc


 PUSH R1,R4 TO [SP];
    R2=0;
    R5=[R_CurrAddr];
    cmp R5, C_MaxPageBufferBytes;
    jb ?L_LowerPage;
    R2=C_MaxPageBufferBytes;
?L_LowerPage:
    R1 = R2;
    R2 = [R_CurrPage];   
    R3 = T_PageBuffer;
    R4 = [R_WriteIndex];
    R4 = R4 lsl 1


 call F_SamsungWritePageW;
 
    R1 = 0;
    [R_WriteIndex]=R1;
    [R_CurrAddr]=R1;  
    R1 = [R_PageBin];//C_PageBin;
    [R_CurrPage]=R1;   
 POP R1,R4 FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_InitReadSamsungFlash
//-- 语法: SP_InitReadSamsungFlash()
//-- 参数: 无
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_InitReadSamsungFlash: .proc


 PUSH R1,R5 TO [SP];      //Edit By xinqiang 2004.12.20
 r5 = sp+8
 r1 = [r5++]        //get the page number
 r2 = [r5]        //get the block number
    R3=C_MaxPageBuffer;
    [R_ReadIndex]=R3;
 //   R1=C_PageBin;  
    r2 = r2 rol 4
    r2 = r2 rol 1
    r3 = r2&0xffe0
    r2 = r2 rol 4
    r2 = r2&0x0001
    r1 = r1|r3
    [R_CurrPage]=R1;
 //   [R_PageBin] = r1    //Edit by xinqiang
    [R_Addr25] = r2
    R1=0;
    [R_CurrAddr]=R1;
   
    R1 = 64
    [R_ReadIndex_First] = R1
    [R_ReadIndex_Secon] = R1 
 POP R1,R5 FROM [SP];
 retf
.endp


//--------------------------------------------------------------------
//-- 函数名: _SP_InitReadSamsungFlash_1
//-- 语法: SP_InitReadSamsungFlash_1()
//-- 参数: r1 page number r2 block number r3 clraddr
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_InitReadSamsungFlash_1: .proc


 PUSH R1,R5 TO [SP];      //Edit By xinqiang 2004.12.20
 r5 = sp+8
 r3 = [r5++]
 r1 = [r5++]        //get the page number
 r2 = [r5]        //get the block number
 [R_CurrAddr]=R3;      //Get the currAddr
?InitRead_2:
 cmp r3,64
 jb ?InitRead_1
 r3 -= 64
 jmp ?InitRead_2 
?InitRead_1:
 r4 = 64
 r4 -= r3
 [R_ReadIndex_First] = r4
 [R_ReadIndex_Secon] = r4
  //  R3=C_MaxPageBuffer;
    [R_ReadIndex]=R4//R3;
 //   R1=C_PageBin;  
    r2 = r2 rol 4
    r2 = r2 rol 1
    r3 = r2&0xffe0
    r2 = r2 rol 4
    r2 = r2&0x0001
    r1 = r1|r3
    [R_CurrPage]=R1;
    [R_Addr25] = r2
   
 POP R1,R5 FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_StopReadSamsungFlash
//-- 语法: SP_StopReadSamsungFlash()
//-- 参数: 无
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_StopReadSamsungFlash: .proc


 PUSH R1,R1 TO [SP];
    R1 = [R_PageBin];//C_PageBin;
    [R_CurrPage] = R1;
    R1=0; 
    [R_ReadIndex] = R1; 
    [R_CurrAddr]=R1;
 POP R1,R1 FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_GetColAddr
//-- 语法: SP_GetColAddr()
//-- 参数: 无
//-- 返回值: R1=Column Addr
//--------------------------------------------------------------------
_SP_GetColAddr: .proc


    PUSH BP,BP TO [SP];
  
    R1=[R_CurrAddr];
  
    POP BP,BP FROM [SP];
    retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_GetPage
//-- 语法: SP_GetPage()
//-- 参数: 无
//-- 返回值: R1=Page low  R2=Page high
//--------------------------------------------------------------------
_SP_GetPage: .proc


    PUSH BP,BP TO [SP];
   
    R1=[R_CurrPage];
    r2 = [R_Addr25];
    POP BP,BP FROM [SP];
    retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_GetBlock
//-- 语法: SP_GetBlock()
//-- 参数: 无
//-- 返回值: R1=Block
//--------------------------------------------------------------------
_SP_GetBlock: .proc


    PUSH BP,BP TO [SP];
   
    R1=[R_CurrPage];
    R1= R1 LSR 4;  
    POP BP,BP FROM [SP];
    retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_FillSamsungFlash
//-- 语法: SP_FillSamsungFlash(Data)
//-- 参数: R1=Data
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_FillSamsungFlash: .proc


    PUSH BP,BP TO [SP];
    BP = SP + 1
    R1=[BP+3]
    call F_FillSamsungFlash  
 POP BP,BP FROM [SP];
 retf
.endp


F_FillSamsungFlash:  
    push R2,R5 to [SP];
    // Fill the data to buffer
    R2=[R_WriteIndex];
    R3=T_PageBuffer;
    R3+=R2;
    [R3]=R1;
    //..... Update Buffer used and Addr 
    R2=R2+1;
    [R_WriteIndex]=R2;
    R2 =[R_CurrAddr];
    R2+=2;
    [R_CurrAddr]=R2;
    //..... Check buffer full
    R2=[R_WriteIndex]
    cmp R2,C_MaxPageBuffer;
    jb ?L_Done
    // ..... Get Status
?L_WaitForProgramFlash:
    call _SamsungGetStatus_1;   
    R2=R1&0x40;    // ..... Check busy/ready      
    jz ?L_WaitForProgramFlash
    //R2=R1&0x0001;     // Check success/failure
    //jz ?L_ProgramFlash
    //  ... Handle Program Error here according to you file system ...
    // ..... Program Flash
?L_ProgramFlash:
    R1=[R_CurrAddr];
    R1-=C_MaxPageBufferBytes;
    R2=[R_CurrPage];
    R3= T_PageBuffer;
    R4= C_MaxPageBufferBytes;
   
 call F_SamsungWritePageW;
 
 R2=[R_CurrAddr]; 
 cmp R2, C_PageSize;
    jb ?L_LowerPage
 R1=0; 
 [R_CurrAddr]=R1;
 R2=[R_CurrPage];    
 R2+=1;
 [R_CurrPage]=R2;
  
?L_LowerPage:
    R1=0;
    [R_WriteIndex]=R1;
?L_Done: 
 pop R2,R5 from [SP]
retf 
//--------------------------------------------------------------------
//-- 函数名: _SP_ExtractSamsungFlash
//-- 语法: SP_ExtractSamsungFlash()
//-- 参数: 无
//-- 返回值: R1=Data
//-- 2004.12.25  Edit by Xinqiang Zhang for change IO
//--------------------------------------------------------------------
_SP_ExtractSamsungFlash: .proc
    PUSH BP,BP TO [SP];
    BP = SP + 1
    call F_ExtractSamsungFlash 
 POP BP,BP FROM [SP];
 retf
.endp


F_ExtractSamsungFlash: 
    push R2,R5 to [SP]
    // ..... Buffer check
    R2=[R_ReadIndex]
    R1 = [R_ReadIndex_First]
    cmp R2,R1//C_MaxPageBuffer
   
    jb ?L_ExtractBuffer  // Data in buffer , go read it
    // ..... Get Status
///////////////////////////////////////////
//debug   
?L_WaitForReadFlash:
    call _SamsungGetStatus_1;   
    R1&=0x40      // ..... Check busy   
    jz ?L_WaitForReadFlash
// r1=0xfff
//?L_WaitForReadFlash:
// r1-=1
// jnz ?L_WaitForReadFlash


////////////////////////////////////////
    // ..... Read Flash
    R1= [R_CurrAddr];
    R2= [R_CurrPage];
    cmp R1 ,C_PageSize;
  
    jb ?L_LowerPage ;
    R1=0;
    [R_CurrAddr]=R1;
    // Next Page
    R2+=1;
    [R_CurrPage]=R2;
    jnz ?L_LowerPage
    r2 = 0x0001
    [R_Addr25] = r2
  
?L_LowerPage:
    R3 = T_PageBuffer;
    R4= [R_ReadIndex_Secon]//C_MaxPageBufferBytes; 
    R4 = R4 lsl 1


    call  F_SamsungReadPageW;
   
    // Update Data
    R1=0
    [R_ReadIndex]=R1;
    R1 = [R_ReadIndex_Secon]
    [R_ReadIndex_First] = r1
    r1 = 64
    [R_ReadIndex_Secon] = r1
   
?L_ExtractBuffer:
    R3=[R_CurrAddr];
    R3+=2;
    [R_CurrAddr]=R3;
    R1=T_PageBuffer;
    R2=[R_ReadIndex];
    R2+=R1;
    R1=[R2];   // returned value   
    //..... Update Buffer used and Addr
    R2=[R_ReadIndex];
    R2+=1;
 [R_ReadIndex]=R2;
 
 pop R2,R5 from [SP];
retf
//--------------------------------------------------------------------
//-- 函数名: _SP_GetFlashStatus
//-- 语法: SP_GetStatus()
//-- 参数: 无
//-- 返回值: R1 = Status.
//--------------------------------------------------------------------
_SP_GetFlashStatus: .proc
    PUSH BP,BP TO [SP];
    call _SamsungGetStatus_1;
 POP BP,BP FROM [SP]; 
    retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungGetStatus
//-- 参数: 无
//-- 返回值: R1 = Status.
//--------------------------------------------------------------------
_SamsungGetStatus: //.proc
 push R2, R5 to [SP]
    M_SaveIoSetting;
 //......init port A0-A7 as output.......
 M_InitIOAOut;
 //......send 命令 ....................
 R5 = SP
 R2 = [R5+1]     //portA
 R3 = [R5+2]     //portB
 R4 = (CLE_BIT|RE_BIT)
 R4 |= R3
 [Port_IOB_Data] = R4
 R5 = 0x0070      //read0 命令
 R5 |= R2
 [Port_IOA_Data] = R5
 R4 |= WE_BIT
 [Port_IOB_Data] = R4  //WE高电平
 R4 = (WE_BIT|RE_BIT)  //CLE低电平 , WE高电平 , RE高电平
 R4 |= R3
 [Port_IOB_Data] = R4
 //.....init port A0-A7 as input..........
 M_InitIOAIn;
 //.......................................
 R4 = WE_BIT     //RE低电平
 R4 |= R3
 [Port_IOB_Data] = R4
 nop
 R1 = [Port_IOA_Data]  
 R1 &= 0x00FF
 M_RetrieveIoSetting_1;
 pop R2, R5 from [SP]
 retf
//.endp
 
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungReadByte
//-- 语法: SP_SamsungReadByte(column address, page address)
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//-- 返回值: R1 = Byte value.
//--------------------------------------------------------------------
_SP_SamsungReadByte: .proc
    PUSH BP,BP TO [SP];
    BP = SP + 1
  R1=[BP+3]
 R2=[BP+4]
 
    call _SamsungReadByte;


    R1=R3;
 POP BP,BP FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungReadByte
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//-- 返回值: R3 = Byte value.
//2004.12.23 Edit by xinqiang zhang for change the IO
//--------------------------------------------------------------------
_SamsungReadByte: //.proc
 push R1, R2 to [SP]
 push R4, R5 to [SP]
    M_SaveIoSetting_1;
 //......init port A0-A7 as output........
 M_InitIOAOut_1;
 //......send 命令 .....................
    call MM_SendReadCmd
    //M_SendReadCmd R1,R2,R3,R4;
 //.....init port A0-A7 as input..........
    M_InitIOAIn_1;
 //......start of reading data............
 R1 = 60
?waitLp:
 R1 -= 1
 jnz ?waitLp     
 R4 |= WE_BIT     //RE低电平
 [Port_IOB_Data] = R4
 nop
 nop
 nop
 R3 = [Port_IOB_Data]
 R3 &= 0xff00//0x00FF
 M_RetrieveIoSetting_1;
 r3 = r3 lsr 4
 r3 = r3 lsr 4
 pop R4, R5 from [SP]
 pop R1, R2 from [SP]
 retf
//.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungReadPageW
//-- 语法: SP_SamsungReadPageW(column address, page address,address of buffer,# of bytes to be stored)
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--   R3 = Address of buffer
//--   R4 = Number of bytes to be read
//-- 返回值: 无.
//--------------------------------------------------------------------
_SP_SamsungReadPageW: .proc
    PUSH BP,BP TO [SP];
 BP=SP+1;
 R1 = [BP+3];
 R2 = [BP+4];
    R3 = [BP+5];
    R4 = [BP+6];


    call F_SamsungReadPageW;


 POP BP,BP FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungReadWord
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//-- 返回值: R3 = Byte value.
//--------------------------------------------------------------------


_SP_SamsungReadWord:.proc
 push r5 to [sp]
 r5 = sp+1
 r1 = [r5+3]
 r2 = [r5+4]
 call _SamsungReadByte
 push r3 to [sp]
 r1+=1
 call _SamsungReadByte
 r3 = r3 lsl 4
 r3 = r3 lsl 4
 pop r1 from [sp]
 r1 = r1|r3
 pop r5 from [sp]
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungReadWord_1   Read a word from flash anyaddr
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A24)
//--    R3 = Block address (A25)
//-- 返回值: R3 = Byte value.
//-- 2004.12.25   Edit by xinqiang   for change IO
//--------------------------------------------------------------------


_SP_SamsungReadWord_1:.proc
 push r5 to [sp]
 r5 = sp+1
 r1 = [r5+3]
 r2 = [r5+4]
 r3 = [r5+5]     //get the block number
 r4 = r3 & 0x0800
 r4 = r4 lsr 4
 r4 = r4 lsr 4
 r4 = r4 lsr 3
 r4 &= 0x0001
 [R_Addr25] = r4
 r3 = r3 lsl 4
 r3 = r3 lsl 1
 r2 |= r3
 call _SamsungReadByte  //Read the low byte
 push r3 to [sp]
 r1+=1
 call _SamsungReadByte  //Read the hight byte
 r3 = r3 lsl 4
 r3 = r3 lsl 4
 pop r1 from [sp]
 r1 = r1|r3
 pop r5 from [sp]
 retf
.endp
//--------------------------------------------------------------------
//-- Function: F_SamsungReadPageW
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--   R3 = Address of buffer
//--   R4 = Number of bytes to be read
//-- 返回值: 无.
//2004.12.23  Edit by xinqiang for change the IO
//--------------------------------------------------------------------
F_SamsungReadPageW:
    push R3, R5 to [SP]
 M_SaveIoSetting_1;
 //......init port A0-A7 as output........
 M_InitIOAOut_1;
 //......send 命令 .....................
    call MM_SendReadCmd //R1,R2,R3,R4;
 //.....init port A0-A7 as input..........
    M_InitIOAIn_1;
 //......start of reading data............
 R1 = 30
?waitLp:
 R1 -= 1
 jnz ?waitLp
 R2 = R4
 R5 = SP + 1//2
 R3 = [R5+1]
 R4 = [R5+2]
 R1 = WE_BIT
 R1 |= R2
 R2 = R1|RE_BIT
?readLp:
 [P_IOB_Data] = R1
 nop
 R5 = [P_IOB_Data]   // Get低电平 er byte
 R5 &= 0xff00//0x00FF
 r5 = r5 lsr 4
 r5 = r5 lsr 4
 [P_IOB_Data] = r2//R1
 [P_IOB_Data] = R1
 push r1 to [sp]
 R1 = [P_IOB_Data]     // Get高电平 er byte
 r1 &= 0xff00
 R5 |= R1;
 [R3++] = R5;
 [P_IOB_Data] = r2//R1
 pop r1 from [sp]
 R4 -= 2  
 jnz ?readLp
 M_RetrieveIoSetting_1;
 pop R3, R5 from [SP]
retf
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungWriteByte
//-- 语法: SP_SamsungWriteByte(column address, page address,data to store)
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--   R3 = data to store
//-- 返回值: R1=0: success, R1=1: failure
//--  (only detect "1"s that are not successfully program to "0"s).
//--------------------------------------------------------------------
_SP_SamsungWriteByte: .proc
    PUSH BP,BP TO [SP];
 BP=SP+1
 R1 = [BP+3]
 R2 = [BP+4]
    R3 = [BP+5]
//    r4 = CE_BIT
   // [Port_IOB_Data] = r4
 call _SamsungWriteByte


    POP BP,BP FROM [SP];
 //pop R2, R5 from [SP]
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungWriteWord
//-- 语法: SP_SamsungWriteWord(column address, page address,data to store)
//-- 参数: R1 = column address (0 - 263)
//--            R2 = page address (A9 - A24)
//--   R3 = data to store
//-- 返回值: R1=0: success, R1=1: failure
//--  (only detect "1"s that are not successfully program to "0"s).
//note: the Address 25 have define in function SP_InitWrite~~~~
//Date: 2004.12.24 Edit by xinqiang Zhang
//--------------------------------------------------------------------
_SP_SamsungWriteWord: .proc
    PUSH BP,BP TO [SP];
 BP=SP+1
 R1 = [BP+3]
 R2 = [BP+4]
    R3 = [BP+5]
 call _SamsungWriteByte
 R1 = [BP+3]
    R3 = [BP+5]
 call _SamsungWriteByte
 R1 = [BP+3]
 r1+=1
    R3 = [BP+5]
    r3 = r3 lsr 4
    r3 = r3 lsr 4
 call _SamsungWriteByte


    POP BP,BP FROM [SP];
 //pop R2, R5 from [SP]
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungWriteByte
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--   R3 = data to store
//-- 返回值: R1=0: success, R1=1: failure
//--  (only detect "1"s that are not successfully program to "0"s).
//--------------------------------------------------------------------
_SamsungWriteByte: //.proc
 push R2, R5 to [SP]
 M_SaveIoSetting_1;
 //......init port A0-A7 as output.......
 M_InitIOAOut_1;
 //......send 命令 .........
// M_SendWriteCmd R1,R2,R3,R4;
 call MM_SendWriteCmd
 //......write data sequence..............
// R1 = R3      //portA
 R2 = R4      //portB
 R2 &= 0x00ff
 R5 = SP + 1//2
 R3 = [R5+2]
 R5 = RE_BIT
 R5 |= R2
 [Port_IOB_Data] = R5  //WE低电平 , RE高电平 , ALE低电平
// R3 &= 0x00FF
 r3 = r3 lsl 4
 r3 = r3 lsl 4
 R5 |= R3 //R3 |= R1
 [Port_IOB_Data] = R5//[Port_IOA_Data] = R3
 R5 |= WE_BIT//= (RE_BIT|WE_BIT)
// R5 |= R2
 [Port_IOB_Data] = R5
 //.......start program process...............
    M_StartProgram_1 R1,R2;
 //.......read status.........................
 R4 = (CLE_BIT|RE_BIT) 
 R4 |= R2
 [Port_IOB_Data] = R4
 R4 |= 0x7000//= 0x0070     //get status
// R4 |= R1
 [Port_IOB_Data] = R4//[Port_IOA_Data] = R4  //WE低电平 , RE高电平 , CLE高电平
 R4 |= WE_BIT//= (CLE_BIT|RE_BIT|WE_BIT)
 //R4 |= R2
 [Port_IOB_Data] = R4
 //........init port A0-A7 as input............
 M_InitIOAIn_1;
 //............................................
 R4 = WE_BIT
 R4 |= R2
 R5 = (WE_BIT|RE_BIT)
 R5 |= R2
?busyLp:
 [Port_IOB_Data] = R4
 R1 = [Port_IOB_Data]//[Port_IOA_Data]
 [Port_IOB_Data] = R5
 R2 = R1 & 0x4000//0x0040
 jz ?busyLp
 R1 &= 0x0001
    M_RetrieveIoSetting_1;
 pop R2, R5 from [SP]
 retf
//.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungWritePageW
//-- 语法: SamsungWritePageW(column address, page address,address of buffer,# of bytes to be stored)
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--   R3 = address of buffer
//--   R4 = Number of bytes to be stored
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_SamsungWritePageW: .proc
   PUSH BP,BP TO [SP];
 BP=SP+1
 R1 = [BP+3]
 R2 = [BP+4]
    R3 = [BP+5]
    R4 = [BP+6]    
   
    call F_SamsungWritePageW
    POP BP,BP FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- Function: F_SamsungWritePageW
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--   R3 = address of buffer
//--   R4 = Number of bytes to be stored (must be even)
//-- 返回值: 无
//--------------------------------------------------------------------
F_SamsungWritePageW:
 push R3, R5 to [SP]
 M_SaveIoSetting_1;
 //......init port A0-A7 as output.......
 M_InitIOAOut_1;
 //......send 命令 .........
 //M_SendWriteCmd R1,R2,R3,R4;
 call MM_SendWriteCmd
 //......write data sequence..............
// R1 = R3      //portA
 R2 = R4      //portB
 r2 &= 0x00ff
 R5 = SP + 1//2
 R3 = [R5+1]
 R4 = [R5+2]
?writeLp:
 R5 = RE_BIT
 R5 |= R2
 [P_IOB_Data] = R5  //WE低电平 , RE高电平 , ALE低电平
 R1 = [R3]//R5 = [R3]              //extract低电平 er byte
// R5 &= 0x00FF;
 R1 = R1 lsl 4
 r1 = R1 lsl 4
 R5 |= R1
 [Port_IOB_Data] = r5//[P_IOA_Data] =  R5
 R5 |= WE_BIT// (RE_BIT|WE_BIT)
// R5 |= R2
 [Port_IOB_Data] = R5
 R5 = RE_BIT
 R5 |= R2
 [P_IOB_Data] = R5  //WE低电平 , RE高电平 , ALE低电平  
 R1 = [R3++]//R5 = [R3++]             //extract高电平 er byte
// R5 = R5 lsr 4
// R5 = R5 lsr 4
 R1 &= 0xff00
 R5 |= R1
 [Port_IOB_Data] = r5//[P_IOA_Data] = R5
 R5 |= WE_BIT//= (RE_BIT|WE_BIT)
// R5 |= R2
 [Port_IOB_Data] = R5
 R4 -= 2
 jnz ?writeLp
 nop
 //.......start program process...............
    M_StartProgram_1 R1,R2;
   
    // Not checking status here    
 M_RetrieveIoSetting_1;
 pop R3, R5 from [SP]
retf
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungEraseBlock
//-- 语法: SP_SamsungEraseBlock(Block address)
//-- 参数:
//-- R1 = Block address (0 - 1023).
//-- Each block contains 16 pages = 8KBytes + 256 Bytes of spare space
//-- 返回值:
//-- R1 = 0 if success, R1 = 1 if failure
//--------------------------------------------------------------------
_SP_SamsungEraseBlock: .proc
    PUSH BP,BP TO [SP];
    BP = SP + 1;
    R1 = [BP+3];
   
    call _SamsungEraseBlock


    POP BP,BP FROM [SP];
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungEraseBlock
//-- 参数:
//-- R1 = Block address (0 - 4095).
//-- Each block contains 32 pages = 16KBytes + 512 Bytes of spare space
//-- 返回值:
//-- R1 = 0 if success, R1 = 1 if failure
//--------------------------------------------------------------------
_SamsungEraseBlock: //.proc
 push R2, R5 to [SP]
 M_SaveIoSetting_1;
 //......init port A0-A7 as output.......
 M_InitIOAOut_1;
 //......send 命令 ....................
 R5 = SP
 R3 = [R5+1]      //get the IOB statu}K
 r3 &= BASE_MASK
// R4 = r3//[R5+2]
 R5 = (CLE_BIT|RE_BIT)
 R5 |= R3//R4
 [Port_IOB_Data] = R5
// R5 = 0x0060      //auto block erase setup
 r2 = 0x6000
 r2 |= r3//r4
 r5 |= r2
// R5 |= R3
 [Port_IOB_Data] = r5//[Port_IOA_Data] = R5
 R5 |= WE_BIT//R5 = (CLE_BIT|RE_BIT|WE_BIT)
 //R5 |= r4
 [Port_IOB_Data] = R5   //WE高电平
 R5 = (WE_BIT|ALE_BIT|RE_BIT) //CLE低电平 , WE高电平 , ALE高电平 , RE高电平
 R5 |= R2//R4
 [Port_IOB_Data] = R5
 //.....写地址.....................
 R4 = (ALE_BIT|RE_BIT)//R4 |= (ALE_BIT|RE_BIT)
 r4 |= r3    //add new line
 [Port_IOB_Data] = R4   //WE低电平
 R1 = R1 LSL 4
 r1 = r1 lsl 1
 r2 = r1 lsl 4
 r2 = r2 lsl 4
 R2 &= 0xff00//= //R1 & 0x00FF
 R2 |= R4//R3
 [Port_IOB_Data] = r2//[Port_IOA_Data] = R2   //Address9 - 16
 r5 &= 0x00ff   //add new
 r5 |= r2     //add new
 [Port_IOB_Data] = R5   //WE, ALE, RE高电平
 [Port_IOB_Data] = R2//R4   //WE低电平
// R1 = R1 LSR 4
// R1 = R1 LSR 4
 r2 = r1&0xff00
 r4 &= 0x00ff
 r2 = r2|r4
// R1 |= R3
 [Port_IOB_Data] = r2//[Port_IOA_Data] = R1   //Address17 - 24
 r5 &= 0x00ff   //add new
 r5 |= r2     //add new
 [Port_IOB_Data] = R5   //WE, ALE高电平
 
 [Port_IOB_Data] = R2   //WE低电平
 push r1 to [sp]
 r1 = [R_Addr25]//0     //Edit by xinqiang 2004.12.20 从寄存器中读高位地址
 //[Port_IOA_Data] = r1   //Address25
 r1 = r1 lsl 4
 r1 = r1 lsl 4
 r1 = r1|r4
 [Port_IOB_Data] = r1
 r5 = r5&0x00ff
 r5 |= r1
 pop r1 from [sp]
 [Port_IOB_Data] = R5   //WE, ALE高电平
 
// R5 = SP
// R4 = [R5+2]
 R5 = RE_BIT
 R5 |= R3//R4
 [Port_IOB_Data] = R5   //WE低电平 , RE高电平 , ALE低电平
 //.......开始erase.................
// R1 = R3
// R2 = R4
 R5 = (CLE_BIT|RE_BIT)
 R5 |= R3//R2
 [Port_IOB_Data] = R5   //WE低电平 , RE高电平 , CLE高电平
 R4 = 0xd000//R5 = //0x00D0      //清除命令
 R4 |= R5//R5 |= R1
 [Port_IOB_Data] = r4//[Port_IOA_Data] = R5
// R5 = (CLE_BIT|RE_BIT|WE_BIT)
// R5 |= R2
 r4 |= WE_BIT
 [Port_IOB_Data] = R4//R5
 //.......读status.........................
// R4 = (CLE_BIT|RE_BIT) 
// R4 |= R2
 r5 |= 0xd000
 [Port_IOB_Data] = R5//R4
 r5 &= 0x00ff
 R4 = r5|0x7000//0x0070      //获得status
// R4 |= R5//R1
 [Port_IOB_Data] = R4   //WE低电平 , RE高电平 , CLE高电平
// R4 = (CLE_BIT|RE_BIT|WE_BIT)
// R4 |= R2
 R4 |= WE_BIT
 [Port_IOB_Data] = R4
 //........把A0-A7初始化为输入............
 M_InitIOAIn_1;
 //............................................
 R4 = WE_BIT
 R4 |= R3//R2
 R5 = (WE_BIT|RE_BIT)
 R5 |= R3//R2
?busyLp:
 [Port_IOB_Data] = R4
 R1 = [Port_IOB_Data]//[Port_IOA_Data]
 [Port_IOB_Data] = R5
 //R2 = R1 & 0x0040
 test R1,0x4000
 jz ?busyLp
 R1 &= 0x0001
    // 在这里处理erase错误
    M_RetrieveIoSetting_1;
 pop R2, R5 from [SP]
 retf
//.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungMassErase
//-- 语法: SamsungMassEraseBlock()
//-- 参数:
//-- R1 = Block address (0 - 4095).
//-- Each block contains 16 pages = 8KBytes + 256 Bytes of spare space
//-- 返回值:
//-- R1 = 0 if success, R1 >= 1 the # of block erase failures
//--------------------------------------------------------------------
_SP_SamsungMassErase: .proc
    push R2,R3 to [SP];
    R2 = C_BlockBin;     // 全部Erase
    R3 = 0;          // #代表失败
?L_EraseLoop:
    R1 = R2;  
    call _SamsungEraseBlock
 
    R3+=R1;       // #代表失败
?L_BlockEraseSuccess:
    R2+=1;
    cmp R2, C_MaxBlock;
    jb ?L_EraseLoop;
    R1 = R3;
    pop R2,R3 from [SP];
    retf
.endp
//--------------------------------------------------------------------
//-- 宏名: MM_SendReadCmd
//-- 参数: r1=column,r2=page, r3=portA,r4=portB
//-- 发送 0x00, 0x01 or 0x50
//--------------------------------------------------------------------


MM_SendReadCmd:.proc
 r5 = sp
 r4 = [r5+3]      //get the portB
 r4 &= BASE_MASK
 push r4 to [sp]
 r4 |= (CLE_BIT|RE_BIT)   //CLE\RE hight
 [Port_IOB_Data] = r4
 r5 = 0x0000       //read cmd 0
 cmp r1,256
 jb ?MM_NotChArea
 r1 -= 256
 r5 = 0x0100       //read cmd 1
 cmp r1,256
 jb ?MM_NotChArea
 r1 -= 256      //read cmd 2
 r5 = 0x0500
?MM_NotChArea:
 r4 |= r5      //or the cmd
 [Port_IOB_Data] = r4
 r4 |= WE_BIT     //WE高电平
 nop      //test
 nop
 nop
 nop
 [Port_IOB_Data] = r4
 r4 &= 0x00c0
 r4 |= (WE_BIT|ALE_BIT|RE_BIT) //CLE低电平 , WE高电平 , ALE高电平 , RE高电平
 nop
 nop
 nop
 [Port_IOB_Data] = r4
 //............写地址...............
 r4 &= 0xffc0
 r4 |= (ALE_BIT|RE_BIT)   //WE low
 nop
 nop
 nop
 [Port_IOB_Data] = r4
 r1 = r1 lsl 4
 r1 = r1 lsl 4
 r4 |= r1
 nop
 nop
 [Port_IOB_Data] = r4   //addr0~7
 r5 = r4|WE_BIT
 nop      //test
 nop
 nop
 [Port_IOB_Data] = r5
 nop
 nop      //test
 nop
 nop
 [Port_IOB_Data] = r4
 r1 = r2 lsl 4     //get the addr
 r1 = r1 lsl 4
 r4 &=0x00ff
 r4 |= r1
 [Port_IOB_Data] = r4   //addr9~16
 r5 = r4|WE_BIT
 nop      //test
 nop
 nop
 nop
 [Port_IOB_Data] = r5
 nop
 nop      //test
 nop
 nop
 [Port_IOB_Data] = r4
 r1 = r2&0xff00
 r4 &= 0x00ff
 r4 |= r1
 nop
 nop
 [Port_IOB_Data] = r4   //Addr17~24
 r5 = r4|WE_BIT
 nop      //test
 nop
 nop
 nop
 [Port_IOB_Data] = r5
 nop
 nop      //test
 nop
 nop
 [Port_IOB_Data] = r4
 
 r1 = [R_Addr25]
 r1 = R1 lsl 4
 r1 = r1 lsl 4
 r4 = r4 & 0x00ff
 r4 |= r1
 [Port_IOB_Data] = r4
 r5 = r4|WE_BIT
 nop      //test
 nop      //test
 nop
 nop
 [Port_IOB_Data] = r5
 nop
 nop      //test
 nop
 nop
 [Port_IOB_Data] = r4
 r1 = 0xffff
 r1 = r1^ALE_BIT
 r5 &= r1
 nop
 nop
 [Port_IOB_Data] = r5
 nop      //test
 nop
 nop
 pop r4 from [sp]
 retf
.endp


//--------------------------------------------------------------------
//-- 宏名: MM_SendWriteCmd
//-- 参数: column,page,portA,portB
//-- 发送 0x80
//--------------------------------------------------------------------
MM_SendWriteCmd: .proc
 r5 = sp
 r4 = [r5+3]      //get the portB
 r4 &= BASE_MASK
 push r4 to [sp]
 r4 |= (CLE_BIT|RE_BIT)   //CLE\RE hight
 [Port_IOB_Data] = r4
 r5 = 0x0000       //read cmd 0
 cmp r1,256
 jb ?MM_NotChArea_W
 r1 -= 256
 r5 = 0x0100       //read cmd 1
 cmp r1,256
 jb ?MM_NotChArea_W
 r1 -= 256      //read cmd 2
 r5 = 0x0500
?MM_NotChArea_W:
 r4 |= r5      //or the cmd
 [Port_IOB_Data] = r4
 r4 |= WE_BIT     //WE高电平
 [Port_IOB_Data] = r4
 r4 &= 0x00c0
 R4 |= (CLE_BIT|RE_BIT)
 [Port_IOB_Data] = R4
 R4 |= 0x8000       // 连续数据输入命令
 [Port_IOB_Data] = R4
 R4 |= WE_BIT
 [Port_IOB_Data] = R4   //WE高电平
 r4 &= 0x00c0
 r5 = r4|(ALE_BIT|RE_BIT)
 R4 |= (WE_BIT|ALE_BIT|RE_BIT) //CLE低电平 , WE高电平 , ALE高电平 , RE高电平
 [Port_IOB_Data] = R4
 //.....写地址.....................
 [Port_IOB_Data] = r5//portB   //WE低电平
 r1 = r1 lsl 4
 r1 = r1 lsl 4
 r5 |= r1
 [Port_IOB_Data] = r5//column  //Address0 - 7
 r4 |= r1
 [Port_IOB_Data] = R4   //WE, ALE, RE高电平
 [Port_IOB_Data] = r5   //WE低电平
 r1 = r2 lsl 4
 r1 = r1 lsl 4
 r5 &= 0x00ff
 r5 |= r1
 [Port_IOB_Data] = R5  //Address9 - 16
 r4 &= 0x00ff
 r4 |= r1
 [Port_IOB_Data] = r4   //WE, ALE高电平
 [Port_IOB_Data] = r5   //WE低电平
 r2 &= 0xff00
 r5 &= 0x00ff
 r5 |= r2
 [Port_IOB_Data] = r5  //Address17 - 22
 r4 &= 0x00ff
 r4 |= r2
 [Port_IOB_Data] = R4  //WE, ALE高电平  
//for debug,no a25
 [Port_IOB_Data] = R5  //WE低电平
 r1 = [R_Addr25]//0     //Edit by xinqiang 2004.12.20 从寄存器中读取高位地址
 r1 = r1 lsl 4
 r1 = r1 lsl 4
 r5 &= 0x00ff
 r5 |= r1
 [Port_IOB_Data] = r5   //Address25
 r4 &= 0x00ff
 r4 |= r1
 [Port_IOB_Data] = R4  //WE, ALE高电平
//
 pop r4 from [sp]
 retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungGetStatus_1  得到Flash 状态
//-- 参数: 无
//-- 返回值: R1 = Status.
//2004.12.23   Edit by xinqiang zhang  for change IO
//--------------------------------------------------------------------
_SamsungGetStatus_1: //.proc
 push R2, R5 to [SP]
    M_SaveIoSetting_1;
 //......init port A0-A7 as output.......
 M_InitIOAOut_1;
 //......send 命令 ....................
 R5 = SP
 R2 = [R5+1]     //portA
 r2 &= BASE_MASK
 r3 = r2
// R3 = [R5+2]     //portB
 R4 = (CLE_BIT|RE_BIT)
 R4 |= R2
 [Port_IOB_Data] = R4
 R5 = 0x7000//0x0070      //read0 命令
 R5 |= r4//R2
// r2 = r2|r5
 [Port_IOB_Data] = R5
 R5 |= WE_BIT
 [Port_IOB_Data] = R5  //WE高电平
 R4 = (WE_BIT|RE_BIT)  //CLE低电平 , WE高电平 , RE高电平
 R4 |= R2
 [Port_IOB_Data] = R4
 //.....init port A0-A7 as input..........
 M_InitIOAIn_1;
 //.......................................
 R4 = WE_BIT     //RE低电平
 R4 |= R3
 [Port_IOB_Data] = R4
 nop
 R1 = [Port_IOB_Data]  
 R1 &= 0xff00
 r1 = r1 lsr 4
 r1 = r1 lsr 4
 M_RetrieveIoSetting_1;
 pop R2, R5 from [SP]
 retf

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条