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

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