On Fri, 20 Aug 1999, Dio� wrote: > I implemented a interrput 0x53 service at DOSEMU, and I have a function in > service by where I pass a > pointer of a callback function from DOS application, when my function > service is completed. The > callback function receive args in ES:BX pointer. How do I make to call that funcion > callback from > DOSEMU ? I'm don't knowing to code?!?!? (C or Assembler) OK, I would like to help you. But still I am not sure about your problem. How I understand you: 1) You have hacked the DOSEMU code. Your additional code in DOSEMU is executed whenever some program calls software interrupt 0x53. 2) Your 0x53 code (that is part of DOSEMU now) wants to call back to the calling program (for instance so the calling program does not have to wait idly for the finalization of some lengthy procedure that is executed inside int 0x53) some time later. 3) Later Int 0x53 will call back a function inside your program and pass arguments to it in a data block referenced by ES:BX (rather unusual combination, methinks, is there a special reason why you do not use something like ES:DI ?). IF SO THEN: - you must tell int 0x53 the absolute address of the function to be called back - there is a way to find out the address of a function in C, look it up in your C's docu - from 0x53 you call that address after you setup the arguments properly Now: you need to make sure that the callback routine does not do any fancy stuff since the OS (the DOS part, that is) will be in an - albeit defined - yet arbitrary, presently unknown state because the callback interrupt can occur pretty much anytime. Be careful about changing data structures used elsewhere, about disk access, screen access, calls to other functions, etc. etc. It's a nasty desaster best avoided. The safest though not the most elegant bet is to just save the arguments in your callback routine into some data storage area that will be written _only_ by that routine and read by other functions _only_ when a "valid flag" is set which you do at the very end of your callback routine and which you clear upon invocation of the call to 0x53 that plants the callback. Now, that flag must be local to _this_ instance of the callback since two callbacks could overlap. The best is to setup a data area _before_ invoking 0x53 in the first place and passing that pointer to 0x53 along with the callback address pointer. Then 0x53 will call your callback function with that data area in ES:BX. Make sure your valid-flag resides inside the data area. Thus you will have a flag local to this instance of the callback. Correct me where I'm wrong. Just my 2 cents but I hope it helps. I guess, however, this is off-topic. Karsten (ncq)
