Пример #1
0
Byte ext_read(ADDRESS adr){
	Byte d;
	Byte si;
	Byte m;
	int i;

	if (!(p1 & 0x08) && !(p1 & 0x40)) {
		/* Handle VDC Read */
		switch(adr) {
			case 0xA1:
				d = VDCwrite[0xA0] & 0x02;
				if (master_clk > VBLCLK) d = d | 0x08;
				if (h_clk < (LINECNT-7)) d = d | 0x01;
				if (sound_IRQ) d = d | 0x04;
				sound_IRQ=0;
				return d;
			case 0xA2:
				si = VDCwrite[0xA2];
				m=0x01;
				d=0;
				for(i=0; i<8; i++) {
					if (si & m) {
						if (coltab[1] & m) d = d | (coltab[1] & (m ^ 0xFF));
						if (coltab[2] & m) d = d | (coltab[2] & (m ^ 0xFF));
						if (coltab[4] & m) d = d | (coltab[4] & (m ^ 0xFF));
						if (coltab[8] & m) d = d | (coltab[8] & (m ^ 0xFF));
						if (coltab[0x10] & m) d = d | (coltab[0x10] & (m ^ 0xFF));
						if (coltab[0x20] & m) d = d | (coltab[0x20] & (m ^ 0xFF));
						if (coltab[0x80] & m) d = d | (coltab[0x80] & (m ^ 0xFF));
					}
					m = m << 1;
				}
				clear_collision();
				return d;
			case 0xA5:
				if (!(VDCwrite[0xA0] & 0x02)) {
					return x_latch;
				}
				else {
					x_latch = h_clk * 12;
					return x_latch;
				}			
			case 0xA4:
				if (!(VDCwrite[0xA0] & 0x02)) {
					return y_latch;
				}
				else {
					y_latch = master_clk/22;
					if (y_latch > 241) y_latch=0xFF;
					return y_latch;
				}
			default:
				return VDCwrite[adr];
		}
		} else if (!(p1 & 0x10)) {
		/* Handle ext RAM Read */
		if (app_data.megaxrom && (adr >= 0x80)) {
			/* MegaCART registers are mirrored every 4 bytes */
			if ((adr & 0x83) == 0x83) {
				/* TODO: emulate EEPROM data in */
				return 0xff;
			} else return extRAM[adr & 0x83];
		} else return extRAM[adr & 0xFF];
 	} else if (!(p1 & 0x20)) {
		/* Read a Videopac+ register */
		return vpp_read(adr);
	} else if (app_data.exrom && (p1 & 0x02)) {
		/* Handle read from exrom */
		return extROM[(p2 << 8) | (adr & 0xFF)];
	} else if (app_data.megaxrom && !(p1 & 0x02) && !(p1 & 0x40)) {
		/* Handle data read from MegaCART */
		return megarom[(extRAM[0x81] << 12) | ((p2 & 0x0f) << 8) | (adr & 0xff)];
 	}

	return 0;
}
Пример #2
0
/* read a value, final destination is base on p1 (controlled by write p1)*/
Byte ext_read(ADDRESS adr) {
	Byte d;
	Byte si;
	Byte m;
	int i;

	if (!(p1 & 0x08) && !(p1 & 0x40)) {
		/* Handle VDC Read */
		switch(adr) {
			case 0xA1:
				d = VDCwrite[0xA0] & 0x02;
				if (master_clk > VBLCLK) d = d | 0x08;
				if (h_clk < (LINECNT-7)) d = d | 0x01;
				if (sound_IRQ) d = d | 0x04;
				sound_IRQ=0;
				return d;
			case 0xA2:/* 0xA2 vdc_collision http://soeren.informationstheater.de/g7000/hardware.html */
				si = VDCwrite[0xA2];
				m = 0x01;
				d = 0;
				for(i=0; i<8; i++) {
					if (si & m) {
						if (coltab[1] & m) d = d | (coltab[1] & (m ^ 0xFF));
						if (coltab[2] & m) d = d | (coltab[2] & (m ^ 0xFF));
						if (coltab[4] & m) d = d | (coltab[4] & (m ^ 0xFF));
						if (coltab[8] & m) d = d | (coltab[8] & (m ^ 0xFF));
						if (coltab[0x10] & m) d = d | (coltab[0x10] & (m ^ 0xFF));
						if (coltab[0x20] & m) d = d | (coltab[0x20] & (m ^ 0xFF));
						if (coltab[0x80] & m) d = d | (coltab[0x80] & (m ^ 0xFF));
					}
					m = m << 1;
				}
				clear_collision();
				return d;
			case 0xA5:
				if (!(VDCwrite[0xA0] & 0x02)) {
					return x_latch;
				}
				else {
					x_latch = h_clk * 12;
					return x_latch;
				}
			case 0xA4:
				if (!(VDCwrite[0xA0] & 0x02)) {
					return y_latch;
				}
				else {
					y_latch = master_clk/22;
					if (y_latch > 241) y_latch=0xFF;
					return y_latch;
				}
			default:
				if (adr==0xA3 || adr==0xA6 || (adr>=0xA7 && adr<=0xA9) ||
						(adr>=0xAB && adr<=0xBF) || (adr>=0xC9 && adr<=0xCF) ||
						(adr>=0xD9  && adr <=0xDF) || (adr>=0xEA && adr<=0xFF))
					return adr; /* simulate write to unused registers */
				if ((VDCwrite[0xA0] & 0x20) && (adr<0x80))
					return (adr && 0x02)==0?0xFF:0x00; /* simulate returnvalues for 00-7F if VDC Control bit 5 is on */
				if ((VDCwrite[0xA0] & 0x08) && (adr>=0xC0) && (adr<=0xE9))
					return 0x00; /* simulate returnvalues for 00-7F if VDC Control bit 5 is on */
				return VDCwrite[adr];
		}
		} else if (!(p1 & 0x10)) {
		/* Handle ext RAM Read */
		if (app_data.megaxrom && (adr >= 0x80)) {
			/* MegaCART registers are mirrored every 4 bytes */
			if ((adr & 0x83) == 0x83) {
				/* TODO: emulate EEPROM data in */
				return 0xff;
			} else return extRAM[adr & 0x83];
		} else return extRAM[adr & 0xFF];
 	} else if (!(p1 & 0x20)) {
		/* Read a Videopac+ register */
		return vpp_read(adr);
	} else if (app_data.exrom && (p1 & 0x02)) {
		/* Handle read from exrom */
		return extROM[(p2 << 8) | (adr & 0xFF)];
	} else if (app_data.megaxrom && !(p1 & 0x02) && !(p1 & 0x40)) {
		/* Handle data read from MegaCART */
		printf("WARNING megarom use \n");
		return megarom[(extRAM[0x81] << 12) | ((p2 & 0x0f) << 8) | (adr & 0xff)];
 	}

	return 0;
}