This is patchrom.c in view mode; [Download] [Up]
/*
* patchrom.c - C64 ROM patcher.
*
* Written by
* Peter Weighill (stuce@csv.warwick.ac.uk)
* Jouko Valta (jopi@stekt.oulu.fi)
*
* Patches by
* Marko Mäkelä (msmakela@nic.funet.fi)
*
* This file is part of VICE, the Versatile Commodore Emulator.
* See README for copyright notice.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA.
*
*/
#include "vice.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "mem.h"
#include "patchrom.h"
/*
* By an option on the x64 command line you can patch between the
* different roms.
*
* x64 -kernalrev 0 KERNAL ROM R0
* x64 -kernalrev 3 KERNAL ROM R3
* x64 -kernalrev 67 SX-64 or DX-64
* x64 -kernalrev 100 PET 64 aka 4064 aka Educator 64
*/
/*
* Table of differences between the two versions of the C64 Kernel ROM.
* To use your national patches, just add the data following
* the format used below. (Note: Each block must contain data for
* each patch version.)
*/
#define PATCH_VERSIONS 3 /* counting from 0 */
static unsigned short patch_bytes[] = {
3, 0xE42D,
0x20, 0x1E, 0xAB,
0x20, 0x1E, 0xAB,
0x20, 0x1E, 0xAB,
0x4C, 0x41, 0xE4,
54, 0xE477,
0x20, 0x20, 0x2A, 0x2A, 0x2A, 0x2A, 0x20, 0x43, 0x4F, 0x4D,
0x4D, 0x4F, 0x44, 0x4F, 0x52, 0x45, 0x20, 0x36, 0x34, 0x20,
0x42, 0x41, 0x53, 0x49, 0x43, 0x20, 0x56, 0x32, 0x20, 0x2A,
0x2A, 0x2A, 0x2A, 0x0D, 0x0D, 0x20, 0x36, 0x34, 0x4B, 0x20,
0x52, 0x41, 0x4D, 0x20, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D,
0x20, 0x20, 0x00, 0x5C,
0x20, 0x20, 0x2A, 0x2A, 0x2A, 0x2A, 0x20, 0x43, 0x4F, 0x4D,
0x4D, 0x4F, 0x44, 0x4F, 0x52, 0x45, 0x20, 0x36, 0x34, 0x20,
0x42, 0x41, 0x53, 0x49, 0x43, 0x20, 0x56, 0x32, 0x20, 0x2A,
0x2A, 0x2A, 0x2A, 0x0D, 0x0D, 0x20, 0x36, 0x34, 0x4B, 0x20,
0x52, 0x41, 0x4D, 0x20, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D,
0x20, 0x20, 0x00, 0x81,
0x20, 0x20, 0x20, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x20, 0x20,
0x53, 0x58, 0x2D, 0x36, 0x34, 0x20, 0x42, 0x41, 0x53, 0x49,
0x43, 0x20, 0x56, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x2A, 0x2A,
0x2A, 0x2A, 0x2A, 0x0D, 0x0D, 0x20, 0x36, 0x34, 0x4B, 0x20,
0x52, 0x41, 0x4D, 0x20, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D,
0x20, 0x20, 0x00, 0xB3,
0x2A, 0x2A, 0x2A, 0x2A, 0x20, 0x43, 0x4F, 0x4D, 0x4D, 0x4F,
0x44, 0x4F, 0x52, 0x45, 0x20, 0x34, 0x30, 0x36, 0x34, 0x20,
0x20, 0x42, 0x41, 0x53, 0x49, 0x43, 0x20, 0x56, 0x32, 0x2E,
0x30, 0x20, 0x2A, 0x2A, 0x2A, 0x2A, 0x0D, 0x0D, 0x00, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x63,
21, 0xE4C8,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAD, 0x21, 0xD0,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0x85, 0xA9, 0xA9, 0x01, 0x85, 0xAB, 0x60, 0xAD, 0x86, 0x02,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0x85, 0xA9, 0xA9, 0x01, 0x85, 0xAB, 0x60, 0xAD, 0x86, 0x02,
0x2C, 0x86, 0x02, 0x30, 0x0A, 0xA9, 0x00, 0xA2, 0x0E, 0x9D,
0x20, 0xD0, 0xCA, 0x10, 0xFA, 0x4C, 0x87, 0xEA, 0xAD, 0x21, 0xD0,
1, 0xE535,
0x0E,
0x0E,
0x06,
0x01,
30, 0xE57C,
0xB5, 0xD9, 0x29, 0x03, 0x0D, 0x88, 0x02, 0x85, 0xD2, 0xBD,
0xF0, 0xEC, 0x85, 0xD1, 0xA9, 0x27, 0xE8, 0xB4, 0xD9, 0x30,
0x06, 0x18, 0x69, 0x28, 0xE8, 0x10, 0xF6, 0x85, 0xD5, 0x60,
0x20, 0xF0, 0xE9, 0xA9, 0x27, 0xE8, 0xB4, 0xD9, 0x30, 0x06,
0x18, 0x69, 0x28, 0xE8, 0x10, 0xF6, 0x85, 0xD5, 0x4C, 0x24,
0xEA, 0xE4, 0xC9, 0xF0, 0x03, 0x4C, 0xED, 0xE6, 0x60, 0xEA,
0x20, 0xF0, 0xE9, 0xA9, 0x27, 0xE8, 0xB4, 0xD9, 0x30, 0x06,
0x18, 0x69, 0x28, 0xE8, 0x10, 0xF6, 0x85, 0xD5, 0x4C, 0x24,
0xEA, 0xE4, 0xC9, 0xF0, 0x03, 0x4C, 0xED, 0xE6, 0x60, 0xEA,
0x20, 0xF0, 0xE9, 0xA9, 0x27, 0xE8, 0xB4, 0xD9, 0x30, 0x06,
0x18, 0x69, 0x28, 0xE8, 0x10, 0xF6, 0x85, 0xD5, 0x4C, 0x24,
0xEA, 0xE4, 0xC9, 0xF0, 0x03, 0x4C, 0xED, 0xE6, 0x60, 0xEA,
1, 0xE5EF,
0x09,
0x09,
0x0F,
0x09,
2, 0xE5F4,
0xE6, 0xEC,
0xE6, 0xEC,
0xD7, 0xF0,
0xE6, 0xEC,
2, 0xE622,
0xED, 0xE6,
0x91, 0xE5,
0x91, 0xE5,
0x91, 0xE5,
12, 0xEA07,
0xA9, 0x20, 0x91, 0xD1, 0x20, 0xDA, 0xE4, 0xEA, 0x88, 0x10,
0xF5, 0x60,
0x20, 0xDA, 0xE4, 0xA9, 0x20, 0x91, 0xD1, 0x88, 0x10, 0xF6,
0x60, 0xEA,
0x20, 0xDA, 0xE4, 0xA9, 0x20, 0x91, 0xD1, 0x88, 0x10, 0xF6,
0x60, 0xEA,
0xA9, 0x20, 0x91, 0xD1, 0x20, 0xDA, 0xE4, 0xEA, 0x88, 0x10,
0xF5, 0x60,
14, 0xECD9,
0x0E, 0x06, 0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x07,
0x0E, 0x06, 0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x07,
0x03, 0x01, 0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
3, 0xEF94,
0x85, 0xA9, 0x60,
0x4C, 0xD3, 0xE4,
0x4C, 0xD4, 0xE4,
0x85, 0xA9, 0x60,
15, 0xF0D8,
0x0D, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x50, 0x4C, 0x41,
0x59, 0x20, 0x4F, 0x4E, 0x20,
0x0D, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x50, 0x4C, 0x41,
0x59, 0x20, 0x4F, 0x4E, 0x20,
0x4C, 0x4F, 0x41, 0x44, 0x22, 0x3A, 0x2A, 0x22, 0x2C, 0x38,
0x0D, 0x52, 0x55, 0x4E, 0x0D,
0x0D, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x50, 0x4C, 0x41,
0x59, 0x20, 0x4F, 0x4E, 0x20,
1, 0xF387,
0x03,
0x03,
0x08,
0x03,
1, 0xF4B7,
0x7B,
0x7B,
0xF7,
0x7B,
1, 0xF5F9,
0x5F,
0x5F,
0xF7,
0x5F,
1, 0xF81F,
0x2F,
0x2F,
0x2F,
0x2B,
1, 0xF82C,
0x2F,
0x2F,
0x2F,
0x2B,
1, 0xFF80, /* The version ID byte */
0x00,
0x03,
0x43,
0x64,
2, 0xFFF8,
0x42, 0x59,
0x42, 0x59,
0x42, 0x59,
0x00, 0x00,
0, 00
};
int patch_rom(const char *str)
{
int rev, curr, num, lcount, isnum;
short bytes, n, i = 0;
ADDRESS a;
if (str == NULL || *str == '\0')
return 0;
for (isnum = 0, i = 0; str[i] != '\0'; i++)
if (!isalnum((int) str[i]))
isnum = 0;
if (!isnum) {
if (strcasecmp(str, "sx") == 0) {
rev = 67;
} else {
fprintf(stderr, "Invalid ROM revision `%s'.\n", str);
return -1;
}
} else {
rev = atoi (str);
}
curr = read_rom(0xff80);
if (rev == curr) {
printf("ROM not patched: Already revision #%d\n", curr);
return (0);
}
if (rev < 0) {
rev = 0;
}
/* create index */
num = rev;
switch (rev) {
case 4064:
case 100:
rev = 3; /* index for rev100 data */
break;
case 67:
rev = 2; /* index for rev67 data */
break;
case 3:
rev = 1; /* index for rev03 data */
break;
case 0:
break;
default:
printf("Cannot patch ROM to revision #%d\n", rev);
return (-1);
}
printf("\nInstalling ROM patch for revision #%d:\n", num);
lcount = 0;
while ((bytes = patch_bytes[i++]) > 0) {
a = (ADDRESS)patch_bytes[i++];
printf("%.4X (%d byte%s)",
a & 0xFFFF, bytes, ((bytes > 1) ? "s":""));
lcount++;
if (lcount == 5) {
lcount = 0;
putchar('\n');
} else
putchar('\t');
i += (bytes * rev); /* select patch */
for(n = bytes; n--;)
store_rom(a++, (BYTE)patch_bytes[i++]);
i += (bytes * (PATCH_VERSIONS - rev)); /* skip patch */
}
if (lcount != 0)
putchar('\n');
return (0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.