home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 09 / ldm / ckbd1.asm < prev    next >
Encoding:
Assembly Source File  |  1989-06-15  |  6.3 KB  |  245 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                     CKBD1.ASM                           *
  3. ;*  Der residente Teil von CKBD 3.00 wird als CKBD1.OBJ in *
  4. ;*  MAKECKBD.PAS eingebunden und mit den Textdaten zusam-  *
  5. ;*  mengelinkt ...                                         *
  6. ;* ------------------------------------------------------- *
  7. ;*  Special thanks to PETER MÜLLER !
  8.  
  9.                ideal
  10.                %noctls
  11.                locals          @@
  12.                %pagesize       80,132
  13.                %title          "CKBD1"
  14.  
  15.                ;
  16.                ; Konstanten für alles mögliche
  17.                ;
  18.  
  19. READ           EQU     0       ; BIOS, Tastatur lesen
  20. STATUS         EQU     1       ; BIOS, Tastatur-Status
  21. SHIFTS         EQU     2       ; BIOS, Shift-Status
  22. TABEND         EQU     -1      ; Letzter Scancode
  23.  
  24.                ;
  25.                ; Es wird ein Zeichen über SI gelesen
  26.                ;
  27.  
  28. macro          GET1CHAR        flag
  29.                push    si
  30.                xor     ah,ah
  31.                mov     si,[nextchar]
  32.                lodsb
  33.                pop     si
  34.                endm
  35.  
  36.                ;
  37.                ; Hier fängt der Spaß an:
  38.                ;
  39.  
  40. segment        code
  41.                assume  cs:code, ds:code
  42.                assume  es:nothing, ss:nothing
  43.  
  44.                ;
  45.                ; Der "Anker" für CKBD2:
  46.                ;
  47.  
  48.                org     00100h
  49. start:         mov     si,[initofs]
  50.                jmp     si
  51.  
  52.                ;
  53.                ; Hier wird die Adresse des alten Handlers
  54.                ; hingeschrieben, die vom neuen Handler
  55.                ; recht intensiv benutzt wird ...
  56.                ; PC = 00106H
  57.                ;
  58.  
  59. label          oldvector      dword
  60. ov_ofs         dw      ?
  61. ov_seg         dw      ?
  62.  
  63.                ;
  64.                ; initofs enthält das Start-Offset im CS
  65.                ; für CKBD2. Es wird zum Adressieren und
  66.                ; zum Lokalisieren von und innerhalb von
  67.                ; CKBD2 benutzt.
  68.                ; PC = 0010AH
  69.                ;
  70.  
  71. initofs        dw      ?
  72.  
  73.                ;
  74.                ; nextchar enthält das Offset des nächsten
  75.                ; zu lesenden Zeichens in der Tabelle. Ist
  76.                ; hier eine 0 zu finden, ist kein Zeichen
  77.                ; vorrätig ...
  78.                ; PC = 0010CH
  79.                ;
  80.  
  81. nextchar       dw      0
  82.  
  83.                ;
  84.                ; Der neue INT 16H-Handler als PROC FAR:
  85.                ; PC = 0010EH
  86.                ;
  87.  
  88. proc           isrhandler      far
  89.  
  90.                jmp     short @@0
  91.  
  92.                ;
  93.                ; Der Program-ID-String:
  94.                ;
  95.  
  96.                db      "O2"
  97.  
  98. @@0:           cmp     ah,STATUS
  99.                jle     @@1
  100.                jmp     [cs:oldvector]
  101. @@1:           push    ds
  102.                push    cs
  103.                pop     ds
  104.                je      @@2
  105.  
  106.                ;
  107.                ; BIOS-Funktion 0:
  108.                ;
  109.  
  110.                call    getkey
  111.                pop     ds
  112.                iret
  113.  
  114.                ;
  115.                ; BIOS-Funktion 1:
  116.                ;
  117.  
  118. @@2:           call    getstatus
  119.                pop     ds
  120.                ret     2
  121.  
  122. endp
  123.  
  124.                ;
  125.                ; transform ist gewissermaßen das Herz
  126.                ; von CKBD. Ein Scancode in AX wird benutzt,
  127.                ; um nextchar zu setzen und gegebenfalls
  128.                ; AX zu ändern. Wenn ein Scancode in der
  129.                ; Tabelle auftaucht, ist das Carry-Bit ge-
  130.                ; setzt ...
  131.                ;
  132.  
  133. proc           transform
  134.  
  135.                push    bx
  136.                push    si
  137.                mov     bx,ax
  138.                mov     si,offset tabstart
  139.  
  140.                cld
  141. readcode:      lodsw
  142.                cmp     ax,TABEND
  143.                je      notfound
  144.                cmp     ax,bx
  145.                lodsw
  146.                je      hotcode
  147.                jmp     readcode
  148.  
  149.                ;
  150.                ; AX ist nicht zu finden, nextchar muß auf
  151.                ; 0 gesetzt werden, AX wird auf den alten
  152.                ; Scancode zurückgesetzt
  153.                ;
  154.  
  155. notfound:      mov     [nextchar],0
  156.                mov     ax,bx
  157.                clc
  158.                jmp     short tfdone
  159.  
  160.                ;
  161.                ; Yeah ! AX war ein gesuchter Scancode, AX
  162.                ; enthält jetzt das Offset des ersten Zei-
  163.                ; chens des Strings. Carry setzen & Zeichen
  164.                ; auslesen.
  165.                ;
  166.  
  167. hotcode:       mov     [nextchar],ax
  168.                xchg    ax,si
  169.                xor     ah,ah
  170.                lodsb
  171.                stc
  172.  
  173. tfdone:        pop     si
  174.                pop     bx
  175.                ret
  176.  
  177. endp
  178.  
  179.                ;
  180.                ; getkey wird für die BIOS-Funktion 0
  181.                ; aufgerufen und liest entweder aus der
  182.                ; internen Tabelle oder vom BIOS die
  183.                ; gewünschte Information
  184.                ;
  185.  
  186. proc           getkey
  187.  
  188.                cmp     [nextchar],0
  189.                jne     readchar
  190.  
  191. readbios:      pushf
  192.                call    [oldvector]
  193.                call    transform
  194.                jnc     gkdone
  195.                jc      incnch
  196.  
  197. readchar:      GET1CHAR
  198.                or      al,al
  199.                jz      readbios
  200.  
  201. incnch:        inc     [nextchar]
  202. gkdone:        ret
  203.  
  204. endp
  205.  
  206.                ;
  207.                ; getstatus ersetzt BIOS-Funktion 1. Auch
  208.                ; hier muß man einen Scancode interpre-
  209.                ; tieren !
  210.                ;
  211.  
  212. proc           getstatus
  213.  
  214.                cmp     [nextchar],0
  215.                je      askbios
  216.                GET1CHAR
  217.                or      al,al
  218.                jnz     gsdone
  219.                inc     ah
  220.                jz      askbios
  221.  
  222. askbios:       pushf
  223.                call    [oldvector]
  224.                pushf
  225.                call    transform
  226.                mov     [nextchar],0
  227.                popf
  228.  
  229. gsdone:        ret
  230.  
  231. endp
  232.  
  233.                ;
  234.                ; MAKECKBD hängt hier die Zeichenketten-
  235.                ; tabelle an:
  236.                ;
  237.  
  238. label          tabstart        byte
  239.  
  240. ends
  241.  
  242. end            start
  243. ;* ------------------------------------------------------- *
  244. ;*                 Ende von CKBD1.ASM                      *
  245.