📄 gset.c
字号:
/* Set General Information
Description - These routines are called to set various parameters or
modes on the Excalibur card.
*/
#include <stdio.h>
#include "proto.h"
short broadcast[Max_Channels] = {0};
short pingpong[Max_Channels] = {0};
extern short curchan, milstd1553B;
extern short exists[Max_Channels];
int temp;
void zeroMultibufFlag(void);
/*
* Set_PingPong allows the user to choose whether the board should
* enable the ping pong double buffering system.
*/
int borland_dll Set_PingPong(short Pingpong_Flag)
{
if (Pingpong_Flag)
{
wForceWordWrite = exc_summit->control | PPEN;
exc_summit->control = wForceWordWrite;
pingpong[curchan] = PPEN;
}
else
{
wForceWordWrite = exc_summit->control & ~PPEN;
exc_summit->control = wForceWordWrite;
pingpong[curchan] = 0;
}
return 0;
}
/*
* Set_Broadcast allows the user to choose whether the board should regard
* RT #31 as a regular RT or as the RT Broadcast address.
*/
int borland_dll Set_Broadcast (short Broadcast_Flag)
{
if (Broadcast_Flag == BROADCAST)
{
wForceWordWrite = exc_summit->control | BROADCAST;
exc_summit->control = wForceWordWrite;
broadcast[curchan] = BROADCAST;
}
else if (Broadcast_Flag == NOBROADCAST)
{
wForceWordWrite = exc_summit->control & ~BROADCAST;
exc_summit->control = wForceWordWrite;
broadcast[curchan] = 0;
}
else return einval;
return 0;
} /* end Set_Broadcast */
/*
* Get_Broadcast returns 0 if RT 31 is a regular RT and >0 if RT 31
* represents a Broadcast command.
*/
int borland_dll Get_Broadcast (void)
{
return (exc_summit->control & BROADCAST);
} /* end Get_Broadcast */
/*
* Get_BIT returns information on the current health of the board
*/
int borland_dll Get_BIT (void)
{
return (exc_summit->bit_word);
} /* end Get_BIT */
/*
* Get_Pending returns all interrupts received since the last call on
* Get_Pending, and reads another register in order to clear the Pending register
*/
int borland_dll Get_Pending (void)
{
int status;
status = exc_summit->int_pending;
temp = exc_summit->bit_word;
return (status);
} /* end Get_Pending */
/*
* Set Mode routine, e.g., BC MODE
* This routine changes the current mode to any other
* mode. It performs a reset of the card and initializes
* the board to its default values for the desired mode.
*/
int borland_dll Set_Mode (short mode)
{
int i, idx;
unsigned short bufstart;
if ((mode != BC_MODE) && (mode != RT_MODE) && (mode != BM_RT_MODE) && (mode != BM_MODE))
return einval;
curmode = mode;
zeroMultibufFlag();
Reset_Channel(curchan);
/* exc_summit->control = RESET; */
for(i=0;i<500;i++)
{
Sleep(10L);
if (exc_summit->control == 0) break;
}
if (i==500)
return(etimeout);
/* Clear memory (lower half) */
for (i=Start_DPRAM; i<BANKSIZE; i++)
exc_summit_int[i] = Clear_Pattern;
if (mode == RT_MODE)
{
exc_summit->control = broadcast[curchan];
exc_summit->status = RT_MODE;
exc_summit->current_cmd_block = 0;
exc_summit->int_mask = 0;
exc_summit->int_pending = 0;
exc_summit->intr_log_list = INIT_RT_DSCRPT - 32; /* last 32 words of data area */
exc_summit->bit_word = 0;
exc_summit->timetag_minor = 0;
exc_summit->pointer = INIT_RT_DSCRPT; /* descriptor blocks */
exc_summit->status1553 = 0;
for (i=0; i<16; i++)
exc_summit->illegal[i] = 0;
bufstart = INIT_RT_BUFFER;
idx = INIT_RT_DSCRPT;
/* Add buffers for ping pong double buffering. reduce mode code
buffer size to make room for the new buffers
*/
for (i=0; i < 32; i++) /* receive descriptors */
{
exc_summit_int[ idx ] = 0x1; /* separate Broadcast */
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = (unsigned short)(bufstart + MCH_BUFSIZE); /* added in: pingpong */
exc_summit_int[ idx + 3] = (unsigned short)(bufstart + (MCH_BUFSIZE * 2));
idx += DESCRIPTORSIZE;
bufstart += (unsigned short)(MCH_BUFSIZE*3); /* pingpong */
}
for (i=0; i < 32; i++) /* transmit descriptors */
{
exc_summit_int[ idx ] = 0;
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = bufstart + MCH_BUFSIZE; /* Pingpong */
exc_summit_int[ idx + 3] = 0;
idx += DESCRIPTORSIZE;
bufstart +=(unsigned short) (MCH_BUFSIZE*2); /* Pingpong */
}
for (i=0; i < 32; i++) /* receive mode descriptors */
{
exc_summit_int[ idx ] = 0x1; /* separate Broadcast */
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = bufstart + MODEBUFSIZE; /* Pingpong */
exc_summit_int[ idx + 3] = (unsigned short)(bufstart + (MODEBUFSIZE * 2)); /* Pingpong */
idx += DESCRIPTORSIZE;
bufstart +=(unsigned short) (MODEBUFSIZE*3); /* Pingpong*/
}
for (i=0; i < 32; i++) /* transmit mode descriptors */
{
exc_summit_int[ idx ] = 0;
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = bufstart + MODEBUFSIZE; /* Pingpong */
exc_summit_int[ idx + 3] = 0;
idx += DESCRIPTORSIZE;
bufstart += (unsigned short) (MODEBUFSIZE*2); /* Pingpong */
}
} /* end if mode == RT_MODE */
else if (mode == BC_MODE)
{
exc_summit->control = broadcast[curchan];
exc_summit->status = BC_MODE;
exc_summit->current_cmd_block = 0;
exc_summit->int_mask = 0;
exc_summit->int_pending = 0;
exc_summit->intr_log_list = CMDOFFSET - 32; /* last 32 words of data area */
exc_summit->bit_word = 0;
exc_summit->timetag_minor = 0;
exc_summit->pointer = CMDOFFSET; /* Command blocks */
exc_summit->BC_initcount = 0;
}
else if (mode == BM_MODE)
{
exc_summit->control = broadcast[curchan];
exc_summit->status = BM_MODE;
exc_summit->current_cmd_block = 0;
exc_summit->int_mask = 0;
exc_summit->int_pending = 0;
exc_summit->intr_log_list = INIT_MON_BLK - 32; /* last 32 words of data area */
exc_summit->bit_word = 0;
exc_summit->timetag_minor = 0;
exc_summit->cmd_blk_ptr = INIT_MON_BLK;
exc_summit->data_ptr = INIT_DATA_BLK;
exc_summit->blk_counter = MAXMESSAGES;
exc_summit->filter1 = 0;
exc_summit->filter2 = 0;
}
else if (mode == BM_RT_MODE)
{
exc_summit->control = broadcast[curchan];
exc_summit->status = BM_RT_MODE;
exc_summit->current_cmd_block = 0;
exc_summit->int_mask = 0;
exc_summit->int_pending = 0;
exc_summit->intr_log_list = INIT_RT_DSCRPT - 32; /* last 32 words of data area */
exc_summit->bit_word = 0;
exc_summit->timetag_minor = 0;
exc_summit->cmd_blk_ptr = INIT_MON_BLK;
exc_summit->data_ptr = INIT_DATA_BLK;
exc_summit->blk_counter = MAXMESSAGES;
exc_summit->pointer = INIT_RT_DSCRPT; /* descriptor blocks */
exc_summit->status1553 = 0;
exc_summit->filter1 = 0;
exc_summit->filter2 = 0;
for (i=0; i<16; i++)
exc_summit->illegal[i] = 0;
bufstart = INIT_RT_BUFFER;
idx = INIT_RT_DSCRPT;
for (i=0; i < 32; i++) /* receive descriptors */
{
exc_summit_int[ idx ] = 0x1; /* separate Broadcast */
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = 0;
exc_summit_int[ idx + 3] =(unsigned short)(bufstart + MCH_BUFSIZE);
idx += DESCRIPTORSIZE;
bufstart += (unsigned short)(MCH_BUFSIZE*2);
}
for (i=0; i < 32; i++) /* transmit descriptors */
{
exc_summit_int[ idx ] = 0;
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = 0;
exc_summit_int[ idx + 3] = 0;
idx += DESCRIPTORSIZE;
bufstart +=(unsigned short) MCH_BUFSIZE;
}
for (i=0; i < 32; i++) /* receive mode descriptors */
{
exc_summit_int[ idx ] = 0x1; /* separate Broadcast */
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = 0;
exc_summit_int[ idx + 3] = (unsigned short)(bufstart + MCH_BUFSIZE);
idx += DESCRIPTORSIZE;
bufstart += (unsigned short)(MCH_BUFSIZE*2);
}
for (i=0; i < 32; i++) /* transmit mode descriptors */
{
exc_summit_int[ idx ] = 0;
exc_summit_int[ idx + 1] = bufstart;
exc_summit_int[ idx + 2] = 0;
exc_summit_int[ idx + 3] = 0;
idx += DESCRIPTORSIZE;
bufstart += (unsigned short)MCH_BUFSIZE;
}
}
return 0;
} /* end Set_Mode */
int borland_dll Stop_Card (void) /* Stop board execution */
{
wForceWordWrite = exc_summit->control & (usint)~START_EXECUTION;
exc_summit->control = wForceWordWrite;
return 0;
} /* end Stop_Card */
int borland_dll Set_Protocol (short mode) /* Setup response time parameters */
{
if ((mode != MIL_STD_1553A) && (mode != MIL_STD_1553B))
return einval;
if (mode == MIL_STD_1553A)
{
wForceWordWrite = exc_summit->status | 0x80;
exc_summit->status = wForceWordWrite;
milstd1553B = 0;
}
else
{
wForceWordWrite = exc_summit->status & 0xff7f;
exc_summit->status = wForceWordWrite;
milstd1553B = 1;
}
return 0;
} /* end Set_Protocol */
int borland_dll Report_Channel (void)
{
return curchan;
} /* end Report_Channel */
int borland_dll Get_Channel_Status (unsigned short channel)
{
short j;
usint pattern;
if(channel >= Max_Channels) return 0;
if (exists[channel] == 0) return 0;
if ( (channel*2) < 0) return 0 ;
pattern = 0xaaaa;
for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
exc_summit_int[j] = pattern;
for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
if ((exc_summit_int[j]) != pattern)
return 0;
pattern = Clear_Pattern;
for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
exc_summit_int[j] = pattern;
for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
if ((exc_summit_int[j]) != pattern)
return 0;
return 1;
} /* end Get_Channel_Status */
/*
* Get_Curr_Command_Word returns the most recently processed command word
*/
int borland_dll Get_Curr_Command_Word (void)
{
return (exc_summit->current_cmd_block);
} /* end Get_Curr_Command_Word */
/* obsolete */
int borland_dll Get_Curr_Command (void)
{
return (Get_Curr_Command_Word());
} /* end Get_Curr_Command */
int borland_dll Get_Op_Status(void)
{
return (exc_summit->status);
}
borland_dll usint* Get_Memory_Pointer(unsigned int offset)
{
return(exc_summit_int + offset);
}
borland_dll usint* Get_Register_Pointer(unsigned int offset)
{
return((usint*)(exc_summit) + offset);
}
int borland_dll Peek_Memory(unsigned int offset, usint *value)
{
usint *mempointer;
/* if (offset >= 0x10000)*/
if (offset >= BANKSIZE)
return einval;
mempointer = Get_Memory_Pointer(offset);
*value = *mempointer;
return 0;
}
int borland_dll Poke_Memory(unsigned int offset, usint value)
{
usint *mempointer;
/* if (offset >= 0x10000)*/
if (offset >= BANKSIZE)
return einval;
mempointer = Get_Memory_Pointer(offset);
*mempointer = value;
return 0;
}
int borland_dll Peek_Register(usint offset, usint *value)
{
usint *regpointer;
if (offset >= 32)
return einval;
regpointer = Get_Register_Pointer(offset);
*value = *regpointer;
return 0;
}
int borland_dll Poke_Register(usint offset, usint value)
{
usint *regpointer;
if (offset >= 32)
return einval;
regpointer = Get_Register_Pointer(offset);
*regpointer = value;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -