diff --git a/INFORMATIONS.md b/INFORMATIONS.md index b6af644..308852e 100644 --- a/INFORMATIONS.md +++ b/INFORMATIONS.md @@ -11,6 +11,7 @@ Compatible Operating System Mode d’emploi Faire un programme pour COS Liste des APIs + Détail des APIs En cas de problème mailto:nicolas@palon.fr @@ -24,12 +25,20 @@ Comment l'installer ? Pour installer COS2000 : - Sous dos/windows + Sous dos/windows 9x Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur. Lancez le programme SETUP.COM situé dans le dossier de COS2000. - Si celui ci ne détecte pas d'erreur, COS2000 est installé ! + + Sous windows NT/Xp + + Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur. + Lancez le programme SETUP.EXE situé dans le dossier de COS2000. +- Si celui ci ne détecte pas d'erreur, COS2000 est installé ! + + Sous Linux Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur. @@ -56,10 +65,10 @@ En plus des logiciels, l'interpr VERS Donne la version de COS2000. - EFFAC + CLEAR Efface l'écran. - REDEM + REBOOT Redémarre le PC. CMDS @@ -68,13 +77,16 @@ En plus des logiciels, l'interpr MODE [mode] Permet de changer de mode vidéo. [mode] doit être un entier compris entre 1 et 9. les modes au delà de 4 sont des modes graphiques à texte émulé. Il est déconseillé de les utiliser car il est parfois impossible de revenir aux modes texte. - LIRE + DISK Permet de lire un support disquette 1.44 Mo au format FAT12. - CH + CD Change le dossier actuel vers celui spécifié. - VOIR + DIR + Permet de lister le contenu du dossier actuel. + + MEM Permet de lister le contenu du dossier actuel. @@ -107,24 +119,25 @@ org 0100h ;Point d start: mov ah,0Dh mov si,offset msg - int 47h ;Afficher le texte pointé par DS:SI (Showstring0) + int 47h ;Afficher le texte (Showstring0) xor ax,ax int 16h ;Attendre l’appuie sur une touche db 0CBH ;retour far msg db ‘Hello World’,0 + end start Avec nasm [bits 16] ;16 bits -[org 0x0100] ;Point d’entré en 0100h -section .text ;Segment de code +[org 0x0100] ;Point d’entré en 0100h +section .text ;Segment de code start: mov ah,0x0D mov si,msg - int 0x47 ;Afficher le texte pointé par DS:SI (Showstring0) + int 0x47 ;Afficher le texte (Showstring0) xor ax,ax int 0x16 ;Attendre l’appuie sur une touche retf ;retour far @@ -147,14 +160,17 @@ Interruption 48h (Disquette uniquement) 05h compressrle 06h decompressrle 07h findfirstfile - 08h getfreespace - 09h searchfile - 0Ah getname - 0Bh getserial - 0Ch changedir - 0Dh readcluster - 0Eh writecluster - 0Fh getdir + 08h findnextfile + 09h getfreespace + 0Ah searchfile + 0Bh getname + 0Ch getserial + 0Dh changedir + 0Eh readcluster + 0Fh writecluster + 10h getdir +11h projfile +11h execfile port.sys : Gestionnaires port parallèle Interruption 0Dh (LPT1) ou 0Fh (LPT2) @@ -242,27 +258,1178 @@ Interruption 47h (VGA) 22h getinfos 23h loadbmp 24h showbmp - 25h clearscr + 25h viewbmp 26h savedac 27h restoredac 28h savestate 29h restorestate - 30h enablescroll - 31h disablescroll - 32h showdate - 33h showtime - 34h showname - 35h showattr - 36h showsize + 2Ah enablescroll + 2Bh disablescroll + 2Ch showdate + 2Dh showtime + 2Eh showname + 2Fh showattr + 30h showsize + 31h getchar + +mcb.sys : Gestionnaires de mémoire vive +Interruption 49h (MB) + +00h mbinit +01h mbfree +02h mbcreate +03h mbresident +04h mbget +05h mbfind +06h mbchown +07h mballoc +08h mbclean +09h mbfindsb -Pour l’instant je n’ai pas fait de guide détaillé de l’utilisation des fonctions de COS… A venir Les possibilités de COS2000 sont aujourd'hui très limitées car il est en cours de développement. + +Détail des APIs + +- Interruption 48h + +Readsector + + +Lit le secteur CX et le met en ES:DI. Met le flag carry à 1 si erreur. + + + +Paramètres +d’entrée AH=0 +CX +ES +DI + +Données en sortie Flag Carry + +Writesector + + +Ecrit le secteur CX avec les données pointés par DS:SI. Met le flag carry à 1 si erreur. + + +Paramètres +d’entrée AH=1 +CX +DS +SI + +Données en sortie Flag Carry + +Verifysector + + +Vérifie si le secteur CX n’est pas défectueux. Met le flag carry à 1 si erreur et flag equal à 0 si secteur défectueux. + + +Paramètres +d’entrée AH=2 +CX + +Données en sortie Flag Carry +Flag Equal + +Initdrive + + +Fonction initialisant le pilote et le matériel afin d’utiliser ultérieurement les fonctions de disque.sys. Met le flag carry à 1 si erreur. + + +Paramètres +d’entrée AH=3 + + +Données en sortie Flag Carry + +Loadfile + + +Charge le fichier dont le nom est pointé par DS:SI en mémoire dans ES:DI et renvoie le nombre d’octets lu en ECX. Met le flag carry à 1 si erreur. + + +Paramètres +d’entrée AH=4 +DS +SI +ES +DI + +Données en sortie ECX +Flag Carry + +Compressrle + + +Compresse le contenu de la mémoire pointé par DS:SI (selon une méthode RLE) et dont la taille est spécifié par CX. Le résultat sera mis en ES:DI ainsi que la nouvelle taille mémoire (octets) en BP. +Paramètres +d’entrée AH=5 +DS +SI +ES +DI +CX + +Données en sortie + +Decompressrle + + +Décompresse le contenu de la mémoire pointé par DS:SI (selon une méthode RLE) et dont la taille est spécifié par CX. Le résultat sera mis en ES:DI ainsi que la nouvelle taille mémoire (octets) en BP. +Paramètres +d’entrée AH=6 +DS +SI +ES +DI +CX + +Données en sortie + +Findfirstfile + + +Renvoie en ES:DI la première entrée du répertoire courant (format BRUT). Met le flag carry à 1 si erreur. Cette fonction prépare aussi l’usage de la fonction findnextfile. + +Format d’une entrée de répertoire : + +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 + +Paramètres +d’entrée AH=7 +ES +DI + +Données en sortie Flag Carry + +Findnextfile + + +Renvoie en ES:DI l’entrée suivante du répertoire courant (format BRUT). Met le flag carry à 1 si erreur. +Paramètres +d’entrée AH=8 +ES +DI + +Données en sortie Flag Carry + +Getfreespace + + +Renvoie en EDX l'espace disque libre du volume en octets. Met le flag carry à 1 si erreur. +Paramètres +d’entrée AH=9 + +Données en sortie EDX +Flag Carry + +Searchfile + + +Renvois dans ES:DI l’entrée de répertoire du fichier pointé par DS:SI. Met le flag equal a 0 si pas existant. Met le flag carry à un si erreur. +Paramètres +d’entrée AH=10 +DS +SI +ES +DI + + +Données en sortie Flag Equal +Flag Carry + + +Getname + + +Renvois dans ES:DI le nom du support courant. +Paramètres +d’entrée AH=11 +ES +DI + + +Données en sortie + + +Getserial + + +Renvois le numéro de série du support courant en EDX. +Paramètres +d’entrée AH=11 + +Données en sortie EDX + +Changedir + + +Change le répertoire courant a celui dont le nom est pointé par DS:SI. Met le flag carry à un si erreur. +Paramètres +d’entrée AH=13 +DS +SI + +Données en sortie Flag Carry + +Readcluster + + +Lit le cluster (groupe) CX et le met en ES:DI. Met le flag carry à 1 si erreur. +Paramètres +d’entrée AH=14 +ES +DI + +Données en sortie Flag Carry + +Writecluster + + +Ecrit le cluster (groupe) CX avec les données pointés par DS:SI. Met le flag carry à 1 si erreur. + +Paramètres +d’entrée AH=15 +ES +DI + +Données en sortie Flag Carry + +Getdir + + +Renvoie en ES:DI sous forme de chaîne a zéro terminal le nom du répertoire courant. +Paramètres +d’entrée AH=16 +ES +DI + +Données en sortie + +Projfile + + +Charge le fichier dont le nom est pointé par DS:SI dans un bloc mémoire. Renvoie en ECX le nombre d’octets lus et en ES l’adresse du bloc de mémoire. Met le flag carry à 1 si erreur. + +Paramètres +d’entrée AH=17 +DS +SI + +Données en sortie ECX +ES +Flag Carry + +Execfile + + +Exécute le fichier dont le nom est pointé par DS:SI. Met le flag carry à 1 si erreur. + +Paramètres +d’entrée AH=18 +DS +SI + +Données en sortie Flag Carry + +- Interruption 47h + +Setvideomode + + +Fixe le mode vidéo courant a dont le numéro est AL. Met le flag carry à 1 si erreur. + +MODES : +0 -> 40x25x16 couleurs en texte +1 -> 80x25x16 couleurs en texte +2 -> 80x50x16 couleurs en texte +3 -> 100x50x16 couleurs en texte +4 -> 100x60x16 couleurs en texte +5 -> 320x200x256 couleurs en graphique +6 -> 320x400x256 couleurs en graphique +7 -> 320x480x256 couleurs en graphique +8 -> 360x480x256 couleurs en graphique +9 -> 400x600x256 couleurs en graphique + +Les modes sont généralement utilisable avec une carte VGA 256ko, mais la plupart surexploitent le contrôleur vidéo donc ne fonctionne pas toujours. L’utilisation des fonctions caractères est disponible en mode graphique par l’usage de polices émulés mais beaucoup de bugs sont encore présent. + + +Paramètres +d’entrée AH=0 +AL + +Données en sortie Flag Carry + +Getvideomode + + +Retourne le mode vidéo courant a dans AL. + +Paramètres +d’entrée AH=1 + + +Données en sortie AL + +Getvideomode + + +Efface l’écran en mode graphique ou texte. + +Paramètres +d’entrée AH=2 + + +Données en sortie + +Setfont + + +Active la police de numéro CL parmi les 8 disponibles. + +Paramètres +d’entrée AH=3 +CL + +Données en sortie + +Getfont (PAS ENCORE IMPLEMENTE) + + +Récupère en CL le N° de police actif. + +Paramètres +d’entrée AH +CL + +Données en sortie + + +Loadfont + + +Charge une police pointée par DS:SI dans la carte vidéo sous le n° de police BL. La taille en hauteur de la police (en pixel) doit être renseigné dans CL Met le flag carry à 1 si erreur. + +Paramètres +d’entrée AH=4 +DS +SI +CL + +Données en sortie Flag Carry + +Showspace + + +Affiche un espace à l’écran après le curseur. + +Paramètres +d’entrée AH=5 + + +Données en sortie + +Showline + + +Affiche un retour a la ligne à l’écran après le curseur. + +Paramètres +d’entrée AH=6 + + +Données en sortie + +Showchar + + +Affiche un caractère dont le code ASCII est contenu dans DL à l’écran après le curseur. + +Paramètres +d’entrée AH=7 +DL + +Données en sortie + + +Showint + + +Affiche le nombre entier contenu dans EDX à l’écran après le curseur. + +Paramètres +d’entrée AH=8 +EDX + +Données en sortie + +Showsigned + + +Affiche le nombre entier signé contenu dans EDX à l’écran après le curseur. + +Paramètres +d’entrée AH=9 +EDX + +Données en sortie + +Showhex + + +Affiche le nombre hexadécimal contenu dans EDX et de taille CX bits à l’écran après le curseur. + +Paramètres +d’entrée AH=10 +EDX +CX + +Données en sortie + +ShowBin + + +Affiche le nombre binaire contenu dans EDX et de taille CX bits à l’écran après le curseur. + +Paramètres +d’entrée AH=11 +EDX +CX + +Données en sortie + +ShowString + + +Affiche la chaîne de caractère (type fixe) pointée par DS:SI à l’écran après le curseur. + +Chaîne de type fixe : + +Chaine db 24,‘c un chaine de type fixe’ + +Paramètres +d’entrée AH=12 +DS +SI + +Données en sortie + +ShowString0 + + +Affiche la chaîne de caractère (type zéro terminal) pointée par DS:SI à l’écran après le curseur. + +Chaîne de type zéro terminal: + +Chaine db ‘c un chaine de type zéro terminal’,0 + +Paramètres +d’entrée AH=13 +DS +SI + +Données en sortie + +Showchartat + + +Réalise la même fonction que la fonction showchar en spécifiant les coordonnées BL (y), BH (x) ou tout devra être affiché. + +Paramètres +d’entrée AH=14 +DL +BL BH + +Données en sortie + +Showintat + + +Réalise la même fonction que la fonction showint en spécifiant les coordonnées BL (y), BH (x) ou tout devra être affiché. + +Paramètres +d’entrée AH=15 +EDX +BL BH + +Données en sortie + +Showsignedat + + +Réalise la même fonction que la fonction showsigned en spécifiant les coordonnées BL (y), BH (x) ou tout devra être affiché. + +Paramètres +d’entrée AH=16 +EDX +BL BH + +Données en sortie + +Showhexat + + +Réalise la même fonction que la fonction showhex en spécifiant les coordonnées BL (y), BH (x) ou tout devra être affiché. + +Paramètres +d’entrée AH=17 +EDX +CX +BL BH + +Données en sortie + +Showbinat + + +Réalise la même fonction que la fonction showbin en spécifiant les coordonnées BL (y), BH (x) ou tout devra être affiché. + +Paramètres +d’entrée AH=18 +EDX +CX +BL BH + +Données en sortie + +Showstringat + + +Réalise la même fonction que la fonction showstring en spécifiant les coordonnées BL (y), BH (x) ou tout devra être affiché. + +Paramètres +d’entrée AH=19 +DS +SI +BL BH + +Données en sortie + +Showstring0at + + +Réalise la même fonction que la fonction showstring0 en spécifiant les coordonnées BL (y), BH (x) ou tout devra être affiché. + +Paramètres +d’entrée AH=20 +DS +SI +BL BH + +Données en sortie + +Setcolor + + +Change la couleur courante (attributs) pour les opérations textes a celle spécifié dans CL + +Paramètres +d’entrée AH=21 +CL + +Données en sortie + +Setcolor + + +Récupère dans CL la couleur courante (attributs) pour les opérations textes. + +Paramètres +d’entrée AH=22 + + +Données en sortie CL + +Setstyle (PAS ENCORE IMPLEMENTE) + + +Change le style (transparent ou non) courant pour les opérations graphique a celui spécifié dans CL + +Paramètres +d’entrée AH +CL + +Données en sortie + +Getstyle (PAS ENCORE IMPLEMENTE) + + +Récupère dans CL le style courant (transparent ou non) pour les opérations graphique. + +Paramètres +d’entrée AH + + +Données en sortie CL + +Scrolldown + + +Défile l’écran texte ou graphique de CX caractères vers le haut. + +Paramètres +d’entrée AH=23 +CX + +Données en sortie + +Getxy + + +Renvoie en BH les coordonnées x du curseur texte et en BL les coordonnées y du curseur texte. + +Paramètres +d’entrée AH=24 + + +Données en sortie BH BL + +Setxy + + +Fixe les coordonnées x du curseur texte a BH et les coordonnées y du curseur texte a L. + +Paramètres +d’entrée AH=25 +BH BL + +Données en sortie + +SaveScreen + + +Sauvegarde le contenu de l’écran dans un bloc mémoire appelé /vgascreen lié a l’application appelante. +Paramètres +d’entrée AH=26 + + +Données en sortie + +RestoreScreen + + +Restaure le contenu de l’écran précédemment sauvegardé dans un bloc mémoire. +Paramètres +d’entrée AH=27 + + +Données en sortie + +Page1to2 + + +Copie le contenu de la page vidéo n°1 dans la page vidéo n°2. Ne fonctionne qu’en mode texte. +Paramètres +d’entrée AH=28 + +Données en sortie + +Page2to1 + + +Copie le contenu de la page vidéo n°2 dans la page vidéo n°1. Ne fonctionne qu’en mode texte. +Paramètres +d’entrée AH=29 + +Données en sortie + +Xchgpage + + +Echange le contenu de la page vidéo n°2 dans la page vidéo n°1. Ne fonctionne qu’en mode texte. +Paramètres +d’entrée AH=30 + +Données en sortie + +Savepage1 + + +Sauvegarde le contenu de l’écran dans un bloc mémoire appelé /vgapage1 lié a l’application appelante. +Paramètres +d’entrée AH=31 + +Données en sortie + +Changelineattr (VA ETRE SUPPRIMER) + + +Modifie la couleur de la ligne N°DI a l’écran a celle contenue dans AL. +Paramètres +d’entrée AH=32 +AL +DI + +Données en sortie + +Waitretrace + + +Synchronisation avec la retrace verticale. +Paramètres +d’entrée AH=33 + + +Données en sortie + +Getvgainfos + + +Renvoie un bloc de donnée en ES:DI contenant l'état de la carte graphique. + +lines db 0 +columns db 0 +x db 0 +y db 0 +xy dw 0 +colors db 7 +mode db 0FFh +pagesize dw 0 +pages db 0 +font db 0 +graphic db 0 +xg dw 0 +yg dw 0 +style dw 0 +nbpage db 0 +pagesshowed db 0 +plane db 0 +xyg dw 0 +linesize dw 0 +adress dw 0 +base dw 0 +scrolling db 1 +Paramètres +d’entrée AH=34 +ES +SI + +Données en sortie + +Loadbmppalet + + +Charge la palette (DAC) du BMP pointée par DS:SI. +Paramètres +d’entrée AH=35 +DS +SI + +Données en sortie + +Showbmp + + +Affiche le BMP pointée par DS:SI en X:BX, Y:CX. +Paramètres +d’entrée AH=36 +DS +SI +BX +CX + +Données en sortie + +Viewbmp + + +Affiche le BMP pointée par DS:SI en X:BX, Y:CX avec la préparation de la palette. +Paramètres +d’entrée AH=3 +DS +SI +BX +CX + +Données en sortie + +Savedac + + +Sauvegarde le contenu de la palette (DAC) dans un bloc mémoire appelé /vgadac lié a l’application appelante. +Paramètres +d’entrée AH=38 + + +Données en sortie + +Savedac + + +Restaure le contenu de la palette (DAC) précédemment sauvegardé dans un bloc mémoire. +Paramètres +d’entrée AH=39 + + +Données en sortie + +Savestate + + +Sauvegarde l’etat complet de la carte graphique dans un bloc mémoire appelé /vga lié a l’application appelante. FONCTIONNE PEUT ETRE EN MODE GRAPHIQUE. +Paramètres +d’entrée AH=40 + + +Données en sortie + +Restorestate + + +Restaure l’etat complet de la carte graphique précédemment sauvegardé dans un bloc mémoire. FONCTIONNE PEUT ETRE EN MODE GRAPHIQUE. +Paramètres +d’entrée AH=41 + + +Données en sortie + +EnableScroll + + +Active le défilement automatique de l’écran lors de dépassements. +Paramètres +d’entrée AH=42 + + +Données en sortie + +DisableScroll + + + +Desactive le défilement automatique de l’écran lors de dépassements. +Paramètres +d’entrée AH=43 + + +Données en sortie + +Showdate + + +Affiche la date contenue dans DX à l’écran après le curseur. + +Paramètres +d’entrée AH=44 +DX + +Données en sortie + +Showtime + + +Affiche l’heure contenue dans à l’écran après le curseur. + +Paramètres +d’entrée AH=45 +DX + + +Données en sortie + +Showname + + +Affiche le nom de fichier pointé par DS:SI à l’écran après le curseur. + +Paramètres +d’entrée AH=46 +DS +SI + +Données en sortie + +Showattr + + +Affiche les attributs fichiers contenus dans DL à l’écran après le curseur. + +Paramètres +d’entrée AH=47 +DL + +Données en sortie + +Showsize + + +Affiche le la taille en octets (et multiples) contenue dans EDX à l’écran après le curseur. + +Paramètres +d’entrée AH=48 +EDX + +Données en sortie + +Getchar + + +Renvoie le caractère situé sous le curseur dans DL. + +Paramètres +d’entrée AH=49 + + +Données en sortie DL + +Setxyg (PAS ENCORE IMPLEMENTE) + + +Change les coordonnées du curseur graphique a X:BX,Y:CX. +Paramètres +d’entrée AH +BX CX + +Données en sortie + +Getxyg (PAS ENCORE IMPLEMENTE NI ECRIT) + + +Récupère les coordonnées du curseur graphique a X:BX,Y:CX. +Paramètres +d’entrée AH + + +Données en sortie BX CX + +Showpixel (PAS ENCORE IMPLEMENTE) + + +Affiche un pixel de couleur AL en X:BX,Y:CX. +Paramètres +d’entrée AH +BX CX +AL + +Données en sortie + +Getpixel (PAS ENCORE IMPLEMENTE) + + +Récupère la couleur du pixel en X:BX,Y:CX dans AL. +Paramètres +d’entrée AH +BX CX + + +Données en sortie AL + +- Interruption 49h + +Mbinit + + +Initialise les blocs de mémoire pour une utilisation futur des fonction MBs (inutile car le système le réalise au boot). Met le flag carry à 1 si erreur. + +Paramètres +d’entrée AH=0 + + +Données en sortie Flag Carry + +Mbfree + + +Libère le bloc de mémoire GS ainsi que tout les sous blocs de mémoire lié (fils). Un bloc de mémoire considéré résident ou un sous bloc résident ne sera pas libéré. Met le flag carry à 1 si erreur. + +Paramètres +d’entrée AH=1 +GS + +Données en sortie Flag Carry + +Mbcreate + + +Crée un bloc de CX caractères (octets) et de nom DS :SI. Retourne en GS le bloc de mémoire alloué et met le flag carry à 1 en cas d’erreur. +Paramètres +d’entrée AH=2 +DS +SI + +Données en sortie GS +Flag Carry + +Mbresident + + +Met le bloc GS en situation de bloc mémoire résident (non libérable). + +Paramètres +d’entrée AH=3 +GS + +Données en sortie + +Mbget + + +Renvoie en GS l’adresse du bloc mémoire situé en CX ème position. Met le flag carry à 1 si introuvable. + +Paramètres +d’entrée AH=4 + + +Données en sortie GS +Flag Carry + +Mbfind + + +Renvoie en GS le bloc de mémoire dont le nom correspond a la chaîne de caractère situé en DS:SI. Met le flag carry à 1 si introuvable. + +Paramètres +d’entrée AH=5 +DS +SI + +Données en sortie GS +Flag Carry + +Mbchown + + +Change le proprietaire (père) du bloc de mémoire GS a celui precisé par DX. + +Paramètres +d’entrée AH=6 +GS +DX + +Données en sortie Flag Carry + +Mballoc + + +Alloue un bloc de CX caractères (octets) pour le processus (programme) qui le demande. Retourne en GS le bloc de mémoire alloué et met le flag carry à 1 en cas d’erreur. +Paramètres +d’entrée AH=7 +CX + +Données en sortie GS +Flag Carry + +Mbclean + + +Nettoie un peu la mémoire pour fonctionner des blocs de mémoire libre contiguë. Généralement inutile car géré par le systeme. +Paramètres +d’entrée AH=8 + + +Données en sortie Flag Carry + +Mbfindsb + + +Renvoie en GS le sous bloc de mémoire dont le nom correspond a la chaîne de caractère situé en DS:SI et dont le propriétaire est DX. Met le flag carry à 1 si introuvable. + +Paramètres +d’entrée AH=9 +DS +SI +DX + +Données en sortie Flag Carry + +- Interruption 74h + +Cmdmouse + + +Envoie une commande AL à la souris via contrôleur clavier +Paramètres +d’entrée AH=0 +AL + +Données en sortie + +Cmdmouse2 + + +Envoie une commande type 2 AL à la souris via contrôleur clavier +Paramètres +d’entrée AH=1 +AL + +Données en sortie + +Detectmouse + + +Détecte et initialise une souris de type PS/2. Met le flag carry à 1 si introuvable. + +Paramètres +d’entrée AH=2 +AL + +Données en sortie Flag Carry + +Getmouse + + +Envoie en BX,CX les coordonnées virtuelles de la souris (respectivement X et Y) ainsi qu’en DL l’état des boutons. + +Paramètres +d’entrée AH=3 + + +Données en sortie BX +CX +DL + +Getmousescreen + + +Envoie en BX,CX les coordonnées écran de la souris (respectivement X et Y) ainsi qu’en DL l’état des boutons. + +Paramètres +d’entrée AH=4 + + +Données en sortie BX +CX +DL + +Configmouse + + +Configure la vélocité de la souris dans CL et dans AH, AL les sphères X et Y. +Paramètres +d’entrée AH=5 +AH AL +CL + +Données en sortie + + + +A suivre pour les autres ressources…. (et avec exemples !) + En cas de problèmes Si des bugs surviennent ou si COS2000 ne veut pas s'installer, veuillez s'il vous plaît m'envoyer un E Mail à : mailto:nicolas@palon.fr -COS2000 n'exploite pas les disques durs, il est donc impossible qu'il altère de quelque manière que ce soit vos données !!!!!!!!!!!!! +COS2000 n'exploite pas les disques durs, il est donc improbable qu'il altère vos données ! diff --git a/commande/commande.asm b/commande/commande.asm index fc49c52..f0dfdc3 100644 --- a/commande/commande.asm +++ b/commande/commande.asm @@ -6,6 +6,8 @@ smart org 0100h include ..\include\fat.h +include ..\include\mem.h +include ..\include\divers.h start: push cs @@ -16,9 +18,10 @@ start: pop es pop fs pop gs - mov ah,21 + mov ah,21 mov cl,7 int 47h + mov ah,3 int 48h mov ax,0002 @@ -55,6 +58,7 @@ noret: waitchar: mov ax,0 int 16h + call convertfr cmp ah,59 jne norr cmp bp,0 @@ -69,8 +73,14 @@ waitchar: add di,cx jmp waitchar norr: - cmp al,0Dh + cmp al,0Dh ;entrée je entere + cmp al,08h ;backspace + je backspace + cmp al,27 ;echap + je escape + cmp al,' ' + jb waitchar cmp di,offset buffer+256 je waitchar mov [di],al @@ -79,6 +89,36 @@ norr: mov ah,7 int 47h jmp waitchar +escape: + cmp di,offset buffer + je waitchar + mov ah,18h + int 47h + mov dx,offset buffer + mov cx,di + sub cx,dx + js waitchar + je waitchar + sub bh,cl + mov ah,19h + int 47h + mov di,offset buffer + mov byte ptr [di],0 +backspace: + cmp di,offset buffer + je waitchar + mov ah,18h + int 47h + dec bh + mov dl,' ' + mov ah,0Eh + int 47h + mov ah,19h + int 47h + dec di + mov byte ptr [di],0 + jmp waitchar + entere: mov byte ptr [di],0 mov si,offset buffer @@ -141,48 +181,12 @@ error: call concat0 noaddext: mov si,offset buffer - push cs - mov ax,offset arrive - push ax - mov di,offset vga - mov ah,40 - int 47h - mov ax,9000h - mov es,ax - push ax - mov di,0100h - push di - mov ah,4 + mov ah,18 int 48h jc reallyerror - push es - push es - push es - pop ds - pop fs - pop gs - push 7202h - popf - db 0CBh - arrive: - push cs - push cs - push cs - push cs - pop ds - pop es - pop fs - pop gs - mov si,offset vga - mov ah,41 - int 47h xor bp,bp jmp replay reallyerror: - pop ax - pop ax - pop ax - pop ax mov ah,13 mov si,offset Error_Syntax int 47h @@ -206,7 +210,7 @@ Code_Version: int 47h ret -Version_Text db 'Cos 2000 version 3.0.2Fr par Nico',0 +Version_Text db 'Cos 2000 version 1.2Fr par Nico',0 Code_Cls: mov ah,2 @@ -393,7 +397,185 @@ int 47h ret errorrefreshing db 'Impossible de lire le support',0 -extcom db '.EXE',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 +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 +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 +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 + + +;converti le jeux scancode/ascii en fr ax->ax +convertfr: + push dx si + mov si,offset fr +searchtouch: + mov dx,cs:[si] + cmp dx,0 + je endofconv + add si,4 + cmp dx,ax + jne searchtouch + mov ax,cs:[si-2] +endofconv: + pop dx si + ret + +fr: db '1', 02, '&', 02 + db '!', 02, '1', 02 + db '2', 03, '‚', 03 + db '@', 03, '2', 03 + db '3', 04, '"', 04 + db '#', 04, '3', 04 + db '4', 05, 39, 05 + db '$', 05, '4', 05 + db '5', 06, '(', 06 + db '%', 06, '5', 06 + db '6', 07, '-', 07 + db '^', 07, '6', 07 + db '7', 08, 'Š', 08 + db '&', 08, '7', 08 + db '8', 09, '_', 09 + db '*', 09, '8', 09 + db '9', 10, '‡', 10 + db '(', 10, '9', 10 + db '0', 11, '…', 11 + db ')', 11, '0', 11 + db '-', 12, ')', 12 + db '_', 12, 'ø', 12 + db 'Q', 16, 'A', 16 + db 'q', 16, 'a', 16 + db 'W', 17, 'Z', 17 + db 'w', 17, 'z', 17 + db '{', 26, '‰', 26 + db '[', 26, 'ˆ', 26 + db ']', 27, '$', 27 + db '}', 27, 'œ', 27 + db 'A', 30, 'Q', 30 + db 'a', 30, 'q', 30 + db ':', 39, 'M', 39 + db ';', 39, 'm', 39 + db 39, 40, '—', 40 + db '"', 40, '%', 40 + db 00, 40, '%', 40 + db '\', 43, '*', 43 + db '|', 43, 'æ', 43 + db 'Z', 44, 'W', 44 + db 'z', 44, 'w', 44 + db 'm', 50, ',', 50 + db 'M', 50, '?', 50 + db ',', 51, ';', 51 + db '<', 51, '.', 51 + db '.', 52, ':', 52 + db '>', 52, '/', 52 + db '?', 53, 'õ', 53 + db '/', 53, '!', 53 + db '\', 86, '<', 86 + db '|', 86, '>', 86 + db 00, 79h, '~', 03 + db 00, 7Ah, '#', 04 + db 00, 7Bh, '{', 05 + db 00, 7Ch, '[', 06 + db 00, 7Dh, '|', 07 + db 00, 7Eh, '`', 08 + db 00, 7Fh, '\', 09 + db 00, 80h, '^', 10 + db 00, 81h, '@', 11 + db 00, 82h, ']', 12 + db 00, 83h, '}', 13 + db 00, 00, 00, 00 + + + + + + + + + + + + + + + commands dw Str_Exit ,Code_Exit ,Syn_Exit ,Help_Exit dw Str_Version,Code_Version,Syn_Version,Help_Version @@ -404,17 +586,19 @@ commands dw Str_Exit ,Code_Exit ,Syn_Exit ,Help_Exit 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 'EFFAC',0 -Str_Reboot db 'REDEM',0 +Str_Cls db 'CLEAR',0 +Str_Reboot db 'REBOOT',0 Str_Command db 'CMDS',0 Str_Mode db 'MODE',0 -Str_Dir db 'VOIR',0 -Str_refresh db 'LIRE',0 -Str_cd db 'CH',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 @@ -424,6 +608,7 @@ 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 @@ -432,18 +617,18 @@ Help_Command db 0 Help_Mode db 0 Help_Dir db 0 Help_refresh db 0 -Help_cd 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.1',0 +msg db 'Interpreteur de commande COS V1.8',0 include str0.asm -dir equ $ -buffer equ $+128 -buffer2 equ $+128+512 -vga equ $+128+512+512 +dir db 32 dup (0) +buffer db 256 dup (0) +buffer2 db 256 dup (0) end start diff --git a/contribs/MAKEFILE b/contribs/MAKEFILE index a870e27..f9193dc 100644 --- a/contribs/MAKEFILE +++ b/contribs/MAKEFILE @@ -2,15 +2,15 @@ lnk_boot = tlink /x asm= tasm /t/m5/zi lnk= tlink /x/t -all: ex-tasm.exe ex-nasm.exe +all: ex-tasm.com ex-nasm.com -ex-tasm.exe: ex-tasm.asm +ex-tasm.com: ex-tasm.asm $(asm) ex-tasm $(lnk) ex-tasm - ren ex-tasm.com ex-tasm.exe + ren ex-tasm.com ex-tasm.com -ex-nasm.exe: ex-nasm.asm - nasm ex-nasm.asm -o ex-nasm.exe +ex-nasm.com: ex-nasm.asm + nasm ex-nasm.asm -o ex-nasm.com clean: del *.obj diff --git a/doc_origine.pdf b/doc_origine.pdf new file mode 100644 index 0000000..945c756 Binary files /dev/null and b/doc_origine.pdf differ diff --git a/include/divers.h b/include/divers.h new file mode 100644 index 0000000..33c09b6 --- /dev/null +++ b/include/divers.h @@ -0,0 +1,2 @@ +True equ 1 +False equ 0 diff --git a/include/mem.h b/include/mem.h new file mode 100644 index 0000000..9053805 --- /dev/null +++ b/include/mem.h @@ -0,0 +1,11 @@ +MB struc +Check dw 'NH' +IsNotLast db 0 +IsResident db 0 +Reference dw 0 +Sizes dw 0 +Names db 24 dup (0) +MB ends + +Free equ 0 +memorystart equ 1000h diff --git a/install/setup.asm b/install/setup.asm index e8dce29..e55dd8d 100644 --- a/install/setup.asm +++ b/install/setup.asm @@ -10,7 +10,7 @@ ent equ 32h start: jmp CopyCOS -Message db 0Dh,0Ah,'COS 2000 V3.02Fr 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,'$' +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,'$' diff --git a/install/setup.sh b/install/setup.sh new file mode 100755 index 0000000..916c579 Binary files /dev/null and b/install/setup.sh differ diff --git a/install/winNT/setup.bpf b/install/winNT/setup.bpf new file mode 100644 index 0000000..6967230 --- /dev/null +++ b/install/winNT/setup.bpf @@ -0,0 +1,4 @@ +This file is used by the project manager only and should be treated like the project file + + +main \ No newline at end of file diff --git a/install/winNT/setup.bpr b/install/winNT/setup.bpr new file mode 100644 index 0000000..b67fc36 --- /dev/null +++ b/install/winNT/setup.bpr @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[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/setup.res b/install/winNT/setup.res new file mode 100644 index 0000000..53d1acc Binary files /dev/null and b/install/winNT/setup.res differ diff --git a/install/winNT/setup.tds b/install/winNT/setup.tds new file mode 100644 index 0000000..5ae5c8e Binary files /dev/null and b/install/winNT/setup.tds differ diff --git a/install/winNT/unit1.cpp b/install/winNT/unit1.cpp new file mode 100644 index 0000000..8448703 --- /dev/null +++ b/install/winNT/unit1.cpp @@ -0,0 +1,135 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#pragma hdrstop + +//--------------------------------------------------------------------------- +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; +} + + +#pragma argsused +int main(int argc, char* argv[]) +{ +DWORD dwNotUsed; +DWORD error=0; +HANDLE hDrive; +DISK_GEOMETRY dg_flop_geom; +char lecteur[4]="a:\0"; +char device[7]="\\\\.\\a:\0"; +int fdboot; +DWORD dwBsWritten; +char * buffer; +char bootfile[14]="data/boot.bin\0"; +struct ffblk files; +int done; +int number=0; +char src[80]; +char dest[80]; + printf("Installation de COS2000\nInserez une disquette et appuyer sur une touche...\n"); + getchar(); + hDrive = CreateFile(device, GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); + printf("Ouverture du peripherique %s\n",lecteur); + if (hDrive == INVALID_HANDLE_VALUE) { + printf("Erreur : %s\n",GetLastErrorString()); + error=1; + } + if(error!=1&&printf("Determination de la geometrie \n")&&DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &dg_flop_geom, sizeof(dg_flop_geom),&dwNotUsed, NULL) == FALSE) { + printf("Erreur : %s\n",GetLastErrorString()); + error=1; + } + if(error!=1&&(dg_flop_geom.MediaType==FixedMedia||dg_flop_geom.MediaType==RemovableMedia||dg_flop_geom.MediaType==Unknown)) + { + printf("Erreur : Ceci n'est pas une disquette !\n"); + error=1; + } + if (error!=1&&printf("Positionnement sur le secteur 0\n")&&SetFilePointer(hDrive, 0, NULL, FILE_BEGIN) == -1) { + printf("Erreur : %s\n",GetLastErrorString()); + error=1; + } + if (error!=1) + { + printf("Pistes :%u Secteurs:%u Tetes:%u Taille:%u\n",dg_flop_geom.Cylinders.LowPart,dg_flop_geom.SectorsPerTrack,dg_flop_geom.TracksPerCylinder,dg_flop_geom.BytesPerSector); + } + else + { + CloseHandle(hDrive); + } + if (hDrive == NULL||dg_flop_geom.TracksPerCylinder>2||dg_flop_geom.TracksPerCylinder==0) + { + printf("Aucun support valide detecte !"); + error=1; + } + if (error!=1) + { + printf("Allocation de memoire\n"); + buffer = (char *)malloc(dg_flop_geom.BytesPerSector); + printf("Ouverture et installation du fichier de boot %s\n",bootfile); + } + if (error!=1&&(fdboot = _rtl_open(bootfile,O_RDONLY | O_BINARY)) == -1 ) + { + printf("Erreur : Fichier de boot introuvable\n"); + error=1; + } + if (error!=1&&_read(fdboot, buffer, dg_flop_geom.BytesPerSector)!= dg_flop_geom.BytesPerSector) + { + printf("Erreur : Fichier de boot de taille incorrecte !\n"); + error=1; + } + if (error!=1&&WriteFile(hDrive, buffer, dg_flop_geom.BytesPerSector, &dwBsWritten, NULL) == 0) + { + printf("Ecriture impossible sur le secteur de boot !\n"); + error=1; + } + if (error!=1) + { + _rtl_close(fdboot); + printf("Determination des fichiers a copier\n\n"); + done = findfirst("data\\*.*",&files,0); + while (!done) + { + number++; + done = findnext(&files); + } + printf("Copie des fichiers de cos2000\n"); + done = findfirst("data\\*.*",&files,0); + while (!done) + { + printf("%s\n",files.ff_name); + sprintf(src, "data\\%s",files.ff_name); + sprintf(dest, "%s\\%s",lecteur,files.ff_name); + if (!CopyFile(src,dest,false)) + { + printf("Erreur : fichier impossible a copier %s\n",GetLastErrorString()); + error=1; + break; + } + done = findnext(&files); + } + if (!error) + { + printf("Installation terminee !\nVeuillez redemarrer votre PC afin de charger le systeme"); + } + else + { + printf("Installation echoué !"); + } + free(buffer); + } + getchar(); + return 0; +} +//--------------------------------------------------------------------------- diff --git a/noyau/MAKEFILE b/noyau/MAKEFILE index 884139f..9cb29a7 100644 --- a/noyau/MAKEFILE +++ b/noyau/MAKEFILE @@ -2,7 +2,7 @@ lnk_boot = tlink /x asm= tasm /t/m5/zi lnk= tlink /x/t -all: boot.bin clavier.sys 8259a.sys disque.sys heure.sys horloge.sys manette.sys port.sys souris.sys systeme.sys video.sys +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 boot.bin: boot.asm $(asm) boot @@ -59,6 +59,11 @@ video.sys: video.asm $(lnk) video ren video.com video.sys +mcb.sys: mcb.asm + $(asm) mcb + $(lnk) mcb + ren mcb.com mcb.sys + clean: del *.obj del *.exe diff --git a/noyau/clavier.asm b/noyau/clavier.asm index cbc6cbc..83c32a6 100644 --- a/noyau/clavier.asm +++ b/noyau/clavier.asm @@ -15,35 +15,40 @@ tsr: db 2eh,0ffh,1eh dw offsets cli - mov cs:feax,eax - in al,60h + add dword ptr cs:popes,1 cmp cs:isstate,1 - jne nostate - cmp al,57 - jne endof - mov cs:isstate,0 - jmp endof - nostate: + je endofforce + mov cs:isstate,1 + mov cs:eaxr,eax + in al,60h cmp al,68 je F10 cmp al,87 je F11 cmp al,88 je F12 - endof: - mov eax,cs:feax +endof: + mov cs:isstate,0 + mov eax,cs:eaxr +endofforce: sti iret isstate db 0 infos db 40 dup (0) + feax dd 0 F10: - mov ax,6000h - push ax - mov di,0100h - push di -sti - db 0CBh + push cs + pop ds + mov si,offset com + mov ah,5 + int 49h + mov cs:isstate,0 + push gs + push 0100h + db 0CBh + +com db 'COMMANDE.EXE',0 F11: push ax di es @@ -65,154 +70,230 @@ notabove: f12: - mov cs:isstate,1 - pop word ptr cs:fip - pop word ptr cs:fcs - pop dword ptr cs:ffl - mov cs:fesp,esp - push ds es - pusha - push word ptr cs:fip - push gs - push fs - push ss - push es - push ds - push word ptr cs:fcs - push dword ptr cs:fesp - push ebp - push edi - push esi - push edx - push ecx - push ebx - push eax - push dword ptr cs:ffl - push cs - push cs - pop es - pop ds - mov ah,26 - int 47h - mov ah,2 - int 47h - mov ah,21 - mov cl,4 - int 47h - mov ah,13 - mov si,offset reg - int 47h - mov ah,6 - int 47h - mov ah,21 - mov cl,7 - int 47h - mov ah,13 - mov si,offset fla - int 47h - pop edx - mov cx,32 - mov ah,11 - int 47h - mov ah,5 - int 47h - mov ah,10 - int 47h - mov si,offset regs - mov bx,8+7 - mov ah,21 - mov cl,6 - int 47h -showallREG: - mov ah,6 - int 47h - cmp bx,8 - jb nodr - pop edx - mov cx,32 - jmp popo - nodr: - mov ah,21 - mov cl,1 - int 47h - xor edx,edx - pop dx - mov cx,16 - popo: - mov ah,13 - int 47h - mov ah,10 - int 47h - mov ah,5 - int 47h - push si - mov si,offset gr - mov ah,13 - int 47h - mov ah,8 - int 47h - mov si,offset dr - mov ah,13 - int 47h - pop si - add si,5 - dec bx - jnz showallreg - mov ah,34 - mov di,offset infos - int 47h - mov ah,25 - mov bl,cs:infos - xor bh,bh - dec bl - int 47h - mov si,offset app - mov ah,13 - int 47h - mov ah,32 - mov bl,cs:infos - xor bh,bh - mov di,ax - dec di - mov cl,116 - int 47h - pop es ds - sti - waitt: - cmp cs:isstate,0 - jne waitt - mov ah,27 - int 47h - popa - pop es ds - push dword ptr cs:ffl - push word ptr cs:fcs - push word ptr cs:fip - jmp endof -reg db ' Etats des registres',0 -fla db 'Eflags:',0 -regs db 'EAX:',0 - db 'EBX:',0 - db 'ECX:',0 - db 'EDX:',0 - db 'ESI:',0 - db 'EDI:',0 - db 'EBP:',0 - db 'ESP:',0 - db ' CS:',0 - db ' DS:',0 - db ' ES:',0 - db ' FS:',0 - db ' GS:',0 - db ' SS:',0 - db ' IP:',0 -gr db '(',0 -dr db ')',0 -app db 'Appuyez sur espace pour quitter...',0 -ffl dd 0 -fcs dw 0 -fip dw 0 -fesp dd 0 -feax dd 0 +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 +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:[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 reg +mov di,offset regdata +mov bx,7 +showregs: +cmp byte ptr cs:[si+4],":" +jne endshowregs +mov ah,13 +int 47h +cmp byte ptr cs:[si+3],"g" +je segsss +cmp byte ptr cs:[si+2]," " +je segsss +mov edx,cs:[di] +mov cx,32 +mov ah,0Ah +int 47h +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 +add di,2 +showmax: +add si,7 +mov ebp,edx +push si +mov si,offset beginds +mov ah,13 +int 47h +pop si +mov cx,8 +mov al,0 +mov bx,bp +letshow: +mov dl,fs:[bx] +inc bx +mov ah,0Ah +int 47h +inc al +cmp al,10 +jb letshow +push si +mov si,offset ende +mov ah,13 +int 47h +mov si,offset begines +mov ah,13 +int 47h +pop si +mov bx,bp +mov cx,8 +mov al,0 +letshow2: +mov dl,es:[bx] +inc bx +mov ah,0Ah +int 47h +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 +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 + + + + + + +xor ax,ax +int 16h +mov ah,29h +int 47h +popad +popf +jmp endof + +popes dd 0 + +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 +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 "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 + +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 e842a0b..9778250 100644 --- a/noyau/disque.asm +++ b/noyau/disque.asm @@ -68,6 +68,8 @@ tables dw readsector dw readcluster dw writecluster dw getdir + dw projfile + dw execfile maxfunc equ 24 @@ -95,24 +97,30 @@ AdressDirectory dw 0 ;En cluster firstsearch dw 1 ;Premiere requete ? getfat: - push ax bx dx si + push ax bx dx si ds gs + mov dx,cs + push cs + pop ds + mov si,offset datafat + mov ah,9 + int 49h mov ax,cx mov bx,ax and bx,0000000000000001b shr ax,1 mov cx,3 mul cx - mov si,offset bufferfat + xor si,si add si,ax cmp bx,0h jnz evenfat oddfat: - mov dx,cs:[si] + mov dx,gs:[si] and dx,0FFFh mov cx,dx jmp endfat evenfat: - mov dx,cs:[si+1] + mov dx,gs:[si+1] and dx,0FFF0h shr dx,4 mov cx,dx @@ -120,11 +128,11 @@ endfat: cmp dx,0FF0h jbe nocarry stc - pop si dx bx ax + pop gs ds si dx bx ax ret nocarry: clc - pop si dx bx ax + pop gs ds si dx bx ax ret ;============loadfile (Fonction 4)=============== @@ -155,6 +163,100 @@ errorload: mov ecx,0 pop di bx eax ret + +;============execfile (Fonction 18)=============== +;Execute le fichier ds:si +;-> AH=18 +;<- Flag Carry si erreur +;===================================================== +execfile: + pushf + push bp dx + mov bp,sp + mov dx,ss:[bp+10] + pushad + push ds es fs gs + call projfile + jc reallyerror + push es + pop gs + mov ah,6 + int 49h + push es + push cs + mov ax,offset arrive + push ax + push es + push 0100h + push es + push es + push es + pop ds + pop fs + pop gs + push 7202h + popf + sti + db 0CBh + arrive: + cli + pop gs + mov ah,01 + int 49h + pop gs fs es ds + popad + pop dx bp + popf + ret +reallyerror: + pop gs fs es ds + popad + pop dx bp + popf + stc + ret + +;============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 ds gs + push cs + pop es + call uppercase + mov ah,5 + int 49h + jnc errorload2 + mov di,offset tempfit + call searchfile + jne errorload2 + jc errorload2 + mov eax,cs:tempfit.FileSize + mov ecx,eax + add ecx,100h + push eax + mov ah,2 + int 49h + pop eax + jc errorload2 + push gs + pop es + mov cx,cs:tempfit.FileGroup + mov di,100h + call loadway + jc errorload2 + clc + mov ecx,eax + pop gs ds di bx eax + ret +errorload2: + stc + mov ecx,0 + pop gs ds di bx eax + ret + tempfit db 32 dup (0) @@ -211,7 +313,6 @@ errorsearch: ;Transforme la chaine ds:si en maj uppercase: push si ax - mov di,si uppercaser: mov al,ds:[si] cmp al,0 @@ -292,6 +393,7 @@ AdjustLast: mov cx,dx push cs pop ds + cld rep movsb zeroload: clc @@ -308,7 +410,7 @@ noway: ;<- Flag Carry si erreur ;===================================================== InitDrive: - push eax bx cx edx di ds es + push eax bx cx edx di ds es gs push cs pop ds push cs @@ -327,9 +429,9 @@ againtry: dec di jnz againtry oknoagaintry: - mov cs:lastseg,0 - mov cs:lastoff,0 - mov cs:LastRead,0 + mov lastseg,0 + mov lastoff,0 + mov LastRead,0 mov ax,myboot.sectorsize mov bl,myboot.SectorsPerCluster xor bh,bh @@ -370,9 +472,28 @@ oknoagaintry: mov adressdirectory,0 mov firstsearch,1 mov currentdirstr,0 - mov di,offset bufferfat + xor eax,eax + mov ax,myboot.SectorsPerFat + mul myboot.SectorSize + shl edx,16 + add edx,eax + mov ecx,edx + mov dx,cs + mov si,offset datafat + mov ah,9 + int 49h + jnc hadafatbloc + mov si,offset datafat + mov ah,2 + int 49h + mov ah,3 + int 49h +hadafatbloc: + xor di,di mov dx,myboot.SectorsPerFat mov cx,AdressFat + push gs + pop es SeeFat: call readsector jc ErrorInit @@ -381,12 +502,14 @@ SeeFat: dec dx jnz seefat clc - pop es ds di edx cx bx eax + pop gs es ds di edx cx bx eax ret ErrorInit: stc - pop es ds di edx cx bx eax + pop gs es ds di edx cx bx eax ret + +datafat db '/fat',0 ;=============FindFirstFile (Fonction 7)============== ;Renvois dans ES:DI un bloc d'info @@ -648,10 +771,9 @@ lastoff dw 0 ;===================================================== WriteSector: push ax bx cx dx si es - cmp cs:Lastread,cx - jne nodestruct - mov cs:Lastread,0ffffh -nodestruct: + mov cs:lastseg,0 + mov cs:lastoff,0 + mov cs:LastRead,0FFFFh push ds pop es mov ax,cx @@ -667,7 +789,7 @@ nodestruct: xchg cl,ch shl cl,6 or cl, bl - mov bx,si + mov bx,si mov SI, 4 mov AL,1 TryAgains: @@ -716,25 +838,30 @@ getserial: ;<- Flag Carry si erreur, Flag Equal si secteurs égaux ;===================================================== VerifySector: - push bx cx si di ds es + push ecx si di ds es push cs pop es push cs pop ds - mov bx,offset bufferread - call ReadSector - jc errorverify + mov di,offset bufferread + call ReadSector + mov si,offset bufferread call inverse call WriteSector jc errorverify - mov bx,offset bufferwrite - call ReadSector + + mov di,offset bufferwrite + call ReadSector + mov si,offset bufferwrite call inverse jc errorverify - mov bx,offset bufferread + + mov si,offset bufferread call inverse call WriteSector jc errorverify + + xor ecx,ecx mov cx,cs:myboot.SectorSize shr cx,2 mov si,offset bufferread @@ -742,18 +869,19 @@ VerifySector: cld rep cmpsd errorverify: - pop es ds di si cx bx + pop es ds di si ecx ret Inverse: - mov si,cs:myboot.sectorsize - shr si,2 + push si cx + xor cx,cx invert: - shl si,2 - not dword ptr [bx+si-4] - shr si,2 - dec si - jnz invert + not dword ptr [si] + add si,4 + add cx,4 + cmp cx,cs:myboot.sectorsize + jb invert + pop cx si ret VerifySector2: @@ -788,6 +916,7 @@ decompression: mov cl,ah xor ah,ah xor ch,ch + cld rep stosb add si,5 sub dx,5 @@ -954,11 +1083,9 @@ getdir: pop es ds di si cx ax clc ret - - -bufferread equ $ -bufferwrite equ $+2048 -bufferentry equ $+2048+2048 -bufferFat equ $+2048+2048+2048 + +bufferread db 512 dup (0) +bufferwrite db 512 dup (0) +bufferentry db 512 dup (0) end start diff --git a/noyau/mcb.asm b/noyau/mcb.asm index 22dac0d..aa586e1 100644 --- a/noyau/mcb.asm +++ b/noyau/mcb.asm @@ -1,18 +1,147 @@ +.model tiny +.486 +smart +.code + +org 0100h + +include ..\include\mem.h +include ..\include\divers.h + +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 -;Initialise les blocs de mémoire +;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 + ret + + +;Initialise les blocs de mémoire en prenant memorystart pour segment de base MBinit: push ax cx es - mov ax,gs - mov cs:Firstmb,ax + 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 - mov cx,0A000h - sub cx,ax - dec cx - mov es:[MB.Reference],Free - mov es:[MB.Sizes],cx - mov es:[MB.Check],'NH' + 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 clc pop es cx ax @@ -24,51 +153,235 @@ notforfree: ;Libère le bloc de mémoire GS MBFree: - push bx es + push ax bx es mov bx,gs - dec bx + mov ax,bx + dec bx + dec bx mov es,bx - cmp es:[MB.Check],'NH' - je notforfree - mov es:[MB.IsResident],0 + 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 + dec bx + dec bx +searchtofree: + mov gs,bx + cmp gs:[MB.Check],'NH' + jne wasfree + 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 + ret +wasfree: + stc + pop es bx ax + ret + +;Change le proprietaire de GS a dx +MBChown: + push bx es + mov bx,gs + dec bx + dec bx + mov es,bx + cmp es:[MB.Reference],Free + je wasfree2 + mov es:[MB.Reference],dx pop es bx - ret + ret +wasfree2: + stc + pop es bx + ret + +;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] + push cs + pop ds + mov si,offset data + call MBCreate + call MBChown + pop ds bp si dx + ret + +data db '/Data',0 -;Creér un bloc de nom ds:si de taille cx (octets) -> n°segement dans GS +;Renvoie en GS le MB n° cx carry quand terminé +MBGet: + push bx dx + mov bx,cs:firstmb + dec bx + dec bx + xor dx,dx +searchfree2: + mov gs,bx + cmp gs:[MB.Check],'NH' + jne itsend + 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 + inc dx + cmp gs:[MB.IsNotLast],true + je searchfree2 +itsend: + stc + pop dx bx + ret +foundmcb: + clc + pop dx bx + ret + +;Renvoie en GS le MCB qui correspond a ds:si +MBFind: + push ax bx si di + mov bx,cs:firstmb + dec bx + dec bx + mov di,MB.Names +search: + mov gs,bx + cmp gs:[MB.Check],'NH' + jne itsend2 + inc bx + inc bx + add bx,gs:[MB.Sizes] + cmp word ptr gs:[MB.Sizes],0 + je itsend2 + push si di +cmpnames: + mov al,gs:[di] + cmp al,ds:[si] + jne ok + cmp al,0 + je ok + inc si + inc di + jmp cmpnames +ok: + pop di si + je foundmcb2 + cmp gs:[MB.IsNotLast],true + je search +itsend2: + stc + pop di si bx ax + ret +foundmcb2: + mov bx,gs + inc bx + inc bx + mov gs,bx + 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 - je weregood - cmp dl,False - je wasntgood -notsogood: - inc bx - add bx,es:[MB.Sizes] - jmp searchfree -weregood: + jne notsogood mov ax,es:[MB.Sizes] cmp cx,ax ja notsogood - mov es:[MB.IsNotLast],True - mov es:[MB.Reference],cs + mov word ptr es:[MB.Check],'NH' + mov es:[MB.IsNotLast],True + mov es:[MB.Reference],gs mov es:[MB.IsResident],False - mov es:[MB.Sizes],cx - mov di,MB.Names + mov di,MB.Names push ax cx - mov cx,8 + mov cx,32 loops: mov dh,[si] inc si @@ -84,14 +397,16 @@ endofloops: mov al,0 rep stosb pop cx ax - mov word ptr es:[MB.Check],'NH' - sub ax,cx + inc bx + inc bx + sub ax,cx dec ax - js nofree - inc bx - mov gs,bx - add bx,cx - mov es,bx + 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 @@ -100,20 +415,31 @@ endofloops: 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 ;Rend le segment GS résident MBresident: push bx es mov bx,gs dec bx + dec bx mov es,bx mov es:[MB.IsResident],True pop es bx ret + +end start diff --git a/noyau/systeme.asm b/noyau/systeme.asm index b9624ea..876a786 100644 --- a/noyau/systeme.asm +++ b/noyau/systeme.asm @@ -6,6 +6,7 @@ smart org 0100h include ..\include\fat.h +include ..\include\mem.h start: push cs @@ -16,39 +17,17 @@ pop ds pop es pop fs pop gs - ;xor ax,ax - ;mov ds,ax - ;mov si,7C00h -mov si,offset eepop + 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 - -eepop db 0,0,0 -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 - - xor ax,ax mov es,ax mov di,1Eh*4 @@ -70,11 +49,17 @@ noone: 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 bx,7 + mov bl,7 call showstr mov si,offset next call showstr @@ -87,30 +72,19 @@ noone: mov di,offset loadinglist call loadfile jc noconfread - mov si,offset debut - mov bx,7 + mov bl,7 call showstr - mov bx,500h xor cx,cx mov si,offset loadinglist suiteloading: call readline jc noconfload - push bx si mov bl,7 + push si mov si,offset next call showstr - pop si bx - call showstr - mov dx,bx - push bx si - mov bx,7 - mov si,offset address - call showstr - mov cx,16 - call showhex - mov si,offset addressend + pop si call showstr xor bp,bp mov dx,ax @@ -129,14 +103,15 @@ noadder: 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: - pop si bx cmp bp,1 jne install call replacehandler @@ -145,11 +120,24 @@ install: call installhandler suites: jc nohandlerload - add bx,0F00h + 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 @@ -157,13 +145,10 @@ suites: call showstr mov si,offset prompt call showstr - mov ax,6000h - mov es,ax - push ax - mov di,0100h - push di - call loadfile + call projfile jc nopromptload + push es + push 0100h push 7202h popf push es @@ -191,6 +176,19 @@ noconfread: 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 @@ -235,28 +233,35 @@ 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) BX(adresse) AX(interruption) +;==Lit la loading list et initialise SI(Fichier) AX(interruption) readline: push cx dx di es -push ds +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 @@ -334,14 +339,23 @@ ShowHex: neg cx shl edx,cl shr di,2 - mov ah,0Eh + mov ah,09h and bx,1111b Hexaize: rol edx,4 mov si,dx and si,1111b mov al,[si+offset tab] - int 10h + 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 @@ -350,29 +364,298 @@ Tab db '0123456789ABCDEF' ;==============================Affiche une chaine DS:SI de couleur BL============== showstr: - push ax bx si + 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 - and bx,1111b int 10h jmp again fin: - pop si bx ax + 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: + inc bx + inc bx + add bx,es:[MB.Sizes] + jmp searchfree ;================================================ ;Routine de gestion de handler ;================================================ -;remplace le handler pointer par ds:si en bx:100h interruption ax +;remplace le handler pointer par ds:si en bloc:100h interruption ax replacehandler: -push ax bx cx si di ds es -mov es,bx -mov di,0100h -call loadfile +push ax bx cx si di ds +call projfile jc reph mov bx,ax call getint @@ -380,36 +663,34 @@ mov es:[102h],si mov es:[104h],ds call setint reph: -pop es ds di si cx bx ax +pop ds di si cx bx ax ret -;install le handler pointer par ds:si en bx:100h interruption ax +;install le handler pointer par ds:si en bloc:100h interruption ax -> es installhandler: -push bx cx di es -mov es,bx -mov di,100h -call loadfile +push bx cx +call projfile jc insh mov bx,ax call setint insh: -pop es di cx bx +pop cx bx ret -;met es:di le handle de l'int bx +;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 ds:[bx],di +mov word ptr ds:[bx],0100h mov ds:[bx+2],es pop ds bx ax sti ret -;met ds:si le handle de l'int bx +;met dans ds:si le handle de l'int bx getint: push ax bx es shl bx,2 @@ -480,6 +761,41 @@ nocarry: pop si dx bx ax ret +;============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 @@ -498,12 +814,12 @@ loadfile: mov cx,cs:tempfit.FileGroup mov eax,cs:tempfit.FileSize call loadway - jc errorload + jc errorload2 clc ;mov ecx,eax pop di bx eax ret -errorload: +errorload2: stc mov ecx,0 pop di bx eax @@ -652,7 +968,7 @@ zeroload: ret noway: stc - pop es ds ebp di si dx bx eax + pop es ds ecx di si dx bx eax ret ;=============INITDRIVE (Fonction 04H)=============== diff --git a/noyau/systeme.ini b/noyau/systeme.ini index 0b7f37e..fe574b7 100644 --- a/noyau/systeme.ini +++ b/noyau/systeme.ini @@ -1,7 +1,9 @@ +mcb.sys(49) video.sys(47) horloge.sys(8) 8259a.sys(50) disque.sys(48) souris.sys(74) +heure.sys(8) clavier.sys(9) -heure.sys(8) \ No newline at end of file +port.sys(D) \ No newline at end of file diff --git a/noyau/video.asm b/noyau/video.asm index a1f3b37..0c8b133 100644 --- a/noyau/video.asm +++ b/noyau/video.asm @@ -100,6 +100,7 @@ tables dw setvideomode ;Table qui contient les adresses de toutes les fonctions dw showname dw showattr dw showsize + dw getchar ;================================Table des modes videos (64 BYTES) ============================================ ;40*25 16 couleurs @@ -226,7 +227,7 @@ Attribs equ 03C0h graphics equ 03CEh statut equ 03DAh -maxfunc equ 48 +maxfunc equ 39h maxmode equ 9 planesize equ 64000 ;============================================Fonctions de l'int VIDEO=========================================== @@ -1274,6 +1275,20 @@ getxy: ;===================================== 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 @@ -1298,6 +1313,7 @@ setxy: oktext: mov ax,0B800h mov es,ax + call setcursor endofsetxy: pop dx cx bx ax ret @@ -1507,12 +1523,59 @@ waitr: pop dx ax ret +;Renvoie le caractère sur le curseur en dl +getchar: + push ax di es + mov ax,0B800h + mov es,ax + mov di,cs:xy + mov dl,es:[di] + pop es di ax + ret + ;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 - mov dx,cx + call emulatechar + 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: + call setcursor + pop es di dx cx bx ax + ret + +setcursor: + push ax cx dx + mov dx,CCRT + mov al,0Eh + 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 + 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 and di,11111111b shl di,3 @@ -1548,198 +1611,315 @@ transparent: mov cx,cs:linesize shl cx,2 cmp cs:xg,cx - jb adjusttext + jb ended mov cs:xg,0 add cs:yg,8 - 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 dx,3D4h - ;mov al,0Eh - ;mov di,offset xy - ;mov ah,cs:[di] - ;out dx,ax - ;mov ah,cs:[di+1] - ;dec al - ;out dx,ax - pop es di dx cx bx ax - ret - - - - - - -;===================================sauve l'ecran rapidement================ -SaveScreen: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,cs:pagesize - shr cx,2 - xor si,si - mov di,offset Copy2 - cld - rep movsd - pop es ds di si cx +ended: + pop di dx cx bx ax ret + + +;sauve l'ecran dans un bloc de mémoire +savescreen: +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 data3 +int 49h +mov ah,6 +int 49h +push gs +pop es +xor di,di +call savescreento +pop gs es ds bp di si dx cx ax +ret + +data3 db '/vgascreen',0 + + ;===================================sauve l'ecran rapidement en es:di================ SaveScreento: push cx si di ds - mov cx,0B800H + mov cx,0B800h mov ds,cx + xor ecx,ecx mov cx,cs:pagesize shr cx,2 xor si,si cld rep movsd pop ds di si cx - ret - -;===================================sauve l'ecran rapidement================ -Savepage1: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,cs:pagesize - shr cx,2 - xor si,si - mov di,offset Copy - cld - rep movsd - pop es ds di si cx ret -;===================================sauve l'ecran rapidement================ -RestoreScreen: - push cx si di ds es - mov cx,0B800H - mov es,cx +;===================================sauve les parametres en es:di================ +Saveparamto: + push ecx si di ds push cs pop ds + xor ecx,ecx + mov cx,datablocksize + mov si,offset datablock + cld + rep movsb + pop ds di si ecx + ret + +;===================================restore les parametres depuis en ds:si================ +Restoreparamfrom: + push ecx si di es + push cs + pop es + xor ecx,ecx + mov cx,datablocksize + mov di,offset datablock + cld + 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,offset Copy2 - xor di,di + mov si,cs:pagesize cld rep movsd - pop es ds di si cx + pop ds di si ecx ret + +;R‚cupŠre l'ecran de la carte depuis son bloc mémoire +RestoreScreen: +push ax dx si bp ds gs +mov bp,sp +mov dx,ss:[bp+16] +push cs +pop ds +mov si,offset data3 +mov ah,9 +int 49h +push gs +pop ds +xor si,si +call restorescreenfrom +pop gs ds bp si dx ax +ret ;===================================restore l'ecran rapidement de ds:si================ RestoreScreenfrom: - push cx si di ds es + push ecx si di ds es mov cx,0B800H mov es,cx + xor ecx,ecx mov cx,cs:pagesize shr cx,2 xor di,di cld rep movsd - pop es ds di si cx - ret + pop es ds di si ecx + ret + + ;===============================Page2to1============================ Page2to1: - push cx si di ds es + push ecx si di ds es mov cx,0B800H mov es,cx mov ds,cx + xor ecx,ecx mov cx,cs:pagesize shr cx,2 - mov si,4000 + mov si,cs:pagesize xor di,di cld rep movsd - pop es ds di si cx + pop es ds di si ecx ret ;===============================Page1to2============================ Page1to2: - push cx si di ds es + push ecx si di ds es mov cx,0B800H mov es,cx mov ds,cx + xor ecx,ecx mov cx,cs:pagesize shr cx,2 - mov di,4000 + mov di,cs:pagesize xor si,si cld rep movsd - pop ds es di si cx + pop ds es di si ecx ret - + ;===============================xchgPages============================ xchgPages: - push cx si di ds es - call savepage1 - call page2to1 - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,cs:pagesize - shr cx,2 - mov si,offset Copy - mov di,4000 - rep movsd - pop es ds di si cx - ret - -;Sauve l'‚tat de la carte en es:di -savestate: -push cx si di ds -push cs -pop ds -mov cx,datablocksize -mov si,offset lines +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 movsb -call savescreento -pop ds di si cx +rep movsd +mov ah,01h +int 49h +pop gs es ds bp di si dx cx ax ret -;R‚cupŠre l'‚tat de la carte en ds:si -restorestate: -push ax cx si di es -mov al,[si+7] -cmp cs:mode,al -je nochangemode -mov ah,0 -call setvideomode -nochangemode: -push cs -pop es -mov cx,datablocksize -mov di,offset lines -cld -rep movsb -call restorescreenfrom -pop es di si cx ax -ret -;sauve le DAC +;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 + +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 + +;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 + +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 + +;sauve le DAC en es:di +savedacto: push ax cx dx di mov dx,3C7h mov cx,256 -mov di,offset dac save: mov al,cl dec al @@ -1747,13 +1927,13 @@ out dx,al inc dx inc dx in al,dx -mov cs:[di],al +mov es:[di],al inc di in al,dx -mov cs:[di],al +mov es:[di],al inc di in al,dx -mov cs:[di],al +mov es:[di],al inc di dec dx dec dx @@ -1762,25 +1942,24 @@ jne save pop di dx cx ax ret -;restore le DAC -restoredac: +;restore le DAC depuis ds:si +restoredacfrom: push ax cx dx si xor ax,ax mov dx,3C8h mov cx,256 -mov si,offset dac save2: mov al,cl dec al out dx,al inc dx -mov al,cs:[si] +mov al,ds:[si] inc si out dx,al -mov al,cs:[si] +mov al,ds:[si] inc si out dx,al -mov al,cs:[si] +mov al,ds:[si] inc si out dx,al dec dx @@ -1814,8 +1993,5 @@ include ..\include\pol8x8.inc font8x16: include ..\include\pol8x16.inc -copy equ $ -copy2 equ $+8192 -dac equ $+8192+8192 end start diff --git a/programs/MAKEFILE b/programs/MAKEFILE index dde9824..62eb6e0 100644 --- a/programs/MAKEFILE +++ b/programs/MAKEFILE @@ -2,56 +2,61 @@ lnk_boot = tlink /x asm= tasm /t/m5/zi lnk= tlink /x/t -all: detect.exe editeur.exe gestion.exe logo.exe pmode.exe souris.exe test.exe verifier.exe volume.exe +all: detect.com editeur.com gestion.com logo.com pmode.com souris.com test.com verifier.com volume.com memoire.com -detect.exe: detect.asm +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.exe + ren detect.com detect.com -editeur.exe: editeur.asm +editeur.com: editeur.asm $(asm) editeur $(lnk) editeur - ren editeur.com editeur.exe + ren editeur.com editeur.com -gestion.exe: gestion.asm +gestion.com: gestion.asm $(asm) gestion $(lnk) gestion - ren gestion.com gestion.exe + ren gestion.com gestion.com -logo.exe: logo.asm +logo.com: logo.asm $(asm) logo $(lnk) logo - ren logo.com logo.exe + ren logo.com logo.com -pmode.exe: pmode.asm +pmode.com: pmode.asm $(asm) pmode $(lnk) pmode - ren pmode.com pmode.exe + ren pmode.com pmode.com -souris.exe: souris.asm +souris.com: souris.asm $(asm) souris $(lnk) souris - ren souris.com souris.exe + ren souris.com souris.com -test.exe: test.asm +test.com: test.asm $(asm) test $(lnk) test - ren test.com test.exe + ren test.com test.com -verifier.exe: verifier.asm +verifier.com: verifier.asm $(asm) verifier $(lnk) verifier - ren verifier.com verifier.exe + ren verifier.com verifier.com -volume.exe: volume.asm +volume.com: volume.asm $(asm) volume $(lnk) volume - ren volume.com volume.exe + ren volume.com volume.com clean: del *.obj - del *.exe + del *.com del *.com del *.sys del *.err diff --git a/programs/detect.asm b/programs/detect.asm index 0e66e85..9c4ea33 100644 --- a/programs/detect.asm +++ b/programs/detect.asm @@ -157,15 +157,13 @@ xor cl,cl inc al cmp al,16 jbe search -xor ax,ax -int 16h db 0CBh msg3 db ' Classe :',0 msg1 db 'Peripherique :',0 msg2 db ' Constructeur :',0 msg4 db ' iD :',0 -msg db 'COS2000 hardware detecteur V1.1',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 diff --git a/programs/editeur.asm b/programs/editeur.asm index 1afa5f6..23c988c 100644 --- a/programs/editeur.asm +++ b/programs/editeur.asm @@ -8,6 +8,8 @@ start: mov ax,0305h mov bx,0008h int 16h + mov ah,28h + int 47h mov ax,0002 int 47H mov ah,2 @@ -285,7 +287,7 @@ cursor: suit7: cmp ax,4200h jne adres - mov ah,27 + mov ah,29h int 47h db 0CBH ; +++++++ ret diff --git a/programs/gestion.asm b/programs/gestion.asm index d729164..dc79590 100644 --- a/programs/gestion.asm +++ b/programs/gestion.asm @@ -161,6 +161,9 @@ tre3: tre4: cmp ah,67 jne endof + mov ah,15h + mov cl,7 + int 47h db 0CBh ;selectionne la ligne xx @@ -184,11 +187,11 @@ ret xx dw 1 xxold dw 0 menu db '[F1] Lire disque [F9] Quitter ',0 -msg1 db ' Gestionnaire de fichier Version 1.0 ',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 -bufferentry equ $ +bufferentry db 512 dup (0) end start diff --git a/programs/logo.asm b/programs/logo.asm index 0b40be1..d5a3b1a 100644 --- a/programs/logo.asm +++ b/programs/logo.asm @@ -5,18 +5,27 @@ org 0100h start: +mov ah,7 +mov cx,65535 +int 49h +jc problem3 +push gs +pop es +mov ah,7 +mov cx,65535 +int 49h +jc problem3 mov si,offset logo mov ah,4 xor di,di -mov bx,8000h -mov es,bx int 48h jc problem + push es pop ds -mov bx,7000h -mov es,bx +push gs +pop es xor si,si xor di,di mov ah,6 @@ -27,9 +36,9 @@ push es pop ds xor si,si -mov ax,0008h +mov ah,28h int 47h -mov ah,38 +mov ax,0008h int 47h mov ah,2 int 47h @@ -47,10 +56,8 @@ mov si,offset poper int 47h mov ax,0 int 16h -mov ah,39 -int 47h -mov ax,0004 -int 47h +mov ah,29h +int 47h db 0CBH problem: @@ -73,10 +80,21 @@ mov ax,0 int 16h db 0CBh +problem3: +push cs +pop ds +mov ah,13 +mov si,offset error3 +int 47h +mov ax,0 +int 16h +db 0CBh + poper db 'COS2000 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 end start diff --git a/programs/memoire.asm b/programs/memoire.asm new file mode 100644 index 0000000..d3ed25b --- /dev/null +++ b/programs/memoire.asm @@ -0,0 +1,89 @@ +.model tiny +.486 +smart +.code + +org 0100h + +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 +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 +mov dx,gs +inc dx +inc dx +push cx +mov cx,16 +mov ah,11h +int 47h +pop cx +mov ah,6h +int 47h +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 + +end start diff --git a/programs/souris.asm b/programs/souris.asm index 2890412..30c92fc 100644 --- a/programs/souris.asm +++ b/programs/souris.asm @@ -6,8 +6,12 @@ smart org 0100h start: +mov si,offset message +mov ah,13 +int 47h mov ah,2 int 74h db 0CBh +message db 'Activation de la souris',0 end start diff --git a/programs/test.asm b/programs/test.asm index 49bbc1d..0b72193 100644 --- a/programs/test.asm +++ b/programs/test.asm @@ -6,7 +6,7 @@ org 0100h start: -mov ah,26 +mov ah,28h int 47h mov ax,0001 int 47h @@ -19,7 +19,6 @@ int 47h mov ah,6 int 47h int 47h - mov ah,21 mov cl,3 int 47h @@ -38,7 +37,6 @@ mov ah,8 int 47h mov ah,6 int 47h - mov ah,21 mov cl,4 int 47h @@ -59,7 +57,6 @@ mov ah,9 int 47h mov ah,6 int 47h - mov ah,21 mov cl,5 int 47h @@ -80,7 +77,6 @@ mov cx,32 int 47h mov ah,6 int 47h - mov ah,21 mov cl,6 int 47h @@ -101,7 +97,6 @@ mov cx,16 int 47h mov ah,6 int 47h - mov ah,21 mov cl,7 int 47h @@ -120,7 +115,6 @@ mov ah,7 int 47h mov ah,6 int 47h - mov ah,21 mov cl,8 int 47h @@ -139,7 +133,6 @@ mov ah,13 int 47h mov ah,6 int 47h - mov ah,21 mov cl,9 int 47h @@ -158,7 +151,6 @@ mov ah,44 int 47h mov ah,6 int 47h - mov ah,13 mov si,offset text72 int 47h @@ -174,19 +166,17 @@ mov ah,45 int 47h mov ah,6 int 47h - - - 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 @@ -294,14 +284,14 @@ mov ah,33 int 47h dec bp jnz go4 -mov ah,27 -int 47h +mov ah,14h xor bx,bx mov si,offset texte3 -mov ah,20 int 47h mov ax,0 int 16h +mov ah,29h +int 47h db 0CBh put: diff --git a/programs/verifier.asm b/programs/verifier.asm index 8443dd3..8b9af11 100644 --- a/programs/verifier.asm +++ b/programs/verifier.asm @@ -5,10 +5,10 @@ org 0100h start: + mov ah,28h + int 47H mov ax,0002 int 47H - mov ah,26 - int 47H replay: mov ah,2 int 47h @@ -25,12 +25,16 @@ int 47h mov bx,0231h mov si,offset msgapp int 47h + mov bp,1000h VerifAll: mov ah,1 int 16h - cmp al,32 + jz nokey + cmp al,' ' je enend +nokey: mov ax,cx + inc ax mov si,100 mul si mov si,2880 @@ -43,8 +47,9 @@ VerifAll: mov ah,13 mov si,offset po int 47h - mov ah,15 + mov ah,15 mov dx,cx + inc dx mov bx,0A10h int 47h mov ah,13 @@ -83,8 +88,8 @@ int 47h someof: mov ah,0 int 16h - mov ah,27 - int 47h + mov ah,29h + int 47H db 0CBH errors: mov ah,21 @@ -96,7 +101,9 @@ mov si,offset errore int 47h mov ah,0 int 16h -jmp replay + mov ah,29h + int 47H +db 0CBH @@ -106,7 +113,7 @@ 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 tested. ',0 +msg2 db ' cluster testes. ',0 msg3 db ' cluster defectueux. ',0 ;->Increment CX gauge: diff --git a/programs/volume.asm b/programs/volume.asm index 518deeb..49a0947 100644 --- a/programs/volume.asm +++ b/programs/volume.asm @@ -8,6 +8,8 @@ start: mov ax,0305h mov bx,0008h int 16h + mov ah,28h + int 47H mov ax,0002 int 47H mov ah,2 @@ -15,6 +17,10 @@ start: mov ah,43 int 47h xor bp,bp + push cs + push cs + pop es + pop ds Adres: mov di,offset infos mov ah,34 @@ -24,7 +30,7 @@ Adres: pop es mov cx,sect mov di,offset buffer - mov ax,0001h + mov ah,0h int 48h jnc noerror errtr: @@ -203,9 +209,9 @@ waitst: jne tre mov dword ptr [pope],'WEIV' push cs - pop es + pop ds mov cx,sect - mov bx,offset buffer + mov si,offset buffer mov ah,1 int 48h jnc adres @@ -282,6 +288,8 @@ cursor: suit7: cmp ax,4200h jne adres2 + mov ah,29h + int 47H db 0CBH ret @@ -292,7 +300,7 @@ calc1: shl ax,2 shl dx,1 add ax,dx - add ax,25 + add ax,27 mov bx,YY mov dx,yy shl bx,5 @@ -315,6 +323,7 @@ calc2: shl si,5 shl dx,7 add si,dx + add si,2 mov dx,xx shl dx,1 add si,dx @@ -374,7 +383,7 @@ spaces db ' showbuffer db 35 dup (0FFh) oldmode db 0 infos db 40 dup (0) -buffer equ $ +buffer db 2048 dup (0) end start