64 lines
2.1 KiB
C
64 lines
2.1 KiB
C
#include <SDL2/SDL.h>
|
|
#include <getopt.h>
|
|
#include <math.h>
|
|
#include <stdarg.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "cpu.h"
|
|
#include "disk.h"
|
|
|
|
disk_controller_t disk_controller;
|
|
|
|
extern fox32_vm_t vm;
|
|
|
|
void new_disk(const char *filename, size_t id) {
|
|
if (id > 3) { puts("attempting to access disk with ID > 3"); return; }
|
|
printf("mounting %s as disk ID %d\n", filename, (int) id);
|
|
disk_controller.disks[id].file = fopen(filename, "r+b");
|
|
if (!disk_controller.disks[id].file) {
|
|
fprintf(stderr, "couldn't open disk file\n");
|
|
exit(1);
|
|
}
|
|
fseek(disk_controller.disks[id].file, 0, SEEK_END);
|
|
disk_controller.disks[id].size = ftell(disk_controller.disks[id].file);
|
|
rewind(disk_controller.disks[id].file);
|
|
}
|
|
|
|
void insert_disk(disk_t disk, size_t id) {
|
|
if (id > 3) { puts("attempting to access disk with ID > 3"); return; }
|
|
if (disk_controller.disks[id].size > 0) remove_disk(id);
|
|
printf("mounting disk ID %d\n", (int) id);
|
|
disk_controller.disks[id] = disk;
|
|
}
|
|
|
|
void remove_disk(size_t id) {
|
|
if (id > 3) { puts("attempting to access disk with ID > 3"); return; }
|
|
printf("unmounting disk ID %d\n", (int) id);
|
|
fclose(disk_controller.disks[id].file);
|
|
disk_controller.disks[id].size = 0;
|
|
}
|
|
|
|
uint64_t get_disk_size(size_t id) {
|
|
if (id > 3) { puts("attempting to access disk with ID > 3"); return 0; }
|
|
return disk_controller.disks[id].size;
|
|
}
|
|
|
|
void set_disk_sector(size_t id, uint64_t sector) {
|
|
if (id > 3) { puts("attempting to access disk with ID > 3"); return; }
|
|
fseek(disk_controller.disks[id].file, sector * 512, 0);
|
|
}
|
|
|
|
size_t read_disk_into_memory(size_t id) {
|
|
if (id > 3) { puts("attempting to access disk with ID > 3"); return 0; }
|
|
return fread(&vm.memory_ram[disk_controller.buffer_pointer], 1, 512, disk_controller.disks[id].file);
|
|
}
|
|
|
|
size_t write_disk_from_memory(size_t id) {
|
|
if (id > 3) { puts("attempting to access disk with ID > 3"); return 0; }
|
|
return fwrite(&vm.memory_ram[disk_controller.buffer_pointer], 1, 512, disk_controller.disks[id].file);
|
|
}
|