home *** CD-ROM | disk | FTP | other *** search
- * === handler.asm ==========================================================
- *
- * Copyright (c) 1987 by William S. Hawes
- *
- * Distribute freely (but please leave the notice intact ...)
- *
- * ======================================================================
- *
- * This program functions as a "bootstrap loader" for DOS handler processes.
- * It begins life as an ersatz-BCPL process, loaded automatically by DOS
- * when your handler is opened. It opens your handler, created as
- * a standard shared library, and then transfers to its main entry point.
- *
- * The main idea here is to allow handlers to be developed without going
- * through the nonsense of creating BCPL-style modules. It is difficult
- * even in assembler to get the module to look right -- it took numerous
- * tries to get even this short program working. The basic problem is that
- * every "hunk" created by your program must look like the BCPL model:
- * preceded by a long-word count, and followed by the global vector table.
- * The long-word count requires that you assemble the whole program at once
- * to get the total size, which makes for some very long assembles.
- *
- * Even after your program looks right, the trouble is only beginning.
- * Your code may look like BCPL, but the program libraries used in
- * linking the handler may contribute hunks that aren't BCPL-ish.
- * I got around this by including the EXEC library offset definitions in
- * the include file "fix.i", so I don't even need Amiga.lib in my link.
- *
- * By developing the handler as standard shared library, you can work in
- * a less ascetic development environment and still use DOS's automatic
- * loading capabilites.
- *
- * One nice side-effect of building handlers this way is that the
- * handler library can be unloaded by the system if memory gets tight.
- * Each invocation of the handler opens and eventually closes the library,
- * so the library can be swapped out if the handler isn't open at the time.
- * This is partial compensation for the lack of proper DOS mechanisms to
- * unload device handlers when they are no longer being used ...
-
- * After assembling and linking this program, install it as a handler in the
- * usual way (either by the MOUNT command or by patching the device node).
- * Note that if a simple entry-point convention were adopted, this program
- * could work for any handler, requiring only the name of the specific
- * library to be opened. Why, there could even be a function called
- * "OpenHandler" ... but then, no one get to use BCPL anymore.
- *
- * -- WSH (617) 568-8695
-
-
- INCLUDE "chlib.i" ; definitions for your handler
- INCLUDE "fix.i" ; offsets derived from "exec_lib.i"
-
- INCLUDE "libraries/dos.i"
- INCLUDE "libraries/dosextens.i"
-
- _AbsExecBase EQU 4
-
- CNOP 0,4
- StartModule:
- dc.l (EndModule-StartModule)/4
-
- start: movea.l _AbsExecBase,a6
- move.l d1,d4 ; save packet (BPTR)
-
- lea CHLib(pc),a1 ; library name
- moveq #CHLVERS,d0 ; version number
- CALLSYS OpenLibrary
- tst.l d0 ; opened?
- beq.s CleanUp ; no??
- movea.l d0,a5
-
- ; Call the console handler entry point
-
- move.l d4,d1 ; startup packet
- exg a5,a6
- CALLSYS CHEntry
- exg a5,a6
-
- movea.l a5,a1
- CALLSYS CloseLibrary
- bra.s Exit
-
- ; Groan ... if we can't open the library, I can't even use the
- ; "ReturnPkt" function defined there ... must repeat it here.
-
- CleanUp:
- lsl.l #2,d4
- movea.l d4,a0 ; DOS packet
- clr.l dp_Res1(a0) ; FALSE return
- clr.l dp_Res2(a0) ; use an error code, maybe?
- movea.l dp_Link(a0),a1 ; EXEC message
- movea.l dp_Port(a0),a0 ; replyport (??#@!)
- CALLSYS PutMsg
-
- Exit: rts
-
- CHLib CHLNAME ; library name
-
- CNOP 0,4
- dc.l 0 ; end marker
- dc.l 1 ; global defined
- dc.l 4 ; offset
- dc.l 1 ; maximum global
- EndModule:
-
- END
-