
; Name		getseg -- Get current Segment Values
;
;
; Synopsis	getseg(pcs, pds, pes, pss, psi, pdi, psp, pflag);
;
;		unsigned *cs Pointer to where code segment address goes
;		unsigned *ds Pointer to data segment
;		unsigned *es Pointer to extra segment
;		unsigned *ss Pointer to stack segment
;		unsigned *si Pointer to si register
;		unsigned *di Pointer to di register
;		unsigned *sp Pointer to sp register
;		unsigned *flag Returns flag
;
;
; Returns	cs		value of Code segment
;		ds		value of Data segment
;		es		value of Extra segment
;		ss		value of Stack segment
;		si		value of SI register ****NOT RELIABLE****
;		di		value of DI register
;		sp		value of Stack Pointer
;		flag		value of Flags register
;
;
;


pgroup	group	 prog
prog	segment  byte public 'PROG' ; Combine with C 'PROG' program segment
	assume	 cs:pgroup
	public	 getseg
getseg proc	near
	push	 bp		    ; Save the frame pointer
	mov	 bp,sp
	mov	 si,[bp + 04]	    ; Get the values for the registers
	mov	 ax,[si]
	mov	 si,[bp + 06]
	mov	 bx, [si]
	mov	 si,[bp + 08]
	mov	 cx, [si]
	mov	 si,[bp + 10]
	mov	 dx,[si]
;==============================================================
	mov ax, cs		    ;Get value of code segment
	mov bx, ds		    ;data segment
	mov cx, es		    ;extra segment
	mov dx, ss		    ;stack segment


;==============================================================

uret:	mov	 bp,sp		    ; Now recover the values of the
	mov	 si,[bp + 04]	    ; parameters
	mov	 [si],ax
	mov	 si, [bp + 06]
	mov	 [si], bx
	mov	 si, [bp + 08]
	mov	 [si], cx
	mov	 si, [bp + 10]
	mov	 [si], dx
	mov	 si, [bp + 12]
	mov	 [si], si
	mov	 si, [bp + 14]
	mov	 [si], di
	mov	 si, [bp + 16]
	mov	 [si], sp
	mov	 al, 00 	    ;zero out al
	lahf			    ;load flag into ah
	mov	 si, [bp + 18]
	mov	 [si], ax


	mov	 ax,0		    ; No error

quit:	pop	 bp		    ; Get the original frame pointer.
	ret
getseg endp
prog	ends
	end
                                                                               
 