unit vmbhostinterface; interface uses vmbbuffer, vmbdefs, vmbexec; type tvmbhostproc_vm = function(state : tvmbstate): integer; function vmb_registerproc_vm(vm : tvmbstate; name : pchar; addr : pointer): longbool; implementation uses vmbMain; function vmb_registerproc_vm(vm : tvmbstate; name : pchar; addr : pointer): longbool; var hostfrag : tvmbbuffer; newlabelid : integer; begin // get our special hostproc buffer hostfrag := vm.getFragment('hostfuncs'); // return false if funcname is registered result := hostfrag.indexofexport(name) <> -1; if not result then exit; // get highest label + 1 newlabelid := vmb_buffer_getlabelmax(hostfrag) + 1; // add export [funcname, label] hostfrag.addexport(name, newlabelid); // create new method in hostfrag buffer that calls the actual host method when executed vmb_buffer_addbytecode(hostfrag, vmb_label, [newlabelid]); vmb_buffer_addbytecode(hostfrag, vmb_invokestatic_vm, [integer(addr)]); vmb_buffer_addbytecode(hostfrag, vmb_ret); end; end.