home *** CD-ROM | disk | FTP | other *** search
- /*
- *
- * DISCLAIMER:
- *
- * This program is provided as a service to the programmer
- * community to demonstrate one or more features of the Amiga
- * personal computer. These code samples may be freely used
- * for commercial or noncommercial purposes.
- *
- * Commodore Electronics, Ltd ("Commodore") makes no
- * warranties, either expressed or implied, with respect
- * to the program described herein, its quality, performance,
- * merchantability, or fitness for any particular purpose.
- * This program is provided "as is" and the entire risk
- * as to its quality and performance is with the user.
- * Should the program prove defective following its
- * purchase, the user (and not the creator of the program,
- * Commodore, their distributors or their retailers)
- * assumes the entire cost of all necessary damages. In
- * no event will Commodore be liable for direct, indirect,
- * incidental or consequential damages resulting from any
- * defect in the program even if it has been advised of the
- * possibility of such damages. Some laws do not allow
- * the exclusion or limitation of implied warranties or
- * liabilities for incidental or consequential damages,
- * so the above limitation or exclusion may not apply.
- *
- */
-
- #include "exec/types.h"
- #include "exec/nodes.h"
- #include "exec/lists.h"
- #include "exec/ports.h"
- #include "exec/libraries.h"
- #include "exec/devices.h"
- #include "exec/io.h"
- #include "devices/serial.h"
-
- struct IOExtSer *IORser;
- struct MsgPort *port;
- char buffer[200];
- extern struct MsgPort *CreatePort();
- extern struct IORequest *CreateExtIO();
-
- /* note: to run this program, you must have an external terminal, set
- * at 9600 baud, attached to the Amiga serial port. Additionally the
- * serial.device file must be located in the directory currently
- * assigned to DEVS: (to check this, in AmigaDOS, type: ASSIGN
- * then check the directory (usually the boot CLI disk volume, devs directory.
- */
-
- main()
- {
- int error;
- int actual;
- unsigned long rbl;
- unsigned long brk;
- unsigned long baud;
- unsigned char rwl;
- unsigned char wwl;
- unsigned char sf;
- unsigned long t0;
- unsigned long t1;
-
- /* SET UP the message port in the I/O request */
- port = CreatePort (SERIALNAME,0);
- if (port == NULL) {
- printf("\nProblems during CreatePort");
- exit(100);
- }
-
- /* Create the request block for passing info to and from the serial device. */
- IORser = (struct IOExtSer *)CreateExtIO(port,sizeof(struct IOExtSer));
- if (IORser == NULL)
- {
- printf("\nProblems during CreateExtIO");
- goto cleanup1;
- }
-
- open:
- /* OPEN the serial.device */
- if ((error = OpenDevice (SERIALNAME, 0, IORser, 0)) != 0) {
- printf ("Serial device did not open, error = %ld",error);
- goto cleanup1;
- }
-
- /* SET PARAMS for the serial.device */
- rbl = 4096;
- rwl = 0x08;
- wwl = 0x08;
- brk = 750000;
- baud= 9600;
- sf = 0x00;
- t0 = 0x51040303;
- t1 = 0x03030303;
-
- if ((error = SetParams (IORser,rbl,rwl,wwl,brk,baud,sf,t0,t1)) != 0) {
- printf ("Set parameters command returned an error: %ld",error);
- goto cleanup2;
- }
-
- printf("\nSerial Device opened and accepted parameters");
- WriteSer (IORser,"\n\015Device opened ok\n\015", -1);
-
- printf("\nTesting character exact-count output thru SendWaitWrite");
- SendWaitWrite (IORser,
- "User counts characters in string to send\n\015", 42);
-
- printf("\nTest string length of -1 (make system find end of string)");
- SendWaitWrite (IORser,
- "or if null terminated string, say '-1'\n\015", -1);
-
- printf("\nType 16 characters to send to amiga...");
- printf("\nIf no external terminal is attached, waits forever!!");
- WriteSer (IORser,
- "\n\015Type 16 characters to send to amiga\n\015", -1);
- actual = ReadSer (IORser,buffer,16);
- WriteSer (IORser,
- "\n\015You typed these printable characters:\n\015", -1);
- WriteSer (IORser,buffer, actual);
- WriteSer (IORser,"\n\015End of test\n\015", -1);
- WriteSer (IORser,"54321.....exit\n\015", 16);
- printf("\nTest completed!\n");
-
- /* CLOSE the serial.device */
- cleanup2:
- CloseDevice (IORser);
- cleanup1:
- DeletePort (port);
- exit (0);
- }
-
- /* SERIAL I/O functions */
-
- SetParams(io,rbuf_len,rlen,wlen,brk,baud,sf,ta0,ta1)
-
- struct IOExtSer *io;
- unsigned long rbuf_len;
- unsigned char rlen;
- unsigned char wlen;
- unsigned long brk;
- unsigned long baud;
- unsigned char sf;
- unsigned long ta0;
- unsigned long ta1;
-
- {
- int error;
-
- io->io_ReadLen = rlen;
- io->io_BrkTime = brk;
- io->io_Baud = baud;
- io->io_WriteLen = wlen;
- io->io_StopBits = 0x01;
- io->io_RBufLen = rbuf_len;
- io->io_SerFlags = sf;
- io->IOSer.io_Command = SDCMD_SETPARAMS;
- io->io_TermArray.TermArray0 = ta0;
- io->io_TermArray.TermArray1 = ta1;
-
- if ((error = DoIO (io)) != 0) {
- printf ("serial.device setparams error %ld \n", error);
- }
- return (error);
- }
-
- ReadSer(io,data,length)
- struct IOExtSer *io;
- char *data;
- int length;
- {
- int error;
-
- io->IOSer.io_Data = (APTR)data;
- io->IOSer.io_Length = (ULONG)length;
- io->IOSer.io_Command = CMD_READ;
-
- if ((error = DoIO (io)) != 0) {
- printf ("serial.device read error %ld \n", error);
- }
- return ((int)io->IOSer.io_Actual);
- }
-
-
- WriteSer(io,data,length)
- struct IOExtSer *io;
- char *data;
- int length;
- {
- int error;
-
- io->IOSer.io_Data = (APTR)data;
- io->IOSer.io_Length = length;
- io->IOSer.io_Command = CMD_WRITE;
-
- if ((error = DoIO (io)) != 0) {
- printf ("serial.device write error %ld \n", error);
- }
- return (error);
- }
-
- SendWaitWrite(io,data,length)
- struct IOExtSer *io;
- char *data;
- int length;
- {
- int error;
-
- io->IOSer.io_Data = (APTR)data;
- io->IOSer.io_Length = length;
- io->IOSer.io_Command = CMD_WRITE;
-
- SendIO (io);
-
- if ((error = WaitIO (io)) != 0) {
- printf ("serial.device waitio error %ld \n", error);
- }
- return ((int)io->IOSer.io_Actual);
- }
-
-
- /***********************************************************************
- *
- * Exec Support Function -- Extended IO Request
- *
- ***********************************************************************/
-
- #include "exec/types.h"
- #include "exec/nodes.h"
- #include "exec/lists.h"
- #include "exec/memory.h"
- #include "exec/interrupts.h"
- #include "exec/ports.h"
- #include "exec/libraries.h"
- #include "exec/io.h"
- #include "exec/tasks.h"
- #include "exec/execbase.h"
-
- extern APTR AllocMem();
-
- /****** exec_support/CreateExtIO **************************************
- *
- * NAME
- * CreateExtIO() -- create an Extended IO request
- *
- * SYNOPSIS
- * ioReq = CreateExtIO(ioReplyPort,size);
- *
- * FUNCTION
- * Allocates memory for and initializes a new IO request block
- * of a user-specified number of bytes.
- *
- * INPUTS
- * ioReplyPort - a pointer to an already initialized
- * message port to be used for this IO request's reply port.
- *
- * RESULT
- * Returns a pointer to the new block. Pointer is of the type
- * struct IORequest.
- *
- * 0 indicates inability to allocate enough memory for the request block
- * or not enough signals available.
- *
- * EXAMPLE
- * struct IORequest *myBlock;
- * if( (myBlock = CreateExtIO(myPort,sizeof(struct IOExtTD)) == NULL)
- * exit(NO_MEM_OR_SIGNALS);
- *
- * example used to allocate space for IOExtTD (trackdisk driver
- * IO Request block for extended IO operations).
- *
- * SEE ALSO
- * DeleteExtIO
- *
- ***********************************************************************/
-
- struct IORequest *CreateExtIO(ioReplyPort,size)
- struct MsgPort *ioReplyPort;
- LONG size;
- {
- struct IORequest *ioReq;
-
- if (ioReplyPort == 0)
- return ((struct IORequest *) 0);
-
- ioReq = (struct IORequest *)AllocMem (size, MEMF_CLEAR | MEMF_PUBLIC);
-
- if (ioReq == 0)
- return ((struct IORequest *) 0);
-
- ioReq -> io_Message.mn_Node.ln_Type = NT_MESSAGE;
- ioReq -> io_Message.mn_Node.ln_Pri = 0;
-
- ioReq -> io_Message.mn_ReplyPort = ioReplyPort;
-
- return (ioReq);
- }
-
- /****** exec_support/DeleteExtIO **************************************
- *
- * NAME
- * DeleteExtIO() - return memory allocated for extended IO request
- *
- * SYNOPSIS
- * DeleteExtIO(ioReq,size);
- *
- * FUNCTION
- * See summary line at NAME. Also frees the signal bit which
- * had been allocated by the call to CreateExtIO.
- *
- * INPUTS
- * A pointer to the IORequest block whose resources are to be freed.
- *
- * RESULT
- * Frees the memory. Returns (no error conditions shown)
- *
- * EXAMPLE
- * struct IORequest *myBlock;
- * DeleteExtIO(myBlock,(sizeof(struct IOExtTD)));
- *
- * example shows that CreateExtIO had been used to create a trackdisk
- * (extended) IO Request block.
- *
- * SEE ALSO
- * CreateExtIO
- *
- **************************************************************************/
-
- DeleteExtIO(ioExt,size)
- struct IORequest *ioExt;
- LONG size;
- {
- ioExt -> io_Message.mn_Node.ln_Type = 0xff;
- ioExt -> io_Device = (struct Device *) -1;
- ioExt -> io_Unit = (struct Unit *) -1;
-
- FreeMem (ioExt, size);
- }
-