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