📄 spba.asm
字号:
// 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 + -