allow to read big endian on little endian machine

This commit is contained in:
Laurent Vivier 2004-06-01 15:09:13 +00:00
parent c814cb68e9
commit 09ef8c96cf
5 changed files with 93 additions and 23 deletions

View File

@ -10,11 +10,11 @@ CFLAGS = -Wall
all: $(PROGRAMS)
emile-set-cmdline.o: emile-set-cmdline.c emile-first.h
emile-set-cmdline.o: emile-set-cmdline.c emile-first.h emile.h
emile-first-info.o: emile-first-info.c emile-first.h
emile-first-info.o: emile-first-info.c emile-first.h emile.h
emile-first-tune.o: emile-first-tune.c emile-first.h
emile-first-tune.o: emile-first-tune.c emile-first.h emile.h
clean:
rm -f *.o $(PROGRAMS)

View File

@ -11,6 +11,7 @@
#include <fcntl.h>
#include <string.h>
#include "emile.h"
#include "emile-first.h"
static void usage(int argc, char** argv)
@ -50,11 +51,11 @@ int first_info(char* image)
printf("Boot Block Header:\n\n");
printf("Boot blocks signature: 0x%x\n",
firstBlock.boot_block_header.ID);
read_short(&firstBlock.boot_block_header.ID));
printf("Entry point to bootcode: 0x%lX\n",
firstBlock.boot_block_header.Entry);
read_long(&firstBlock.boot_block_header.Entry));
printf("Boot blocks version number: %x\n",
firstBlock.boot_block_header.Version);
read_short(&firstBlock.boot_block_header.Version));
printf("System filename: ");
pprint(firstBlock.boot_block_header.SysName);
putchar('\n');
@ -77,15 +78,15 @@ int first_info(char* image)
pprint(firstBlock.boot_block_header.ScrapName);
putchar('\n');
printf("Number of FCBs to allocate: %d\n",
firstBlock.boot_block_header.CntFCBs);
read_short(&firstBlock.boot_block_header.CntFCBs));
printf("Number of event queue elements: %d\n",
firstBlock.boot_block_header.CntEvts);
read_short(&firstBlock.boot_block_header.CntEvts));
printf("System heap size on 128K Mac: 0x%lx\n",
firstBlock.boot_block_header.Heap128K);
read_long(&firstBlock.boot_block_header.Heap128K));
printf("System heap size on 256K Mac: 0x%lx\n",
firstBlock.boot_block_header.Heap256K);
read_long(&firstBlock.boot_block_header.Heap256K));
printf("System heap size on all machines: 0x%lx\n",
firstBlock.boot_block_header.SysHeapSize);
read_long(&firstBlock.boot_block_header.SysHeapSize));
if ( strncmp( firstBlock.boot_block_header.SysName+1,
"Mac Bootloader", 14) == 0 )
@ -93,13 +94,13 @@ int first_info(char* image)
printf("\nEMILE boot block identified\n\n");
printf("Drive number: %d\n",
firstBlock.second_param_block.ioVRefNum);
read_short(&firstBlock.second_param_block.ioVRefNum));
printf("File reference number: %d\n",
firstBlock.second_param_block.ioRefNum);
read_short(&firstBlock.second_param_block.ioRefNum));
printf("Second level size: %ld\n",
firstBlock.second_param_block.ioReqCount);
read_long(&firstBlock.second_param_block.ioReqCount));
printf("Second level offset: %ld\n",
firstBlock.second_param_block.ioPosOffset);
read_long(&firstBlock.second_param_block.ioPosOffset));
}
close(fd);

View File

@ -12,6 +12,7 @@
#include <fcntl.h>
#include <string.h>
#include "emile.h"
#include "emile-first.h"
#define TUNE_DRIVE 0x0001
@ -58,31 +59,31 @@ int first_tune( char* image, unsigned short tune_mask, int drive_num,
if (tune_mask & TUNE_DRIVE)
{
printf("Set drive number to %d\n", drive_num);
firstBlock.second_param_block.ioVRefNum = drive_num;
write_short(&firstBlock.second_param_block.ioVRefNum, drive_num);
}
if (tune_mask & TUNE_OFFSET)
{
printf("Set second level offset to %d\n", second_offset);
firstBlock.second_param_block.ioPosOffset = second_offset;
write_long(&firstBlock.second_param_block.ioPosOffset, second_offset);
}
if (tune_mask & TUNE_SIZE)
{
printf("Set second level size to %d\n", second_size);
firstBlock.second_param_block.ioReqCount = second_size;
write_long(&firstBlock.second_param_block.ioReqCount, second_size);
}
if (tune_mask == 0)
{
printf("Drive number: %d\n",
firstBlock.second_param_block.ioVRefNum);
read_short(&firstBlock.second_param_block.ioVRefNum));
printf("File reference number: %d\n",
firstBlock.second_param_block.ioRefNum);
read_short(&firstBlock.second_param_block.ioRefNum));
printf("Second level size: %ld\n",
firstBlock.second_param_block.ioReqCount);
read_long(&firstBlock.second_param_block.ioReqCount));
printf("Second level offset: %ld\n",
firstBlock.second_param_block.ioPosOffset);
read_long(&firstBlock.second_param_block.ioPosOffset));
}
else
{

View File

@ -12,6 +12,7 @@
#include <stdlib.h>
#include <string.h>
#include "emile.h"
#include "emile-first.h"
#include "emile-second.h"
@ -68,7 +69,7 @@ int set_cmdline(int readonly, char* image, char* cmdline)
return 7;
}
if (EMILE_001_SIGNATURE != header.signature)
if (EMILE_001_SIGNATURE != read_long(&header.signature))
{
fprintf(stderr, "Bad Header signature\n");
return 8;

67
tools/emile.h Normal file
View File

@ -0,0 +1,67 @@
/*
*
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
*
*/
#include <endian.h>
#if __BYTE_ORDER == __BIG_ENDIAN
/* nothing to do, because m68k is big endian too */
static inline unsigned short read_short(unsigned short* addr)
{
return *addr;
}
static inline void write_short(unsigned short* addr, unsigned short value)
{
*addr = value;
}
static inline unsigned long read_long(unsigned long* addr)
{
return *addr;
}
static inline void write_long(unsigned long* addr, unsigned long value)
{
*addr = value;
}
#else /* __BYTE_ORDER == __LITTLE_ENDIAN */
/* little endian (or unknown), read byte by byte to get it in good order */
static inline unsigned short read_short(unsigned short* addr)
{
unsigned char* baddr = (unsigned char*)addr;
return ((unsigned short)(*baddr) << 8) | (unsigned short)*(baddr+1);
}
static inline void write_short(unsigned short* addr, unsigned short value)
{
unsigned char* baddr = (unsigned char*)addr;
*baddr = (unsigned char)(value>>8);
*(baddr+1) = (unsigned char)value;
}
static inline unsigned long read_long(unsigned long* addr)
{
unsigned short* saddr = (unsigned short*)addr;
return ((unsigned long)read_short(saddr) << 16) |
(unsigned long)read_short(saddr+1);;
}
static inline void write_long(unsigned long* addr, unsigned long value)
{
unsigned short* saddr = (unsigned short*)addr;
write_short(saddr, (unsigned short)(value>>16));
write_short(saddr+1, (unsigned short)value);
}
#endif