home *** CD-ROM | disk | FTP | other *** search
- 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 *
-