home *** CD-ROM | disk | FTP | other *** search
- ; execute an s/w function call with all register set up
- ; EXAMPLE OF USE
- ; struct regval{unsigned ax,bx,cx,dx,si,di,ds,es;};
- ; struct regval input_regs ; /* input register values */
- ; return_regs; /* values returned in regs */
- ;
- ; status = swint(fun_code,&input_regs,&return_regs);
- ;
- ; structure for register values is
- ; struct regval{unsigned ax,bx,cx,dx,si,di,ds,es;};
- regs struc
- reg_ax dw 0 ;ax value
- reg_bx dw 0 ;bx value
- reg_cx dw 0 ;cx value
- reg_dx dw 0 ;dx value
- reg_si dw 0 ;si value
- reg_di dw 0 ;di value
- reg_ds dw 0 ;ds value
- reg_es dw 0 ;es value
- regs ends
- ; define arguments
- args struc
- ret_adr dw 0
- old_bp dw 0
- int_no dw 0
- sreg dw 0
- dreg dw 0
- args ends
- code segment byte public
- assume cs:code
- public swint
- swint:
- push bp
- mov bp,sp ;set our arg pointer
- push ds ;save ds as a local variable
- push es
- mov al,byte ptr int_no[bp]; insert int. no into instruction
- mov bx,offset int_instr
- mov byte ptr cs:[bx+1],al
- mov bx,word ptr sreg[bp] ; set up address of input reg
- mov ax,word ptr reg_ax[bx] ; place values in registers
- mov cx,word ptr reg_cx[bx]
- mov dx,word ptr reg_dx[bx]
- mov si,word ptr reg_si[bx]
- mov di,word ptr reg_di[bx]
- mov es,word ptr reg_es[bx]
- mov ds,word ptr reg_ds[bx]
- mov bx,word ptr ss:reg_bx[bx]
- int_instr:
- int 00h ;dummy int number (filled in on each use)
- mov bp,word ptr dreg[bp] ; set up address of return regs
- mov word ptr reg_ax[bp],ax
- mov word ptr reg_bx[bp],bx
- mov word ptr reg_cx[bp],cx
- mov word ptr reg_dx[bp],dx
- mov word ptr reg_si[bp],si
- mov word ptr reg_di[bp],di
- mov word ptr reg_ds[bp],ds
- mov word ptr reg_es[bp],es
- pushf ;return flags
- pop ax ; in ax
- pop es
- pop ds
- pop bp
- ret
- code ends
- end