Listing 1 RAMROM.C
/* * fakeRom : This program supports * debugging of ROM * images in RAM. */ /* System includes */ #include <stdio.h> #include <alloc.h> #include <string.h> #include <mem.h> /* Useful defines and type defs */ define FAKE_ROM_SIZE 65536L /* Other useful types */ typedef unsigned long ULONG; typedef unsigned short USHORT; /* Pointer to void far function */ typedef void (far *FUNCPTR) (); /* -- procedures -- */ /* * getAddrPart : Return the segment * or offset of a * pointer */ USHORT getAddrPart (void *tptr, char part) { /* Overlay for pointer */ USHORT components[2]; /* * Overlay far pointer on * two 16-bit words. */ memcpy ( (void *)components, (void *)&tptr, (long) 4 ); /* * Return segment or offset * as requested by user. */ if ( part == 's' ) return components[1]; else return components[0]; } /* * physAddr : Make a physical * address from * segment, offset */ ULONG physAddr (void *tptr) { ULONG addr; /* return value */ /* Get segment */ addr = getAddrPart(tptr,'s'); addr = addr << 4; /* Get offset */ addr = addr|getAddrPart(tptr,'o'); /* Return whole thing */ return addr; } /* * loadImage : load a file * into a physical * address. */ long loadImage ( FILE *fptr, char buffer[], ULONG size) { /* Local variables */ long leftToRead; int thisRead; long actual; int block; /* Initialize */ actual = 0; block = 0; leftToRead = size; /* Assume 512 blocks */ while( 1 ) { /* Calculate amount to read */ if ( leftToRead > 512L ) thisRead = 512L; else thisRead = leftToRead; /* Perform the read */ block=fread (&buffer[actual], 1, thisRead, fptr); /* End-of-file test */ if ( block == 0 ) return (actual); /* Update counters */ actual += (long)block; leftToRead -= (long)thisRead; } } /* END loadImage */ /* * main : main routine of ramrom.c */ void main () { /* Local variables */ ULONG phys; FILE *ifl; char *fake_rom_p; static char imageName[128]; long int actSize; static char answer[4]; ULONG huge *tptr; ULONG i; /* * Allocate enough memory * for the ROM image */ fake_rom_p= farmalloc(FAKE_ROM_SIZE); phys = physAddr ( fake_rom_p ); /* * Force all the locations that * will not be filled during load * to have OxFF in them. This * mimics the actions of an * EPROM programming device. */ tptr=(ULONG * huge) fake_rom_p; for(i=0;i<(FAKE_ROM_SIZE/4);i++){ *tptr = 0xFFFFFFFF; tptr++; } /* Show address to user and tell user what to do with it */ printf("\n\nFake rom address:"); printf(" 0x%08lx\n",phys); printf("\nINSTRUCTIONS FOR "); printf("COMPLETING EMULATION\n"); printf("1. Go to development "); printf("system or window.\n"); printf("2. Perform the final "); printf("absolute link of the \n"); printf(" code specifying "); printf("0x%08lx\n",phys); printf(" as absolute address,"); printf(" instead of\n"); printf(" usual EPROM address.\n"); printf("3. Move final image to"); printf(" where it can be \n"); printf(" loaded by this "); printf(" debug program.\n"); printf("4. Enter image name.\n"); printf("5. Enter YES when you are"); printf(" ready to run.\n"); printf("\n=====================\n"); ifl = NULL; /* Load EPROM IMAGE */ while (ifl==NULL) { printf("\nEnter image name: "); (void) gets(imageName); ifl=fopen(imageName,"rb"); if (ifl==NULL) { perror(imageName); continue; } actSize= loadImage(ifl, fake_rom_p, FAKE_ROM_SIZE); if ( actSize < 1 ) { ifl = NULL; fclose(ifl); continue; } fclose(ifl); } /* while ifl==NULL */ printf("%lu bytes loaded",actSize); printf(" from %s\n", imageName); /* Run EPROM IMAGE */ /* * Note: If you set a breakpoint * right here, you can examine * your loaded EPROM IMAGE in * memory. */ printf("Run it? YES/NO: "); (void) gets( answer ); if (strcmp(answer,"YES")==0) { (void)(*((FUNCPTR)fake_rom_p)) (); } } /* END main() */ /* End of File */