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

  1. ;* ------------------------------------------------------- *
  2. ;*                      CKBD2.ASM                          *
  3. ;* Der flüchtige Teil von CKBD 3.00, er enthält die        *
  4. ;* Initialisierungsroutine. Schwierigkeit: Es ist nicht    *
  5. ;* direkt bekannt, wo MAKECKBD diesen Programmteil ablegt. *
  6. ;* CKBD1 springt deshalb mit einem JMP SI hierher, wobei   *
  7. ;* SI eine von MAKECKBD gesetzte Adresse enthält. CKBD2    *
  8. ;* benutzt SI danach für seine eigenen Adressierungen ...  *
  9. ;* Ehrlich, ein interessantes Problem !                    *
  10. ;* ------------------------------------------------------- *
  11.  
  12.                ideal
  13.                %noctls
  14.                locals          @@
  15.                %pagesize       80,132
  16.                %title          "CKBD2"
  17.                %subttl         "Makros & Konstanten"
  18.  
  19.                ;
  20.                ; OVxxx bezieht sich auf die Variable
  21.                ; oldvector in CKBD1.ASM
  22.                ;
  23.  
  24. OVOFFSET       EQU             00106h
  25. OVOFS          EQU             [word 00106h]
  26. OVSEG          EQU             [word 00108h]
  27.  
  28.                ;
  29.                ; ENVSEG bezieht sich auf den Umgebungsver-
  30.                ; weis im PSP
  31.                ;
  32.  
  33. ENVSEG         EQU             [word 0002ch]
  34.  
  35.                ;
  36.                ; Und PARAMxxx beschreiben die Parameter-
  37.                ; zeile
  38.                ;
  39.  
  40. PARAMLEN       EQU             [byte 00080h]
  41. PARAMOFS       EQU             00081h
  42.  
  43.                ;
  44.                ; Dies ist das Offset der ISR von CKBD
  45.                ; (liegt in CKBD1)
  46.                ;
  47.  
  48. ISROFS         EQU             0010eh
  49.  
  50.                ;
  51.                ; Und noch ein Paar Makros ...
  52.                ;
  53.  
  54. macro          WRITE string
  55.                mov     dx,offset string
  56.                add     dx,si
  57.                mov     ah,9
  58.                int     21h
  59.                endm
  60.  
  61. macro          GET_VECTOR intno
  62.                mov     ax,03500h + intno
  63.                int     21h
  64.                endm
  65.  
  66. macro          END_PROCESS retcode
  67.                mov     ax,04c00h + retcode
  68.                int     21h
  69.                endm
  70.  
  71.                %subttl         "Initialisierungsroutine"
  72.                %newpage
  73.  
  74. segment        code
  75.                assume  cs:code, ds:code
  76.                assume  es:nothing, ss:nothing
  77.  
  78.                org     0
  79.  
  80.                ;
  81.                ; CKBD1 ruft CKBD2 mit einem JMP SI auf. Da-
  82.                ; mit steht also in SI das Offset des ersten
  83.                ; Bytes der Initialisierungsroutine.
  84.                ; SI darf während des ganzen Procedere nicht
  85.                ; zerstört werden, das wäre  F A T A L  ...
  86.                ;
  87.  
  88. start:         jmp     goon
  89.  
  90. intro          db      10, 13
  91.                db      "CKBD Version 3.00 (", ??date, ")"
  92.                db      10, 13, "Copyright (c) 1989 by "
  93.                db      "Olaf Stoyke", 10, 13, "$"
  94. prginst        db      "Program installed.", 10, 13, "$"
  95. twoprgs        db      7
  96.                db      "Program is already installed.",
  97.                db      10, 13, "$"
  98. prgkilled      db      "Program removed.", 10, 13
  99.                db      "Memory freed.", 10, 13, "$"
  100. notkilled      db      7
  101.                db      "Couldn't find CKBD, nothing "
  102.                db      "removed.", 10, 13, "$"
  103.  
  104. flag           db      0
  105.  
  106. goon:          WRITE   intro
  107.                GET_VECTOR 16h
  108.  
  109.                ;
  110.                ; Das ES-Register darf nicht zerstört
  111.                ; werden (wird es ja auch nicht, der
  112.                ; Inhalt war gemeint ...)
  113.                ;
  114.  
  115.                mov     OVOFS,bx
  116.                mov     OVSEG,es
  117.  
  118.                ;
  119.                ; Der ID-String wird abgefragt. Ein zwei-
  120.                ; maliges Installieren ist damit nicht
  121.                ; mehr möglich (und auch nicht wünschens-
  122.                ; wert, oder ?)
  123.                ;
  124.  
  125.                cmp     [word es:bx+2],"2O"
  126.                jnz     @@0
  127.                inc     [flag+si]
  128.  
  129.                ;
  130.                ; Nun muß die Parameterzeile analysiert
  131.                ; werden. Wenn da nämlich ein Zeichen
  132.                ; steht, das weder Blank noch Tab ist,
  133.                ; dann ist ein Entfernen von CKBD gefor-
  134.                ; dert ...
  135.                ; ES und SI bitte nicht zerstören !
  136.                ;
  137.  
  138. @@0:           cmp     PARAMLEN,0
  139.                jz      install
  140.                mov     bx,PARAMOFS
  141.                mov     cl,PARAMLEN
  142.                xor     ch,ch
  143.                cld
  144. @@1:           mov     al,[bx]
  145.                inc     bx
  146.                cmp     al,020h
  147.                jz      @@2
  148.                cmp     al,009h
  149.                jz      @@2
  150.                jmp     short kill
  151. @@2:           loop    @@1
  152.  
  153.                ;
  154.                ; Hier wird versucht ein neues CKBD zu
  155.                ; laden ...
  156.                ;
  157.  
  158. install:       cmp     [flag+si],1
  159.                jz      yesCKBD
  160.                mov     ax,02516h
  161.                mov     dx,ISROFS
  162.                int     21h
  163.  
  164.                ;
  165.                ; Das installierte CKBD benötigt keine
  166.                ; Umgebung, wir geben sie frei ...
  167.                ;
  168.  
  169.                cmp     ENVSEG,0
  170.                jz      @@3
  171.                mov     ax,ENVSEG
  172.                mov     es,ax
  173.                mov     ah,049h
  174.                int     21h
  175. @@3:           WRITE   prginst
  176.                mov     dx,si
  177.                mov     cl,4
  178.                shr     dx,cl
  179.                inc     dx
  180.                mov     ax,03100h
  181.                int     21h
  182. yesCKBD:       WRITE   twoprgs
  183.                jmp     short quit
  184.  
  185.                ;
  186.                ; Es wird nun versucht, ein vorher geladenes
  187.                ; CKBD aus dem Speicher zu entfernen ...
  188.                ;
  189.  
  190. kill:          cmp     [flag+si],0
  191.                jz      noCKBD
  192.                push    ds
  193.                lds     dx,[es:OVOFFSET]
  194.                mov     ax,02516h
  195.                int     21h
  196.                pop     ds
  197.                mov     ah,049h
  198.                int     21h
  199.                WRITE   prgkilled
  200.                jmp     short quit
  201. noCKBD:        WRITE   notkilled
  202. quit:          END_PROCESS 0
  203.  
  204.                ends
  205.  
  206.                end
  207. ;* ------------------------------------------------------- *
  208. ;*                  Ende von CKBD2.ASM                     *
  209.