// 30C
int iso_read(struct IoReadArg *args)
{
	if(g_is_ciso != 0) {
		// ciso decompess
		return read_cso_data(args->address, args->size, args->offset);
	} else {
		return read_raw_data(args->address, args->size, args->offset);
	}
}
// 790
int read_cso_sector(u8 *addr, int sector)
{
	int ret;
	int n_sector;
	u32 offset, next_offset;
	int size;

	n_sector = sector - g_CISO_cur_idx;

	// not within sector idx cache?
	if(g_CISO_cur_idx == -1 || n_sector < 0 || n_sector >= NELEMS(g_CISO_idx_cache)) {
		ret = read_raw_data((u8*)g_CISO_idx_cache, sizeof(g_CISO_idx_cache), (sector << 2) + sizeof(struct CISO_header));

		if(ret < 0) {
			ret = -4;
			printk("%s: -> %d\n", __func__, ret);

			return ret;
		}

		g_CISO_cur_idx = sector;
		n_sector = 0;
	}

	// loc_804
	offset = (g_CISO_idx_cache[n_sector] & 0x7FFFFFFF) << g_CISO_hdr.align;

	// is plain?
	if(g_CISO_idx_cache[n_sector] & 0x80000000) {
		// loc_968
		return read_raw_data(addr, ISO_SECTOR_SIZE, offset);
	}

	sector++;
	n_sector = sector - g_CISO_cur_idx;

	if(g_CISO_cur_idx == -1 || n_sector < 0 || n_sector >= NELEMS(g_CISO_idx_cache)) {
		ret = read_raw_data((u8*)g_CISO_idx_cache, sizeof(g_CISO_idx_cache), (sector << 2) + sizeof(struct CISO_header));

		if(ret < 0) {
			ret = -5;
			printk("%s: -> %d\n", __func__, ret);

			return ret;
		}

		g_CISO_cur_idx = sector;
		n_sector = 0;
	}

	// loc_858
	next_offset = (g_CISO_idx_cache[n_sector] & 0x7FFFFFFF) << g_CISO_hdr.align;
	size = next_offset - offset;
	
	if(g_CISO_hdr.align)
		size += 1 << g_CISO_hdr.align;

	if(size <= ISO_SECTOR_SIZE)
		size = ISO_SECTOR_SIZE;

	if(g_ciso_dec_buf_offset == (u32)-1 || offset < g_ciso_dec_buf_offset || offset + size >= g_ciso_dec_buf_offset + g_ciso_dec_buf_size) {
		// loc_93C
		ret = read_raw_data(g_ciso_dec_buf, size, offset);

		/* May not reach CISO_DEC_BUFFER_SIZE */	
		if(ret < 0) {
			// loc_95C
			g_ciso_dec_buf_offset = 0xFFF00000;
			ret = -6;
			printk("%s: -> %d\n", __func__, ret);

			return ret;
		}

		g_ciso_dec_buf_offset = offset;
		g_ciso_dec_buf_size = ret;
	}

	// loc_8B8
	ret = sceKernelDeflateDecompress(addr, ISO_SECTOR_SIZE, g_ciso_dec_buf + offset - g_ciso_dec_buf_offset, 0);

	return ret < 0 ? ret : ISO_SECTOR_SIZE;
}
int main(void)
{
	uint8_t token = 0U;

	SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);

	PSO_PeripheralEnable();
	PSO_GPIOConfig();
	PSO_UART0Config();


	IntMasterEnable();

    /* Timer initialization */
	PSO_Timers();

	while(1){


		if(GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)==0x00)
		{

			switch (token)
			{
				case 0:
					PSO_LEDRedOn();
				break;

				case 1:
					PSO_LEDGreenOn();
				break;

				case 2:
					PSO_LEDBlueOn();
				break;
				case 3:
					PSO_LEDCyanOn();
				break;

				case 4:
					PSO_LEDPurpleOn();
				break;

				case 5:
					PSO_LEDYellowOn();
				break;
				case 6:
					PSO_LEDWhiteOn();
				break;

				default:
					PSO_LEDAllOff();
			} /* switch */

			SysCtlDelay(100000);
			SysCtlDelay(100000);

			token++;

			if (token > 6)
			{
				token = 0;
			}

		} /* if */

		if(GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_0)==0x00)
		{
			PSO_LEDAllOff();
		}

		SysCtlDelay(100000);

		read_raw_data (&g_uart0_data);
		copy_raw_data (&g_tx_buffer_uart, &g_uart0_data);
		uart_write();
		uartBatchWrite (UART0_BASE, uart_tx_buffer, 10);
	}




}