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

📄 spba.asm

📁 本文以举例的方式从硬件和软件原理上阐述了如何运用SPBA01B对MCU进行IO扩展、总线扩展和级联使用.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
//	0x00007FFF					  0x7FFF		____|	
//                              				____
//  0x00008000					  0x8000			|
//	0x0000BFFF					  0xBFFF			|--Inc Bank
//	0x0000C000					  0x4000			|
//  0x0000FFFF					  0x7FFF		____|
//												____
//  0x00010000					  0x8000		    |
//	0x00013FFF					  0xBFFF			|--Inc Bank
//  0x00014000					  0x4000			|	
//	0x00017FFF					  0x7FFF		____|	
//	  ...							...			
//	  ...							...			____
//  0xffff0000					  0x8000		    |
//	0xffff3FFF					  0xBFFF			|--Inc Bank
//  0xffff4000					  0x4000			|	
//	0xffff7FFF					  0x7FFF		____|	  
//================================================================
//================================================================
.Public	F_SP_SPBA_SetAddress;
F_SP_SPBA_SetAddress:
				r1 = [R_BEXBankNum];
				r1 &= 0x8000;					
				jnz	L_SP_SPBA_NotFirstSetAddr
				r1 = [R_BEXBankNum];
				r1 |= 0x8000;					//Clear First Read/Write SPBA Flag
				[R_BEXBankNum] = r1;
				jmp	L_SP_SPBA_FirstSetAddr
L_SP_SPBA_NotFirstSetAddr:				
				r1 = [R_BEXLowAddr];			
				cmp	r1,0x0000;					
				je	L_IncBEXBank01;
				cmp	r1,0x8000;
				je	L_IncBEXBank02;
L_SP_SPBA_FirstSetAddr:
				r1 = [R_BEXLowAddr];			//One Bank,totally 32KB
				cmp	r1,0x8000;					//Start from 8000~BFFF,4000~7FFF
				jae	L_HighPart;
				cmp	r1,0x4000;
				jae	L_2ndGroup;
				r1 = [R_BEXLowAddr];			
				r1 += 0x8000;					//1st Group
				[R_BEXLowAddr] = r1;
L_2ndGroup:
				call	F_SP_SPBA_GetBEXAddr;
				retf;
	
L_HighPart:
				cmp	r1,0xc000;
				jb	L_4thGroup;
				r1 = [R_BEXLowAddr];
				r1 -= 0x8000;
				[R_BEXLowAddr] = r1;
L_4thGroup:
				call	F_SP_SPBA_GetBEXAddr;		//Two Byte
				retf;
											
L_IncBEXBank01:
				r1 = [R_BEXBankNum];
				r1 += 1;							//Inc Bank
				[R_BEXBankNum] = r1;
				r3 = 0x00;
				r4 = 0x00;						
				r2 = [R_BEXBankNum];
				call	F_WriteToSPBA;
				r1 = [R_BEXLowAddr];
				r1 += 0x8000;						
				[R_BEXLowAddr] = r1;
				call	F_SP_SPBA_GetBEXAddr;		//Two Byte
				retf;
					
L_IncBEXBank02:			
				r1 = [R_BEXBankNum];
				r1 += 1;							//Inc Bank
				[R_BEXBankNum] = r1;
				r3 = 0x00;
				r4 = 0x00;						
				r2 = [R_BEXBankNum];
				call	F_WriteToSPBA;
				call	F_SP_SPBA_GetBEXAddr;		//Two Byte
				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;
				[P_IO_Control_Buffer] = r1;
				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;					//BEX_AddrH
				[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;			//BEX_AddrL
				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;

				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;
//================================================================
////////////////WordAddr To Two ByteAddr///////////////////
.public	F_SP_SPBA_GetBEXAddr;
F_SP_SPBA_GetBEXAddr:
				r4 = [R_BEXLowAddr];
				r4 &= 0xff00;
				r4 = r4 lsr	4;
				r4 = r4 lsr 4;
				r3 = [R_BEXLowAddr];
				r3 &= 0x00ff;				//BEX Read AddrL
				retf;
//================================================================
//Bus Extender Resource Table (For a2000)
//================================================================
.public	T_SACM_A2000_SPBA_SpeechTable;
T_SACM_A2000_SPBA_SpeechTable:
				.dw	0x0000,0x0000;	//Speech Index 0
				.dw	0x0000,0xb765;	//Speech Index 1
				.dw	0x0001,0xf3eA;	//Speech Index 2
				.dw	0x0003,0xe04f;	//Speech Index 3
				.dw	0x0004,0xef79;	//Speech Index 4
				.dw	0x0006,0x2bfe;	//Speech Index 5

/////////////////////////////////////////////////////////////////
//End of SPBA.asm
/////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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