diff --git a/Graphisme/screenshots/bootnew.jpg b/Graphisme/screenshots/bootnew.jpg new file mode 100644 index 0000000..6829feb Binary files /dev/null and b/Graphisme/screenshots/bootnew.jpg differ diff --git a/MAKEFILE b/MAKEFILE index 590d8df..51bd6de 100644 --- a/MAKEFILE +++ b/MAKEFILE @@ -1,9 +1,5 @@ all: - cd commande - make - cd .. - - cd programs + cd lib make cd .. @@ -11,31 +7,16 @@ all: make cd .. - cd contribs - make - cd .. - cd install make cd .. copy: make all - copy commande\*.exe ..\data - copy programs\*.exe ..\data - copy programs\*.rip ..\data - copy noyau\*.sys ..\data - rem copy noyau\*.bin ..\data - copy contribs\*.exe ..\data - copy install\*.com ..\ - make clean + clean: - cd commande - make clean - cd .. - - cd programs + cd lib make clean cd .. @@ -43,10 +24,6 @@ clean: make clean cd .. - cd contribs - make clean - cd .. - cd install make clean cd .. diff --git a/SCREENSHOTS.md b/SCREENSHOTS.md index 5751d32..d4f0e9e 100644 --- a/SCREENSHOTS.md +++ b/SCREENSHOTS.md @@ -1,6 +1,7 @@ ![logo](https://github.com/dahut87/cos2000v1/raw/master/Graphisme/logo.png) ## Copies d'écran de COS2000 +![screen](https://github.com/dahut87/cos2000v1/raw/develop/Graphisme/screenshots/bootnew.jpg) ![screen](https://github.com/dahut87/cos2000v1/raw/develop/Graphisme/screenshots/chargement.jpg) ![screen](https://github.com/dahut87/cos2000v1/raw/develop/Graphisme/screenshots/dir.jpg) ![screen](https://github.com/dahut87/cos2000v1/raw/develop/Graphisme/screenshots/editeur.jpg) diff --git a/commande/commande.asm b/commande/commande.asm index f0dfdc3..f4e4a4d 100644 --- a/commande/commande.asm +++ b/commande/commande.asm @@ -1,42 +1,20 @@ -.model tiny +.model tiny .486 smart .code -org 0100h +org 0h include ..\include\fat.h include ..\include\mem.h include ..\include\divers.h start: - push cs - push cs - push cs - push cs - pop ds - pop es - pop fs - pop gs - mov ah,21 - mov cl,7 - int 47h +header exe <,1,0,,,offset imports,,> - mov ah,3 - int 48h - mov ax,0002 - int 47h - mov ah,2 - int 47h - mov ah,6 - int 47h - mov ah,6 - int 47h - mov ah,42 - int 47h - mov ah,13 - mov si,offset msg - int 47h +realstart: + push offset msginit + call [print] xor bp,bp mov dl,' ' call setdelimiter0 @@ -46,14 +24,11 @@ replay: noret: mov ah,6 int 47h - mov ah,16 - mov di,offset dir - int 48h - mov si,di - mov ah,13 - int 47h - mov si,offset prompt - int 47h + mov ah,16 + mov di,offset dir + int 48h + push offset prompt + call [print] mov di,offset buffer waitchar: mov ax,0 @@ -63,21 +38,20 @@ waitchar: jne norr cmp bp,0 je waitchar - mov ah,13 - mov si,cs:[bp-8] - int 47h + push word ptr cs: [bp-8] + call [print] push cs - pop es + pop es call copy0 call getlength0 add di,cx jmp waitchar norr: - cmp al,0Dh ;entrée + cmp al,0dh ;entrée je entere - cmp al,08h ;backspace + cmp al,08h ;backspace je backspace - cmp al,27 ;echap + cmp al,27 ;echap je escape cmp al,' ' jb waitchar @@ -85,14 +59,13 @@ norr: je waitchar mov [di],al inc di - mov dl,al - mov ah,7 - int 47h + push ax + call [showchar] jmp waitchar escape: cmp di,offset buffer je waitchar - mov ah,18h + mov ah,24 int 47h mov dx,offset buffer mov cx,di @@ -100,20 +73,21 @@ escape: js waitchar je waitchar sub bh,cl - mov ah,19h + mov ah,25 int 47h mov di,offset buffer mov byte ptr [di],0 backspace: cmp di,offset buffer je waitchar - mov ah,18h + mov ah,24 int 47h dec bh - mov dl,' ' - mov ah,0Eh + mov ah,25 int 47h - mov ah,19h + push ' ' + call [showchar] + mov ah,25 int 47h dec di mov byte ptr [di],0 @@ -141,13 +115,13 @@ tre: cmp di,0 je error push cs - pop es + pop es call evalue0 cmp dx,bp jb noadd mov bp,dx mov ax,bx - noadd: +noadd: call cmpstr0 jne tre mov si,offset buffer @@ -172,7 +146,7 @@ nopod: error: mov bp,ax push cs - pop es + pop es mov dl,'.' call searchchar0 je noaddext @@ -187,57 +161,58 @@ noaddext: xor bp,bp jmp replay reallyerror: - mov ah,13 - mov si,offset Error_Syntax - int 47h - mov ah,13 - mov si,cs:[bp-8] - int 47h + push offset error_syntax + call [print] + push word ptr cs: [bp-8] + call [print] jmp replay errorprec: - mov ah,13 - mov si,offset derror - int 47h + push offset derror + call [print] jmp replay - -Code_Exit: + +code_exit: pop ax - db 0CBh - -Code_Version: - mov ah,13 - mov si,offset Version_Text - int 47h + retf + +code_version: + push offset version_text + call [print] ret - -Version_Text db 'Cos 2000 version 1.2Fr par Nico',0 - -Code_Cls: + +version_text db 'Cos 2000 version 1.4Fr par \c04MrNop',0 + +code_cls: mov ah,2 int 47h ret - -Code_Reboot: - push 0FFFFh + +code_reboot: + push 0ffffh push 00000h - db 0CBH - -Code_Command: + retf + +code_command: + push offset def + call [print] mov bx,offset commands showalls: - mov si,[bx] add bx,8 - cmp si,0 + cmp word ptr [bx],0 je endoff - mov ah,13 - int 47h - mov ah,6 - int 47h + push word ptr [bx+4] + push word ptr [bx+6] + push word ptr [bx] + push offset commandes + call [print] jmp showalls endoff: ret -Code_Mode: +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 @@ -248,387 +223,320 @@ Code_Mode: int 47h ret -present db 'Le volume insere est nomme ',0 -present2 db ', Numero de serie : ',0 -nomdisque db 13 dup (0) -Code_Dir: -mov si,offset present -mov ah,13 -int 47h -mov ah,11 -mov di,offset nomdisque -int 48h -mov si,di -mov ah,13 -int 47h -mov si,offset present2 -mov ah,13 -int 47h -mov ah,12 -int 48h -mov ah,10 -mov cx,32 -int 47h -mov ah,6 -int 47h -mov ah,6 -int 47h -xor ebp,ebp -mov di,offset bufferentry -mov si,di -mov ah,7 -int 48h -jc nofiles +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: -mov ah,46 -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,44 -mov dx,[si+Entries.FileDateCrea] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,45 -mov dx,[si+Entries.FileTimeCrea] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,44 -mov dx,[si+Entries.FileDate] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,45 -mov dx,[si+Entries.FileTime] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,48 -mov edx,[si+Entries.FileSize] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,47 -mov dl,[si+Entries.FileAttr] -int 47h -mov ah,6 -int 47h -inc bp -mov ah,8 -int 48h -jnc 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: -mov edx,ebp -mov ah,6 -int 47h -mov ah,8 -int 47h -mov si,offset filess -mov ah,13 -int 47h -ret -bufferentry db 32 dup (0) -filess db ' Fichier(s) au total',0 + 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 -changing db 'Changement de repertoire vers ',0 code_cd: - mov cx,0 + mov cx,0 call gettypeditem0 - push si - mov si,offset changing - mov ah,13 - int 47h - pop si - int 47h - mov ah,6 - int 47h - mov si,di - mov ah,13 - int 48h - jnc okchange - mov si,offset errorchanging - mov ah,13 - int 47h + push di + push offset changing + call [print] + mov si,di + mov ah,13 + int 48h + jnc okchange + push offset errorchanging + call [print] okchange: - ret -errorchanging db 'Impossible d''atteindre ce dossier',0 + 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 - mov si,offset errorrefreshing - mov ah,13 - int 47h -ret + mov ah,3 + int 48h + jnc okrefresh + push offset errorrefreshing + call [print] + ret okrefresh: -mov si,offset present -mov ah,13 -int 47h -mov ah,11 -mov di,offset nomdisque -int 48h -mov si,di -mov ah,13 -int 47h -mov si,offset present2 -mov ah,13 -int 47h -mov ah,12 -int 48h -mov ah,10 -mov cx,32 -int 47h -mov ah,6 -int 47h - ret -errorrefreshing db 'Impossible de lire le support',0 + 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 -extcom db '.COM',0 - -Code_Mem: -mov si,offset msgs -mov ah,13 -int 47h -mov ah,6 -int 47h -mov ah,6 -int 47h -mov si,offset menu -mov ah,13 -int 47h -mov ah,6 -int 47h -mov ah,18h -int 47h -xor cx,cx +code_mem: + push offset msg + call [print] + xor ebx,ebx + xor cx,cx listmcb: -mov ah,4 -int 49h -jc fino -inc cx -mov ah,18h -int 47h -push gs -pop ds -mov bh,0 -mov si,MB.Names -mov ah,14h -int 47h -mov bh,15 -xor edx,edx -mov dx,ds:[MB.Sizes] -shl edx,4 -mov ah,0Fh -int 47h -mov bh,24 -cmp ds:[MB.IsResident],true -push cs -pop ds -jne notresident -mov si,offset resident -mov ah,14h -int 47h -jmp suitelistmcb -notresident: -mov si,offset nonresident -mov ah,14h -int 47h -suitelistmcb: -mov bh,30 -cmp gs:[MB.Reference],0 -je next -cmp gs:[MB.Reference],1000h -jb next -mov ax,gs:[MB.Reference] -dec ax -dec ax -mov ds,ax -mov si,MB.Names -mov ah,14h -int 47h + 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 bh,46 -xor edx,edx -mov dx,gs -inc dx -inc dx -push cx -mov cx,16 -mov ah,11h -int 47h -mov ah,6h -int 47h -pop cx -jmp listmcb + 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: -ret -resident db 'oui',0 -nonresident db 'non',0 -msgs db 'Plan de la memoire',0 -menu db 'Nom Taille Res Parent Mem',0 + 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 + 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] + 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 + 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 +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 - - - - - - - -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 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 -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 -Help_Exit db 0 -Help_Version db 0 -Help_Cls db 0 -Help_Reboot db 0 -Help_Command db 0 -Help_Mode db 0 -Help_Dir db 0 -Help_refresh db 0 -Help_cd db 0 -Help_Mem db 0 -derror db 'Erreur de Syntaxe !',0 -Error_Syntax db 'La commande ou l''executable n''existe pas ! F1 pour ',0 -prompt db '>',0 -msg db 'Interpreteur de commande COS V1.8',0 - - include str0.asm - -dir db 32 dup (0) -buffer db 256 dup (0) -buffer2 db 256 dup (0) - - -end start +end start diff --git a/include/cpu.h b/include/cpu.h new file mode 100644 index 0000000..e2dbe43 --- /dev/null +++ b/include/cpu.h @@ -0,0 +1,20 @@ +struc cpu +vendor db 13 dup(0) ;Chaine 0 du fabriquant +names db 32 dup(0) +stepping db 0 +models db 0 +family db 0 +types db 0 +emodels db 0 +efamily db 0 +mmx db 0 +mmx2 db 0 +sse db 0 +sse2 db 0 +sse3 db 0 +fpu db 0 +now3d db 0 +now3d2 db 0 +htt db 0 +apic db 0 +ends cpu diff --git a/include/divers.h b/include/divers.h index 33c09b6..a8e0063 100644 --- a/include/divers.h +++ b/include/divers.h @@ -1,2 +1,2 @@ -True equ 1 -False equ 0 +true equ 1 +false equ 0 diff --git a/include/fat.h b/include/fat.h index 4c89a7d..f7f2edf 100644 --- a/include/fat.h +++ b/include/fat.h @@ -1,58 +1,52 @@ -Free equ 0 -True equ 1 -False equ 0 +struc dpt +steprate&headunload db 0DFh ;Vitesse de progression & mont‚e de la tˆte +dmaflag&headload db 002h ;Etat Dma et temps de descente de la tˆte +delaymotoroff db 025h ;Temps avant extinction moteur +bytepersector db 002h ;Taille des secteurs +sectorpertracks db 000h ;Nombre de secteur par piste +intersectgaplength db 01Bh ;Taille du GAP3 en lecture/‚criture +datalength db 0FFh ;Longueur du transfert de donn‚es +intersectgaplengthf db 054h ;Taille du GAP3 en formatage +formatbyte db 0F6h ;Octet de formatage +headsettlingtime db 000h ;Temps de repos des tˆtes +delaymotornormspeed db 008h ;Temps de mont‚e en vitesse du moteur +ends dpt -DPT struc -StepRate&HeadUnload db 0DFh ;Vitesse de progression & mont‚e de la tˆte -DMAFlag&HeadLoad db 002h ;Etat Dma et temps de descente de la tˆte -DelayMotorOff db 025h ;Temps avant extinction moteur -BytePerSector db 002h ;Taille des secteurs -SectorPerTracks db 000h ;Nombre de secteur par piste -InterSectGapLength db 01Bh ;Taille du GAP3 en lecture/‚criture -DataLength db 0FFh ;Longueur du transfert de donn‚es -InterSectGapLengthF db 054h ;Taille du GAP3 en formatage -FormatByte db 0F6h ;Octet de formatage -HeadSettlingTime db 000h ;Temps de repos des tˆtes -DelayMotorNormSpeed db 008h ;Temps de mont‚e en vitesse du moteur -DPT ends +struc entries +filename db 8 dup (0) +filext db 3 dup (0) +fileattr db 0 +filereserved db 0 +filetimecreams db 0 ;(*10 ms) +filetimecrea dw 0 +filedatecrea dw 0 +filedateacc dw 0 +filenotused dw 0 +filetime dw 0 +filedate dw 0 +filegroup dw 0 +filesize dd 0 +ends entries -Entries Struc -FileName db 8 dup (0) -FilExt db 3 dup (0) -FileAttr db 0 -FileReserved db 0 -FileTimeCreaMs db 0 ;(*10 ms) -FileTimeCrea dw 0 -FileDateCrea dw 0 -FileDateAcc dw 0 -FileNotused dw 0 -FileTime dw 0 -FileDate dw 0 -FileGroup dw 0 -FileSize dd 0 -Entries Ends - -BootSector Struc -jumper db 0,0,0 -Vendor db 'COS2000A' ;Fabricant + n°série Formatage -SectorSize dw 512 ;octet/secteur -SectorsPerCluster db 1 ;secteur/cluster -ReservedSectors dw 1 ;secteur reserv‚ -FatsPerDrive db 2 ;nb de copie de la FAT -DirectorySize dw 224 ;taille rep racine -SectorsPerDrive dw 2880 ;nb secteur du volume si < 32 még -MédiaDescriptor db 0F0h ;Descripteur de média -SectorsPerFat dw 9 ;secteur/FAT -SectorsPerTrack dw 18 ;secteur/piste -HeadsPerDrive dw 2 ;nb de tˆteb de lecture/écriture -HiddenSectorsH dw 0 ;nombre de secteur cach‚s -HiddenSectorsL dw 0 ; -SectorPerDisk2 dd 0 ;Nombre secteur du volume si > 32 Mo+20h ; the number of sectors -BootDrive db 0 ;Lecteur de d‚marrage -ReservedForNT db 0 ;NA -BootSign db 29h ;boot signature 29h -SerialNumber dd 01020304h ;no de serie -DriveName db 'COS2000 ' ;nom de volume -TypeOffAt db 'FAT16 ' ;FAT -bootcode db 453 dup (0) -BootSector ends +struc bootinfo +vendor db 'COS2000A' ;Fabricant + n°série Formatage +sectorsize dw 512 ;octet/secteur +sectorspercluster db 1 ;secteur/cluster +reservedsectors dw 1 ;secteur reserv‚ +fatsperdrive db 2 ;nb de copie de la FAT +directorysize dw 224 ;taille rep racine +sectorsperdrive dw 2880 ;nb secteur du volume si < 32 még +mediadescriptor db 0F0h ;Descripteur de média +sectorsperfat dw 9 ;secteur/FAT +sectorspertrack dw 18 ;secteur/piste +headsperdrive dw 2 ;nb de tˆteb de lecture/écriture +hiddensectorsh dw 0 ;nombre de secteur cach‚s +hiddensectorsl dw 0 ; +sectorperdisk2 dd 0 ;Nombre secteur du volume si > 32 Mo+20h ; the number of sectors +bootdrive db 0 ;Lecteur de d‚marrage +reservedfornt db 0 ;NA +bootsign db 29h ;boot signature 29h +serialnumber dd 01020304h ;no de serie +drivename db 'COS2000 ' ;nom de volume +typeoffat db 'FAT16 ' ;FAT +ends bootinfo diff --git a/include/graphic.h b/include/graphic.h new file mode 100644 index 0000000..5eedb97 --- /dev/null +++ b/include/graphic.h @@ -0,0 +1,4 @@ +struc point +coordx db 0 +coordy db 0 +ends point diff --git a/include/mem.h b/include/mem.h index 9053805..3b78371 100644 --- a/include/mem.h +++ b/include/mem.h @@ -1,11 +1,32 @@ -MB struc -Check dw 'NH' -IsNotLast db 0 -IsResident db 0 -Reference dw 0 -Sizes dw 0 -Names db 24 dup (0) -MB ends +struc mb ;Bloc de mémoire +check db "NH" ;signature du bloc de mémoire +isnotlast db 0 ;flag indiquant le dernier bloc +isresident db 0 ;flag indiquant que le bloc est resident +reference dw 0 ;pointeur vers le bloc parent +sizes dw 0 ;taille du bloc en paragraphe de 16 octet +names db 24 dup (0) ;nom du bloc +ends mb -Free equ 0 -memorystart equ 1000h +struc exe ;Executable COS +checks db "CE" ;signature de l'exe +major db 1 ;N° version +checksum dd 0 ;Checksum de l'exe +compressed db 0 ;a 1 si compressé par RLE +exports dw 0 ;importation de fonctions +imports dw 0 ;exportation de fonctions +sections dw 0 ;sections des blocs mémoire +starting dw 15 +ends exe + +struc descriptor +limit_low dw 0 +base_low dw 0 +base_middle db 0 +dpltype db 0 +limit_high db 0 +base_high db 0 +ends descriptor + + +free equ 0 ;Reference quand libre +memorystart equ 0052h ;premier bloc de la mémoire diff --git a/include/pci.h b/include/pci.h index 380875e..936321d 100644 --- a/include/pci.h +++ b/include/pci.h @@ -1,4 +1,4 @@ -pci Struc +struc pcidata vendor dw 0 ;vendor ID (read-only), FFFFh returned if requested device non-existent device dw 0 ;device ID (read-only) command dw 0 ;command register @@ -6,7 +6,7 @@ status dw 0 ;status register revision db 0 ;revision ID interface db 0 ;programming interface subclass db 0 ;sub-class -class db 0 ;class code +class db 0 ;class code cache db 0 ;cache line size timer db 0 ;latency timer typed db 0 ;header type @@ -16,4 +16,19 @@ typed db 0 ;header type ;02h PCI-to-CardBus bridge ;bit 7: multi-function device result db 0 ;Built-In Self-Test result -pci Ends +ends pcidata + +struc pciinf +version_major db 0 +version_minor db 0 +types db 0 +maxbus db 0 +ends pciinf + +multifunction equ 80h +othercard equ 00h +pci2pcibridge equ 01h +pci2pcicard equ 02h + +config1addr equ 0CF8h +config1data equ 0CFCh diff --git a/install/MAKEFILE b/install/MAKEFILE index b37e0e8..bee0406 100644 --- a/install/MAKEFILE +++ b/install/MAKEFILE @@ -1,16 +1,20 @@ -lnk_boot = tlink /x -asm= tasm /t/m5/zi -lnk= tlink /x/t +asm= lzasm +lnk= elink all: setup.com -setup.com: setup.asm - $(asm) setup - $(lnk) setup +setup.com: setup.obj + $(lnk) setup.obj setup.com + +setup.obj: + $(asm) setup.asm clean: del *.obj del *.exe + del *.bak + del *.lib del *.com + del *.bin del *.sys - del *.err + del *.err \ No newline at end of file diff --git a/install/setup.asm b/install/setup.asm index e55dd8d..949cb11 100644 --- a/install/setup.asm +++ b/install/setup.asm @@ -1,20 +1,21 @@ -.model tiny -.486 -smart -.code +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte org 0100h ent equ 32h -start: -jmp CopyCOS +jmp copycos -Message db 0Dh,0Ah,'COS 2000 V1.2Fr programme d''installation',0Dh,0AH,'Inserez une disquette formatee et appuyez sur entre...',0Dh,0AH,'Attention le contenu de celle ci peut etre altere !!!',0Dh,0AH,'$' -Message2 db 0Dh,0AH,'Creation du secteur de demarrage...',0Dh,0Ah,'$' -Message3 db 0Dh,0AH,'Copie des fichiers systeme...',0Dh,0Ah,'$' -Errormsg db 0Dh,0AH,'Erreur d''installation, contactez moi a COS2000@MULTIMANIA.COM !',0Dh,0AH,'$' -Ok db 0Dh,0AH,'COS2000 a ete correctement installe, veuillez redemarrer votre PC',0Dh,0AH,'$' +message db 0Dh,0Ah,'COS 2000 V1.3.1BetaFr programme d''installation',0Dh,0AH,'Inserez une disquette formatee et appuyez sur entre...',0Dh,0AH,'Attention le contenu de celle ci peut etre altere !!!',0Dh,0AH,'$' +message2 db 0Dh,0AH,'Creation du secteur de demarrage...',0Dh,0Ah,'$' +message3 db 0Dh,0AH,'Copie des fichiers systeme...',0Dh,0Ah,'$' +errormsg db 0Dh,0AH,'Erreur d''installation, contactez moi a COS2000@MULTIMANIA.COM !',0Dh,0AH,'$' +ok db 0Dh,0AH,'COS2000 a ete correctement installe, veuillez redemarrer votre PC',0Dh,0AH,'$' files db '*.*',0 boot db 'boot.bin',0 dat db 'data',0 @@ -53,7 +54,7 @@ copycos: mov dx,offset message3 int 21h allfile: - mov byte ptr [offset dta+43],'$' + mov [byte ptr offset dta+43],'$' mov ah,9 mov dx,offset dta+30 int 21h @@ -97,8 +98,8 @@ allfile: push cs pop es mov di,offset dta+30-3 - mov word ptr [di],":a" - mov byte ptr [di+2],"\" + mov [word ptr di],":a" + mov [byte ptr di+2],"\" xor cx,cx mov dx,di int 21h @@ -118,7 +119,7 @@ allfile: jc error mov ah,4fh int 21h - jnc allfile + jnc allfile mov ah,09 mov dx,offset message2 int 21h @@ -146,7 +147,7 @@ allfile: xor bx,bx int 13h mov ah,09 - mov dx,offset Ok + mov dx,offset ok int 21h xor ax,ax int 16h @@ -160,5 +161,4 @@ error: xor ax,ax int 16h ret - -end start + diff --git a/install/winNT gui/setup.bpr b/install/winNT gui/setup.bpr new file mode 100644 index 0000000..035bc7b --- /dev/null +++ b/install/winNT gui/setup.bpr @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1036 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/install/winNT gui/setup.cpp b/install/winNT gui/setup.cpp new file mode 100644 index 0000000..dec5b3e --- /dev/null +++ b/install/winNT gui/setup.cpp @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORM("Unit1.cpp", Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/install/winNT gui/setup.res b/install/winNT gui/setup.res new file mode 100644 index 0000000..53d1acc Binary files /dev/null and b/install/winNT gui/setup.res differ diff --git a/install/winNT gui/setup.tds b/install/winNT gui/setup.tds new file mode 100644 index 0000000..d4db614 Binary files /dev/null and b/install/winNT gui/setup.tds differ diff --git a/install/winNT gui/unit1.cpp b/install/winNT gui/unit1.cpp new file mode 100644 index 0000000..2b3fc55 --- /dev/null +++ b/install/winNT gui/unit1.cpp @@ -0,0 +1,166 @@ +//--------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#pragma hdrstop + +#include "Unit1.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TForm1 *Form1; +HANDLE hDrive; +DISK_GEOMETRY dg_flop_geom; +AnsiString lecteur="b:"; +AnsiString device="\\\\.\\"+lecteur; +//--------------------------------------------------------------------------- +__fastcall TForm1::TForm1(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- +char * GetLastErrorString(void) +{ + LPVOID lpMsgBuf; + + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, 0, NULL); + + return (char *)lpMsgBuf; +} +//--------------------------------------------------------------------------- +ShowMessages(AnsiString msg) +{ + Form1->Memo1->Lines->Add(msg); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::FormShow(TObject *Sender) +{ +DWORD dwNotUsed; +DWORD error=0; + + hDrive = CreateFile(device.c_str(), GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); + ShowMessages("Ouverture du peripherique "+lecteur); + if (hDrive == INVALID_HANDLE_VALUE) { + ShowMessages("Erreur : "+AnsiString(GetLastErrorString())); + error=1; + } + if(error!=1&&ShowMessages("Determination de la geometrie ")&&DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &dg_flop_geom, sizeof(dg_flop_geom),&dwNotUsed, NULL) == FALSE) { + ShowMessages("Erreur : "+AnsiString(GetLastErrorString())); + error=1; + } + if(error!=1&&(dg_flop_geom.MediaType==FixedMedia||dg_flop_geom.MediaType==RemovableMedia||dg_flop_geom.MediaType==Unknown)) + { + ShowMessages("Erreur : Ceci n'est pas une disquette !"); + error=1; + } + if (error!=1&&ShowMessages("Positionnement sur le secteur 0")&&SetFilePointer(hDrive, 0, NULL, FILE_BEGIN) == -1) { + ShowMessages("Erreur : "+AnsiString(GetLastErrorString())); + error=1; + } + if (error!=1) + { + drive->Caption=lecteur.UpperCase(); + track->Caption=IntToStr(dg_flop_geom.Cylinders.LowPart); + sector->Caption=IntToStr(dg_flop_geom.SectorsPerTrack); + size->Caption=IntToStr(dg_flop_geom.BytesPerSector); + head->Caption=IntToStr(dg_flop_geom.TracksPerCylinder); + allsize->Caption=IntToStr(dg_flop_geom.BytesPerSector*dg_flop_geom.Cylinders.LowPart*dg_flop_geom.SectorsPerTrack*dg_flop_geom.TracksPerCylinder); + allsector->Caption=IntToStr(dg_flop_geom.Cylinders.LowPart*dg_flop_geom.SectorsPerTrack*dg_flop_geom.TracksPerCylinder); + } + else + { + CloseHandle(hDrive); + } +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::Button1Click(TObject *Sender) +{ + if (hDrive == NULL||dg_flop_geom.TracksPerCylinder>2||dg_flop_geom.TracksPerCylinder==0) + + { + ShowMessages("Aucun support valide detecté !"); + } + else + { + int fdboot; + DWORD error=0; + DWORD dwBsWritten; + char * buffer; + AnsiString bootfile="data/boot.bin"; + ShowMessages("Allocation de mémoire "); + buffer = (char *)malloc(dg_flop_geom.BytesPerSector); + ShowMessages("Ouverture et installation du fichier de boot "+bootfile); + if ((fdboot = _rtl_open(bootfile.c_str(),O_RDONLY | O_BINARY)) == -1 ) + { + ShowMessages("Erreur : Fichier de boot introuvable"); + error=1; + } + if (error!=1&&_read(fdboot, buffer, dg_flop_geom.BytesPerSector)!= dg_flop_geom.BytesPerSector) + { + ShowMessages("Erreur : Fichier de boot de taille incorrecte !"); + error=1; + } + if (error!=1&&WriteFile(hDrive, buffer, dg_flop_geom.BytesPerSector, &dwBsWritten, NULL) == 0) + { + ShowMessages("Ecriture impossible sur le secteur de boot !"); + error=1; + } + _rtl_close(fdboot); + if (error!=1) + { + struct ffblk files; + int done; + int number=0; + ShowMessages("Détermination des fichiers a copier"); + done = findfirst("data/*.*",&files,0); + while (!done) + { + number++; + done = findnext(&files); + } + install->Max=number; + install->Min=0; + install->Position=0; + ShowMessages("Copie des fichiers de cos2000"); + done = findfirst("data/*.*",&files,0); + while (!done) + { + ShowMessages(AnsiString(files.ff_name).LowerCase()); + if (!CopyFile((AnsiString("data/")+AnsiString(files.ff_name)).c_str(),(lecteur+"\\"+AnsiString(files.ff_name)).c_str(),false)) + { + ShowMessages("Erreur : fichier impossible a copier"+AnsiString(GetLastErrorString())); + error=1; + break; + } + done = findnext(&files); + install->Position++; + } + if (!error) + { + ShowMessages("Installation terminée !"); + Button2->Visible=false; + Button1->Visible=false; + Button3->Visible=true; + } + else + ShowMessages("Installation echoué !"); + } + free(buffer); + } +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) +{ + CloseHandle(hDrive); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::Button3Click(TObject *Sender) +{ +Close(); +} +//--------------------------------------------------------------------------- diff --git a/install/winNT gui/unit1.ddp b/install/winNT gui/unit1.ddp new file mode 100644 index 0000000..cdc0ee8 Binary files /dev/null and b/install/winNT gui/unit1.ddp differ diff --git a/install/winNT gui/unit1.dfm b/install/winNT gui/unit1.dfm new file mode 100644 index 0000000..b0445c3 --- /dev/null +++ b/install/winNT gui/unit1.dfm @@ -0,0 +1,184 @@ +object Form1: TForm1 + Left = 418 + Top = 273 + Width = 599 + Height = 371 + Caption = 'Installation de COS2000' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnClose = FormClose + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 288 + Top = 304 + Width = 75 + Height = 25 + Caption = 'installer...' + TabOrder = 0 + OnClick = Button1Click + end + object install: TProgressBar + Left = 16 + Top = 264 + Width = 553 + Height = 25 + Min = 0 + Max = 100 + TabOrder = 1 + end + object Button2: TButton + Left = 208 + Top = 304 + Width = 75 + Height = 25 + Caption = 'support' + TabOrder = 2 + OnClick = FormShow + end + object Memo1: TMemo + Left = 192 + Top = 24 + Width = 377 + Height = 225 + ReadOnly = True + TabOrder = 3 + end + object GroupBox1: TGroupBox + Left = 16 + Top = 120 + Width = 161 + Height = 129 + Caption = 'G'#233'om'#233'trie' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 4 + object track: TLabel + Left = 96 + Top = 60 + Width = 31 + Height = 13 + Caption = 'Aucun' + end + object Label4: TLabel + Left = 24 + Top = 60 + Width = 34 + Height = 13 + Caption = 'Pistes :' + end + object Label5: TLabel + Left = 24 + Top = 28 + Width = 48 + Height = 13 + Caption = 'Secteurs :' + end + object sector: TLabel + Left = 96 + Top = 28 + Width = 31 + Height = 13 + Caption = 'Aucun' + end + object head: TLabel + Left = 96 + Top = 44 + Width = 31 + Height = 13 + Caption = 'Aucun' + end + object Label6: TLabel + Left = 24 + Top = 44 + Width = 33 + Height = 13 + Caption = 'Tetes :' + end + object Label8: TLabel + Left = 24 + Top = 84 + Width = 69 + Height = 13 + Caption = 'Taille secteur :' + end + object size: TLabel + Left = 96 + Top = 84 + Width = 31 + Height = 13 + Caption = 'Aucun' + end + end + object GroupBox2: TGroupBox + Left = 16 + Top = 16 + Width = 161 + Height = 97 + Caption = 'Support' + TabOrder = 5 + object Label1: TLabel + Left = 24 + Top = 24 + Width = 42 + Height = 13 + Caption = 'Lecteur :' + end + object drive: TLabel + Left = 88 + Top = 24 + Width = 31 + Height = 13 + Caption = 'Aucun' + end + object Label2: TLabel + Left = 24 + Top = 40 + Width = 31 + Height = 13 + Caption = 'Taille :' + end + object allsize: TLabel + Left = 88 + Top = 40 + Width = 31 + Height = 13 + Caption = 'Aucun' + end + object Label3: TLabel + Left = 24 + Top = 56 + Width = 58 + Height = 13 + Caption = 'N'#176'secteurs :' + end + object allsector: TLabel + Left = 88 + Top = 56 + Width = 31 + Height = 13 + Caption = 'Aucun' + end + end + object Button3: TButton + Left = 248 + Top = 304 + Width = 75 + Height = 25 + Caption = 'Quitter' + TabOrder = 6 + Visible = False + OnClick = Button3Click + end +end diff --git a/install/winNT gui/unit1.h b/install/winNT gui/unit1.h new file mode 100644 index 0000000..6d0d3a7 --- /dev/null +++ b/install/winNT gui/unit1.h @@ -0,0 +1,47 @@ +//--------------------------------------------------------------------------- + +#ifndef Unit1H +#define Unit1H +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class TForm1 : public TForm +{ +__published: // IDE-managed Components + TButton *Button1; + TProgressBar *install; + TButton *Button2; + TMemo *Memo1; + TGroupBox *GroupBox1; + TLabel *track; + TLabel *Label4; + TLabel *Label5; + TLabel *sector; + TLabel *head; + TLabel *Label6; + TLabel *Label8; + TLabel *size; + TGroupBox *GroupBox2; + TLabel *Label1; + TLabel *drive; + TLabel *Label2; + TLabel *allsize; + TLabel *Label3; + TLabel *allsector; + TButton *Button3; + void __fastcall FormShow(TObject *Sender); + void __fastcall Button1Click(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall Button3Click(TObject *Sender); +private: // User declarations +public: // User declarations + __fastcall TForm1(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TForm1 *Form1; +//--------------------------------------------------------------------------- +#endif diff --git a/lib/MAKEFILE b/lib/MAKEFILE new file mode 100644 index 0000000..a66c89b --- /dev/null +++ b/lib/MAKEFILE @@ -0,0 +1,26 @@ +asm= lzasm +lnk= elink + +all: detect.lib video.lib + +detect.lib: detect.obj + $(lnk) detect.obj detect.lib + +video.lib: video.obj + $(lnk) video.obj video.lib + +detect.obj: + $(asm) detect.asm + +video.obj: + $(asm) video.asm + +clean: + del *.obj + del *.exe + del *.bak + del *.lib + del *.com + del *.bin + del *.sys + del *.err \ No newline at end of file diff --git a/lib/bmp.asm b/lib/bmp.asm new file mode 100644 index 0000000..114b1ab --- /dev/null +++ b/lib/bmp.asm @@ -0,0 +1,114 @@ +.model tiny +.486 +smart +locals +.code +org 0h + +include ..\include\mem.h +include ..\include\bmp.h + +start: +header exe <,1,0,,,,offset exports,> + +exports: + db "showbmp",0 + dw showbmp + db "loadbmppalet",0 + dw loadbmppalet + dw 0 + + +;==========SHOWBMP========= +;Affiche le BMP pointée par DS:%0 en %1, %2 +;<- DS:%0 BMP, %1 coordonnées X, %2 coordonnées Y +;-> +;========================== +showbmp PROC FAR + ARG pointer:word, x:word, y:word=taille + push bp + mov bp,sp + push ax bx cx dx si di + mov si,[pointer] + cmp word ptr [si+BMP_file.BMP_FileType],"MB" + jne @@errorshowing + mov edi,[si+BMP_BitMapOffset] + add di,si + mov ah,8 + xor ebx,ebx + mov ecx,[si+offset BMP_File.BMP_height] + mov edx,[si+offset BMP_File.BMP_width] + and dx,11111100b + cmp edx,[si+offset BMP_File.BMP_width] + jae @@noadjust + add dx,4 +@@noadjust: + sub dx,[si+offset BMP_File.BMP_width] +@@bouclette: + mov al,[di] + push bx cx + add bx,[x] + add cx,[y] + int 47h + pop cx bx + inc bx + inc di + cmp ebx,[si+offset BMP_File.BMP_width] + jb @@bouclette + xor bx,bx + add di,dx + dec cx + cmp cx,0 + jne @@bouclette + clc + pop di si dx cx bx ax + pop bp + retf taille + +@@errorshowing: + stc + pop di si cx bx ax + pop bp + retf taille + +showbmp ENDP + + +;==========LOADBMPPALET========= +;Charge la palette du BMP pointée par DS:%0 +;-> DS:%0 BMP +;<- +;=============================== +loadbmppalet PROC FAR + ARG pointer:word=taille + push bp + mov bp,sp + push ax bx cx dx si + mov si,[pointer] + mov bx,0400h+36h-4 + mov cx,100h + mov dx, 3c8h +paletteload: + mov al, cl + dec al + out dx, al + inc dx + mov al,[bx+si+2] + shr al,2 + out dx, al + mov al,[bx+si+1] + shr al,2 + out dx, al + mov al,[bx+si] + shr al,2 + out dx, al + sub bx,4 + dec dx + dec cl + jnz paletteload + pop si dx cx bx ax + pop bp + retf taille +loadbmppalet ENDP + +end start diff --git a/lib/detect.asm b/lib/detect.asm new file mode 100644 index 0000000..7d87ead --- /dev/null +++ b/lib/detect.asm @@ -0,0 +1,772 @@ +model tiny,stdcall +p586 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\cpu.h" +include "..\include\pci.h" + +org 0h + +header exe <"CE",1,0,0,offset exports,,,> + +exports: + db "cpuinfo",0 + dw cpuinfo + db "setinfo",0 + dw setinfo + db "pciinfo",0 + dw pciinfo + db "getpciclass",0 + dw getpciclass + db "getpcisubclass",0 + dw getpcisubclass + db "getcardinfo",0 + dw getcardinfo + db "pcireadbyte",0 + dw pcireadbyte + db "pcireadword",0 + dw pcireadword + db "pcireaddword",0 + dw pcireaddword + db "detectvmware",0 + dw detectvmware + dd 0 + +PROC detectvmware FAR + USES eax,ebx,ecx,edx + mov eax,564D5868h + mov ebx,12345h + mov ecx,00Ah + mov edx,5658h + in ax,dx + cmp ebx,564D5868h + ret +endp detectvmware + +;renvoie un pointer dx:ax vers la classe %0 +PROC getpciclass FAR + ARG @class:word + USES di + mov di,[@class] + and di,0FFh + shl di,1 + mov ax,[cs:offset classes+di] + mov dx,cs + ret +endp getpciclass + +;renvoie un pointer dx:ax vers la sous-classe de %1 et de classe %0 +PROC getpcisubclass FAR + ARG @class:word,@subclass:word + USES di + mov di,[@class] + and di,0FFh + shl di,1 + mov di,[cs:offset classesd+di] + mov dx,[@subclass] + and dx,0FFh + cmp dx,80h + jne @@suiteac + mov ax,offset divers + jmp @@found +@@suiteac: + shl dx,1 + add di,dx + mov ax,[cs:di] +@@found: + mov dx,cs + ret +endp getpcisubclass + +divers db 'divers',0 + +classes: +dw offset class0 +dw offset class1 +dw offset class2 +dw offset class3 +dw offset class4 +dw offset class5 +dw offset class6 +dw offset class7 +dw offset class8 +dw offset class9 +dw offset class10 +dw offset class11 +dw offset class12 +dw offset class13 +dw offset class14 +dw offset class15 +dw offset class16 +dw offset class17 +class0 db 'ancien',0 +class1 db 'stockage',0 +class2 db 'reseau',0 +class3 db 'affichage',0 +class4 db 'multimedia',0 +class5 db 'memoire',0 +class6 db 'pont',0 +class7 db 'communication',0 +class8 db 'systeme',0 +class9 db 'acquisition',0 +class10 db 'dock',0 +class11 db 'processeur',0 +class12 db 'bus serie',0 +class13 db 'sans fil',0 +class14 db 'intelligent',0 +class15 db 'satellite',0 +class16 db 'cryptage',0 +class17 db 'traitement signal',0 + + +;Classes et sous classes +classesd: +dw offset class0d +dw offset class1d +dw offset class2d +dw offset class3d +dw offset class4d +dw offset class5d +dw offset class6d +dw offset class7d +dw offset class8d +dw offset class9d +dw offset class10d +dw offset class11d +dw offset class12d +dw offset class13d +dw offset class14d +dw offset class15d +dw offset class16d +dw offset class17d + +class0d: +dw offset subclass00 +dw offset subclass01 +subclass00 db 'divers',0 +subclass01 db 'vga',0 + +class1d: +dw offset subclass10 +dw offset subclass11 +dw offset subclass12 +dw offset subclass13 +dw offset subclass14 +subclass10 db 'scsi',0 +subclass11 db 'ide',0 +subclass12 db 'disquette',0 +subclass13 db 'ipi',0 +subclass14 db 'raid',0 + +class2d: +dw offset subclass20 +dw offset subclass21 +dw offset subclass22 +dw offset subclass23 +dw offset subclass24 +subclass20 db 'ethernet',0 +subclass21 db 'token ring',0 +subclass22 db 'fddi',0 +subclass23 db 'atm',0 +subclass24 db 'isdn',0 + +class3d: +dw offset subclass30 +dw offset subclass31 +dw offset subclass32 +subclass30 db 'vga',0 +subclass31 db 'xga',0 +subclass32 db '3D',0 + +class4d: +dw offset subclass40 +dw offset subclass41 +dw offset subclass42 +subclass40 db 'video',0 +subclass41 db 'audio',0 +subclass42 db 'telephonie',0 + +class5d: +dw offset subclass50 +dw offset subclass51 +subclass50 db 'ram',0 +subclass51 db 'flash',0 + +class6d: +dw offset subclass60 +dw offset subclass61 +dw offset subclass62 +dw offset subclass63 +dw offset subclass64 +dw offset subclass65 +dw offset subclass66 +dw offset subclass67 +dw offset subclass68 +subclass60 db 'hote',0 +subclass61 db 'isa',0 +subclass62 db 'eisa',0 +subclass63 db 'mca',0 +subclass64 db 'pci',0 +subclass65 db 'pcmcia',0 +subclass66 db 'nubus',0 +subclass67 db 'cardbus',0 +subclass68 db 'RACEway',0 + +class7d: +dw offset subclass70 +dw offset subclass71 +dw offset subclass72 +dw offset subclass73 +subclass70 db 'serie',0 +subclass71 db 'parallele',0 +subclass72 db 'serie multiport',0 +subclass73 db 'modem',0 + +class8d: +dw offset subclass80 +dw offset subclass81 +dw offset subclass82 +dw offset subclass83 +dw offset subclass84 +subclass80 db 'pic',0 +subclass81 db 'dma',0 +subclass82 db 'timer',0 +subclass83 db 'rtc',0 +subclass84 db 'hotplug',0 + +class9d: +dw offset subclass90 +dw offset subclass91 +dw offset subclass92 +dw offset subclass93 +dw offset subclass94 +subclass90 db 'clavier',0 +subclass91 db 'stylo',0 +subclass92 db 'souris',0 +subclass93 db 'scanner',0 +subclass94 db 'joystick',0 + +class10d: +dw offset subclass100 +subclass100 db 'station',0 + +class11d: +dw offset subclass110 +dw offset subclass111 +dw offset subclass112 +dw offset subclass113 +dw offset subclass114 +subclass110 db '386',0 +subclass111 db '486',0 +subclass112 db 'pentium',0 +subclass113 db 'alpha',0 +subclass114 db 'coprocesseur',0 + +class12d: +dw offset subclass120 +dw offset subclass121 +dw offset subclass122 +dw offset subclass123 +dw offset subclass124 +dw offset subclass125 +subclass120 db 'firewire',0 +subclass121 db 'access',0 +subclass122 db 'ssa',0 +subclass123 db 'usb',0 +subclass124 db 'fibre',0 +subclass125 db 'smbus',0 + +class13d: +dw offset subclass130 +dw offset subclass131 +dw offset subclass132 +subclass130 db 'irda',0 +subclass131 db 'ir',0 +subclass132 db 'rf',0 + +class14d: +dw offset subclass140 +subclass140 db 'IO arch',0 + +class15d: +dw offset subclass150 +dw offset subclass151 +dw offset subclass152 +dw offset subclass153 +subclass150 db 'tv',0 +subclass151 db 'audio',0 +subclass152 db 'voix',0 +subclass153 db 'donnees',0 + +class16d: +dw offset subclass160 +dw offset subclass161 +subclass160 db 'reseau',0 +subclass161 db 'jeux',0 + +class17d: +dw offset subclass170 +subclass170 db 'dpio',0 + + +;al=bus cl=deviceid ch=func es:di +PROC getcardinfo FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES eax,bx,di + cmp [@function],0 + je @@amultiorfirst + call pcireadbyte,[@bus],[@device],0,offset (pcidata).typed + and al,multifunction + cmp al,0 + jne @@amultiorfirst + mov [word ptr di],0000h + jmp @@notexist +@@amultiorfirst: + xor bx,bx + mov di,[@pointer] +@@goinfos: + call pcireadword,[@bus],[@device],[@function],bx + inc bl + inc bl + cmp bl,2 + ja @@notzarb + cmp ax,0FFFFh + je @@notexist + cmp ax,00000h + je @@notexist +@@notzarb: + mov [ds:di],ax + inc di + inc di + cmp bl,40h + jbe @@goinfos + clc + ret +@@notexist: + stc + ret +endp getcardinfo + +;lit un octet du bus %0 device %1 function %2 n° %3 et le met en AL +PROC pcireadbyte FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES bx,dx + mov al,[byte ptr @bus] + mov ah,80h + shl eax,16 + mov ah,[byte ptr @device] + shl ah,3 + or ah,[byte ptr @function] + mov bl,[byte ptr @pointer] + mov al,bl + and al,0fch + mov dx,config1addr + out dx,eax + mov dx,config1data + and bl,3 + or dl,bl + in al,dx + ret +endp pcireadbyte + +;lit 2 octet du bus %0 device %1 function %2 n° %3 et le met en AX +PROC pcireadword FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES bx,dx + mov al,[byte ptr @bus] + mov ah,80h + shl eax,16 + mov ah,[byte ptr @device] + shl ah,3 + or ah,[byte ptr @function] + mov bl,[byte ptr @pointer] + mov al,bl + and al,0fch + mov dx,config1addr + out dx,eax + mov dx,config1data + and bl,3 + or dl,bl + in ax,dx + ret +endp pcireadword + +;lit 4 octet du bus %0 device %1 function %2 n° %3 et le met en EAX +PROC pcireaddword FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES bx,dx + mov al,[byte ptr @bus] + mov ah,80h + shl eax,16 + mov ah,[byte ptr @device] + shl ah,3 + or ah,[byte ptr @function] + mov bl,[byte ptr @pointer] + mov al,bl + and al,0fch + mov dx,config1addr + out dx,eax + mov dx,config1data + and bl,3 + or dl,bl + in eax,dx + ret +endp pcireaddword + +;Prob avec str pci +;renvoie en %0 la structure pciinf carry if error +PROC pciinfo FAR + ARG @pointer:word + USES ax,bx,cx,edx,edi + mov ax,0B101h + xor edi,edi + mov edx," PCI" + int 1Ah + jc @@errorpci + cmp dx,04350h + jne @@errorpci + cmp ah,0 + jne @@errorpci + mov di,[@pointer] + mov [(pciinf di).version_major],bh + mov [(pciinf di).version_minor],bl + mov [(pciinf di).types],al + mov [(pciinf di).maxbus],cl + clc + ret +@@errorpci: + stc + ret +endp pciinfo + + +;retourne en DS:%1 les set supporté du processeur par rapport a la struct %0 +PROC setinfo FAR + ARG @pointer:word,@set:word + USES bx,si,di + mov di,[@set] + lea si,[ds:cpu.mmx] + add si,[@pointer] + mov bx,offset @@theset +@@set: + cmp [word ptr cs:bx],0FFFFh + je @@endofset + cmp [byte ptr si],1 + jne @@nextset + push bx + mov bx,[cs:bx] +@@put: + mov al,[cs:bx] + cmp al,0 + je @@enofput + mov [di],al + inc bx + inc di + jmp @@put +@@enofput: + pop bx + @@nextset: + inc bx + inc bx + inc si + jmp @@set + @@endofset: + mov [byte ptr di],0 + ret + +@@theset dw offset @@mmx + dw offset @@mmx2 + dw offset @@sse + dw offset @@sse2 + dw offset @@sse3 + dw offset @@fpu + dw offset @@now3d + dw offset @@now3d2 + dw offset @@htt + dw offset @@apic + dw 0FFFFh + +@@mmx db "MMX ",0 +@@mmx2 db "MMX2 ",0 +@@now3d db "3dNow! ",0 +@@now3d2 db "3dNow Extended! ",0 +@@htt db "HyperThreading",0 +@@sse db "SSE ",0 +@@sse2 db "SSE2 ",0 +@@sse3 db "SSE3 ",0 +@@apic db "APIC ",0 +@@fpu db "FPU ",0 + +endp setinfo + +;retourne en DS:%0 les capacités du processeur +PROC cpuinfo FAR + ARG @pointer:word + USES eax,ebx,ecx,edx,si,di,ds,es + push ds + pop es + mov di,[@pointer] + mov al,0 + mov cx,size cpu + cld + rep stosb + mov di,[@pointer] + call nocpuid ;Test si cpuid est dispo + je @@nocpuidatall + xor eax,eax + cpuid ;Fonction 0 de CPUID + mov [dword ptr (cpu di).vendor],ebx ;Vendeur sur 13 octets + mov [dword ptr (cpu di+4).vendor],edx + mov [dword ptr (cpu di+8).vendor],ecx + mov [byte ptr (cpu di+12).vendor],0 + cmp eax,1 + jb @@nofonc1 + mov eax,1 + cpuid ;Fonction 1 de CPUID + mov ebx,eax ;infos de model + and ebx,1111b + mov [(cpu di).stepping],bl + shr eax,4 + mov ebx,eax + and ebx,1111b + mov [(cpu di).models],bl + shr eax,4 + mov ebx,eax + and ebx,1111b + mov [(cpu di).family],bl + shr eax,4 + mov ebx,eax + and ebx,11b + mov [(cpu di).types],bl + shr eax,2 + mov ebx,eax + and ebx,1111b + mov [(cpu di).emodels],bl + shr eax,4 + mov [(cpu di).efamily],al + mov ebx,edx + and ebx,1 ;infos de jeu d'instruction + setnz [(cpu di).fpu] + mov ebx,edx + and ebx,100000000000000000000000b + setnz [(cpu di).mmx] + mov ebx,edx + and ebx,10000000000000000000000000b + setnz [(cpu di).sse] + mov ebx,edx + and ebx,100000000000000000000000000b + setnz [(cpu di).sse2] + mov ebx,ecx + and ebx,1b + setnz [(cpu di).sse3] + mov ebx,edx + and ebx,10000000000000000000000000000b + setnz [(cpu di).htt] +@@nofonc1: + mov eax,80000000h ;Fonction 80000000 de CPUID + cpuid + cmp eax,80000001h + jb @@nofonc8 + mov eax,80000001h ;Fonction 80000000 de CPUID + cpuid + mov ebx,edx + and ebx,10000000000000000000000b + setnz [(cpu di).mmx2] + mov ebx,edx + and ebx,1000000000000000000000000000000b + setnz [(cpu di).now3d] + mov ebx,edx + and ebx,10000000000000000000000000000000b + setnz [(cpu di).now3d2] + mov ebx,edx + and ebx,1000000000b + setnz [(cpu di).apic] +@@nofonc8: + mov si,offset @@marks + push cs + pop ds +@@search: + mov di,[@pointer] + mov cx,12 + cld + rep cmpsb + jne @@notthegood + cmp cx,0 + jne @@notthegood + mov cl,[si] + inc si + mov di,[@pointer] + cld + rep movsb + mov al,0 + stosb + mov di,[@pointer] + cmp [es:(cpu di).family],15 + jne @@notextended + mov al,[es:(cpu di).efamily] + mov ah,[es:(cpu di).emodels] + mov di,[si+2] + jmp @@searchmodel +@@notextended: + mov al,[es:(cpu di).family] + mov ah,[es:(cpu di).models] + mov di,[si] +@@searchmodel: + cmp [di],ax + jne @@notgoodfamily + mov si,di + inc si + inc si + lea di,[es:cpu.names] + add di,[@pointer] +@@copystr: + mov al,[si] + mov [es:di],al + inc si + inc di + cmp al,0 + jne @@copystr + jmp @@endofsearch +@@notgoodfamily: + inc di +@@nextelement: + inc di + cmp [byte ptr di-1],0 + jne @@nextelement + jmp @@searchmodel +@@notthegood: + inc si + cmp [word ptr si],0FFFFh + jne @@notthegood + inc si + inc si + cmp [word ptr si],0FFFFh + je @@endofsearch + jmp @@search +@@endofsearch: + ret +@@nocpuidatall: + ret + +;tableau avec vendeur taille + chainereelle + pointeur famille + pointeur famille etendue + +@@marks db "GenuineIntel",5,"Intel" + dw @@intelfamily,@@intelfamilye + dw 0FFFFh + + db "AuthenticAMD",3,"Amd" + dw @@amdfamily,@@amdfamilye + dw 0FFFFh + + db "CyrixInstead",5,"Cyrix" + dw @@cyrixfamily,@@cyrixfamilye + dw 0FFFFh + dw 0FFFFh + + +;tableau avec famille modele et chaine 0 + +@@intelfamily: +db 4,0,"486 DX-25/33",0 +db 4,1,"486 DX-50",0 +db 4,2,"486 SX",0 +db 4,3,"486 DX/2",0 +db 4,4,"486 SL",0 +db 4,5,"486 SX/2",0 +db 4,7,"486 DX/2-WB",0 +db 4,8,"486 DX/4",0 +db 4,9,"486 DX/4-WB",0 +db 5,0,"Pentium 60/66 A-step",0 +db 5,1,"Pentium 60/66",0 +db 5,2,"Pentium 75 - 200",0 +db 5,3,"OverDrive PODP5V83",0 +db 5,4,"Pentium MMX",0 +db 5,7,"Mobile Pentium 75-200",0 +db 5,8,"Mobile Pentium MMX",0 +db 6,0,"Pentium Pro A-step",0 +db 6,1,"Pentium Pro",0 +db 6,3,"Pentium II (Klamath)",0 +db 6,5,"Pentium II (Deschutes)",0 +db 6,6,"Mobile Pentium II",0 +db 6,7,"Pentium III (Katmai)",0 +db 6,8,"Pentium III (Coppermine)",0 +db 6,9,"Mobile Pentium III",0 +db 6,10,"Pentium III (0.18 µm)",0 +db 6,11,"Pentium III (0.13 µm)",0 +db 7,0,"Itanium (IA-64)",0 +db 0FFh,0FFh,"Inconnu",0 + +@@intelfamilye: +db 0,0,"Pentium IV (0.18 µm)",0 +db 0,1,"Pentium IV (0.18 µm)",0 +db 0,2,"Pentium IV (0.13 µm)",0 +db 0,3,"Pentium IV (0.09 µm)",0 +db 1,0,"Itanium 2 (IA-64)",0 +db 0FFh,0FFh,"Inconnu",0 + +@@amdfamily: +db 4,3,"486 DX/2",0 +db 4,7,"486 DX/2-WB",0 +db 4,8,"486 DX/4",0 +db 4,9,"486 DX/4-WB",0 +db 4,14,"Am5x86-WT",0 +db 4,15,"Am5x86-WB",0 +db 5,0,"K5/SSA5",0 +db 5,1,"K5 (PR120/133)",0 +db 5,2,"K5 (PR166)",0 +db 5,3,"K5 (PR200)",0 +db 5,6,"K6 (0.30 µm)",0 +db 5,7,"K6 (0.25 µm)",0 +db 5,8,"K6-2",0 +db 5,9,"K6-3",0 +db 5,13,"K6-2+/K6-III+ (0.18 µm)",0 +db 6,0,"Athlon (25 µm)",0 +db 6,1,"Athlon (25 µm)",0 +db 6,2,"Athlon (18 µm)",0 +db 6,3,"Duron",0 +db 6,4,"Athlon (Thunderbird)",0 +db 6,6,"Athlon (Palamino)",0 +db 6,7,"Duron (Morgan)",0 +db 6,8,"Athlon (Thoroughbred)",0 +db 6,10,"Athlon (Barton)",0 +db 0FFh,0FFh,"Inconnu",0 + +@@amdfamilye: +db 0,4,"Athlon 64",0 +db 0,5,"Athlon 64 FX/Opteron",0 +db 0FFh,0FFh,"Inconnu",0 + +@@cyrixfamily: +db 4,4,"MediaGX",0 +db 5,2,"6x86/6x86L",0 +db 5,4,"MediaGX MMX Enhanced",0 +db 6,0,"MII (6x86MX)",0 +db 6,5,"VIA Cyrix M2 core",0 +db 6,6,"WinChip C5A",0 +db 6,7,"WinChip C5B/WinChip C5C",0 +db 6,8,"WinChip C5N",0 +db 6,9,"WinChip C5XL/WinChip C5P",0 +db 0FFh,0FFh,"Inconnu",0 + +@@cyrixfamilye: +db 0FFh,0FFh,"Inconnu",0 + +endp cpuinfo + +;Test si CPUID est supporté oui=not Equal +nocpuid: + pushfd + pop eax + xor eax,00200000h + push eax + popfd + pushfd + pop eax + cmp eax,ebx + ret + + diff --git a/lib/video.asm b/lib/video.asm new file mode 100644 index 0000000..c90b916 --- /dev/null +++ b/lib/video.asm @@ -0,0 +1,907 @@ +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" + +org 0h + +header exe <"CE",1,0,0,offset exports,offset imports,,> + +exports: + db "print",0 + dw print + db "showdate",0 + dw showdate + db "showtime",0 + dw showtime + db "showname",0 + dw showname + db "showattr",0 + dw showattr + db "showsize",0 + dw showsize + db "showspace",0 + dw showspace + db "showint",0 + dw showint + db "showsigned",0 + dw showsigned + db "showhex",0 + dw showhex + db "showbin",0 + dw showbin + db "showbcd",0 + dw showbcd + db "showstring",0 + dw showstring + db "showstring0",0 + dw showstring0 + db "showintr",0 + dw showintr + db "showintl",0 + dw showintl + dw 0 + +imports: + db "VIDEO::addline",0 +addline dd 0 + db "VIDEO::setcolor",0 +setcolor dd 0 + db "VIDEO::getxy",0 +getxy dd 0 + db "VIDEO::setxy",0 +setxy dd 0 + db "VIDEO::setvideomode",0 +setvideomode dd 0 + db "VIDEO::setfont",0 +setfont dd 0 + db "VIDEO::clearscreen",0 +clearscreen dd 0 + db "VIDEO::enablescroll",0 +enablescroll dd 0 + db "VIDEO::disablescroll",0 +disablescroll dd 0 + db "VIDEO::showchar",0 +showchar dd 0 + dw 0 + +;================PRINT============== +;Affiche la chaine %0 en utilisant les parametres de formatage %x....%x +;-> %0 %x +;<- +;=================================== +PROC print FAR + ARG @@pointer:word + push ax bx cx si di + xor di,di + mov si,[@@pointer] +@@strinaize0: + mov cl,[si] + cmp cl,0 + je @@no0 + cmp cl,'%' + je @@special + cmp cl,'\' + je @@special2 +@@showit: + xor ch,ch + call [cs:showchar],cx,0FFFFh + inc si + jmp @@strinaize0 +@@special: + cmp [byte ptr si+1],'%' + jne @@notshowit + inc si + jmp @@showit +@@notshowit: + mov cl,[byte ptr si+1] + cmp cl,'c' + je @@showchar + cmp cl,'u' + je @@showint + cmp cl,'v' + je @@showfixint + cmp cl,'w' + je @@showintr + cmp cl,'i' + je @@showsigned + cmp cl,'h' + je @@showhex + cmp cl,'b' + je @@showbin + cmp cl,'s' + je @@showstring + cmp cl,'0' + je @@showstring0 + cmp cl,'y' + je @@showbcd + cmp cl,'z' + je @@showsize + cmp cl,'a' + je @@showattr + cmp cl,'n' + je @@showname + cmp cl,'t' + je @@showtime + cmp cl,'d' + je @@showdate + clc + jmp @@no0 + +@@showchar: + cmp [byte ptr si+2],'M' + je @@showmultchar + call [cs:showchar],[word ptr @@pointer+di+2],0FFFFh + add si,2 + add di,2 + jmp @@strinaize0 +@@showmultchar: + mov cx,[offset @@pointer+di+2+2] + cmp cx,0 + je @@nextfunc +@@showcharx: + call [cs:showchar],[word ptr @@pointer+di+2],0FFFFh + dec cx + jnz @@showcharx +@@nextfunc: + add si,3 + add di,4 + jmp @@strinaize0 + +@@showint: + call showint,[dword ptr @@pointer+di+2] + add si,2 + add di,4 + jmp @@strinaize0 + +@@showfixint: + call showintl,[word ptr @@pointer+di+6],[dword ptr @@pointer+di+2] + add di,6 + add si,2 + jmp @@strinaize0 + +@@showintr: + call showintr,[word ptr @@pointer+di+6],[dword ptr @@pointer+di+2] + add di,6 + add si,2 + jmp @@strinaize0 + +@@showsigned: + call @@Chosesize + call showsigned + jmp @@strinaize0 + +@@showhex: + call @@Chosesize + call showhex + jmp @@strinaize0 + +@@showbin: + call @@Chosesize + call showbin + jmp @@strinaize0 + +@@showstring: + cmp [byte ptr si+2],'P' + je @@showstring@@pointer + call showstring,[word ptr @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 +@@showstring@@pointer: + push ds + mov ds,[offset @@pointer+di+2+2] + call showstring,[word ptr @@pointer+di+2] + add si,3 + add di,4 + pop ds + jmp @@strinaize0 + +@@showstring0: + cmp [byte ptr si+2],'P' + je @@showstring0@@pointer + call showstring0,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 +@@showstring0@@pointer: + push ds + mov ds,[offset @@pointer+di+2+2] + call showstring0,[word ptr offset @@pointer+di+2] + add si,3 + add di,4 + pop ds + jmp @@strinaize0 + +@@showbcd: + call @@Chosesize + call showbcd + jmp @@strinaize0 + +@@showsize: + call showsize,[dword ptr offset @@pointer+di+2] + add si,2 + add di,4 + jmp @@strinaize0 + +@@showattr: + call showattr,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@showname: + call showname,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@showtime: + call showtime,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@showdate: + call showdate,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@Chosesize: + pop cx + push [dword ptr offset @@pointer+di+2] + add di,4 + cmp [byte ptr si+2],'B' + je @@byte + cmp [byte ptr si+2],'W' + je @@word + cmp [byte ptr si+2],'D' + je @@dword + dec si + +@@word: + push 16 + add si,3 + push cx + retn + +@@byte: + push 8 + add si,3 + push cx + retn + +@@dword: + push 32 + add si,3 + push cx + retn + +@@special2: + cmp [byte ptr si+1],'\' + jne @@notshowit2 + inc si + jmp @@showit +@@notshowit2: + mov cl,[byte ptr si+1] + cmp cl,'l' + je @@showline + cmp cl,'g' + je @@goto + cmp cl,'h' + je @@gotox + cmp cl,'c' + je @@color + cmp cl,'m' + je @@setvideomode + cmp cl,'e' + je @@clearscreen + cmp cl,'s' + je @@savestate + cmp cl,'r' + je @@restorestate + cmp cl,'i' + je @@enablescroll + cmp cl,'j' + je @@disablescroll + cmp cl,'f' + je @@setfont + clc + jmp @@no0 + +@@color: + mov al,[si+2] + sub al,'0' + shl al,4 + add al,[si+3] + sub al,'0' + xor ah,ah + call [cs:setcolor],ax + add si,4 + jmp @@strinaize0 + +@@gotox: + mov bh,[si+2] + sub bh,'0' + mov bl,bh + shl bl,3 + add bl,bh + add bl,bh + add bl,[si+3] + sub bl,'0' + xor bh,bh + call [cs:getxy] + xor ah,ah + call [cs:setxy],bx,ax + add si,4 + jmp @@strinaize0 + +@@setvideomode: + mov ah,[si+2] + sub ah,'0' + mov al,ah + shl al,3 + add al,ah + add al,ah + add al,[si+3] + sub al,'0' + xor ah,ah + call [cs:setvideomode] + add si,4 + jmp @@strinaize0 + +@@setfont: + mov ah,[si+2] + sub ah,'0' + mov al,ah + shl al,3 + add al,ah + add al,ah + add al,[si+3] + sub al,'0' + xor ah,ah + call [cs:setfont],ax + add si,4 + jmp @@strinaize0 + +@@showline: + call [cs:addline] + add si,2 + jmp @@strinaize0 + +@@clearscreen: + call [cs:clearscreen] + add si,2 + jmp @@strinaize0 + +@@savestate: + mov ah,40 + int 47h + add si,2 + jmp @@strinaize0 + +@@restorestate: + mov ah,41 + int 47h + add si,2 + jmp @@strinaize0 + +@@enablescroll: + call [cs:enablescroll] + add si,2 + jmp @@strinaize0 + +@@disablescroll: + call [cs:disablescroll] + add si,2 + jmp @@strinaize0 + +@@goto: + mov ah,[si+2] + sub ah,'0' + mov al,ah + shl al,3 + add al,ah + add al,ah + add al,[si+3] + sub al,'0' + xor ah,ah + ; + mov bh,[si+5] + sub bh,'0' + mov bl,bh + shl bl,3 + add bl,bh + add bl,bh + add bl,[si+6] + sub bl,'0' + xor bh,bh + call [cs:setxy],ax,bx + mov ah,25 + int 47h + add si,7 + jmp @@strinaize0 + +@@no0: + add di,bp + mov ax,[ss:bp] ;BP + mov bx,[ss:bp+2] ;IP + mov cx,[ss:bp+4] ;CS + mov [ss:di],ax + mov [ss:di+2],bx + mov [ss:di+4],cx + mov bp,di + pop di si cx bx ax + mov sp,bp + ret + +ENDP print + + +;================SHOWDATE============== +;Affiche la date contenu en %0 +;-> %0 +;<- +;====================================== +PROC showdate FAR + ARG @dates:word + USES edx + xor edx,edx + mov dx,[@dates] + and dx,11111b + call showintl,2,edx + call [cs:showchar],'/',0FFFFh + mov dx,[@dates] + shr dx,5 + and dx,111b + call showintl,2,edx + call [cs:showchar],'/',0FFFFh + mov dx,[@dates] + shr dx,8 + and dx,11111111b + add dx,1956 + call showintl,2,edx + ret +ENDP showdate + +;================SHOWTIME============== +;Affiche l'heure contenu en %0 +;-> %0 +;<- +;====================================== +PROC showtime FAR + ARG @times:word + USES edx + xor edx,edx + mov dx,[@times] + shr dx,11 + and dx,11111b + call showintl,2,edx + call [cs:showchar],':',0FFFFh + mov dx,[@times] + shr dx,5 + and dx,111111b + call showintl,2,edx + call [cs:showchar],':',0FFFFh + mov dx,[@times] + and dx,11111b + shl dx,1 + call showintl,2,edx + ret +ENDP showtime + +;================SHOWNAME============== +;Affiche le nom pointé par ds:%0 +;-> ds:%0 +;<- +;====================================== +PROC showname FAR + ARG @thename:word + USES cx,si + mov si,[@thename] + xor cx,cx +@@showthename: + call [cs:showchar],[word ptr ds:si],0FFFFh + inc si + inc cx + cmp cx,8 + jne @@suiteaname + call [cs:showchar],' ',0FFFFh +@@suiteaname: + cmp cx,8+3 + jb @@showthename + ret +ENDP showname + +;================SHOWATTR============== +;Affiche les attributs spécifié par %0 +;-> %0 +;<- +;====================================== +PROC showattr FAR + ARG @attr:word + push 0FFFFh + test [@attr],00000001b + je @@noreadonly + push 'L' + jmp @@readonly +@@noreadonly: + push '-' +@@readonly: + call [cs:showchar] + push 0FFFFh + test [@attr],00000010b + je @@nohidden + push 'C' + jmp @@hidden +@@nohidden: + push '-' +@@hidden: + call [cs:showchar] + push 0FFFFh + test [@attr],00000100b + je @@nosystem + push 'S' + jmp @@system +@@nosystem: + push '-' +@@system: + call [cs:showchar] + push 0FFFFh + test [@attr],00100000b + je @@noarchive + push 'A' + jmp @@archive +@@noarchive: + push '-' +@@archive: + call [cs:showchar] + push 0FFFFh + test [@attr],00010000b + je @@nodirectory + push 'R' + jmp @@directory +@@nodirectory: + push '-' +@@directory: + call [cs:showchar] + ret +ENDP showattr + +;================SHOWSIZE============== +;Affiche le nom pointé par %0 +;-> %0 +;<- +;====================================== +PROC showsize FAR + ARG @thesize:dword + USES edx,ds + push cs + pop ds + mov edx,[@thesize] + cmp edx,1073741824 + ja @@giga + cmp edx,1048576*9 + ja @@mega + cmp edx,1024*9 + ja @@kilo + call showintr,4,edx + call showstring0,offset unit + jmp @@finsize +@@kilo: + shr edx,10 + call showintr,4,edx + call showstring0,offset unitkilo + jmp @@finsize +@@mega: + shr edx,20 + call showintr,4,edx + call showstring0,offset unitmega + jmp @@finsize +@@giga: + shr edx,30 + call showintr,4,edx + call showstring0,offset unitgiga +@@finsize: + ret + +unit db ' o ',0 +unitkilo db ' ko',0 +unitmega db ' mo',0 +unitgiga db ' go',0 +ENDP showsize + +;==========SHOWSPACE=========== +;met un espace aprés le curseur +;-> +;<- +;============================== +PROC showspace FAR + call [cs:showchar],' ',0FFFFh + clc + ret +ENDP showspace + + +;==========SHOWINT=========== +;Affiche un entier %0 aprés le curseur +;-> %0 +;<- +;============================ +PROC showint FAR + ARG @integer:dword + USES eax,bx,cx,edx,esi + xor cx,cx + mov eax,[@integer] + mov esi,10 + mov bx,offset showbuffer+27 +@@decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov [cs:bx],dl + dec bx + cmp ax,0 + jne @@decint + mov ax,cx +@@showinteger: + inc bx + mov cl,[cs:bx] + call [cs:showchar],cx,0FFFFh + dec ax + jnz @@showinteger + ret + +showbuffer db 50 dup (0FFh) +ENDP showint + +;==========SHOWINTL=========== +;Affiche un entier %0 aprés le curseur de taille %1 caractère centré a gauche +;-> %0 un entier % taille en caractères +;<- +;=============================== +PROC showintl FAR + ARG @sizeofint:word,@integer:dword + USES eax,bx,cx,edx,esi,di + mov di,[@sizeofint] + xor cx,cx + mov eax,[@integer] + mov esi,10 + mov bx,offset showbuffer+27 +@@decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov [cs:bx],dl + dec bx + cmp cx,di + jae @@nomuch + cmp ax,0 + jne @@decint + mov ax,di + xchg cx,di + sub cx,di +@@rego: + mov [byte ptr cs:bx],'0' + dec bx + dec cx + jnz @@rego + jmp @@finishim +@@nomuch: + mov ax,di +@@finishim: +@@showinteger: + inc bx + mov cl,[cs:bx] + call [cs:showchar],cx,0FFFFh + dec ax + jnz @@showinteger + ret +ENDP showintl + +;==========SHOWINTR=========== +;Affiche un entier %0 aprés le curseur de taille %1 caractère centré a droite +;-> %0 un entier % taille en caractères +;<- +;=============================== +PROC showintr FAR + ARG @sizeofint:word,@integer:dword + USES eax,bx,cx,edx,esi,di + mov di,[@sizeofint] + xor cx,cx + mov eax,[@integer] + mov esi,10 + mov bx,offset showbuffer+27 +@@decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov [cs:bx],dl + dec bx + cmp cx,di + jae @@nomuch + cmp ax,0 + jne @@decint + mov ax,di + xchg cx,di + sub cx,di +@@rego: + mov [byte ptr cs:bx],' ' + dec bx + dec cx + jnz @@rego + jmp @@finishim +@@nomuch: + mov ax,di +@@finishim: +@@showinteger: + inc bx + mov cl,[cs:bx] + call [cs:showchar],cx,0FFFFh + dec ax + jnz @@showinteger + ret +ENDP showintr + +;==========SHOWSIGNED=========== +;Affiche un entier %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;=============================== +PROC showsigned FAR + ARG @sizeofint:word,@integer:dword=taille + USES ebx,cx,edx + mov ebx,[@integer] + mov cx,[@sizeofint] + xor edx,edx + cmp cx,1 + ja @@signed16 + mov dl,bl + cmp dl,7Fh + jbe @@notsigned + neg dl + jmp @@showminus +@@signed16: + cmp cx,2 + ja @@signed32 + mov dx,bx + cmp dx,7FFFh + jbe @@notsigned + neg dx + jmp @@showminus +@@signed32: + mov edx,ebx + cmp edx,7FFFFFFFh + jbe @@notsigned + neg edx +@@showminus: + call [cs:showchar],'-',0FFFFh +@@notsigned: + call showint,edx,0FFFFh + ret +ENDP showsigned + +;==========SHOWHEX=========== +;Affiche un nombre hexadécimal %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;============================ +PROC showhex FAR + ARG @sizeofint:word,@integer:dword=taille + USES ax,bx,cx,edx + mov edx,[@integer] + mov cx,[@sizeofint] + mov ax,cx + shr ax,2 + sub cx,32 + neg cx + shl edx,cl +@@Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,[cs:bx+offset Tab] + call [cs:showchar],cx,0FFFFh + dec al + jnz @@Hexaize + ret + +Tab db '0123456789ABCDEF' +ENDP showhex + +;==========SHOWBIN=========== +;Affiche un nombre binaire %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;============================ +PROC showbin FAR + ARG @sizeofint:word,@integer:dword=taille + USES ax,cx,edx + mov edx,[@integer] + mov cx,[@sizeofint] + sub cx,32 + neg cx + shl edx,cl + mov ax,[@sizeofint] +@@binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + call [cs:showchar],cx,0FFFFh + dec al + jnz @@binaize + ret +ENDP showbin + +;==========SHOWBCD=========== +;Affiche un nombre en BCD %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;============================ +PROC showbcd FAR + ARG @sizeofint:word,@integer:dword + USES ax,cx,edx + mov edx,[@integer] + mov ax,[@sizeofint] + mov cx,ax + shr ax,2 + sub cx,32 + neg cx + shl edx,cl +@@BCDaize: + rol edx,4 + mov cl,dl + and cl,0fh + add cl,'0' + call [cs:showchar],cx,0FFFFh + dec al + jnz @@BCDaize + ret +ENDP showbcd + +;==========SHOWSTRING=========== +;Affiche une chaine de caractère pointée par ds:%1 aprés le curseur +;-> ds:%1 pointeur chaine type pascal +;<- +;=============================== +PROC showstring FAR + ARG @pointer:word + USES bx,si + mov si,[@pointer] + mov bl,[si] +@@strinaize: + inc si + call [cs:showchar],[word ptr si],0FFFFh + dec bl + jnz @@strinaize + ret +ENDP showstring + +;==========SHOWSTRING0=========== +;Affiche une chaine de caractère pointée par ds:%1 aprés le curseur +;-> ds:%1 pointeur chaine type zéro terminal +;<- +;================================ +PROC showstring0 FAR + ARG @pointer:word + USES cx,si + mov si,[@pointer] +@@strinaize0: + mov cl,[si] + cmp cl,0 + je @@no0 + call [cs:showchar],cx,0FFFFh + inc si + jmp @@strinaize0 +@@no0: + ret +ENDP showstring0 + diff --git a/noyau/8259a.asm b/noyau/8259a.asm index 1c05847..561719e 100644 --- a/noyau/8259a.asm +++ b/noyau/8259a.asm @@ -1,64 +1,11 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -jmp tsr -db 'PIC8259A' -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -sti -iret -current dw 0 -tables dw enableirq - dw disableirq - dw readmaskirq - dw readirr - dw readisr - dw installhandler - dw replacehandler - dw getint - dw setint - dw seteoi - ;Adresses de port du contr“leur IRQ - MASTERPIC = 020h ;Adresse de base du PIC maŒtre - SLAVEPIC = 0A0h ;Adresse de base du PIC esclave - IRQMASK = 001h ;Offset sur port de masquage + MASTERPIC = 020h ;Adresse de base du PIC maŒtre + SLAVEPIC = 0A0h ;Adresse de base du PIC esclave + IRQMASK = 001h ;Offset sur port de masquage ;Commandes IRQ OCW2 - DISABLEROTATION = 000h ;Desactiver la rotation de priorités en mode EOI automatique - EOI = 020h ;End of Interrupt non sp‚cifi‚ + DISABLEROTATION = 000h ;Desactiver la rotation de priorités en mode EOI automatique + EOI = 020h ;End of Interrupt non sp‚cifi‚ COMMANDEOI = 060h ;Commande EOI particulière ENABLEROTATION = 080h ;Activer la rotation de priorités en mode EOI automatique ROTATIONNOSPEC = 0A0h ;Rotation des priorités en mode EOI automatique @@ -66,176 +13,130 @@ tables dw enableirq ROTATIONSPEC = 0E0h ;Rotation des priorités en mode EOI spécifié ;Position des vecteurs d'interruptions - MASTERFIRSTVECTOR = 008h ;Vecteurs logiciels des interruptions - SLAVEFIRSTVECTOR = 070h ;‚lectroniques + MASTERFIRSTVECTOR = 008h ;Vecteurs logiciels des interruptions + SLAVEFIRSTVECTOR = 070h ;‚lectroniques ;OCW3 codes registres IRR = 002h ;Interrupt Request Register ISR = 003h ;In Service Register -;OCW3 et modes +;OCW3 et modes OCW3 = 008h ;OCW3 POLLING = 004h ;Polling bit ISR = 0Bh ; Pas d'op‚ration, pas de Poll, lire ISR OCW3 -IRR = 0Ah ; Pas d'op‚ration, pas de Poll, lire IRR - +IRR = 0Ah ; Pas d'op‚ration, pas de Poll, lire IRR ;Autorise une interruption ‚lectronique -;Entr‚e : AL - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC -EnableIRQ: -push ax cx dx -mov dx,MASTERPIC+IRQMASK -cmp al,7 -jbe master -mov dx,SLAVEPIC+IRQMASK -master: -mov cl,al -and cl,7 -mov al,1 -shl al,cl -not al -mov ah,al -in al,dx -and al,ah -out dx,al -pop dx cx ax -ret +;Entr‚e : %1 - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC +PROC enableirq FAR + ARG @irq:word + USES ax,cx,dx + mov ax,[@irq] + mov dx,MASTERPIC+IRQMASK + cmp al,7 + jbe @@master + mov dx,SLAVEPIC+IRQMASK +@@master: + mov cl,al + and cl,7 + mov al,1 + shl al,cl + not al + mov ah,al + in al,dx + and al,ah + out dx,al + ret +endp enableirq ;Desactive une interruption ‚lectronique -;Entr‚e : AL - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC -DisableIRQ: -push ax cx dx -mov dx,MASTERPIC+IRQMASK -cmp al,7 -jbe master2 -mov dx,SLAVEPIC+IRQMASK -master2: -mov cl,al -and cl,7 -mov al,1 -shl al,cl -mov ah,al -in al,dx -or al,ah -out dx,al -pop dx cx ax -ret +;Entr‚e : %0 - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC +PROC disableirq FAR + ARG @irq:word + USES ax,cx,dx + mov ax,[@irq] + mov dx,MASTERPIC+IRQMASK + cmp al,7 + jbe @@master + mov dx,SLAVEPIC+IRQMASK +@@master: + mov cl,al + and cl,7 + mov al,1 + shl al,cl + not al + mov ah,al + in al,dx + or al,ah + out dx,al + ret +endp disableirq + + +;Signale "End Of Interrupt" de l'interruption %0 +PROC seteoi FAR + ARG @irq:word + USES ax,dx + mov ax,[@irq] + cmp al,7 + jbe @@master + mov al,EOI + out SLAVEPIC,al +@@master: + mov al,EOI + out MASTERPIC,al + ret +endp seteoi + + +;Lit les masques d'un contr“leur IRQ dans ax, 0 master ou slave 1 ds %1 +PROC readmaskirq FAR + ARG @controleur:word + USES bx,dx + mov bx,[@controleur] + mov dx,MASTERPIC+ IRQMASK + cmp bl,0 + jne @@master + mov dx,SLAVEPIC+ IRQMASK +@@master: + xor ah,ah + in al,dx + pop dx + ret +endp readmaskirq + +;Lit le registre d'‚tat d'un contr“leur IRQ dans ax, 0 master ou slave 1 ds %1 +PROC readisr FAR + ARG @controleur:word + USES bx,dx + mov bx,[@controleur] + mov dx,MASTERPIC + cmp bh,0 + jne @@master + mov dx,SLAVEPIC +@@master: + mov al,ISR + out dx,al + xor ah,ah + in al,dx + ret +endp readisr -;Signale "End Of Interrupt" de l'interruption al -SetEOI: -push ax dx -cmp al,7 -jbe master3 -mov al,EOI -out SLAVEPIC,al -master3: -mov al,EOI -out MASTERPIC,al -pop dx ax -ret - -;Lit les masques d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh -ReadmaskIrq: -push dx -mov dx,MASTERPIC+ IRQMASK -cmp bh,0 -jne Master5 -mov dx,SLAVEPIC+ IRQMASK -master5: -in al,dx -pop dx -ret ;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh -ReadISR: -push dx -mov dx,MASTERPIC -cmp bh,0 -jne Master6 -mov dx,SLAVEPIC -master6: -mov al,isr -out dx,al -in al,dx -pop dx -ret - -;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh -ReadIRR: -push dx -mov dx,MASTERPIC -cmp bh,0 -jne Master7 -mov dx,SLAVEPIC -master7: -mov al,irr -out dx,al -in al,dx -pop dx -ret - -;remplace le handler pointer par ds:si en bx:100h interruption ax -replacehandler: -push ax bx cx si di ds es -mov es,bx -mov di,0100h -mov ah,4 -int 48h -jc reph -mov bx,ax -call getint -mov es:[102h],si -mov es:[104h],ds -call setint -reph: -pop es ds di si cx bx ax -ret - -;install le handler pointer par ds:si en bx:100h interruption ax -installhandler: -push bx cx di es -mov es,bx -mov di,100h -mov ah,4 -int 48h -jc inh -mov bx,ax -call setint -inh: -pop es di cx bx -ret - -;met es:di le handle de l'int al -setint: -push ax bx ds -call disableirq -cli -xor ah,ah -mov bx,ax -shl bx,2 -xor ax,ax -mov ds,ax -mov ds:[bx],di -mov ds:[bx+2],es -pop ds bx ax -sti -call enableirq -ret - -;met ds:si le handle de l'int al -getint: -push ax bx es -xor ah,ah -mov bx,ax -shl bx,2 -xor ax,ax -mov es,ax -mov si,es:[bx] -mov ds,es:[bx+2] -pop es bx ax -ret - - -end start - +PROC readirr FAR + ARG @controleur:word + USES bx,dx + mov bx,[@controleur] + mov dx,MASTERPIC + cmp bh,0 + jne @@master + mov dx,SLAVEPIC +@@master: + mov al,IRR + out dx,al + xor ah,ah + in al,dx + ret +endp readirr \ No newline at end of file diff --git a/noyau/MAKEFILE b/noyau/MAKEFILE index 9cb29a7..b328844 100644 --- a/noyau/MAKEFILE +++ b/noyau/MAKEFILE @@ -1,72 +1,36 @@ -lnk_boot = tlink /x -asm= tasm /t/m5/zi -lnk= tlink /x/t +asm= lzasm +lnk= elink -all: boot.bin clavier.sys 8259a.sys disque.sys heure.sys horloge.sys manette.sys port.sys souris.sys systeme.sys video.sys mcb.sys +all: systeme.sys boot.bin -boot.bin: boot.asm - $(asm) boot - $(lnk_boot) boot - exe2boot boot.exe boot.bin +systeme.sys: video.obj systeme.obj + $(lnk) systeme.obj systeme.sys -clavier.sys: clavier.asm - $(asm) clavier - $(lnk) clavier - ren clavier.com clavier.sys +systeme.obj: ../lib/detect.lib ../lib/video.lib video.sys + $(asm) systeme.asm -8259a.sys: 8259a.asm - $(asm) 8259a - $(lnk) 8259a - ren 8259a.com 8259a.sys -disque.sys: disque.asm - $(asm) disque - $(lnk) disque - ren disque.com disque.sys +video.sys: + $(lnk) video.obj video.sys -heure.sys: heure.asm - $(asm) heure - $(lnk) heure - ren heure.com heure.sys +boot.bin: boot.obj + $(lnk) boot.obj boot.bin /bs -horloge.sys: horloge.asm - $(asm) horloge - $(lnk) horloge - ren horloge.com horloge.sys +detect.obj: + $(asm) detect.asm -manette.sys: manette.asm - $(asm) manette - $(lnk) manette - ren manette.com manette.sys +video.obj: + $(asm) video.asm -port.sys: port.asm - $(asm) port - $(lnk) port - ren port.com port.sys - -souris.sys: souris.asm - $(asm) souris - $(lnk) souris - ren souris.com souris.sys - -systeme.sys: systeme.asm - $(asm) systeme - $(lnk) systeme - ren systeme.com systeme.sys - -video.sys: video.asm - $(asm) video - $(lnk) video - ren video.com video.sys - -mcb.sys: mcb.asm - $(asm) mcb - $(lnk) mcb - ren mcb.com mcb.sys +boot.obj: + $(asm) boot.asm clean: del *.obj del *.exe + del *.bak + del *.lib del *.com + del *.bin del *.sys - del *.err + del *.err \ No newline at end of file diff --git a/noyau/boot.asm b/noyau/boot.asm index 750e592..4d1e41c 100644 --- a/noyau/boot.asm +++ b/noyau/boot.asm @@ -1,221 +1,216 @@ -boots segment -.386 -org 7C00h -;org 100h -assume cs:boots,ds:boots +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\fat.h" +include "..\include\divers.h" + +org 7C00h -start: jmp boot -bootdb db 'COS2000A' ;Fabricant + n°série Formatage -sizec dw 512 ;octet/secteur - db 1 ;secteur/cluster -reserv dw 1 ;secteur reserv‚ -nbfat db 2 ;nb de copie de la FAT -nbfit dw 224 ;taille rep racine -allclu dw 2880 ;nb secteur du volume si < 32 még - db 0F0h ;Descripteur de média -fatsize dw 9 ;secteur/FAT -nbtrack dw 18 ;secteur/piste -head dw 2 ;nb de tˆteb de lecture/écriture -hidden dd 0 ;nombre de secteur cach‚s - dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors -bootdrv db 0 ;Lecteur de d‚marrage -bootsig db 0 ;NA - db 29h ;boot signature 29h -bootsig2 dd 01020304h ;no de serie -pope db 'COS2000 ' ;nom de volume - db 'FAT12 ' ;FAT -specialboot: +bootsec bootinfo <"COS2000A",512,1,1,2,224,2880,0F0h,9,18,2,0,0,0,0,0,29h,01020304h,"COS2000 ","FAT12 "> + +errorloading db " [Erreur]",0dh,0ah,0 +okloading db "Recherche noyau ",0Dh,0ah," -" +sys db "SYSTEME SYS",0 +syst db " [ Ok ]",0dh,0ah,"Chargement ",0 +dot db ".",0 + -errorloading db ' Erreur !!',0dh,0ah,0 -okloading db 'Recherche noyau',0Dh,0ah,' - system.sys',0 -syst db ' Ok',0dh,0ah,'Chargement',0 -dot db '.',0 -Sys db 'SYSTEME SYS' errorboot: - mov si,offset errorloading - call showstr - mov ah,0 - int 16h - int 19h -boot: - mov Bootdrv,dl - cli - mov ax,09000h - mov ss,ax - mov sp,0FFFFh - sti + mov si,offset errorloading + call showstr + mov ah,0 + int 16h + int 19h +boot: + mov [bootsec.bootdrive],dl + cli + mov ax,09000h + mov ss,ax + mov sp,0FFFFh + sti boot2: - push cs - push cs - pop es - pop ds - xor ax,ax - int 13h - jc errorboot - mov si,offset okloading - call showstr - mov cx,Reserv - add cx,word ptr [offset Hidden] - adc cx,word ptr [offset Hidden+2] - push cx - mov bx,fatsize - mov di,offset bufferfat + push cs + push cs + pop es + pop ds + xor ax,ax + mov dl,[bootsec.bootdrive] + int 13h + jc errorboot + mov si,offset okloading + call showstr + mov cx,[bootsec.reservedsectors] + add cx,[bootsec.hiddensectorsh] + adc cx,[bootsec.hiddensectorsl] + push cx + mov bx,[bootsec.sectorsperfat] + mov di,offset bufferfat readfat: - call readsector - inc cx - add di,sizec - dec bx - jnz readfat - pop cx - xor ax,ax - mov al,NbFat - mov bx,FatSize - mul bx - add cx,ax - mov ax,32 - mul nbfit - div sizec - add ax,cx - sub ax,2 - mov word ptr [offset bootsig],ax - xor dx,dx -CheckRoot: - mov di,offset buffer - call readsector - jc errorboot - xor bx,bx + call readsector + jc errorboot + inc cx + add di,[bootsec.sectorsize] + dec bx + jnz readfat + pop cx + xor ax,ax + mov al,[bootsec.fatsperdrive] + mov bx,[bootsec.sectorsperfat] + mul bx + add cx,ax + mov ax,32 + mul [bootsec.directorysize] + div [bootsec.sectorsize] + add ax,cx + sub ax,2 + mov [word ptr bootsec.reservedfornt],ax + xor dx,dx +checkroot: + mov di,offset buffer + call readsector + jc errorboot + xor bx,bx findnext: - cmp byte ptr [di],0 - je errorboot - cmp byte ptr [di],0E5h - je no - cmp byte ptr [di],041h - je no - mov si,offset dot - call showstr - push di cx - mov si,offset sys - mov cx,11 - rep cmpsb - pop cx di - je oksystem + cmp [byte ptr di],0 + je errorboot + cmp [byte ptr di],0E5h + je no + cmp [byte ptr di],041h + je no + mov si,offset dot + call showstr + push di cx + mov si,offset sys + mov cx,11 + rep cmpsb + pop cx di + je oksystem no: - add di,32 - add bx,32 - inc dx - cmp dx,nbfit - ja errorboot - cmp bx,sizec - jb findnext - inc cx - jmp Checkroot + add di,32 + add bx,32 + inc dx + cmp dx,[bootsec.directorysize] + ja errorboot + cmp bx,[bootsec.sectorsize] + jb findnext + inc cx + jmp checkroot oksystem: - mov si,offset syst - call showstr - mov cx,[di+26] - mov ax,0900h - mov es,ax - push es - mov di,100h - push di - mov si,offset dot - xor ax,ax + mov si,offset syst + call showstr + mov cx,[di+26] + mov ax,0900h + mov es,ax + push es + mov di,0000h + push 0010h + mov si,offset dot + xor ax,ax fatagain: - cmp cx,0FF0h - jae finishload - push cx - add cx,word ptr [offset bootsig] - call readsector - pop cx - jc errorboot + cmp cx,0FF0h + jae finishload + push cx + add cx,[word ptr bootsec.reservedfornt] + call readsector + pop cx + jc errorboot inc ax - call showstr - add di,sizec - call getfat - jnc fatagain + call showstr + add di,[bootsec.sectorsize] + call getfat + jnc fatagain finishload: - db 0CBh + retf ;=============READSECTOR (Fonction 01H)=============== ;Lit le secteur CX et le met en es:di ;-> AH=1 ;<- Flag Carry si erreur ;===================================================== -ReadSector: +readsector: push ax bx cx dx si mov ax,cx - xor dx,dx - div nbtrack - inc dl - mov bl,dl - xor dx,dx - div head - mov dh, 0 - xchg dl,dh - mov cx,ax - xchg cl,ch - shl cl,6 - or cl, bl + xor dx,dx + div [bootsec.sectorspertrack] + inc dl + mov bl,dl + xor dx,dx + div [bootsec.headsperdrive] + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl, bl mov bx,di - mov SI, 4 - mov AL, 1 -TryAgain: - mov AH, 2 + mov si, 4 + mov al, 1 +tryagain: + mov ah, 2 + mov dl,[bootsec.bootdrive] int 13h - jnc Done - dec SI - jnz TryAgain -Done: + jnc done + dec si + jnz tryagain +done: pop si dx cx bx ax -ret - -getfat: - push ax bx dx di - mov di,offset bufferfat - mov ax,cx - mov bx,ax - and bx,0000000000000001b - shr ax,1 - mov cx,3 - mul cx - add di,ax - cmp bx,0h - jnz evenfat -oddfat: - mov dx,[di] - and dx,0FFFh - mov cx,dx - jmp endfat -evenfat: - mov dx,[di+1] - and dx,0FFF0h - shr dx,4 - mov cx,dx -endfat: - pop di dx bx ax - ret - -showstr: - push ax bx si -again: - lodsb - or al,al - jz fin - mov ah,0Eh - mov bx,07h - int 10h - jmp again - fin: - pop si bx ax ret -Buffer equ $ -BufferFat equ $+2048 -boots ends -end start +getfat: + push ax bx dx di + mov di,offset bufferfat + mov ax,cx + mov bx,ax + and bx,0000000000000001b + shr ax,1 + mov cx,3 + mul cx + add di,ax + cmp bx,0h + jnz evenfat +oddfat: + mov dx,[di] + and dx,0FFFh + mov cx,dx + jmp endfat +evenfat: + mov dx,[di+1] + and dx,0FFF0h + shr dx,4 + mov cx,dx +endfat: + pop di dx bx ax + ret + + +showstr: + push ax bx si +again: + lodsb + or al,al + jz fin + mov ah,0Eh + mov bx,07h + int 10h + jmp again +fin: + pop si bx ax + ret + + +db 055h,0AAh + +endof: + +buffer equ offset endof+2048 +bufferfat equ offset endof+4096 diff --git a/noyau/clavier.asm b/noyau/clavier.asm index 83c32a6..9fd3cdd 100644 --- a/noyau/clavier.asm +++ b/noyau/clavier.asm @@ -3,7 +3,9 @@ smart .code -org 0100h +org 0h + +include ..\include\mem.h start: @@ -15,7 +17,6 @@ tsr: db 2eh,0ffh,1eh dw offsets cli - add dword ptr cs:popes,1 cmp cs:isstate,1 je endofforce mov cs:isstate,1 @@ -43,12 +44,22 @@ F10: mov si,offset com mov ah,5 int 49h - mov cs:isstate,0 + pop ax + pop ax + pop ax push gs - push 0100h - db 0CBh + push gs + push gs + pop ds + pop es + pop fs + push gs + push size exe + sti + mov cs:[isstate],0 + retf -com db 'COMMANDE.EXE',0 +com db 'COMMANDE.CE',0 F11: push ax di es @@ -70,17 +81,10 @@ notabove: f12: - -showreg: -pushf pushad -mov bp,sp -mov ax,ss:[bp+28h] -mov cs:[csr],ax -mov ax,ss:[bp+26h] -mov cs:[ipr],ax -mov ax,ss:[bp+2Ah] -mov cs:[flr],ax +pushf +push ds +mov cs:[eaxr],eax mov cs:[ebxr],ebx mov cs:[ecxr],ecx mov cs:[edxr],edx @@ -88,169 +92,139 @@ mov cs:[esir],esi mov cs:[edir],edi mov cs:[espr],esp mov cs:[ebpr],ebp +mov cs:[csr],cs mov cs:[dsr],ds mov cs:[esr],es mov cs:[fsr],fs mov cs:[gsr],gs mov cs:[ssr],ss -push ds -pop fs push cs pop ds -mov ah,28h -int 47h -mov ax,0002 -int 47H -mov ah,2 -int 47h -mov si,offset etat -mov ah,13 -int 47h -mov ah,6 -int 47h -mov ah,6 -int 47h +mov si,offset sep +call Showstr mov si,offset reg mov di,offset regdata mov bx,7 showregs: -cmp byte ptr cs:[si+4],":" +cmp byte ptr cs:[si+6],":" jne endshowregs -mov ah,13 -int 47h -cmp byte ptr cs:[si+3],"g" -je segsss -cmp byte ptr cs:[si+2]," " +call Showstr +cmp byte ptr cs:[si+4]," " je segsss mov edx,cs:[di] mov cx,32 -mov ah,0Ah -int 47h +call Showhex add di,4 jmp showmax segsss: -xor edx,edx mov dx,cs:[di] mov cx,16 -mov ah,0Ah -int 47h -push si -mov ah,13 -mov si,offset blank -int 47h -pop si +call Showhex add di,2 showmax: -add si,7 -mov ebp,edx +add si,9 +mov bp,dx push si mov si,offset beginds -mov ah,13 -int 47h -pop si +call showstr +mov si,bp mov cx,8 mov al,0 -mov bx,bp letshow: -mov dl,fs:[bx] -inc bx -mov ah,0Ah -int 47h +mov dl,ds:[si] +inc si +call showhex inc al cmp al,10 jb letshow -push si mov si,offset ende -mov ah,13 -int 47h +call showstr mov si,offset begines -mov ah,13 -int 47h -pop si -mov bx,bp +call showstr +mov si,bp mov cx,8 mov al,0 letshow2: -mov dl,es:[bx] -inc bx -mov ah,0Ah -int 47h +mov dl,es:[si] +inc si +call showhex inc al cmp al,10 jb letshow2 -push si mov si,offset ende -mov ah,13 -int 47h -mov si,offset beginint -mov ah,13 -int 47h +call showstr pop si -mov edx,ebp -mov ah,8 -int 47h -push si -mov si,offset endint -mov ah,13 -int 47h -pop si -mov ah,6 -int 47h jmp showregs endshowregs: -mov ah,6 -int 47h -mov si,offset pile -mov ah,13 -int 47h -mov ah,6 -int 47h -mov bp,sp -mov di,0ffffh -sub di,bp -xor si,si -showstack: -mov dl,'+' -mov ah,07h -int 47h -mov ah,0Ah -mov cx,8 -mov dx,si -int 47h -mov dl,':' -mov ah,07h -int 47h -mov dx,ss:[bp+si] -mov ah,0Ah -mov cx,16 -int 47h -mov ah,06 -int 47h -inc si -inc si -cmp si,di -jb showstack - -mov ah,0ah -mov edx,cs:popes -mov cx,32 -int 47h - - - - - - +mov si,offset sep +call Showstr xor ax,ax int 16h -mov ah,29h -int 47h -popad +pop ds popf +popad jmp endof +begines db ' es[',0 +beginds db ' ds[',0 +ende db '] ',0 -popes dd 0 +;==============================Affiche le nombre nb hexa en EDX de taille CX et couleur BL============== +ShowHex: + push ax bx cx edx si di + mov di,cx + sub cx,32 + neg cx + shl edx,cl + shr di,2 + mov ah,09h + and bx,1111b +Hexaize: + rol edx,4 + mov si,dx + and si,1111b + mov al,[si+offset tab] + push cx + mov cx,1 + cmp al,32 + jb control2 + mov ah,09h + int 10h +control2: + mov ah,0Eh + int 10h + pop cx + dec di + jnz Hexaize + pop di si edx cx bx ax + ret +Tab db '0123456789ABCDEF' + +;==============================Affiche une chaine DS:SI de couleur BL============== +showstr: + push ax bx cx si + mov cx,1 +again: + lodsb + or al,al + jz fin + and bx,0111b + cmp al,32 + jb control + mov ah,09h + int 10h +control: + mov ah,0Eh + int 10h + jmp again + fin: + pop si cx bx ax + ret + + +;================================================ +;Routine de débogage +;================================================ regdata: eaxr dd 0 ebxr dd 0 @@ -260,40 +234,28 @@ esir dd 0 edir dd 0 espr dd 0 ebpr dd 0 -ipr dw 0 csr dw 0 dsr dw 0 esr dw 0 fsr dw 0 gsr dw 0 ssr dw 0 -flr dw 0 -etat db ' Etat des registres processeurs',0 +reg db 0Dh,0Ah,"eax : ",0 + db 0Dh,0Ah,"ebx : ",0 + db 0Dh,0Ah,"ecx : ",0 + db 0Dh,0Ah,"edx : ",0 + db 0Dh,0Ah,"esi : ",0 + db 0Dh,0Ah,"edi : ",0 + db 0Dh,0Ah,"esp : ",0 + db 0Dh,0Ah,"ebp : ",0 + db 0Dh,0Ah,"cs : ",0 + db 0Dh,0Ah,"ds : ",0 + db 0Dh,0Ah,"es : ",0 + db 0Dh,0Ah,"fs : ",0 + db 0Dh,0Ah,"gs : ",0 + db 0Dh,0Ah,"ss : ",0 -reg db "eax : ",0 - db "ebx : ",0 - db "ecx : ",0 - db "edx : ",0 - db "esi : ",0 - db "edi : ",0 - db "esp : ",0 - db "ebp : ",0 - db "ip : ",0 - db "cs : ",0 - db "ds : ",0 - db "es : ",0 - db "fs : ",0 - db "gs : ",0 - db "ss : ",0 - db "flag: ",0 - -pile db 'Stack :',0 +sep db 0Ah,0Dh,'********************',0Ah,0Dh,0 -blank db ' ',0 -beginint db ' (',0 -endint db ') ',0 -begines db ' es[',0 -beginds db ' ds[',0 -ende db '] ',0 end start diff --git a/noyau/disque.asm b/noyau/disque.asm index 9778250..1431647 100644 --- a/noyau/disque.asm +++ b/noyau/disque.asm @@ -3,13 +3,13 @@ smart .code -org 0100h +org 0h include ..\include\fat.h +include ..\include\mem.h start: jmp tsr ;Saute à la routine résidente -names db 'DRIVE' ;Nom drivers id dw 1234h ;Identifiant drivers Tsr: cli ;Désactive interruptions logiciellement @@ -36,15 +36,23 @@ noerrorint: itsok: push bp mov bp,sp ;On prend sp dans bp pour adresser la pile - jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? + pushf + jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET ;xor eax,eax ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique ;shl eax,4 ;de l'erreur. ;add ax,cs:current - jmp endofint ;on termine l'int + jmp endofscan ;on termine l'int noerror: and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET +endofscan: + popf + jne noequal + or byte ptr [bp+6],1000000b + jmp endofint +noequal: + and byte ptr [bp+6],0BFh endofint: pop bp sti ;On réactive les interruptions logiciellement @@ -53,7 +61,7 @@ endofint: current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée tables dw readsector dw writesector - dw verifysector2 + dw verifysector dw initdrive dw loadfile dw compressrle @@ -182,12 +190,21 @@ execfile: pop gs mov ah,6 int 49h + mov ah,12 + int 49h + jc reallyerror push es push cs mov ax,offset arrive push ax push es - push 0100h + cmp word ptr gs:[0h],'EC' + jne noce + push size exe + jmp wasce + noce: + push 0000h + wasce: push es push es push es @@ -235,7 +252,6 @@ projfile: jc errorload2 mov eax,cs:tempfit.FileSize mov ecx,eax - add ecx,100h push eax mov ah,2 int 49h @@ -244,7 +260,7 @@ projfile: push gs pop es mov cx,cs:tempfit.FileGroup - mov di,100h + mov di,0h call loadway jc errorload2 clc @@ -338,29 +354,38 @@ CmpNames: repe cmpsb jne nequal inc si + jmp equal nequal: + cmp byte ptr es:[di-1],' ' + jne notequal +equal: cmp byte ptr [si-1],'.' jne trynoext mov al,' ' rep scasb mov cx,3 rep cmpsb - jne notequal - cmp byte ptr [si],0 - jne notequal - cmp cx,0 - jl notequal + jne nequal2 + inc si + jmp equal2 +nequal2: + cmp byte ptr es:[di-1],' ' + jne notequal +equal2: + cmp byte ptr [si-1],0 + jne notequal itok: + clc pop di si cx ax ret +notequal: + stc + pop di si cx ax + ret trynoext: cmp byte ptr [si-1],0 jne notequal jmp itok -notequal: - stc - pop di si cx ax - ret ;charge le fichier de de groupe CX et de taille eax LoadWay: @@ -884,13 +909,6 @@ invert: pop cx si ret -VerifySector2: - call verifysector - jne nook - or byte ptr [bp+6],10b -nook: - ret - ;=============DecompressRle (Fonction 05H)============== ;decompress ds:si en es:di taille bp d‚compress‚ cx compress‚ ;-> AH=5 diff --git a/noyau/format.asm b/noyau/format.asm index 62b8d30..0701d2d 100644 --- a/noyau/format.asm +++ b/noyau/format.asm @@ -3,7 +3,7 @@ smart .code -org 0100h +org 0h start: jmp tsr ;Saute à la routine résidente diff --git a/noyau/heure.asm b/noyau/heure.asm index f4c547e..918ab3f 100644 --- a/noyau/heure.asm +++ b/noyau/heure.asm @@ -3,7 +3,7 @@ smart .code -org 0100h +org 0h start: diff --git a/noyau/horloge.asm b/noyau/horloge.asm index 8ff0505..41c7f0d 100644 --- a/noyau/horloge.asm +++ b/noyau/horloge.asm @@ -3,7 +3,7 @@ smart .code -org 0100h +org 0h start: diff --git a/noyau/manette.asm b/noyau/manette.asm index fe5c6ef..d291dc2 100644 --- a/noyau/manette.asm +++ b/noyau/manette.asm @@ -2,7 +2,7 @@ .486 smart .code -org 0100h +org 0h start: jmp tsr drv db 'JOYSTICK',0 diff --git a/noyau/mcb.asm b/noyau/mcb.asm index aa586e1..f27dc9e 100644 --- a/noyau/mcb.asm +++ b/noyau/mcb.asm @@ -1,445 +1,731 @@ -.model tiny -.486 -smart -.code -org 0100h + db "biosprint",0 + dw biosprint + db "mbinit",0 + dw mbinit + db "mbcreate",0 + dw mbcreate + db "mbfree",0 + dw mbfree + db "mbclean",0 + dw mbclean + db "mbresident",0 + dw mbresident + db "mbnonresident",0 + dw mbnonresident + db "mbchown",0 + dw mbchown + db "mballoc",0 + dw mballoc + db "mbfind",0 + dw mbfind + db "mbfindsb",0 + dw mbfindsb + db "mbget",0 + dw mbget + db "mbloadfuncs",0 + dw mbloadfuncs + db "mbsearchfunc",0 + dw mbsearchfunc + db "bioswaitkey",0 + dw bioswaitkey + db "mbloadsection",0 + dw mbloadsection + db "enableirq",0 + dw enableirq + db "disableirq",0 + dw enableirq + db "readmaskirq",0 + dw readmaskirq + db "readirr",0 + dw readirr + db "readisr",0 + dw readisr + db "seteoi",0 + dw seteoi + dd 0 -include ..\include\mem.h -include ..\include\divers.h +include "8259a.asm" -start: -maxfunc equ 10 - - jmp tsr ;Saute à la routine résidente -nameed db 'MB' ;Nom drivers -id dw 1234h ;Identifiant drivers -Tsr: - cli ;Désactive interruptions logiciellement - cmp ax,cs:ID ;Compare si test de chargement - jne nomore ;Si pas test alors on continu - rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé - jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO -nomore: - cmp ah,maxfunc - jbe noerrorint - stc - jmp itsok - noerrorint: - clc - push bx - mov bl,ah ;On calcule d'aprés le n° de fonction - xor bh,bh ;quel sera l'entrée dans la table indexée - shl bx,1 ;des adresses fonctions. - mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table - mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine - pop bx - clc - call cs:current ;Puis on execute la fonction -itsok: - push bp - mov bp,sp ;On prend sp dans bp pour adresser la pile - jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? - or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET - ;xor eax,eax - ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique - ;shl eax,4 ;de l'erreur. - ;add ax,cs:current - jmp endofint ;on termine l'int -noerror: - and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET -endofint: - pop bp - sti ;On réactive les interruptions logiciellement - iret ;Puis on retourne au programme appelant. - -current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée -tables dw MBinit ;Table qui contient les adresses de toutes les fonctions de VIDEO (WORD) - dw MBFree - dw MBCreate - dw MBresident - dw MBGet - dw MBFind - dw MBChown - dw MBAlloc - dw MBclean - dw MBfindsb - -FirstMB dw 0 - -;Mise a nivo de la mémoire (jonction de blocs libre) -MBclean: - push ax bx dx es gs - mov bx,cs:firstmb - dec bx - dec bx - xor ax,ax - xor dx,dx -searchfree3: - mov gs,bx - cmp gs:[MB.Check],'NH' - jne erroronsearch - inc bx - inc bx - add bx,gs:[MB.Sizes] - cmp word ptr gs:[MB.Sizes],0 - je erroronsearch - cmp gs:[MB.Reference],Free - jne notfreeatall - cmp ax,0 - je notmeetafree - add dx,gs:[MB.Sizes] - mov word ptr gs:[MB.Check],0 - mov dword ptr gs:[MB.Names],0 - mov dword ptr gs:[MB.Names+4],0 - inc dx - inc dx - jmp nottrigered -notmeetafree: - xor dx,dx - mov ax,gs - jmp nottrigered -notfreeatall: - cmp ax,0 - je nottrigered - mov es,ax - add es:[MB.Sizes],dx - xor ax,ax -nottrigered: - cmp gs:[MB.IsNotLast],true - je searchfree3 - cmp ax,0 - je reallyfinish - mov es,ax - add es:[MB.Sizes],dx - mov es:[MB.IsNotLast],False -reallyfinish: - clc - pop gs es dx bx ax - ret -erroronsearch: - stc - pop gs es dx bx ax +;Affiche le nombre hexa dans %0[dword] +PROC biosprinth FAR + ARG @num:dword + USES ax,bx,cx,edx,si,di + mov edx,[@num] + mov ah,09h + mov di,8 +@@hexaize: + rol edx,4 + mov si,dx + and si,1111b + mov al,[cs:si+offset @@tab] + mov cx,1 + cmp al,32 + jb @@control + mov bx,7 + mov ah,09h + int 10h +@@control: + mov ah,0Eh + int 10h + dec di + jnz @@hexaize ret +@@tab db '0123456789ABCDEF' +endp biosprinth +;Affiche le texte ASCIIZ pointé par %0 +PROC biosprint FAR + ARG @pointer:word + USES ax,bx,cx,si + mov si,[@pointer] + mov cx,1 + mov bx,7 +@@again: + lodsb + or al,al + jz @@fin + cmp al,32 + jb @@control + mov ah,09h + int 10h +@@control: + mov ah,0Eh + int 10h + jmp @@again +@@fin: + ret +endp biosprint + +;PROC flatmode FAR +; USES eax,bx,edx +; ; first, calculate the linear address of GDT +; xor edx,edx +; xor eax,eax +; mov dx,cs +; shl edx,4 +; add [dword ptr cs:offset @@gdt+2],edx ; store as GDT linear base addr +; ; now load the GDT into the GDTR +; lgdt [fword ptr cs:offset @@gdt] ; load GDT base (286-style 24-bit load) +; mov bx,1 * size descriptor ; point to first descriptor +; mov eax,cr0 ; prepare to enter protected mode +; or al,1 ; flip the PE bit +; cli ; turn off interrupts +; mov cr0,eax ; we're now in protected mode +; mov fs,bx ; load the FS segment register +; and al,0FEh ; clear the PE bit again +; mov cr0,eax ; back to real mode +; sti ; resume handling interrupts +; ret ; + +;@@gdt descriptor <@@gdtend - @@gdt - 1, @@gdt, 0, 0, 0, 0> ; the GDT itself +; descriptor <0ffffh, 0, 0, 091h, 0cfh, 0> ; 4G data segment +;@@gdtend: +;endp flatmode + +;Attend l'appuie sur une touche +PROC bioswaitkey FAR + xor ax,ax + int 16h + ret +endp bioswaitkey + +firstmb dw 0 + + +;Charge les sections du block %0 +PROC mbloadsection FAR + ARG @blocks:word + USES ax,bx,cx,si,di,ds,es + LOCAL @@toresov:word:60 + mov ax,[@blocks] + inc ax + inc ax + mov es,ax + mov ds,ax + cmp [word ptr 0],"EC" + jne @@notace + lea si,[@@toresov] + mov [word ptr ss:si],0FFFFh + mov bx,[ds:exe.sections] +@@loading: + cmp [dword ptr bx],0 + je @@finishloading + mov ax,bx + add ax,4 + call mbcreate,ax,[word ptr bx+2] + jc @@error + inc si + inc si + mov [ss:si],ax + push si + mov si,[bx] + xor di,di + mov es,ax + mov cx,[bx+2] + cld + rep movsb + pop si + add bx,4 +@@gonext: + inc bx + cmp [byte ptr bx],0 + jne @@gonext + inc bx + jmp @@loading +@@finishloading: +pushad +xor eax,eax +mov ax,[word ptr ss:si] +call biosprinth,eax +popad + cmp [word ptr ss:si],0FFFFh + je @@finishdepands + call mbloadfuncs,[word ptr ss:si] + jc @@depandserror + dec si + dec si + jmp @@finishloading +@@finishdepands: + ret +@@notace: + stc + ret +@@error: + stc + ret +@@depandserror: + stc + ret +endp mbloadsection + ;Initialise les blocs de mémoire en prenant memorystart pour segment de base -MBinit: - push ax cx es - cmp cs:FirstMB,0 - jne notforfree - mov ax,memorystart - mov cs:Firstmb,ax - mov cx,0A000h - sub cx,ax - dec ax - dec ax - mov es,ax - cmp es:[MB.Check],'NH' - je notforfree - mov es:[MB.Reference],Free - mov es:[MB.Sizes],cx - mov es:[MB.Check],'NH' - mov dword ptr es:[MB.Names],'eerF' - mov dword ptr es:[MB.Names+4],0 - mov es:[MB.IsNotLast],False +PROC mbinit FAR + USES ax,cx,si,di,ds,es + cmp [cs:firstmb],0 + jne @@alreadyok + push cs + pop ds + mov [cs:firstmb],memorystart + mov ax,memorystart-2 + mov es,ax + mov si,offset afree + xor di,di + mov cx,size mb + rep movsb clc - pop es cx ax ret -notforfree: +@@alreadyok: stc - pop es cx ax ret +endp mbinit -;Libère le bloc de mémoire GS -MBFree: - push ax bx es - mov bx,gs +afree mb <"HN",0,0,0,0A000h-memorystart,"Libre"> + db 0 + +;Creér un bloc de nom %0 de taille %1 (octets) -> n°segment dans AX +PROC mbcreate FAR + ARG @blocks:word,@size:word + USES bx,cx,dx,si,di,ds,es + push gs + mov gs,[ss:bp+4] + mov cx,[@size] + shr cx,4 + inc cx + mov bx,[cs:firstmb] + dec bx + dec bx + mov dl,true +@@searchfree: + cmp dl,false + je @@notenougtmem + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + cmp [es:mb.isnotlast],true + sete dl + cmp [es:mb.reference],free + jne @@notsogood + mov ax,[es:mb.sizes] + cmp cx,ax + ja @@notsogood + ;mov [word ptr es:mb.check],"NH" + mov [es:mb.isnotlast],true + mov [es:mb.reference],gs + mov [es:mb.isresident],false + lea di,[es:mb.names] + push cx + mov cx,24/4 + push cs + pop ds + mov si,[@blocks] + cld + rep movsd + pop cx + inc bx + inc bx + sub ax,cx + cmp ax,0 + je @@nofree + dec ax + dec ax + mov [es:mb.sizes],cx + add cx,bx + mov es,cx + mov si,offset afree + xor di,di + mov cx,size mb + cld + rep movsb + mov [es:mb.isnotlast],dl + mov [es:mb.sizes],ax +@@nofree: + mov ax,bx + clc + pop gs + ret +@@notsogood: + inc bx + inc bx + add bx,[es:mb.sizes] + jmp @@searchfree +@@memoryerror: + stc + pop gs + ret +@@notenougtmem: + pop gs + stc + ret +endp mbcreate + +;Libère le bloc de mémoire %0 et ses sous blocs +PROC mbfree FAR + ARG @blocks:word + USES ax,bx,cx,si,di,ds,es + mov bx,[@blocks] mov ax,bx dec bx dec bx mov es,bx - cmp es:[MB.Reference],Free - je wasfree - cmp es:[MB.IsResident],true - je wasfree - mov es:[MB.IsResident],false - mov es:[MB.Reference],Free - mov dword ptr es:[MB.Names],'eerF' - mov dword ptr es:[MB.Names+4],0 - mov bx,cs:firstmb + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + cmp [es:mb.reference],free + je @@wasfree + cmp [es:mb.isresident],true + je @@wasresident + mov [es:mb.reference],free + push cs + pop ds + mov si,offset @@isfree + lea di,[es:mb.names] + mov cx,6 + cld + rep movsb + mov bx,[cs:firstmb] dec bx dec bx -searchtofree: - mov gs,bx - cmp gs:[MB.Check],'NH' - jne wasfree +@@searchtofree: + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror inc bx inc bx - add bx,gs:[MB.Sizes] - cmp word ptr gs:[MB.Sizes],0 - je wasfree - cmp ax,gs:[MB.Reference] - jne nottofree - mov gs:[MB.IsResident],false - mov gs:[MB.Reference],Free - mov dword ptr gs:[MB.Names],'eerF' - mov dword ptr gs:[MB.Names+4],0 -nottofree: - cmp gs:[MB.IsNotLast],true - je searchtofree - call MBclean - pop es bx ax + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@nottofree + cmp ax,[es:mb.reference] + jne @@nottofree + mov [es:mb.isresident],false + mov [es:mb.reference],free + mov cx,6 + cld + rep movsb +@@nottofree: + cmp [es:mb.isnotlast],true + je @@searchtofree + call mbclean ret -wasfree: +@@memoryerror: stc - pop es bx ax ret +@@wasfree: + stc + ret +@@wasresident: + stc + ret + +@@isfree db "libre",0 +endp mbfree + +;Mise a nivo de la mémoire (jonction de blocs libre) +PROC mbclean FAR + USES ax,bx,dx,es,gs + mov bx,[cs:firstmb] + dec bx + dec bx + xor ax,ax + xor dx,dx +@@searchfree: + mov gs,bx + cmp [word ptr gs:mb.check],"NH" + jne @@memoryerror + inc bx + inc bx + add bx,[gs:mb.sizes] + cmp [word ptr gs:mb.sizes],0 + je @@notenougtmem + cmp [gs:mb.reference],free + jne @@notfree + cmp ax,0 + je @@notmeetfree + add dx,[gs:mb.sizes] + mov [word ptr gs:mb.check],0 + mov [dword ptr gs:mb.names],0 + inc dx + inc dx + jmp @@nottrigered +@@notmeetfree: + xor dx,dx + mov ax,gs + jmp @@nottrigered +@@notfree: + cmp ax,0 + je @@nottrigered + mov es,ax + add [es:mb.sizes],dx + xor ax,ax +@@nottrigered: + cmp [gs:mb.isnotlast],true + je @@searchfree + cmp ax,0 + je @@reallyfinish + mov es,ax + add [es:mb.sizes],dx + mov [es:mb.isnotlast],false +@@reallyfinish: + clc + ret +@@notenougtmem: + stc + ret +@@memoryerror: + stc + ret +endp mbclean + +;Rend le segment %0 résident +PROC mbresident FAR + ARG @blocks:word + USES bx,es + mov bx,[@blocks] + dec bx + dec bx + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + mov [es:mb.isresident],true + ret +@@memoryerror: + stc + ret +endp mbresident -;Change le proprietaire de GS a dx -MBChown: - push bx es - mov bx,gs +;Rend le segment %0 non résident +PROC mbnonresident FAR + ARG @blocks:word + USES bx,es + mov bx,[@blocks] + dec bx + dec bx + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + mov [es:mb.isresident],false + ret +@@memoryerror: + stc + ret +endp mbnonresident + + +;Change le proprietaire de %0 a %1 +PROC mbchown FAR + ARG @blocks:word,@owner:word + USES bx,dx,es + mov bx,[@blocks] dec bx dec bx mov es,bx - cmp es:[MB.Reference],Free - je wasfree2 - mov es:[MB.Reference],dx - pop es bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + cmp [es:mb.reference],free + je @@wasfree + mov dx,[@owner] + mov [es:mb.reference],dx ret -wasfree2: +@@memoryerror: stc - pop es bx ret +@@wasfree: + stc + ret +endp mbchown -;Alloue un bloc de CX caractere pour le process visé -> GS -MBAlloc: - push dx si bp ds - mov bp,sp - mov dx,ss:[bp+12] +;Alloue un bloc /data de CX caractere pour le process appelant -> ax +PROC mballoc FAR + ARG @size:word + USES ax,si,ds push cs pop ds - mov si,offset data - call MBCreate - call MBChown - pop ds bp si dx + call mbcreate,offset @@data,[@size] + call mbchown,ax,[word ptr ss:bp+4] ret - -data db '/Data',0 -;Renvoie en GS le MB n° cx carry quand terminé -MBGet: - push bx dx - mov bx,cs:firstmb +@@data db '/data',0 +endp mballoc + +;Renvoie en AX le MB n° %0 carry quand terminé +PROC mbget FAR + ARG @num:word + USES bx,dx,es + mov bx,[cs:firstmb] dec bx dec bx xor dx,dx -searchfree2: - mov gs,bx - cmp gs:[MB.Check],'NH' - jne itsend +@@searchfree: + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror inc bx inc bx - add bx,gs:[MB.Sizes] - cmp word ptr gs:[MB.Sizes],0 - je itsend - cmp dx,cx - je foundmcb - ja itsend + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@memoryerror + cmp dx,[@num] + je @@foundmcb + ja @@notfound inc dx - cmp gs:[MB.IsNotLast],true - je searchfree2 -itsend: + cmp [es:mb.isnotlast],true + je @@searchfree +@@memoryerror: stc - pop dx bx ret -foundmcb: +@@foundmcb: + mov ax,es + inc ax + inc ax clc - pop dx bx - ret + ret +@@notfound: + stc + ret +endp mbget -;Renvoie en GS le MCB qui correspond a ds:si -MBFind: - push ax bx si di - mov bx,cs:firstmb +;Renvoie en AX le MCB qui correspond a ds:%0 +PROC mbfind FAR + ARG @blocks:word + USES bx,si,di,es + mov bx,[cs:firstmb] dec bx dec bx - mov di,MB.Names -search: - mov gs,bx - cmp gs:[MB.Check],'NH' - jne itsend2 + mov si,[@blocks] + lea di,[es:mb.names] +@@search: + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror inc bx inc bx - add bx,gs:[MB.Sizes] - cmp word ptr gs:[MB.Sizes],0 - je itsend2 + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@memoryerror push si di -cmpnames: - mov al,gs:[di] - cmp al,ds:[si] - jne ok +@@cmpnames: + mov al,[es:di] + cmp al,[ds:si] + jne @@ok cmp al,0 - je ok + je @@ok inc si inc di - jmp cmpnames -ok: + jmp @@cmpnames +@@ok: pop di si - je foundmcb2 - cmp gs:[MB.IsNotLast],true - je search -itsend2: + je @@foundmcb + cmp [es:mb.isnotlast],true + je @@search +@@notfound: stc - pop di si bx ax ret -foundmcb2: - mov bx,gs - inc bx - inc bx - mov gs,bx +@@memoryerror: + stc + ret +@@foundmcb: + mov ax,es + inc ax + inc ax clc - pop di si bx ax ret - -;Renvoie en GS le sous mcb qui correspond a ds:si et qui appartien a dx -MBFindsb: - push ax bx si di - mov bx,cs:firstmb - dec bx - dec bx - mov di,MB.Names -search2: - mov gs,bx - cmp gs:[MB.Check],'NH' - jne itsend3 - inc bx - inc bx - add bx,gs:[MB.Sizes] - cmp word ptr gs:[MB.Sizes],0 - je itsend3 - push si di -cmpnames2: - mov al,gs:[di] - cmp al,ds:[si] - jne ok2 - cmp al,0 - je ok2 - inc si - inc di - jmp cmpnames2 -ok2: - pop di si - jne notfoundmcb2 - cmp gs:[MB.Reference],dx - je foundmcb3 -notfoundmcb2: - cmp gs:[MB.IsNotLast],true - je search2 -itsend3: - stc - pop di si bx ax - ret -foundmcb3: - mov bx,gs - inc bx - inc bx - mov gs,bx - clc - pop di si bx ax - ret - -;Creér un bloc de nom ds:si de taille cx (octets) -> n°segment dans GS -MBCreate: - push bp - mov bp,sp - mov gs,ss:[bp+6] - push ax bx cx dx si di es - shr cx,4 - inc cx - mov bx,cs:firstmb - dec bx - dec bx - mov dl,1 -searchfree: - cmp dl,False - je wasntgood - mov es,bx - cmp es:[MB.Check],'NH' - jne wasntgood - cmp es:[MB.IsNotLast],True - sete dl - cmp es:[MB.Reference],Free - jne notsogood - mov ax,es:[MB.Sizes] - cmp cx,ax - ja notsogood - mov word ptr es:[MB.Check],'NH' - mov es:[MB.IsNotLast],True - mov es:[MB.Reference],gs - mov es:[MB.IsResident],False - mov di,MB.Names - push ax cx - mov cx,32 -loops: - mov dh,[si] - inc si - dec cx - jz endofloops - cmp dh,0 - je endofloops - mov es:[di],dh - inc di - jmp loops -endofloops: - inc cx - mov al,0 - rep stosb - pop cx ax - inc bx - inc bx - sub ax,cx - dec ax - dec ax - cmp ax,0 - je nofree - mov es:[MB.Sizes],cx - add cx,bx - mov es,cx - mov es:[MB.IsNotLast],dl - mov es:[MB.IsResident],False - mov es:[MB.Reference],Free - mov es:[MB.Sizes],ax - mov dword ptr es:[MB.Names],'eerF' - mov dword ptr es:[MB.Names+4],0 - mov es:[MB.Check],'NH' -nofree: - mov gs,bx - clc - pop es di si dx cx bx ax - pop bp - ret -wasntgood: - stc - pop es di si dx cx bx ax - pop bp - ret -notsogood: - inc bx - inc bx - add bx,es:[MB.Sizes] - jmp searchfree +endp mbfind -;Rend le segment GS résident -MBresident: - push bx es - mov bx,gs + +;Renvoie en AX le sous mcb qui correspond a %0 et qui appartien a %1 +PROC mbfindsb FAR + ARG @blocks:word,@owner:word + USES bx,dx,si,di,es + mov bx,[cs:firstmb] dec bx - dec bx - mov es,bx - mov es:[MB.IsResident],True - pop es bx + dec bx + mov si,[@blocks] + lea di,[es:mb.names] + mov dx,[@owner] +@@search: + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + inc bx + inc bx + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@memoryerror + push si di +@@cmpnames: + mov al,[es:di] + cmp al,[ds:si] + jne @@ok + cmp al,0 + je @@ok + inc si + inc di + jmp @@cmpnames +@@ok: + pop di si + jne @@notfoundmcb + cmp [es:mb.reference],dx + je @@foundmcb +@@notfoundmcb: + cmp [es:mb.isnotlast],true + je @@search +@@notfound: + stc ret - -end start +@@foundmcb: + mov ax,es + inc ax + inc ax + clc + ret +@@memoryerror: + stc + ret +endp mbfindsb + +;Resouds les dépendances du bloc de mémoire %0 +PROC mbloadfuncs FAR + ARG @blocks:word + USES ax,bx,cx,dx,si,ds + mov ds,[@blocks] + cmp [word ptr 0],"EC" + jne @@notace + mov si,[ds:exe.imports] + cmp si,0 + je @@endofloading +@@loadfuncs: + cmp [word ptr si],0 + je @@endofloading + call mbsearchfunc,si + jnc @@toendoftext + mov bx,si +@@findend: + inc bx + cmp [byte ptr bx], ':' + jne @@findend + mov [byte ptr bx],0 +;call projectfile,bx + jc @@erroronload + mov [byte ptr bx],':' + call mbsearchfunc,si + jc @@libnotexist +@@toendoftext: + mov cl,[si] + cmp cl,0 + je @@oktonext + inc si + jmp @@toendoftext +@@oktonext: + inc si + mov [si],ax + mov [si+2],dx + add si,4 + jmp @@loadfuncs +@@endofloading: + clc + ret +@@notace: + stc + ret +@@libnotexist: + stc + ret +@@erroronload: + stc + ret +endp mbloadfuncs + + +;Recherche une fonction pointé par DS:SI en mémoire et renvoie son adresse en DX:AX +PROC mbsearchfunc FAR + ARG @func:word + USES bx,si,di,es + mov bx,[@func] + push bx +@@findend: + inc bx + cmp [byte ptr bx], ':' + jne @@findend + mov [byte ptr bx],0 + call mbfind + mov [byte ptr bx],':' + jc @@notfoundattallthesb + mov es,ax + cmp [word ptr es:exe.checks],"EC" + jne @@notfoundattallthesb + mov di,[es:exe.exports] + inc bx + inc bx +@@functions: + cmp [word ptr es:di],0 + je @@notfoundattallthesb + mov si,bx +@@cmpnamesfunc: + mov al,[es:di] + cmp al,[ds:si] + jne @@notfoundthesb + cmp al,0 + je @@seemsok + inc si + inc di + jmp @@cmpnamesfunc +@@notfoundthesb: + mov al,[es:di] + cmp al,0 + je @@oktonext + inc di + jmp @@notfoundthesb +@@oktonext: + inc di + inc di + inc di + jmp @@functions +@@seemsok: + mov dx,es + mov ax,[es:di+1] + clc + ret +@@notfoundattallthesb: + stc + ret +endp mbsearchfunc diff --git a/noyau/port.asm b/noyau/port.asm index 2e185f7..c4a588d 100644 --- a/noyau/port.asm +++ b/noyau/port.asm @@ -2,7 +2,7 @@ .486 smart .code -org 0100h +org 0h start: jmp tsr drv db 'LPT ',0 diff --git a/noyau/souris.asm b/noyau/souris.asm index c639cfa..ab8b210 100644 --- a/noyau/souris.asm +++ b/noyau/souris.asm @@ -2,7 +2,7 @@ .486 smart .code -org 0100h +org 0h start: jmp tsr drv db 'MOUSE',0 diff --git a/noyau/systeme.asm b/noyau/systeme.asm index 876a786..b7f1c4d 100644 --- a/noyau/systeme.asm +++ b/noyau/systeme.asm @@ -1,1213 +1,238 @@ -.model tiny -.486 -smart -.code +model tiny,stdcall +p586N +locals +jumps +codeseg +option procalign:byte -org 0100h +include "..\include\mem.h" +include "..\include\divers.h" +include "..\include\cpu.h" +include "..\include\pci.h" -include ..\include\fat.h -include ..\include\mem.h +org 0h + +mb0: +header exe <"CE",1,0,0,offset exports,offset imports,offset section,offset start> start: -push cs -push cs -push cs -push cs -pop ds -pop es -pop fs -pop gs - xor ax,ax - mov ds,ax - mov si,7C00h - mov di,offset myboot - mov cx,type bootsector - push cs - pop es - rep movsb - push cs - pop ds -jmp noone - xor ax,ax - mov es,ax - mov di,1Eh*4 - lds si,es:[di] - mov es:[di],cs - mov word ptr es:[di],offset myDPT - push cs - pop es - mov cx,type DPT - rep movsb - mov ax,cs:[Bootsector.SectorsPerTrack] - mov es:[DPT.SectorPerTracks],al -noone: - push cs - push cs - push cs - push cs - pop ds - pop es - pop fs - pop gs - mov si,offset present - mov bl,4 - call showstr - mov si,offset premice2 - mov bl,7 - call showstr - call MBinit - jc nomem1 - call InitDrive - mov si,offset premice - mov bl,7 - call showstr - mov si,offset next - call showstr - mov si,offset conf - call showstr - mov al,0 - mov cx,2000 - mov di,offset loadinglist - rep stosb - mov di,offset loadinglist - call loadfile - jc noconfread - mov si,offset debut - mov bl,7 - call showstr - xor cx,cx - mov si,offset loadinglist -suiteloading: - call readline - jc noconfload - mov bl,7 - push si - mov si,offset next - call showstr - pop si - call showstr - xor bp,bp - mov dx,ax - cmp ax,8h - jb noadder - cmp ax,10h - ja noadder - mov bp,1 - sub dx,8 - jmp haveirq -noadder: - cmp ax,70h - jb noadd - cmp ax,78h - ja noadd - mov bp,1 - sub dx,68h -haveirq: - push si - mov si,offset irqs - call showstr - mov cx,4 - call showhex - mov si,offset irqsend - call showstr - pop si -noadd: - cmp bp,1 - jne install - call replacehandler - jmp suites -install: - call installhandler -suites: - jc nohandlerload - mov dx,es - mov bl,7 - push si - mov si,offset address - call showstr - mov cx,16 - call showhex - mov si,offset addressend - call showstr - inc cx - pop si - call nextline - jnz suiteloading - - ;initialisation des MCBs - mov ah,0 - int 49h - - mov si,offset fini - mov bl,7 - call showstr - mov si,offset next - call showstr - mov si,offset prompt - call showstr - call projfile - jc nopromptload - push es - push 0100h - push 7202h - popf - push es - push es - push es - pop ds - pop fs - pop gs - db 0CBh - -nopromptload: - mov si,offset prompte - mov bl,4 - call showstr - jmp erroron - -nohandlerload: - mov si,offset handlere - mov bl,4 - call showstr - jmp erroron - -noconfread: - mov si,offset confee - mov bl,4 - call showstr - jmp erroron - -nomem1: - mov si,offset premice2e - mov bl,4 - call showstr - jmp erroron - -nomem2: - mov si,offset premice3e - mov bl,4 - call showstr - jmp erroron - - -noconfload: - mov di,si - mov si,offset confe - mov bl,4 - call showstr - mov dx,cx - mov cx,16 - call showhex - mov si,offset confe2 - mov bl,3 - call showstr - mov dx,di - mov cx,16 - call showhex - -erroron: - push cs - pop ds - mov si,offset erreur - mov bl,4 - call showstr - mov ax,0 - int 16h - push 0FFFFh - push 0 - db 0CBh - -address db ' [',0 -addressend db ':0100] ',0 -irqs db ' (IRQ ',0 -irqsend db ')',0 -prompt db 'commande.exe',0 -conf db 'systeme.ini',0 -premice db 0Dh,0Ah,'Chargement du fichier de configuration:',0 -debut db 0Dh,0Ah,'Chargement des pilotes systeme:',0 -fini db 0Dh,0Ah,'Chargement de l''interpreteur de commande:',0 -next db 0Dh,0Ah,' - ',0 -prompte db 0Dh,0Ah,'Erreur lors du chargement de l''interpreteur',0 -handlere db 0Dh,0Ah,'Erreur lors du chargement des pilotes',0 -confe db 0Dh,0Ah,'Erreur dans le fichier de configuration a la ligne ',0 -confee db 0Dh,0Ah,'Erreur de lecture du fichier de configuration',0 -confe2 db ' caractere ',0 -erreur db 0Dh,0Ah,'Pressez une touche pour redemarrer...',0 -present db 0Dh,0Ah,'COS2000 Version 1.2',0 -premice2 db 0Dh,0Ah,'Initialisation de la memoire',0 -premice2e db 0Dh,0Ah,'Erreur lors de l''initialisation memoire',0 -premice3e db 0Dh,0Ah,'Erreur lors de la reservation memoire',0 -;==positionne si sur l'entrée suivante de la loading liste jusqu'a equal -nextline: -push ax cx di -push cs -pop es -mov di,si -mov al,0Ah -mov cx,20 -cld -repnz scasb -mov si,di -cmp byte ptr [di],0 -pop di cx ax -ret - -;==Lit la loading list et initialise SI(Fichier) AX(interruption) -readline: -push cx dx di es -push cs -pop es -;Voir taille de la ligne -> DX -mov di,si -mov al,0Dh -mov cx,20 -cld -repne scasb -sub cx,20 -neg cx -mov dx,cx -;N° interruption ?? -mov di,si -mov al,'(' -repne scasb -jne noaddr -;Non, je recherche l'int positionnement parenthese de fin -mov al,')' -repne scasb -jne errorlist -;Je lit l'interruption dans DL -xor dl,dl -xor cx,cx -dec di -readingint: -dec di -mov al,[di] -cmp al,'(' -je finishint -call eval -jc errorlist -shl ax,cl -add dl,al -add cx,4 -cmp cx,8 -ja errorlist -jmp readingint -noaddr: -dec di -mov dl,0 -finishint: -;mise d'un 0 a la fin du nom -mov byte ptr [di],0 -mov al,dl -pop es di dx cx -clc -ret -errorlist: -sub di,si -mov si,di -pop es di dx cx -stc -ret - - -;return carry si pas hexa pour al et renvoie dans al la valeur décimale -eval: -push si -xor si,si -searchex: -cmp al,cs:[si+offset hexas] -je endsearchex -inc si -cmp si,15 -jbe searchex -pop si -stc -ret -endsearchex: -mov ax,si -pop si -clc -ret - -hexas db '0123456789ABCDEF',0 - -;==============================Affiche le nombre nb hexa en EDX de taille CX et couleur BL============== -ShowHex: - push ax bx cx edx si di - mov di,cx - sub cx,32 - neg cx - shl edx,cl - shr di,2 - mov ah,09h - and bx,1111b -Hexaize: - rol edx,4 - mov si,dx - and si,1111b - mov al,[si+offset tab] - push cx - mov cx,1 - cmp al,32 - jb control2 - mov ah,09h - int 10h -control2: - mov ah,0Eh - int 10h - pop cx - dec di - jnz Hexaize - pop di si edx cx bx ax - ret -Tab db '0123456789ABCDEF' - -;==============================Affiche une chaine DS:SI de couleur BL============== -showstr: - push ax bx cx si - mov cx,1 -again: - lodsb - or al,al - jz fin - and bx,0111b - cmp al,32 - jb control - mov ah,09h - int 10h -control: - mov ah,0Eh - int 10h - jmp again - fin: - pop si cx bx ax - ret - - -;================================================ -;Routine de débogage -;================================================ -regdata: -eaxr dd 0 -ebxr dd 0 -ecxr dd 0 -edxr dd 0 -esir dd 0 -edir dd 0 -espr dd 0 -ebpr dd 0 -csr dw 0 -dsr dw 0 -esr dw 0 -fsr dw 0 -gsr dw 0 -ssr dw 0 - -reg db 0Dh,0Ah,"eax : ",0 - db 0Dh,0Ah,"ebx : ",0 - db 0Dh,0Ah,"ecx : ",0 - db 0Dh,0Ah,"edx : ",0 - db 0Dh,0Ah,"esi : ",0 - db 0Dh,0Ah,"edi : ",0 - db 0Dh,0Ah,"esp : ",0 - db 0Dh,0Ah,"ebp : ",0 - db 0Dh,0Ah,"cs : ",0 - db 0Dh,0Ah,"ds : ",0 - db 0Dh,0Ah,"es : ",0 - db 0Dh,0Ah,"fs : ",0 - db 0Dh,0Ah,"gs : ",0 - db 0Dh,0Ah,"ss : ",0 - -showreg: -pushad -pushf -push ds -mov cs:[eaxr],eax -mov cs:[ebxr],ebx -mov cs:[ecxr],ecx -mov cs:[edxr],edx -mov cs:[esir],esi -mov cs:[edir],edi -mov cs:[espr],esp -mov cs:[ebpr],ebp -mov cs:[csr],cs -mov cs:[dsr],ds -mov cs:[esr],es -mov cs:[fsr],fs -mov cs:[gsr],gs -mov cs:[ssr],ss -push cs -pop ds -mov si,offset poppp -call Showstr -mov si,offset reg -mov di,offset regdata -mov bx,7 -showregs: -cmp byte ptr cs:[si+6],":" -jne endshowregs -call Showstr -cmp byte ptr cs:[si+4]," " -je segsss -mov edx,cs:[di] -mov cx,32 -call Showhex -add di,4 -jmp showmax -segsss: -mov dx,cs:[di] -mov cx,16 -call Showhex -add di,2 -showmax: -add si,9 -mov bp,dx -push si -mov si,offset beginds -call showstr -mov si,bp -mov cx,8 -mov al,0 -letshow: -mov dl,ds:[si] -inc si -call showhex -inc al -cmp al,10 -jb letshow -mov si,offset ende -call showstr -mov si,offset begines -call showstr -mov si,bp -mov cx,8 -mov al,0 -letshow2: -mov dl,es:[si] -inc si -call showhex -inc al -cmp al,10 -jb letshow2 -mov si,offset ende -call showstr -pop si -jmp showregs -endshowregs: -mov si,offset poppp -call Showstr -xor ax,ax -int 16h -pop ds -popf -popad -ret -begines db ' es[',0 -beginds db ' ds[',0 -ende db '] ',0 - -;vide ES pour 200 octets (pour test) -showmem: -pushad -pushf -mov si,offset poppp -mov bx,7 -call Showstr -mov dx,es -mov cx,16 -mov bx,7 -call ShowHex -mov si,offset poppp -mov bx,7 -call Showstr -xor si,si -loopererr: -mov dx,es:[si] -mov cx,8 -mov bx,7 -call ShowHex -inc si -cmp si,200 -jb loopererr -mov si,offset poppp -mov bx,7 -call Showstr -xor ax,ax -int 16h -popf -popad -ret - -poppp db 0Ah,0Dh,'*********',0Ah,0Dh,0 - -;================================================ -;Routine de gestion de la mémoire -;================================================ - -include ..\include\mem.h - -FirstMB dw 0 - - -;Initialise les blocs de mémoire en prenant GS pour segment de base -MBinit: - push ax cx es - mov ax,memorystart - mov cs:Firstmb,ax - mov cx,0A000h - sub cx,ax - dec ax - dec ax - mov es,ax - mov es:[MB.Reference],Free - mov es:[MB.Sizes],cx - mov es:[MB.Check],'NH' - mov dword ptr es:[MB.Names],'eerF' - mov dword ptr es:[MB.Names+4],0 - mov es:[MB.IsNotLast],False - clc - pop es cx ax - ret -notforfree: - stc - pop es cx ax - ret - -;Creér un bloc de nom ds:si de taille cx (octets) -> n°segment dans GS -MBCreate: - push ax bx cx dx si di es - shr cx,4 - inc cx - mov bx,cs:firstmb - dec bx - dec bx - mov dl,1 -searchfree: - cmp dl,False - je wasntgood - mov es,bx - cmp es:[MB.Check],'NH' - jne wasntgood - cmp es:[MB.IsNotLast],True - sete dl - cmp es:[MB.Reference],Free - jne notsogood - mov ax,es:[MB.Sizes] - cmp cx,ax - ja notsogood - mov word ptr es:[MB.Check],'NH' - mov es:[MB.IsNotLast],True - mov es:[MB.Reference],cs - mov es:[MB.IsResident],True - mov es:[MB.Sizes],cx - mov di,MB.Names - push ax cx - mov cx,32 -loops: - mov dh,[si] - inc si - dec cx - jz endofloops - cmp dh,0 - je endofloops - mov es:[di],dh - inc di - jmp loops -endofloops: - inc cx - mov al,0 - rep stosb - pop cx ax - sub ax,cx - dec ax - dec ax - ;js nofree - inc bx - inc bx - mov gs,bx - add bx,cx - mov es,bx - mov es:[MB.IsNotLast],dl - mov es:[MB.IsResident],False - mov es:[MB.Reference],Free - mov es:[MB.Sizes],ax - mov dword ptr es:[MB.Names],'eerF' - mov dword ptr es:[MB.Names+4],0 - mov es:[MB.Check],'NH' -nofree: - clc - pop es di si dx cx bx ax - ret -wasntgood: - stc - pop es di si dx cx bx ax - ret -notsogood: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + call biosprint,offset return + call biosprint,offset msg_memory + call biosprint,offset return + call biosprint,offset msg_memory_init + call mbinit + jc error + call biosprint,offset msg_ok + call biosprint,offset msg_memory_section + mov ax,cs + dec ax + dec ax + call mbloadsection,ax + jc error + call biosprint,offset msg_ok + call biosprint,offset msg_memory_jumps + jmp [dword ptr cs:pointer] +pointer: + dw suite + dw memorystart +suite: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + call biosprint,offset msg_ok + call biosprint,offset msg_video_init + call [setvideomode],2 + jc error + call [clearscreen] + call [print],offset msg_memory + call [print],offset msg_ok2 + call [print],offset msg_memory_init + call [print],offset msg_ok2 + call [print],offset msg_memory_section + call [print],offset msg_ok2 + call [print],offset msg_memory_jumps + call [print],offset msg_ok2 + call [print],offset msg_video_init + call [print],offset msg_ok2 + call [print],offset msg_cpu_detect + call [cpuinfo],offset thecpu + call [setinfo],offset thecpu,offset temp + call [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 [print],offset msg_cpu_detect_inf + call [print],offset msg_pci + call [pciinfo],offset thepci + jc nopci + call [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 [print],offset msg_pci_info + call [print],offset msg_pci_enum + xor ebx,ebx + xor ecx,ecx + xor esi,esi +searchpci: + call [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 [getpcisubclass] + push dx + push ax + mov al,[(pcidata offset temp).class] + xor ah,ah + push ax + call [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 [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 - inc bx - add bx,es:[MB.Sizes] - jmp searchfree + cmp bx,16 + jbe searchpci + jmp next +nopci: + call [print],offset msg_echec2 +next: + call [print],offset msg_fini +; call [detectvmware] +; jne novirtual +; call [print],offset msg_vmware +;novirtual: -;================================================ -;Routine de gestion de handler -;================================================ +error2: + call [print],offset msg_error2 + call bioswaitkey + jmp far 0FFFFh:0000h -;remplace le handler pointer par ds:si en bloc:100h interruption ax -replacehandler: -push ax bx cx si di ds -call projfile -jc reph -mov bx,ax -call getint -mov es:[102h],si -mov es:[104h],ds -call setint -reph: -pop ds di si cx bx ax -ret - -;install le handler pointer par ds:si en bloc:100h interruption ax -> es -installhandler: -push bx cx -call projfile -jc insh -mov bx,ax -call setint -insh: -pop cx bx -ret - -;met es:100h le handle de l'int bx -setint: -push ax bx ds -cli -shl bx,2 -xor ax,ax -mov ds,ax -mov word ptr ds:[bx],0100h -mov ds:[bx+2],es -pop ds bx ax -sti -ret +error: + call biosprint,offset msg_error + call bioswaitkey + jmp far 0FFFFh:0000h + -;met dans ds:si le handle de l'int bx -getint: -push ax bx es -shl bx,2 -xor ax,ax -mov es,ax -mov si,es:[bx] -mov ds,es:[bx+2] -pop es bx ax -ret +thepci pciinf <> +thecpu cpu <> +temp db 256 dup (0) +return db 0dh,0ah,0 +msg_memory db "Initialisation de la memoire",0 +msg_memory_init db " -Creation du bloc primordial",0 +msg_memory_section db " -Developpement des sections",0 +msg_memory_jumps db " -Redirection du systeme",0 +msg_video_init db "Initialisation du pilote VIDEO",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 -Nombre de bus : %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 " | %hW | %hW |%w|%w|%w|%0P.%0P\l",0 +;msg_vmware db "\c04 VMWare a été detecté !!!\c07",0 +msg_fini db "\c04Demarrage terminee : c pas encore fini :(:(:( mais c pour l'inspiration !",0 -;================================================ -;Routine de gestion de systeme de fichier FAT12 -;================================================ +msg_error db " [Erreur]",0dh,0ah,"",0 +msg_ok db " [ Ok ]",0dh,0ah,0 +msg_error2 db "\h70 [\c04Erreur\c07]\g00,49",0 +msg_ok2 db "\h70 [\c02 Ok \c07]\l",0 +msg_echec2 db "\h70 [\c0CPasser\c07]\l",0 + +imports: + db "VIDEO::setvideomode",0 +setvideomode dd 0 + db "VIDEO::clearscreen",0 +clearscreen dd 0 + db "VIDEO.LIB::print",0 +print dd 0 + db "DETECT.LIB::cpuinfo",0 +cpuinfo dd 0 + db "DETECT.LIB::setinfo",0 +setinfo dd 0 + db "DETECT.LIB::pciinfo",0 +pciinfo dd 0 + db "DETECT.LIB::getcardinfo",0 +getcardinfo dd 0 + db "DETECT.LIB::getpcisubclass",0 +getpcisubclass dd 0 + db "DETECT.LIB::getpciclass",0 +getpciclass dd 0 + ;db "DETECT.LIB::detectvmware",0 +;detectvmware dd 0 + dw 0 + +exports: +include "mcb.asm" +mb1: +includebin "video.sys" +mb2: +includebin "..\lib\video.lib" +mb3: +includebin "..\lib\detect.lib" +mb4: -;DPT disquette -mydpt DPT ? +section: +dw offset mb0 +dw offset mb1-offset mb0 +db "SYSTEME",0 -;Secteur de boot -myboot bootSector ? +dw offset mb1 +dw offset mb2-offset mb1 +db "VIDEO",0 -;Données Calculée -clustersize dw 0 -TracksPerHead dw 0 -DriveSize dd 0 -AdressBoot dw 0 -AdressFat dw 0 -AdressParent dw 0 -AdressData dw 0 -AddingValue dw 0 -CurrentDir dw 0 ;En cluster -CurrentDirStr db 128 dup (0) +dw offset mb2 +dw offset mb3-offset mb2 +db "VIDEO.LIB",0 -;Pour recherches -EntryPlace dw 0 ;En octet -AdressDirectory dw 0 ;En cluster -firstsearch dw 1 ;Premiere requete ? +dw offset mb3 +dw offset mb4-offset mb +db "DETECT.LIB",0 -getfat: - push ax bx dx si - mov ax,cx - mov bx,ax - and bx,0000000000000001b - shr ax,1 - mov cx,3 - mul cx - mov si,offset bufferfat - add si,ax - cmp bx,0h - jnz evenfat -oddfat: - mov dx,cs:[si] - and dx,0FFFh - mov cx,dx - jmp endfat -evenfat: - mov dx,cs:[si+1] - and dx,0FFF0h - shr dx,4 - mov cx,dx -endfat: - cmp dx,0FF0h - jbe nocarry - stc - pop si dx bx ax - ret -nocarry: - clc - pop si dx bx ax - ret +dd 0 + -;============projfile (Fonction 17)=============== -;Charge le fichier ds:si sur un bloc mémoire -> ecx taille -> es bloc -;-> AH=17 -;<- Flag Carry si erreur -;===================================================== -projfile: - push eax bx di gs - push cs - pop es - call uppercase - mov di,offset tempfit - call searchfile - jne errorload - jc errorload - mov eax,cs:tempfit.FileSize - mov ecx,eax - add ecx,100h - call MBCreate - jc errorload - push gs - pop es - mov cx,cs:tempfit.FileGroup - mov di,100h - call loadway - jc errorload - clc - mov ecx,eax - pop gs di bx eax - ret -errorload: - stc - mov ecx,0 - pop gs di bx eax - ret - -;============loadfile (Fonction 4)=============== -;Charge le fichier ds:si en es:di ->ecx taille -;-> AH=4 -;<- Flag Carry si erreur -;===================================================== -loadfile: - push eax bx di - push es di - push cs - pop es - mov di,offset tempfit - call searchfile - pop di es - jne errorload - jc errorload - mov cx,cs:tempfit.FileGroup - mov eax,cs:tempfit.FileSize - call loadway - jc errorload2 - clc - ;mov ecx,eax - pop di bx eax - ret -errorload2: - stc - mov ecx,0 - pop di bx eax - ret - -tempfit db 32 dup (0) - -;=============SearchFile (Fonction 10)=============== -;Renvois dans ES:DI la fit du fichier DS:SI et non equal si pas existant -;-> AH=10 -;<- Flag Carry si erreur -;===================================================== -SearchFile: - push ax cx ds si di es - call uppercase - push ds si - call findfirstfilez - push ds - pop es - mov di,si - pop si ds - jc errorsearch - jmp founded -nextsearch: - push ds si - call findnextfilez - push ds - pop es - mov di,si - pop si ds -founded: - cmp byte ptr cs:[di],0 - je notgood - cmp byte ptr cs:[di+FileAttr],0Fh - je nextsearch - call cmpnames - jc nextsearch -okfound: - push cs - pop ds - mov si,di - pop es di - push di es - mov cx,32 - rep movsb - clc - pop es di si ds cx ax - ret -notgood: - cmp si,0FF5h - pop es di si ds cx ax - ret -errorsearch: - stc - pop es di si ds cx ax - ret - -;Transforme la chaine ds:si en maj -uppercase: - push si ax - mov di,si -uppercaser: - mov al,ds:[si] - cmp al,0 - je enduppercase - cmp al,'a' - jb nonmaj - cmp al,'z' - ja nonmaj - sub al,'a'-'A' - mov ds:[si],al -nonmaj: - inc si - jmp uppercaser -enduppercase: - clc - pop ax si - ret - -;Compare le nom ds:si '.' avec es:di -CmpNames: - push ax cx si di - mov cx,8 - repe cmpsb - jne nequal - inc si -nequal: - cmp byte ptr [si-1],'.' - jne trynoext - mov al,' ' - rep scasb - mov cx,3 - rep cmpsb - jne notequal - cmp byte ptr [si],0 - jne notequal - cmp cx,0 - jl notequal -itok: - pop di si cx ax - ret -trynoext: - cmp byte ptr [si-1],0 - jne notequal - jmp itok -notequal: - stc - pop di si cx ax - ret - -;charge le fichier de de groupe CX et de taille eax -LoadWay: - push eax bx dx si di ecx ds es - cmp eax,0 - je Zeroload - rol eax,16 - mov dx,ax - ror eax,16 - div cs:clusterSize - mov bx,ax - cmp bx,1 - jb adjustlast -Loadfat: - call readcluster - jc noway - add di,cs:clusterSize - call getfat - dec bx - jnz loadfat -AdjustLast: - push es di - push cs - pop es - mov di,offset bufferread - mov si,di - call Readcluster - pop di es - jc noway - mov cx,dx - push cs - pop ds - rep movsb -zeroload: - clc - pop es ds ecx di si dx bx eax - ret -noway: - stc - pop es ds ecx di si dx bx eax - ret - -;=============INITDRIVE (Fonction 04H)=============== -;Initialise le lecteur pour une utilisation ultérieure -;-> AH=4 -;<- Flag Carry si erreur -;===================================================== -InitDrive: - push eax bx cx edx di ds es - push cs - pop ds - push cs - pop es - mov cs:lastseg,0 - mov cs:lastoff,0 - mov cs:LastRead,0 - mov ax,myboot.sectorsize - mov bl,myboot.SectorsPerCluster - xor bh,bh - mul bx - mov clustersize,ax - mov bx,myboot.HiddenSectorsL - adc bx,myboot.HiddenSectorsH - mov AdressBoot,bx - add bx,myboot.ReservedSectors - mov AdressFat,bx - xor ax,ax - mov al,myboot.FatsPerDrive - mul myboot.SectorsPerFat - add bx,ax - mov AdressParent,bx - mov AdressDirectory,bx - mov ax,32 - mul myboot.DirectorySize - div myboot.SectorSize - add bx,ax - mov AdressData,bx - sub bx,2 - mov AddingValue,bx - mov ax,myboot.SectorsPerDrive - div myboot.SectorsPerTrack - xor dx,dx - div myboot.HeadsPerDrive - mov TracksPerHead,ax - xor eax,eax - mov ax,myboot.SectorsPerDrive - sub ax,AdressData - mul myboot.SectorSize - shl edx,16 - add edx,eax - mov DriveSize,edx - mov CurrentDir,0 - mov EntryPlace,0 - mov adressdirectory,0 - mov firstsearch,1 - mov currentdirstr,0 - mov di,offset bufferfat - mov dx,myboot.SectorsPerFat - mov cx,AdressFat -SeeFat: - call readsector - jc ErrorInit - add di,myboot.SectorSize - inc cx - dec dx - jnz seefat - clc - pop es ds di edx cx bx eax - ret -ErrorInit: - stc - pop es ds di edx cx bx eax - ret - -;=============FindFirstFile (Fonction 7)============== -;Renvois dans ES:DI un bloc d'info -;-> AH=7 -;<- Flag Carry si erreur -;===================================================== -FindFirstFileZ: - push cx - mov cx,cs:CurrentDir - mov cs:AdressDirectory,cx - xor cx,cx - mov cs:EntryPlace,cx - mov cs:firstsearch,1 - call findnextfileZ - pop cx - ret - -;=============FindnextFile (Fonction 8)============== -;Renvois dans ES:DI un bloc d'info -;-> AH=8 -;<- Flag Carry si erreur -;===================================================== -;fait pointer ds:si sur la prochaine entrée du repertoire courant -FindnextFileZ: - push ax bx cx es di - push cs - pop ds - mov cx,cs:AdressDirectory - mov bx,cs:Entryplace -FindnextFileagain: - cmp cs:firstsearch,1 - je first - add bx,32 - cmp bx,cs:clusterSize - jb nopop -first: - mov di,offset bufferentry - push cs - pop es - mov bx,0 - cmp cs:currentdir,0 - jne notrootdir - cmp cs:firstsearch,1 - je noaddfirst1 - inc cx -noaddfirst1: - add cx,cs:adressparent - mov al,myboot.sectorspercluster -readroot: - call readsector - jc notwell - add di,myboot.sectorsize - dec al - jnz readroot - sub cx,cs:adressparent - jmp nopop -notrootdir: - cmp cs:firstsearch,1 - je noaddfirst2 - call getfat -noaddfirst2: - jc notwell - call readcluster - jc notwell -nopop: - mov cs:firstsearch,0 - mov si,offset bufferentry - add si,bx - cmp byte ptr cs:[si],0 - je notwell - mov cs:entryplace,bx - mov cs:AdressDirectory,cx - cmp byte ptr cs:[si],0E5h - je findnextfileagain - cmp byte ptr cs:[si+fileattr],28h - je findnextfileagain - cmp byte ptr cs:[si+fileattr],0Fh - je findnextfileagain - clc - pop di es cx bx ax - ret -notwell: - stc - pop di es cx bx ax - ret - - -;=============READCLUSTER (Fonction 14)=============== -;Lit le secteur CX et le met en es:di -;-> AH=14 -;<- Flag Carry si erreur -;===================================================== -readcluster: - push ax bx cx dx di - mov ax,cx - mov bl,cs:myboot.sectorspercluster - xor bh,bh - mul bx - mov cx,ax - add cx,cs:addingvalue -readsectors: - call readsector - jc errorreadincluster - add di,cs:myboot.sectorsize - inc cx - dec bl - jnz readsectors - clc - pop di dx cx bx ax - ret -errorreadincluster: - stc - pop di dx cx bx ax - ret - -;=============READSECTOR (Fonction 01H)=============== -;Lit le secteur CX et le met en es:di -;-> AH=1 -;<- Flag Carry si erreur -;===================================================== -ReadSector: - push ax bx cx dx si - cmp cx,cs:lastread - jne gom - mov ax,es - cmp cs:lastseg,ax - jne gom - cmp di,cs:lastoff - jne gom - jmp done -gom: - mov cs:lastseg,ax - mov cs:lastoff,di - mov cs:LastRead,cx - mov ax,cx - xor dx,dx - div cs:myboot.SectorsPerTrack - inc dl - mov bl,dl - xor dx,dx - div cs:myboot.HeadsPerDrive - mov dh,cs:myboot.bootdrive - xchg dl,dh - mov cx,ax - xchg cl,ch - shl cl,6 - or cl,bl - mov bx,di - mov SI,4 - mov AL,1 -TryAgain: - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -Done: - pop si dx cx bx ax -ret - -lastread dw 0 -lastseg dw 0 -lastoff dw 0 - -bufferread equ $ -bufferFat equ $+2048 -bufferentry equ $+2048+2048 -loadinglist equ $+2048+2048+2048 -end start diff --git a/noyau/video.asm b/noyau/video.asm index 0c8b133..79bbc55 100644 --- a/noyau/video.asm +++ b/noyau/video.asm @@ -1,105 +1,86 @@ -.model tiny -.486 -smart -.code +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte -org 0100h +include "..\include\mem.h" +include "..\include\graphic.h" -include ..\include\bmp.h +org 0h -start: - jmp tsr ;Saute à la routine résidente -names db 'VIDEO' ;Nom drivers -id dw 1234h ;Identifiant drivers -Tsr: - cli ;Désactive interruptions logiciellement - cmp ax,cs:ID ;Compare si test de chargement - jne nomore ;Si pas test alors on continu - rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé - jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO -nomore: - cmp ah,maxfunc - jbe noerrorint - stc - jmp itsok - noerrorint: - clc - push bx - mov bl,ah ;On calcule d'aprés le n° de fonction - xor bh,bh ;quel sera l'entrée dans la table indexée - shl bx,1 ;des adresses fonctions. - mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table - mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine - pop bx - clc - call cs:current ;Puis on execute la fonction -itsok: - push bp - mov bp,sp ;On prend sp dans bp pour adresser la pile - jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? - or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET - ;xor eax,eax - ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique - ;shl eax,4 ;de l'erreur. - ;add ax,cs:current - ;jmp endofint ;on termine l'int -noerror: - and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET -endofint: - pop bp - sti ;On réactive les interruptions logiciellement - iret ;Puis on retourne au programme appelant. +header exe <"CE",1,0,0,offset exports,,,> -current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée -tables dw setvideomode ;Table qui contient les adresses de toutes les fonctions de VIDEO (WORD) + +exports: + db "setvideomode",0 + dw setvideomode + db "getvideomode",0 dw getvideomode + db "clearscreen",0 dw clearscreen + db "setfont",0 dw setfont + db "loadfont",0 dw loadfont - dw showspace - dw showline + db "getfont",0 + dw getfont + db "addline",0 + dw addline + db "showchar",0 dw showchar - dw showint - dw showsigned - dw showhex - dw showbin - dw showstring - dw showstring0 - dw showcharat - dw showintat - dw showsignedat - dw showhexat - dw showbinat - dw showstringat - dw showstring0at + db "showpixel",0 + dw showpixel + db "getpixel",0 + dw getpixel + db "setstyle",0 + dw setstyle + db "getstyle",0 + dw getstyle + db "enablecursor",0 + dw enablecursor + db "disablecursor",0 + dw disablecursor + db "setcolor",0 dw setcolor + db "getcolor",0 dw getcolor + db "scrolldown",0 dw scrolldown + db "getxy",0 dw getxy - dw setxy2 + db "setxy",0 + dw setxy + db "savescreen",0 dw savescreen + db "restorescreen",0 dw restorescreen + db "page2to1",0 dw page2to1 + db "page1to2",0 dw page1to2 - dw xchgPages - dw savepage1 - dw changelineattr + ;db "xchgPages",0 + ;dw xchgpages + db "waithretrace",0 + dw waithretrace + db "waitretrace",0 dw waitretrace + db "getvgainfos",0 dw getvgainfos - dw loadbmppalet - dw showbmp - dw viewbmp - dw savedac - dw restoredac - dw savestate - dw restorestate + ;db "savedac",0 + ;dw savedac + ;db "restoredac",0 + ;dw restoredac + ;db "savestate",0 + ;dw savestate + ;db "restorestate",0 + ;dw restorestate + db "enablescroll",0 dw enablescroll + db "disablescroll",0 dw disablescroll - dw showdate - dw showtime - dw showname - dw showattr - dw showsize + db "getchar",0 dw getchar ;================================Table des modes videos (64 BYTES) ============================================ @@ -192,316 +173,226 @@ mode9 DB 0E7H, 00H, 03H,01H,0FH,00H,06H DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH DB 41H,00H,0FH,00H,00H DB 50,75 + +;640*480 16 couleurs +mode10 DB 0E3H + DB 00H + DB 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,53H,9FH,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,00H,0E9H,8BH,0DFH,28H,00H,0E7H,04H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH,01H,00H,0FH,00H,00H + DB 80,60 -DATABLOCKSIZE equ 40 -DATABLOCK equ $ +;800*600 16 couleurs +mode11 DB 0E7H + DB 00H + DB 03H,01H,0FH,00H,06H + DB 70H,63H,64H,92H,65H,82H,70H,0F0H,00H,60H,00H,00H,00H,00H,00H,00H,5BH,8CH,57H,32H,00H,58H,70H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH,01H,00H,0FH,00H,00H + DB 100,75 + + +datablocksize equ 40 +datablock equ $ ;============================================DATABLOCK========================================================= -lines db 0 +lines db 0 columns db 0 -x db 0 +x db 0 y db 0 xy dw 0 -colors db 7 +colors db 7 mode db 0FFh pagesize dw 0 -pages db 0 +style db 0 font db 0 graphic db 0 -xg dw 0 -yg dw 0 -style dw 0 +reserved1 dw 0 +reserved2 dw 0 +reserved3 dw 0 nbpage db 0 -pagesshowed db 0 -plane db 0 -xyg dw 0 -linesize dw 0 +color db 0 +cursor db 0 +segments dw 0 +linesize dw 0 adress dw 0 base dw 0 scrolling db 1 ;=======================================Equivalence pour la clarté du code======================================== -Sequencer equ 03C4h +sequencer equ 03C4h misc equ 03C2h -CCRT equ 03D4h -Attribs equ 03C0h +ccrt equ 03D4h +attribs equ 03C0h graphics equ 03CEh statut equ 03DAh -maxfunc equ 39h -maxmode equ 9 -planesize equ 64000 +maxmode equ 11 +planesize equ 65000 ;============================================Fonctions de l'int VIDEO=========================================== -;=============ENABLESCROLLING (Fonction 02AH)========= + +;=============ENABLESCROLLING========= +;Autorise le défilement +;-> +;<- +;===================================== +PROC enablescroll FAR + mov [cs:scrolling],1 + ret +endp enablescroll + +;=============DISABLESCROLLING========= +;Désactive le d‚filement +;-> +;<- +;====================================== +PROC disablescroll FAR + mov [cs:scrolling],0 + ret +endp disablescroll + +;=============ENABLECURSOR============= ;Autorise le d‚filement -;-> AH=42 -;<- -;===================================================== - EnableScroll: - mov cs:scrolling,1 +;-> +;<- +;====================================== +PROC enablecursor FAR + USES ax,dx + mov [cs:cursor],1 + mov dx,ccrt + mov al,0Ah + out dx,al + inc dx + in al,dx + and al,11011111b + mov ah,al + dec dx + mov al,0Ah + out dx,ax + mov al,[cs:x] + xor ah,ah + mov dl,[cs:y] + xor dh,dh + call setxy,ax,dx ret +endp enablecursor -;=============DISABLESCROLLING (Fonction 2Bh)========= +;=============DISABLECURSOR============= ;D‚sactive le d‚filement -;-> AH=43 -;<- -;===================================================== -DisableScroll: - mov cs:scrolling,0 +;-> +;<- +;======================================= +PROC disablecursor FAR + USES ax,dx + mov [cs:cursor],0 + mov dx,ccrt + mov al,0Ah + out dx,al + inc dx + in al,dx + or al,00100000b + mov ah,al + dec dx + mov al,0Ah + out dx,ax ret - -;================SHOWDATE (Fonction 2Ch)============== -;Affiche la date contenu en DX -;-> AH=44 -;<- -;===================================================== -ShowDate: - push ax cx edx - mov ax,dx - mov cx,2 - xor edx,edx - mov dx,ax - and dx,11111b - call showfixint - mov dl,'/' - call showchar - mov dx,ax - shr dx,5 - and dx,111b - call showfixint - mov dl,'/' - call showchar - mov dx,ax - shr dx,8 - and dx,11111111b - add dx,1956 - mov cx,4 - call showfixint - pop edx cx ax +endp disablecursor + +;==========SETSTYLE========= +;Change le style du texte a %0 +;-> %0 style +;<- +;============================ +PROC setstyle FAR + ARG @style:word + USES cx + mov ax,[@style] + mov [cs:style],al ret +endp setstyle -;================SHOWTIME (Fonction 2Dh)============== -;Affiche l'heure contenu en DX -;-> AH=45 -;<- -;===================================================== -ShowTime: - push ax cx edx - mov ax,dx - mov cx,2 - xor edx,edx - mov dx,ax - shr dx,11 - and dx,11111b - call showfixint - mov dl,':' - call showchar - mov dx,ax - shr dx,5 - and dx,111111b - call showfixint - mov dl,':' - call showchar - mov dx,ax - and dx,11111b - shl dx,1 - call showfixint - pop edx cx ax +;==========GETSTYLE========= +;Récupère le style du texte dans AX +;-> +;<- AX style +;=========================== +PROC getstyle FAR + mov al,[cs:style] + xor ah,ah ret +endp getstyle -;================SHOWNAME (Fonction 2Eh)============== -;Affiche le nom pointé par SI -;-> AH=46 -;<- -;===================================================== -ShowName: - push cx dx si - xor cx,cx -showthename: - mov dl,ds:[si] - call showchar - inc si - inc cx - cmp cx,8 - jne suiteaname - mov dl,' ' - call showchar -suiteaname: - cmp cx,8+3 - jb showthename - pop si dx cx - ret - -;================SHOWATTR (Fonction 2Fh)============== -;Affiche les attributs spécifié par DL -;-> AH=47 -;<- -;===================================================== -ShowAttr: - push dx - mov al,dl - - test al,00000001b - je noreadonly - mov dl,'L' - jmp readonly -noreadonly: - mov dl,'-' -readonly: - call showchar - - test al,00000010b - je nohidden - mov dl,'C' - jmp hidden -nohidden: - mov dl,'-' -hidden: - call showchar - - test al,00000100b - je nosystem - mov dl,'S' - jmp system -nosystem: - mov dl,'-' -system: - call showchar - - test al,00100000b - je noarchive - mov dl,'A' - jmp archive -noarchive: - mov dl,'-' -archive: - call showchar - - test al,00010000b - je nodirectory - mov dl,'R' - jmp directory -nodirectory: - mov dl,'-' -directory: - call showchar - - pop dx - ret - -;================SHOWSIZE (Fonction 30h)============== -;Affiche le nom pointé par DI -;-> AH=48 -;<- -;===================================================== -ShowSize: - push cx edx si ds - push cs - pop ds - mov cx,4 - cmp edx,1073741824 - ja giga - cmp edx,1048576*9 - ja mega - cmp edx,1024*9 - ja kilo - call showintR - mov si,offset unit - call showstring0 - jmp finsize -kilo: - shr edx,10 - call showintR - mov si,offset unitkilo - call showstring0 - jmp finsize -mega: - shr edx,20 - call showintR - mov si,offset unitmega - call showstring0 - jmp finsize -giga: - shr edx,30 - call showintR - mov si,offset unitgiga - call showstring0 -finsize: - pop ds si edx cx - ret - -unit db ' o ',0 -unitkilo db ' ko',0 -unitmega db ' mo',0 -unitgiga db ' go',0 - -;=============SetVideoMode (Fonction 00h)========= -;Fixe le mode vidéo courant a AL -;-> AH=0, AL mode d'écran +;=============SetVideoMode========= +;Fixe le mode vidéo courant a %0 +;-> %0 mode d'écran ;<- Carry if error -;================================================= -setvideomode: - push ax cx dx di - cmp al,maxmode - ja errorsetvideomode - cmp cs:mode,5h - jb nographic +;================================== +PROC setvideomode FAR + ARG @mode:word + USES ax,cx,dx,di + mov ax,[@mode] + xor ah,ah + cmp al,maxmode + ja @@errorsetvideomode + cmp [cs:mode],5h + jb @@nographic cmp al,5h - jae nographic - call initvideo -nographic: - cmp cs:mode,0FFh - jne noinit - call initvideo -noinit: - mov cs:mode,al + jae @@nographic + call initfont +@@nographic: + cmp [cs:mode],0FFh + jne @@noinit + call initfont +@@noinit: + mov [cs:mode],al xor ah,ah mov di,ax shl di,6 add di,offset mode0 mov dx,misc - mov al,cs:[di] + mov al,[cs:di] out dx,al inc di mov dx,statut - mov al,cs:[di] - out dx,al + mov al,[cs:di] + out dx,al inc di mov dx,sequencer xor ax,ax -initsequencer: - mov ah,cs:[di] +@@initsequencer: + mov ah,[cs:di] out dx,ax inc al inc di cmp al,4 - jbe initsequencer + jbe @@initsequencer mov ax,0E11h mov dx,ccrt - out dx,ax + out dx,ax xor ax,ax -initcrt: - mov ah,cs:[di] +@@initcrt: + mov ah,[cs:di] out dx,ax inc al inc di cmp al,24 - jbe initcrt - mov dx,graphics + jbe @@initcrt + mov dx,graphics xor ax,ax -initgraphic: - mov ah,cs:[di] +@@initgraphic: + mov ah,[cs:di] out dx,ax inc al inc di cmp al,8 - jbe initgraphic + jbe @@initgraphic mov dx,statut - in al,dx + in al,dx mov dx,attribs xor ax,ax -initattribs: - mov ah,cs:[di] +@@initattribs: + mov ah,[cs:di] push ax in ax,dx pop ax @@ -512,131 +403,141 @@ initattribs: inc al inc di cmp al,20 - jbe initattribs + jbe @@initattribs mov al,20h out dx,al - mov al,cs:[di] - mov cs:columns,al - mov ah,cs:[di+1] - mov cs:lines,ah + mov al,[cs:di] + mov [cs:columns],al + mov ah,[cs:di+1] + mov [cs:lines],ah mul ah - shl ax,1 - cmp cs:mode,5 - setae cs:graphics - jb istext - shl ax,3 -istext: - mov cs:pagesize,ax + mov cl,[cs:di-5] + and cl,01000000b + cmp cl,0 + je @@colors16 + mov [cs:color],8 + mov cl,4 + jmp @@colors256 +@@colors16: + mov [cs:color],4 + mov cl,3 +@@colors256: + cmp [cs:mode],5 + setae [cs:graphic] + jb @@istext + shl ax,cl + mov [cs:segments],0A000h + jmp @@wasgraph +@@istext: + mov [cs:segments],0B800h + shl ax,1 +@@wasgraph: + mov [cs:pagesize],ax mov ax,planesize xor dx,dx - div cs:pagesize - mov cs:nbpage,al - mov al,cs:[di-36] + div [cs:pagesize] + mov [cs:nbpage],al + mov al,[cs:di-36] xor ah,ah - shl ax,2 - mov cl,cs:graphics - shr ax,cl - mov cs:linesize,ax - mov ax,cs:[di-43] - mov cs:adress,ax - mov cs:base,ax - mov cs:pages,0 - pop di dx cx ax + shl ax,2 + mov cl,[cs:graphic] + shr ax,cl + mov [cs:linesize],ax + mov ax,[cs:di-43] + mov [cs:adress],ax + mov [cs:base],ax + mov [cs:cursor],1 + mov [cs:style],0 ret -errorsetvideomode: - pop di dx cx ax +@@errorsetvideomode: ret +endp setvideomode -initvideo: - push bx cx si ds -;xor bx,bx -;mov ds,bx -;lds si,ds:[43h*4] + +initfont: + push ds + call clearscreen push cs pop ds - mov si,offset font8x8 - mov cl,8 - mov bl,1 - call loadfont - mov si,offset font8x16 - mov cl,16 - mov bl,0 - call loadfont - mov cs:pagesize,64000 - call clearscreen - pop ds si cx bx + call loadfont,offset font8x8,8,1 + call loadfont,offset font8x16,16,0 + pop ds ret -;=============GetVideoMode (Fonction 01h)========= -;Renvoie le mode vidéo courant dans AL -;-> AH=1 -;<- AL mode d'écran -;================================================= -getvideomode: - mov al,cs:mode +;=============GetVideoMode========= +;Renvoie le mode vidéo courant dans AX +;-> +;<- AX +;================================== +PROC getvideomode FAR + mov al,[cs:mode] + xor ah,ah ret +endp getvideomode -;=============CLEARSCREEN (Fonction 02h)========= +;=============CLEARSCREEN========= ;Efface l'ecran graphique ou texte -;-> AH=2 -;<- -;================================================ -clearscreen: - push eax cx dx di es - mov cx,cs:pagesize - mov di,cs:adress +;-> +;<- +;================================= +PROC clearscreen FAR + USES eax,cx,dx,di,es + mov cx,planesize + mov di,[cs:adress] shr cx,2 - cmp byte ptr cs:graphics,1 - jne erasetext - mov ax,0A000h - mov es,ax -erasegraph: - mov ah,0 -gogot: - push ax cx - mov cl,ah - mov ah,1 - shl ah,cl - mov al,2 - mov dx,sequencer - out dx,ax - pop cx ax - push si di cx eax + cmp [cs:graphic],1 + jne @@erasetext + mov ax,0A000h + mov es,ax +@@erasegraph: + mov ax,0F02h + mov dx,sequencer + out dx,ax + mov ax,0205h + mov dx,graphics + out dx,ax + mov ax,0003h + out dx,ax + mov ax,0FF08h + out dx,ax mov eax,00000000h + cld rep stosd - pop eax cx di si - inc ah - cmp ah,3 - jbe gogot - jmp enderase -erasetext: + mov ax,0005h + cmp [cs:color],4 + je @@not256 + mov ax,4005h +@@not256: + mov dx,graphics + out dx,ax + mov ax,0003h + out dx,ax + jmp @@endoferase +@@erasetext: mov ax,0B800h mov es,ax mov eax,07200720h cld - rep stosd -enderase: - mov cs:x,0 - mov cs:y,0 - mov cs:xg,0 - mov cs:yg,0 - mov cs:xy,0 - mov cs:xyg,0 - mov cs:plane,0 - pop es di dx cx eax - ret + rep stosd +@@endoferase: + call setxy,0,0 + ret +endp clearscreen -;=============SetFont (Fonction 03h)========= -;Active la font cl parmi les 8 -;-> AH=3, CL n° font +;=============SetFont========= +;Active la font %0 parmi les 8 +;-> %0 n° font ;<- Carry if error -;============================================ -setfont: - push ax cx dx +;============================= +PROC setfont FAR + ARG @font:word + USES ax,cx,dx + mov cx,[@font] + xor ch,ch cmp cl,7 - ja errorsetfont - mov cs:font,cl + ja @@errorsetfont + mov [cs:font],cl mov ah,cl and cl,11b and ah,0100b @@ -645,64 +546,54 @@ setfont: mov dx,sequencer mov al,3 out dx,ax - pop dx cx ax ret -errorsetfont: - pop dx cx ax +@@errorsetfont: ret +endp setfont -;=============GetFont (Fonction 0xh)========= -;Récupère le n° de la font active -;-> AH=x +;=============GetFont========= +;Récupère le n° de la font active AX +;-> ;<- CL n° font, Carry if error -;============================================ -Getfont: - push ax cx dx - cmp cl,7 - ja errorgetfont - mov cs:font,cl - mov ah,cl - and cl,11b - and ah,0100b - shl ah,2 - add ah,cl - mov dx,sequencer - mov al,3 - out dx,ax - pop dx cx ax - ret -errorgetfont: - stc - pop dx cx ax - ret +;============================= +PROC getfont FAR + mov al,[cs:font] + xor ah,ah +endp getfont -;=============LoadFont (Fonction 04h)========== -;Charge une police pointée par ds:si dans la carte vidéo sous n°font BL, taille police dans CL -;-> AH=4, BL n°font, DS:SI pointeur vers Font, CL taille police +;!!!!!!!!!!!!!!!!!!!! a remettre les anciens params de timing depuis origine +;=============LoadFont======== +;Charge une police pointée par %0 dans la carte vidéo sous n°font %1, taille police dans %2 +;-> %0 n°font, %1 pointeur vers Font, %2 taille police ;<- Carry if error -;=========================================== -loadfont: - push ax bx cx dx si di es +;============================= +PROC loadfont FAR + ARG @pointer:word,@size:word,@font:word + USES ax,bx,cx,dx,si,di,es + LOCAL @poppop:dword + mov si,[@pointer] + mov cx,[@size] + mov bx,[@font] cmp bl,7 - ja errorloadfont + ja @@errorloadfont xor di,di cli mov dx,sequencer -doseq: - mov ax,cs:[di+offset reg1] +@@doseq: + mov ax,[cs:di+offset reg1] out dx,ax inc di inc di cmp di,6 - jbe doseq + jbe @@doseq mov dx,graphics -doseq2: - mov ax,cs:[di+offset reg1] +@@doseq2: + mov ax,[cs:di+offset reg1] out dx,ax inc di inc di cmp di,6+6 - jbe doseq2 + jbe @@doseq2 sti mov ax,0A000h mov es,ax @@ -710,14 +601,14 @@ doseq2: mov al,0 xor bh,bh cmp bl,4 - jb isless + jb @@isless sub bl,4 shl bl,1 inc bl - jmp okmake -isless: + jmp @@okmake +@@isless: shl bl,1 -okmake: +@@okmake: mov di,bx shl di,13 mov bh,cl @@ -726,894 +617,424 @@ okmake: neg bl xor cx,cx cld -popz: +@@popz: mov cl,bh rep movsb mov cl,bl rep stosb dec dx - jnz popz + jnz @@popz xor di,di mov dx,sequencer -doseqs: - mov ax,cs:[di+offset reg2] +@@doseqs: + mov ax,[cs:di+offset reg2] out dx,ax inc di inc di cmp di,6 - jbe doseqs - mov dx,graphics -doseqs2: - mov ax,cs:[di+offset reg2] + jbe @@doseqs + mov dx,graphics +@@doseqs2: + mov ax,[cs:di+offset reg2] out dx,ax inc di inc di cmp di,6+6 - jbe doseqs2 - pop es di si dx cx bx ax + jbe @@doseqs2 ret -errorloadfont: +@@errorloadfont: stc - pop es di si dx cx bx ax ret reg2 dw 0100h, 0302h, 0304h, 0300h dw 0004h, 1005h, 0E06h reg1 dw 0100h, 0402h, 0704h, 0300h - dw 0204h, 0005h, 0406h + dw 0204h, 0005h, 0406h +endp loadfont -;==========SHOWSPACE (Fonction 05h)=========== -;met un espace aprés le curseur -;-> AH=5 -;<- -;============================================= -showspace: - push cx - mov cl,' ' - mov ch,cs:colors - call charout - clc - pop cx - ret - -;==========SHOWLINE (Fonction 06h)=============== +;==========SHOWLINE=============== ;remet le curseur text a la ligne avec un retour chariot -;-> AH=6 +;-> ;<- -;================================================ -showline: - push bx cx - mov bl,cs:y +;================================= +PROC addline FAR + USES bx,cx + mov bl,[cs:y] xor bh,bh - mov cl,cs:lines + mov cl,[cs:lines] sub cl,2 cmp bl,cl - jne scro + jne @@scro dec bl mov cx,1 - cmp byte ptr cs:graphics,0 - je okscro + cmp [cs:graphic],0 + je @@okscro mov cx,8 -okscro: - call scrolldown -scro: +@@okscro: + call scrolldown,cx +@@scro: inc bl - call setxy2 - pop cx bx + call setxy,0,bx ret +endp addline -;==========SHOWCHAR (Fonction 07h)=========== -;met un caractère de code ASCII DL aprés le curseur -;-> AH=7, DL code ASCII du caractère -;<- -;============================================ -showchar: - push cx - mov cl,dl - mov ch,cs:colors - call charout - pop cx - ret - -;==========SHOWINT (Fonction 08h)=========== -;Affiche un entier EDX aprés le curseur -;-> AH=8, EDX un entier -;<- -;=========================================== -ShowInt: - push eax bx cx edx esi - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint: - xor edx,edx - div esi - add dl,'0' - inc cx - mov cs:[bx],dl - dec bx - cmp ax,0 - jne decint - mov ax,cx - mov ch,cs:colors -showinteger: - inc bx - mov cl,cs:[bx] - call charout - dec ax - jnz showinteger - pop esi edx cx bx eax - ret - -showbuffer db 35 dup (0FFh) - -;==========SHOWFIXINT (Fonction h)=========== -;Affiche un entier EDX aprés le curseur de taille cx -;-> AH=8, EDX un entier et al="cara" -;<- -;=========================================== -ShowfixInt: - push eax bx cx edx esi di - mov di,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint2: - xor edx,edx - div esi - add dl,'0' - inc cx - mov cs:[bx],dl - dec bx - cmp cx,di - jae nomuch - cmp ax,0 - jne decint2 - mov ax,di - xchg cx,di - sub cx,di -rego: - mov byte ptr cs:[bx],'0' - dec bx - dec cx - jnz rego - jmp finishim -nomuch: - mov ax,di -finishim: - mov ch,cs:colors -showinteger2: - inc bx - mov cl,cs:[bx] - call charout - dec ax - jnz showinteger2 - pop di esi edx cx bx eax - ret - -;==========SHOWINTR (Fonction h)=========== -;Affiche un entier EDX aprés le curseur de taille cx -;-> AH=8, EDX un entier -;<- -;=========================================== -ShowIntR: - push eax bx cx edx esi di - mov di,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - inc cx - mov cs:[bx],dl - dec bx - cmp cx,di - jae nomuch - cmp ax,0 - jne decint3 - mov ax,di - xchg cx,di - sub cx,di -rego2: - mov byte ptr cs:[bx],' ' - dec bx - dec cx - jnz rego2 - jmp finishim2 -nomuch2: - mov ax,di -finishim2: - mov ch,cs:colors -showinteger3: - inc bx - mov cl,cs:[bx] - call charout - dec ax - jnz showinteger3 - pop di esi edx cx bx eax - ret - -;==========SHOWSIGNED (Fonction 09h)=========== -;Affiche un entier EDX de taille CX aprés le curseur -;-> AH=9, EDX un entier, CX la taille -;<- -;============================================== -Showsigned: - push ebx edx - mov ebx,edx - xor edx,edx - cmp cx,8 - ja signed16 - mov dl,bl - cmp dl,7Fh - jbe notsigned - neg dl - jmp showminus -signed16: - cmp cx,16 - ja signed32 - mov dx,bx - cmp dx,7FFFh - jbe notsigned - neg dx - jmp showminus -signed32: - mov edx,ebx - cmp edx,7FFFFFFFh - jbe notsigned - neg edx -showminus: - push dx - mov dl,'-' - call showchar - pop dx -notsigned: - call showint - pop edx ebx - ret - -;==========SHOWHEX (Fonction 0Ah)=========== -;Affiche un nombre hexadécimal EDX de taille CX aprés le curseur -;-> AH=10, EDX un entier, CX la taille -;<- -;=========================================== -ShowHex: - push ax bx cx edx - mov ax,cx - shr ax,2 - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -Hexaize: - rol edx,4 - mov bx,dx - and bx,0fh - mov cl,cs:[bx+offset Tab] - call charout - dec al - jnz Hexaize - pop edx cx bx ax - ret - -Tab db '0123456789ABCDEF' - -;==========SHOWBIN (Fonction 0Bh)=========== -;Affiche un nombre binaire EDX de taille CX aprés le curseur -;-> AH=11, EDX un entier, CX la taille -;<- -;=========================================== -Showbin: - push ax cx edx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -binaize: - rol edx,1 - mov cl,'0' - adc cl,0 - call charout - dec al - jnz binaize - pop edx cx ax - ret - -;==========SHOWBCD (Fonction 0xh)=========== -;Affiche un nombre en BCD EDX de taille CX aprés le curseur -;-> AH=x, EDX un entier, CX la taille -;<- -;=========================================== -ShowBCD: - push ax cx edx - mov ax,cx - shr ax,2 - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -BCDaize: - rol edx,4 - mov cl,dl - and cl,0fh - add cl,'0' - call charout - dec al - jnz BCDaize - pop edx cx ax - ret - -;==========SHOWSTRING (Fonction 0Ch)=========== -;Affiche une chaine de caractère pointée par DS:SI aprés le curseur -;-> AH=12, DS:SI pointeur chaine type pascal -;<- -;============================================== -showstring: - push bx cx si - mov bl,[si] - mov ch,cs:colors -strinaize: - inc si - mov cl,[si] - call charout - dec bl - jnz strinaize - pop si cx bx - ret - -;==========SHOWSTRING0 (Fonction 0Dh)=========== -;Affiche une chaine de caractère pointée par DS:SI aprés le curseur -;-> AH=13, DS:SI pointeur chaine type zéro terminal -;<- -;=============================================== -showstring0: - push cx si - mov ch,cs:colors -strinaize0: - mov cl,[si] - cmp cl,0 - je no0 - call charout - inc si - jmp strinaize0 -no0: - pop si cx - ret - -;==========SHOWCHARAT (Fonction 0Eh)=========== -;met un caractère de code ASCII DL en (x;y) (BH;BL) -;-> AH=14, DL code ASCII du caractère, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showcharat: - push es di - call setxy - call showchar - pop di es - ret - -;==========SHOWINTAT (Fonction 0Fh)=========== -;Affiche un entier EDX en (x;y) (BH;BL) -;-> AH=15, EDX entier, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showintat: - push es di - call setxy - call showint - pop di es - ret - -;==========SHOWSIGNEDAT (Fonction 10h)=========== -;Affiche un entier EDX de taille CX aprés le curseur en (x;y) (BH;BL) -;-> AH=16, EDX entier, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showsignedat: - push es di - call setxy - call showsigned - pop di es - ret - -;==========SHOWHEXAT (Fonction 11h)=========== -;Affiche un nombre hexadécimal EDX de taille CX en (x;y) (BH;BL) -;-> AH=17, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showhexat: - push es di - call setxy - call showhex - pop di es - ret - -;==========SHOWBINAT (Fonction 012h)=========== -;Affiche un nombre binaire EDX de taille CX en (x;y) (BH;BL) -;-> AH=18, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y -;<- -;============================================= -showbinat: - push es di - call setxy - call showbin - pop di es - ret - -;==========SHOWSTRINGAT (Fonction 13h)=========== -;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) -;-> AH=19, DS:SI pointeur chaine type pascal, BH coordonnées x, BL coordonnées y -;<- -;================================================ -showstringat: - push es di - call setxy - call showstring - pop di es - ret - -;==========SHOWSTRING0AT (Fonction 14h)=========== -;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) -;-> AH=20, DS:SI pointeur chaine type zéro terminal, BH coordonnées x, BL coordonnées y -;<- -;================================================= -showstring0at: - push es di - call setxy - call showstring0 - pop di es - ret - -;==========SETCOLOR (Fonction 15h)========= +;==========SETCOLOR========= ;Change les attributs du texte a CL -;-> AH=21 ,CL couleur +;-> %0 couleur ;<- -;========================================= -setcolor: - mov cs:colors,CL +;=========================== +PROC setcolor FAR + ARG @color:word + USES cx + mov cx,[@color] + mov [cs:colors],cl ret +endp setcolor -;==========GETCOLOR (Fonction 16h)========= -;Récupère les attributs du texte dans CL -;-> AH=22 -;<- CL couleur -;========================================= -getcolor: - mov cl,cs:colors +;==========GETCOLOR========= +;Récupère les attributs du texte dans AX +;-> +;<- AX couleur +;=========================== +PROC getcolor FAR + mov al,[cs:colors] + xor ah,ah ret - -;==========SETSTYLE (Fonction xh)========= -;Change le style du texte a CL -;-> AH=x ,CX style -;<- -;========================================= -setstyle: - mov cs:style,CX - ret - -;==========GETSTYLE (Fonction xh)========= -;Récupère le style du texte dans CL -;-> AH=x -;<- CX style -;========================================= -getstyle: - mov cx,cs:style - ret - -;==========SCROLLDOWN (Fonction 17h)========= -;defile de cx lines vers le bas -;-> AH=23, CX lines à défiler vers le bas -;<- -;============================= -scrolldown: - push ax cx dx si di ds es - cmp cs:scrolling,0 - je graphp - mov ax,cx - mul cs:linesize +endp getcolor + +;==========SCROLLDOWN========= +;defile de %0 lines vers le bas +;-> %0 lines à défiler vers le bas +;<- +;============================= +PROC scrolldown FAR + ARG @line:word + USES ax,cx,dx,si,di,ds,es + cmp [cs:scrolling],0 + je @@graphp + mov ax,[@line] + mul [cs:linesize] mov si,ax - mov cx,cs:pagesize + mov cx,[cs:pagesize] sub cx,si - mov di,cs:adress + mov di,[cs:adress] cld - cmp byte ptr cs:graphics,1 - jne textp - mov ax,0A000h + cmp [cs:graphic],1 + jne @@textp + mov ax,0A000h mov es,ax - mov ds,ax - shr cx,2 -transfert: - mov ah,0 -gogo: - push ax cx - mov cl,ah - mov ah,1 - shl ah,cl - mov al,2 - mov dx,sequencer - out dx,ax - pop cx ax - mov al,4 - mov dx,graphics - out dx,ax - push si di cx - rep movsd - pop cx di si - inc ah - cmp ah,3 - jbe gogo - jmp graphp -textp: + mov ds,ax + mov ax,0F02h + mov dx,sequencer + out dx,ax + mov ax,0105h + mov dx,graphics + out dx,ax + cld + rep movsb + mov ax,0005h + cmp [cs:color],4 + je @@not256ok + mov ax,4005h +@@not256ok: + mov dx,graphics + out dx,ax + mov ax,0003h + out dx,ax + jmp @@graphp + +@@textp: mov ax,0B800h mov es,ax mov ds,ax rep movsb -graphp: - pop es ds di si dx cx ax +@@graphp: ret +endp scrolldown -;==========GETXY (Fonction 18h)========= -;Change les coordonnées du curseur a X:BH,Y:BL -;-> AH=24 -;<- BH coordonnées x, BL coordonnées y -;============================= -getxy: - mov bh,cs:x - mov bl,cs:y +;==========GETXY========= +;Met les coordonnées du curseur dans %0 au format point +;-> +;<- ah coordonnées x, al coordonnées y +;======================== +PROC getxy FAR + ARG @pointer:word + USES bx + mov bx,[@pointer] + mov ah,[cs:x] + mov al,[cs:y] ret +endp getxy -;==========SETXY (Fonction 19h)========= -;Change les coordonnées du curseur a X:BH,Y:BL -;-> AH=25, BH coordonnées x, BL coordonnées y +;==========SETXY========= +;Change les coordonnées du curseur a X:%0,Y:%1 +;-> %0 coordonnées x, %1 coordonnées y ;<- -;===================================== -setxy: - push ax bx cx dx -; xor ax,ax -; int 16h -; mov cl,cs:lines -; dec cl -; sub cl,bl -; neg cl -; js zero -; xor ch,ch -; inc cl -; jmp nozero -;zero: -; mov cx,0 -;nozero: -; call scrolldown - mov cs:x,bh - mov cs:y,bl - mov al,bl - mov bl,bh - xor bh,bh - mov di,cs:adress +;======================== +PROC setxy FAR + ARG @x:word,@y:word + USES ax,bx,dx,di + mov ax,[@y] + mov bx,[@x] + mov [cs:x],bl + mov [cs:y],al + mov di,[cs:adress] add di,bx - mul cs:columns + mul [cs:columns] add di,ax shl di,1 - mov cs:xy,di - cmp byte ptr cs:graphics,1 - jne oktext - mov bl,cs:x - mov cl,cs:y - xor bh,bh - xor ch,ch - shl bx,3 - shl cx,3 - call setxyg - jmp endofsetxy -oktext: - mov ax,0B800h - mov es,ax - call setcursor -endofsetxy: - pop dx cx bx ax + mov [cs:xy],di + call setcursor ret +endp setxy -setxy2: - push es di - call setxy - pop di es - ret - -;==========SETXYG (Fonction 0xh)========= -;Change les coordonnées du curseur graphique a X:BX,Y:CX -;-> AH=x, BX coordonnées x, CX coordonnées y -;<- ES:DI pointeur sur pixel avec plan de bit ajusté -;====================================== -setxyg: - push ax bx cx dx - mov cs:xg,bx - mov cs:yg,cx - mov ax,cx - mov cl,bl - mul cs:linesize - shr bx,2 - add ax,bx - mov di,ax - and cl,3 - mov ah,1 - shl ah,cl - mov al,2 - mov dx, 3c4h - out dx,ax - mov cs:plane,cl - mov cs:xyg,di - mov ax,0A000h - mov es,ax - pop dx cx bx ax - ret - -;==========SHOWPIXEL (Fonction 0xh)========= -;Affiche un pixel de couleur AL en X:BX,Y:CX -;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur +;==========SHOWPIXEL========= +;Affiche un pixel de couleur AL en X:%0,Y:%1 +;-> %0 coordonnées x, %1 coordonnées y, %2 couleur ;<- -;========================================= -showpixel: - push ax bx cx dx di bp es - mov bp,ax - mov ax,cx - mov cl,bl - mul cs:linesize - shr bx,2 - add ax,bx - mov di,ax - add di,cs:adress - and cl,3 - mov ah,1 - shl ah,cl - mov al,2 - mov dx,sequencer - out dx,ax - mov bx,0A000h - mov es,bx - mov ax,bp - mov es:[di],al - pop es bp di dx cx bx ax - ret - -;==========SHOWPIXEL (Fonction 0xh)========= -;Récupère en al la couleur du pixel de coordonnées X:BX,Y:CX -;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur -;<- -;========================================= -getpixel: - push ax bx cx dx di bp es - mov bp,ax - mov ax,cx - mov cl,bl - mul cs:linesize - shr bx,2 - add ax,bx - mov di,ax - add di,cs:adress - and cl,3 - mov ah,cl - mov al,4 - mov dx,graphics - out dx,ax - mov bx,0A000h - mov es,bx - mov ax,bp - - mov al,es:[di] - pop es bp di dx cx bx ax - ret - -;==========LOADBMPPALET (Fonction 0xh)========= -;Charge la palette du BMP pointée par DS:SI -;-> AH=x, DS:SI BMP -;<- -;============================================= -loadbmppalet: - push ax bx cx dx - mov bx,0400h+36h-4 - mov cx,100h - mov dx, 3c8h -paletteload: - mov al, cl - dec al - out dx, al - inc dx - mov al,[bx+si+2] - shr al,2 - out dx, al - mov al,[bx+si+1] - shr al,2 - out dx, al - mov al,[bx+si] - shr al,2 - out dx, al - sub bx,4 - dec dx - dec cl - jnz paletteload - pop dx cx bx ax - ret - -;==========VIEWBMP (Fonction 0xh)========= -;Affiche le BMP pointée par DS:SI en X:BX, Y:CX avec la préparation de la palette -;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y -;-> -;========================================= -viewbmp: - call loadbmppalet - call showbmp - ret - -;==========SHOWBMP (Fonction 0xh)========= -;Affiche le BMP pointée par DS:SI en X:BX, Y:CX -;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y -;-> -;========================================= -showbmp: - push ax bx cx dx - cmp word ptr ds:[si+BMP_file.BMP_FileType],"MB" - jne errorshowing - mov cs:xc,bx - mov cs:yc,cx - xor cx,cx - xor bx,bx - xor dx,dx -bouclette: - mov al,[si+bx+436h] - push bx cx - sub cx,cs:yc - neg cx - mov bx,dx - add bx,cs:xc - call showpixel - pop cx bx - inc bx - inc dx - cmp dx,[si+offset BMP_File.BMP_width] - jb bouclette - xor dx,dx - inc cx - cmp cx,[si+offset BMP_File.BMP_height] - jb bouclette - clc - pop dx cx bx ax - ret - -errorshowing: - stc - pop dx cx bx ax - ret +;============================ +PROC showpixel FAR + ARG @x:word,@y:word,@color:word + USES ax,bx,cx,dx,si,di,es + mov bx,[@x] + mov cx,[@y] + mov ax,[@color] + cmp [cs:color],4 + je @@showpixel4 + mov si,ax + mov ax,cx + mov cl,bl + mul [cs:linesize] + shr bx,2 + add ax,bx + mov di,ax + add di,[cs:adress] + and cl,3 + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + mov bx,0A000h + mov es,bx + mov ax,si + mov [es:di],al + jmp @@endofshow -xc dw 0 -yc dw 0 +@@showpixel4: + mov dx,ax + mov ax,cx + mov ch,dl + mov cl,bl + mul [cs:linesize] + shr bx,3 + add ax,bx + mov di,ax + add di,[cs:adress] + and cl,111b + xor cl,111b + mov ah,1 + shl ah,cl + mov al,8 + mov dx,graphics ;masque + out dx,ax + mov ax,0205h + out dx,ax + mov ax,0003h + out dx,ax + mov bx,0A000h + mov es,bx + mov al,[es:di] + mov [es:di],ch +@@endofshow: + ret +endp showpixel -;==========GETVGAINFO (Fonction 0xh)========= +;!!!!!!!!!!!!!! gerer le mode chain 4 +;==========GETPIXEL========= +;Récupère en ax la couleur du pixel de coordonnées X:%0,Y:%1 +;-> %0 coordonnées x, %1 coordonnées y +;<- AX couleur +;========================================= +PROC getpixel FAR + ARG @x:word,@y:word + USES ax,bx,cx,dx,di,es + mov bx,[@x] + mov cx,[@y] + mov ax,cx + mov cl,bl + mul [cs:linesize] + shr bx,2 + add ax,bx + mov di,ax + add di,[cs:adress] + and cl,3 + mov ah,cl + mov al,4 + mov dx,graphics + out dx,ax + mov bx,0A000h + mov es,bx + mov al,[es:di] + ret +endp getpixel + +;==========GETVGAINFO========= ;Renvoie un bloc de donnée en ES:DI sur l'état de la carte graphique -;<- AH=x, ES:DI pointeur +;<- ES:%0 pointeur ;-> ;============================================= -Getvgainfos: - push cx si di ds +PROC getvgainfos FAR + ARG @pointer:word + USES cx,si,di,ds push cs pop ds mov cx,datablocksize mov si,offset datablock + mov di,[@pointer] cld rep movsb - pop ds di si cx ret +endp getvgainfos -;==========WAITRETRACE (Fonction 0xh)========= +;==========WAITRETRACE========= ;Synchronisation avec la retrace verticale -;<- AH=x +;<- ;-> -;============================================= -waitretrace: - push ax dx +;============================== +PROC waitretrace FAR + USES ax,dx mov dx,3DAh -waitr: +@@waitr: in al,dx test al,8 - jz waitr - pop dx ax + jz @@waitr ret - -;Renvoie le caractère sur le curseur en dl -getchar: - push ax di es +endp waitretrace + +;==========WAITHRETRACE========= +;Synchronisation avec la retrace horizontale +;<- +;-> +;=============================== +PROC waithretrace FAR + USES ax,dx + mov dx,3DAh +@@waitr: + in al,dx + test al,1 + jz @@waitr + ret +endp waithretrace + +;==========GETCHAR========= +;Renvoie en AX le caractère sur le curseur +;<- +;-> +;========================== +PROC getchar FAR + USES di,es mov ax,0B800h mov es,ax - mov di,cs:xy - mov dl,es:[di] - pop es di ax + mov di,[cs:xy] + mov al,[es:di] + xor ah,ah ret +endp getchar -;Ecrit le caractère ASCII CL attribut CH aprés le curseur, en le mettant à jours -charout: - push ax bx cx dx di es - cmp byte ptr cs:graphics,1 - jne textaccess +;==========SHOWCHAR========= +;Ecrit le caractère ASCII %0 attribut %1 aprés le curseur, en le mettant à jours +;<- +;-> +;=========================== +PROC showchar FAR + ARG @char:word,@attr:word + USES ax,bx,cx,dx,di,es + mov cl,[byte ptr @char] + mov ch,[byte ptr @attr] + cmp [@attr],0FFFFh + jne @@notlastattr + mov ch,[cs:colors] +@@notlastattr: + cmp [cs:graphic],1 + jne @@textaccess call emulatechar - jmp adjusttext -textaccess: + jmp @@adjusttext +@@textaccess: mov ax,0B800h mov es,ax - mov di,cs:xy - mov es:[di],cx - add cs:xy,2 -adjusttext: - inc cs:x - mov cl,cs:columns - cmp cs:x,cl - jb noadjusted - call showline -noadjusted: + mov di,[cs:xy] + mov [es:di],cx + add [cs:xy],2 +@@adjusttext: + inc [cs:x] + mov cl,[cs:columns] + cmp [cs:x],cl + jb @@noadjusted + call addline +@@noadjusted: call setcursor - pop es di dx cx bx ax ret +endp showchar setcursor: - push ax cx dx - mov dx,CCRT + push ax cx dx + cmp [cs:cursor],1 + jne notshow + mov dx,ccrt mov al,0Eh - mov cx,cs:xy + mov cx,[cs:xy] shr cx,1 mov ah,ch out dx,ax mov ah,cl inc al out dx,ax - pop dx cx ax +notshow: + pop dx cx ax ret ;Ecrit le caractère ASCII CL attribut CH aprés le curseur graphique, en le mettant à jours en mode graphique emulatechar: push ax bx cx dx di - mov dx,cx - mov di,dx + mov al,ch + mov di,cx and di,11111111b shl di,3 add di,offset font8x8 - xor bx,bx - xor cx,cx - mov ah,cs:[di] + mov bl,[cs:x] + mov cl,[cs:y] + xor bh,bh + xor ch,ch + shl bx,3 + shl cx,3 + mov ah,[cs:di] + xor dx,dx bouclet: - mov al,dh - rol ah,1 - jc colored + rol ah,1 + push ax + jc colored shr al,4 - bt word ptr cs:style,0 - jc transparent + cmp [cs:style],0 + jnz transparent colored: - and al,1111b - push bx cx - add cx,cs:yg - add bx,cs:xg - call showpixel - pop cx bx + and ax,1111b + call showpixel,bx,cx,ax transparent: + pop ax inc bx - cmp bx,8 + inc dl + cmp dl,8 jb bouclet - xor bx,bx inc di - mov ah,cs:[di] + mov ah,[cs:di] + xor dl,dl + sub bx,8 inc cx - cmp cx,8 + inc dh + cmp dh,8 jb bouclet - add cs:xg,8 - mov cx,cs:linesize - shl cx,2 - cmp cs:xg,cx - jb ended - mov cs:xg,0 - add cs:yg,8 ended: pop di dx cx bx ax ret @@ -1624,9 +1045,9 @@ ended: savescreen: push ax cx dx si di bp ds es gs mov bp,sp -mov dx,ss:[bp+22] +mov dx,[ss:bp+22] mov ah,2 -mov cx,cs:pagesize +mov cx,[cs:pagesize] push cs pop ds mov si,offset data3 @@ -1644,12 +1065,12 @@ data3 db '/vgascreen',0 ;===================================sauve l'ecran rapidement en es:di================ -SaveScreento: +savescreento: push cx si di ds mov cx,0B800h mov ds,cx xor ecx,ecx - mov cx,cs:pagesize + mov cx,[cs:pagesize] shr cx,2 xor si,si cld @@ -1658,7 +1079,7 @@ SaveScreento: ret ;===================================sauve les parametres en es:di================ -Saveparamto: +saveparamto: push ecx si di ds push cs pop ds @@ -1671,7 +1092,7 @@ Saveparamto: ret ;===================================restore les parametres depuis en ds:si================ -Restoreparamfrom: +restoreparamfrom: push ecx si di es push cs pop es @@ -1682,48 +1103,12 @@ Restoreparamfrom: rep movsb pop es di si ecx ret - -;sauve la page1 dans un bloc de mémoire -Savepage1: -push ax cx dx si di bp ds es gs -mov bp,sp -mov dx,ss:[bp+22] -mov ah,2 -mov cx,cs:pagesize -push cs -pop ds -mov si,offset data4 -int 49h -mov ah,6 -int 49h -push gs -pop es -xor di,di -call Savepage1to -pop gs es ds bp di si dx cx ax -ret -data4 db '/vgapage1',0 - -;===================================sauve l'ecran rapidement================ -Savepage1to: - push ecx si di ds - mov cx,0B800H - mov ds,cx - xor ecx,ecx - mov cx,cs:pagesize - shr cx,2 - mov si,cs:pagesize - cld - rep movsd - pop ds di si ecx - ret - ;R‚cupŠre l'ecran de la carte depuis son bloc mémoire -RestoreScreen: +restorescreen: push ax dx si bp ds gs mov bp,sp -mov dx,ss:[bp+16] +mov dx,[ss:bp+16] push cs pop ds mov si,offset data3 @@ -1737,12 +1122,12 @@ pop gs ds bp si dx ax ret ;===================================restore l'ecran rapidement de ds:si================ -RestoreScreenfrom: +restorescreenfrom: push ecx si di ds es mov cx,0B800H mov es,cx xor ecx,ecx - mov cx,cs:pagesize + mov cx,[cs:pagesize] shr cx,2 xor di,di cld @@ -1753,15 +1138,15 @@ RestoreScreenfrom: ;===============================Page2to1============================ -Page2to1: +page2to1: push ecx si di ds es mov cx,0B800H mov es,cx mov ds,cx xor ecx,ecx - mov cx,cs:pagesize + mov cx,[cs:pagesize] shr cx,2 - mov si,cs:pagesize + mov si,[cs:pagesize] xor di,di cld rep movsd @@ -1769,15 +1154,15 @@ Page2to1: ret ;===============================Page1to2============================ -Page1to2: +page1to2: push ecx si di ds es mov cx,0B800H mov es,cx mov ds,cx xor ecx,ecx - mov cx,cs:pagesize + mov cx,[cs:pagesize] shr cx,2 - mov di,cs:pagesize + mov di,[cs:pagesize] xor si,si cld rep movsd @@ -1785,213 +1170,195 @@ Page1to2: ret ;===============================xchgPages============================ -xchgPages: -push ax cx dx si di bp ds es gs -mov bp,sp -mov dx,ss:[bp+22] -mov ah,2 -mov cx,datablocksize -add cx,cs:pagesize -add cx,3*256 -push cs -pop ds -mov si,offset data4 -int 49h -mov ah,6 -int 49h -push gs -pop es -xor di,di -call savescreento -call Page2to1 -push gs -pop ds -xor si,si -mov cx,0B800H -mov es,cx -mov di,cs:pagesize -xor ecx,ecx -mov cx,cs:pagesize -shr cx,2 -cld -rep movsd -mov ah,01h -int 49h -pop gs es ds bp di si dx cx ax -ret +;xchgpages: +;push ax cx dx si di bp ds es gs +;mov bp,sp +;mov dx,[ss:bp+22] +;mov ah,2 +;mov cx,datablocksize +;add cx,[cs:pagesize] +;add cx,3*256 +;push cs +;pop ds +;mov si,offset data4 +;int 49h +;mov ah,6 +;int 49h +;push gs +;pop es +;xor di,di +;call savescreento +;call page2to1 +;push gs +;pop ds +;xor si,si +;mov cx,0B800H +;mov es,cx +;mov di,[cs:pagesize] +;xor ecx,ecx +;mov cx,[cs:pagesize] +;shr cx,2 +;cld +;rep movsd +;mov ah,01h +;int 49h +;pop gs es ds bp di si dx cx ax +;ret +; +;data4 db '/vgatemp',0 ;Sauve l'‚tat de la carte dans un bloc mémoire -savestate: -push ax cx dx si di bp ds es gs -mov bp,sp -mov dx,ss:[bp+22] -mov ah,2 -mov cx,datablocksize -add cx,cs:pagesize -add cx,3*256 -push cs -pop ds -mov si,offset data -int 49h -mov ah,6 -int 49h -push gs -pop es -xor di,di -call saveparamto -add di,datablocksize -call savescreento -add di,cs:pagesize -call savedacto -pop gs es ds bp di si dx cx ax -ret +;savestate: +;push ax cx dx si di bp ds es gs +;mov bp,sp +;mov dx,[ss:bp+22] +;mov ah,2 +;mov cx,datablocksize +;add cx,[cs:pagesize] +;add cx,3*256 +;push cs +;pop ds +;mov si,offset data +;int 49h +;mov ah,6 +;int 49h +;push gs +;pop es +;xor di,di +;call saveparamto +;add di,datablocksize +;call savescreento +;add di,[cs:pagesize] +;call savedacto +;pop gs es ds bp di si dx cx ax +;ret -data db '/vga',0 +;data db '/vga',0 ;R‚cupŠre l'‚tat de la carte depuis son bloc mémoire -restorestate: -push ax dx si bp ds gs -mov bp,sp -mov dx,ss:[bp+16] -push cs -pop ds -mov si,offset data -mov ah,9 -int 49h -push gs -pop ds -mov al,ds:[7] -cmp cs:mode,al -je nochangemode -mov ah,0 -call setvideomode -nochangemode: -xor si,si -call restoreparamfrom -add si,datablocksize -call restorescreenfrom -add si,cs:pagesize -call restoredacfrom -pop gs ds bp si dx ax -ret +;restorestate: +;push ax dx si bp ds gs +;mov bp,sp +;mov dx,[ss:bp+16] +;push cs +;pop ds +;mov si,offset data +;mov ah,9 +;int 49h +;push gs +;pop ds +;mov al,[ds:7] +;cmp [cs:mode],al +;je nochangemode +;mov ah,0 +;call setvideomode +;nochangemode: +;xor si,si +;call restoreparamfrom +;add si,datablocksize +;call restorescreenfrom +;add si,[cs:pagesize] +;call restoredacfrom +;pop gs ds bp si dx ax +;ret ;sauve le DAC dans un bloc de mémoire -savedac: -push ax cx dx si di bp ds es gs -mov bp,sp -mov dx,ss:[bp+22] -mov ah,2 -mov cx,3*256 -push cs -pop ds -mov si,offset data2 -int 49h -mov ah,6 -int 49h -push gs -pop es -xor di,di -call savedacto -pop gs es ds bp di si dx cx ax -ret +;savedac: +;push ax cx dx si di bp ds es gs +;mov bp,sp +;mov dx,[ss:bp+22] +;mov ah,2 +;mov cx,3*256 +;push cs +;pop ds +;mov si,offset data2 +;int 49h +;mov ah,6 +;int 49h +;push gs +;pop es +;xor di,di +;call savedacto +;pop gs es ds bp di si dx cx ax +;ret -data2 db '/vgadac',0 +;data2 db '/vgadac',0 ;R‚cupŠre le dac depuis son bloc mémoire -restoredac: -push ax dx si bp ds gs -mov bp,sp -mov dx,ss:[bp+16] -push cs -pop ds -mov si,offset data2 -mov ah,9 -int 49h -push gs -pop ds -xor si,si -call restoredacfrom -pop gs ds bp si dx ax -ret +;restoredac: +;push ax dx si bp ds gs +;mov bp,sp +;mov dx,[ss:bp+16] +;push cs +;pop ds +;mov si,offset data2 +;mov ah,9 +;int 49h +;push gs +;pop ds +;xor si,si +;call restoredacfrom +;pop gs ds bp si dx ax +;ret ;sauve le DAC en es:di -savedacto: -push ax cx dx di -mov dx,3C7h -mov cx,256 -save: -mov al,cl -dec al -out dx,al -inc dx -inc dx -in al,dx -mov es:[di],al -inc di -in al,dx -mov es:[di],al -inc di -in al,dx -mov es:[di],al -inc di -dec dx -dec dx -dec cx -jne save -pop di dx cx ax -ret +;savedacto: +;push ax cx dx di +;mov dx,3C7h +;mov cx,256 +;save: +;mov al,cl +;dec al +;out dx,al +;inc dx +;inc dx +;in al,dx +;mov [es:di],al +;inc di +;in al,dx +;mov [es:di],al +;inc di +;in al,dx +;mov [es:di],al +;inc di +;dec dx +;dec dx +;dec cx +;jne save +;pop di dx cx ax +;ret ;restore le DAC depuis ds:si -restoredacfrom: -push ax cx dx si -xor ax,ax -mov dx,3C8h -mov cx,256 -save2: -mov al,cl -dec al -out dx,al -inc dx -mov al,ds:[si] -inc si -out dx,al -mov al,ds:[si] -inc si -out dx,al -mov al,ds:[si] -inc si -out dx,al -dec dx -dec cx -jne save2 -pop si dx cx ax -ret +;restoredacfrom: +;push ax cx dx si +;xor ax,ax +;mov dx,3C8h +;mov cx,256 +;save2: +;mov al,cl +;dec al +;out dx,al +;inc dx +;mov al,[ds:si] +;inc si +;out dx,al +;mov al,[ds:si] +;inc si +;out dx,al +;mov al,[ds:si] +;inc si +;out dx,al +;dec dx +;dec cx +;jne save2 +;pop si dx cx ax +;ret -;couleur al pour ligne di A SUPPRIMER -changelineattr: -push ax bx di es -mov bx,ax -mov ax,0B800h -mov es,ax -mov ax,di -mul cs:columns -mov di,ax -shl di,1 -mov al,cs:columns -inc di -popep: -mov es:[di],bl -add di,2 -dec al -jnz popep -pop es di bx ax -ret font8x8: -include ..\include\pol8x8.inc +include "..\include\pol8x8.inc" font8x16: -include ..\include\pol8x16.inc +include "..\include\pol8x16.inc" -end start diff --git a/programs/MAKEFILE b/programs/MAKEFILE index 62eb6e0..47397db 100644 --- a/programs/MAKEFILE +++ b/programs/MAKEFILE @@ -7,52 +7,43 @@ all: detect.com editeur.com gestion.com logo.com pmode.com souris.com test.com v memoire.com: memoire.asm $(asm) memoire $(lnk) memoire - ren memoire.com memoire.com detect.com: detect.asm $(asm) detect $(lnk) detect - ren detect.com detect.com editeur.com: editeur.asm $(asm) editeur $(lnk) editeur - ren editeur.com editeur.com gestion.com: gestion.asm $(asm) gestion $(lnk) gestion - ren gestion.com gestion.com logo.com: logo.asm $(asm) logo $(lnk) logo - ren logo.com logo.com pmode.com: pmode.asm $(asm) pmode $(lnk) pmode - ren pmode.com pmode.com souris.com: souris.asm $(asm) souris $(lnk) souris - ren souris.com souris.com test.com: test.asm $(asm) test $(lnk) test - ren test.com test.com verifier.com: verifier.asm $(asm) verifier $(lnk) verifier - ren verifier.com verifier.com volume.com: volume.asm $(asm) volume $(lnk) volume - ren volume.com volume.com + clean: del *.obj diff --git a/programs/detect.asm b/programs/detect.asm index 9c4ea33..7011638 100644 --- a/programs/detect.asm +++ b/programs/detect.asm @@ -3,57 +3,32 @@ smart .code -org 0100h +org 0h include ..\include\pci.h +include ..\include\mem.h start: +header exe <,1,0,,,offset imports,,> + +realstart: call getpciinfos -mov pciversion,bx -mov nbbus,cl -mov pcitype,al +mov [pciversion],bx +mov [nbbus],cl +mov [pcitype],al -mov si,offset msg -mov ah,13 -int 47h -mov ah,6 -int 47h - -mov si,offset pcivers -mov ah,13 -int 47h xor edx,edx -mov dx,bx -xchg dl,dh -mov cx,8 -mov ah,0Ah -int 47h -mov si,offset poin -mov ah,13 -int 47h -shr dx,8 -mov ah,0Ah -int 47h -mov si,offset pcivers2 -mov ah,13 -int 47h -mov ah,6 -int 47h - -mov si,offset nbbuses -mov ah,13 -int 47h -xor edx,edx -mov dl,nbbus +mov dl,[nbbus] inc dl -mov ah,08 -int 47h -mov ah,06 -int 47h +push edx +mov dx,[pciversion] +push edx +mov dx,[pciversion] +shr dx,8 +push edx +push offset msg +call [print] -mov si,offset typesof -mov ah,13 -int 47h mov di,offset types mov bx,7 mov al,pcitype @@ -61,89 +36,50 @@ vote: bt ax,bx jnc nowas shl bx,1 -mov si,[di+bx] -mov ah,13 -int 47h -mov si,offset spac -mov ah,13 -int 47h +push word ptr [di+bx] +call [print] shr bx,1 nowas: dec bx jns vote -mov ah,6 -int 47h +push offset return +call [print] xor ax,ax xor cx,cx -mov di,offset infos +mov si,offset infos search: +mov di,si call Getallfunctionsinfos jc stopthis - -mov bp,cx -push cx di -mov si,offset msg1 -mov ah,13 -int 47h -mov cx,16 -xor edx,edx -mov dx,[di+pci.device] -mov ah,0Ah -int 47h -mov si,offset msg2 -mov ah,13 -int 47h -mov dx,[di+pci.vendor] -mov ah,0Ah -int 47h -mov si,offset msg4 -mov ah,13 -int 47h -xor dx,dx -mov dl,al -mov cx,8 -mov ah,0Ah -int 47h -mov ah,07 -mov dl,'.' -int 47h -mov dx,bp -xor dh,dh -mov cx,8 -mov ah,0Ah -int 47h -mov ah,07 -mov dl,'.' -int 47h -mov dx,bp -shr dx,8 -mov cx,8 -mov ah,0Ah -int 47h -mov ah,05h -int 47h -mov si,offset msg3 -mov ah,13 -int 47h -mov cl,[di+pci.class] -mov ch,[di+pci.subclass] -mov di,offset temp -call getpciclass -mov si,di -mov ah,13 -int 47h -mov si,offset poin -mov ah,13 -int 47h -mov di,offset temp +mov dh,[si+pci.subclass] +mov dl,[si+pci.class] +;sousclasse +mov di,offset subclasse call getpcisubclass -mov si,di -mov ah,13 -int 47h -mov ah,06 -int 47h -pop di cx +push di +;classe +mov di,offset classe +call getpciclass +push di +;fonction +mov dl,ch +push edx +;device +mov dl,cl +push edx +;bus +mov dl,al +push edx +;device +mov dx,[si+pci.device] +push edx +;vendeur +mov dx,[si+pci.vendor] +push edx + +push offset msg2 +call [print] inc ch cmp ch,7 @@ -157,31 +93,24 @@ xor cl,cl inc al cmp al,16 jbe search -db 0CBh +retf -msg3 db ' Classe :',0 -msg1 db 'Peripherique :',0 -msg2 db ' Constructeur :',0 -msg4 db ' iD :',0 -msg db 'COS2000 hardware detecteur V1.6',0 -pcivers db 'BIOS PCI version ',0 -pcivers2 db ' a ete detecte !',0 -nbbuses db 'Nombre de bus : ',0 -typesof db 'Caracterisques PCI: ',0 -poin db '.',0 -virg db ', ',0 -spac db ' ',0 -temp db 128 dup (0) +msg db "COS2000 hardware detecteur V1.6\lBIOS PCI version %hB.%hB a ete detecte !\lNombre de bus : %u\lCaracterisques PCI: ",0 +msg2 db "Peripherique :%hW Constructeur :%hW Id :%hB.%hB.%hB Classe :%0.%0\l",0 +return db "\l",0 +classe db 128 dup (0) +subclasse db 128 dup (0) types dw config1 dw config2 - dw poin - dw poin + dw null + dw null dw config3 dw config4 - dw poin - dw poin - + dw null + dw null + +null db 'indefini',0 config1 db 'Config Mechanism 1',0 config2 db 'Config Mechanism 2',0 config3 db 'Special Cycle Mechanism 1',0 @@ -194,12 +123,12 @@ infos db 256 dup (0) ;fonction 0-7 bus 0-255 device 0-31 -;renvoie en es:di de classe cl +;renvoie en es:di de classe dl getpciclass: -push ax cx si di ds es +push ax cx dx si di ds es push es push di -mov di,cx +mov di,dx and di,0FFh shl di,1 mov di,[offset classes+di] @@ -217,27 +146,27 @@ pop ds pop di pop es rep movsb -pop es ds di si cx ax +pop es ds di si dx cx ax ret -;renvoie en es:di la sous-classe de ch et de classe cl +;renvoie en es:di la sous-classe de dh et de classe dl getpcisubclass: -push ax cx si di ds es +push ax cx dx si di ds es push es push di -mov di,cx +mov di,dx and di,0FFh shl di,1 mov di,[offset classesd+di] -xchg ch,cl -xor ch,ch -cmp cx,80h +xchg dh,dl +xor dh,dh +cmp dx,80h jne suiteac mov di,offset divers jmp found suiteac: -shl cx,1 -add di,cx +shl dx,1 +add di,dx mov di,[di] found: mov cx,0FFh @@ -254,7 +183,7 @@ pop ds pop di pop es rep movsb -pop es ds di si cx ax +pop es ds di si dx cx ax ret divers db 'divers',0 @@ -272,19 +201,30 @@ dw offset class9 dw offset class10 dw offset class11 dw offset class12 -class0 db 'Ancien',0 -class1 db 'Stockage',0 -class2 db 'Reseau',0 -class3 db 'Affichage',0 -class4 db 'Multimedia',0 -class5 db 'Memoire',0 -class6 db 'Pont',0 -class7 db 'Communication',0 -class8 db 'Systeme',0 -class9 db 'Acquisition',0 -class10 db 'Dock',0 -class11 db 'Processeur',0 -class12 db 'Bus serie',0 +dw offset class13 +dw offset class14 +dw offset class15 +dw offset class16 +dw offset class17 +class0 db 'ancien',0 +class1 db 'stockage',0 +class2 db 'reseau',0 +class3 db 'affichage',0 +class4 db 'multimedia',0 +class5 db 'memoire',0 +class6 db 'pont',0 +class7 db 'communication',0 +class8 db 'systeme',0 +class9 db 'acquisition',0 +class10 db 'dock',0 +class11 db 'processeur',0 +class12 db 'bus serie',0 +class13 db 'sans fil',0 +class14 db 'intelligent',0 +class15 db 'satellite',0 +class16 db 'cryptage',0 +class17 db 'traitement signal',0 + ;Classes et sous classes classesd: @@ -301,6 +241,11 @@ dw offset class9d dw offset class10d dw offset class11d dw offset class12d +dw offset class13d +dw offset class14d +dw offset class15d +dw offset class16d +dw offset class17d class0d: dw offset subclass00 @@ -313,30 +258,40 @@ dw offset subclass10 dw offset subclass11 dw offset subclass12 dw offset subclass13 +dw offset subclass14 subclass10 db 'scsi',0 subclass11 db 'ide',0 subclass12 db 'disquette',0 subclass13 db 'ipi',0 +subclass14 db 'raid',0 class2d: dw offset subclass20 dw offset subclass21 dw offset subclass22 +dw offset subclass23 +dw offset subclass24 subclass20 db 'ethernet',0 subclass21 db 'token ring',0 subclass22 db 'fddi',0 +subclass23 db 'atm',0 +subclass24 db 'isdn',0 class3d: dw offset subclass30 dw offset subclass31 +dw offset subclass32 subclass30 db 'vga',0 subclass31 db 'xga',0 +subclass32 db '3D',0 class4d: dw offset subclass40 dw offset subclass41 +dw offset subclass42 subclass40 db 'video',0 subclass41 db 'audio',0 +subclass42 db 'telephonie',0 class5d: dw offset subclass50 @@ -353,6 +308,7 @@ dw offset subclass64 dw offset subclass65 dw offset subclass66 dw offset subclass67 +dw offset subclass68 subclass60 db 'hote',0 subclass61 db 'isa',0 subclass62 db 'eisa',0 @@ -361,28 +317,41 @@ subclass64 db 'pci',0 subclass65 db 'pcmcia',0 subclass66 db 'nubus',0 subclass67 db 'cardbus',0 +subclass68 db 'RACEway',0 class7d: dw offset subclass70 dw offset subclass71 +dw offset subclass72 +dw offset subclass73 subclass70 db 'serie',0 subclass71 db 'parallele',0 +subclass72 db 'serie multiport',0 +subclass73 db 'modem',0 class8d: dw offset subclass80 dw offset subclass81 dw offset subclass82 +dw offset subclass83 +dw offset subclass84 subclass80 db 'pic',0 subclass81 db 'dma',0 subclass82 db 'timer',0 +subclass83 db 'rtc',0 +subclass84 db 'hotplug',0 class9d: dw offset subclass90 dw offset subclass91 dw offset subclass92 +dw offset subclass93 +dw offset subclass94 subclass90 db 'clavier',0 subclass91 db 'stylo',0 subclass92 db 'souris',0 +subclass93 db 'scanner',0 +subclass94 db 'joystick',0 class10d: dw offset subclass100 @@ -406,11 +375,46 @@ dw offset subclass121 dw offset subclass122 dw offset subclass123 dw offset subclass124 +dw offset subclass125 subclass120 db 'firewire',0 subclass121 db 'access',0 subclass122 db 'ssa',0 subclass123 db 'usb',0 -subclass124 db 'smbus',0 +subclass124 db 'fibre',0 +subclass125 db 'smbus',0 + +class13d: +dw offset subclass130 +dw offset subclass131 +dw offset subclass132 +subclass130 db 'irda',0 +subclass131 db 'ir',0 +subclass132 db 'rf',0 + +class14d: +dw offset subclass140 +subclass140 db 'IO arch',0 + +class15d: +dw offset subclass150 +dw offset subclass151 +dw offset subclass152 +dw offset subclass153 +subclass150 db 'tv',0 +subclass151 db 'audio',0 +subclass152 db 'voix',0 +subclass153 db 'donnees',0 + +class16d: +dw offset subclass160 +dw offset subclass161 +subclass160 db 'reseau',0 +subclass161 db 'jeux',0 + +class17d: +dw offset subclass170 +subclass170 db 'dpio',0 + ;bx pci version, cl nbbus, al pci type getPciInfos: @@ -538,5 +542,10 @@ pci_type2_detect: jne endofdetectiontype2 endofdetectiontype2: ret + +imports: + db "VIDEO.LIB::print",0 +print dd 0 + dw 0 end start diff --git a/programs/editeur.asm b/programs/editeur.asm index 23c988c..df5cd7f 100644 --- a/programs/editeur.asm +++ b/programs/editeur.asm @@ -1,10 +1,16 @@ .model tiny -.386c +.486 +smart .code -org 0100h - - + +org 0h + +include ..\include\mem.h + start: +header exe <,1,0,,,offset imports,,> + +realstart: mov ax,0305h mov bx,0008h int 16h @@ -43,62 +49,43 @@ Adres: int 47h mov bh,infos mov edi,ebp - mov ah,21 - mov cl,7 - int 47h lines: + xor edx,edx + mov dx,di + push edx mov edx,edi shr edx,4*4 shl edx,4*3 - mov cx,16 - mov ah,10 - int 47h - mov si,offset dep - mov ah,13 - int 47h + push edx + push offset spaces + call [print] mov dx,di - mov ah,10 - int 47h - mov ah,13 - mov si,offset spaces - int 47h - mov ah,5 - int 47h mov al,infos+1 - mov cl,7 - mov ah,21 - int 47h mov esi,edi doaline: mov edx,edi shr edx,4*4 shl edx,4*3 mov fs,dx - mov dl,fs:[di] - mov ah,10 - mov cl,8 - int 47h - mov ah,5 - int 47h + push dword ptr fs:[di] + push 8 + call [showhex] + push ' ' + call [showchar] inc edi dec al jnz doaline mov edi,esi - mov si,offset spaces - mov ah,13 - int 47h + push offset spaces2 + call [print] mov al,infos+1 - mov ah,21 - mov cl,7 - int 47h doaline2: mov edx,edi shr edx,4*4 shl edx,4*3 mov fs,dx - mov dl,fs:[di] - mov ah,7 - int 47h + push word ptr fs:[di] + call [showchar] inc edi dec al jnz doaline2 @@ -110,14 +97,12 @@ doaline2: int 47h jmp lines outes: - mov ah,21 - mov cl,112 - int 47h mov bh,0 mov bl,infos - mov si,offset menu - mov ah,14h + mov ah,25 int 47h + push offset menu + call [print] waitkey: mov ax,0 int 16h @@ -153,18 +138,13 @@ outes: suit6: cmp ax,4100h jne suit7 - mov ah,21 - mov cl,116 - int 47h mov dword ptr [pope],'TIDE' + mov bh,0 mov bl,infos - xor bh,bh - mov si,offset menu - mov ah,14h - int 47h - mov ah,21 - mov cl,7 + mov ah,25 int 47h + push offset menu + call [print] mov ax,0B800h mov es,ax mov xxyy2,3 @@ -243,28 +223,20 @@ writs: cmp ch,cl je no push si ax - mov ah,25 + mov bh,0 mov bl,infos - xor bh,bh - int 47h - mov ah,21 - mov cl,117 - int 47h - mov si,offset msg - mov ah,13 + mov ah,25 int 47h + push offset msg + call [print] mov ax,0 int 16h + mov bh,0 mov bl,infos - xor bh,bh mov ah,25 int 47h - mov ah,21 - mov cl,116 - int 47h - mov ah,13 - mov si,offset menu - int 47h + push offset menu + call [print] pop bx si mov es:[bx-1],edi mov es:[si-1],dx @@ -289,8 +261,7 @@ cursor: jne adres mov ah,29h int 47h - db 0CBH ; +++++++ - ret + retf calc1: push ax dx si @@ -377,14 +348,25 @@ yy dw 0 xxyy dw 3 xxyy2 dw 3 -msg db 'Erreur : zone non modifiable (ROM) pressez une touche pour continuer ',0 -menu db 'haut/bas [F1/2] Offset [F3/4] Segment [F5/6] Mode F7, Quitter F8 MODE ' +msg db '\c74Erreur : zone non modifiable (ROM) pressez une touche pour continuer ',0 +menu db '\c70haut/bas [F1/2] Offset [F3/4] Segment [F5/6] Mode F7, Quitter F8 MODE ' pope db 'VUE ',0 -spaces db ' ³ ',0 +spaces db '\c02%hW:%hW \c04| \c07',0 +spaces2 db '\c04 | \c07',0 showbuffer db 35 dup (0FFh) oldmode db 0 infos db 40 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 diff --git a/programs/exem-ce.asm b/programs/exem-ce.asm new file mode 100644 index 0000000..87d3313 --- /dev/null +++ b/programs/exem-ce.asm @@ -0,0 +1,29 @@ +.model small +.486 +smart +.code +org 0h + +include ..\include\mem.h + +start: +header exe <,1,0,,,offset imports,offset exports,> + +realstart: +push offset message +call [affiche] +call [waitkey] +retf + +message db 'Appel de la librairie video !',0 + + +imports: + db "VIDEO.LIB::print",0 +affiche dd 0 + db "EXEM-LIB.LIB::waitkey",0 +waitkey dd 0 + dw 0 +exports: + +end start diff --git a/programs/exem-lib.asm b/programs/exem-lib.asm new file mode 100644 index 0000000..7c3d5d9 --- /dev/null +++ b/programs/exem-lib.asm @@ -0,0 +1,25 @@ +.model tiny +.486 +smart +.code +org 0h + +include ..\include\mem.h + +start: +header exe <,1,0,,,offset imports,offset exports,> + + +getvar2: +mov ax,0 +int 16h +retf + + +imports: + +exports: + db "waitkey",0 + dw getvar2 + dw 0 +end start diff --git a/programs/gestion.asm b/programs/gestion.asm index dc79590..b949ddb 100644 --- a/programs/gestion.asm +++ b/programs/gestion.asm @@ -3,133 +3,42 @@ smart .code -org 0100h +org 0h +include ..\include\mem.h include ..\include\fat.h start: -mov ah,2 -int 47h -mov ah,25 -mov bx,0 -int 47h -mov ah,21 -mov cl,70h -int 47h -mov ah,13 -mov si,offset msg1 -int 47h -mov ah,21 -mov cl,7 -int 47h -mov ah,13 -mov si,offset prompt -int 47h -mov ah,13 -mov si,offset infos -int 47h -mov ah,13 -mov si,offset prompt -int 47h +header exe <,1,0,,,offset imports,,> + +realstart: +push offset msg1 +call [print] + mov ah,3 int 48h xor bp,bp mov di,offset bufferentry -mov si,di mov ah,7 int 48h jc nofiles go: -test [si+Entries.FileAttr],00010000b -je notdirectory -mov ah,21 -mov cl,4 -int 47h -jmp notall -notdirectory: -cmp [si+Entries.FilExt],'E' -jne notexe -cmp [si+Entries.FilExt+1],'X' -jne notexe -cmp [si+Entries.FilExt+2],'E' -jne notexe -mov ah,21 -mov cl,5 -int 47h -jmp notall -notexe: -cmp [si+Entries.FilExt],'S' -jne notsys -cmp [si+Entries.FilExt+1],'Y' -jne notsys -cmp [si+Entries.FilExt+2],'S' -jne notsys -mov ah,21 -mov cl,0Ah -int 47h -jmp notall -notsys: -mov ah,21 -mov cl,7h -int 47h -notall: -mov ah,46 -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,44 -mov dx,[si+Entries.FileDateCrea] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,45 -mov dx,[si+Entries.FileTimeCrea] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,44 -mov dx,[si+Entries.FileDate] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,45 -mov dx,[si+Entries.FileTime] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,48 -mov edx,[si+Entries.FileSize] -int 47h -mov ah,05 -int 47h -int 47h -int 47h -mov ah,47 -mov dl,[si+Entries.FileAttr] -int 47h -mov ah,6 -int 47h +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: -mov ah,21 -mov cl,70h -int 47h -mov ah,13 -mov si,offset menu -int 47h +push offset menu +call [print] mov xx,1 mov xxold,2 call Select @@ -139,7 +48,7 @@ int 16h cmp ah,50h jne tre1 cmp xx,bp - je endof + ja endof inc xx call select jmp endof @@ -157,14 +66,11 @@ tre2: tre3: cmp ah,59 jne tre4 - jmp start + jmp realstart tre4: cmp ah,67 jne endof - mov ah,15h - mov cl,7 - int 47h - db 0CBh + retf ;selectionne la ligne xx Select: @@ -186,12 +92,18 @@ ret xx dw 1 xxold dw 0 -menu db '[F1] Lire disque [F9] Quitter ',0 -msg1 db ' Gestionnaire de fichier Version 1.5 ',0 -msg2 db 'Programme en cours de chargement',0 -prompt db '--------------------------------------------------------------------------------',0 -infos db 'Nom Ext. Date creation Date modification Taille Attributs',0 - +menu db '\c70 [F1] Lire disque [F9] Quitter \c07',0 +msg1 db '\e\g00,00\c70 Gestionnaire de fichier Version 1.5 ' + db '\g00,01\c07--------------------------------------------------------------------------------' + db '\g00,02Nom Ext. Date creation Date modification Taille Attributs' + db '\g00,03--------------------------------------------------------------------------------\l',0 +line db '\c07%n %d %t %d %t %z %a\l',0 bufferentry db 512 dup (0) + +imports: + db "VIDEO.LIB::print",0 +print dd 0 + dw 0 + end start diff --git a/programs/isa.asm b/programs/isa.asm new file mode 100644 index 0000000..2d50ab9 --- /dev/null +++ b/programs/isa.asm @@ -0,0 +1,39 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: + +PNP_ADR_PORT equ 0x279 +PNP_WRITE_PORT equ 0xA79 +;MIN and MAX READ_ADDR must have the bottom two bits set +MIN_READ_ADDR equ 0x203 +MAX_READ_ADDR equ 0x3FF +;READ_ADDR_STEP must be a multiple of 4 +READ_ADDR_STEP equ 8 + +;bits +CONFIG_WAIT_FOR_KEY equ 0x02 +CONFIG_RESET_CSN equ 0x04 +IDENT_LEN equ 9 + +;renvoie le timer en ax +ctc: + cli + mov dx,043h + mov al,0 + out dx,al + mov dx,40h + in al,dx + mov ah,al + in al,dx + sti + ret + +;attend pendant ax microsecondes +usleep: + +end start diff --git a/programs/logo.asm b/programs/logo.asm index d5a3b1a..cae2394 100644 --- a/programs/logo.asm +++ b/programs/logo.asm @@ -1,10 +1,16 @@ .model tiny -.386c +.486 +smart .code -org 0100h - - + +org 0h + +include ..\include\mem.h + start: +header exe <,1,0,,,offset imports,,> + +realstart: mov ah,7 mov cx,65535 int 49h @@ -34,7 +40,6 @@ jc problem2 push es pop ds -xor si,si mov ah,28h int 47h @@ -42,59 +47,68 @@ mov ax,0008h int 47h mov ah,2 int 47h -mov cx,300 -mov bx,30 -mov ah,37 -int 47h -mov ah,15h -mov cl,11 -int 47h +push 0 +call cs:[loadbmppalet] +push 150 +push 20 +push 0 +call cs:[showbmp] +jc problem4 push cs pop ds -mov ah,13 -mov si,offset poper -int 47h -mov ax,0 +push offset poper +call [print] +endofit: +xor ax,ax int 16h mov ah,29h int 47h -db 0CBH +retf problem: push cs pop ds -mov ah,13 -mov si,offset error -int 47h -mov ax,0 -int 16h -db 0CBh +push offset error +call [print] +jmp endofit problem2: push cs pop ds -mov ah,13 -mov si,offset error2 -int 47h -mov ax,0 -int 16h -db 0CBh +push offset error2 +call [print] +jmp endofit problem3: push cs pop ds -mov ah,13 -mov si,offset error3 -int 47h -mov ax,0 -int 16h -db 0CBh +push offset error3 +call [print] +jmp endofit -poper db 'COS2000 en mode graphique',0 +problem4: +push cs +pop ds +push offset error4 +call [print] +jmp endofit + +poper db '\c0BC\c0CO\c0DS\c0E2\c0E0\c0E0\c0F0 en mode graphique',0 logo db 'cos.rip',0 ok1 db 'Chargement de l''image OK',0 ok2 db 'Decompression de l''image OK',0 -error3 db 'Une erreur est apparue lors de l''allocation de mémoire',0 -error db 'Une erreur est apparue lors du chargement de l''image',0 -error2 db 'Une erreur est apparue lors de la decompression de l''image',0 +error3 db '\c04Une erreur est apparue lors de l''allocation de mémoire',0 +error db '\c04Une erreur est apparue lors du chargement de l''image',0 +error2 db '\c04Une erreur est apparue lors de la decompression de l''image',0 +error4 db '\c0FUne erreur est apparue lors de l''affichage de l''image',0 + + +imports: + db "VIDEO.LIB::print",0 +print dd 0 + db "BMP.LIB::showbmp",0 +showbmp dd 0 + db "BMP.LIB::loadbmppalet",0 +loadbmppalet dd 0 + dw 0 end start diff --git a/programs/memoire.asm b/programs/memoire.asm index d3ed25b..f220b60 100644 --- a/programs/memoire.asm +++ b/programs/memoire.asm @@ -3,87 +3,80 @@ smart .code -org 0100h +org 0h include ..\include\mem.h include ..\include\divers.h start: -mov si,offset msg -mov ah,13 -int 47h -mov ah,6 -int 47h -mov si,offset menu -mov ah,13 -int 47h -mov ah,6 -int 47h +header exe <,1,0,,,offset imports,,> + +realstart: +push offset msg +call [print] + xor cx,cx listmcb: mov ah,4 int 49h jc fino inc cx -mov ah,18h -int 47h -push gs -pop ds -mov bh,0 -mov si,MB.Names -mov ah,14h -int 47h -mov bh,15 -xor edx,edx -mov dx,ds:[MB.Sizes] -shl edx,4 -mov ah,0Fh -int 47h -mov bh,24 -cmp ds:[MB.IsResident],true -push cs -pop ds -jne notresident -mov si,offset resident -mov ah,14h -int 47h -jmp suitelistmcb -notresident: -mov si,offset nonresident -mov ah,14h -int 47h -suitelistmcb: -mov bh,30 -cmp gs:[MB.Reference],0 -je next -cmp gs:[MB.Reference],1000h -jb next -mov ax,gs:[MB.Reference] -dec ax -dec ax -mov ds,ax -mov si,MB.Names -mov ah,14h -int 47h -next: -mov bh,46 -xor edx,edx + +;placement mémoire mov dx,gs inc dx inc dx -push cx -mov cx,16 -mov ah,11h -int 47h -pop cx -mov ah,6h -int 47h +push edx + +;parent +cmp gs:[MB.Reference],0 +je next +mov dx,gs:[MB.Reference] +dec dx +dec dx +push dx +push offset MB.Names +jmp suitemn +next: +push cs +push offset none +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 line +call [print] + jmp listmcb fino: db 0CBh -resident db 'oui',0 -nonresident db 'non',0 -msg db 'Memory manager V1.5',0 -menu db 'Nom | Taille | Res | Parent | Mem',0 +resident db "oui",0 +nonresident db "non",0 +line db "%0P\h15%w\h24%0\h30%0P\h46%hW\l",0 +msg db "Memory manager V1.5\lNom Taille Res Parent Mem\l",0 +none db ".",0 +imports: + db "VIDEO.LIB::print",0 +print dd 0 + dw 0 + end start diff --git a/programs/pmode.asm b/programs/pmode.asm index 23b82e4..f78d0a5 100644 --- a/programs/pmode.asm +++ b/programs/pmode.asm @@ -3,7 +3,7 @@ smart .code -org 0100h +org 0h start: mov eax,cr0 diff --git a/programs/souris.asm b/programs/souris.asm index 30c92fc..cd02e54 100644 --- a/programs/souris.asm +++ b/programs/souris.asm @@ -3,15 +3,25 @@ smart .code -org 0100h +org 0h + +include ..\include\mem.h start: -mov si,offset message -mov ah,13 -int 47h +header exe <,1,0,,,offset imports,,> + +realstart: mov ah,2 int 74h -db 0CBh +push offset message +call [print] +retf message db 'Activation de la souris',0 + +imports: + db "VIDEO.LIB::print",0 +print dd 0 + dw 0 + end start diff --git a/programs/test.asm b/programs/test.asm index 0b72193..5b24e0b 100644 --- a/programs/test.asm +++ b/programs/test.asm @@ -2,195 +2,54 @@ .486 smart .code -org 0100h +org 0h + +include ..\include\mem.h start: +header exe <,1,0,,,offset imports,,> + +realstart: mov ah,28h int 47h -mov ax,0001 -int 47h -mov ah,2 -int 47h -mov si,offset text1 ;titre -mov ah,13 -int 47h -mov ah,6 -int 47h -int 47h -mov ah,21 -mov cl,3 -int 47h -mov ah,13 -mov si,offset text2 -int 47h -mov ah,6 -int 47h -mov edx,2612182686 -mov ah,8 -int 47h -mov ah,6 -int 47h -mov edx,7576534 -mov ah,8 -int 47h -mov ah,6 -int 47h -mov ah,21 -mov cl,4 -int 47h -mov si,offset text3 -mov ah,13 -int 47h -mov ah,6 -int 47h -mov edx,-6876253 -mov cx,32 -mov ah,9 -int 47h -mov ah,6 -int 47h -mov edx,-311212323 -mov cx,32 -mov ah,9 -int 47h -mov ah,6 -int 47h -mov ah,21 -mov cl,5 -int 47h -mov ah,13 -mov si,offset text4 -int 47h -mov ah,6 -int 47h -mov edx,0892325457 -mov cx,16 -mov ah,10 -int 47h -mov ah,6 -int 47h -mov edx,0236514 -mov ah,10 -mov cx,32 -int 47h -mov ah,6 -int 47h -mov ah,21 -mov cl,6 -int 47h -mov ah,13 -mov si,offset text5 -int 47h -mov ah,6 -int 47h -mov edx,3762182686 -mov ah,11 -mov cx,32 -int 47h -mov ah,6 -int 47h -mov edx,2182686 -mov ah,11 -mov cx,16 -int 47h -mov ah,6 -int 47h -mov ah,21 -mov cl,7 -int 47h -mov ah,13 -mov si,offset text6 -int 47h -mov ah,6 -int 47h -mov dl,'h' -mov ah,7 -int 47h -mov ah,6 -int 47h -mov dl,'@' -mov ah,7 -int 47h -mov ah,6 -int 47h -mov ah,21 -mov cl,8 -int 47h -mov ah,13 -mov si,offset text7 -int 47h -mov ah,6 -int 47h -mov si,offset textt -mov ah,13 -int 47h -mov ah,6 -int 47h -mov si,offset texttt -mov ah,13 -int 47h -mov ah,6 -int 47h -mov ah,21 -mov cl,9 -int 47h -mov ah,13 -mov si,offset text71 -int 47h -mov ah,6 -int 47h -mov dx,0BF30h -mov ah,44 -int 47h -mov ah,6 -int 47h -mov dx,0B0B6h -mov ah,44 -int 47h -mov ah,6 -int 47h -mov ah,13 -mov si,offset text72 -int 47h -mov ah,6 -int 47h -mov edx,8601h -mov ah,45 -int 47h -mov ah,6 -int 47h -mov dx,0B0B6h -mov ah,45 -int 47h -mov ah,6 -int 47h +push word ptr 0FFFFh +push dword ptr 652201 +push dword ptr 1545454545 +push word ptr 1523 +push word ptr 2041 +push offset zero +push offset fixe +push word ptr 5 +push word ptr 'i' +push word ptr 'a' +push dword ptr 5041 +push dword ptr 125645 +push dword ptr 5041 +push dword ptr 125645 +push dword ptr 5041 +push dword ptr 125645 +push offset message +call [print] mov ax,0 int 16h - - mov ah,2 int 47h mov ah,30 int 47h mov ah,2 int 47h -mov ah,21 -mov cl,5 -int 47h + mov cx,200 go1: mov ah,30 int 47h mov ah,33 int 47 -mov ah,20 -xor bh,bh -inc bl -mov si,offset text8 -int 47h +push offset textdemo1 +call [print] call put mov ah,30 int 47h @@ -199,20 +58,14 @@ int 47h dec cx jnz go1 -mov ah,21 -mov cl,7 -int 47h mov cx,200 go2: -mov si,offset text9 mov ah,30 int 47h mov ah,33 int 47h -mov ah,6 -int 47h -mov ah,13 -int 47h +push offset textdemo2 +call [print] call put mov ah,30 int 47h @@ -221,20 +74,14 @@ int 47h dec cx jnz go2 -mov ah,21 -mov cl,9 -int 47h mov cx,200 go3: -mov si,offset text10 mov ah,30 int 47h mov ah,33 int 47h -xor bh,bh -inc bl -mov ah,20 -int 47h +push offset textdemo3 +call [print] call put mov ah,30 int 47h @@ -247,14 +94,8 @@ mov ah,30 int 47h mov ah,2 int 47h -mov bx,040Dh -mov si,offset texte1 -mov ah,20 -int 47h -mov si,offset texte2 -inc bl -mov ah,20 -int 47h +push offset texte2 +call [print] mov ah,30 int 47h mov ah,2 @@ -262,9 +103,6 @@ int 47h mov ah,30 int 47h -mov cl,12 -mov ah,21 -int 47h mov bp,255 xor edx,edx go4: @@ -273,32 +111,28 @@ int 47h mov ah,33 int 47h inc edx -mov ah,11 -mov cx,16 -int 47h -mov ah,6 -int 47h +push edx +push offset texte3 +call [print] mov ah,30 int 47h mov ah,33 int 47h dec bp jnz go4 -mov ah,14h -xor bx,bx -mov si,offset texte3 -int 47h +push offset texte4 +call [print] mov ax,0 int 16h mov ah,29h int 47h -db 0CBh +retf put: call random mov di,dx and di,4096-2 -mov si,offset text11 +mov si,offset fond call showstring2 ret @@ -322,24 +156,27 @@ mov cs:randseed,dx pop dx cx ax ret -texttt db 'Texte',0 -textt db 'Divers',0 -text1 db ' D‚monstration de l''utilisation de la bibliothŠque VIDEO',0 -text2 db 'Nombre entier :',0 -text3 db 'Nombre sign‚ :',0 -text4 db 'Nombre h‚xad‚cimal :',0 -text5 db 'Nombre binaire :',0 -text6 db 'CaractŠres :',0 -text7 db 'Texte :',0 -text71 db 'Date :',0 -text72 db 'Heure :',0 -text8 db 'Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling',0 -text9 db 'Vertical Vertical Vertical Vertical Vertical Vertical Vertical Vertical',0 -text10 db 'Rapide Rapide Rapide Rapide Rapide Rapide Rapide Rapide',0 -text11 db 'Echange rapide de pages Vid‚o',0 -texte1 db 'Routine d''affichage Ultra Rapide Agissant sur le Mat‚riel',0 -texte2 db 'Possibilit‚ de r‚aliser des effets de superposition',0 -texte3 db 'Sauvegarde et restauration de l''ecran',0 +zero db 'Chaine a z‚ro terminal',0 +fixe db 20,'Chaine a taille fixe' +message db "\m01\e\c07\h01D‚monstration de la librairie VIDEO.LIB\l\l" + db "\c01Nombres entiers ou sign‚s (%%u/%%i):\l%u\l%iD\l" + db "\c02Nombre hexad‚cimaux (%%h):\l%hD\l%hW\l" + db "\c03Nombres Binaires (%%b):\l%bD\l%bB\l" + db "\c04Caracteres simples ou multiples (%%c/%%cM):\l%c\l%cM\l" + db "\c05Chaines a z‚ro terminal ou fixes (%%0/%%s):\l%s\l%0\l" + db "\c06Dates et heures (%%t/%%d):\l%t\l%d\l" + db "\c07Nombre a echelle automatique (%%z):\l%z\l%z\l" + db "\c08Attributs de fichiers (%%a):\l%a",0 + +fond db 16,'Ceci est un fond' +textdemo1 db '\c05Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling\l',0 +textdemo2 db '\c07Vertical Vertical Vertical Vertical Vertical Vertical Vertical Vertical\l',0 +textdemo3 db '\c09Rapide Rapide Rapide Rapide Rapide Rapide Rapide Rapide\l',0 +texte1 db 'Echange rapide de pages Vid‚o',0 +texte2 db '\g04,13Routine d''affichage Ultra Rapide Agissant sur le Mat‚riel' + db '\g04,14Possibilit‚ de r‚aliser des effets de superposition',0 +texte3 db '\c04%bD\l',0 +texte4 db '\g01,00Sauvegarde et restauration de l''ecran (%%s/%%r)',0 showstring2: push es bx cx si di @@ -358,6 +195,9 @@ strinaize4: pop di si cx bx es ret - +imports: + db "VIDEO.LIB::print",0 +print dd 0 + dw 0 end start diff --git a/programs/verifier.asm b/programs/verifier.asm index 8b9af11..a662e4a 100644 --- a/programs/verifier.asm +++ b/programs/verifier.asm @@ -1,158 +1,113 @@ .model tiny .386c .code -org 0100h +org 0h +include ..\include\mem.h + start: - mov ah,28h - int 47H - mov ax,0002 - int 47H -replay: - mov ah,2 - int 47h -mov ah,21 -mov cl,7 -int 47h - xor di,di - xor cx,cx - mov ah,20 - mov bx,1D00h - mov si,offset Msg - int 47h - mov ah,20 - mov bx,0231h - mov si,offset msgapp - int 47h - mov bp,1000h +header exe <,1,0,,,offset imports,,> + +realstart: + mov ah,28h + int 47h + push offset msg + call [print] + mov bp,1000h + xor di,di + xor cx,cx + xor edx,edx VerifAll: - mov ah,1 - int 16h - jz nokey - cmp al,' ' - je enend + mov ah,1 + int 16h + jz nokey + cmp al,' ' + je enend nokey: - mov ax,cx - inc ax - mov si,100 - mul si - mov si,2880 - div si - xor edx,edx - mov dx,ax - mov ah,15 - mov bx,0A14h - int 47h - mov ah,13 - mov si,offset po - int 47h - mov ah,15 - mov dx,cx - inc dx - mov bx,0A10h - int 47h - mov ah,13 - mov si,offset Msg2 - int 47h - mov ah,8 - mov edx,0 - mov dx,di - int 47h - mov ah,13 - mov si,offset Msg3 - int 47h - call gauge - mov ah,2 - int 48h - jc errors - je noprob - inc di - noprob: - inc cx - cmp cx,2880 - jnz verifall + mov dx,di + push edx + mov dx,cx + inc dx + push edx + mov ax,cx + inc ax + mov si,100 + mul si + mov si,2880 + div si + mov dx,ax + push edx + push offset msg2 + call [print] + call gauge + mov ah,2 + int 48h + jc errors + je noprob + inc di +noprob: + inc cx + cmp cx,2880 + jnz verifall enend: - cmp di,0 - je noatall -mov bx,0E09h -mov ah,20 -mov si,offset error2 -int 47h - jmp someof - noatall: -mov bx,0E09h -mov ah,20 -mov si,offset noerror -int 47h - someof: - mov ah,0 - int 16h - mov ah,29h - int 47H - db 0CBH - errors: -mov ah,21 -mov cl,4 -int 47h -mov bx,0D09h -mov ah,20 -mov si,offset errore -int 47h -mov ah,0 -int 16h - mov ah,29h - int 47H -db 0CBH + cmp di,0 + je noatall + push offset error2 + call [print] + jmp someof +noatall: + push offset noerror + call [print] +someof: + mov ah,0 + int 16h + mov ah,29h + int 47H + retf +errors: + push offset error + call [print] + mov ah,0 + int 16h + mov ah,29h + int 47H + retf -errore db 'Erreur avec le lecteur de disquette !',0 -noerror db 'Pas de secteurs defectueux, appuyez sur une touche pour continuer',0 -error2 db 'Le disque est defectueux, appuyez sur une touche pour quitter',0 -po db ' %',0 -msgapp db '',0 -msg db '- Test de surface du disque -',0 -msg2 db ' cluster testes. ',0 -msg3 db ' cluster defectueux. ',0 -;->Increment CX +error db '\g10,10Erreur avec le lecteur de disquette !',0 +error2 db '\g10,10Le disque est defectueux, appuyez sur une touche pour quitter',0 +noerror db '\g10,10Pas de secteurs defectueux, appuyez sur une touche pour continuer',0 +msg db '\m02\e\c07\g29,00- Test de surface du disque -\g02,49',0 +msg2 db '\g10,20%u %%\g10,16%u cluster testes. \h34%u cluster defectueux. ',0 + gauge: -push ax bx cx dx si ds -push cs -pop ds -mov ax,cx -mul sizes -div max -mov dx,ax -mov bl,oldvalue -xor bh,bh -mov byte ptr [offset gaugetxt+bx],'Û' -cmp bx,0 -jnz nono2 -mov ah,21 -mov cl,8 -int 47h -mov bx,xy -mov ah,20 -mov si,offset gaugetxt -int 47h -mov ah,21 -mov cl,7 -int 47h -nono2: -mov bx,dx -xor bh,bh -mov byte ptr [offset gaugetxt+bx],0 -mov oldvalue,bl -mov bx,xy -mov ah,20 -mov si,offset gaugetxt -int 47h -pop ds si dx cx bx ax -ret -oldvalue db 0 -max dw 2880 -sizes dw 50 -xy dw 0A12h -gaugetxt db 'ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ',0 + push ax dx + mov ax,cx + mul sizeof + div max + xor edx,edx + mov dx,sizeof + sub dx,ax + push dx + push 'Û' + mov dx,ax + push dx + push 'Û' + push offset gauges + call [print] + pop dx ax + retn + +max dw 2879 +sizeof dw 50 + +gauges db '\g10,18\c05%cM\c07%cM',0 + +imports: + db "VIDEO.LIB::print",0 +print dd 0 + dw 0 + End Start diff --git a/programs/volume.asm b/programs/volume.asm index 49a0947..7faae2c 100644 --- a/programs/volume.asm +++ b/programs/volume.asm @@ -1,10 +1,16 @@ .model tiny -.386c +.486 +smart .code -org 0100h - - + +org 0h + +include ..\include\mem.h + start: +header exe <,1,0,,,offset imports,,> + +realstart: mov ax,0305h mov bx,0008h int 16h @@ -38,12 +44,8 @@ Adres: mov bl,infos xor bh,bh int 47h - mov ah,21 - mov cl,116 - int 47h - mov ah,13 - mov si,offset errordisk - int 47h + push offset errordisk + call [print] mov ax,0 int 16h noerror: @@ -71,52 +73,32 @@ Adres: int 47h mov bh,infos mov di,bp - mov ah,21 - mov cl,7 - int 47h lines: - mov dx,sect - mov cx,16 - mov ah,10 - int 47h - mov si,offset dep - mov ah,13 - int 47h + xor edx,edx mov dx,di - mov ah,10 - int 47h - mov ah,13 - mov si,offset spaces - int 47h - mov ah,5 - int 47h + push edx + mov dx,sect + push edx + push offset spaces + call [print] mov al,infos+1 - mov cl,7 - mov ah,21 - int 47h mov si,di doaline: - mov dl,[di+offset buffer] - mov ah,10 - mov cl,8 - int 47h - mov ah,5 - int 47h + push dword ptr [di+offset buffer] + push 8 + call [showhex] + push ' ' + call [showchar] inc di dec al jnz doaline mov di,si - mov si,offset spaces - mov ah,13 - int 47h + push offset spaces2 + call [print] mov al,infos+1 - mov ah,21 - mov cl,7 - int 47h doaline2: - mov dl,[di+offset buffer] - mov ah,7 - int 47h + push word ptr [di+offset buffer] + call [showchar] inc di dec al jnz doaline2 @@ -128,14 +110,12 @@ doaline2: int 47h jmp lines outes: - mov ah,21 - mov cl,112 - int 47h mov bh,0 mov bl,infos - mov si,offset menu - mov ah,14h + mov ah,25 int 47h + push offset menu + call [print] waitkey: mov ax,0 int 16h @@ -183,19 +163,12 @@ outes: cmp ax,4100h jne suit7 mov dword ptr [pope],'TIDE' + mov bh,0 mov bl,infos - xor bh,bh mov ah,25 int 47h - mov ah,21 - mov cl,116 - int 47h - mov si,offset menu - mov ah,13 - int 47h - mov ah,21 - mov cl,7 - int 47h + push offset menu + call [print] mov ax,0B800h mov es,ax mov xxyy2,3 @@ -290,8 +263,7 @@ cursor: jne adres2 mov ah,29h int 47H - db 0CBH - ret + retf calc1: push ax dx si @@ -375,16 +347,28 @@ xx dw 0 yy dw 0 xxyy dw 3 xxyy2 dw 3 -errordisk db 'Une erreur est apparue sur le lecteur, appuyez sur une touche ',0 -menu db 'Haut&Bas [F1/2] Secteur [F3/4] Charger/Sauver [F5/6] Mode [F7] Quit. [F8] ' -pope db 'VIEW',0 -spaces db ' ³ ',0 + +errordisk db '\c74Une erreur est apparue sur le lecteur, appuyez sur une touche ',0 +menu db '\c70Haut&Bas [F1/2] Secteur [F3/4] Charger/Sauver [F5/6] Mode [F7] Quit. [F8] ' +pope db 'VUE ',0 +spaces db '\c02%hW:%hW \c04| \c07',0 +spaces2 db '\c04 | \c07',0 showbuffer db 35 dup (0FFh) oldmode db 0 infos db 40 dup (0) buffer db 2048 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