Subversion Repositories SvarDOS

Rev

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

Rev 349 Rev 350
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
-
 
17
SIG1 dw 0x1983   ;  +0
-
 
18
SIG2 dw 0x1985   ;  +2
-
 
19
SIG3 dw 0x2017   ;  +4
-
 
20
SIG4 dw 0x2019   ;  +6
-
 
21
 
-
 
22
; environment segment - this is updated by SvarCOM at init time
16
jmp short skipsig
23
ENVSEG   dw 0    ;  +8
-
 
24
 
-
 
25
; input buffer used for the "previous command" history
-
 
26
BUF000 db 128, 0 ; +0Ah
-
 
27
BUF064 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
-
 
28
BUF128 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
17
 
29
 
18
SIG1 dw 0x1983
-
 
19
SIG2 dw 0x1985
-
 
20
SIG3 dw 0x2017
-
 
21
SIG4 dw 0x2019
-
 
22
 
-
 
23
; service routine: used by the transient part of svarcom, returns:
-
 
24
; AX = offset of input buffer history block
-
 
25
; BX = offset where environment's segment is stored (patched at install time)
-
 
26
inputroutine:
-
 
27
mov ax, BUF000
-
 
28
mov bx, ENVSEG
-
 
29
retf
-
 
30
 
30
 
31
skipsig:
31
skipsig:         ; +8Ch
32
 
32
 
33
; set up CS=DS=SS and point SP to my private stack buffer
33
; set up CS=DS=SS and point SP to my private stack buffer
34
mov ax, cs
34
mov ax, cs
35
mov ds, ax
35
mov ds, ax
36
mov es, ax
36
mov es, ax
37
mov ss, ax
37
mov ss, ax
38
mov sp, STACKPTR
38
mov sp, STACKPTR
39
 
39
 
40
; prepare the exec param block
40
; prepare the exec param block
-
 
41
mov ax, [ENVSEG]
41
;mov [EXEC_PARAM_REC], word 0
42
mov [EXEC_PARAM_REC], ax
42
mov ax, COMSPEC
43
mov ax, COMSPEC
43
mov [EXEC_PARAM_REC+2], ax
44
mov [EXEC_PARAM_REC+2], ax
44
mov [EXEC_PARAM_REC+4], ds
45
mov [EXEC_PARAM_REC+4], ds
45
 
46
 
46
; execute command.com
47
; execute command.com
47
mov ax, 0x4B00         ; DOS 2+ - load & execute program
48
mov ax, 0x4B00         ; DOS 2+ - load & execute program
48
mov dx, COMSPEC        ; DS:DX  - ASCIZ program name TODO: use real COMSPEC...
49
mov dx, COMSPEC        ; DS:DX  - ASCIZ program name TODO: use real COMSPEC...
49
mov bx, EXEC_PARAM_REC ; ES:BX  - parameter block pointer
50
mov bx, EXEC_PARAM_REC ; ES:BX  - parameter block pointer
50
int 0x21
51
int 0x21
51
 
52
 
52
; if all went well, jump back to start
53
; if all went well, jump back to start
53
jnc skipsig
54
jnc skipsig
54
 
55
 
55
; update error string so it contains the error number
56
; update error string so it contains the error number
56
add al, '0'
57
add al, '0'
57
mov [ERRLOAD + 4], al
58
mov [ERRLOAD + 4], al
58
 
59
 
59
; display error message (with trailing COMSPEC)
60
; display error message (with trailing COMSPEC)
60
mov ah, 0x09
61
mov ah, 0x09
61
mov dx, ERRLOAD
62
mov dx, ERRLOAD
62
mov [COMSPCZ], byte '$' ; patch comspec terminator to be $
63
mov [COMSPCZ], byte '$' ; patch comspec terminator to be $
63
int 0x21
64
int 0x21
64
mov [COMSPCZ], byte 0   ; restore initial (NULL) compsec terminator
65
mov [COMSPCZ], byte 0   ; restore initial (NULL) compsec terminator
65
 
66
 
66
; wait for keypress
67
; wait for keypress
67
mov ah, 0x08
68
mov ah, 0x08
68
int 0x21
69
int 0x21
69
 
70
 
70
; back to program start
71
; back to program start
71
jmp skipsig
72
jmp skipsig
72
 
73
 
73
; ExecParamRec used by INT 21h, AX=4b00 (load and execute program), 14 bytes:
74
; ExecParamRec used by INT 21h, AX=4b00 (load and execute program), 14 bytes:
74
;  offset  size  content
75
;  offset  size  content
75
;     +0     2   segment of environment for child (0 = current)
76
;     +0     2   segment of environment for child (0 = current)
76
;     +2     4   address of command line to place at PSP:0080
77
;     +2     4   address of command line to place at PSP:0080
77
;     +6     4   address of an FCB to be placed at PSP:005c
78
;     +6     4   address of an FCB to be placed at PSP:005c
78
;    +0Ah    4   address of an FCB to be placed at PSP:006c
79
;    +0Ah    4   address of an FCB to be placed at PSP:006c
79
EXEC_PARAM_REC db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
80
EXEC_PARAM_REC db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
80
 
81
 
81
ERRLOAD db "ERR x, FAILED TO LOAD COMMAND.COM FROM:", 13, 10
82
ERRLOAD db "ERR x, FAILED TO LOAD COMMAND.COM FROM:", 13, 10
82
 
83
 
83
COMSPEC db "C:\SVN\SVARDOS\SVARCOM\COMMAND.COM"
84
COMSPEC db "C:\SVN\SVARDOS\SVARCOM\COMMAND.COM"
84
COMSPCZ db 0
85
COMSPCZ db 0
85
 
86
 
86
; input buffer used for the "previous command" history
-
 
87
BUF000 db 128, 0
-
 
88
BUF064 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
-
 
89
BUF128 db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
-
 
90
 
-
 
91
; FreeDOS int 21h functions that I use require at least 32 bytes of stack,
87
; FreeDOS int 21h functions that I use require at least 32 bytes of stack,
92
; here I allocate 64 bytes to be sure
88
; here I allocate 64 bytes to be sure
93
STACKBUF db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
89
STACKBUF db "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
94
STACKPTR db "xx"
90
STACKPTR db "xx"
95
 
-
 
96
; environment segment - this is updated by SvarCOM at init time
-
 
97
ENVSEG   dw 0
-
 
98
 
91