Source file: /~heha/hs/dos/dosmisc.zip/SRC/PRTSCR.ASM

;Druckertreiber ohne lästige Versätze
		.MODEL	tiny
print	macro	txt
	mov	ah,9
	mov	dx,offset txt
	int	21h
	endm
		.CODE
		IDEAL
;Deutsch		equ	1		;Deutsch eingeschaltet
					;Ausschalten durch Auskommentierung

		org	038h
OldInt5		dd	?		;geretteter Int 5
ISRBase:				;überschreibt Kommandozeile
		org	100h

;╔══════════════════════════════════════════════════════╗
;║	Hauptprogramm					║
;╚══════════════════════════════════════════════════════╝
start:		print	Text0		;Meldung
		mov	si,80h
		mov	cl,[si]		;Kommandozeilenzeichenzahl
		xor	ch,ch		;in CX
		inc	si		;1. Zeichen
		cld
		jcxz	scancl3
scancl:		lodsb
		cmp	al,'?'
		je	help
		cmp	al,'h'
		je	help
		cmp	al,'H'
		je	help
		sub	al,'0'
		jc	scancl1
		cmp	al,4
		jc	scancl2
scancl1:	loop	scancl
scancl3:	xor	al,al
scancl2:
		push	ax
		mov	ax,3505h	;Installations-Check
		int	21h
		cmp	bx,offset ISRBase
		jne     NewRec
		cmp	[word ptr es:(offset ISRBase)+8],0d88eh ;(mov ds,ax)
		jne	NewRec
		pop	ax
;╔══════════════════════════════════════════════════════════════╗
;║	Deinstallation						║
;╚══════════════════════════════════════════════════════════════╝
		 lds	dx,[es:OldInt5]	;modifiziert ds!
		 mov	ax,2505h	;Interrupt rücksetzen
		 int	21h
		 push	cs
		 pop	ds
		 mov	ah,49h		;Speicher freigeben
		 int	21h
		print	Text4
DosExit:	mov	ax,4C00h
		int	21h		;Ende

help:		print	TextH
		jmp	DosExit		;Hilfe ausgeben

;╔══════════════════════════════════════════════════════╗
;║	Neuanlage von PrtScr				║
;╚══════════════════════════════════════════════════════╝

NewRec:		mov	es,[2ch]	;Segment Environment
		mov	ah,49h
		int	21h		;ENV-Speicher ab es freigeben
		pop	ax
		cmp	al,1
		jnz	nopok1
		mov	[byte ptr poke1+1],3
nopok1:		sub	al,2
		jc	nopok23
		mov	[byte ptr poke23+1],0
		add	[byte ptr poke3+1],al ;selbstmodifizirender Code!!!
nopok23:	push	ds
		pop	es
		mov	si,offset NewInt5
		mov	di,offset ISRBase
		mov	cx,NewInt5E-NewInt5
		cld
		rep	movsb
		;vorgeschaufelt!
		mov	ax,3505h
		int	21h		;alter Int21
		mov	[word ptr OldInt5],bx
		mov	[word ptr OldInt5+2],es
		mov	dx,offset ISRBase
		mov	ax,2505h
		int	21h		;neuer Int21
		print	Text3		;Meldung
		mov	dx,0fh		;nur 0f0h Bytes! (hat jeder!)
		mov	ax,3100h
		int	21h		;TSR dx Paragrafen

NewInt5:	;Druckroutine
		  push	ax
		  push	bx
		  push	cx
		  push	dx
		  push	ds
		mov	ax,40h		;BIOS-Zellen
		mov	ds,ax
		mov	al,1
		xchg	al,[100h]
		cmp	al,1
		jnz	acc
		jmp	acce

acc:		sti
		xor	dx,dx
		mov	ah,2
		int	17h
		xor	ah,80h
		test	ah,0a9h
		jz	noerr1
		mov	ax,0e07h	;Fehler-Piepser
		int	10h
		mov	cl,-1
		jmp	short acce2

noerr1:		call	pcrlf
		mov	ah,0fh		;Get VM
		int	10h
		mov	bl,ah
		mov	ah,3
		int	10h
		push	dx		;Cursorpos
		xor	dx,dx
