Subversion Repositories SvarDOS

Compare Revisions

Ignore whitespace Rev 458 → Rev 459

/svarcom/trunk/rmod.asm
9,8 → 9,10
; and respawning COMMAND.COM whenever necessary.
 
CPU 8086
org 0h ; this is meant to be executed without a PSP
org 0x100
 
PSP_ENVSEG equ 0x2C
 
section .text ; all goes into code segment
 
; offset
54,13 → 56,13
; do I have a valid COMSPEC?
or [COMSPECPTR], word 0
jz USEDEFAULTCOMSPEC
; set ES:DX to actual COMSPEC
mov es, [ENVSEG]
; set ES:DX to actual COMSPEC (in env segment)
mov es, [PSP_ENVSEG]
mov dx, [COMSPECPTR]
USEDEFAULTCOMSPEC:
 
; prepare the exec param block
mov ax, [ENVSEG]
mov ax, [PSP_ENVSEG]
mov [EXEC_PARAM_REC], ax
mov ax, CMDTAIL
mov [EXEC_PARAM_REC+2], ax
/svarcom/trunk/rmod.h
1,11 → 1,11
const char rmod[] = {
131, 25,133, 25, 23, 32, 25, 32, 0, 0, 0, 0, 0, 0, 64, 58,
92, 67, 79, 77, 77, 65, 78, 68, 46, 67, 79, 77, 0,140,200,142,
216,142,192,142,208,188,234, 0,180, 77,205, 33, 48,228,163, 10,
0,186, 14, 0,131, 14, 12, 0, 0,116, 8,142, 6, 8, 0,139,
22, 12, 0,161, 8, 0,163,120, 0,184,119, 0,163,122, 0,140,
14,124, 0,184, 0, 75, 6, 31, 14, 7,187,120, 0,205, 33,115,
188,140,203,142,219, 4, 48,162,138, 0,180, 9,186,134, 0,205,
216,142,192,142,208,188,234, 1,180, 77,205, 33, 48,228,163, 10,
1,186, 14, 1,131, 14, 12, 1, 0,116, 8,142, 6, 44, 0,139,
22, 12, 1,161, 44, 0,163,120, 1,184,119, 1,163,122, 1,140,
14,124, 1,184, 0, 75, 6, 31, 14, 7,187,120, 1,205, 33,115,
188,140,203,142,219, 4, 48,162,138, 1,180, 9,186,134, 1,205,
33,180, 8,205, 33,235,166, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 69, 82, 82, 32,120, 44, 32, 70, 65, 73,
76, 69, 68, 32, 84, 79, 32, 76, 79, 65, 68, 32, 67, 79, 77, 77,
/svarcom/trunk/rmodinit.c
37,7 → 37,7
struct rmod_props far *rmod_install(unsigned short envsize) {
char far *myptr, far *mcb;
unsigned short far *owner;
const unsigned short sizeof_rmodandprops_paras = rmod_len + sizeof(struct rmod_props) + 15 / 16;
const unsigned short sizeof_rmodandprops_paras = (0x100 + rmod_len + sizeof(struct rmod_props) + 15) / 16;
unsigned short rmodseg = 0xffff;
unsigned short envseg, origenvseg;
struct rmod_props far *res = NULL;
106,8 → 106,14
return(NULL);
}
 
/* copy rmod to its destination */
/* copy rmod to its destination, prefixed with a copy of my own PSP */
myptr = MK_FP(rmodseg, 0);
{
unsigned short i;
char *mypsp = (void *)0;
for (i = 0; i < 0x100; i++) myptr[i] = mypsp[i];
}
myptr = MK_FP(rmodseg, 0x100);
_fmemcpy(myptr, rmod, rmod_len);
 
/* mark rmod memory as "self owned" */
130,7 → 136,7
}
 
/* prepare result (rmod props) */
res = MK_FP(rmodseg, rmod_len);
res = MK_FP(rmodseg, 0x100 + rmod_len);
_fmemset(res, 0, sizeof(*res)); /* zero out */
res->rmodseg = rmodseg; /* rmod segment */
res->inputbuf[0] = 128; /* input buffer for INT 0x21, AH=0Ah*/
137,7 → 143,7
res->echoflag = 1; /* ECHO ON */
res->origenvseg = origenvseg; /* original environment segment */
 
/* write env segment to rmod buffer */
/* write env segment to rmod's PSP */
owner = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG);
*owner = envseg;
 
185,10 → 191,10
const unsigned short sig[] = {0x1983, 0x1985, 0x2017, 0x2019};
unsigned char i;
/* is it rmod? */
ptr = MK_FP(*parent, 0);
ptr = MK_FP(*parent, 0x100);
for (i = 0; i < 4; i++) if (ptr[i] != sig[i]) return(NULL);
/* match successfull (rmod is my parent) */
return(MK_FP(*parent, rmod_len));
return(MK_FP(*parent, 0x100 + rmod_len));
}
 
 
/svarcom/trunk/rmodinit.h
37,11 → 37,11
unsigned char echoflag; /* ECHO ON / ECHO OFF */
};
 
#define RMOD_OFFSET_ENVSEG 0x08
#define RMOD_OFFSET_LEXITCODE 0x0A
#define RMOD_OFFSET_COMSPECPTR 0x0C
#define RMOD_OFFSET_BOOTDRIVE 0x0E
#define RMOD_OFFSET_ROUTINE 0x1D
#define RMOD_OFFSET_ENVSEG 0x2C /* stored in rmod's PSP */
#define RMOD_OFFSET_LEXITCODE 0x10A
#define RMOD_OFFSET_COMSPECPTR 0x10C
#define RMOD_OFFSET_BOOTDRIVE 0x10E
#define RMOD_OFFSET_ROUTINE 0x11D
 
struct rmod_props far *rmod_install(unsigned short envsize);
struct rmod_props far *rmod_find(void);
/svarcom/trunk/todo.txt
13,6 → 13,10
pipes redirections
basic BAT support (without workflow controls, FOR loops etc)
 
rmod: should have a proper PSP (copied from transient COMMAND.COM), then
call setPSP to let DOS know the new process ID.
instead of calling "terminate", rmod should free COMMAND.COM's PSP and
its environment block. No need to fiddle with int22 handlers then.
 
AT SOME LATER TIME: