Subversion Repositories SvarDOS

Rev

Rev 349 | Rev 353 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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"