543 lines
13 KiB
NASM
543 lines
13 KiB
NASM
.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
|