terug.gif
; ***************************************************************************
; Deze routine verzorgt een uitstapje naar MS-DOS. Er wordt een tweede
; copie van COMMAND.COM opgestart, waarbij een volgend programma of commando
; uitgevoerd wordt. In het hoofdprogramma dient niet gebruikt geheugen reeds
; vrijgegeven te zijn.
; ***************************************************************************
; Auteur : Roland Leurs
; Datum : 17 augustus 1993
; ***************************************************************************
BEWAAR_SS DW ? ; OPSLAG VAN STACK GEGEVENS
BEWAAR_SP DW ?
ZOEKSTR DB "COMSPEC" ; ZOEKSTRING IN ENVIRONMENT TABEL
PARBLOCK EQU THIS WORD ; PARAMETERBLOK VOOR EXEC FUNCTIE
DW 0 ; ZELFDE ENVIRONMENT TABEL GEBRUIKEN
DW OFFSET COMLINE ; OFFSET ADRES VAN INSTRUKTIEREGEL
DW ? ; SEGMENT ADRES VAN INSTRUKTIEREGEL
DD 0 ; GEEN PSP #1
DD 0 ; GEEN PSP #2
COMLINE DB 128 DUP (?) ; BEVAT DE INSTRUKTIEREGEL
SHELL: PUSH BX ; BEWAAR ALLE REGISTERS
PUSH CX
PUSH DX
PUSH DI
PUSH SI
PUSH BP
PUSH DS
PUSH ES
; ***************************************************************************
; DTA ADRES WORDT DOOR EXEC FUNCTIE GEWIJZIGD, DUS BEWAREN!
; ***************************************************************************
MOV AH,2FH ; OPVRAGEN DTA ADRES
INT 21H
PUSH ES ; SAVE SEGMENT ADRES DTA
PUSH BX ; SAVE OFFSET ADRES DTA

; ***************************************************************************
; PLAATS VAN COMMAND.COM UIT ENVIRONMENT TABEL HALEN EN IN COMLINE ZETTEN
; ***************************************************************************
MOV PARBLOCK+4,CS ; CS IN PARAMETERBLOK ZETTEN
MOV BX,002CH ; SEGMENT ADRES ENVIRONMENT TABEL
MOV ES,[BX]
XOR SI,SI ; RESET SI, pointer in env.tabel
DEC SI ; VERLAAG POINTER (aanpassing)
EXE1: INC SI ; VERHOOG POINTER
XOR DI,DI ; RESET DI, pointer in zoekstring
EXE2: MOV AL,ES:[SI] ; LAADT KARAKTER VAN ENV. TABEL
CMP AL,ZOEKSTR[DI] ; VERGELIJK MET ZOEKSTRING
JNE EXE3 ; SPRING INDIEN NIET GELIJK
INC SI ; VERHOOG POINTERS
INC DI
JMP SHORT EXE2 ; GA VERDER MET VOLGEND KARAKTER
EXE3: CMP AL,'=' ; TEST OP = TEKEN
JE EXE5 ; SPRING INDIEN COMSPEC GEVONDEN
EXE4: CMP BYTE PTR ES:[SI],0 ; ZOEK EINDE STRING
JE EXE1 ; SPRING INDIEN GEVONDEN
INC SI ; ANDERS VERHOOG POINTER
JMP SHORT EXE4 ; EN BLIJF VERDER ZOEKEN
EXE5: INC SI ; VERHOOG POINTER (skip = teken)
MOV DX,SI ; ZET OFFSET ADRES COMSPEC IN DX
MOV COMLINE+1,'/' ; ZET " /C " IN COMLINE
MOV COMLINE+2,'C'
MOV COMLINE+3,' '
LEA DI,COMLINE+4 ; LAADT ADRES PARAMETERSTRING
MOV BL,3 ; KARAKTER TELLER BIJWERKEN
; ***************************************************************************
; PROGRAMMA NAAM VAN ATOM LEZEN
; ***************************************************************************
COPYPARAM3: CALL LEESBYTE ; LEES KARAKTER VAN ATOM
CMP AL,0 ; TEST OP EINDE REGEL
JE COPYEND
MOV [DI],AL ; ZET KARAKTER IN PARAMETERSTRING
INC DI ; VERHOOG POINTER
INC BL ; VERHOOG KARAKTER TELLER
CMP BL,126 ; TEST OP MAXIMALE LENGTE
JNE COPYPARAM3 ; SPRING INDIEN NOG TEKENS VOLGEN
COPYEND: MOV AL,13 ; LAADT CR
MOV [DI],AL ; INSTRUKTIEREGEL AFSLUITEN
MOV COMLINE,BL ; ZET LENGTE INSTRUKTIEREGEL

; ***************************************************************************
; STACK GEGEVENS VEILIG STELLEN EN PROGRAMMA UITVOEREN
; ***************************************************************************
MOV BEWAAR_SS,SS ; BEWAAR STACK SEGMENT REGISTER
MOV BEWAAR_SP,SP ; BEWAAR STACK POINTER
PUSH DS ; VERWISSEL DS EN ES
PUSH ES
POP DS
POP ES
LEA BX,PARBLOCK ; ES:BX WIJST NAAR PARAMETEBLOK
; DS:DX WIJST NAAR PROGRAMMANAAM
MOV AX,4B00H ; DOS FUNCTIE NUMMER
INT 21H ; EXEC FUNCTIE UITVOEREN
; ***************************************************************************
; STACK, DTA ADRES EN REGISTERS WEER HERSTELLEN
; ***************************************************************************
PUSH ES ; DATA SEGMENT WEER HERSTELLEN
POP DS
CLI ; INTERRUPTS EVEN UIT
MOV SS,CS:BEWAAR_SS ; HERSTEL STACK SEGMENT REGISTER
MOV SP,CS:BEWAAR_SP ; HERSTEL STACK POINTER
STI ; INTERRUPTS WEER AAN
POP DX ; DTA OFFSET ADRES
POP DS ; DTA SEGMENT ADRES
MOV AH,1AH ; DOS FUNCTIE: DTA ADRES WIJZIGEN
INT 21H
POP ES ; REGISTERS WEER VAN STACK HALEN
POP DS
POP BP
POP SI
POP DI
POP DX
POP CX
POP BX
JMP LEESCOM ; EINDE ROUTINE
terug.gif