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

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