typedef unsigned char byte;
typedef unsigned short word;

byte scankeyindex() {
	volatile byte* doa=(byte*)0x1204; /* Data Out A register van de PSD */
	volatile byte* da= (byte*)0x1206; /* Direction A register van de PSD */
	volatile byte* porte=(byte*)0x100a; /* Port E van de 68HC11 */
	volatile short wachten;
	byte keyindex, teller;
	
	*da=0x0f;
	*doa=0x0f;
	for (wachten=0; wachten<100; ++wachten);
	keyindex = 0;
	if ((*porte&0xe0)!=0x00) {
		// key found start scan:
		*doa=0x01;
		for (wachten=0;wachten<100;++wachten);
		for (teller=0; teller<4; ++teller) {
			if ((*porte&0xe0)!=0x00) {
				// key found
				if ((*porte&0x20)==0x20) keyindex+=1;
				else if ((*porte&0x40)==0x40) keyindex+=2;
				else if ((*porte&0x80)==0x80) keyindex+=3;
				break;
			}
			if (teller!=3) {
				*doa<<=1;
				for (wachten=0;wachten<100;++wachten);
				keyindex+=3;
			}
			else
				keyindex=0;
		}
	}
	return keyindex;
}

int main() {
	volatile byte* dob=(byte*)0x1205; /* Data Out B register van de PSD */
	volatile byte* db= (byte*)0x1207; /* Direction B register van de PSD */
	byte patroon[]={0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0xa8, 0x54, 0xfc, 0x01, 0x78, 0x02};
	*db=0xff; /* PPB0 t/m PPB7 output */
	
	while (1) {
		*dob=~patroon[scankeyindex()];
	}
	
	return 0;
} 
