📄 spba.asm
字号:
//================================================================
//SPCE SPBA main file
//Date: --2001.12.11 ;start from spc module
//
//================================================================
.include hardware.inc;
//================================================================
//IO Interface:
// SPCE SPBA
//----------------------------------------------------------------
//For DVR Three Key
// IO_PortA0 --------- Record
// IO_PortA1 --------- Stop
// IO_PortA2 --------- Play
//----------------------------------------------------------------
//Control I/O:
// IO_PortA5 --------- MC0
// IO_PortA6 --------- MC1
// IO_PortA7 --------- Enable
//
//----------------------------------------------------------------
//Address/Data I/O:
// IO_PortA8 --------- Data0
// IO_PortA9 --------- Data1
// IO_PortA10 --------- Data2
// IO_PortA11 --------- Data3
// IO_PortA12 --------- Data4
// IO_PortA13 --------- Data5
// IO_PortA14 --------- Data6
// IO_PortA15 --------- Data7
//
//================================================================
//================================================================
//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
//================================================================
//================================================================
//Using IOB as SPBA control line
//.define P_IO_Control_Data 0x7005; //P_IOB_Data
//.define P_IO_Control_Buffer 0x7006; //P_IOB_Buffer
//.define P_IO_Control_Dir 0x7007; //P_IOB_Dir
//.define P_IO_Control_Attrib 0x7008; //P_IOB_Attrib
//Using IOB as SPBA address/data line
//.define P_IO_Data_Data 0x7005; //P_IOB_Data
//.define P_IO_Data_Buffer 0x7006; //P_IOB_Buffer
//.define P_IO_Data_Dir 0x7007; //P_IOB_Dir
//.define P_IO_Data_Attrib 0x7008; //P_IOB_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
.public _SP_SPBA_Read_Initial;
.public F_SP_SPBA_Read_Initial;
_SP_SPBA_Read_Initial: .proc
F_SP_SPBA_Read_Initial:
push bp to [sp];
bp = sp + 1;
push r3,r5 to [sp];
////////////////Initial BEXBank/////////////////////
///////////////Get High WordAddr////////////////////////////
r2 = [bp+3]; //SpeechIndex
r2 = r2 lsl 1; //X2, Because of Two WordAddr(Long)
r1 = T_SACM_A2000_SPBA_SpeechTable;
r1 += r2;
r4 = [r1]; //High WordAddr
r5 = [r1]; //Save High WordAddr
////////////////Get Low WordAddr/////////////////////
r2 += 1;
r1 = T_SACM_A2000_SPBA_SpeechTable;
r1 += r2;
r3 = [r1]; //Low WordAddr
[R_BEXLowAddr] = r3;
call F_SP_SPBA_InitBank; //Get BankNum And Write to SPBA
r1 = [R_BEXBankNum];
r1 &= 0x7fff; //Bit15 is Flag to First Read SPBA
[R_BEXBankNum] = r1;
////////////////Return longWord Address////////////////////
r2 = r5; //Return High WordAddr
r1 = [R_BEXLowAddr]; //Return Low WordAddr
pop r3,r5 from [sp];
pop bp from [sp];
retf;
.endp
.public _SP_SPBA_ReadWord;
.public F_SP_SPBA_ReadWord;
_SP_SPBA_ReadWord: .PROC
F_SP_SPBA_ReadWord:
push bp to [sp];
bp = sp + 1;
push r2,r5 TO [SP]
r3 = [bp+3]; //Low BEXAddress
r4 = [bp+4]; //High BEXAddress
[R_BEXLowAddr] = r3;
////////////////Get Low Byte Data///////////////////
call F_SP_SPBA_SetAddress; //Get BEX Address
call F_ReadBEXData; //Get BEX Data
r5 = r1; //Return Low Byte BEX Data
r1 = [R_BEXLowAddr];
r1 += 1;
[R_BEXLowAddr] = r1;
////////////////Get High Byte Data///////////////////
call F_SP_SPBA_SetAddress; //Get BEX Address
call F_ReadBEXData; //Get BEX Data
r1 = r1 lsl 4; //Return High Byte BEX Data
r1 = r1 lsl 4;
r1 += r5; //Return Word;
pop r2,r5 from [sp];
pop bp from [sp];
retf;
.ENDP
.public _SP_SPBA_ReadByte;
.public F_SP_SPBA_ReadByte;
_SP_SPBA_ReadByte: .PROC
F_SP_SPBA_ReadByte:
push bp to [sp];
bp = sp + 1;
push r2,r4 to [sp];
r3 = [bp+3]; // BEXAddress
r4 = [bp+4];
[R_BEXLowAddr] = r3;
////////////////Get Byte///////////////////
call F_SP_SPBA_SetAddress; //Get BEX Address
call F_ReadBEXData; //Get BEX Data
pop r2,r4 from [sp]; //Return BEX Data
pop bp from [sp];
retf;
.ENDP
//================================================================
//================================================================
//For Write SPBA API
//================================================================
//================================================================
.public _SP_SPBA_Write_Initial;
.public F_SP_SPBA_Write_Initial;
_SP_SPBA_Write_Initial: .proc
F_SP_SPBA_Write_Initial:
push bp to [sp];
push r1,r4 to [sp];
////////////////Initial BEXBank/////////////////////
////////////////Set High WordAddr///////////////////
r4 = 0x00;
////////////////Set Low WordAddr////////////////////
r3 = 0x00;
[R_BEXLowAddr] = r3;
call F_SP_SPBA_InitBank; //Get BankNum And Write to SPBA
r1 = [R_BEXBankNum];
r1 &= 0x7fff; //Bit15 is Flag to First Write SPBA
[R_BEXBankNum] = r1;
pop r1,r4 from [sp];
pop bp from [sp];
retf;
.endp
//================================================================
.public _SP_SPBA_WriteWord;
.public F_SP_SPBA_WriteWord;
_SP_SPBA_WriteWord: .PROC
F_SP_SPBA_WriteWord:
push bp to [sp];
bp = sp + 1;
push r1,r5 TO [SP]
r3 = [bp+3]; //Low BEXAddress
r4 = [bp+4]; //High BEXAddress
r5 = [bp+5]; //Data of Write
[R_BEXLowAddr] = r3;
////////////////Write Low Byte Data///////////////////
call F_SP_SPBA_SetAddress; //Get BEX Address
r2 = r5;
r2 &= 0x00ff; //Low Byte
call F_WriteToSPBA; //Write Data To SPBA
////////////////Write High Byte Data///////////////////
r1 = [R_BEXLowAddr];
r1 += 1;
[R_BEXLowAddr] = r1;
call F_SP_SPBA_SetAddress; //Get BEX Address
r2 = r5;
r2 &= 0xff00; //High Byte
r2 = r2 lsr 4;
r2 = r2 lsr 4;
call F_WriteToSPBA; //Write Data To SPBA
pop r1,r5 from [sp];
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;
////////////////Get BankNum And Set BEX Bank/////////////////////
.public F_SP_SPBA_InitBank;
F_SP_SPBA_InitBank:
////////////////Check Low Word Address //////////////////////////
push r1,r4 to [sp];
r1 = [R_BEXLowAddr]; //Low WordAddr
cmp r1,0x8000; //1st Bank Or 2nd Bank
jae L_Set_Bank_IncOne;
////////////////Initial Bank/////////////////////////////////////
r1 = r4; //High WordAddr
r1 = r1 lsl 1; //Count Start Bank
r1 += 0x80; //CFG3;CE0 To Select 4MB
[R_BEXBankNum] = r1;
r3 = 0x00;
r4 = 0x00;
r2 = [R_BEXBankNum];
call F_WriteToSPBA;
pop r1,r4 from [sp];
retf;
L_Set_Bank_IncOne:
r1 = r4; //High WordAddr
r1 = r1 lsl 1; //Count Start Bank
r1 += 0x81; //CFG3;CE0 To Select 4MB
[R_BEXBankNum] = r1;
r3 = 0x00;
r4 = 0x00;
r2 = [R_BEXBankNum];
call F_WriteToSPBA;
pop r1,r4 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
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;
//================================================================
////////////////Get BEX Address//////////////////////////////////
//Real Address BEX Address
// ____
// 0x00000000 0x8000 |
// 0x00003FFF 0xBFFF |--1st Bank
// 0x00004000 0x4000 |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -