Small operating system made in assembly language
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

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