📄 spr4096.asm
字号:
retf;
.ENDP
//=======================================================================================
//FunctionName:F_Delay_Program_Time
//Description:
//Author:
//Date:
//Destroy:
//Input:
//Return:
//========================================================================================
.public F_Delay_Program_Time;
F_Delay_Program_Time:
r1=C_Program_Time; //6
?L_Wait_Time_Over: //52cycle,1us @ 49Mhz
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
r1-=1; //3
jnz ?L_Wait_Time_Over; //5
retf; //12
//======================================================
// Function Name: F_WriteBufferTo4096
// Description: Program data in buffer to the SPR1024\4096 Flash.
// Input: Buffer address,Address Low,Address Mid,Address Hi
// Output: None
// Destroy: r1;
// Used: r1,bp;
// Stacks: 1;
//======================================================
_SP_WriteBufferTo4096:
F_WriteBufferTo4096: .PROC
push bp to [sp];
bp=sp;
bp+=7;
[P_SIO_Stop]=r1; //stop last transfer
r1=[bp--]; //get address from stack
[P_SIO_Addr_High]=r1;
r1=[bp--];
[P_SIO_Addr_Mid]=r1;
r1=[bp--];
[P_SIO_Addr_Low]=r1;
r1=B_SIO_En+B_SIO_Write_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
[P_SIO_Ctrl]=r1; //Write mode , CPU/16, 24 bit address
bp = [bp]; //get data buffer address from stack
?L_NextByte:
r1 = [bp++];
jz ?L_BufferOver;
[P_SIO_Start]=r1; //Start transfer
[P_SIO_Data]=r1; //program the data
?L_WaitTransfer:
R1 = [P_SIO_Start];
R1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer;
call F_Delay_Program_Time; //delay 60us
[P_SIO_Stop]=r1; //Stop transfer
r1 = [P_SIO_Addr_Low];
r1 += 1;
[P_SIO_Addr_Low] = r1;
r1 &= 0xFF;
jnz ?L_NextByte;
r1 = [P_SIO_Addr_Mid];
r1 += 1;
[P_SIO_Addr_Mid] = r1;
r1 &= 0xFF;
jnz ?L_NextByte;
r1 = [P_SIO_Addr_High];
r1 += 1;
[P_SIO_Addr_High] = r1;
jmp ?L_NextByte;
?L_BufferOver:
pop bp from [sp];
retf;
.ENDP
//======================================================
// Function Name: F_ReadARecordFrom4096
// Description: Read n byte from the SPR4096 Flash.
// Input: Record Number,Output Buffer
// Output: None
// Destroy: r1;
// Used: r1,bp;
// Stacks: 1;
//======================================================
_SP_ReadARecordFrom4096:
F_ReadARecordFrom4096: .PROC
push bp to [sp];
bp=sp+4;
[P_SIO_Stop]=r1; //stop last transfer
r1=C_TelMem_Addr_Lo;
[P_SIO_Addr_Low]=r1;
r1=[bp++]; //get Record number from stack
cmp r1,C_DownLoadCard;
jz ?L_DownLoad
r1 += C_TelMem_Addr_Mid;
[P_SIO_Addr_Mid]=r1;
r1 = C_TelMem_Addr_Hi;
[P_SIO_Addr_High]=r1;
?L_StartRead:
r1=B_SIO_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
[P_SIO_Ctrl]=r1; //Read mode , CPU/4, 24 bit address
[P_SIO_Start]=r1; //Start transfer
r1=[P_SIO_Data]; //preRead
bp = [bp]; //get output address
?L_ReadLoop:
?L_WaitTransfer:
R1 = [P_SIO_Start];
R1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer;
r1 = [P_SIO_Data]; //Read data
r1 &= 0x00FF;
cmp r1,0xFF; //Data over?
jz ?L_ReadOver;
[bp++] = r1;
jmp ?L_ReadLoop;
?L_ReadOver:
r1 = 0;
[bp] = r1;
?L_WaitTransfer1:
r1 = [P_SIO_Start];
r1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer1;
[P_SIO_Stop]=r1; //Stop transfer
pop bp from [sp];
retf;
?L_DownLoad:
r1 = C_DownLoad_Addr_Mid;
[P_SIO_Addr_Mid]=r1;
r1 = C_DownLoad_Addr_Hi;
[P_SIO_Addr_High]=r1;
jmp ?L_StartRead;
.ENDP
//======================================================
// Function Name: F_ReadARecordFrom4096RAM
// Description: Read n byte from the SPR4096 SRAM.
// Input: Record Number,Output Buffer
// Output: None
// Destroy: r1;
// Used: r1,bp;
// Stacks: 1;
//======================================================
_SP_ReadARecordFrom4096RAM:
F_ReadARecordFrom4096RAM: .PROC
push bp to [sp];
bp=sp+4;
r1 = [P_IOB_Buffer];
r1 |= 0x0800; //output high
[P_IOB_Data] = r1;
[P_SIO_Stop]=r1; //stop last transfer
r1=0;
[P_SIO_Addr_Low]=r1;
[P_SIO_Addr_High]=r1;
r1=[bp++]
r1 &= 0x7; //get Record number from stack
[P_SIO_Addr_Mid]=r1;
r1=B_SIO_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
[P_SIO_Ctrl]=r1; //Read mode , CPU/4, 16 bit address
[P_SIO_Start]=r1; //Start transfer
r1=[P_SIO_Data]; //preRead
bp = [bp]; //get output address
?L_ReadLoop:
?L_WaitTransfer:
R1 = [P_SIO_Start];
R1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer;
r1 = [P_SIO_Data]; //Read data
r1 &= 0x00FF;
cmp r1,0xFF; //Data over?
jz ?L_ReadOver;
[bp++] = r1;
jmp ?L_ReadLoop;
?L_ReadOver:
r1 = 0;
[bp] = r1;
?L_WaitTransfer1:
r1 = [P_SIO_Start];
r1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer1;
[P_SIO_Stop]=r1; //Stop transfer
r1 = [P_IOB_Buffer];
r1 &= 0xF7FF; //output high
[P_IOB_Data] = r1;
pop bp from [sp];
retf;
.ENDP
//======================================================
// Function Name: F_WriteARecordTo4096RAM
// Description: Write n byte To the SPR4096 SRAM.
// Input: Record Number,Input Buffer
// Output: None
// Destroy: r1;
// Used: r1,bp;
// Stacks: 1;
//======================================================
_SP_WriteARecordTo4096RAM:
F_WriteARecordTo4096RAM: .PROC
push bp to [sp];
bp=sp+4;
r1 = [P_IOB_Buffer];
r1 |= 0x0800; //output high
[P_IOB_Data] = r1;
[P_SIO_Stop]=r1; //stop last transfer
r1=0;
[P_SIO_Addr_Low]=r1;
[P_SIO_Addr_High]=r1;
r1=[bp++]
r1 &= 0x7; //get Record number from stack
[P_SIO_Addr_Mid]=r1;
r1=B_SIO_En+B_SIO_Write_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
[P_SIO_Ctrl]=r1; //Write mode , CPU/16, 16 bit address
bp = [bp]; //get data buffer address from stack
?L_NextByte:
r1 = [bp++];
jz ?L_BufferOver;
[P_SIO_Start]=r1; //Start transfer
[P_SIO_Data]=r1; //program the data
?L_WaitTransfer:
R1 = [P_SIO_Start];
R1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer;
[P_SIO_Stop]=r1; //Stop transfer
r1 = [P_SIO_Addr_Low];
r1 += 1;
[P_SIO_Addr_Low] = r1;
r1 &= 0xFF;
jnz ?L_NextByte;
r1 = [P_SIO_Addr_Mid];
r1 += 1;
[P_SIO_Addr_Mid] = r1;
jmp ?L_NextByte;
?L_BufferOver:
r1 = 0xFF;
[P_SIO_Start]=r1; //Start transfer
[P_SIO_Data]=r1; //program the data
?L_WaitTransfer1:
R1 = [P_SIO_Start];
R1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer1;
[P_SIO_Stop]=r1; //Stop transfer
r1 = [P_IOB_Buffer];
r1 &= 0xF7FF; //output high
[P_IOB_Data] = r1;
pop bp from [sp];
retf;
.ENDP
//======================================================
// Function Name: F_Clr4096RAM
// Description: Clear the SPR4096 SRAM.
// Input: Record Number,Input Buffer
// Output: None
// Destroy: r1;
// Used: r1,bp;
// Stacks: 1;
//======================================================
_SP_Clr4096RAM:
F_Clr4096RAM: .PROC
r1 = [P_IOB_Buffer];
r1 |= 0x0800; //output high
[P_IOB_Data] = r1;
[P_SIO_Stop]=r1; //stop last transfer
r2 = 0; //start from 0 record
r1 = 0;
[P_SIO_Addr_Low] = r1;
[P_SIO_Addr_High]=r1;
[P_SIO_Addr_Mid] = r2;
r1=B_SIO_En+B_SIO_Write_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
[P_SIO_Ctrl]=r1; //Write mode , CPU/16, 16 bit address
r1 = 0xFF;
?L_ClrLoop:
[P_SIO_Start]=r1; //Start transfer
[P_SIO_Data]=r1; //program the data
?L_WaitTransfer:
R1 = [P_SIO_Start];
R1 &= B_Busy; //check transfer over
JNE ?L_WaitTransfer;
[P_SIO_Stop]=r1;
r2 += 1;
r2 &= 7;
jz ?L_ClrOver;
[P_SIO_Addr_Mid] = r2;
jmp ?L_ClrLoop;
?L_ClrOver:
r1 = [P_IOB_Buffer];
r1 &= 0xF7FF; //output high
[P_IOB_Data] = r1;
retf
.ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -