cos2000v1/commande/commande.asm

543 lines
13 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.model tiny
.486
smart
.code
org 0h
include ..\include\fat.h
include ..\include\mem.h
include ..\include\divers.h
start:
header exe <,1,0,,,offset imports,,>
realstart:
push offset msginit
call [print]
xor bp,bp
mov dl,' '
call setdelimiter0
replay:
mov ah,6
int 47h
noret:
mov ah,6
int 47h
mov ah,16
mov di,offset dir
int 48h
push offset prompt
call [print]
mov di,offset buffer
waitchar:
mov ax,0
int 16h
call convertfr
cmp ah,59
jne norr
cmp bp,0
je waitchar
push word ptr cs: [bp-8]
call [print]
push cs
pop es
call copy0
call getlength0
add di,cx
jmp waitchar
norr:
cmp al,0dh ;entrée
je entere
cmp al,08h ;backspace
je backspace
cmp al,27 ;echap
je escape
cmp al,' '
jb waitchar
cmp di,offset buffer+256
je waitchar
mov [di],al
inc di
push ax
call [showchar]
jmp waitchar
escape:
cmp di,offset buffer
je waitchar
mov ah,24
int 47h
mov dx,offset buffer
mov cx,di
sub cx,dx
js waitchar
je waitchar
sub bh,cl
mov ah,25
int 47h
mov di,offset buffer
mov byte ptr [di],0
backspace:
cmp di,offset buffer
je waitchar
mov ah,24
int 47h
dec bh
mov ah,25
int 47h
push ' '
call [showchar]
mov ah,25
int 47h
dec di
mov byte ptr [di],0
jmp waitchar
entere:
mov byte ptr [di],0
mov si,offset buffer
cmp si,di
je noret
mov ah,6
int 47h
push cs
pop es
mov di,offset buffer2
xor cx,cx
call getitem0
mov si,di
call uppercase0
mov bx,offset commands
xor bp,bp
tre:
mov di,[bx]
add bx,8
cmp di,0
je error
push cs
pop es
call evalue0
cmp dx,bp
jb noadd
mov bp,dx
mov ax,bx
noadd:
call cmpstr0
jne tre
mov si,offset buffer
mov di,offset buffer2
call copy0
mov si,di
call uppercase0
xor cx,cx
inc cx
call getpointeritem0
cmp byte ptr [di-1],0
jne nopod
mov byte ptr [di],0
nopod:
mov si,di
mov di,[bx-4]
call checksyntax0
jc errorprec
mov bx,[bx-6]
call bx
jmp replay
error:
mov bp,ax
push cs
pop es
mov dl,'.'
call searchchar0
je noaddext
mov di,offset buffer
mov si,offset extcom
call concat0
noaddext:
mov si,offset buffer
mov ah,18
int 48h
jc reallyerror
xor bp,bp
jmp replay
reallyerror:
push offset error_syntax
call [print]
push word ptr cs: [bp-8]
call [print]
jmp replay
errorprec:
push offset derror
call [print]
jmp replay
code_exit:
pop ax
retf
code_version:
push offset version_text
call [print]
ret
version_text db 'Cos 2000 version 1.4Fr par \c04MrNop',0
code_cls:
mov ah,2
int 47h
ret
code_reboot:
push 0ffffh
push 00000h
retf
code_command:
push offset def
call [print]
mov bx,offset commands
showalls:
add bx,8
cmp word ptr [bx],0
je endoff
push word ptr [bx+4]
push word ptr [bx+6]
push word ptr [bx]
push offset commandes
call [print]
jmp showalls
endoff:
ret
def db 'Liste des commandes internes\l\l',0
commandes db '%0 \h10:\h12%0 \h70%0\l',0
code_mode:
mov cx,0
call gettypeditem0
mov ah,0
mov al,dl
and al,1111b
int 47h
mov ah,2
int 47h
ret
code_dir:
mov ah,12
int 48h
push edx
mov ah,11
mov di,offset nomdisque
int 48h
push di
push offset present
call [print]
xor bp,bp
mov di,offset bufferentry
mov ah,7
int 48h
jc nofiles
go:
push word ptr [di+entries.fileattr]
push dword ptr [di+entries.filesize]
push word ptr [di+entries.filetime]
push word ptr [di+entries.filedate]
push word ptr [di+entries.filetimecrea]
push word ptr [di+entries.filedatecrea]
push di
push offset line
call [print]
inc bp
mov ah,8
int 48h
jnc go
nofiles:
push ebp
push offset filess
call [print]
ret
nomdisque db 13 dup (0)
bufferentry db 512 dup (0)
present db '\c02Le volume insere est nomme %0, Numero de serie : %hD\l\l',0
line db '\c07%n %d %t %d %t %z %a\l',0
filess db '\l\l\c02%u Fichier(s) au total\l',0
code_cd:
mov cx,0
call gettypeditem0
push di
push offset changing
call [print]
mov si,di
mov ah,13
int 48h
jnc okchange
push offset errorchanging
call [print]
okchange:
ret
changing db 'Changement de repertoire vers %0\l',0
errorchanging db '\c04Impossible d''atteindre ce dossier',0
code_kill:
mov cx,0
call gettypeditem0
push di
push offset killing
call [print]
mov si,di
mov ah,5
int 49h
jc nochanged
mov ah,1
int 49h
jnc okchanged
nochanged:
push offset errorkilling
call [print]
okchanged:
ret
killing db 'Fermeture du processus %0\l',0
errorkilling db '\c04Impossible de fermer ce processus',0
code_refresh:
mov ah,3
int 48h
jnc okrefresh
push offset errorrefreshing
call [print]
ret
okrefresh:
mov ah,12
int 48h
push edx
mov ah,11
mov di,offset nomdisque
int 48h
push di
push offset present
call [print]
ret
errorrefreshing db '\c04Impossible de lire le support',0
extcom db '.CE',0
code_mem:
push offset msg
call [print]
xor ebx,ebx
xor cx,cx
listmcb:
mov ah,4
int 49h
jc fino
inc cx
;placement mémoire
mov dx,gs
inc dx
inc dx
push edx
;parent
cmp gs: [mb.reference],0
jne next
push cs
push offset none
add bx,gs:[mb.sizes]
jmp suitemn
next:
mov dx,gs: [mb.reference]
dec dx
dec dx
push dx
push offset mb.names
suitemn:
;Resident
cmp gs: [mb.isresident],true
jne notresident
push offset resident
jmp suitelistmcb
notresident:
push offset nonresident
suitelistmcb:
;taille memoire
xor edx,edx
mov dx,gs: [mb.sizes]
shl edx,4
push 6
push edx
;nom
push gs
push offset mb.names
push offset line2
call [print]
jmp listmcb
fino:
shl ebx,4
push ebx
push offset fin
call [print]
ret
resident db "oui",0
nonresident db "non",0
line2 db "%0P\h15%w\h24%0\h30%0P\h46%hW\l",0
fin db "\l\l\c02%u octets de memoire disponible\l",0
msg db "Plan de la memoire\l\lNom Taille Res Parent Mem\l",0
none db ".",0
;converti le jeux scancode/ascii en fr ax->ax
convertfr:
push dx si
mov si,offset fr
searchtouch:
mov dx,cs: [si]
cmp dx,0
je endofconv
add si,4
cmp dx,ax
jne searchtouch
mov ax,cs: [si-2]
endofconv:
pop dx si
ret
fr: db '1', 02, '&', 02
db '!', 02, '1', 02
db '2', 03, '', 03
db '@', 03, '2', 03
db '3', 04, '"', 04
db '#', 04, '3', 04
db '4', 05, 39, 05
db '$', 05, '4', 05
db '5', 06, '(', 06
db '%', 06, '5', 06
db '6', 07, '-', 07
db '^', 07, '6', 07
db '7', 08, 'Š', 08
db '&', 08, '7', 08
db '8', 09, '_', 09
db '*', 09, '8', 09
db '9', 10, '‡', 10
db '(', 10, '9', 10
db '0', 11, '…', 11
db ')', 11, '0', 11
db '-', 12, ')', 12
db '_', 12, 'ø', 12
db 'Q', 16, 'A', 16
db 'q', 16, 'a', 16
db 'W', 17, 'Z', 17
db 'w', 17, 'z', 17
db '{', 26, '‰', 26
db '[', 26, 'ˆ', 26
db ']', 27, '$', 27
db '}', 27, 'œ', 27
db 'A', 30, 'Q', 30
db 'a', 30, 'q', 30
db ':', 39, 'M', 39
db ';', 39, 'm', 39
db 39, 40, '—', 40
db '"', 40, '%', 40
db 00, 40, '%', 40
db '\', 43, '*', 43
db '|', 43, 'æ', 43
db 'Z', 44, 'W', 44
db 'z', 44, 'w', 44
db 'm', 50, ',', 50
db 'M', 50, '?', 50
db ',', 51, ';', 51
db '<', 51, '.', 51
db '.', 52, ':', 52
db '>', 52, '/', 52
db '?', 53, 'õ', 53
db '/', 53, '!', 53
db '\', 86, '<', 86
db '|', 86, '>', 86
db 00, 79h, '~', 03
db 00, 7ah, '#', 04
db 00, 7bh, '{', 05
db 00, 7ch, '[', 06
db 00, 7dh, '|', 07
db 00, 7eh, '`', 08
db 00, 7fh, '\', 09
db 00, 80h, '^', 10
db 00, 81h, '@', 11
db 00, 82h, ']', 12
db 00, 83h, '}', 13
db 00, 00, 00, 00
commands dw str_exit ,code_exit ,syn_exit ,help_exit
dw str_version,code_version,syn_version,help_version
dw str_cls ,code_cls ,syn_cls ,help_cls
dw str_reboot ,code_reboot ,syn_reboot ,help_reboot
dw str_command,code_command,syn_command,help_command
dw str_mode ,code_mode ,syn_mode ,help_mode
dw str_dir ,code_dir ,syn_dir ,help_dir
dw str_refresh ,code_refresh ,syn_refresh ,help_refresh
dw str_cd ,code_cd ,syn_cd ,help_cd
dw str_mem ,code_mem ,syn_mem ,help_mem
dw str_kill ,code_kill ,syn_kill ,help_kill
dw 0
str_exit db 'QUIT',0
str_version db 'VERS',0
str_cls db 'CLEAR',0
str_reboot db 'REBOOT',0
str_command db 'CMDS',0
str_mode db 'MODE',0
str_dir db 'DIR',0
str_refresh db 'DISK',0
str_cd db 'CD',0
str_mem db 'MEM',0
str_kill db 'KILL',0
syn_exit db 0
syn_version db 0
syn_cls db 0
syn_reboot db 0
syn_command db 0
syn_mode db 'FFH',0
syn_dir db 0
syn_refresh db 0
syn_cd db '@',0
syn_mem db 0
syn_kill db '@',0
help_exit db 'Permet de quitter l''interpreteur',0
help_version db 'Affiche la version de COS',0
help_cls db 'Efface l''ecran',0
help_reboot db 'Redemarre l''ordinateur',0
help_command db 'Affiche le detail des commandes',0
help_mode db 'Modifie le mode video en cours',0
help_dir db 'Affiche le contenu du repertoire courant',0
help_refresh db 'Lit le support disquette insere',0
help_cd db 'Change le repertoire courant',0
help_mem db 'Affiche le plan de la memoire',0
help_kill db 'Termine le processus cible',0
derror db '\c04Erreur de Syntaxe !',0
error_syntax db '\c04La commande ou l''executable n''existe pas ! F1 pour ',0
prompt db '\c07>',0
msginit db '\m02\e\c07\l\lInterpreteur de commande COS V1.9\lSous license \c05GPL\c07 - Ecrit par \c04MrNop\l\c07Utilisez la commande CMDS pour connaitres les commandes disponibles\l',0
include str0.asm
dir db 32 dup (0)
buffer db 128 dup (0)
buffer2 db 128 dup (0)
imports:
db "VIDEO.LIB::print",0
print dd 0
db "VIDEO.LIB::showhex",0
showhex dd 0
db "VIDEO.LIB::showchar",0
showchar dd 0
dw 0
end start