mirror of
https://github.com/vivier/EMILE.git
synced 2024-09-08 04:54:25 +00:00
Move floppy management to libfloppy
This commit is contained in:
parent
5ae61f058f
commit
e84481140d
34
libfloppy/Makefile
Normal file
34
libfloppy/Makefile
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#
|
||||||
|
# (c) 2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
|
#
|
||||||
|
|
||||||
|
TOP=$(shell pwd)
|
||||||
|
CFLAGS = -nostdlib -nodefaultlibs -Wall -Werror -Wno-multichar -fpic -O2
|
||||||
|
CPPFLAGS = -I$(TOP)/../libmacos -DARCH_M68K
|
||||||
|
|
||||||
|
LIBRARY = libfloppy.a
|
||||||
|
|
||||||
|
SOURCES = floppy_lseek.c floppy_read.c floppy_read_sector.c
|
||||||
|
|
||||||
|
HEADERS = libfloppy.h
|
||||||
|
|
||||||
|
DISTFILES = $(SOURCES) $(HEADERS)
|
||||||
|
|
||||||
|
OBJS = $(patsubst %.S,%.o,$(SOURCES:.c=.o))
|
||||||
|
|
||||||
|
all: $(LIBRARY)
|
||||||
|
|
||||||
|
$(LIBRARY): $(OBJS)
|
||||||
|
$(AR) rc $@ $^
|
||||||
|
|
||||||
|
dist:
|
||||||
|
for file in $(DISTFILES); do \
|
||||||
|
dir=$$(dirname $$file); \
|
||||||
|
if [ "$$dir" != "" ] ; then \
|
||||||
|
mkdir -p $(DISTDIR)/libfloppy/$$dir; \
|
||||||
|
fi; \
|
||||||
|
cp -p $$file $(DISTDIR)/libfloppy/$$file; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJS) $(LIBRARY)
|
25
libfloppy/floppy_lseek.c
Normal file
25
libfloppy/floppy_lseek.c
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "libfloppy.h"
|
||||||
|
|
||||||
|
int floppy_lseek(floppy_FILE *file, off_t offset, int whence)
|
||||||
|
{
|
||||||
|
long new_offset;
|
||||||
|
|
||||||
|
switch(whence)
|
||||||
|
{
|
||||||
|
case SEEK_SET:
|
||||||
|
new_offset = offset;
|
||||||
|
break;
|
||||||
|
case SEEK_CUR:
|
||||||
|
new_offset = file->offset + offset;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_offset < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
file->offset = new_offset;
|
||||||
|
|
||||||
|
return new_offset;
|
||||||
|
}
|
38
libfloppy/floppy_read.c
Normal file
38
libfloppy/floppy_read.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "libfloppy.h"
|
||||||
|
|
||||||
|
size_t floppy_read(floppy_FILE *file, void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
int read = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
while (size != 0)
|
||||||
|
{
|
||||||
|
int part;
|
||||||
|
int cylinder_nb = file->offset / CYLINDER_SIZE;
|
||||||
|
int cylinder_offset = file->offset % CYLINDER_SIZE;
|
||||||
|
|
||||||
|
if (cylinder_nb != file->current_cylinder)
|
||||||
|
{
|
||||||
|
ret = floppy_read_sector((cylinder_nb * CYLINDER_SIZE) >> SECTOR_SIZE_BITS,
|
||||||
|
file->cylinder,
|
||||||
|
CYLINDER_SIZE);
|
||||||
|
if (ret == -1)
|
||||||
|
return read;
|
||||||
|
file->current_cylinder = cylinder_nb;
|
||||||
|
}
|
||||||
|
|
||||||
|
part = CYLINDER_SIZE - cylinder_offset;
|
||||||
|
if (part > size)
|
||||||
|
part = size;
|
||||||
|
memcpy(ptr, file->cylinder + cylinder_offset, part);
|
||||||
|
|
||||||
|
size -= part;
|
||||||
|
ptr = (char*)ptr + part;
|
||||||
|
file->offset += part;
|
||||||
|
read += part;
|
||||||
|
}
|
||||||
|
|
||||||
|
return read;
|
||||||
|
}
|
36
libfloppy/floppy_read_sector.c
Normal file
36
libfloppy/floppy_read_sector.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <macos/devices.h>
|
||||||
|
|
||||||
|
#include "libfloppy.h"
|
||||||
|
|
||||||
|
/* offset is a block number
|
||||||
|
* size is the number of bytes to read
|
||||||
|
*/
|
||||||
|
|
||||||
|
int floppy_read_sector(off_t offset, void* buffer, size_t size)
|
||||||
|
{
|
||||||
|
OSErr err;
|
||||||
|
ParamBlockRec_t param_block;
|
||||||
|
|
||||||
|
/* check size to read is multiple of sector size */
|
||||||
|
|
||||||
|
if (size & (SECTOR_SIZE - 1))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
memset(¶m_block, 0, sizeof(param_block));
|
||||||
|
|
||||||
|
param_block.ioBuffer = (unsigned long)buffer;
|
||||||
|
param_block.ioVRefNum = 1;
|
||||||
|
param_block.ioRefNum = -5;
|
||||||
|
param_block.ioReqCount = size;
|
||||||
|
param_block.ioPosMode = fsFromStart;
|
||||||
|
param_block.ioPosOffset = offset << SECTOR_SIZE_BITS;
|
||||||
|
|
||||||
|
err = PBReadSync(¶m_block);
|
||||||
|
if (err != noErr)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
18
libfloppy/libfloppy.h
Normal file
18
libfloppy/libfloppy.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define SECTOR_SIZE_BITS 9
|
||||||
|
#define SECTOR_SIZE (1 << (SECTOR_SIZE_BITS))
|
||||||
|
#define SECTOR_PER_TRACK 18
|
||||||
|
#define SIDE_NB 2
|
||||||
|
#define CYLINDER_SIZE (SIDE_NB*SECTOR_PER_TRACK*SECTOR_SIZE)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int offset;
|
||||||
|
int current_cylinder;
|
||||||
|
unsigned char cylinder[CYLINDER_SIZE];
|
||||||
|
} floppy_FILE;
|
||||||
|
|
||||||
|
extern int floppy_read_sector(off_t offset, void* buffer, size_t size);
|
||||||
|
extern size_t floppy_read(floppy_FILE *file, void *ptr, size_t size);
|
||||||
|
extern int floppy_lseek(floppy_FILE *file, off_t offset, int whence);
|
Loading…
Reference in New Issue
Block a user