Source file: /~heha/hsn/dos/noro.zip/NORO.ASM

;NoRO löscht die Schreibschutzbits von CD-Dateien
;Wenn kein Laufwerksbuchstabe angegeben: Nach MSCDEX zu laden!
;Nur für die Handlefunktionen!? Nur CD-Laufwerk 0 betreffend!
	include	prolog.asm
REQfunc		equ	4b49h		;in AX
REQcode		equ	9879h		;in DX
ANScode		equ	8767h		;in AX; DX=Segmentadresse
ResPara		equ	(ISRBase-PSPOrg+ISRE-ISRA+0fh)/16

		org	5ch
ctrl0		db	?		;Ein/Aus-Schalter
ahstore		db	?
cddrive		db	?
curdrive	db	?		;Aktuelles Laufwerk
		;Bit7: global ein/aus
ISRBase:	;FCB's überschreiben

		org	100h
		print	Text0		;Meldung
		mov	[ctrl0],80h	;Standard laden
		call	InstChk
		;nun ch=Statusregister:
		;Bit0: Deinstallation nicht möglich
		;Bit6: MSCDEX nicht installiert
		;Bit7: Noch nicht installiert
		mov	bp,4c00h	;Normaler DOS-Exit
		mov	si,81h
		cld
scancl:		lodsw		;AH=2.Buchstabe
		dec	si
		call	UpCase
		cmp	ah,':'
		jnz	sca1
		sub	al,'A'
		jc	scancl
		cmp	al,26
		jnc	scancl	;Nur für gültige LW-Buchstaben
		mov	[es:cddrive],al	;im residenten Teil patchen, falls vorhanden
		and	ch,not 40h	;MSCDEX vorgaukeln
		jr	scancl
sca1:		cmp	al,'?'
		je	help
		cmp	al,'H'
		je	help
		cmp	al,'U'
		je	UnInst
		cmp	al,'D'
		je	DisActiv
		cmp	al,0dh
		jne	scancl
		jmp	Install

help:	;Hilfe Option "H" oder "?"
		mov	dx,offset TextH
		jr	TXTO1

UnInst:	;Deinstallation(sversuch) Option "U"
		test	ch,80h
		mov	dx,offset Text5
		jnz	TXTO1		;Wenn nicht nötig!
		and	ch,0fh		;LOW-Teil (HookedInt-Zähler)
		jz	Raus
		PRINT	Text4
		mov	dx,offset Text4a
disab:		and	[es:Ctrl0],not 80h
		jmp	TXTOut
DisActiv:;Deaktivieren Option "D"
		test	ch,80h
		mov	dx,ofs Text5
		jnz	TXTO1
		mov	dx,ofs Text4
		jr	disab
	;Deinstallation
Raus:		lds	dx,[es:ofs OldInt21-ISRA+ISRBASE]
		DOS	2521h
		DOS	49h		;den Speicher ab es freigeben
		push	cs
		pop	ds
		mov	dx,ofs Text3	;removed...
TXTO1:		jmp	TXTOut

InstChk:;Installationscheck, ES=Zeiger auf installierte Routine oder n.a.!,
	;Bit7(CH)=0: Installationscheck erfolgreich, dann:
	;ES: Segmentadresse der residenten Routine
	;Bit6(CH)=0: MSCDEX installiert
	;Bit0(CH)=0: Zeiger nicht von anderen verbogen, dh. deinstallierbar
		DOS	19h		;akt. Laufwerk
		mov	[curdrive],al
		xor	bx,bx
		INTR	2fh,1500h	;MSCDEX-Laufwerke
		mov	ch,40h
		or	bx,bx
		jz	notcd
		mov	[cddrive],cl	;nur CD-Laufwerk 0 betreffend!
		xor	ch,ch
notcd:
		mov	ax,REQfunc
		mov	dx,REQcode
		int	21h
		cmp	ax,ANScode	;gleich?
		jz	T21I
		or	ch,80h
		mov	dx,ds
T21I:		push	dx		;Segment der TSR
	;Segment retten
		DOS	3521h		;Get Int21
		SES	<OldInt21>,bx
		cmp	bx,ofs NewInt21-ISRA+ISRBASE
		jnz	T21FLT
		mov	bx,es
		cmp	bx,dx
		je	T21OK
T21FLT:		inc	ch		;ch <>0 wenn andere TSR stört
T21OK:		pop	es
		ret

Install:
		test	ch,80h		;Installationscheck
		mov	dx,ofs Text2	;Schon mal laden
		jz	enab
		test	ch,40h		;MSCDEX aktiv?
		jz	DoInst
		mov	dx,ofs Text2a
		mov	bp,4c01h	;Fehlercode
		jr	TXTOut		;Ohne MSCDEX kein NoRO


