amiga-e/amigae33a/E_v3.3a/Src/Src/Pd/MakeKickFile.e

110 lines
3.5 KiB
Plaintext

;/* MakeKickFile.e - Execute me to compile with Amiga E v2.1
ec MakeKickFile
quit
*/
/*
** $Filename: MakeKickFile.e $
** $Release: 1.1 $
**
** (C) Copyright 1991-1993 Jaba Development.
** Written by Jan van den Baard
**
** Create a rom-kick file of the machine it is run on.
** It can create 256K and 512K ROM files.
**
** This is a direct translation from my original C code
** and the first thing I wrote in Amiga E. Therefore it
** might not make full use of E it's special features.
** Please forgive me for that.
**
** The usage is simple. You pass this program a filename
** and, if the rom size is known, it will write the ROM
** of the machine to the file. It writes the ROM, *NOT*
** a soft-kicked rom.
**
** The output can be used by setcpu or skick to boot up
** a machine with the ROM file.
**
** I have successfully tested it with an A1200 ROM on
** a A2500.
**
** No testing has been made with a 1.2/1.3 ROM file.
** I don't have access to a 1.2/1.3 machine.
**
** This really is a hack...but a hack that works!
**/
MODULE 'dos/dos'
/* ROM size constants and magic cookies */
CONST SMALLROM = $00040000, SMALLMAGIC = $11114EF9,
BIGROM = $00080000, BIGMAGIC = $11144EF9
/* C= RomFileHeader structure */
OBJECT romfileheader
alwaysnil : LONG /* like it says -: always NIL */
romsize : LONG /* the size of the ROM */
ENDOBJECT
/* only three excpetion errors... */
ENUM ER_USAGE=1, ER_UNKNOWN, ER_IO
/* here we go... */
PROC main() HANDLE
DEF outfile = NIL,
base = NIL : PTR TO LONG,
size = NIL,
len = NIL,
rk, rfh : romfileheader
WriteF( '\e[1mMakeKickFile version 1.1 - (C) 1991-1993 Jaba Development\e[0m\n' );
/* no args or "?" as arg then print the usage */
IF StrCmp( arg, '', 1 ) OR StrCmp( arg, '?', 2 ) THEN Raise( ER_USAGE )
/* first try for a 512 KB ROM */
base := $00F80000
/* if the magic cookie isn't BIGMAGIC then it must be a 256 KB ROM */
IF ( base[ 0 ] <> BIGMAGIC ) THEN base := $00FC0000
/* let's see what ROM we are dealing with */
rk := base[ 0 ]
SELECT rk
CASE SMALLMAGIC; size := SMALLROM /* 256 KB */
CASE BIGMAGIC; size := BIGROM /* 512 KB */
DEFAULT; Raise( ER_UNKNOWN ) /* unknown... */
ENDSELECT
/* show the ROM size */
WriteF( 'ROM Size = \dKByte.\n', size / 1024 )
/* open the kick-file */
IF ( outfile := Open( arg, MODE_NEWFILE ))
WriteF( 'Writing KickFile image...\n' )
rfh.alwaysnil := NIL /* set this field to NIL */
rfh.romsize := size /* put the ROM size here */
len := Write( outfile, rfh, 8 ) /* write the romfileheader */
len := len + Write( outfile, base, size ) /* write the rom */
Close( outfile ) /* close the kick-file */
/* was the writing successfull? */
IF ( ( len <> ( size + 8 )) OR IoErr() ) THEN Raise( ER_IO )
ELSE
/* could not open the file! */
WriteF( 'Unable to open the output file!\n' )
ENDIF
EXCEPT
/* exception handler for when no output name was given
or the ROM is not recognized or an IO error. */
SELECT exception
CASE ER_USAGE; WriteF( 'Usage: MakeKickFile <romfilename>\n' )
CASE ER_UNKNOWN; WriteF( 'Unknown ROM! Exiting...\n' )
DEFAULT; PrintFault( IoErr(), 'Error -' )
ENDSELECT
ENDPROC IoErr()