;*************************************************************************** ; 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