mirror of https://git.ia64.cc/perso/cos2000v1.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1255 lines
34 KiB
1255 lines
34 KiB
model tiny,stdcall |
|
p586N |
|
locals |
|
jumps |
|
codeseg |
|
option procalign:byte |
|
|
|
include "..\include\fat.h" |
|
include "..\include\mem.h" |
|
include "..\include\divers.h" |
|
include "..\include\pci.h" |
|
include "..\include\cpu.h" |
|
|
|
org 0h |
|
|
|
start: |
|
header exe <,1,0,,,offset imports,,offset realstart> |
|
|
|
realstart: |
|
call [cs:print],offset msginit |
|
xor bp,bp |
|
replay: |
|
call [cs:addline] |
|
noret: |
|
call [cs:addline] |
|
mov di,offset dir |
|
call [cs:getdir],di |
|
call [cs:print],di |
|
call [cs:print],offset prompt |
|
mov di,offset buffer |
|
waitchar: |
|
xor ax,ax |
|
int 16h |
|
call convertfr |
|
cmp ah,59 |
|
jne norr |
|
cmp bp,0 |
|
je waitchar |
|
call [print],[word ptr cs: bp] |
|
call [copy],[word ptr cs: bp],di |
|
call [getlength],di |
|
add di,ax |
|
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 |
|
call [cs:showchar],ax |
|
jmp waitchar |
|
escape: |
|
cmp di,offset buffer |
|
je waitchar |
|
call [cs:getxy] |
|
mov dx,offset buffer |
|
mov cx,di |
|
sub cx,dx |
|
js waitchar |
|
je waitchar |
|
sub ah,cl |
|
mov cl,ah |
|
xor ah,ah |
|
xor ch,ch |
|
call [cs:setxy],cx,ax |
|
mov di,offset buffer |
|
mov [byte ptr di],0 |
|
jmp waitchar |
|
backspace: |
|
cmp di,offset buffer |
|
je waitchar |
|
call [cs:getxy] |
|
dec ah |
|
mov cl,ah |
|
xor ah,ah |
|
xor ch,ch |
|
call [cs:setxy],cx,ax |
|
call [cs:showchar],' ' |
|
call [cs:setxy],cx,ax |
|
dec di |
|
mov [byte ptr di],0 |
|
jmp waitchar |
|
entere: |
|
mov [byte ptr di],0 |
|
cmp di,offset buffer |
|
je noret |
|
mov si,offset temp |
|
call [cs:addline] |
|
call [cs:getitem],offset buffer,si,0,' ' |
|
call [cs:uppercase],si |
|
mov bx,offset commands |
|
xor bp,bp |
|
xor dx,dx |
|
tre: |
|
mov di,[bx] |
|
cmp di,0 |
|
je error |
|
call [cs:evalue],si,di |
|
cmp ax,dx |
|
jb noadd |
|
mov dx,ax |
|
mov bp,bx |
|
noadd: |
|
call [cs:cmpstr],si,di |
|
je strisok |
|
add bx,8 |
|
jmp tre |
|
strisok: |
|
mov di,offset temp |
|
call [cs:copy],offset buffer,di |
|
call [cs:uppercase],di |
|
xor cx,cx |
|
inc cx |
|
call [cs:getpointeritem],di,cx,' ' |
|
mov di,ax |
|
cmp [byte ptr di-1],0 |
|
jne nopod |
|
mov [byte ptr di],0 |
|
nopod: |
|
call [cs:checksyntax],di,[word ptr bx+4],' ' |
|
jc errorprec |
|
mov bx,[bx+2] |
|
call bx |
|
jmp replay |
|
error: |
|
mov di,offset buffer |
|
call [cs:searchchar],di,'.' |
|
je noaddext |
|
call [cs:concat],offset extcom,di |
|
noaddext: |
|
call [cs:execfile],di |
|
jc reallyerror |
|
xor bp,bp |
|
jmp replay |
|
reallyerror: |
|
push [word ptr cs: bp] |
|
push offset error_syntax |
|
call [cs:print] |
|
jmp replay |
|
errorprec: |
|
push offset derror |
|
call [cs:print] |
|
jmp replay |
|
|
|
code_exit: |
|
pop ax |
|
retf |
|
|
|
code_version: |
|
call [cs:print],offset version_text |
|
ret |
|
|
|
version_text db 'Cos 2000 version 1.4Fr par \c04MrNop\c07',0 |
|
|
|
code_cls: |
|
call [cs:clearscreen] |
|
ret |
|
|
|
code_reboot: |
|
push 0ffffh |
|
push 00000h |
|
retf |
|
|
|
code_command: |
|
call [cs:print],offset def |
|
mov bx,offset commands |
|
showalls: |
|
push [word ptr bx+4] |
|
push [word ptr bx+6] |
|
push [word ptr bx] |
|
call [cs:print],offset commandes |
|
add bx,8 |
|
cmp [word ptr bx],0 |
|
jne showalls |
|
endoff: |
|
ret |
|
|
|
def db '\c02Liste des commandes internes\l\l\c07',0 |
|
commandes db '%0 \h10:\h12%0 \h70%0\l',0 |
|
|
|
code_detect: |
|
call [cs:print],offset msg_cpu_detect |
|
call [cs:cpuinfo],offset thecpu |
|
call [cs:setinfo],offset thecpu,offset temp |
|
call [cs:print],offset msg_ok2 |
|
push offset temp |
|
xor eax,eax |
|
mov al,[thecpu.family] |
|
push eax |
|
mov al,[thecpu.models] |
|
push eax |
|
mov al,[thecpu.stepping] |
|
push eax |
|
push offset thecpu.names |
|
push offset thecpu.vendor |
|
call [cs:print],offset msg_cpu_detect_inf |
|
call [cs:print],offset msg_pci |
|
call [cs:pciinfo],offset thepci |
|
jc nopci |
|
call [cs:print],offset msg_ok2 |
|
xor eax,eax |
|
mov al,[thepci.maxbus] |
|
push eax |
|
mov al,[thepci.version_minor] |
|
push eax |
|
mov al,[thepci.version_major] |
|
push eax |
|
call [cs:print],offset msg_pci_info |
|
call [cs:print],offset msg_pci_enum |
|
xor ebx,ebx |
|
xor ecx,ecx |
|
xor si,si |
|
searchpci: |
|
call [cs:getcardinfo],bx,cx,si,offset temp |
|
jc stopthis |
|
mov al,[(pcidata offset temp).subclass] |
|
push ax |
|
mov al,[(pcidata offset temp).class] |
|
push ax |
|
call [cs:getpcisubclass] |
|
push dx |
|
push ax |
|
mov al,[(pcidata offset temp).class] |
|
xor ah,ah |
|
push ax |
|
call [cs:getpciclass] |
|
push dx |
|
push ax |
|
push 4 |
|
push esi |
|
push 4 |
|
push ecx |
|
push 4 |
|
push ebx |
|
mov ax,[(pcidata offset temp).device] |
|
push eax |
|
mov ax,[(pcidata offset temp).vendor] |
|
push eax |
|
call [cs:print],offset msg_pci_card |
|
inc si |
|
cmp si,7 |
|
jbe searchpci |
|
stopthis: |
|
xor si,si |
|
inc cx |
|
cmp cx,31 |
|
jbe searchpci |
|
xor cx,cx |
|
inc bx |
|
cmp bx,16 |
|
jbe searchpci |
|
jmp next |
|
nopci: |
|
call [cs:print],offset msg_echec2 |
|
next: |
|
call [cs:detectvmware] |
|
jne novirtual |
|
call [cs:print],offset msg_vmware |
|
novirtual: |
|
ret |
|
|
|
thepci pciinf <> |
|
thecpu cpu <> |
|
|
|
msg_ok2 db "\h70 [\c02 Ok \c07]\l",0 |
|
msg_echec2 db "\h70 [\c0CPasser\c07]\l",0 |
|
msg_cpu_detect db "Dectection du processeur",0 |
|
msg_cpu_detect_inf db " -Fondeur : %0\l -Modele : %0\l -Revision : %u\l -Version : %u\l -Famille : %u\l -Technologies: %0\l",0 |
|
msg_pci db "Detection des systemes PCI",0 |
|
msg_pci_info db " -Version : %yB.%yB\l -Numero bus max: %u\l",0 |
|
msg_pci_enum db " -Enumeration des peripheriques PCI:\l" |
|
db " | Vendeur | Modele |Bus |Dev.|Func|Classe.Sous-classe\l",0 |
|
msg_pci_card db " | 0x%hW | 0x%hW |%w|%w|%w|%0P.%0P\l",0 |
|
msg_vmware db "\c04 VMWare a ete detecte !!!\c07\l",0 |
|
|
|
code_mode: |
|
call [cs:gettypeditem],di,0,' ' |
|
and al,1111b |
|
call [cs:setvideomode],ax |
|
call [cs:clearscreen] |
|
ret |
|
|
|
code_dir: |
|
call [cs:getserial] |
|
push eax |
|
mov si,offset nomdisque |
|
call [cs:getname],si |
|
push si |
|
push offset present |
|
call [cs:print] |
|
xor ecx,ecx |
|
mov di,offset bufferentry |
|
call [cs:findfirstfile],di |
|
jc nofiles |
|
go: |
|
push [word ptr (find di).result.fileattr] |
|
push [(find di).result.filesize] |
|
push [(find di).result.filetime] |
|
push [(find di).result.filedate] |
|
push [(find di).result.filetimecrea] |
|
push [(find di).result.filedatecrea] |
|
lea bx,[(find di).result.filename] |
|
push bx |
|
push offset line |
|
call [cs:print] |
|
inc ecx |
|
call [cs:findnextfile],di |
|
jnc go |
|
nofiles: |
|
push ecx |
|
push offset filess |
|
call [cs: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\c07',0 |
|
|
|
code_cd: |
|
call [cs:gettypeditem],di,0,' ' |
|
push ax |
|
push offset changing |
|
call [cs:print] |
|
call [cs:changedir],ax |
|
jnc okchange |
|
push offset errorchanging |
|
call [cs:print] |
|
okchange: |
|
ret |
|
|
|
changing db 'Changement de repertoire vers %0\l',0 |
|
errorchanging db '\c04Impossible d''atteindre ce dossier\c07',0 |
|
|
|
code_kill: |
|
call [cs:gettypeditem],di,0,' ' |
|
push ax |
|
push offset killing |
|
call [cs:print] |
|
call [cs:mbfind],ax |
|
jc nochanged |
|
call [cs:mbfree],ax |
|
jnc okchanged |
|
nochanged: |
|
call [cs:print],offset errorkilling |
|
okchanged: |
|
ret |
|
|
|
killing db 'Fermeture du processus %0\l',0 |
|
errorkilling db '\c04Impossible de fermer ce processus\c07',0 |
|
|
|
code_stack: |
|
push ebp |
|
push esp |
|
push ss |
|
push ss |
|
call [cs:print],offset stackshow |
|
mov cx,12 ;12 derniers éléments |
|
xor esi,esi |
|
mov si,sp |
|
sub si,2*12 |
|
showloop: |
|
push [dword ptr ss:si] |
|
push esi |
|
push ss |
|
push ss |
|
call [cs:print],offset itemshow |
|
inc si |
|
inc si |
|
cmp si,sp |
|
jne notspshow |
|
call [cs:print],offset stresp |
|
notspshow: |
|
cmp si,bp |
|
jne nextshow |
|
call [cs:print],offset strebp |
|
nextshow: |
|
dec cx |
|
jnz showloop |
|
ret |
|
|
|
stackshow db '\l\c02Vidage de la pile systeme\l\l\c07' |
|
db 'Segment SS : 0x%hW\l' |
|
db 'Pointeur ESP : 0x%hD\l' |
|
db 'Pointeur EBP : 0x%hD\l' |
|
db 'Seg :Adr | Donnees',0 |
|
itemshow db '\l0x%hW:0x%hW | 0x%hW',0 |
|
|
|
strebp db '<-- BP',0 |
|
stresp db '<-- SP',0 |
|
|
|
|
|
code_setbuffer: |
|
call [cs:gettypeditem],di,0,' ' |
|
call [cs:setbuffer],ax |
|
|
|
code_getbuffer: |
|
mov si,offset diskbuffers |
|
call [cs:getbuffer],si |
|
xor ecx,ecx |
|
mov cx,[diskbuffers.current] |
|
push ecx |
|
mov cx,[diskbuffers.size] |
|
push ecx |
|
call [cs:print],offset showbuffers |
|
mov si,offset diskbuffers.chain |
|
xor bx,bx |
|
showbuffer: |
|
cmp [word ptr si],0FFFFh |
|
jne notnoted |
|
push offset noted |
|
jmp islikeit |
|
notnoted: |
|
cmp [word ptr si],0FFFEh |
|
jne notempty |
|
push offset empty |
|
jmp islikeit |
|
notempty: |
|
push [dword ptr si] |
|
push offset occup |
|
islikeit: |
|
cmp bx,[diskbuffers.current] |
|
jne notthecurrent |
|
call [cs:showchar],'*' |
|
jmp okletsgo |
|
notthecurrent: |
|
call [cs:showchar],' ' |
|
okletsgo: |
|
call [cs:print] |
|
inc si |
|
inc si |
|
inc bx |
|
dec cx |
|
jnz showbuffer |
|
ret |
|
|
|
empty db '\c06------',0 |
|
noted db '\c07------',0 |
|
occup db '\c170x%hW',0 |
|
showbuffers db '\l\c02Contenu des tampons disquette\l\l\c07' |
|
db 'Nombre de tampons alloues : %u\l' |
|
db 'Dernier element du tampon : %u\l\l',0 |
|
|
|
diskbuffers diskbuffer <> |
|
|
|
code_dump: |
|
call [cs:gettypeditem],di,0,' ' |
|
call [cs:mbfind],di |
|
jc notmbfind |
|
mov fs,ax |
|
dec ax |
|
dec ax |
|
mov gs,ax |
|
cmp [word ptr fs:0x0],'EC' |
|
jne notace2 |
|
push offset oui ;CE? str0 2 |
|
jmp suitelikeace2 |
|
notace2: |
|
push offset non |
|
suitelikeace2: |
|
cmp [word ptr gs:mb.isnotlast],true |
|
je notlast2 |
|
push offset oui ;CE? str0 2 |
|
jmp suitelikelast2 |
|
notlast2: |
|
push offset non |
|
suitelikelast2: |
|
mov dx,gs |
|
push edx ;Emplacement memoire hex 2 |
|
;parent |
|
cmp [gs:mb.reference],0 |
|
jne nextdetect2 |
|
push cs |
|
push offset none ;parent lstr0 2x2 |
|
add bx,[gs:mb.sizes] |
|
jmp suitemn2 |
|
nextdetect2: |
|
mov dx,[gs:mb.reference] |
|
dec dx |
|
dec dx |
|
push dx ;parent lstr0 2x2 |
|
push offset (mb).names |
|
suitemn2: |
|
cmp [gs: mb.isresident],true |
|
jne notresident2 |
|
push offset oui ;resident str0 2 |
|
jmp suitelistmcb2 |
|
notresident2: |
|
push offset non ;resident str0 2 |
|
suitelistmcb2: |
|
xor edx,edx |
|
mov dx,[gs: mb.sizes] |
|
shl edx,4 |
|
push edx |
|
push gs ;nom lstr0 2x2 |
|
push offset (mb).names |
|
push offset dumpshow ;ligne |
|
call [cs:print] |
|
cmp [word ptr fs:0x0],'EC' |
|
jne endofdumpformoment |
|
push [dword ptr fs:exe.starting] |
|
push fs |
|
push fs |
|
push [dword ptr fs:exe.sections] |
|
push fs |
|
push fs |
|
push [dword ptr fs:exe.imports] |
|
push fs |
|
push fs |
|
push [dword ptr fs:exe.exports] |
|
push fs |
|
push fs |
|
cmp [fs: exe.compressed],true |
|
jne notcompressed |
|
push offset oui |
|
jmp suiteiscompressed |
|
notcompressed: |
|
push offset non |
|
suiteiscompressed: |
|
push [dword ptr fs:exe.checksum] |
|
push [dword ptr fs:exe.major] |
|
call [cs:print],offset dumpshowce |
|
endofdumpformoment: |
|
ret |
|
notmbfind: |
|
call [cs:print],offset errornotmbfind |
|
ret |
|
|
|
errornotmbfind db '\c04Impossible de trouver le bloc specifie\l\l\c07',0 |
|
|
|
|
|
dumpshow db '\l\c02Dump du bloc de memoire nomme %0P\l\l' |
|
db '\c02-----------------------------\l' |
|
db '\c02Informations du bloc memoire\c07\l' |
|
db 'Taille du bloc reserve : %u\l' |
|
db 'Bloc resident en memoire : %0\l' |
|
db 'Parent du bloc : %0P\l' |
|
db 'Adresse du bloc memoire : 0x%hW:0x0000\l' |
|
db 'Dernier bloc en memoire : %0\l' |
|
db 'Heberge un format CE : %0\l',0 |
|
dumpshowce db '\c02-----------------------------\l' |
|
db 'Informations du bloc executable\c07\l' |
|
db 'Version de l''executable : %u\l' |
|
db 'Somme de controle : %hD\l' |
|
db 'Compression du code : %0\l' |
|
db 'Exportation de fonctions : 0x%hW:0x%hW\l' |
|
db 'Importation de fonctions : 0x%hW:0x%hW\l' |
|
db 'Sections de donnees : 0x%hW:0x%hW\l' |
|
db 'Point d''entree du code : 0x%hW:0x%hW\l',0 |
|
|
|
|
|
code_sections: |
|
call [cs:gettypeditem],di,0,' ' |
|
call [cs:mbfind],di |
|
jc notmbfindssections |
|
jmp haveatargetsections |
|
notmbfindssections: |
|
call [cs:searchfile],di |
|
jc notmbfindall |
|
call [cs:projfile],di |
|
jc notmbfindall |
|
call [cs:mbfind],di |
|
jc notmbfindall |
|
haveatargetsections: |
|
mov fs,ax |
|
cmp [word ptr fs:0x0],'EC' |
|
jne errornotace2 |
|
mov si,[fs:exe.sections] |
|
cmp si,0 |
|
je errornosections |
|
xor edx,edx |
|
call [cs:print],offset rets |
|
showallsections: |
|
add si,4 |
|
push fs |
|
push si |
|
call [cs:print],offset functions |
|
inc edx |
|
findnextsections: |
|
inc si |
|
cmp [byte ptr fs:si],0 |
|
jne findnextsections |
|
cmp [dword ptr fs:si],0 |
|
je finishsections |
|
inc si |
|
jmp showallsections |
|
finishsections: |
|
push edx |
|
call [cs:print],offset allsections |
|
ret |
|
|
|
errornosections: |
|
call [cs:print],offset errornosection |
|
ret |
|
|
|
allsections db '\c02\lIl y avait %u sections dans le bloc ou fichier\l\c07',0 |
|
errornosection db '\c02Aucune section dans le bloc ou fichier\l\c07',0 |
|
|
|
code_exports: |
|
call [cs:gettypeditem],di,0,' ' |
|
call [cs:mbfind],di |
|
jc notmbfindsimports |
|
jmp haveatargetexports |
|
notmbfindsexports: |
|
call [cs:searchfile],di |
|
jc notmbfindall |
|
call [cs:projfile],di |
|
jc notmbfindall |
|
call [cs:mbfind],di |
|
jc notmbfindall |
|
haveatargetexports: |
|
mov fs,ax |
|
cmp [word ptr fs:0x0],'EC' |
|
jne errornotace2 |
|
mov si,[fs:exe.exports] |
|
cmp si,0 |
|
je errornoexports |
|
xor edx,edx |
|
call [cs:print],offset rets |
|
showallexports: |
|
push fs |
|
push si |
|
call [cs:print],offset functions |
|
inc edx |
|
findnextexports: |
|
inc si |
|
cmp [byte ptr fs:si],0 |
|
jne findnextexports |
|
add si,3 |
|
cmp [dword ptr fs:si],0 |
|
je finishexports |
|
jmp showallexports |
|
finishexports: |
|
push edx |
|
call [cs:print],offset allexports |
|
ret |
|
|
|
errornoexports: |
|
call [cs:print],offset errornoexport |
|
ret |
|
|
|
allexports db '\c02\lIl y avait %u exportations dans le bloc ou fichier\l\c07',0 |
|
errornoexport db '\c02Aucune exportation dans le bloc ou fichier\l\c07',0 |
|
|
|
|
|
code_imports: |
|
call [cs:gettypeditem],di,0,' ' |
|
call [cs:mbfind],di |
|
jc notmbfindsimports |
|
jmp haveatargetimports |
|
notmbfindsimports: |
|
call [cs:searchfile],di |
|
jc notmbfindall |
|
call [cs:projfile],di |
|
jc notmbfindall |
|
call [cs:mbfind],di |
|
jc notmbfindall |
|
haveatargetimports: |
|
mov fs,ax |
|
cmp [word ptr fs:0x0],'EC' |
|
jne errornotace2 |
|
mov si,[fs:exe.imports] |
|
cmp si,0 |
|
je errornoimports |
|
xor edx,edx |
|
call [cs:print],offset rets |
|
showallimports: |
|
push fs |
|
push si |
|
call [cs:print],offset functions |
|
inc edx |
|
findnextimports: |
|
inc si |
|
cmp [byte ptr fs:si],0 |
|
jne findnextimports |
|
add si,5 |
|
cmp [dword ptr fs:si],0 |
|
je finishimports |
|
jmp showallimports |
|
finishimports: |
|
push edx |
|
call [cs:print],offset allimports |
|
ret |
|
|
|
errornoimports: |
|
call [cs:print],offset errornoimport |
|
ret |
|
|
|
notmbfindall: |
|
call [cs:print],offset errornotmborfilefind |
|
ret |
|
|
|
errornotace2: |
|
call [cs:print],offset errornotcefind |
|
ret |
|
|
|
functions db '%0P\l',0 |
|
rets db '\l\l',0 |
|
allimports db '\c02\lIl y avait %u importations dans le bloc ou fichier\l\c07',0 |
|
errornoimport db '\c02Aucune importation dans le bloc ou fichier\l\c07',0 |
|
errornotcefind db '\c04Le bloc ou le fichier spécifié n''est pas CE\l\c07',0 |
|
errornotmborfilefind db '\c04Impossible de trouver le bloc ou le fichier specifie\l\c07',0 |
|
|
|
code_regs: |
|
call [cs:savecontext],offset allregs |
|
push 6 |
|
push eax |
|
push eax |
|
mov ax,[word ptr allregs.sss] |
|
push 6 |
|
push eax |
|
push eax |
|
mov ax,[word ptr allregs.sgs] |
|
push 6 |
|
push eax |
|
push eax |
|
mov ax,[word ptr allregs.sfs] |
|
push 6 |
|
push eax |
|
push eax |
|
mov ax,[word ptr allregs.ses] |
|
push 6 |
|
push eax |
|
push eax |
|
mov ax,[word ptr allregs.sds] |
|
push 6 |
|
push eax |
|
push eax |
|
mov ax,[word ptr allregs.scs] |
|
xor eax,eax |
|
push 10 |
|
pushd [dword ptr allregs.seip] |
|
pushd [dword ptr allregs.seip] |
|
push 10 |
|
pushd [dword ptr allregs.sesp] |
|
pushd [dword ptr allregs.sesp] |
|
push 10 |
|
pushd [dword ptr allregs.sebp] |
|
pushd [dword ptr allregs.sebp] |
|
push 10 |
|
pushd [dword ptr allregs.sedi] |
|
pushd [dword ptr allregs.sedi] |
|
push 10 |
|
pushd [dword ptr allregs.sesi] |
|
pushd [dword ptr allregs.sesi] |
|
push 10 |
|
pushd [dword ptr allregs.sedx] |
|
pushd [dword ptr allregs.sedx] |
|
push 10 |
|
pushd [dword ptr allregs.secx] |
|
pushd [dword ptr allregs.secx] |
|
push 10 |
|
pushd [dword ptr allregs.sebx] |
|
pushd [dword ptr allregs.sebx] |
|
push 10 |
|
pushd [dword ptr allregs.seax] |
|
pushd [dword ptr allregs.seax] |
|
push 10 |
|
pushd [dword ptr allregs.seflags] |
|
pushd [dword ptr allregs.seflags] |
|
call [cs:print],offset registershow |
|
ret |
|
|
|
registershow db '\l\c02Liste des registres du Microprocesseur\l\l\c07' |
|
db '\c04CPU\h30FPU\c07\l' |
|
db 'EFGS: 0x%hD : %w |\h32ST(0): ??\l' |
|
db 'EAX : 0x%hD : %w |\h32ST(1): ??\l' |
|
db 'EBX : 0x%hD : %w |\h32ST(2): ??\l' |
|
db 'ECX : 0x%hD : %w |\h32ST(3): ??\l' |
|
db 'EDX : 0x%hD : %w |\h32ST(4): ??\l' |
|
db 'ESI : 0x%hD : %w |\h32ST(5): ??\l' |
|
db 'EDI : 0x%hD : %w |\h32ST(6): ??\l' |
|
db 'EBP : 0x%hD : %w |\h32ST(7): ??\l' |
|
db 'ESP : 0x%hD : %w |\h32\l' |
|
db 'EIP : 0x%hD : %w |\h32\l' |
|
db 'CS : 0x%hW : %w |\h32\l' |
|
db 'DS : 0x%hW : %w |\h32\l' |
|
db 'ES : 0x%hW : %w |\h32\l' |
|
db 'FS : 0x%hW : %w |\h32\l' |
|
db 'GS : 0x%hW : %w |\h32\l' |
|
db 'SS : 0x%hW : %w |\h32\l',0 |
|
|
|
|
|
allregs regs <> |
|
|
|
code_irqs: |
|
call [cs:mbfind],offset interruptionbloc |
|
jc erroronint |
|
call [cs:print],offset irqmsg1 |
|
mov es,ax |
|
xor ebx,ebx |
|
intoirq: |
|
xor eax,eax |
|
mov al,[bx+offset irqmap] |
|
mov dx,size ints |
|
mul dx |
|
mov si,ax |
|
pushd [dword ptr es:(ints si).vector1.data.off] |
|
pushd [dword ptr es:(ints si).vector1.data.seg] |
|
call [cs:isrequestirq],bx |
|
jc requested |
|
push ' ' |
|
jmp suiterequested |
|
requested: |
|
push 'X' |
|
suiterequested: |
|
call [cs:isinserviceirq],bx |
|
jc inservice |
|
push ' ' |
|
jmp suiteinservice |
|
inservice: |
|
push 'X' |
|
suiteinservice: |
|
call [cs:isenableirq],bx |
|
jc activatemat |
|
push ' ' |
|
jmp suiteactivatemat |
|
activatemat: |
|
push 'X' |
|
suiteactivatemat: |
|
cmp [es:(ints si).activated],1 |
|
je activate2 |
|
push ' ' |
|
jmp suiteactivate2 |
|
activate2: |
|
push 'X' |
|
suiteactivate2: |
|
cmp [es:(ints si).locked],1 |
|
je verrouille2 |
|
push ' ' |
|
jmp suiteverrouille2 |
|
verrouille2: |
|
push 'X' |
|
suiteverrouille2: |
|
pushd [dword ptr es:(ints si).calledlow] |
|
pushd [dword ptr es:(ints si).calledhigh] |
|
pushd [dword ptr es:(ints si).launchedlow] |
|
pushd [dword ptr es:(ints si).launchedhigh] |
|
push 3 |
|
xor eax,eax |
|
mov al,[bx+offset irqmap] |
|
push eax |
|
push 3 |
|
push ebx |
|
call [cs:print],offset irqmsg2 |
|
inc bl |
|
cmp bl,16 |
|
jb intoirq |
|
ret |
|
|
|
|
|
irqmap db 8,9,10,11,12,13,14,15,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77 |
|
irqmsg1 db '\l\c02Listes des IRQs\c07\l\l' |
|
db 'IRQ | Int | Appels | Executions |Ver|Act|IMR|ISR|IRR| Vecteur 1 \l',0 |
|
irqmsg2 db '%w | %w | 0x%hW%hD | 0x%hW%hD | %c | %c | %c | %c | %c | 0x%hW:0x%hW\l',0 |
|
|
|
code_int: |
|
call [cs:mbfind],offset interruptionbloc |
|
jc erroronint |
|
mov es,ax |
|
call [cs:gettypeditem],di,0,' ' |
|
xor edi,edi |
|
mov di,ax |
|
mov cx,size ints |
|
mul cx |
|
mov si,ax |
|
pushd [dword ptr es:(ints si).vector8.data.off] |
|
pushd [dword ptr es:(ints si).vector8.data.seg] |
|
pushd [dword ptr es:(ints si).vector7.data.off] |
|
pushd [dword ptr es:(ints si).vector7.data.seg] |
|
pushd [dword ptr es:(ints si).vector6.data.off] |
|
pushd [dword ptr es:(ints si).vector6.data.seg] |
|
pushd [dword ptr es:(ints si).vector5.data.off] |
|
pushd [dword ptr es:(ints si).vector5.data.seg] |
|
pushd [dword ptr es:(ints si).vector4.data.off] |
|
pushd [dword ptr es:(ints si).vector4.data.seg] |
|
pushd [dword ptr es:(ints si).vector3.data.off] |
|
pushd [dword ptr es:(ints si).vector3.data.seg] |
|
pushd [dword ptr es:(ints si).vector2.data.off] |
|
pushd [dword ptr es:(ints si).vector2.data.seg] |
|
pushd [dword ptr es:(ints si).vector1.data.off] |
|
pushd [dword ptr es:(ints si).vector1.data.seg] |
|
pushd [dword ptr es:(ints si).calledlow] |
|
pushd [dword ptr es:(ints si).calledhigh] |
|
pushd [dword ptr es:(ints si).launchedlow] |
|
pushd [dword ptr es:(ints si).launchedhigh] |
|
cmp [es:(ints si).activated],1 |
|
je activate |
|
push offset oui |
|
jmp suiteactivate |
|
activate: |
|
push offset non |
|
suiteactivate: |
|
cmp [es:(ints si).locked],1 |
|
je verrouille |
|
push offset oui |
|
jmp suiteverrouille |
|
verrouille: |
|
push offset non |
|
suiteverrouille: |
|
push esi |
|
push es |
|
push es |
|
push edi |
|
call [cs:print],offset infosint |
|
ret |
|
erroronint: |
|
call [cs:print],offset errorint |
|
okint: |
|
ret |
|
|
|
interruptionbloc db '/interrupts',0 |
|
errorint db '\c04Le gestionnaire d''interruption n''est pas actif\l\c07',0 |
|
infosint db '\c07Le bloc d''interruption est charge en memoire et le gestionnaire est actif\l\l' |
|
db 'Interruption %u\l' |
|
db 'Pointeur : 0x%hW:0x%hW\l\c07' |
|
db 'Active : %0\l' |
|
db 'Verrouillage : %0\l' |
|
db 'Nombre d''appels : 0x%hD%hD\l' |
|
db 'Nombre de lancements : 0x%hD%hD\l' |
|
db '\c02Vecteur 1 : 0x%hW:0x%hW\l' |
|
db 'Vecteur 2 : 0x%hW:0x%hW\l' |
|
db 'Vecteur 3 : 0x%hW:0x%hW\l' |
|
db 'Vecteur 4 : 0x%hW:0x%hW\l' |
|
db 'Vecteur 5 : 0x%hW:0x%hW\l' |
|
db 'Vecteur 6 : 0x%hW:0x%hW\l' |
|
db 'Vecteur 7 : 0x%hW:0x%hW\l' |
|
db 'Vecteur 8 : 0x%hW:0x%hW\l\c07',0 |
|
|
|
code_refresh: |
|
call [cs:initdrive] |
|
jnc okrefresh |
|
call [cs:print],offset errorrefreshing |
|
ret |
|
okrefresh: |
|
call [cs:getserial] |
|
push eax |
|
mov si,offset nomdisque |
|
call [cs:getname],si |
|
push si |
|
push offset present |
|
call [cs:print] |
|
ret |
|
|
|
errorrefreshing db '\c04Impossible de lire le support',0 |
|
extcom db '.CE',0 |
|
|
|
|
|
code_mem: |
|
call [cs:print],offset msg |
|
xor edx,edx |
|
xor ebx,ebx |
|
xor cx,cx |
|
listmcb: |
|
call [cs:mbget],cx |
|
jc fino |
|
mov fs,ax |
|
dec ax |
|
dec ax |
|
mov gs,ax |
|
inc cx |
|
cmp [word ptr fs:0x0],'EC' |
|
jne notace |
|
push offset oui ;CE? str0 2 |
|
jmp suitelikeace |
|
notace: |
|
push offset non |
|
suitelikeace: |
|
mov dx,fs |
|
push edx ;Emplacement memoire hex 2 |
|
;parent |
|
cmp [gs:mb.reference],0 |
|
jne nextdetect |
|
push cs |
|
push offset none ;parent lstr0 2x2 |
|
add bx,[gs:mb.sizes] |
|
jmp suitemn |
|
nextdetect: |
|
mov dx,[gs:mb.reference] |
|
dec dx |
|
dec dx |
|
push dx ;parent lstr0 2x2 |
|
push offset (mb).names |
|
suitemn: |
|
cmp [gs: mb.isresident],true |
|
jne notresident |
|
push offset oui ;resident str0 2 |
|
jmp suitelistmcb |
|
notresident: |
|
push offset non ;resident str0 2 |
|
suitelistmcb: |
|
xor edx,edx |
|
mov dx,[gs: mb.sizes] |
|
shl edx,4 |
|
push 6 ;decimal 4 + type 2 |
|
push edx |
|
push gs ;nom lstr0 2x2 |
|
push offset (mb).names |
|
push offset line2 ;ligne |
|
call [cs:print] |
|
jmp listmcb |
|
fino: |
|
shl ebx,4 |
|
push ebx |
|
push offset fin |
|
call [cs:print] |
|
ret |
|
oui db "oui",0 |
|
non db "non",0 |
|
line2 db "%0P\h15| %w\h24| %0\h30| %0P\h47| 0x%hW\h57| %0\l",0 |
|
fin db "\l\l\c02%u octets de memoire disponible\l\c07",0 |
|
msg db "\l\c02Plan de la memoire\c07\l\lNom du bloc | Taille | Res | Bloc parent | Adresse | CE \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 str_int ,code_int ,syn_int ,help_int |
|
dw str_irqs ,code_irqs,syn_irqs ,help_irqs |
|
dw str_regs ,code_regs,syn_regs ,help_regs |
|
dw str_stack,code_stack,syn_stack,help_stack |
|
dw str_dump,code_dump,syn_dump,help_dump |
|
dw str_detect,code_detect,syn_detect,help_detect |
|
dw str_exports,code_exports,syn_exports,help_exports |
|
dw str_imports,code_imports,syn_imports,help_imports |
|
dw str_sections,code_sections,syn_sections,help_sections |
|
dw str_getbuffer,code_getbuffer,syn_getbuffer,help_getbuffer |
|
dw str_setbuffer,code_setbuffer,syn_setbuffer,help_setbuffer |
|
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 |
|
str_int db 'INT',0 |
|
str_irqs db 'IRQS',0 |
|
str_regs db 'REGS',0 |
|
str_stack db 'STACK',0 |
|
str_dump db 'DUMP',0 |
|
str_detect db 'DETECT',0 |
|
str_exports db 'EXPORTS',0 |
|
str_imports db 'IMPORTS',0 |
|
str_sections db 'SECTIONS',0 |
|
str_getbuffer db 'GETBUFFER',0 |
|
str_setbuffer db 'SETBUFFER',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 |
|
syn_int db 'FFh',0 |
|
syn_irqs db 0 |
|
syn_regs db 0 |
|
syn_stack db 0 |
|
syn_dump db '?',0 |
|
syn_detect db 0 |
|
syn_exports db '?',0 |
|
syn_imports db '?',0 |
|
syn_sections db '?',0 |
|
syn_getbuffer db 0 |
|
syn_setbuffer db 'FFh',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 |
|
help_int db 'Affiche des informations sur l''interruption',0 |
|
help_irqs db 'Affiche des informations sur les IRQs',0 |
|
help_regs db 'Affiche les registres du microprocesseur',0 |
|
help_stack db 'Affiche la pile systeme',0 |
|
help_dump db 'Affiche le contenu de la memoire',0 |
|
help_detect db 'Detecte et Affiche les peripheriques PCI et le CPU',0 |
|
help_exports db 'Affiche toutes les exportations du fichier specifie',0 |
|
help_imports db 'Affiche toutes les importations du fichier specifie',0 |
|
help_sections db 'Affiche toutes les sections du fichier specifie',0 |
|
help_getbuffer db 'Renvoi le contenu et la configuration des tampons disquette',0 |
|
help_setbuffer db 'Fixe la taille des tampons disquette',0 |
|
|
|
derror db '\c04Erreur de Syntaxe !',0 |
|
error_syntax db '\c04La commande ou l''executable n''existe pas ! F1 pour %0',0 |
|
prompt db '\c07>',0 |
|
msginit db '\m02\e\c07\l\lInterpreteur de commande COS V1.11\lSous license \c05GPL\c07 - Ecrit par \c04MrNop\l\c07Utilisez la commande CMDS pour connaitres les commandes disponibles\l',0 |
|
|
|
|
|
dir db 32 dup (0) |
|
buffer db 256 dup (0) |
|
temp db 256 dup (0) |
|
|
|
importing |
|
use DETECT.LIB,cpuinfo |
|
use DETECT.LIB,setinfo |
|
use DETECT.LIB,pciinfo |
|
use DETECT.LIB,getcardinfo |
|
use DETECT.LIB,getpcisubclass |
|
use DETECT.LIB,getpciclass |
|
use DETECT.LIB,detectvmware |
|
use VIDEO,clearscreen |
|
use VIDEO,setvideomode |
|
use VIDEO,getxy |
|
use VIDEO,setxy |
|
use VIDEO,addline |
|
use VIDEO.LIB,showhex |
|
use VIDEO.LIB,print |
|
use VIDEO.LIB,showchar |
|
use DISQUE,getdir |
|
use DISQUE,getserial |
|
use DISQUE,getname |
|
use DISQUE,findfirstfile |
|
use DISQUE,findnextfile |
|
use DISQUE,execfile |
|
use DISQUE,initdrive |
|
use DISQUE,changedir |
|
use DISQUE,searchfile |
|
use DISQUE,projfile |
|
use DISQUE,getbuffer |
|
use DISQUE,setbuffer |
|
use SYSTEME,mbget |
|
use SYSTEME,mbfind |
|
use SYSTEME,mbfindsb |
|
use SYSTEME,mbfree |
|
use SYSTEME,isenableirq |
|
use SYSTEME,isinserviceirq |
|
use SYSTEME,isrequestirq |
|
use SYSTEME,savecontext |
|
use STR0.LIB,uppercase |
|
use STR0.LIB,evalue |
|
use STR0.LIB,copy |
|
use STR0.LIB,checksyntax |
|
use STR0.LIB,searchchar |
|
use STR0.LIB,concat |
|
use STR0.LIB,getitem |
|
use STR0.LIB,cmpstr |
|
use STR0.LIB,getpointeritem |
|
use STR0.LIB,getlength |
|
use STR0.LIB,gettypeditem |
|
endi
|
|
|