home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* CKBD2.ASM *
- ;* Der flüchtige Teil von CKBD 3.00, er enthält die *
- ;* Initialisierungsroutine. Schwierigkeit: Es ist nicht *
- ;* direkt bekannt, wo MAKECKBD diesen Programmteil ablegt. *
- ;* CKBD1 springt deshalb mit einem JMP SI hierher, wobei *
- ;* SI eine von MAKECKBD gesetzte Adresse enthält. CKBD2 *
- ;* benutzt SI danach für seine eigenen Adressierungen ... *
- ;* Ehrlich, ein interessantes Problem ! *
- ;* ------------------------------------------------------- *
-
- ideal
- %noctls
- locals @@
- %pagesize 80,132
- %title "CKBD2"
- %subttl "Makros & Konstanten"
-
- ;
- ; OVxxx bezieht sich auf die Variable
- ; oldvector in CKBD1.ASM
- ;
-
- OVOFFSET EQU 00106h
- OVOFS EQU [word 00106h]
- OVSEG EQU [word 00108h]
-
- ;
- ; ENVSEG bezieht sich auf den Umgebungsver-
- ; weis im PSP
- ;
-
- ENVSEG EQU [word 0002ch]
-
- ;
- ; Und PARAMxxx beschreiben die Parameter-
- ; zeile
- ;
-
- PARAMLEN EQU [byte 00080h]
- PARAMOFS EQU 00081h
-
- ;
- ; Dies ist das Offset der ISR von CKBD
- ; (liegt in CKBD1)
- ;
-
- ISROFS EQU 0010eh
-
- ;
- ; Und noch ein Paar Makros ...
- ;
-
- macro WRITE string
- mov dx,offset string
- add dx,si
- mov ah,9
- int 21h
- endm
-
- macro GET_VECTOR intno
- mov ax,03500h + intno
- int 21h
- endm
-
- macro END_PROCESS retcode
- mov ax,04c00h + retcode
- int 21h
- endm
-
- %subttl "Initialisierungsroutine"
- %newpage
-
- segment code
- assume cs:code, ds:code
- assume es:nothing, ss:nothing
-
- org 0
-
- ;
- ; CKBD1 ruft CKBD2 mit einem JMP SI auf. Da-
- ; mit steht also in SI das Offset des ersten
- ; Bytes der Initialisierungsroutine.
- ; SI darf während des ganzen Procedere nicht
- ; zerstört werden, das wäre F A T A L ...
- ;
-
- start: jmp goon
-
- intro db 10, 13
- db "CKBD Version 3.00 (", ??date, ")"
- db 10, 13, "Copyright (c) 1989 by "
- db "Olaf Stoyke", 10, 13, "$"
- prginst db "Program installed.", 10, 13, "$"
- twoprgs db 7
- db "Program is already installed.",
- db 10, 13, "$"
- prgkilled db "Program removed.", 10, 13
- db "Memory freed.", 10, 13, "$"
- notkilled db 7
- db "Couldn't find CKBD, nothing "
- db "removed.", 10, 13, "$"
-
- flag db 0
-
- goon: WRITE intro
- GET_VECTOR 16h
-
- ;
- ; Das ES-Register darf nicht zerstört
- ; werden (wird es ja auch nicht, der
- ; Inhalt war gemeint ...)
- ;
-
- mov OVOFS,bx
- mov OVSEG,es
-
- ;
- ; Der ID-String wird abgefragt. Ein zwei-
- ; maliges Installieren ist damit nicht
- ; mehr möglich (und auch nicht wünschens-
- ; wert, oder ?)
- ;
-
- cmp [word es:bx+2],"2O"
- jnz @@0
- inc [flag+si]
-
- ;
- ; Nun muß die Parameterzeile analysiert
- ; werden. Wenn da nämlich ein Zeichen
- ; steht, das weder Blank noch Tab ist,
- ; dann ist ein Entfernen von CKBD gefor-
- ; dert ...
- ; ES und SI bitte nicht zerstören !
- ;
-
- @@0: cmp PARAMLEN,0
- jz install
- mov bx,PARAMOFS
- mov cl,PARAMLEN
- xor ch,ch
- cld
- @@1: mov al,[bx]
- inc bx
- cmp al,020h
- jz @@2
- cmp al,009h
- jz @@2
- jmp short kill
- @@2: loop @@1
-
- ;
- ; Hier wird versucht ein neues CKBD zu
- ; laden ...
- ;
-
- install: cmp [flag+si],1
- jz yesCKBD
- mov ax,02516h
- mov dx,ISROFS
- int 21h
-
- ;
- ; Das installierte CKBD benötigt keine
- ; Umgebung, wir geben sie frei ...
- ;
-
- cmp ENVSEG,0
- jz @@3
- mov ax,ENVSEG
- mov es,ax
- mov ah,049h
- int 21h
- @@3: WRITE prginst
- mov dx,si
- mov cl,4
- shr dx,cl
- inc dx
- mov ax,03100h
- int 21h
- yesCKBD: WRITE twoprgs
- jmp short quit
-
- ;
- ; Es wird nun versucht, ein vorher geladenes
- ; CKBD aus dem Speicher zu entfernen ...
- ;
-
- kill: cmp [flag+si],0
- jz noCKBD
- push ds
- lds dx,[es:OVOFFSET]
- mov ax,02516h
- int 21h
- pop ds
- mov ah,049h
- int 21h
- WRITE prgkilled
- jmp short quit
- noCKBD: WRITE notkilled
- quit: END_PROCESS 0
-
- ends
-
- end
- ;* ------------------------------------------------------- *
- ;* Ende von CKBD2.ASM *