home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* BINAER.ASM *
- ;* Utility für den Turbo-Pascal-Editor *
- ;* Cursor hinter Binärzahl stellen (max. 16 Stellen!) *
- ;* und Hotkey (Default <ALT>-Y) drücken - schon wird *
- ;* z.B. 01111 zu $000F {01111b} *
- ;* *
- ;* Übersetzen mit TASM BINAER *
- ;* TLINK /t BINAER *
- ;* bzw. *
- ;* MASM BINAER *
- ;* LINK BINAER *
- ;* EXE2BIN BINAER.EXE BINAER.COM *
- ;* DEL BINAER.EXE *
- ;* *
- ;* Die Warnung "No Stack" kann ignoriert werden. *
- ;* *
- ;* (c) 1991 G.Blumert & TOOLBOX *
- ;* ------------------------------------------------------- *
-
- kbLeft equ 4b00h ; Pfeiltaste links
-
- code segment
- assume cs:code, ds:code, ss:code, es: nothing
-
- org 2ch
- Umgebungsadr dw ?
-
- org 100h ; COM-Programm
- start: jmp anfang
-
- HotKey dw 1500h ; <ALT> Y
- OldTastInt dw ?,?
- TastAktiv db 0
- SaveAX dw ?
- SaveCursor dw ?
-
- ;* -- Speicher für abzuspielende Zeichen ----------------- *
-
- Buffer dw 'b','}',kbLeft,kbLeft
- dw 17h dup (?)
-
- ;* -- Zeigt hinter das letzte abzuspielende Zeichen ------ *
-
- BuffCount dw ?
-
- ;* -- Zeiger auf aktuell abzuspielendes Zeichen ---------- *
-
- BuffPtr dw ?
-
- ;* -- Flag - Zeigt an, daß noch Zeichen abzuspielen sind - *
-
- PushFlag db 0
-
- ;* -- Gibt Piepston aus ---------------------------------- *
- ;* Achtung: Zerstört die Register AX und BX !
-
- alarm proc near
- mov ah, 0fh
- int 10h
- mov ax, 0e07h
- int 10h
- ret
- alarm endp
-
- ;* -- Neue Int-16h-Prozedur ------------------------------ *
- NewTastInt proc far ; Zeichen ausgeben?
- cmp cs:[PushFlag], 0
- je @@TesteHotkey ; nein - auf Hotkey
- cmp ah, 1 ; prüfen
- je @@MyFunc1
- cmp ah, 11h
- je @@MyFunc1
- or ah, ah
- jz @@MyFunc0
- cmp ah, 10h
- je @@MyFunc0
- ;* weder Funktioen 0/10h oder 1/11h - also alten
- ;* Interrupthandler aufrufen
- jmp dword ptr cs:[OldTastInt]
-
- ;* Unterfunktion 1 simulieren - Zeichen vorhanden
- @@MyFunc1: sub ah, ah ; AH = 0
- inc ah ; Zero-Flag auf 0
- push bx
- mov bx, cs:[BuffPtr]
- mov ax, cs:[bx]
- pop bx
- retf 2 ; wegen Zero-Flag
- ; kein IRET
-
- ;* Unterfunktion 0 simulieren
- @@MyFunc0: push bx
- mov bx, cs:[BuffPtr]
- mov ax, cs:[bx]
- add bx, 2
- cmp bx, cs:[BuffCount] ; Fertig?
- je @@LastChar ; ja
- mov cs:[BuffPtr], bx ; nein
- pop bx
- iret
-
- @@LastChar: dec cs:[PushFlag] ; Flag löschen
- pop bx
- iret
-
- @@TesteHotKey:
- cmp ah, 0 ; Funktion 0?
- je @@MyProc
- cmp ah, 10h ; oder 10h?
- je @@MyProc
- jmp dword ptr cs:[OldTastInt] ; nein
- @@MyProc: mov cs:[SaveAX], ax
- pushf
- call dword ptr cs:[OldTastInt]
- cmp ax, cs:HotKey ; Hotkey?
- je @@DoIt1
- iret
-
- @@DoIt1: cmp cs:[TastAktiv], 0 ; Routine schon
- je @@DoIt ; aktiviert?
- iret ; ja
- @@DoIt: inc cs:[TastAktiv]
- push bx
- push cx
- push dx
- push di
- push si
- push es
- push ds
- push cs
- pop ds
-
- mov ah, 0fh ; Bildschirmseite
- int 10h ; in BH
- mov ah, 03h ; Cursor lesen
- int 10h
- mov [SaveCursor], dx
- xor cx, cx
- mov si, cx
- mov di, 8
- @@NextBin: cmp cx, 16 ; Schon 16 Bits?
- jna @@3 ; nein, dann weiter
- mov di, 8 ; Fehlerbedingung
- jmp short @@Fertig
- @@3: dec dl ; Cursor nach links
- mov ah, 2 ; Setze Cursor
- int 10h
- mov ah, 8
- int 10h ; Zeichen lesen
- sub al, '0'
- cmp al, 1 ; 0 oder 1?
- ja @@Fertig ; nein - also fertig
-
- sub ah, ah ; Attribut maskieren
- shl ax, cl ; Position bestimmen
- or si, ax ; und aufsummieren
- inc cx ; weiterzählen
- mov [Buffer+di], kbLeft
- inc di ; jedes gelesene Z.
- inc di ; einmal <links>
- jmp @@NextBin
- @@Fertig: mov dx, [SaveCursor]
- mov ah, 2
- int 10h ; Cursor zurück
- cmp di, 8 ; wurde überhaupt
- jne @@2 ; etwas gelesen?
- call Alarm
- mov ax, [SaveAX]
- jmp short @@Leave
-
- @@2: mov [Buffer+di], '$'
- inc di
- inc di
- mov cx, 4
- @@NextByte: mov ax, si
- and ax, 1111b ; Byteweise maskieren
- push ax ; Auf Stack packen,
- push cx ; um Reihenfolge
- mov cl, 4 ; einzuhalten
- shr si, cl
- pop cx
- mov ax, bx
- loop @@NextByte
- mov cx, 4
- @@1: pop ax ; Bytes vom Stack
- cmp al, 10 ; konvertieren
- jb @@IsZiffer
- add al, 'A'-10
- jmp short @@MoveChar
- @@IsZiffer: add al, '0'
- @@MoveChar: mov [Buffer+di], ax
- inc di ; ... in den Puffer
- inc di
- loop @@1
- mov [Buffer+di], ' '
- mov [Buffer+di+2], '{'
- add di, 4
- mov [BuffCount], offset Buffer
- add [BuffCount], di
- mov [BuffPtr], offset Buffer
- add [BuffPtr], 2
- inc [PushFlag]
- mov ax, [Buffer] ; Erstes Zeichen
- @@Leave: pop ds ; gleich zurückgeben
- pop es
- pop si
- pop di
- pop dx
- pop cx
- pop bx
- dec cs:[TastAktiv]
- iret
- NewTastInt endp
-
- ;* ------------------------------------------------------- *
- ;* Ende des residenten Teils
-
- resident_ende equ $
-
- ;* ------------------------------------------------------- *
-
- WriteBIOS proc near
- ;* Erwartet in DS:SI Zeiger auf einen String,
- ;* der durch 0 beendet sein muß (ASCIIZ)
-
- mov ah, 0eh
- WB1: lodsb
- or al, al
- jz WBende
- int 10h
- jmp WB1
- WBende: ret
- WriteBIOS endp
-
- ;* ------------------------------------------------------- *
- ;* "main"
-
- Anfang: mov si, offset Meld_Start
- call WriteBIOS
-
- ;* Alten Tastatur-Interrupt sichern
- mov ax, 3516h
- int 21h
- mov [OldTastInt], bx
- mov [OldTastInt+2], es
- ;* Neuen Interrupt setzen
- mov dx, Offset NewTastInt
- mov ax, 2516h
- int 21h
- ;* Installationsmeldung ausgeben
- mov si, offset Meld_Inst
- call writeBIOS
- ;* Umgebung freigeben
- mov ax, [UmgebungsAdr]
- mov es, ax
- mov ah, 49h
- int 21h
- ;* resident beenden
- mov dx, offset Resident_Ende
- mov cl, 4
- shr dx, cl
- inc dx
- mov ax, 3100h
- int 21h
-
- Meld_Start db 'BINÄR 1.0 (c) 1991 G.Blumert & '
- db 'TOOLBOX', 13, 10
- db 'Wandelt Binär- in Hexzahlen um.'
- db 10,13,0
- Meld_Inst db 'BINÄR wurde installiert!'
- db 10,13,10,13,0
- code ends
- end start
- ;* ------------------------------------------------------- *
- ;* Ende von BINAER.ASM *
-
-