/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: |