home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / tricks / binaer.asm next >
Encoding:
Assembly Source File  |  1991-06-06  |  9.3 KB  |  278 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                     BINAER.ASM                          *
  3. ;*          Utility für den Turbo-Pascal-Editor            *
  4. ;*    Cursor hinter Binärzahl stellen (max. 16 Stellen!)   *
  5. ;*    und Hotkey (Default <ALT>-Y) drücken - schon wird    *
  6. ;*    z.B. 01111 zu $000F {01111b}                         *
  7. ;*                                                         *
  8. ;* Übersetzen mit TASM BINAER                              *
  9. ;*                TLINK /t BINAER                          *
  10. ;* bzw.                                                    *
  11. ;*                MASM BINAER                              *
  12. ;*                LINK BINAER                              *
  13. ;*                EXE2BIN BINAER.EXE BINAER.COM            *
  14. ;*                DEL BINAER.EXE                           *
  15. ;*                                                         *
  16. ;* Die Warnung "No Stack" kann ignoriert werden.           *
  17. ;*                                                         *
  18. ;*         (c) 1991 G.Blumert  &  TOOLBOX                  *
  19. ;* ------------------------------------------------------- *
  20.  
  21. kbLeft      equ       4b00h            ; Pfeiltaste links
  22.  
  23. code segment
  24. assume cs:code, ds:code, ss:code, es: nothing
  25.  
  26.              org      2ch
  27. Umgebungsadr dw       ?
  28.  
  29.              org      100h             ; COM-Programm
  30. start:       jmp      anfang
  31.  
  32. HotKey       dw       1500h            ; <ALT> Y
  33. OldTastInt   dw       ?,?
  34. TastAktiv    db       0
  35. SaveAX       dw       ?
  36. SaveCursor   dw       ?
  37.  
  38. ;* -- Speicher für abzuspielende Zeichen ----------------- *
  39.  
  40. Buffer       dw       'b','}',kbLeft,kbLeft
  41.              dw       17h dup (?)
  42.  
  43. ;* -- Zeigt hinter das letzte abzuspielende Zeichen ------ *
  44.  
  45. BuffCount   dw       ?
  46.  
  47. ;* -- Zeiger auf aktuell abzuspielendes Zeichen ---------- *
  48.  
  49. BuffPtr     dw       ?
  50.  
  51. ;* -- Flag - Zeigt an, daß noch Zeichen abzuspielen sind - *
  52.  
  53. PushFlag    db       0
  54.  
  55. ;* -- Gibt Piepston aus ---------------------------------- *
  56. ;*  Achtung: Zerstört die Register AX und BX !
  57.  
  58. alarm       proc near
  59.             mov    ah, 0fh
  60.             int    10h
  61.             mov    ax, 0e07h
  62.             int    10h
  63.             ret
  64. alarm       endp
  65.  
  66. ;* -- Neue Int-16h-Prozedur ------------------------------ *
  67. NewTastInt  proc far                   ; Zeichen ausgeben?
  68.             cmp    cs:[PushFlag], 0
  69.             je     @@TesteHotkey       ; nein - auf Hotkey
  70.             cmp    ah, 1               ; prüfen
  71.             je     @@MyFunc1
  72.             cmp    ah, 11h
  73.             je     @@MyFunc1
  74.             or     ah, ah
  75.             jz     @@MyFunc0
  76.             cmp    ah, 10h
  77.             je     @@MyFunc0
  78.   ;* weder Funktioen 0/10h oder 1/11h - also alten
  79.   ;* Interrupthandler aufrufen
  80.             jmp    dword ptr cs:[OldTastInt]
  81.  
  82.   ;* Unterfunktion 1 simulieren - Zeichen vorhanden
  83. @@MyFunc1:  sub    ah, ah              ; AH = 0
  84.             inc    ah                  ; Zero-Flag auf 0
  85.             push   bx
  86.             mov    bx, cs:[BuffPtr]
  87.             mov    ax, cs:[bx]
  88.             pop    bx
  89.             retf   2                   ; wegen Zero-Flag
  90.                                        ; kein IRET
  91.  
  92.   ;* Unterfunktion 0 simulieren
  93. @@MyFunc0:  push   bx
  94.             mov    bx, cs:[BuffPtr]
  95.             mov    ax, cs:[bx]
  96.             add    bx, 2
  97.             cmp    bx, cs:[BuffCount]  ; Fertig?
  98.             je     @@LastChar          ; ja
  99.             mov    cs:[BuffPtr], bx    ; nein
  100.             pop    bx
  101.             iret
  102.  
  103. @@LastChar: dec    cs:[PushFlag]       ; Flag löschen
  104.             pop    bx
  105.             iret
  106.  
  107. @@TesteHotKey:
  108.             cmp    ah, 0               ; Funktion 0?
  109.             je     @@MyProc
  110.             cmp    ah, 10h             ; oder 10h?
  111.             je     @@MyProc
  112.             jmp    dword ptr cs:[OldTastInt]     ; nein
  113. @@MyProc:   mov    cs:[SaveAX], ax
  114.             pushf
  115.             call   dword ptr cs:[OldTastInt]
  116.             cmp    ax, cs:HotKey       ; Hotkey?
  117.             je     @@DoIt1
  118.             iret
  119.  
  120. @@DoIt1:    cmp    cs:[TastAktiv], 0   ; Routine schon
  121.             je     @@DoIt              ; aktiviert?
  122.             iret                       ; ja
  123. @@DoIt:     inc    cs:[TastAktiv]
  124.             push   bx
  125.             push   cx
  126.             push   dx
  127.             push   di
  128.             push   si
  129.             push   es
  130.             push   ds
  131.             push   cs
  132.             pop    ds
  133.  
  134.             mov    ah, 0fh             ; Bildschirmseite
  135.             int    10h                 ; in BH
  136.             mov    ah, 03h             ; Cursor lesen
  137.             int    10h
  138.             mov    [SaveCursor], dx
  139.             xor    cx, cx
  140.             mov    si, cx
  141.             mov    di, 8
  142. @@NextBin:  cmp    cx, 16              ; Schon 16 Bits?
  143.             jna    @@3                 ; nein, dann  weiter
  144.             mov    di, 8               ; Fehlerbedingung
  145.             jmp    short @@Fertig
  146. @@3:        dec    dl                  ; Cursor nach links
  147.             mov    ah, 2               ; Setze Cursor
  148.             int    10h
  149.             mov    ah, 8
  150.             int    10h                 ; Zeichen lesen
  151.             sub    al, '0'
  152.             cmp    al, 1               ; 0 oder 1?
  153.             ja     @@Fertig            ; nein - also fertig
  154.  
  155.             sub    ah, ah              ; Attribut maskieren
  156.             shl    ax, cl              ; Position bestimmen
  157.             or     si, ax              ; und aufsummieren
  158.             inc    cx                  ; weiterzählen
  159.             mov    [Buffer+di], kbLeft
  160.             inc    di                  ; jedes gelesene Z.
  161.             inc    di                  ; einmal <links>
  162.             jmp    @@NextBin
  163. @@Fertig:   mov    dx, [SaveCursor]
  164.             mov    ah, 2
  165.             int    10h                 ; Cursor zurück
  166.             cmp    di, 8               ; wurde überhaupt
  167.             jne    @@2                 ; etwas gelesen?
  168.             call   Alarm
  169.             mov    ax, [SaveAX]
  170.             jmp    short @@Leave
  171.  
  172. @@2:        mov    [Buffer+di], '$'
  173.             inc    di
  174.             inc    di
  175.             mov    cx, 4
  176. @@NextByte: mov    ax, si
  177.             and    ax, 1111b           ; Byteweise maskieren
  178.             push   ax                  ; Auf Stack packen,
  179.             push   cx                  ; um Reihenfolge
  180.             mov    cl, 4               ; einzuhalten
  181.             shr    si, cl
  182.             pop    cx
  183.             mov    ax, bx
  184.             loop   @@NextByte
  185.             mov    cx, 4
  186. @@1:        pop    ax                  ; Bytes vom Stack
  187.             cmp    al, 10              ; konvertieren
  188.             jb     @@IsZiffer
  189.             add    al, 'A'-10
  190.             jmp    short @@MoveChar
  191. @@IsZiffer: add    al, '0'
  192. @@MoveChar: mov    [Buffer+di], ax
  193.             inc    di                  ; ... in den Puffer
  194.             inc    di
  195.             loop   @@1
  196.             mov    [Buffer+di], ' '
  197.             mov    [Buffer+di+2], '{'
  198.             add    di, 4
  199.             mov    [BuffCount], offset Buffer
  200.             add    [BuffCount], di
  201.             mov    [BuffPtr], offset Buffer
  202.             add    [BuffPtr], 2
  203.             inc    [PushFlag]
  204.             mov    ax, [Buffer]        ; Erstes Zeichen
  205. @@Leave:    pop    ds                  ; gleich zurückgeben
  206.             pop    es
  207.             pop    si
  208.             pop    di
  209.             pop    dx
  210.             pop    cx
  211.             pop    bx
  212.             dec    cs:[TastAktiv]
  213.             iret
  214. NewTastInt  endp
  215.  
  216. ;* ------------------------------------------------------- *
  217. ;*   Ende des residenten Teils
  218.  
  219. resident_ende      equ       $
  220.  
  221. ;* ------------------------------------------------------- *
  222.  
  223. WriteBIOS   proc  near
  224. ;*  Erwartet in DS:SI Zeiger auf einen String,
  225. ;*  der durch 0 beendet sein muß (ASCIIZ)
  226.  
  227.             mov     ah, 0eh
  228. WB1:        lodsb
  229.             or      al, al
  230.             jz      WBende
  231.             int     10h
  232.             jmp     WB1
  233. WBende:     ret
  234. WriteBIOS   endp
  235.  
  236. ;* ------------------------------------------------------- *
  237. ;*  "main"
  238.  
  239. Anfang:     mov     si, offset Meld_Start
  240.             call    WriteBIOS
  241.  
  242.   ;* Alten Tastatur-Interrupt sichern
  243.             mov     ax, 3516h
  244.             int     21h
  245.             mov     [OldTastInt], bx
  246.             mov     [OldTastInt+2], es
  247.   ;* Neuen Interrupt setzen
  248.             mov     dx, Offset NewTastInt
  249.             mov     ax, 2516h
  250.             int     21h
  251.   ;* Installationsmeldung ausgeben
  252.             mov     si, offset Meld_Inst
  253.             call    writeBIOS
  254.   ;* Umgebung freigeben
  255.             mov     ax, [UmgebungsAdr]
  256.             mov     es, ax
  257.             mov     ah, 49h
  258.             int     21h
  259.   ;* resident beenden
  260.             mov     dx, offset Resident_Ende
  261.             mov     cl, 4
  262.             shr     dx, cl
  263.             inc     dx
  264.             mov     ax, 3100h
  265.             int     21h
  266.  
  267. Meld_Start  db      'BINÄR 1.0 (c) 1991 G.Blumert & '
  268.             db      'TOOLBOX', 13, 10
  269.             db      'Wandelt Binär- in Hexzahlen um.'
  270.             db      10,13,0
  271. Meld_Inst   db      'BINÄR wurde installiert!'
  272.             db      10,13,10,13,0
  273. code        ends
  274.             end     start
  275. ;* ------------------------------------------------------- *
  276. ;*                Ende von BINAER.ASM                      *
  277.  
  278.