home *** CD-ROM | disk | FTP | other *** search
- {
- > Also, can you tell me what the opro procedure SwapStackAndCallNear()
- > does? Does it save registers, swap SP and do a near call, or what?
-
- From the description DJ gave, I reconstructed it for you:
- }
-
- procedure SwapStackAndCallNear(Routine: Word;
- SP: Pointer;
- var Regs);
- {
- Flags are saved (unchanged during routine),
- Stack is restored after completion,
- Registers AX,BX,CX,DX,SI,DI and ES destroyed.
- }
- InLine(
- $9C/ { PUSHF }
- $07/ { pop ES ; ES := flags }
- $58/ { pop AX ; AX := Regs ofs }
- $5B/ { pop BX ; BX := Regs seg }
- $59/ { pop CX ; CX := SP ofs }
- $5A/ { pop DX ; DX := SP seg }
- $5F/ { pop DI ; DI := near routine }
- { @SwapStack }
- $8C/$D6/ { mov SI,SS ; SI := SS = stack seg }
- $FA/ { cli ; disable interrupts }
- $8E/$D2/ { mov SS,DX ; SS := DX = SP seg }
- $87/$CC/ { xchg SP,CX ; CX := SP = stack ofs }
- { ; SP := SP = SP ofs }
- $06/ { PUSH ES ; push ES (= flags) }
- $9D/ { POPF ; set flags again }
- $9C/ { PUSHF ; push flags }
- $56/ { PUSH SI ; SI = old stackseg SS }
- $51/ { PUSH CX ; CX = old stackofs SP }
- { @CallNear: }
- $53/ { PUSH BX ; BX = ofs Regs var }
- $50/ { PUSH AX ; AX = seg Regs var }
- $FF/$15/ { CALL WORD PTR [DI] ; near call }
- { @SwapBackStack: }
- $FA/ { CLI ; disable interrupts }
- $59/ { pop CX ; CX := old stackofs SP}
- $5E/ { pop SI ; SI := old stackseg SS}
- $07/ { pop ES ; pop flags in ES }
- $8E/$D6/ { mov SS,SI ; stack seg back in SS }
- $89/$CC/ { mov SP,CX ; stack ofs back in SP }
- { @Exit: }
- $06/ { PUSH ES ; push values of flags }
- $9D); { POPF ; pop unchanged flags }
-
- {
- > I would like to write my own code to do this because I don't have
- > opro, and I'm not going to buy it for one procedure... :)
- Please test my InLine macro, and tell me if this works. Sometime soon I'll
- try to experiment with PAUSEDEV myself (if I can find it again, that is ;-)
- }