Source file: /~heha/hsn/dos/iportp.zip/IPORTP.ASM

;Programm IPortP (IndexPortPatch):

	include	prolog.asm
	cld
	mov	si,81h
Parse2:	lodsb
	cmp	al,' '
	jz	parse2
	dec	si
	mov	bl,16	;hexadezimal
	call	inw2
	jc	pa2
	mov	[idxp],ax
parse3:	lodsb
	cmp	al,' '
	jz	parse3
	dec	si
	call	inw2
	jc	pa2
	mov	[datp],ax
parse4:	lodsb
	cmp	al,' '
	jz	parse4
	cmp	al,13
	jz	parse5
	or	[right],80h ;ReadOut abstellen
parse5:	;
	PRINT	idxp$	;erst mal Kontrollausgaben
	mov	ax,[idxp]
	call	axhx
	PRINT	datp$
	mov	ax,[datp]
	call	axhx
	PRINT	headln$	;neue Zeile
	;
	call	hdump	;dann erst den Dump ausgeben
	;
	jr	hlo1
pa2:	PRINT	help$
	DOS	4c01h
hlo1:	PRINT	restoc$	;PUSH CURSOR und Cursor nach 0/0

hloop:	;HAUPTSCHLEIFE
	DOS	8	;Tasteneingabe
	cmp	al,0	;Sondertasten?
	jnz	nocurs
	DOS	8	;Sondercode holen
	cmp	al,4dh
	jz	cur
	cmp	al,4bh
	jz	cul
	cmp	al,50h
	jz	cud
	cmp	al,48h
	jz	cuu
endcu:	jr	hloop

cur:	call	korr	;BACKSTEP wenn rechts stehend
	mov	al,[padr]
	and	al,0fh
	cmp	al,0fh
	jz	endcu
	inc	[padr]
	mov	dx,ofs cur$
	jr	pout

cul:	call	korr
	mov	al,[padr]
	and	al,0fh
	jz	endcu
	dec	[padr]
	mov	dx,ofs cul$
	jr	pout

cud:	call	korr
	mov	al,[padr]
	and	al,0f0h
	cmp	al,0f0h
	jz	endcu
	add	[padr],10h
	mov	dx,ofs cud$
	jr	pout

cuu:	call	korr
	mov	al,[padr]
	and	al,0f0h
	jz	endcu
	sub	[padr],10h
	mov	dx,ofs cuu$
pout:
	DOS	9
	jr	endcu

;nextp:	call	korr
;	mov	al,[padr]
;	and	al,0fh
;	cmp	al,0fh
;	jz	nlp
;	inc	[padr]
;	PRINT	cur$
;	ret
;nlp:
;	call	korr
;	mov	al,[padr]
;	and	al,0f0h
;	cmp	al,0f0h
;	jz	end1
;	PRINT	cud$
nocurs:
	call	UpCase
	cmp	al,27	;ESC?
	jz	hbrk
	cmp	al,'Q'	;Quit?
	jz	hbrk
	cmp	al,' '
	jz	redraw
	mov	ah,al	;retten
	call	anum	;A numerisch wandeln
	cmp	al,16
	jnc	endcu	;ungltige Taste
	xchg	al,ah
	call	ochr	;Zeichen ausgeben
	xchg	al,ah
	test	[right],1 ;rechts stehend?
	jnz	isrig
	mov	cl,4
	shl	al,cl
	mov	[zahl],al ;ist im High-Teil
	or	[right],1
	jmp	hloop
isrig:
	or	[zahl],al ;LOW-Nibble
	call	korr0	;Cursor zurck!
	mov	ah,[zahl]
	mov	al,[padr]
	call	bytout
	jmp	hloop

redraw:
	PRINT	goto00$	;POP CURSOR und zum "Seitenanfang"
	call	hdump	;Ausgabe
	PRINT	restoc$	;PUSH CURSOR und Cursor nach oben fahren
	;nun alte Position anfahren
	mov	ch,[padr]
red2:	sub	ch,10h
	jc	red1
	PRINT	cud$
	jr	red2
red1:
	add	ch,10h
red4:	sub	ch,1
	jc	red3
	PRINT	cur$
	jr	red4
red3:
	jmp	hloop

hbrk:	PRINT	popc$	;POP CURSOR ans Ende
	DOS	4c00h	;Ende

bytout:	;Adreáport: AL, Datenport: AH
	push	dx
	mov	dx,[idxp]
	out	dx,al
	mov	dx,[datp]
	xchg	al,ah
	out	dx,al
	xchg	al,ah
	pop	dx
	ret

bytin:	;Adreáport: AL, Datenport: AL
	push	dx
	mov	dx,[idxp]
	out	dx,al
	mov	dx,[datp]
	in	al,dx
	pop	dx
	ret

korr0:	mov	al,8
	call	ochr
korr:	test	[right],1
	jz	endk
	mov	al,8	;Backstep
	call	ochr	;ausgeben
	and	[right],not 1
endk:	ret

hdump:	;ein Port-Hexdump ausgeben
	xor	dl,dl	;Adresse 0
	mov	cx,10h	;Auáenschleife
hdl1:	push	cx
	 mov	al,dl
	 call	ahex	;Adresse ausgeben
	 mov	al,':'
	 call	ochr
	 mov	cx,10h	;Innenschleife
hdl2:	 mov	al,' '
	 call	ochr
	 test	[right],80h
	 jnz	noread
	 mov	al,dl	;Adresse
	 call	bytin	;Byte einlesen
	 call	ahex
	 jr	readok
noread:	 mov	al,'?'
	 call	ochr
	 call	ochr
readok:	 inc	dl	;n„chste Adresse
	 loop	hdl2
	 mov	al,13
	 call	ochr
	 mov	al,10
	 call	ochr
	pop	cx
	loop	hdl1
	ret

	_INW2
	_UPCASE
	_AXHX

padr	db	0	;aktuelle Adresse
right	db	0	;Bit0: RECHTS-Flag
zahl	db	0	;Zahl
idxp	dw	0	;Indexport
datp	dw	0	;Datenport

cul$	db	27,'[3D$'
cur$	db	27,'[3C$'
cud$	db	27,'[B$'
cuu$	db	27,'[A$'
goto00$	db	27,'[u',27,'[16A$'
popc$	db	27,'[u$'
restoc$	db	27,'[s',27,'[16A',27,'[4C$'

idxp$	db	'Indexport=$'
datp$	db	', Datenport=$'
headln$	db	nl
	db	27,'[1mSPACE',27,'[0m=Neu lesen, ',27,'[1mESC',27,'[0m=Ende, ',27,'[1m2 Hexziffern',27,'[0m=schreiben',nl
	db	27,'[4m    +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f',27,'[0m',nl
	db	'$'
help$:
    db 'IndexPortPatch (haftmann#software): HexEditor fr Indexports, ++Freeware++',nl
    db 'Kommandozeile: iportp <indexport> <datenport> [NoReadOut-Schalter]',nl
    db 'A',8,'AN',8,'NS',8,'SI',8,'I-Treiber erforderlich!',nl
    db '$'
	endc
Detected encoding: UTF-80