349 |
mateuszvis |
1 |
;
|
|
|
2 |
; rmod - resident module of the SvarCOM command interpreter
|
|
|
3 |
;
|
|
|
4 |
; Copyright (C) 2021 Mateusz Viste
|
|
|
5 |
; MIT license
|
|
|
6 |
;
|
|
|
7 |
; this is installed in memory by the transient part of SvarCOM. it has only
|
|
|
8 |
; two jobs: providing a resident buffer for command history, environment, etc
|
|
|
9 |
; and respawning COMMAND.COM whenever necessary.
|
|
|
10 |
|
|
|
11 |
CPU 8086
|
|
|
12 |
org 0h ; this is meant to be executed without a PSP
|
|
|
13 |
|
|
|
14 |
section .text ; all goes into code segment
|
|
|
15 |
|
350 |
mateuszvis |
16 |
; offset
|
|
|
17 |
SIG1 dw 0x1983 ; +0
|
|
|
18 |
SIG2 dw 0x1985 ; +2
|
|
|
19 |
SIG3 dw 0x2017 ; +4
|
|
|
20 |
SIG4 dw 0x2019 ; +6
|
349 |
mateuszvis |
21 |
|
350 |
mateuszvis |
22 |
; environment segment - this is updated by SvarCOM at init time
|
|
|
23 |
ENVSEG dw 0 ; +8
|
349 |
mateuszvis |
24 |
|
350 |
mateuszvis |
25 |
; input buffer used for the "previous command" history
|
|
|
26 |
BUF000 db 128, 0 ; +0Ah
|
|
|
27 |
BUF064 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
|
|
|
28 |
BUF128 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
|
349 |
mateuszvis |
29 |
|
|
|
30 |
|
350 |
mateuszvis |
31 |
skipsig: ; +8Ch
|
|
|
32 |
|
349 |
mateuszvis |
33 |
; set up CS=DS=SS and point SP to my private stack buffer
|
|
|
34 |
mov ax, cs
|
|
|
35 |
mov ds, ax
|
|
|
36 |
mov es, ax
|
|
|
37 |
mov ss, ax
|
|
|
38 |
mov sp, STACKPTR
|
|
|
39 |
|
|
|
40 |
; prepare the exec param block
|
350 |
mateuszvis |
41 |
mov ax, [ENVSEG]
|
|
|
42 |
mov [EXEC_PARAM_REC], ax
|
349 |
mateuszvis |
43 |
mov ax, COMSPEC
|
|
|
44 |
mov [EXEC_PARAM_REC+2], ax
|
|
|
45 |
mov [EXEC_PARAM_REC+4], ds
|
|
|
46 |
|
|
|
47 |
; execute command.com
|
|
|
48 |
mov ax, 0x4B00 ; DOS 2+ - load & execute program
|
|
|
49 |
mov dx, COMSPEC ; DS:DX - ASCIZ program name TODO: use real COMSPEC...
|
|
|
50 |
mov bx, EXEC_PARAM_REC ; ES:BX - parameter block pointer
|
|
|
51 |
int 0x21
|
|
|
52 |
|
|
|
53 |
; if all went well, jump back to start
|
|
|
54 |
jnc skipsig
|
|
|
55 |
|
|
|
56 |
; update error string so it contains the error number
|
|
|
57 |
add al, '0'
|
|
|
58 |
mov [ERRLOAD + 4], al
|
|
|
59 |
|
|
|
60 |
; display error message (with trailing COMSPEC)
|
|
|
61 |
mov ah, 0x09
|
|
|
62 |
mov dx, ERRLOAD
|
|
|
63 |
mov [COMSPCZ], byte '$' ; patch comspec terminator to be $
|
|
|
64 |
int 0x21
|
|
|
65 |
mov [COMSPCZ], byte 0 ; restore initial (NULL) compsec terminator
|
|
|
66 |
|
|
|
67 |
; wait for keypress
|
|
|
68 |
mov ah, 0x08
|
|
|
69 |
int 0x21
|
|
|
70 |
|
|
|
71 |
; back to program start
|
|
|
72 |
jmp skipsig
|
|
|
73 |
|
|
|
74 |
; ExecParamRec used by INT 21h, AX=4b00 (load and execute program), 14 bytes:
|
|
|
75 |
; offset size content
|
|
|
76 |
; +0 2 segment of environment for child (0 = current)
|
|
|
77 |
; +2 4 address of command line to place at PSP:0080
|
|
|
78 |
; +6 4 address of an FCB to be placed at PSP:005c
|
|
|
79 |
; +0Ah 4 address of an FCB to be placed at PSP:006c
|
|
|
80 |
EXEC_PARAM_REC db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
|
81 |
|
|
|
82 |
ERRLOAD db "ERR x, FAILED TO LOAD COMMAND.COM FROM:", 13, 10
|
|
|
83 |
|
|
|
84 |
COMSPEC db "C:\SVN\SVARDOS\SVARCOM\COMMAND.COM"
|
|
|
85 |
COMSPCZ db 0
|
|
|
86 |
|
|
|
87 |
; FreeDOS int 21h functions that I use require at least 32 bytes of stack,
|
|
|
88 |
; here I allocate 64 bytes to be sure
|
|
|
89 |
STACKBUF db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
|
|
|
90 |
STACKPTR db "xx"
|