Source file: /~heha/hsn/dos/noro.zip/NORO11.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	987Ah		;in DX, modifiziert zu NORO 1.01
ANScode		equ	8767h		;in AX; DX=Segmentadresse
ResPara		equ	(ISRBase-PSPOrg+ISRE-ISRA+0fh)/16

		org	5ch
ctrl0		db	?		;Ein/Aus-Schalter
ahstore		db	?
fill		db	?		;ehemals CDROM-LW-Buchstabe
curdrive	db	?		;Aktuelles Laufwerk
cddrive		dd	?		;Diesmal: Bitregister
		;Bit7: global ein/aus
ISRBase:	;FCB's überschreiben

		org	100h
		print	Text0		;Meldung
		mov	[ctrl0],80h	;Standard laden
		xor	ax,ax
		mov	[word LOW cddrive],ax
		mov	[word HIGH cddrive],ax	;Bits löschen
		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,'+'
		je	plus
		cmp	ah,'-'
		je	plus
		cmp	ah,':'
		jnz	sca1
plus:
		sub	al,'A'
		jc	scancl
		cmp	al,26
		jnc	scancl		;Nur für gültige LW-Buchstaben
		call	BitMaske
		or	[es:bx],al	;im residenten Teil patchen, falls vorhanden
		and	ch,not 40h	;MSCDEX vorgaukeln
		cmp	ah,'-'
		jnz	scancl
		not	al
		and	[es:bx],al	;Laufwerk aus Liste löschen
		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		;BX=Anzahl CD-Laufwerke
		jz	notcd
		mov	ch,bl
loopcd:		mov	al,cl
		call	BitMaske
		or	[bx],al
		inc	cl		;nächstes Laufwerk
		dec	ch
		jnz	loopcd
		;xor	ch,ch		;unnötig!
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,'A'
outloop:mov	al,dl
	sub	al,'A'
	call	BitMaske
	test	[es:bx],al
	jz	notset
	DOS	2		;Laufwerksbuchstaben hintereinander ausgeben
notset:
	inc	dl
	cmp	dl,'Z'
	jbe	outloop
	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:
BitMaske:	;PE: AL=Bit-Nummer (0..31), PA: BX=Zeiger, AL=Maske
		push	cx
		 mov	bx,offset cddrive
		 mov	ch,al
		 mov	cl,3
		 shr	ch,cl
		 add	bl,ch
		 mov	cl,al
		 and	cl,7
		 mov	al,1
		 shl	al,cl
		pop	cx
		ret

IsBitSet:	push	bx
		 call	BitMaske
		 test	[cs:bx],al
		pop	bx
		ret

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:	  call	IsBitSet
	  jz	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:	  call	IsBitSet
	  jz	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.1 (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, mehrere Laufwerke)',nl
	db	'Parameter:	- (keiner)	TSR laden oder aktivieren',nl
	db	'		- Laufwerk:	Laufwerk festlegen oder hinzufügen',nl
	db	'		- Laufwerk+	dito',nl
	db	'		- Laufwerk-	Laufwerk wegnehmen',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