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

;Allgemeiner Programm-Beender, Taste <Q> drücken
;Aufruf: term <programmname> <parameter>
;Hinweis: Dieses Programm rettet nur die meistens benutzten
;Interrupts 0..3fh!
;P.S.: Hiermit kann man auch Nicht-EXE-Programme mit MZ-Header
;ohne Umbenennung zum Abarbeiten bringen!

	include	prolog.asm
	mov	sp,100h		;erst DEC, dann Schreiben! (wie Z80)
	mov	[parseg],ds
	mov	[fcb1s],ds
	mov	[fcb2s],ds
	;Kommandozeile abscannen
	mov	si,80h
	mov	di,si
	lodsb
	or	al,al		;Ohne Parameter Hinweistext
	jnz	hinw2
hinw1:	jmp	hinweis
hinw2:	mov	cl,al		;Anzahl Zeichen
	mov	ch,0
	call	skpdummy	;si=^Erstes Zeichen
	jz	hinw1
movvor:
	movsb			;um 1 Zeichen vorkopieren
	cmp	[byte ptr si],20h
	je	spc
	loop	movvor
	;Keine Parameter!
	jmp	noparams
spc:
	;Parameter?
	call	skpdummy
	;Keine Params, SI= ^0dh
noparams:
	;80h steht Dateiname
	;SI= ^Parameter
	;DI= ^Ende Dateiname+1
	dec	si
	mov	[si],cl		;Abschlußzeichen
	;SI= ^Parameter MIT Anzahl Bytes

	mov	[byte ptr di],0	;Endekennung
	mov	[parofs],si

	mov	bx,40h		;4*256 byte
	DOS	4ah		;Speicherblockgröße verändern

	;MCB retten
	mov	si,400h
	mov	di,2f0h
	mov	cx,8
	rep	movsw
	;IT retten
	push	ds
	 mov	si,0
	 mov	ds,si
	 mov	cl,80h		;40h Interruptvektoren
	 rep	movsw
	pop	ds

	mov	dx,offset newint
	DOS	2508h		;neuen Vektor setzen

	mov	dx,80h		;zeigt auf Dateiname (auch mit Pfad)
	mov	bx,offset params
	DOS	4b00h		;starten
raus:
	cli			;Keine Interrupts!
	;Stack und Segmente restaurieren
	mov	bx,cs
	mov	ss,bx
	mov	sp,100h
	mov	ds,bx
	mov	es,bx
	;MCB restaurieren
	mov	si,2f0h
	mov	di,400h
	mov	cx,8
	rep	movsw
	;IT restaurieren
	push	es
	 mov	di,0
	 mov	es,di
	 mov	si,300h
	 mov	cl,80h
	 rep	movsw
	 pop	es
	sti			;Interrupts ok.

	jnc	bye
	call	ahex
	print	msg3
	mov	al,0ffh		;Exitcode
	JR	byebye
bye:
	cmp	al,0feh
	jne	byebye
	push	ax
	mov	dx,228h
	mov	al,1
	out	dx,al
	VID	0,3		;Üblicher Videomodus
clear1:	KBD	1
	jz	clear2		;Tastaturpuffer leeren
	KBD	0
	JR	clear1
clear2:
	mov	dx,43h
	mov	al,34h
	out	dx,al
	mov	dx,40h
	mov	al,0ffh
	out	dx,al		;Timer rücksetzen (Standardwert)
	out	dx,al
	mov	dx,229h		;Soundblaster (Adlib-Chip) ???
	mov	al,4
	out	dx,al
	pop	ax
byebye:
	mov	ah,4ch		;Programmende
	int	21h

raus1:	;Erst mal versuchsweise Dateien schließen
	mov	bx,5
	mov	cx,5		;...werden ja allerhöchstens 5 sein!
clo1:	DOS	3eh		;Close
	inc	bx
	loop	clo1		;5 Handles
	;dann "Aktive PSP" zurücksetzen
	mov	bx,cs
	DOS	50h		;Aktives PSP aufs eigene Programm ziehen
	mov	al,0feh		;Abbruch-Exitcode
	clc			;"Normales" Ende
	jmp	raus

hinweis:
	PRINT	msg1
	mov	al,0
	jmp	byebye

newint:	;Timerinterrupt
	pushf
	call	[dword cs:320h]	;ein Call Far!!!
	;Tastaturport 60h fragen
	push	ax
	 in	al,60h
	 cmp	al,10h		;Scan-Code der Taste "Q"
	 je	raus1
	pop	ax
	iret

;-------------- Allgemeine UP-Sammlung ----------
skpd1:	inc	si
	dec	cl
	jz	skpd2
skpdummy:
	cmp	[by si],20h
	je	skpd1
skpd2:	ret

ahex:	push	ax		;Werte erhalten
	mov	cl,4		;oberes Nibble auf Bit 3...0
	shr	al,cl		; schieben
	call	ahex1
	pop	ax
ahex1:	and	al,0fh
	add	al,90h		;Hex -> ASCII
	daa
	adc	al,40h
	daa
	mov	dl,al
	mov	ah,2
	int	21h
	ret

params	dw	0
parofs	dw	80h
parseg	dw	?
	dw	5ch
fcb1s	dw	?
	dw	6ch
fcb2s	dw	?
msg3:	db	' - DOS-Fehler!',nl
	db	'$'

msg1:
 db nl,'TERMINATOR, Hilfsprogramm zum Beenden aller Spielprogramme mit Taste <Q>.',nl
 db 'Version 1.1 von CAOS-Chaos',nl
 db 'Gebrauch: term <programmname> <parameter>',nl
 db 'z.B. term game.exe, also ganz einfach! (Vollständiger Name mit Erweiterung!)',nl
 db 'Es werden alle Interrupts 0 bis 3F restauriert, aller vom Spiel',nl
 db 'reservierter Speicher zurückgeholt und der Timer +SB rückgesetzt.',nl
 db 'In dieser Version bitte nur *ausführbare* Programme angeben, also z.B.',nl
 db 'KEINE Batch-Dateien!!!',nl
 db 'Keine Umbelegung der Taste in dieser Version!!',nl
 db 'Extra: <programmname> wird ausgeführt, auch wenn kein .com oder .exe!',nl
 db '$'

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