⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spba.asm

📁 SPBA01B是由凌阳公司开发的可级连的单片I0、总线扩展芯片。它具有使用简单、扩展能力强、性价比高的特点。本程序实现了如何利用SPBA01B来对SPCE061A进行IO扩展。
💻 ASM
字号:
//================================================================
//SPCE SPBA main file
//Date:			--2001.12.11			;start from spc module
//				
//================================================================
.include	hardware.inc;
//================================================================


//Define the SPBA control line pin number
.define	Pull_MC0_High    		0x0020;		//IO bit 5 as MC0
.define	Pull_MC1_High    		0x0040;		//IO bit 6 as MC1
.define	EnableBuxExt     		0x0080;		//IO bit 7 as CE
//----------------------------------------------------------------
//Using IOA as SPBA control line
.define	P_IO_Control_Data		0x7000;		//P_IOA_Data
.define	P_IO_Control_Buffer		0x7001;		//P_IOA_Buffer
.define	P_IO_Control_Dir		0x7002;		//P_IOA_Dir
.define	P_IO_Control_Attrib		0x7003;		//P_IOA_Attrib
//Using IOA as SPBA address/data line
.define	P_IO_Data_Data			0x7000;		//P_IOA_Data
.define	P_IO_Data_Buffer		0x7001;		//P_IOA_Buffer
.define	P_IO_Data_Dir			0x7002;		//P_IOA_Dir
.define	P_IO_Data_Attrib		0x7003;		//P_IOA_Attrib
//================================================================


.ram
.var	R_BEXBankNum;
.var	R_BEXLowAddr;

.code			
//================================================================
//================================================================
//SPCE + SPBA SOFTWARE API
//DATE:
//				2002.01.31;
//================================================================
//================================================================

//================================================================
//================================================================
//For Read SPBA API 
//================================================================
//================================================================
.public	_SP_SPBA_Initial;
.public	F_SP_SPBA_Initial;
_SP_SPBA_Initial:	.proc
F_SP_SPBA_Initial:
				push bp to [sp];
				call	F_SP_SPBA_IO_Initial;	//Initial I/O 
////////////////Initial BEX ////////////////////////
				call	F_SPBA_Configuration;	//Set Volume ID/Volume Select/CFG
				pop	bp from [sp];
				retf;
				.endp

////////////////I/O Initial////////////////////////////////
.public	F_SP_SPBA_IO_Initial;
F_SP_SPBA_IO_Initial:
				push r1 to [sp];
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xfff8;					//For DVR Three keys;下拉输入
				r1 |= 0x00e0;					//Three PIN for Control SPBA 高电平输出
				[P_IO_Control_Buffer] = r1;
								
				r1 = [P_IO_Control_Attrib];
				r1 &= 0xfff8;					//For DVR Three keys;
				r1 |= 0x00e0;					//Three PIN for Control SPBA
				[P_IO_Control_Attrib] = r1;
				
				r1 = [P_IO_Control_Dir];
				r1 &= 0xfff8;					//For DVR Three keys;
				r1 |= 0x00e0;					//Three PIN for Control SPBA
				[P_IO_Control_Dir] = r1;
//================================================================
				r1 = [P_IO_Data_Data];			//数据口初始化为高电平输出
				r1 |= 0xff00;
				[P_IO_Data_Data] = r1;
								
				r1 = [P_IO_Data_Attrib];
				r1 |= 0xff00;
				[P_IO_Data_Attrib] = r1;
				
				r1 = [P_IO_Data_Dir];
				r1 |= 0xff00;
				[P_IO_Data_Dir] = r1;
				pop r1 from [sp];
				retf;
//================================================================
.public	F_SPBA_Configuration;
F_SPBA_Configuration:
				push r1,r4 to [sp];
				r4 = 0x00; 
				r3 = 0x0d;		//Setting for Volume ID
				r2 = 0x01;		//Setting for First SPBA
				call	F_WriteToSPBA;
				
				r4 = 0x00;
				r3 = 0x23;		//Setting for CFG
				//;r2 = 0x67;		//Setting as CFG3
				r2 =0x18;		//abin
				call	F_WriteToSPBA;
				
				r4 = 0x00;
				r3 = 0x21;		//Setting for Volume Select
				r2 = 0x01;		//Setting for First SPBA (The Same as Volume ID)
				call	F_WriteToSPBA;
				pop	 r1,r4 from [sp];
				retf;
				
//================================================================
//Read Cycle
//================================================================
.public	F_ReadBEXData;
F_ReadBEXData:					
				push r2,r4 to [sp];
				call	F_Set_IOH_Output_Data;
				nop;
				nop;
///////////////EN/MC0/MC1 High for Send High Address/////////////
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xff1f;
				r1 |= EnableBuxExt+Pull_MC1_High+Pull_MC0_High;	
				[P_IO_Control_Buffer] = r1;
///////////////NOP Delay for SPBA ///////////////////////////////
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
			
///////////////Send High Addr/////////////////////////////////////
				r1 = [P_IO_Data_Buffer];
				r1 &= 0x00ff;
				r4 = r4 lsl 4;
				r4 = r4 lsl 4;
				r1 |= r4;
				[P_IO_Data_Buffer] = r1;
				nop;
				nop;			
///////////////EN/MC1 High for Send Low Address//////////////////
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xff1f;
				r1 |= EnableBuxExt+Pull_MC1_High;
				[P_IO_Control_Buffer] = r1;
				
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
///////////////Send Low Addr/////////////////////////////////////
				r1 = [P_IO_Data_Buffer];
				r1 &= 0x00ff;
				r3 = r3 lsl 4;
				r3 = r3 lsl 4;
				r1 |= r3;
				[P_IO_Data_Buffer] = r1;
				nop;
				nop;			
///////////////EN/MC0 High for Read Data///////////////////////////
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xff1f; 
				r1 |= EnableBuxExt+Pull_MC0_High;
				[P_IO_Control_Buffer] = r1;

				nop;
				nop;
				nop;
				nop;
				call	F_Set_IOH_Input_Data;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = [P_IO_Data_Data];			//High 8bit as Data Port; 
				r1 = r1 lsr 4;
				r1 = r1 lsr	4;					//Return Read Data
				nop;
				nop;
				nop;
				nop;				
///////////////EN/MC0/MC1 High for End/////////////////////////////
				r2 = [P_IO_Control_Buffer];
				r2 &= 0xff1f;
				r2 |= EnableBuxExt+Pull_MC1_High+Pull_MC0_High;
				[P_IO_Control_Buffer] = r2;
				nop;
				nop;
				nop;				
				r2 = [P_IO_Data_Buffer];
				r2 &= 0x00ff;
				[P_IO_Data_Buffer] = r2;
				nop;
				nop;
				pop r2,r4 from [sp];
				retf;
//================================================================

//================================================================
//Write Cycle
//================================================================
.public	F_WriteToSPBA;			
F_WriteToSPBA:							
				call	F_Set_IOH_Output_Data;
				nop;
				nop;
///////////////EN/MC0/MC1 High for Send High Address/////////////
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xff1f;
				r1 |= EnableBuxExt+Pull_MC1_High+Pull_MC0_High;
				
//.define	Pull_MC0_High    		0x0020;		//IO bit 5 as MC0
//.define	Pull_MC1_High    		0x0040;		//IO bit 6 as MC1
//.define	EnableBuxExt     		0x0080;		//IO bit 7 as CE
		
				[P_IO_Control_Buffer] = r1;//设置命令口 IOA5,IOA6,IOA7,准备送高8bit地址
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;				
///////////////Send High Addr/////////////////////////////////////
//r4 = 0x00;
//r3 = 0x0d;		//Setting for Volume ID
//r2 = 0x01;		//Setting for First SPBA
				
				r1 = [P_IO_Data_Buffer];
				r1 &= 0x00ff;
				r4 = r4 lsl 4;				//r4的低8bits为高地址
				r4 = r4 lsl 4;
				r1 |= r4;					//BEX_AddrH
				[P_IO_Data_Buffer] = r1;	//将高8bit地址送到I0A8-IOA15;	
				
				nop;
				nop;
///////////////EN/MC1 High for Send Low Address/////////////
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xff1f;
				r1 |= EnableBuxExt+Pull_MC1_High;//写送低8bits地址的命令
				[P_IO_Control_Buffer] = r1;
				
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
///////////////Send Low Addr/////////////////////////////////////
				r1 = [P_IO_Data_Buffer];
				r1 &= 0x00ff;
				r3 = r3 lsl 4;
				r3 = r3 lsl 4;
				r1 |= r3;
				[P_IO_Data_Buffer] = r1;	//BEX_AddrL,送低8bits的数据到IOA8-IOA15
				nop;
				nop;				
