📄 spba.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 + -