227 lines
3.2 KiB
NASM
227 lines
3.2 KiB
NASM
fcb1 equ 0x5C
|
|
fcb2 equ 0x6C
|
|
buf equ 0x80
|
|
|
|
; length of input buffer
|
|
inlen equ 0x90
|
|
|
|
org 0x100
|
|
|
|
jmp prompt
|
|
|
|
banner db "RDOS Console Command Processor",0x0A,0x0D,0x1A
|
|
|
|
%include "print.inc"
|
|
%include "scan.inc"
|
|
|
|
; eat leftover spaces
|
|
; IN ds:si ptr
|
|
eatws jmp .l01
|
|
.l02 inc si
|
|
.l01 cmp byte [si], 0x20
|
|
je .l02
|
|
ret
|
|
|
|
prompt mov ax, cs
|
|
mov ds, ax
|
|
mov es, ax
|
|
; print newline
|
|
mov dl, 0x0A
|
|
mov ah, 2
|
|
int 0x21
|
|
mov dl, 0x0D
|
|
int 0x21
|
|
; query current drive
|
|
mov ah, 25
|
|
int 0x21
|
|
; drivenum to chr
|
|
mov dl, al
|
|
add dl, 0x41
|
|
; print drive and prompt chr
|
|
mov ah, 2
|
|
int 0x21
|
|
mov dl, '>'
|
|
int 0x21
|
|
; read string
|
|
mov byte [inbuf], inlen
|
|
mov dx, inbuf
|
|
mov ah, 10
|
|
int 0x21
|
|
cmp byte [inbuf+1], 0
|
|
je prompt
|
|
mov dl, 0x0A
|
|
mov ah, 2
|
|
int 0x21
|
|
mov dl, 0x0D
|
|
int 0x21
|
|
|
|
; parse inbuf into comfcb, buf, fcb1 and fcb2
|
|
; takes no arguments
|
|
; parse off command name
|
|
parse mov si, inbuf+2
|
|
mov di, comfcb
|
|
call lodfn
|
|
; trim spaces
|
|
call eatws
|
|
; calculate length of cmdline
|
|
mov cx, inbuf+2
|
|
add cl, [inbuf+1]
|
|
adc ch, 0
|
|
sub cx, si
|
|
; move into default position at 0x80
|
|
mov [buf], cl
|
|
mov di, buf+1
|
|
rep movsb
|
|
mov al, 0x0D
|
|
stosb
|
|
; parse fcb1
|
|
mov si, buf+1
|
|
mov di, fcb1
|
|
call lodfn
|
|
; fill space between with zeroes
|
|
add di, 12
|
|
mov cx, fcb2-fcb1-12
|
|
mov al, 0
|
|
rep stosb
|
|
; parse fcb2
|
|
call eatws
|
|
mov di, fcb2
|
|
call lodfn
|
|
; fill space between with zeroes
|
|
add di, 12
|
|
mov cx, buf-fcb2-12
|
|
mov al, 0
|
|
rep stosb
|
|
; dump out everything parsed for me to see
|
|
;mov si, comfcb
|
|
;call dump
|
|
;mov si, fcb1
|
|
;call dump
|
|
;mov si, fcb2
|
|
;call dump
|
|
;mov si, buf
|
|
;call dump
|
|
call exec
|
|
jmp prompt
|
|
|
|
; execute, prog in comfcb, args in buf
|
|
exec mov bx, ctab
|
|
jmp .l02
|
|
.l01 add bx, 10
|
|
cmp byte [bx], 0
|
|
je .ret
|
|
.l02 mov si, comfcb+1
|
|
mov di, bx
|
|
mov cx, 4
|
|
repe cmpsw
|
|
jne .l01
|
|
jmp [bx+8]
|
|
.ret mov dx, enoent
|
|
mov ah, 9
|
|
int 0x21
|
|
ret
|
|
|
|
enoent db "no command", 0x0A, 0x0D, "$"
|
|
|
|
ctab db "DIR "
|
|
dw c_dir
|
|
db "TYPE "
|
|
dw c_type
|
|
db 0
|
|
|
|
c_dir mov di, fcb1+1
|
|
cmp byte [di], 0x20
|
|
jne .l01
|
|
mov ax, '??'
|
|
mov cx, 4
|
|
rep stosw
|
|
.l01 mov di, fcb1+9
|
|
cmp byte [di], 0x20
|
|
jne .l02
|
|
mov al, '?'
|
|
mov cx, 3
|
|
rep stosb
|
|
.l02 mov dx, buf
|
|
mov ah, 0x1A
|
|
int 0x21
|
|
mov ah, 0x11 ; find first
|
|
.loop mov dx, fcb1
|
|
int 0x21
|
|
test al, al
|
|
jnz .ret
|
|
mov dl, [buf]
|
|
add dl, 0x40
|
|
mov ah, 2
|
|
int 0x21
|
|
mov dl, ':'
|
|
int 0x21
|
|
mov cx, 8
|
|
mov si, buf+1
|
|
.l03 lodsb
|
|
mov dl, al
|
|
int 0x21
|
|
loop .l03
|
|
mov dl, ' '
|
|
int 0x21
|
|
mov cx, 3
|
|
mov si, buf+9
|
|
.l04 lodsb
|
|
mov dl, al
|
|
int 0x21
|
|
loop .l04
|
|
mov dl, 0x0A
|
|
int 0x21
|
|
mov dl, 0x0D
|
|
int 0x21
|
|
mov ah, 0x12 ; find next
|
|
jmp .loop
|
|
.ret ret
|
|
|
|
; set dta
|
|
c_type mov dx, buf
|
|
mov ah, 0x1A
|
|
int 0x21
|
|
; open file
|
|
mov dx, fcb1
|
|
mov ah, 0x0f ; fcb open
|
|
int 0x21
|
|
; fail
|
|
test al, al
|
|
jnz .err
|
|
; place eof marker to read in err case
|
|
.loop mov byte [buf], 0x1A
|
|
; read a record
|
|
mov dx, fcb1
|
|
mov ah, 0x14 ; fcb seq read
|
|
int 0x21
|
|
; set up string read
|
|
mov si, buf
|
|
mov cx, 0x80
|
|
.l02 lodsb
|
|
; break on eof or error
|
|
cmp al, 0x1A
|
|
je .ret
|
|
; never write null bytes
|
|
mov dl, al
|
|
mov ah, 2
|
|
int 0x21
|
|
loop .l02
|
|
jmp .loop
|
|
.ret mov dx, fcb1
|
|
mov ah, 0x10
|
|
int 0x21
|
|
ret
|
|
; communicate failure to user
|
|
.err mov dx, .errmsg
|
|
mov ah, 9
|
|
int 0x21
|
|
ret
|
|
.errmsg db "no file", 0x0A,0x0D,"$"
|
|
|
|
section .bss
|
|
|
|
inbuf resb inlen
|
|
|
|
; FCB for the COM file
|
|
comfcb resb 37
|