📄 samsungflashv11.asm
字号:
//-- 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
[Port_IOB_Data] = r4
r4 &= 0x00c0
r4 |= (WE_BIT|ALE_BIT|RE_BIT) //CLE低电平 , WE高电平 , ALE高电平 , RE高电平
[Port_IOB_Data] = r4
//............写地址...............
r4 &= 0xffc0
r4 |= (ALE_BIT|RE_BIT) //WE low
[Port_IOB_Data] = r4
r1 = r1 lsl 4
r1 = r1 lsl 4
r4 |= r1
[Port_IOB_Data] = r4 //addr0~7
r5 = r4|WE_BIT
[Port_IOB_Data] = r5
// nop ////////.....
[Port_IOB_Data] = r4
r1 = r2 lsl 4 //get the addr
r1 = r1 lsl 4
r4 &=0x00ff
r4 |= r1
r5 = r4|WE_BIT
[Port_IOB_Data] = r4 //addr9~16
// nop /////......
[Port_IOB_Data] = r5
// nop
[Port_IOB_Data] = r4
r1 = r2&0xff00
r4 &= 0x00ff
r4 |= r1
r5 = r4|WE_BIT
[Port_IOB_Data] = r4 //Addr17~24
// nop
[Port_IOB_Data] = r5
// nop ////.....
[Port_IOB_Data] = r4
r1 = [R_Addr25]
r1 = R1 lsl 4
r1 = r1 lsl 4
r4 = r4 & 0x00ff
r4 |= r1
r5 = r4|WE_BIT
[Port_IOB_Data] = r4
// nop ////......
[Port_IOB_Data] = r5
r1 = 0xffff
r1 = r1^ALE_BIT
r5 &= r1
[Port_IOB_Data] = r5
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -