; loader will place informational data if it was successful. You will have to
; check the return code of mod_load before accessing any of these additional
; struct members.
-MODCTRL_READ = 0
-MODCTRL_CALLERDATA = 2
-MODCTRL_MODULE = 4 ; Pointer to module data
-MODCTRL_MODULE_SIZE = 6 ; Total size of loaded module
-MODCTRL_CODE = 8 ; Pointer to code segment
-MODCTRL_CODE_SIZE = 10 ; Size of code segment
-MODCTRL_DATA = 12 ; Pointer to data segment
-MODCTRL_DATA_SIZE = 14 ; Size of data segment
-MODCTRL_BSS = 16 ; Pointer to bss segment
-MODCTRL_BSS_SIZE = 18 ; Size of bss segment
-MODCTRL_SIZE = 20 ; Total size of struct
-
+.struct MOD_CTRL
+ READ .addr
+ CALLERDATA .word
+ MODULE .addr ; Pointer to module data
+ MODULE_SIZE .word ; Total size of loaded module
+ MODULE_ID .word
+.endstruct
; unsigned char mod_load (struct mod_ctrl* ctrl);
; /* Load a module into memory and relocate it. The function will return an
; */
.global _mod_load
-
+; void mod_free (void* module);
+; /* Free a loaded module. Note: The given pointer is the pointer to the
+; * module memory, not a pointer to a control structure.
+; */
+.global _mod_free
; Errors
-MLOAD_OK = 0 ; Module load successful
-MLOAD_ERR_READ = 1 ; Read error
-MLOAD_ERR_HDR = 2 ; Header error
-MLOAD_ERR_OS = 3 ; Wrong OS
-MLOAD_ERR_FMT = 4 ; Data format error
-MLOAD_ERR_MEM = 5 ; Not enough memory
-
+.enum
+ MLOAD_OK ; Module load successful
+ MLOAD_ERR_READ ; Read error
+ MLOAD_ERR_HDR ; Header error
+ MLOAD_ERR_OS ; Wrong OS
+ MLOAD_ERR_FMT ; Data format error
+ MLOAD_ERR_MEM ; Not enough memory
+.endenum