Import backup from 2004-01-04

This commit is contained in:
Josh Holtrop 2004-01-04 22:00:00 -05:00
parent c613002307
commit af6087ecec
8 changed files with 177 additions and 48 deletions

View File

@ -52,6 +52,39 @@ _read_cr3:
mov eax, cr3;
ret
;compares one string to another
;returns 0 if the strings are different
;extern dword strcmp(char *str1, char *str2);
[global _strcmp]
_strcmp:
push ebp
mov ebp, esp
push esi
push edi
mov esi, [ebp+8]
mov edi, [ebp+12]
strcmp_loop1:
lodsb
mov ah, [edi]
inc edi
cmp ah, al
jnz strcmp_ne
or al, al
jz strcmp_e
jmp strcmp_loop1
strcmp_e:
mov eax, 1
jmp short strcmp_done
strcmp_ne:
xor eax, eax
strcmp_done:
pop edi
pop esi
pop ebp
ret
;copies a string from the source to the destination parameter
;extern void strcpy(char *dest, char *src);
[global _strcpy]

57
fat12.c Normal file
View File

@ -0,0 +1,57 @@
// fat12.c
// Author: Josh Holtrop
// Created: 01/04/04
byte *fat12_readFile(char *fileName, DiskDevice *dd)
{
}
Fat12File *fat12_getFileHandle(char *fileName)
{
if (strlen(fileName) < 1)
return 0;
if (fileName[strlen(fileName)-1] == '/')
return 0;
dword numDirectories = 0;
int a = 0;
for (;;) //first count how many directories deep we are looking
{
if (fileName[a] == '/')
numDirectories++;
a++;
if (!fileName[a])
break;
}
for (a = 0; ;a++) //next split apart the filename string into parts for each directory and file
{
if (fileName[a] == 0)
break;
if (fileName[a] == '/')
fileName[a] = 0;
}
char **levels = (char**)malloc((numDirectories+1)*sizeof(char *));
char *dir = fileName;
for (a = 0; a <= numDirectories; a++)
{
levels[a] = dir;
for (;;)
{
dir++;
if (!(*dir))
break;
}
dir++;
}
for (a = 0; a <= numDirectories; a++)
{
printf("directory: %s|\n", levels[a]);
}
//at this point we have an array of "strings" (character pointers) called levels
// its length is numDirectories+1, levels[numDirectores] points to the actual file name
free(levels);
}

19
fat12.h Normal file
View File

@ -0,0 +1,19 @@
// fat12.h
// Author: Josh Holtrop
// Created: 01/04/04
typedef struct {
dword location;
} __attribute__((packed)) Fat12File;
typedef struct {
dword location;
} __attribute__((packed)) Fat12Directory;
byte *fat12_readFile(char *fileName, DiskDevice *dd);
Fat12File *fat12_getFileHandle(char *fileName);
Fat12Directory *fat12_getDirectoryHandle(char *directory);

View File

@ -18,6 +18,7 @@
#include "kio.h"
#include "vfs.h"
#include "rd.h"
#include "fat12.h"
void isr(dword num);
void k_init();
@ -38,6 +39,7 @@ extern void strcpy(char *dest, char *src);
extern void memcpy(dword dest, dword src, dword n);
extern dword strlen(char *str);
#include "fat12.c"
#include "rd.c"
#include "vfs.c"
#include "kio.c"
@ -79,7 +81,7 @@ void k_init()
printf("HOS 0.13 - Kernel File Size: %u kb\tData Size: %u bytes\n", kernel_size()>>10, (dword)(&_end)-(dword)(&_code));
printf("Memory available to OS: %u MB (%u bytes)\n", mm_megabytes, mm_totalmem);
printf("Free memory: %u bytes (%u pages)\n", mm_freemem(), mm_freemem()>>12);
printf("Root Directory: %s/\n", rootDirectory);
printf("Root Directory: %s/\n", rootDevice->id);
dword key = 0;
for (;;)

7
rd.c
View File

@ -1,12 +1,13 @@
// rd.c
// Author: Josh Holtrop
// Created: 12/31/03
// Modified: 01/04/04
byte *rd_readSector(DiskDevice *rd, dword sector)
byte *rd_readSector(DiskDevice *rd, dword sector, byte *dest)
{
dword dest = (dword)malloc(512);
memcpy(dest, rd->location + (sector * 512), 512);
memcpy((dword)dest, rd->location + (sector * 512), 512);
return dest;
}

3
rd.h
View File

@ -1,8 +1,9 @@
// rd.h
// Author: Josh Holtrop
// Created: 12/31/03
// Modified: 01/04/04
byte *rd_readSector(DiskDevice *rd, dword sector);
byte *rd_readSector(DiskDevice *rd, dword sector, byte *dest);

81
vfs.c
View File

@ -1,53 +1,70 @@
// vfs.c
// Author: Josh Holtrop
// Created: 12/31/03
// Modified: 01/04/04
void vfs_init()
{
byte ramDiskPresent = *(byte *)0xC0090000;
if (ramDiskPresent)
firstDiskDevice = malloc(sizeof(DiskDevice));
firstDiskDevice->type = VFS_DISK_FD;
firstDiskDevice->fileSystem = VFS_FS_FAT12;
firstDiskDevice->location = VFS_LOC_FD0;
firstDiskDevice->link = 0;
strcpy(firstDiskDevice->id, "fd0");
rootDevice = firstDiskDevice;
if (*(byte *)0xC0090000) // the user chose to load an initial ram disk from the floppy
{
strcpy(rootDirectory, "rd0");
firstDevice = malloc(sizeof(DeviceEntry));
firstDevice->link = 0;
firstDevice->diskDevice = malloc(sizeof(DiskDevice));
firstDevice->diskDevice->type = VFS_DISK_RD;
firstDevice->diskDevice->fileSystem = VFS_FS_FAT12;
strcpy(firstDevice->diskDevice->id, "rd0");
firstDevice->diskDevice->location = 0xC0200000;
}
else
{
rootDirectory[0] = 0;
DiskDevice *rd = malloc(sizeof(DiskDevice));
firstDiskDevice->link = (dword)rd;
rd->type = VFS_DISK_RD;
rd->fileSystem = VFS_FS_FAT12;
rd->location = 0xC0200000;
rd->link = 0;
strcpy(rd->id, "rd0");
rootDevice = rd;
}
}
byte *vfs_readFile(char *fileName)
{
char *newFileName = fileName;
char device[4];
DiskDevice *dd;
dword fileStartPosition;
if (fileName[0] == '/')
{
newFileName = malloc(strlen(fileName)+4);
strcpy(newFileName, rootDirectory);
strcat(newFileName, fileName);
dd = rootDevice;
fileStartPosition = 1;
}
strcpy(device, newFileName);
DiskDevice *dd = vfs_getDiskDeviceByID(device);
if (newFileName != fileName)
free(newFileName);
else
{
if (strlen(fileName) < 5) //not a long enough file name
return 0;
if (!((fileName[3] == ':') && (fileName[4] == '/'))) //if we aren't using the root directory, then there must be a 3 character device explicitly specified
return 0; // followed by a colon and then a slash
char device[4];
memcpy((dword)device, (dword)fileName, 3); //copy the 3 digit device id to device
device[3] = 0; //null-terminating character for device string
dd = vfs_getDiskDeviceByID(device);
if (!dd) //the specified device was not found
return 0;
fileStartPosition = 5;
}
switch (dd->fileSystem)
{
case VFS_FS_FAT12:
return fat12_readFile(fileName+fileStartPosition, dd);
}
return 0;
}
byte *vfs_readSector(DiskDevice *dd, dword sector)
byte *vfs_readSector(DiskDevice *dd, dword sector, byte *dest)
{
switch(dd->type)
switch (dd->type)
{
case VFS_DISK_RD:
return rd_readSector(dd, sector);
return rd_readSector(dd, sector, dest);
}
return 0;
}
@ -55,13 +72,13 @@ byte *vfs_readSector(DiskDevice *dd, dword sector)
DiskDevice *vfs_getDiskDeviceByID(char *id)
{
DeviceEntry *de = firstDevice;
DiskDevice *dd = firstDiskDevice;
for (;;)
{
if (strcmp(de->diskDevice->id, id))
return de->diskDevice;
de = (DeviceEntry *)de->link;
if (!de)
if (strcmp(dd->id, id))
return dd;
dd = (DiskDevice *)dd->link;
if (!dd)
break;
}
return 0;

17
vfs.h
View File

@ -1,6 +1,7 @@
// vfs.h
// Author: Josh Holtrop
// Created: 12/31/03
// Modified: 01/04/04
#define VFS_DISK_RD 1
@ -9,26 +10,24 @@
#define VFS_FS_FAT12 1
#define VFS_LOC_FD0 1
typedef struct {
dword type;
dword fileSystem;
char id[4];
dword location;
} __attribute__((packed)) DiskDevice;
typedef struct {
DiskDevice *diskDevice;
dword link;
} __attribute__((packed)) DeviceEntry;
char id[4];
} __attribute__((packed)) DiskDevice;
void vfs_init();
byte *vfs_readFile(char *fileName);
byte *vfs_readSector(DiskDevice *dd, dword sector);
byte *vfs_readSector(DiskDevice *dd, dword sector, byte *dest);
DiskDevice *vfs_getDiskDeviceByID(char *id);
char rootDirectory[4];
DeviceEntry *firstDevice = 0;
DiskDevice *rootDevice = 0;
DiskDevice *firstDiskDevice = 0;