Source file: /~heha/messtech/pasmex.zip/CMEXA.ASM

;Die Verkorkstheit von mexPrintf erfordert eine unschöne und leider
;nicht reentranzfähige Methode, das Datensegmentregister zu retten,
;ohne den Stack zu verwenden. Reentrante mexPrintf-Aufrufe werden
;kurzerhand unterbunden, um schwereren Schaden zu vermeiden
;Oder aber, wenn mexPrintf mit ^C abgebrochen werden kann, ist kein
;solcher Schutz möglich.
	ideal
	model	large,c
	P386

;TEST_REENTER equ 1		;#define: Variante mit oder ohne Reenter-Test

extrn mexPrintf:far		;Import (mit Unterstrich)
extrn _AHINCR:far
extrn _AHSHIFT:far
publicdll DLLMEXPRINTF		;Export (mit Unterstrich)
publicdll pascal INCHP, pascal DECHP, pascal INCHPL

IFDEF TEST_REENTER
DATASEG
RLock	db	-1
ENDIF

UDATASEG
SaveDS	dw	?
RetAdr	dd	?

CODESEG
proc DLLMEXPRINTF far
	push	ds
	 push	@data
	 pop	ds		;Datensegment der CMEX.DLL
IFDEF TEST_REENTER
	 inc	[RLock]		;Wiedereintritts-Zähler
	 jnz	@@skip		;ungleich Null: Reenter! Sprung!
ENDIF
	pop	[SaveDS]	;Aufrufers Datensegment
	pop	[RetAdr]	;Aufrufers Returnadresse (32bit)
	call	mexPrintf	;gleiche Stack-Schicht: korrekter Aufruf
	push	[RetAdr]
IFDEF TEST_REENTER
	push	[SaveDS]
@@skip:	 dec	[RLock]
	pop	ds
ELSE
	mov	ds,[SaveDS]
ENDIF
	ret
endp

;IncHugePointer - Erhöhen eines Zeigers
proc INCHP pascal
arg P:DWord, By:Word
	les	bx,[P]			;Adresse von P
	mov	ax,[By]
	add	[word LOW es:bx],ax	;Offset inkrementieren
	jnc	@@e			;kein Überlauf: Selektor belassen!
	add	[word HIGH es:bx],offset _AHINCR ;Selektor erhöhen
@@e:	ret
endp

;DecHugePointer - Erniedrigen eines Zeigers
proc DECHP pascal
arg P:DWord, By:Word
	les	bx,[P]			;Adresse von P
	mov	ax,[By]
	sub	[word LOW es:bx],ax	;Offset dekrementieren
	jnc	@@e			;kein Überlauf: Selektor belassen!
	sub	[word HIGH es:bx],offset _AHINCR ;Selektor erniedrigen
@@e:	ret
endp

;IncHugePointerLong - Erhöhen und Erniedrigen eines Zeigers
proc INCHPL pascal
arg P:DWord, By:DWord
	les	bx,[P]			;Adresse von P
	mov	cx,[word LOW By]	;Hier AX:CX: ungewöhnlich!
	mov	ax,[word HIGH By]
	add	[word LOW es:bx],cx	;Offset inkrementieren
	adc	ax,0			;Anzahl der 64-K-Übergänge
	shl	ax,offset _AHSHIFT	;Vielfaches erzeugen
	add	[word HIGH es:bx],ax	;Selektor erhöhen bzw. erniedrigen
	ret
endp
	end
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded