Subversion Repositories SvarDOS

Rev

Rev 442 | Rev 450 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 442 Rev 448
1
;
1
;
2
; rmod - resident module of the SvarCOM command interpreter
2
; rmod - resident module of the SvarCOM command interpreter
3
;
3
;
4
; Copyright (C) 2021 Mateusz Viste
4
; Copyright (C) 2021 Mateusz Viste
5
; MIT license
5
; MIT license
6
;
6
;
7
; this is installed in memory by the transient part of SvarCOM. it has only
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
8
; two jobs: providing a resident buffer for command history, environment, etc
9
; and respawning COMMAND.COM whenever necessary.
9
; and respawning COMMAND.COM whenever necessary.
10
 
10
 
11
CPU 8086
11
CPU 8086
12
org 0h           ; this is meant to be executed without a PSP
12
org 0h           ; this is meant to be executed without a PSP
13
 
13
 
14
section .text    ; all goes into code segment
14
section .text    ; all goes into code segment
15
 
15
 
16
                 ; offset
16
                 ; offset
17
SIG1 dw 0x1983   ;  +0
17
SIG1 dw 0x1983   ;  +0
18
SIG2 dw 0x1985   ;  +2
18
SIG2 dw 0x1985   ;  +2
19
SIG3 dw 0x2017   ;  +4
19
SIG3 dw 0x2017   ;  +4
20
SIG4 dw 0x2019   ;  +6
20
SIG4 dw 0x2019   ;  +6
21
 
21
 
22
; environment segment - this is updated by SvarCOM at init time
22
; environment segment - this is updated by SvarCOM at init time
23
ENVSEG   dw 0    ;  +8
23
ENVSEG   dw 0    ;  +8
24
 
24
 
25
; exit code of last application
25
; exit code of last application
26
LEXCODE  dw 0    ; +0Ah
26
LEXCODE  dw 0    ; +0Ah
27
 
27
 
28
; input buffer used for the "previous command" history
28
; input buffer used for the "previous command" history
29
BUF000 db 128, 0 ; +0Ch
29
BUF000 db 128, 0 ; +0Ch
30
BUF064 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
30
BUF064 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
31
BUF128 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
31
BUF128 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
32
 
32
 
33
; offset of the COMSPEC variable in the environment block, 0 means "use
33
; offset of the COMSPEC variable in the environment block, 0 means "use
34
; boot drive". this value is patched by the transient part of COMMAND.COM
34
; boot drive". this value is patched by the transient part of COMMAND.COM
35
COMSPECPTR dw 0  ; +8Eh
35
COMSPECPTR dw 0  ; +8Eh
36
 
36
 
37
; fallback COMSPEC string used if no COMPSEC is present in the environment
37
; fallback COMSPEC string used if no COMPSEC is present in the environment
38
; drive. drive is patched by the transient part of COMMAND.COM
38
; drive. drive is patched by the transient part of COMMAND.COM
39
COMSPECBOOT db "@:\COMMAND.COM", 0 ; +90h
39
COMSPECBOOT db "@:\COMMAND.COM", 0 ; +90h
40
 
40
 
41
; ECHO status used by COMMAND.COM. 0 = ECHO OFF, 1 = ECHO ON
41
; ECHO status used by COMMAND.COM. 0 = ECHO OFF, 1 = ECHO ON
42
CMDECHO db 1     ; +9Fh
42
CMDECHO db 1     ; +9Fh
43
 
43
 
44
; segment of the first batch in batch chain. this is used by transient
44
; segment of the first batch in batch chain. this is used by transient
45
; COMMAND.COM to chain multiple batch files (through CALL). 0 means "none".
45
; COMMAND.COM to chain multiple batch files (through CALL). 0 means "none".
46
BATCHCHAIN dw 0  ; +A0h
46
BATCHCHAIN dw 0  ; +A0h
47
 
47
 
-
 
48
; original parent (segment of)
-
 
49
ORIGPARENT dd 0  ; +A2h
-
 
50
 
48
skipsig:         ; +A2h
51
skipsig:         ; +A6h
49
 
52
 
50
; set up CS=DS=SS and point SP to my private stack buffer
53
; set up CS=DS=SS and point SP to my private stack buffer
51
mov ax, cs
54
mov ax, cs
52
mov ds, ax
55
mov ds, ax
53
mov es, ax
56
mov es, ax
54
mov ss, ax
57
mov ss, ax
55
mov sp, STACKPTR
58
mov sp, STACKPTR
56
 
59
 
57
; collect the exit code of previous application
60
; collect the exit code of previous application
58
mov ah, 0x4D
61
mov ah, 0x4D
59
int 0x21
62
int 0x21
60
xor ah, ah          ; clear out termination status, I only want the exit code
63
xor ah, ah          ; clear out termination status, I only want the exit code
61
mov [LEXCODE], ax
64
mov [LEXCODE], ax
62
 
65
 
63
; preset the default COMSPEC pointer to ES:DX (ES is already set to DS)
66
; preset the default COMSPEC pointer to ES:DX (ES is already set to DS)
64
mov dx, COMSPECBOOT
67
mov dx, COMSPECBOOT
65
 
68
 
66
; do I have a valid COMSPEC?
69
; do I have a valid COMSPEC?
67
or [COMSPECPTR], word 0
70
or [COMSPECPTR], word 0
68
jz USEDEFAULTCOMSPEC
71
jz USEDEFAULTCOMSPEC
69
; set ES:DX to actual COMSPEC
72
; set ES:DX to actual COMSPEC
70
mov es, [ENVSEG]
73
mov es, [ENVSEG]
71
mov dx, [COMSPECPTR]
74
mov dx, [COMSPECPTR]
72
USEDEFAULTCOMSPEC:
75
USEDEFAULTCOMSPEC:
73
 
76
 
74
; prepare the exec param block
77
; prepare the exec param block
75
mov ax, [ENVSEG]
78
mov ax, [ENVSEG]
76
mov [EXEC_PARAM_REC], ax
79
mov [EXEC_PARAM_REC], ax
77
mov ax, CMDTAIL
80
mov ax, CMDTAIL
78
mov [EXEC_PARAM_REC+2], ax
81
mov [EXEC_PARAM_REC+2], ax
79
mov [EXEC_PARAM_REC+4], cs
82
mov [EXEC_PARAM_REC+4], cs
80
 
83
 
81
; execute command.com
84
; execute command.com
82
mov ax, 0x4B00         ; DOS 2+ - load & execute program
85
mov ax, 0x4B00         ; DOS 2+ - load & execute program
83
push es                ;
86
push es                ;
84
pop ds                 ;
87
pop ds                 ;
85
;mov dx, COMSPEC       ; DS:DX  - ASCIZ program name (preset already)
88
;mov dx, COMSPEC       ; DS:DX  - ASCIZ program name (preset already)
86
push cs
89
push cs
87
pop es
90
pop es
88
mov bx, EXEC_PARAM_REC ; ES:BX  - parameter block pointer
91
mov bx, EXEC_PARAM_REC ; ES:BX  - parameter block pointer
89
int 0x21
92
int 0x21
90
 
93
 
91
; if all went well, jump back to start
94
; if all went well, jump back to start
92
jnc skipsig
95
jnc skipsig
93
 
96
 
94
; restore DS=CS
97
; restore DS=CS
95
mov bx, cs
98
mov bx, cs
96
mov ds, bx
99
mov ds, bx
97
 
100
 
98
; update error string so it contains the error number
101
; update error string so it contains the error number
99
add al, '0'
102
add al, '0'
100
mov [ERRLOAD + 4], al
103
mov [ERRLOAD + 4], al
101
 
104
 
102
; display error message
105
; display error message
103
mov ah, 0x09
106
mov ah, 0x09
104
mov dx, ERRLOAD
107
mov dx, ERRLOAD
105
int 0x21
108
int 0x21
106
 
109
 
107
; wait for keypress
110
; wait for keypress
108
mov ah, 0x08
111
mov ah, 0x08
109
int 0x21
112
int 0x21
110
 
113
 
111
; back to program start
114
; back to program start
112
jmp skipsig
115
jmp skipsig
113
 
116
 
114
; command.com tail arguments, in PSP format (length byte followed by arg)
117
; command.com tail arguments, in PSP format (length byte followed by arg)
115
CMDTAIL db 0
118
CMDTAIL db 0
116
 
119
 
117
; ExecParamRec used by INT 21h, AX=4b00 (load and execute program), 14 bytes:
120
; ExecParamRec used by INT 21h, AX=4b00 (load and execute program), 14 bytes:
118
;  offset  size  content
121
;  offset  size  content
119
;     +0     2   segment of environment for child (0 = current)
122
;     +0     2   segment of environment for child (0 = current)
120
;     +2     4   address of command line to place at PSP:0080
123
;     +2     4   address of command line to place at PSP:0080
121
;     +6     4   address of an FCB to be placed at PSP:005c
124
;     +6     4   address of an FCB to be placed at PSP:005c
122
;    +0Ah    4   address of an FCB to be placed at PSP:006c
125
;    +0Ah    4   address of an FCB to be placed at PSP:006c
123
EXEC_PARAM_REC db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
126
EXEC_PARAM_REC db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
124
 
127
 
125
ERRLOAD db "ERR x, FAILED TO LOAD COMMAND.COM", 13, 10, '$'
128
ERRLOAD db "ERR x, FAILED TO LOAD COMMAND.COM", 13, 10, '$'
126
 
129
 
127
; DOS int 21h functions that I use require at least 32 bytes of stack, here I
130
; DOS int 21h functions that I use require at least 32 bytes of stack, here I
128
; allocate 64 bytes to be sure
131
; allocate 64 bytes to be sure
129
STACKBUF db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
132
STACKBUF db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
130
STACKPTR db "xx"
133
STACKPTR db "xx"
131
 
134