home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / tricks / asm / getkey.tsr < prev    next >
Encoding:
Text File  |  1992-01-10  |  4.6 KB  |  170 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                      GETKEY.TSR                         *
  3. ;* Assemblerroutine zum Einbinden ins TSR Gerüstprogramm   *
  4. ;*          (c) 1992 Ralph Seelig & DMV-Verlag             *
  5. ;* ------------------------------------------------------- *
  6.  
  7. prgnam     db ' GetTastCode 1.0 ',0
  8. escmeld    db ' ESC für Ende ',0
  9. text1      db ' Scancode : ',0
  10. leer       db '      h ',0
  11. scrpuffer  db 961 dup (?)
  12. aktseite   db ?
  13. scrofs     dw ?
  14.  
  15. WriteHex proc
  16.   ; gibt den Wert in AX hexadezimal aus
  17.   ; AX      =>  Wert
  18.   ; DL,DH   =>  Cursorposition (x,y)
  19.   ; BL      =>  Farbattribut
  20.   push ax
  21.   mov si,ax
  22.   mov bh,aktseite
  23.   mov ah,02h
  24.   int 10h                      ; Cursor positionieren
  25.   mov cx,4                     ; 4 Rol Befehle vorbereiten
  26.   wrhloop:
  27.     push cx
  28.     mov cl,4
  29.     rol si,cl                  ; Ziffern verschieben
  30.     mov ax,si
  31.     and al,0fh                 ; andere Ziffern ausblenden
  32.     add al,48                  ; numerisch => alphanum.
  33.     cmp al,58                  ; Wert im Bereich von A..F
  34.     jb kleiner10               ; dann weiteren Wert
  35.       add al,7                 ; hinzuaddieren
  36.     kleiner10:
  37.     mov ah,09h
  38.     mov cx,1
  39.     int 10h                    ; 1 Zeichen anzeigen
  40.     inc dl                     ; x - Koordinate +1
  41.     mov ah,02h
  42.     int 10h
  43.     pop cx
  44.   loop wrhloop
  45.   pop ax
  46.   ret
  47. WriteHex endp
  48.  
  49. WriteAsciiZ proc
  50.   ; gibt einen String aus, der mit einem 0 Byte
  51.   ; abgeschlossen ist
  52.   ; BL      => Farbe
  53.   ; DL,DH   => Cursorposition (x,y)
  54.   ; DS:SI   => Adresse des Strings
  55.   push dx
  56.   mov bh,aktseite
  57.   wraloop:
  58.     mov ah,02h
  59.     int 10h
  60.     lodsb                      ; Zeichen laden
  61.     cmp al,0                   ; war es das 0 Byte
  62.     jz wraende                 ; dann Routine beenden
  63.     mov cx,1
  64.     mov ah,09h
  65.     int 10h                    ; Zeichen anzeigen
  66.     inc dl                     ; x - Koordinate + 1
  67.   jmp wraloop
  68.   wraende:
  69.   mov ah,02h
  70.   int 10h
  71.   pop dx
  72.   ret
  73. WriteAsciiZ endp
  74.  
  75. Screen proc
  76.   ; Bildschirmaufbau, gibt verschiedene Texte aus
  77.   mov cx,6
  78.   mov dl,45
  79.   mov bh,aktseite
  80.   mov bl,47h
  81.   lom1:                        ; Teilbereich farbig
  82.     push cx                    ; löschen
  83.     mov dh,cl
  84.     dec dh
  85.     mov ah,02h
  86.     int 10h                    ; Cursor setzen
  87.     mov cx,32
  88.     mov ah,09
  89.     mov al,20h                 ; AL = Leerzeichen
  90.     int 10h                    ; Zeichen ausgeben
  91.     pop cx
  92.   loop lom1
  93.   mov dh,1
  94.   mov dl,46
  95.   mov bl,4eh
  96.   mov si,offset prgnam
  97.   call WriteAsciiZ
  98.   inc dh
  99.   mov si,offset escmeld
  100.   mov bl,47h
  101.   call WriteAsciiZ
  102.   inc dh
  103.   inc dh
  104.   mov si,offset text1
  105.   call WriteAsciiZ
  106.   mov dl,60
  107.   mov bl,1fh
  108.   mov si,offset leer
  109.   call WriteAsciiZ
  110.   ret
  111. Screen endp
  112.  
  113. TsrProgram proc
  114.   ; eigentliches residentes Programm
  115.  
  116.   mov ah,0fh
  117.   int 10h                       ; aktuellen Vidomode holen
  118.   cmp al,4                      ; Grafikmodi ?
  119.   jb erlaubt
  120.     mov dl,7                    ; dann TSR Start verhindern
  121.     mov ah,2
  122.     int 21h                     ; Ton ausgeben
  123.     ret
  124.   erlaubt:
  125.   push es
  126.   xor dx,dx
  127.   mov es,dx
  128.   mov word ptr ax,es:[044eh]    ; Bildschirmoffset holen
  129.   mov scrofs,ax
  130.   mov byte ptr al,es:[0462h]   ; aktuelle Seite holen
  131.   mov aktseite,al
  132.   pop es
  133.   mov ah,03h
  134.   mov bh,al                    ; aktuelle Seite
  135.   int 10h
  136.   push dx                      ; Cursorposition retten
  137.   mov di,offset scrpuffer      ; Zeiger auf Puffer
  138.   push ds
  139.   pop es                       ; ES=DS
  140.   mov ax,0b800h                ; Segment der Videokarte
  141.   push ax                      ; Wert retten
  142.   mov si,ScrOfs                ; Offset der akt. Seite
  143.   mov ds,ax
  144.   mov cx,960                   ; 960 Bytes
  145.   rep movsb                    ; vom Bildschirm retten
  146.   push es
  147.   pop ds                       ; DS wieder herstellen
  148.   call screen
  149.   xor ax,ax
  150.   GetKey:
  151.     mov dh,4                   ; y und
  152.     mov dl,61                  ; x Position setzen
  153.     mov bl,1fh                 ; Farbe setzen
  154.     call WriteHex              ; Zeichen anzeigen
  155.     xor ax,ax
  156.     int 16h                    ; Tastencode holen
  157.     cmp al,1bh                 ; war es <ESC>
  158.   jnz GetKey                   ; wenn nicht, dann nochmal
  159.   pop es                       ; Segment der Videokarte
  160.   mov di,ScrOfs
  161.   mov si,offset scrpuffer
  162.   mov cx,960                   ; Bildschirmausschnitt
  163.   rep movsb                    ; restaurieren
  164.   pop dx                       ; Cursorposition holen
  165.   mov bh,aktseite
  166.   mov ah,02h
  167.   int 10h                      ; Cursor setzen
  168.   ret
  169. TsrProgram endp
  170.