;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 ;ungltige 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 zurck!
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 ;nchste 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 fr 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-8 | 0
|