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); +}