psloop:		 mov	ah,2
		 int	10h
		 mov	ah,8
		 int	10h
;4 Varianten:
;0 Drucker kann gar keine unteren Sonderzeichen
;1 Drucker kann ein paar davon (Präsident Drucker)
;2 Drucker im IBM-Modus (EPSON-Drucker)
;3 Drucker im NEC-Modus (NEC-Drucker)
poke1:		 cmp	al,' '		;bei 1 überpokt mit 3h
		 jc	sonder
		 cmp	al,7
		 jc	nsonder
		 cmp	al,''		;Paragraf
		 jz	nsonder
		 cmp	al,20h
		 jc	sonder
		 cmp	al,7fh
		 jnz	nsonder
sonder:		mov	ch,' '
poke23:		jmp	short sonder2	;bei 2,3 überpokt mit Sprungweite 0
		mov	ch,al
poke3:		mov	al,1bh		;esc, bei 3 überpokt mit 1ch
		call	pout
		mov	al,'^'
		call	pout
sonder2:	mov	al,ch
nsonder:	call	pout
		test	ah,29h
		jnz	perr
		inc	dl		;Spalte
		cmp	dl,bl
		jnz	psloop
		sub	dl,dl
		call	pcrlf
		inc	dh		;Zeile
		cmp	[84h],dh	;Zeilenzahl-1
		jnc	psloop
		mov	cl,0
		jmp	short pok
perr:		mov	ax,0e07h
		int	10h
		mov	cl,-1
pok:		pop	dx		;Cursorpos
		mov	ah,2
		int	10h
acce2:		cli
		mov	[100h],cl
acce:		pop	ds
		  pop	dx
		  pop	cx
		  pop	bx
		  pop	ax
		iret

pcrlf:		mov	al,13
		call	pout
		mov	al,10
pout:		push	dx
		xor	dx,dx
		xor	ah,ah
		int	17h
		pop	dx
		ret
NewInt5E:


Text0 db 'PrtScr (haftmann#software) $'

IFDEF Deutsch

;Deutsche Texte
TextH db 13,10,'>> Programm zur Verbesserung der Hardcopyfunktion mit Taste PrtScr <<',13,10,10
      db 'Parameter bei Installation (Erstaufruf):',13,10
      db 'Eine Ziffer wählt die Möglichkeiten des Druckers aus (Schau ins Handbuch!)',13,10
      db '0 - Drucker kann gar keine unteren Sonderzeichen, Vorgabe',13,10
      db '1 - Drucker kann ein paar davon (z.B. Präsident Drucker)',13,10
      db '2 - Drucker im IBM-Modus (EPSON-Drucker), Umschaltzeichen ESC^',13,10
      db '3 - Drucker im NEC-Modus (NEC-Drucker), Umschaltzeichen FS^',13,10,10
      db '? oder h - diese Hilfe; es erfolgt KEINE Installation',13,10,10
      db 'Parameter bei Wiederaufruf (Deinstallation): keine',13,10,'$'
Text3 db 'resident geladen, Platzbedarf 256 Bytes',13,10,'$'
Text4 db 'vom Speicher entfernt',13,10,'$'

ELSE

;Englische Texte, übersetzt vom English-Guru M. Sternberg
TextH db 13,10,'>> TSR program to improve hardcopy-function by PrtScr<<',13,10,10
      db 'parameters on install (use "-" or "/" or no prefix) :',13,10
      db '? or h - just this help screen, (NO installation)',13,10,10
      db '  to select printer capabilities (cf. printer manual):',13,10
      db '0 - printer unable to print any extra character below 20h (default)',13,10
      db '1 - printer able to print SOME extra chars (e.g. Präsident Printer)',13,10
      db '2 - IBM-compatible printer or emulation using ESC^ to toggle',13,10
      db '3 - NEC-compatible printer or emulation using FS^ to toggle',13,10,10
      db 'parameters on recall (removal): none',13,10,'$'
Text3 db 'loaded using 256 Bytes',13,10,'$'
Text4 db 'removed from memory',13,10,'$'

ENDIF
		end	start
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded