Copyright (c) Hyperion Entertainment and contributors.
Misc Resource
The misc resource oversees usage of the serial data port, the serial communication bits, the parallel data and handshake port, and the parallel communication bits. Before using serial or parallel port hardware, it first must be acquired from the misc resource.
The misc resource provides two functions for allocating and freeing the serial and parallel hardware.
Misc Resource Functions
AllocMiscResource() | Allocate one of the serial or parallel misc resources. |
FreeMiscResource() | Deallocate one of the serial or parallel misc resources. |
Once you’ve successfully allocated one of the misc resources, you are free to write directly to its hardware locations. Information on the serial and parallel hardware can be found in the Amiga Hardware Reference Manual and the hardware/custom.h include file.
The two examples below are assembly and ’C’ versions of the same code for locking the serial misc resources and waiting for CTRL-C to be pressed before releasing them.
Assembly Example of Allocating Misc Resources
* Alloc_Misc.a * * Assembly language fragment that grabs the two parts of the serial * resource (using misc.resource). If it gets the resource, it will * wait for CTRL-C to be pressed before releasing. * * While we are waiting, the query_serial program should be run. It will try * to open the serial device and if unsuccessful, will return the name of the * owner. It will be us, Serial Port Hog! * * When a task has successfully obtained the serial resource, it "owns" * the hardware registers that control the serial port. No other tasks * are allowed to interfere. * * Assemble with Adapt * HX68 Allocate_Misc.a to Allocate_Misc.o * * Link * Blink FROM Allocate_Misc.o TO Allocate_Misc LIB LIB:amiga.lib * INCDIR "include:" INCLUDE "exec/types.i" INCLUDE "resources/misc.i" INCLUDE "dos/dos.i" xref _AbsExecBase ; We get this from outside... xref _LVOOpenResource ; We get this from outside... xref _LVOWait ; We get this from outside... ; ; Open Exec and the misc.resource, check for success ; move.l _AbsExecBase,a6 ;Prepare to use exec lea.l MiscName(pc),a1 jsr _LVOOpenResource(a6) ;Open "misc.resource" move.l d0,d7 ;Stash resource base bne.s resource_ok moveq #RETURN_FAIL,d0 rts resource_ok exg.l d7,a6 ;Put resource base in A6 ; ; We now have a pointer to a resource. ; Call one of the resource's library-like vectors. ; move.l #MR_SERIALBITS,d0 ;We want these bits lea.l MyName(pc),a1 ;This is our name jsr MR_ALLOCMISCRESOURCE(a6) tst.l d0 bne.s no_bits ;Someone else has it... move.l #MR_SERIALPORT,d0 lea.l MyName(pc),a1 jsr MR_ALLOCMISCRESOURCE(a6) tst.l d0 bne.s no_port ;Someone else has it... ; ; We just stole the serial port registers; wait. ; Nobody else can use the serial port, including the serial.device! ; exg.l d7,a6 ;use exec again move.l #SIGBREAKF_CTRL_C,d0 jsr _LVOWait(a6) ;Wait for CTRL-C exg.l d7,a6 ;Get resource base back ; ; Free 'em up ; move.l #MR_SERIALPORT,d0 jsr MR_FREEMISCRESOURCE(a6) no_port move.l #MR_SERIALBITS,d0 jsr MR_FREEMISCRESOURCE(a6) no_bits moveq #RETURN_FAIL,d0 rts ; ; Text area ; MiscName dc.b 'misc.resource',0 MyName dc.b 'Serial Port Hog',0 dc.w 0 END
’C’ Example of Allocating Misc Resources
/* * Allocate_Misc.c * * Example of allocating a miscellaneous resource * We will allocate the serial resource and wait till * CTRL-C is pressed. While we are waiting, the * query_serial program should be run. It will try * to open the serial device and if unsuccessful, will * return the name of the owner. It will be us! * * Compile with SAS C 5.10 lc -b1 -cfistq -v -y -L * * Run from CLI only */ #include <exec/types.h> #include <exec/memory.h> #include <dos/dos.h> #include <resources/misc.h> #include <clib/exec_protos.h> #include <clib/misc_protos.h> #include <stdio.h> #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable SAS CTRL/C handling */ int chkabort(void) { return(0); } /* really */ #endif struct Library *MiscBase = NULL; void main(int argc, char **argv) { UBYTE *owner = NULL; /* owner of misc resource */ if (!(MiscBase= (struct Library *)OpenResource(MISCNAME))) printf("Cannot open %s\n",MISCNAME); else { /* Allocate both pieces of the serial hardware */ if ((owner = AllocMiscResource(MR_SERIALPORT,"Serial Port Hog")) == NULL) { if ((owner = AllocMiscResource(MR_SERIALBITS,"Serial Port Hog")) == NULL) { /* Wait for CTRL-C to be pressed */ printf("\nWaiting for CTRL-C...\n"); Wait(SIGBREAKF_CTRL_C); /* We're back */ /* Deallocate the serial port register */ FreeMiscResource(MR_SERIALBITS); } else printf("\nUnable to allocate MR_SERIALBITS because %s owns it\n",owner); /* Deallocate the serial port */ FreeMiscResource(MR_SERIALPORT); } else printf("\nUnable to allocate MR_SERIALPORT because %s owns it\n",owner); } }
The example below will try to open the serial device and execute the SDCMD_QUERY command. If it cannot open the serial device, it will do an AllocMiscResource() on the serial port and return the name of the owner.
boxTake Over Everything.There are two serial.device resources to take over, MR_SERIALBITS and MR_SERIALPORT. You should get both resources when you take over the serial port to prevent other tasks from using them. The parallel.device also has two resources to take over. See the resources/misc.h include file for the relevant definitions and structures.
Under V1.3 and earlier versions of the Amiga system software the MR_GETMISCRESOURCE routine will always fail if the serial device has been used at all by another task (even if that task has finished using the resource. In other words, once a printer driver or communication package has been activated, it will keep the associated resource locked up preventing your task from using it. Under these conditions, you must get the resource back from the system yourself.
You do this by calling the function FlushDevice():
/* * A safe way to expunge ONLY a certain device. The serial.device holds * on to the misc serial resource until a general expunge occurs. * This code attempts to flush ONLY the named device out of memory and * nothing else. If it fails, no status is returned since it would have * no valid use after the Permit(). */ #include <exec/types.h> #include <exec/execbase.h> #include <clib/exec_protos.h> void FlushDevice(char *); extern struct ExecBase *SysBase; void FlushDevice(char *name) { struct Device *devpoint; Forbid(); if (devpoint=(struct Device *)FindName(&SysBase->DeviceList,name) ) RemDevice(devpoint); Permit(); }
Additional programming information on the misc resource can be found in the include files and the Autodocs for the misc resource.
Misc Resource Information
Includes |
---|
resources/misc.h |
resources/misc.i |
AutoDocs |
---|
misc.doc |