- (void)drawCF:(unsigned char)x code:(unsigned char)h
{
	int i,j;
	int c = 0;
	int f = 0;
	int cf = (h & 0x0F);
	int nc = (h >> 7);		// No Ceiling Flag
	unsigned char areaType;
	unsigned char bg,c1,c2,f1,f2,bt;
	
	if (cf < 8) {
		c = 1;
		f = cf+2;
	}
	
	if ((cf >= 8) && (cf < 0x0F)) {
		c = cf-6;
		f = 2;
	}
	
	// Should use tileLayers array //
	
	unsigned int layers[8] = { 0x4153 , 0x4153 , 0x8153 , 0x8153 , 0xC61F , 0x10153 , 0 , 0 };
	
	areaType = areaData[cw][cd][2];
	areaType &= 0x70;
	areaType >>= 4;
	ptr = [rom bytes] + layers[cw] + (areaType * 9) + 0x10;
	bg = *(ptr + 0);
	c1 = *(ptr + 7);
	c2 = *(ptr + 6);
	f1 = *(ptr + 3);
	f2 = *(ptr + 7);
	bt = *(ptr + 8);
	
	for (j=x; j<[self numberOfColumns]; j++) {
		
		for (i=0; i<[self numberOfRows]; i++) {
			[[self cellAtRow:i column:j] setImage:[tiles objectAtIndex:bg]];
		}
		
		for (i=0; i<c; i++) {
			if ((i+1) < c) [[self cellAtRow:i column:j] setImage:[tiles objectAtIndex:c1]];
			else [[self cellAtRow:i column:j] setImage:[tiles objectAtIndex:c2]];
		}
		
		for (i=0; i<f; i++) {
			if ((i+1) == f) [[self cellAtRow:12-i column:j] setImage:[tiles objectAtIndex:f1]];
			else [[self cellAtRow:12-i column:j] setImage:[tiles objectAtIndex:f2]];
		}
		
		if (nc == 1) {
			for (i=0; i<2; i++) {
				[[self cellAtRow:i column:j] setImage:[tiles objectAtIndex:bg]];
			}
		}
		
		// Bottom Row //
		
		[[self cellAtRow:0xC column:j] setImage:[tiles objectAtIndex:bt]];
	}
	
	if (cf == 0x0F) {		// Fill with wall...
		for (i=0; i<[self numberOfRows]; i++) {
			for (j=x; j<[self numberOfColumns]; j++) {
				[[self cellAtRow:i column:j] setImage:[tiles objectAtIndex:c1]];
			}
		}
	}
	
	/* Bottom Row //
	
	for (i=0; i<0x40; i++) {
		if ([tiles indexOfObject:[[self cellAtRow:0xC column:i] image]] == 0x89) continue;	// Exception for Water or Lava (priority should be corrected)
		[[self cellAtRow:0xC column:i] setImage:[tiles objectAtIndex:bt]];
	}*/
}