home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
system_utils
/
general
/
setcpu_400
/
diskio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-03
|
5KB
|
191 lines
/*
SetCPU V1.60
by Dave Haynie, April 13, 1990
Released to the Public Domain
DISKIO.C MODULE
This module is responsible for fetching ROM images from various
kinds of disks and files.
*/
#include "setcpu.h"
/* This function allocates a ROM image from a KickStart disk for KICKROM. */
#define ColorShift(x) (LONG)((((x)&0xf)+1)%15)
struct systag *AllocKSImage(name)
char *name;
{
struct systag *tag = NULL;
ULONG *buf = NULL, blocks;
char *ptr;
LONG unit, i, r = 0x0004L, g = 0x0008L, b = 0x000cL,start;
struct MsgPort *port = NULL;
struct IOStdReq *req = NULL;
struct Window *hand = NULL;
BOOL devok = FALSE;
/* Then we expect it to be a kickstart disk, so we check out the device,
the disk, etc. If all goes well, we'll be in business. */
if ((unit = CheckTDDev(name)) == -1L) {
LoadErr = 16;
goto fail;
}
/* This is the stuff that need opening... */
port = (struct MsgPort *) CreatePort("diskreq.port",0L);
if (port) req = CreateStdIO(port,0L);
if (req) devok = !OpenDevice("trackdisk.device",unit,(struct IORequest *)req,0L);
if (devok) buf = (ULONG *)AllocMem(512L,MEMF_CHIP);
if (!port || !req || !devok || !buf) goto fail;
/* Make sure we're a kick disk. */
hand = CoolHand();
while ((ReadBuf((char *)buf,0L,req) != READOK) ||
!strniequ("KICK",(char *)buf,4))
Delay(150L);
/* Check the size of this kickstart. */
if (!(tag = AllocMem(SizeOf(struct systag),0L))) goto fail;
start = 0;
do {
if (ReadBuf((char *)buf,++start,req) != READOK) goto fail;
ptr = (char *)SizeROM(tag,buf,TRUE);
} while (ptr == NULL && start < 32L);
if (!ptr) goto fail;
blocks = tag->romsize/512L;
/* Looks like we're in shape to get the actual system. */
SetRGB4(&(hand->WScreen->ViewPort),2L,r,g,b);
for (i = 1; i <= blocks; ++i) {
if (ReadBuf((char *)buf,i,req) != READOK) break;
MemCopy((char *)buf,ptr,512L);
ptr += 512L;
r = ColorShift(r);
g = ColorShift(g);
b = ColorShift(b);
SetRGB4(&(hand->WScreen->ViewPort),2L,r,g,b);
}
LoadErr = 0;
done:
if (buf) FreeMem((char *)buf,512L);
if (devok) {
MotorOff(req);
CloseDevice((struct IORequest *)req);
}
if (req) DeleteStdIO(req);
if (port) DeletePort(port);
return tag;
fail:
if (tag) {
FreeMem(tag,SizeOf(struct systag));
tag = NULL;
}
goto done;
}
/* This function allocates a ROM image from an AmigaDOS file for either
KICKROM or FASTROM. */
struct systag *AllocFILEImage(name)
char *name;
{
struct systag *tag = NULL;
ULONG *rom = NULL, space[2], check;
BPTR file = NULL;
struct FileInfoBlock *fib;
/* First off, let's check out this here file. */
if (!(fib = AllocMem(SizeOf(struct FileInfoBlock),0L))) goto fail;
if (!(file = Lock(name,ACCESS_READ))) {
LoadErr = 24;
goto fail;
}
Examine(file,fib);
UnLock(file);
file = NULL;
if (fib->fib_DirEntryType > 0L || !(file = Open(name,MODE_OLDFILE))) {
LoadErr = 24;
goto fail;
}
/* Try to find a sensible ROM header, either its a plain ROM, or the one
with the extra sizing info at the head. */
Read(file,(char *)space,8L);
if (space[0])
Seek(file,0L,OFFSET_BEGINNING);
else {
check = space[1];
Read(file,(char *)space,8L);
Seek(file,8L,OFFSET_BEGINNING);
}
/* Let's allocate the space I need. KICKROMs don't use a disk image
directly, so they don't need an MMU table and don't care about any special
alignment. FASTROMs read from disk do care, so I will align this image. */
SmartlyGetRange();
if (!(tag = AllocAligned(SizeOf(struct systag),8L))) goto fail;
if (!(rom = SizeROM(tag,space,TRUE))) {
LoadErr == 22;
goto fail;
}
if (tag->romsize != Read(file,(char *)rom,tag->romsize)) {
LoadErr = 23;
goto fail;
}
Close(file);
FreeMem(fib,SizeOf(struct FileInfoBlock));
return tag;
fail:
if (file) Close(file);
if (fib) FreeMem(fib,SizeOf(struct FileInfoBlock));
if (rom) FreeMem(rom,tag->romsize);
if (tag) FreeMem(tag,SizeOf(struct systag));
return NULL;
}
/* This function gets a ROM image from disk; in temporary unaligned memory
for a KICKROM image, permanent aligned memory for a FASTROM image. */
struct systag *AllocDISKImage(type,name)
UWORD type;
char *name;
{
struct systag *tag;
ULONG *table;
/* Reset the error code. */
LoadErr = 0;
/* Let's check out this here file. It's easy to tell; we want a FILE
image if we aren't passed a KICK_ROM request with a device name. */
if (type == ROM_FAST || name[strlen(name)-1] != ':') {
tag = AllocFILEImage(name);
if ((tag->romtype = type) == ROM_FAST) {
FindWrap(tag);
if (!(table = AllocAligned(tag->tablesize+4,TABROUND))) return NULL;
tag->maintable = table;
FillBasicTable(tag,FALSE);
}
return tag;
}
return AllocKSImage(name);
}