mirror of
				https://github.com/RaySollium99/picodrive.git
				synced 2025-10-27 21:48:50 +01:00 
			
		
		
		
	 1c88b865ce
			
		
	
	
		1c88b865ce
		
	
	
	
	
		
			
			git-svn-id: file:///home/notaz/opt/svn/PicoDrive@186 be3aeb3a-fb24-0410-a615-afba39da0efa
		
			
				
	
	
		
			119 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <time.h>
 | |
| 
 | |
| 
 | |
| static FILE *f;
 | |
| 
 | |
| #define bswap16(x) (x=(unsigned short)((x<<8)|(x>>8)))
 | |
| #define bswap32(x) (x=((x<<24)|((x<<8)&0xff0000)|((x>>8)&0x00ff00)|((unsigned)x>>24)))
 | |
| 
 | |
| static void write_op(unsigned short op, unsigned short word0, unsigned short word1, unsigned short word2)
 | |
| {
 | |
| 	bswap16(op);
 | |
| 	bswap16(word0);
 | |
| 	bswap16(word1);
 | |
| 	bswap16(word2);
 | |
| 
 | |
| 	fwrite(&op,    1, sizeof(op), f);
 | |
| 	fwrite(&word0, 1, sizeof(word0), f);
 | |
| 	fwrite(&word1, 1, sizeof(word1), f);
 | |
| 	fwrite(&word2, 1, sizeof(word2), f);
 | |
| }
 | |
| 
 | |
| static void write32(unsigned int a)
 | |
| {
 | |
| 	bswap32(a);
 | |
| 	fwrite(&a,     1, sizeof(a),  f);
 | |
| }
 | |
| 
 | |
| static int op_check(unsigned short op)
 | |
| {
 | |
| 	if ((op&0xf000) == 0x6000) return 0; // Bxx
 | |
| 	if ((op&0xf0f8) == 0x50c8) return 0; // DBxx
 | |
| 	if ((op&0xff80) == 0x4e80) return 0; // Jsr
 | |
| 	if ((op&0xf000) == 0xa000) return 0; // a-line
 | |
| 	if ((op&0xf000) == 0xf000) return 0; // f-line
 | |
| 	if ((op&0xfff8)==0x4e70&&op!=0x4e71&&op!=0x4e76) return 0; // reset, rte, rts
 | |
| 
 | |
| 	if ((op&0x3f) >= 0x28) op = (op&~0x3f) | (rand() % 0x28);
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static unsigned short safe_rand(void)
 | |
| {
 | |
| 	unsigned short op;
 | |
| 
 | |
| 	/* avoid branch opcodes */
 | |
| 	do
 | |
| 	{
 | |
| 		op = rand();
 | |
| 	}
 | |
| 	while (!op_check(op));
 | |
| 
 | |
| 	return op;
 | |
| }
 | |
| 
 | |
| int main()
 | |
| {
 | |
| 	int i, op;
 | |
| 
 | |
| 	srand(time(0));
 | |
| 
 | |
| 	f = fopen("test_misc2.bin", "wb");
 | |
| 	if (!f) return 1;
 | |
| 
 | |
| 	write32(0x00ff8000); // stack
 | |
| 	write32(0x300); // IP
 | |
| 
 | |
| 	for (i=0x100/4-2; i; i--)
 | |
| 	{
 | |
| 		write32(0x200+i*4); // exception vectors
 | |
| 	}
 | |
| 
 | |
| 	for (i=0x100/4; i; i--)
 | |
| 	{
 | |
| 		write32(0); // pad
 | |
| 	}
 | |
| 
 | |
| 	for (i=0x100/4; i; i--)
 | |
| 	{
 | |
| 		write32(0x4e734e73); // fill with rte instructions
 | |
| 	}
 | |
| 
 | |
| 	for (op = 0; op < 0x10000; op++)
 | |
| 	{
 | |
| 		if ((op&0xf000) == 0x6000) // Bxx
 | |
| 		{
 | |
| 			if ((op&0x00ff) == 0)
 | |
| 				write_op(op, 6, 0, 0);
 | |
| 		}
 | |
| 		else if ((op&0xf0f8)==0x50c8) // DBxx
 | |
| 		{
 | |
| 			write_op(op, 6, 0, 0);
 | |
| 		}
 | |
| 		else if ((op&0xff80)==0x4e80) // Jsr
 | |
| 		{
 | |
| 			int addr = 0x300 + op*8 + 8;
 | |
| 			if ((op&0x3f) == 0x39)
 | |
| 				write_op(op, addr >> 16, addr & 0xffff, 0);
 | |
| 		}
 | |
| 		else if ((op&0xf000)==0xa000 || (op&0xf000)==0xf000) // a-line, f-line
 | |
| 		{
 | |
| 			if (op != 0xa000 && op != 0xf000) continue;
 | |
| 		}
 | |
| 		else if ((op&0xfff8)==0x4e70&&op!=0x4e71&&op!=0x4e76); // rte, rts, stop, reset
 | |
| 		else
 | |
| 		{
 | |
| 			write_op(op, safe_rand(), safe_rand(), safe_rand());
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// jump to the beginning
 | |
| 	write_op(0x4ef8, 0x300, 0x4ef8, 0x300);
 | |
| 	write_op(0x4ef8, 0x300, 0x4ef8, 0x300);
 | |
| 
 | |
| 	fclose(f);
 | |
| 	return 0;
 | |
| }
 | |
| 
 |