///////////////EN High for Write Data//////////////////////////////
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xff1f;
				r1 |= EnableBuxExt;
				[P_IO_Control_Buffer] = r1;//写写数据命令

////////////////Write Data/////////////////////////////////////////
				r1 = [P_IO_Data_Buffer];
				r1 &= 0x00ff;
				r2 = r2 lsl 4;
				r2 = r2 lsl 4;
				r1 |= r2;				 
				[P_IO_Data_Buffer] = r1;//将R2中的数据写到IOA8-IOA15

				nop;
				nop;
///////////////EN/MC0/MC1 High for End/////////////////////////////
				r1 = [P_IO_Control_Buffer];
				r1 &= 0xff1f;
				r1 |= EnableBuxExt+Pull_MC1_High+Pull_MC0_High;
				[P_IO_Control_Buffer] = r1;
				nop;
				nop;
				nop;
				nop;
				nop;
				nop;
				retf;
//================================================================

//================================================================
//================================================================
.public	F_Set_IOH_Output_Data;
F_Set_IOH_Output_Data:
				r1 = [P_IO_Data_Attrib];
				r1 |= 0xff00;				//
				[P_IO_Data_Attrib] = r1;
				r1 = [P_IO_Data_Dir];
				r1 |= 0xff00;
				[P_IO_Data_Dir] = r1;
				retf;
//================================================================
.public	F_Set_IOH_Input_Data;
F_Set_IOH_Input_Data:
				r1 = [P_IO_Data_Attrib];
				r1 |= 0xff00;				//
				[P_IO_Data_Attrib] = r1;
				r1 = [P_IO_Data_Dir];
				r1 &= 0x00ff;
				[P_IO_Data_Dir] = r1;
				retf;



/////////////////////////////////////////////////////////////////
//End of SPBA.asm
/////////////////////////////////////////////////////////////////
//================================================================
//add by abin
//================================================================
.public _SP_Write_XP0;
.public F_SP_Write_XP0;
_SP_Write_XP0: .proc
F_SP_Write_XP0:
	push bp to [sp];
	bp = sp + 1;
	push r1,r4 to [sp];
	r1 = [bp+3];					// IoValue=0x00ff or 0x0000
	
	r4 = 0x00; 
	r3 = 0x20;		//Setting for Volume ID
	r2 = r1;		//Setting for First SPBA
	call	F_WriteToSPBA;
	
	pop r1,r4 from [sp];			//Return BEX Data
	pop bp from [sp];

retf;
.endp;
//================================================================
//add by abin
//================================================================
.public _SP_Write_XP1;
.public F_SP_Write_XP1;
_SP_Write_XP1: .proc
F_SP_Write_XP1:
	push bp to [sp];
	bp = sp + 1;
	push r1,r4 to [sp];
	r1 = [bp+3];					// IoValue=0x00ff or 0x0000
	
	r4 = 0x00; 
	r3 = 0x21;		//Setting for Volume ID
	r2 = r1;		//Setting for First SPBA
	call	F_WriteToSPBA;
	
	pop r1,r4 from [sp];			//Return BEX Data
	pop bp from [sp];

retf;
.endp;
//================================================================
//add by abin
//================================================================
.public _SP_Write_XP2;
.public F_SP_Write_XP2;
_SP_Write_XP2: .proc
F_SP_Write_XP2:
	push bp to [sp];
	bp = sp + 1;
	push r1,r4 to [sp];
	r1 = [bp+3];					// IoValue=0x00ff or 0x0000
	
	r4 = 0x00; 
	r3 = 0x22;		//Setting for Volume ID
	r2 = r1;		//Setting for First SPBA
	call	F_WriteToSPBA;
	pop r1,r4 from [sp];			//Return BEX Data
	pop bp from [sp];

retf;
.endp;
//================================================================
//add by abin
//================================================================
.public _SP_Read_XP0;
.public F_SP_Read_XP0;
_SP_Read_XP0: .proc
F_SP_Read_XP0:
	push bp to [sp];
	bp = sp + 1;
	push r2,r4 to [sp];
	r4 = 0x00; 
	r3 = 0x20;		//Setting for Volume ID
	//r2 = r1;		//Setting for First SPBA
	call	F_ReadBEXData;
	pop r2,r4 from [sp];			//Return BEX Data
	pop bp from [sp];

retf;
.endp;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -