;/* rbf.c - Execute me to compile me with SAS C 5.10
LC -d0 -b1 -cfistq -v -y -j73 rbf.c
Blink FROM LIB:c.o,rbf.o,rbfhandler.o TO rbf LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
** rbf.c - serial receive buffer full interrupt handler example.
** Must be linked with assembler handler rbfhandler.o
**
** To receive characters, this example requires ASCII serial input
** at your Amiga's current serial hardware baud rate (ie. 9600 after
** reboot, else last baud rate used)
*/
#include <exec/execbase.h>
#include <exec/memory.h>
#include <exec/interrupts.h>
#include <resources/misc.h>
#include <hardware/custom.h>
#include <hardware/intbits.h>
#include <dos/dos.h>
#include <clib/exec_protos.h>
#include <clib/misc_protos.h>
#include <stdio.h>
#include <string.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
void chkabort(void) { return; } /* really */
#endif
#define BUFFERSIZE 256
extern void RBFHandler(); /* proto for asm interrupt handler */
void main(void);
struct MiscResource *MiscBase;
extern struct ExecBase *SysBase;
extern struct Custom far custom; /* defined in amiga.lib */
static UBYTE *allocname = "rbf-example";
struct RBFData {
struct Task *rd_Task;
ULONG rd_Signal;
ULONG rd_BufferCount;
UBYTE rd_CharBuffer[BUFFERSIZE + 2];
UBYTE rd_FlagBuffer[BUFFERSIZE + 2];
UBYTE rd_Name[32];
};
void main(void)
{
struct RBFData *rbfdata;
UBYTE *currentuser;
BYTE signr;
struct Device *serdevice;
struct Interrupt *rbfint, *priorint;
BOOL priorenable;
ULONG signal;
if (MiscBase = OpenResource("misc.resource"))
{
currentuser = AllocMiscResource(MR_SERIALPORT, allocname); /* Allocate the serial */
if (currentuser) /* port registers. */
{
printf("serial hardware allocated by %s. Trying to remove it\n",
currentuser); /* Hey! someone got it! */
Forbid();
if (serdevice = (struct Device *)FindName(&SysBase->DeviceList, currentuser))
RemDevice(serdevice);
Permit();
currentuser = AllocMiscResource(MR_SERIALPORT, allocname); /* and try again */
}
if (currentuser == NULL)
{ /* Get the serial */
currentuser = AllocMiscResource(MR_SERIALBITS, allocname); /* control bits. */
if (currentuser)
{
printf("serial control allocated by %s\n", currentuser); /* Give up. */
FreeMiscResource(MR_SERIALPORT);
}
else
{ /* Got them both. */
printf("serial hardware allocated\n");
if ((signr = AllocSignal(-1)) != -1) /* Allocate a signal bit for the */
{ /* interrupt handler to signal us. */
if (rbfint = AllocMem(sizeof(struct Interrupt), MEMF_PUBLIC|MEMF_CLEAR))
{
if (rbfdata = AllocMem(sizeof(struct RBFData), MEMF_PUBLIC|MEMF_CLEAR))
{
rbfdata->rd_Task = FindTask(NULL); /* Init rfbdata structure. */
rbfdata->rd_Signal = 1L << signr;
rbfint->is_Node.ln_Type = NT_INTERRUPT; /* Init interrupt node. */
strcpy(rbfdata->rd_Name, allocname);
rbfint->is_Node.ln_Name = rbfdata->rd_Name;
rbfint->is_Data = (APTR)rbfdata;
rbfint->is_Code = RBFHandler;
/* Save state of RBF and */
priorenable = custom.intenar & INTF_RBF ? TRUE : FALSE; /* interrupt */
custom.intena = INTF_RBF; /* disable it. */
priorint = SetIntVector(INTB_RBF, rbfint);
if (priorint) printf("replaced the %s RBF interrupt handler\n",
priorint->is_Node.ln_Name);
printf("enabling RBF interrupt\n");
custom.intena = INTF_SETCLR | INTF_RBF;
printf("waiting for buffer to fill up. Use CTRL-C to break\n");
signal = Wait(1L << signr | SIGBREAKF_CTRL_C);
if (signal & SIGBREAKF_CTRL_C) printf(">break<\n");
printf("Character buffer contains:\n%s\n", rbfdata->rd_CharBuffer);
custom.intena = INTF_RBF; /* Restore previous handler. */
SetIntVector(INTB_RBF, priorint);
/* Enable it if it was enabled */
if (priorenable) custom.intena = INTF_SETCLR|INTF_RBF; /* before. */
FreeMem(rbfdata, sizeof(struct RBFData));
}
else printf("can't allocate memory for rbf data\n");
FreeMem(rbfint, sizeof(struct Interrupt));
}
else printf("can't allocate memory for interrupt structure\n");
FreeSignal(signr);
}
else printf("can't allocate signal\n");
FreeMiscResource(MR_SERIALBITS); /* release serial hardware */
FreeMiscResource(MR_SERIALPORT);
}
}
} /* There is no 'CloseResource()' function */
}
[Back to Amiga Developer Docs]