diff --git a/tpfs/Makefile b/tpfs/Makefile
index 7cab51796f1b6e52391a98a69226a8c52e8ac434..9d177ab5ff5f1e208fde1754ce38ce07d9b515c0 100644
--- a/tpfs/Makefile
+++ b/tpfs/Makefile
@@ -13,7 +13,7 @@ LIBS = -L$(LIBDIR) -lhardware
###------------------------------
### Main targets
###------------------------------------------------------------
-BINARIES= mkhd display_sector format_sector
+BINARIES= mkhd display_sector format_sector write_sector
all: $(BINARIES) $(OBJECTS)
@@ -30,6 +30,7 @@ all: $(BINARIES) $(OBJECTS)
mkhd: mkhd.o
display_sector: display_sector.o drive.o
format_sector: format_sector.o drive.o
+write_sector: write_sector.o drive.o
###------------------------------
### Misc.
diff --git a/tpfs/display_sector.c b/tpfs/display_sector.c
index 526476cd9f2fae25fda8a19a3f4633414ea8f4b6..6483fbb79271f8995a8ce73a11cd5ef59437d038 100644
--- a/tpfs/display_sector.c
+++ b/tpfs/display_sector.c
@@ -4,9 +4,6 @@
#include "hardware.h"
#include "drive.h"
-/* Paramètres de la simulation */
-#define HDA_FILENAME "vdiskA.bin" /* nom du fichier de stockage du disque simulé */
-
static void
empty_it()
{
diff --git a/tpfs/write_sector.c b/tpfs/write_sector.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca0c3c82f8f9571dee0cc9507dfe36034b070ca7
--- /dev/null
+++ b/tpfs/write_sector.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "hardware.h"
+#include "drive.h"
+
+static void
+empty_it()
+{
+ return;
+}
+
+void write_sector(int cylinder, int sector, unsigned char *buf)
+{
+ int i;
+ seek(cylinder, sector);
+ for (i = 0; i < HDA_SECTORSIZE; i++)
+ MASTERBUFFER[i] = buf[i];
+
+ _out(HDA_DATAREGS, 0);
+ _out(HDA_DATAREGS + 1, 1);
+ _out(HDA_CMDREG, CMD_WRITE);
+ _sleep(HDA_IRQ);
+}
+
+int main(int argc, char const *argv[])
+{
+ unsigned int i;
+
+ if (argc != 4)
+ {
+ fprintf(stderr, "Usage: %s <cylinder> <sector> <data>\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ /* init hardware */
+ if (init_hardware("hwconfig.ini") == 0)
+ {
+ fprintf(stderr, "Error in hardware initialization\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* Interreupt handlers */
+ for (i = 0; i < 16; i++)
+ IRQVECTOR[i] = empty_it;
+
+ /* Allows all IT */
+ _mask(1);
+
+ write_sector(atoi(argv[1]), atoi(argv[2]), (unsigned char *)argv[3]);
+
+ /* and exit! */
+ exit(EXIT_SUCCESS);
+}