Subversion Repositories SvarDOS

Compare Revisions

Ignore whitespace Rev 365 → Rev 366

/svarcom/rmod.asm
30,9 → 30,16
BUF064 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
BUF128 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
 
; offset of the COMSPEC variable in the environment block, 0 means "use
; boot drive". this value is patched by the transient part of COMMAND.COM
COMSPECPTR dw 0 ; +8Eh
 
skipsig: ; +8Eh
; fallback COMSPEC string used if no COMPSEC is present in the environment
; drive. drive is patched by the transient part of COMMAND.COM
COMSPECBOOT db "@:\COMMAND.COM", 0 ; +90h
 
skipsig: ; +9Fh
 
; set up CS=DS=SS and point SP to my private stack buffer
mov ax, cs
mov ds, ax
46,16 → 53,30
xor ah, ah ; clear out termination status, I only want the exit code
mov [LEXCODE], ax
 
; preset the default COMSPEC pointer to ES:DX (ES is already set to DS)
mov dx, COMSPECBOOT
 
; do I have a valid COMSPEC?
or [COMSPECPTR], word 0
jz USEDEFAULTCOMSPEC
; set ES:DX to actual COMSPEC
mov es, [ENVSEG]
mov dx, [COMSPECPTR]
USEDEFAULTCOMSPEC:
 
; prepare the exec param block
mov ax, [ENVSEG]
mov [EXEC_PARAM_REC], ax
mov ax, COMSPEC
mov [EXEC_PARAM_REC+2], ax
mov [EXEC_PARAM_REC+4], ds
mov [EXEC_PARAM_REC+2], dx
mov [EXEC_PARAM_REC+4], es
 
; execute command.com
mov ax, 0x4B00 ; DOS 2+ - load & execute program
mov dx, COMSPEC ; DS:DX - ASCIZ program name TODO: use real COMSPEC...
push es ;
pop ds ;
;mov dx, COMSPEC ; DS:DX - ASCIZ program name (preset already)
push cs
pop es
mov bx, EXEC_PARAM_REC ; ES:BX - parameter block pointer
int 0x21
 
62,16 → 83,18
; if all went well, jump back to start
jnc skipsig
 
; restore DS=CS
mov bx, cs
mov ds, bx
 
; update error string so it contains the error number
add al, '0'
mov [ERRLOAD + 4], al
 
; display error message (with trailing COMSPEC)
; display error message
mov ah, 0x09
mov dx, ERRLOAD
mov [COMSPCZ], byte '$' ; patch comspec terminator to be $
int 0x21
mov [COMSPCZ], byte 0 ; restore initial (NULL) compsec terminator
 
; wait for keypress
mov ah, 0x08
88,12 → 111,9
; +0Ah 4 address of an FCB to be placed at PSP:006c
EXEC_PARAM_REC db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
ERRLOAD db "ERR x, FAILED TO LOAD COMMAND.COM FROM:", 13, 10
ERRLOAD db "ERR x, FAILED TO LOAD COMMAND.COM", 13, 10, '$'
 
COMSPEC db "C:\SVN\SVARDOS\SVARCOM\COMMAND.COM"
COMSPCZ db 0
 
; FreeDOS int 21h functions that I use require at least 32 bytes of stack,
; here I allocate 64 bytes to be sure
; DOS int 21h functions that I use require at least 32 bytes of stack, here I
; allocate 64 bytes to be sure
STACKBUF db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
STACKPTR db "xx"