;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
|
|