DoInst:	;ISR nach vorn schaufeln
		cld
		push	cs
		pop	es
		mov	si,ofs ISRA
		mov	di,ofs ISRBase
		mov	cx,(ISRE-ISRA+1)/2
		rep	movsw
	;Zeiger verbiegen
		mov	dx,ofs NewInt21-ISRA+ISRBASE
		DOS	2521h			;Set Int21
	;Environment freigeben
		mov	es,[2ch]	;Segment Environment
		DOS	49h		;ENV-Speicher ab es freigeben
	;Test des Hochladens
		mov	ax,cs
		mov	es,ax		;Eigenes Programm=Resident!
		cmp	ax,0a000h
		mov	dx,ofs Text1
		jc	NoHi		;unten
		mov	dx,ofs Text1a
NoHi:	;enabeln
		mov	bp,3100h	;Residentes Ende
enab:		;DX ist schon OK!
		or	[es:Ctrl0],80h	;Bit 7 setzen: enabled
	DOS	9
	PRINT	Text6
	mov	dl,[es:cddrive]
	add	dl,'A'
	DOS	2
	mov	dx,ofs Text6a
	;dx-adressierten Text ausgeben
TXTOut:		DOS	9		;Textausgabe
	;Programm beenden
LFOut:		PRINT	NL$
		mov	ax,bp
		mov	dx,ResPara
		int	21h

		_UPCASE
ISRA:
NewInt21:	;Neue INT21-Routine
		pushf
		cmp	ax,REQfunc      ;Installationscheck?
		jne	I21cont
		cmp	dx,REQcode
		jne	I21cont
		mov	ax,ANScode
		mov	dx,cs
		popf
		iret
I21cont:
		test	[cs:ctrl0],80h
		jz	isrend
		cmp	ah,4eh          ;FindFirst?
		jz	Mani
		cmp	ah,4fh		;FindNext?
		jz	Mani
		cmp	ax,4300h	;GetAttr?
		je	Mani
		cmp	ah,0eh		;Laufwerk wählen?
		jz	Mani
isrend:		popf
		JMPF			;jmp far
OldInt21	dd	?

Mani:	mov	[cs:AHStore],ah	;speichern
	popf
	clc
	pushf
	call	[cs:OldInt21+(ISRBase-ISRA)]
	jc	isre2
	pushf
	 push	ax es bx
	  mov	ah,[cs:AHStore]	;holen
	  cmp	ah,0eh          ;Laufwerk wählen?
	  jz	AktDrv
	  cmp	ah,43h		;GetAttr?
	  je	ManiAttr
	  ;weiter mit Manipulation der DTA
	  DOS	2fh		;GetDTA
	  mov	al,[cs:curdrive]
	  cmp	[by es:bx],0	;CurDrv?
	  jz	nodrv2
	  mov	al,[es:bx]	;Laufwerk aus DTA entnehmen!
	  dec	al
nodrv2:	  cmp	[cs:cddrive],al
	  jnz	pops
resbit:	  and	[by es:bx+15h],not 1	;R/O löschen
pops:	 pop	bx es ax
	popf
isre2:	sti
	retf	2


ManiAttr:
	  mov	bx,dx		;zum Zeigern
	  mov	al,[cs:curdrive]
	  cmp	[by bx+1],':'	;Laufwerksangabe?
	  jnz	nodrv
	  mov	al,[bx]
	  and	al,not 20h	;upcase
	  sub	al,'A'		;A=0
nodrv:	  cmp	[cs:cddrive],al
	  jnz	pops
	  and	cl,not 1	;R/O-Bit löschen
	  jr	pops

AktDrv:	  DOS	19h
	  mov	[cs:curdrive],al
	  jr	pops
ISRE:

Text0	db	'NoRO 1.01 (haftmann#software): $'
Text1a	db	'hoch'
Text1	db	'geladen$'
Text2	db	'reaktiviert$'
Text6	db	', Dateien auf $'
Text6a	db	': ohne Schreibschutz$'
Text2a	db	'Fehler: MSCDEX nicht geladen!$'
Text3	db	'vom Speicher entfernt.$'
Text4	db	'deaktiviert.$'
Text4a	db	' (Andere TSR stahl Int21)$'
Text5	db	'Noch nicht installiert!$'
TextH	db	'		++ FREEWARE ++',nl
	db	'Programm entfernt lästige Schreibschutzbits von Dateien auf der CD-ROM.',nl
	db	'(Nur für Handlefunktionen, nur 1 CD-Laufwerk)',nl
	db	'Parameter:	- (keiner)	TSR laden oder aktivieren',nl
	db	'		- Laufwerk:	(Anderes) Laufwerk festlegen',nl
	db	'		- h oder ?	diese Hilfe',nl
	db	'		- d		NoRO deaktivieren',nl
	db	'		- u		TSR entfernen$'
nl$	db	nl,'$'

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