📄 rtset.c
字号:
#include "proto.h"
#include <stdio.h>
#include <stddef.h>
extern short curchan;
extern short broadcast[ Max_Channels ] ;
extern short pingpong[Max_Channels];
extern int intnum;
int gMultiBuf = 0;
#define IMMEDIATE_BIT 0x8000
#define MAXBUFFERS 271
/* set the RT number in single RT mode */
int borland_dll Set_RT_Num (short rtid)
{
unsigned short parity, i;
if ((curmode != RT_MODE) && (curmode != BM_RT_MODE) )
return (emode);
if ((rtid < 0) || (rtid > 31))
return (einval);
parity = 0;
for (i=0; i<5; i++)
parity += (unsigned short)((rtid >> i) & 1);
parity &= 1; /* parity indicates odd or even number of bytes */
parity ^= 1; /* force parity odd */
wForceWordWrite = (usint) ((parity << 10) + (rtid << 11)) | (exc_summit->status & 0x03ff) ;
exc_summit->status = wForceWordWrite;
return(0);
} /* end Set_RT_Num */
int borland_dll Load_Datablk (unsigned short subaddress, unsigned short modecode, unsigned short *data)
{
unsigned short dataind;
unsigned short cardindex;
unsigned short maxdata;
unsigned short offset; /* for pingpong */
int ctrl_word_offset;
if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
return (emode);
if (subaddress > MODECODE)
return (einval);
if (modecode > 31)
return (einval);
/* support ping pong double buffering. check ping pong bit in control word
and get current buffer from the appropriate descriptor table entry
*/
if (subaddress == MODECODE)
{
offset = (unsigned short) 64; /* pingpong */
offset += (unsigned short) 32; /* pingpong, for transmit */
maxdata = 1;
offset += modecode;
}
else
{
offset = (unsigned short) 32; /* pingpong, for transmit */
maxdata = 32;
offset += subaddress;
}
ctrl_word_offset = INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE);
if (gMultiBuf == 1)
cardindex = exc_summit_int[ ctrl_word_offset + 3];
else
if (pingpong[curchan])
{
printf("pingpong[curchan] : %d",pingpong[curchan]);
if (exc_summit_int[ ctrl_word_offset & PINGPONG])
cardindex = exc_summit_int[ctrl_word_offset + 1];
else
cardindex = exc_summit_int[ctrl_word_offset + 2];
}
else
cardindex = exc_summit_int[(ctrl_word_offset + 1)];
/* pingpong to here */
for (dataind=0; dataind < maxdata; dataind++)
exc_summit_int[cardindex+dataind+2] = data[dataind];
return(0);
} /* end Load_Datablk */
int borland_dll Read_Datablk (unsigned short subaddress, unsigned short modecode, unsigned short *data, short msgtype, short txorrx)
{
unsigned short dataind;
unsigned short cardindex;
unsigned short maxdata;
unsigned short offset=0; /* pingpong */
if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
return (emode);
if (subaddress > MODECODE)
return (einval);
if (modecode > 31)
return (einval);
if ((msgtype != STANDARD) && (msgtype != BRDCAST) && (msgtype != MODE)
&& (msgtype != BROADCAST_MODE))
return (einval);
if ((txorrx != TRANSMIT) && (txorrx != RECEIVE))
return (einval);
if ((subaddress == MODECODE) ^ ((msgtype == MODE) || (msgtype == BROADCAST_MODE)))
return (incompatible_parameters);
/* support ping pong double buffering. check ping pong bit in control word
and get current buffer from the appropriate descriptor table entry.
*/
if ((msgtype == MODE) || (msgtype == BROADCAST_MODE))
{
offset = (unsigned short) 64;
offset += modecode; /* 13/03/03 */
maxdata = 1;
}
else
{
maxdata = 32;
offset += subaddress;
}
if (txorrx == TRANSMIT)
offset += 32;
if ((msgtype == BRDCAST) || (msgtype == BROADCAST_MODE))
cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 3];
else
{
if (gMultiBuf == 1)
cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 3];
else
if (pingpong[curchan])
{
if (exc_summit_int[ INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) ] & PINGPONG)
cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 1];
else
cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 2];
}
else
{
cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 1];
}
}
for (dataind=0; dataind < maxdata+2; dataind++)
data[dataind] = exc_summit_int[cardindex+dataind];
return(0);
} /* end Read_Datablk */
int borland_dll Set_RT_Status (short status)
{
if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
return (emode);
/* don't touch Immediate Clear bit */
wForceWordWrite = ((usint) status & ~IMMEDIATE_BIT);
exc_summit->status1553 = wForceWordWrite;
return(0);
} /* end Set_RT_Status */
int borland_dll Set_Status_Clear (short flag)
{
if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
return (emode);
if ((flag != IMMEDIATE) && (flag != STATIC))
return (einval);
/* touch only Immediate Clear bit */
if (flag == IMMEDIATE)
{
wForceWordWrite = exc_summit->status1553 | IMMEDIATE_BIT;
exc_summit->status1553 = wForceWordWrite;
}
else
{
wForceWordWrite = exc_summit->status1553 & ~IMMEDIATE_BIT;
exc_summit->status1553 = wForceWordWrite;
}
return(0);
} /* end Set_Status_Clear */
int borland_dll Set_Interrupt_Mask (unsigned short intr)
{
exc_summit->int_mask = intr; /* Merlin uses mask without a real interrupt */
if (intnum == 0)
return (noirqset);
return(0);
} /* end Set_Interrupt_Mask */
int borland_dll Run_RT (void)
{
#define BUFFERMODE2 0x180
unsigned short controlval;
if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
return (emode);
if (curmode == BM_RT_MODE)
{
exc_summit->cmd_blk_ptr = INIT_MON_BLK;
exc_summit->data_ptr = INIT_DATA_BLK;
exc_summit->blk_counter = MAXMESSAGES;
nextmsg = 0;
}
controlval = (unsigned short)( START_EXECUTION | BUAEN | BUBEN | broadcast[curchan] | pingpong[curchan]);
if (gMultiBuf == 1)
controlval |= (unsigned short)BUFFERMODE2; /* hopefully pingpong and broadcast not set */
exc_summit->control = controlval;
return(0);
} /* end Run_RT */
#define TRANSMIT_OFFSET 2
#define BROAD_OFFSET 4
#define MODE_OFFSET 8
int borland_dll Set_Legal_Command (unsigned short subaddress, short brdcst, short txorrx, short ismode, short legal)
{
unsigned short index=0, bit_position;
if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
return (emode);
if (subaddress > 31)
return (einval);
if ((brdcst != BROADCAST) && (brdcst != NOBROADCAST))
return (einval);
if ((txorrx != TRANSMIT) && (txorrx != RECEIVE))
return (einval);
if ((ismode != MODECODE) && (ismode != NOMODECODE))
return (einval);
if ((legal != LEGAL) && (legal != ILLEGAL))
return (einval);
if (brdcst == BROADCAST)
index += BROAD_OFFSET;
if (txorrx == TRANSMIT)
index += TRANSMIT_OFFSET;
if (ismode == MODECODE)
index += MODE_OFFSET;
if (subaddress > 15)
{
index++;
bit_position = subaddress - (usint)16;
}
else
bit_position = subaddress;
if (legal)
{
/*
// Use wForceWordWrite to prevent compiler from optimizing this as a byte operation
// Summit control structure of PCMCIA *must* be written to only as words
*/
wForceWordWrite = exc_summit->illegal[index] & (usint)~(1 << bit_position);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -