From 20fecebb90de55262bc9349a8b4d38af3cb07420 Mon Sep 17 00:00:00 2001 From: Speedy_Lex <78314533+speedy-lex@users.noreply.github.com> Date: Wed, 2 Jul 2025 01:15:36 +0200 Subject: [PATCH] emulator drive --- data/drive.img | Bin 0 -> 65536 bytes src/components/drive.c | 15 +++++++- src/emulator.c | 83 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 data/drive.img diff --git a/data/drive.img b/data/drive.img new file mode 100644 index 0000000000000000000000000000000000000000..c97c12f9b0a24bfc19c74a2b265a97c924137775 GIT binary patch literal 65536 zcmeIufdBvi0Dz$VsTV1P3IhfV7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ u0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFi-;k4*&rG literal 0 HcmV?d00001 diff --git a/src/components/drive.c b/src/components/drive.c index 3af2046..a089182 100644 --- a/src/components/drive.c +++ b/src/components/drive.c @@ -60,10 +60,20 @@ void nn_drive_writeSector(nn_drive *drive, void *_, nn_component *component, nn_ int sector = nn_toInt(sectorValue); size_t sector_size = drive->getSectorSize(component, drive->userdata); nn_value bufValue = nn_getArgument(computer, 1); - const char *buf = nn_toString(bufValue, §or_size); - drive->writeSector(component, drive->userdata, sector, buf); + + size_t buf_size = 0; + const char *buf = nn_toString(bufValue, &buf_size); + if (buf_size < sector_size) { + char padded[sector_size]; + memset(padded, 0, sector_size); + memcpy(padded, buf, buf_size); + drive->writeSector(component, drive->userdata, sector, padded); + } else { + drive->writeSector(component, drive->userdata, sector, buf); + } } void nn_drive_readByte(nn_drive *drive, void *_, nn_component *component, nn_computer *computer) { + // TODO: calculate the right index aaaaargh nn_value offsetValue = nn_getArgument(computer, 0); size_t disk_offset = nn_toInt(offsetValue); size_t sector_size = drive->getSectorSize(component, drive->userdata); @@ -76,6 +86,7 @@ void nn_drive_readByte(nn_drive *drive, void *_, nn_component *component, nn_com nn_return(computer, nn_values_integer(buf[sector_offset])); } void nn_drive_writeByte(nn_drive *drive, void *_, nn_component *component, nn_computer *computer) { + // TODO: calculate the right index aaaaargh nn_value offsetValue = nn_getArgument(computer, 0); nn_value writeValue = nn_getArgument(computer, 1); size_t disk_offset = nn_toInt(offsetValue); diff --git a/src/emulator.c b/src/emulator.c index 141ac9b..4817318 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -238,6 +238,47 @@ bool ne_fs_exists(nn_component *component, ne_fs *fs, const char *path) { return FileExists(p) || DirectoryExists(p); } +typedef struct ne_drive { + FILE *file; +} ne_drive; + +void ne_drive_close(nn_component *component, ne_drive *drive) { + fclose(drive->file); +} +nn_driveControl ne_drive_getControl(nn_component *component, ne_drive *_) { + return (nn_driveControl){}; +} +size_t ne_drive_getPlatterCount(nn_component *component, ne_drive *_) { + return 1; +} +size_t ne_drive_getSectorSize(nn_component *component, ne_drive *_) { + return 512; +} +size_t ne_drive_getCapacity(nn_component *component, ne_drive *drive) { + fseek(drive->file, 0, SEEK_END); + return ftell(drive->file); +} +void ne_drive_readSector(nn_component *component, ne_drive *drive, int shifted_sector, char *buf) { + int sector = shifted_sector - 1; + size_t sectorSize = ne_drive_getSectorSize(component, drive); + + size_t offset = sector * sectorSize; + fseek(drive->file, offset, SEEK_SET); + fread(buf, sizeof(char), sectorSize, drive->file); +} +void ne_drive_writeSector(nn_component *component, ne_drive *drive, int shifted_sector, const char *buf) { + int sector = shifted_sector - 1; + size_t sectorSize = ne_drive_getSectorSize(component, drive); + + size_t offset = sector * sectorSize; + fseek(drive->file, offset, SEEK_SET); + fwrite(buf, sizeof(char), sectorSize, drive->file); + + // this is probably not needed but i believe someone isn't running the deinit + fflush(drive->file); +} + + int keycode_to_oc(int keycode) { switch (keycode) { case KEY_NULL: @@ -533,6 +574,48 @@ int main() { }; nn_addFileSystem(computer, "OpenOS", 1, &genericFS); + ne_drive drive = { + .file = fopen("data/drive.img", "r+") + }; + assert(drive.file != NULL); + + nn_drive genericDrive = { + .refc = 0, + .userdata = &drive, + .deinit = (void *)ne_drive_close, + .control = (void *)ne_drive_getControl, + .getLabel = ne_eeprom_getLabel, + .setLabel = ne_eeprom_setLabel, + .getPlatterCount = (void *)ne_drive_getPlatterCount, + .getSectorSize = (void *)ne_drive_getSectorSize, + .getCapacity = (void *)ne_drive_getCapacity, + .readSector = (void *)ne_drive_readSector, + .writeSector = (void *)ne_drive_writeSector, + }; + + nn_addDrive(computer, "drive.img", 4, &genericDrive); + + ne_drive drive = { + .file = fopen("data/drive.img", "r+") + }; + assert(drive.file != NULL); + + nn_drive genericDrive = { + .refc = 0, + .userdata = &drive, + .deinit = (void *)ne_drive_close, + .control = (void *)ne_drive_getControl, + .getLabel = ne_eeprom_getLabel, + .setLabel = ne_eeprom_setLabel, + .getPlatterCount = (void *)ne_drive_getPlatterCount, + .getSectorSize = (void *)ne_drive_getSectorSize, + .getCapacity = (void *)ne_drive_getCapacity, + .readSector = (void *)ne_drive_readSector, + .writeSector = (void *)ne_drive_writeSector, + }; + + nn_addDrive(computer, "drive.img", 4, &genericDrive); + nn_screen *s = nn_newScreen(&alloc, 80, 32, 16, 16, 256); nn_addKeyboard(s, "shitty keyboard"); nn_mountKeyboard(computer, "shitty keyboard", 2);