//動作位置前進する
void CARIB8CharDecode::ActivePositionForward( int nCount )
{
	m_bPosInit = TRUE;

	WORD wPosX = m_wPosX;
	WORD wPosY = m_wPosY;
	while( --nCount >= 0 ){
		wPosX += GetCharDirSize();
		if( wPosX >= m_wClientX + m_wClientW ){
			//"表示領域の端を越えることとなる場合、動作位置を表示領域の逆の端へ移動"
			wPosX = m_wClientX;
			wPosY += GetLineDirSize();
			if( wPosY >= m_wClientY + m_wClientH ){
				wPosY = m_wClientY + GetLineDirSize() - 1;
			}
		}
	}

	if( wPosY != m_wPosY ){
		//改行を伴うときはこれまでの本文をリストに移す
		CheckModify();
		//行末まで文字繰り返しのときは繰り返しを終了する
		if( m_bRPC && m_wRPC >= 0x40 ){
			m_wRPC = 1;
		}
		m_wPosStartX = wPosX;
	}
	m_wPosX = wPosX;
	m_wPosY = wPosY;
#ifdef DDEBUG_OUT
	TCHAR debug[256];
	wsprintf(debug, TEXT(__FUNCTION__) TEXT("(): (px,py)=(%d,%d)\n"), m_wPosX, m_wPosY);
	DEBUG_OUT(debug);
#endif
}
Exemple #2
0
BOOL CARIB8CharDecode::Caption( const BYTE* pbSrc, DWORD dwSrcSize, vector<CAPTION_DATA>* pCaptionList )
{
	if( pbSrc == NULL || dwSrcSize == 0 || pCaptionList == NULL){
		return FALSE;
	}
	InitCaption();
	m_pCaptionList = pCaptionList;

	BOOL bRet = TRUE;
	DWORD dwReadCount = 0;
	while(dwReadCount<dwSrcSize){
		DWORD dwReadSize = 0;
		BOOL bRet = Analyze(pbSrc+dwReadCount, dwSrcSize-dwReadCount, &dwReadSize );
		if( bRet == TRUE ){
			if( m_strDecode.size() > 0 ){
				CheckModify();
			}
		}else{
			pCaptionList->clear();
			break;
		}
		m_strDecode = "";
		dwReadCount+=dwReadSize;
	}
	return bRet;
}
Exemple #3
0
void __fastcall TMDIChild::actSaveFileExecute(TObject *Sender)
{
    if(m_ActiveFileStruct == NULL)
        return;

    m_ActiveFileStruct->GetMemory()->Clear();
    m_HexEditor->SaveToStream(m_ActiveFileStruct->GetMemory());

    String fileName = m_WorkSpace->GetFileName();

    if(fileName == "")
    {
        if(InputQuery("输入文件名(不要加后缀)", "输入保存的文件名(不要加后缀)", fileName))
        {
            if(fileName.Pos("."))
                fileName = LeftString(fileName, ".");
            fileName += ".eggxp";
            m_WorkSpace->SetFileName(fileName);
        }
        else
            return;
    }

    //保存工作区
//	if(m_WorkSpace->GetPath() == "")
//	{
    if(NeedSaveReq)
        NeedSaveReq();
//	}

    if(m_WorkSpace->GetComment() == "" && m_HexEditor->DataSize >= 2)
    {
        //自动生成注释
        if(m_WorkSpace->GetComment() == "")
        {
            char	*pointer = m_HexEditor->GetFastPointer(0, m_HexEditor->DataSize);
            String comment = BinToStr(pointer, 2);
            m_WorkSpace->SetComment(comment);
            if(RefreshWorkSpaceReq)
                RefreshWorkSpaceReq();
        }
    }

    if(m_WorkSpace->IsNewFile())
    {
        if(m_WorkSpace->GetPath() == "")
            return;
        m_WorkSpace->SaveToFile(fileName);
    }
    else
    {
        m_WorkSpace->SaveToFile();
    }

    DoSetTabCaption();
    m_HexEditor->Modified = false;
    m_bTreeModify = false;
    CheckModify();
}
Exemple #4
0
void __fastcall TMDIChild::actDoXorExecute(TObject *Sender)
{
    //异或
    String key;
    if(InputQuery("输入Key", "输入Key", key) == false)
        return;

    int keyInt = key.ToIntDef(0);

    for(int i=0; i<m_HexEditor->DataSize; i++)
    {
        m_HexEditor->Data[i] = m_HexEditor->Data[i] ^ keyInt;
    }

    CheckModify();
    ParseData();
}
//戻り値がFALSEのときpCaptionListは中途半端に更新されているので、可能ならすべてを破棄する
BOOL CARIB8CharDecode::Caption( const BYTE* pbSrc, DWORD dwSrcSize, vector<CAPTION_DATA>* pCaptionList, CDRCMap* pDRCMap, WORD wInitSWFMode )
{
	if( pbSrc == NULL || dwSrcSize == 0 || pCaptionList == NULL || pDRCMap == NULL ){
		return FALSE;
	}
	m_bSpacing = FALSE;
	m_pCaptionList = pCaptionList;
	m_pDRCMap = pDRCMap;
	m_wSWFMode = m_wInitSWFMode = wInitSWFMode;
	InitCaption();

	DWORD dwReadSize = 0;
	BOOL bRet = Analyze( pbSrc, dwSrcSize, &dwReadSize );
	if( bRet == TRUE ){
		CheckModify();
	}
	return bRet;
}
Exemple #6
0
//---------------------------------------------------------------------
void			TMDIChild::LoadCurWork()
{
    if(m_ActiveFileStruct)
    {
        m_ActiveFileStruct->GetMemory()->Clear();
        m_HexEditor->SaveToStream(m_ActiveFileStruct->GetMemory());
    }

    m_ActiveFileStruct = m_WorkSpace->GetFileManager()->GetFileData(lvWorkSpace->ItemIndex);
    if(m_ActiveFileStruct == NULL)
        return;

    SetFileDescribe(m_ActiveFileStruct);

    m_HexEditor->LoadFromStream(m_ActiveFileStruct->GetMemory());

    m_HexEditor->Modified = false;
    RefreshStateBar();
    CheckModify();
    RefreshAllClassView();

    char	*pointer = m_HexEditor->GetFastPointer(0, m_HexEditor->DataSize);
    m_ParseTree->SetParseData(pointer, m_HexEditor->DataSize);
}
Exemple #7
0
BOOL CARIB8CharDecode::C1( const BYTE* pbSrc, DWORD* pdwReadSize )
{
	if( pbSrc == NULL || pdwReadSize == NULL ){
		return FALSE;
	}
	DWORD dwReadSize = 0;
	DWORD dwReadBuff = 0;

	BOOL bRet = TRUE;

	CheckModify();

	switch(pbSrc[0]){
	case 0x89:
		//MSZ 半角指定
		m_emStrSize = STR_MEDIUM;
		dwReadSize = 1;
		break;
	case 0x8A:
		//NSZ 全角指定
		m_emStrSize = STR_NORMAL;
		dwReadSize = 1;
		break;
	case 0x80:
		//BKF 文字黒
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x00;
		dwReadSize = 1;
		break;
	case 0x81:
		//RDF 文字赤
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x01;
		dwReadSize = 1;
		break;
	case 0x82:
		//GRF 文字緑
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x02;
		dwReadSize = 1;
		break;
	case 0x83:
		//YLF 文字黄
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x03;
		dwReadSize = 1;
		break;
	case 0x84:
		//BLF 文字青
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x04;
		dwReadSize = 1;
		break;
	case 0x85:
		//MGF 文字マゼンタ
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x05;
		dwReadSize = 1;
		break;
	case 0x86:
		//CNF 文字シアン
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x06;
		dwReadSize = 1;
		break;
	case 0x87:
		//WHF 文字白
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x07;
		dwReadSize = 1;
		break;
	case 0x88:
		//SSZ 小型サイズ
		m_emStrSize = STR_SMALL;
		dwReadSize = 1;
		break;
	case 0x8B:
		//SZX 指定サイズ
		if( pbSrc[1] == 0x60 ){
			m_emStrSize = STR_MICRO;
		}else if( pbSrc[1] == 0x41 ){
			m_emStrSize = STR_HIGH_W;
		}else if( pbSrc[1] == 0x44 ){
			m_emStrSize = STR_WIDTH_W;
		}else if( pbSrc[1] == 0x45 ){
			m_emStrSize = STR_W;
		}else if( pbSrc[1] == 0x6B ){
			m_emStrSize = STR_SPECIAL_1;
		}else if( pbSrc[1] == 0x64 ){
			m_emStrSize = STR_SPECIAL_2;
		}
		dwReadSize = 2;
		break;
	case 0x90:
		//COL 色指定
		if( pbSrc[1] == 0x20 ){
			dwReadSize = 3;
			m_bDefPalette = pbSrc[2]&0x0F;
		}else{
			switch(pbSrc[1]&0xF0){
				case 0x40:
					m_bCharColorIndex = pbSrc[1]&0x0F;
					break;
				case 0x50:
					m_bBackColorIndex = pbSrc[1]&0x0F;
					break;
				case 0x60:
					//未サポート
					break;
				case 0x70:
					//未サポート
					break;
				default:
					break;
			}
			dwReadSize = 2;
		}
		break;
	case 0x91:
		//FLC フラッシング制御
		if( pbSrc[1] == 0x40 ){
			m_bFlushMode = 1;
		}else if( pbSrc[1] == 0x47 ){
			m_bFlushMode = 2;
		}else if( pbSrc[1] == 0x4F ){
			m_bFlushMode = 0;
		}
		dwReadSize = 2;
		break;
	case 0x93:
		//POL パターン極性
		//未サポート
		dwReadSize = 2;
		break;
	case 0x94:
		//WMM 書き込みモード変更
		//未サポート
		dwReadSize = 2;
		break;
	case 0x95:
		//MACRO マクロ定義
		//未サポート
		{
		DWORD dwCount = 0;
		do{
			dwCount++;
		}while( pbSrc[dwCount] != 0x4F );
		dwReadSize = dwCount;
		}
		break;
	case 0x97:
		//HLC 囲み制御
		//未サポート
		dwReadSize = 2;
		break;
	case 0x98:
		//RPC 文字繰り返し
		//未サポート
		dwReadSize = 2;
		break;
	case 0x99:
		//SPL アンダーライン モザイクの終了
		m_bBold = FALSE;
		bRet = 2;
		dwReadSize = 1;
		break;
	case 0x9A:
		//STL アンダーライン モザイクの開始
		m_bBold = TRUE;
		dwReadSize = 1;
		break;
	case 0x9D:
		//TIME 時間制御
		CheckModify();
		if( pbSrc[1] == 0x20 ){
			m_dwWaitTime = pbSrc[2]-0x40;
			dwReadSize = 3;
		}else{
			DWORD dwCount = 0;
			do{
				dwCount++;
			}while( pbSrc[dwCount] != 0x43 && pbSrc[dwCount] != 0x40 && pbSrc[dwCount] != 0x41 && pbSrc[dwCount] != 0x42 );
			dwReadSize = dwCount;
		}
		break;
	case 0x9B:
		//CSI コントロールシーケンス
		if( CSI( pbSrc, &dwReadBuff ) == FALSE ){
			return FALSE;
		}
		dwReadSize = dwReadBuff;
		break;
	default:
		//未サポートの制御コード
		dwReadSize = 1;
		break;
	}

	*pdwReadSize = dwReadSize;

	return bRet;
}
Exemple #8
0
BOOL CARIB8CharDecode::C0( const BYTE* pbSrc, DWORD* pdwReadSize )
{
	if( pbSrc == NULL || pdwReadSize == NULL ){
		return FALSE;
	}

	DWORD dwReadSize = 0;
	DWORD dwReadBuff = 0;

	BOOL bRet = TRUE;

	switch(pbSrc[0]){
	case 0x20:
		//SP 空白
		//空白は文字サイズの影響あり
		if( IsSmallCharMode() == FALSE ){
			m_strDecode += " ";
		}else{
			m_strDecode += ' ';
		}
		dwReadSize = 1;
		break;
	case 0x0D:
		//APR 改行
		m_strDecode += "\r\n";
		dwReadSize = 1;
		break;
	case 0x0E:
		//LS1 GLにG1セット
		m_GL = &m_G1;
		dwReadSize = 1;
		break;
	case 0x0F:
		//LS0 GLにG0セット
		m_GL = &m_G0;
		dwReadSize = 1;
		break;
	case 0x19:
		//SS2 シングルシフト
		if( SS2( pbSrc+1, &dwReadBuff ) == FALSE ){
			return FALSE;
		}
		dwReadSize = 1+dwReadBuff;
		break;
	case 0x1D:
		//SS3 シングルシフト
		if( SS3( pbSrc+1, &dwReadBuff ) == FALSE ){
			return FALSE;
		}
		dwReadSize = 1+dwReadBuff;
		break;
	case 0x1B:
		//ESC エスケープシーケンス
		if( ESC( pbSrc+1, &dwReadBuff ) == FALSE ){
			return FALSE;
		}
		dwReadSize = 1+dwReadBuff;
		break;
	default:
		//未サポートの制御コード
		if( pbSrc[0] == 0x16 ){
			//PAPF
			dwReadSize = 2;
		}else if( pbSrc[0] == 0x1C ){
			//APS
			CheckModify();
			m_wPosY=m_wCharH*(pbSrc[1]-0x40);
			m_wPosX=m_wCharW*(pbSrc[2]-0x40);
			if( m_emStrSize == STR_SMALL || m_emStrSize == STR_MEDIUM ){
				m_wPosX=m_wPosX/2;
			}
			dwReadSize = 3;
		}else if( pbSrc[0] == 0x0C ){
			//CS
			dwReadSize = 1;
			CAPTION_DATA Item;
			Item.bClear = TRUE;
			Item.dwWaitTime = m_dwWaitTime*100;
			if( m_pCaptionList != NULL ){
				m_pCaptionList->push_back(Item);
			}
			bRet = 2;
			m_dwWaitTime = 0;
		}else{
			//APB、APF、APD、APU
			dwReadSize = 1;
		}
		break;
	}

	*pdwReadSize = dwReadSize;

	return bRet;
}
Exemple #9
0
void __fastcall TMDIChild::m_HexEditorChange(TObject *Sender)
{
    m_HexEditor->Modified = true;
    CheckModify();

}
Exemple #10
0
void			TMDIChild::SetModify()
{
    m_bTreeModify = true;
    CheckModify();
}
BOOL CARIB8CharDecode::C1( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize )
{
	if( dwSrcSize == 0 ){
		return FALSE;
	}
	DWORD dwReadSize = 0;
	DWORD dwReadBuff = 0;
	m_bSpacing = FALSE;

	if( pbSrc[0] != 0x7F ){
		//基本的に文字修飾に変更を伴うので本文をリストに移しておく
		CheckModify();
	}
	switch(pbSrc[0]){
	case 0x7F:
		//DEL 前景色空白
		m_strDecode += L'■';
		ActivePositionForward(1);
		m_bSpacing = TRUE;
		dwReadSize = 1;
		break;
	case 0x89:
		//MSZ 半角指定
		m_emStrSize = CP_STR_MEDIUM;
		dwReadSize = 1;
		break;
	case 0x8A:
		//NSZ 全角指定
		m_emStrSize = CP_STR_NORMAL;
		dwReadSize = 1;
		break;
	case 0x80:
		//BKF 文字黒
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x00;
		dwReadSize = 1;
		break;
	case 0x81:
		//RDF 文字赤
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x01;
		dwReadSize = 1;
		break;
	case 0x82:
		//GRF 文字緑
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x02;
		dwReadSize = 1;
		break;
	case 0x83:
		//YLF 文字黄
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x03;
		dwReadSize = 1;
		break;
	case 0x84:
		//BLF 文字青
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x04;
		dwReadSize = 1;
		break;
	case 0x85:
		//MGF 文字マゼンタ
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x05;
		dwReadSize = 1;
		break;
	case 0x86:
		//CNF 文字シアン
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x06;
		dwReadSize = 1;
		break;
	case 0x87:
		//WHF 文字白
		m_bCharColorIndex = (m_bDefPalette<<4) | 0x07;
		dwReadSize = 1;
		break;
	case 0x88:
		//SSZ 小型サイズ
		m_emStrSize = CP_STR_SMALL;
		dwReadSize = 1;
		break;
	case 0x8B:
		//SZX 指定サイズ
		if( dwSrcSize < 2 ) return FALSE;
		if( pbSrc[1] == 0x60 ){
			m_emStrSize = CP_STR_MICRO;
		}else if( pbSrc[1] == 0x41 ){
			m_emStrSize = CP_STR_HIGH_W;
		}else if( pbSrc[1] == 0x44 ){
			m_emStrSize = CP_STR_WIDTH_W;
		}else if( pbSrc[1] == 0x45 ){
			m_emStrSize = CP_STR_W;
		}else if( pbSrc[1] == 0x6B ){
			m_emStrSize = CP_STR_SPECIAL_1;
		}else if( pbSrc[1] == 0x64 ){
			m_emStrSize = CP_STR_SPECIAL_2;
		}
		dwReadSize = 2;
		break;
	case 0x90:
		//COL 色指定
		if( dwSrcSize < 2 ) return FALSE;
		if( pbSrc[1] == 0x20 ){
			if( dwSrcSize < 3 ) return FALSE;
			dwReadSize = 3;
			//規定によりパレットは0から127まで使われる
			m_bDefPalette = pbSrc[2]&0x07;
		}else{
			switch(pbSrc[1]&0xF0){
				case 0x40:
					m_bCharColorIndex = (m_bDefPalette<<4) | (pbSrc[1]&0x0F);
					break;
				case 0x50:
					m_bBackColorIndex = (m_bDefPalette<<4) | (pbSrc[1]&0x0F);
					break;
				case 0x60:
					//未サポート
					break;
				case 0x70:
					//未サポート
					break;
				default:
					break;
			}
			dwReadSize = 2;
		}
		break;
	case 0x91:
		//FLC フラッシング制御
		if( dwSrcSize < 2 ) return FALSE;
		if( pbSrc[1] == 0x40 ){
			m_bFlushMode = 1;
		}else if( pbSrc[1] == 0x47 ){
			m_bFlushMode = 2;
		}else if( pbSrc[1] == 0x4F ){
			m_bFlushMode = 0;
		}
		dwReadSize = 2;
		break;
	case 0x93:
		//POL パターン極性
		//未サポート
		if( dwSrcSize < 2 ) return FALSE;
		dwReadSize = 2;
		break;
	case 0x94:
		//WMM 書き込みモード変更
		//未サポート
		if( dwSrcSize < 2 ) return FALSE;
		dwReadSize = 2;
		break;
	case 0x95:
		//MACRO マクロ定義
		//未サポート(MACRO 0x4Fまで送る)
		dwReadSize = 2;
		do{
			if( ++dwReadSize > dwSrcSize ){
				return FALSE;
			}
		}while( pbSrc[dwReadSize-2] != 0x95 || pbSrc[dwReadSize-1] != 0x4F );
		break;
	case 0x97:
		//HLC 囲み制御
		if( dwSrcSize < 2 ) return FALSE;
		m_bHLC = pbSrc[1]&0x0F;
		dwReadSize = 2;
		break;
	case 0x98:
		//RPC 文字繰り返し
		if( dwSrcSize < 2 || m_bRPC ) return FALSE;
		m_bRPC = TRUE;
		m_wRPC = pbSrc[1]-0x40 == 0 ? 0xFF : pbSrc[1]-0x40;
		dwReadSize = 2;
		break;
	case 0x99:
		//SPL アンダーライン モザイクの終了
		m_bBold = FALSE;
		dwReadSize = 1;
		break;
	case 0x9A:
		//STL アンダーライン モザイクの開始
		m_bBold = TRUE;
		dwReadSize = 1;
		break;
	case 0x9D:
		//TIME 時間制御
		if( dwSrcSize < 3 ) return FALSE;
		if( pbSrc[1] == 0x20 ){
			m_dwWaitTime += (pbSrc[2]-0x40) * 100;
			dwReadSize = 3;
		}else{
			//未サポート
			dwReadSize = 1;
			do{
				if( ++dwReadSize > dwSrcSize ){
					return FALSE;
				}
			}while( pbSrc[dwReadSize-1] < 0x40 || 0x43 < pbSrc[dwReadSize-1] );
		}
		break;
	case 0x9B:
		//CSI コントロールシーケンス
		if( CSI( pbSrc+1, dwSrcSize-1, &dwReadBuff ) == FALSE ){
			return FALSE;
		}
		dwReadSize = 1+dwReadBuff;
		break;
	default:
		//未サポートの制御コード
		dwReadSize = 1;
		break;
	}

	*pdwReadSize = dwReadSize;

	return TRUE;
}
BOOL CARIB8CharDecode::C0( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize )
{
	if( dwSrcSize == 0 ){
		return FALSE;
	}

	DWORD dwReadSize = 0;
	DWORD dwReadBuff = 0;
	m_bSpacing = FALSE;

	switch(pbSrc[0]){
	case 0x20:
		//SP 背景色空白
		m_strDecode += L' ';
		ActivePositionForward(1);
		m_bSpacing = TRUE;
		dwReadSize = 1;
		break;
	case 0x0D:
		//APR 改行
		CheckModify();
		m_bPosInit = TRUE;
		m_wPosX = m_wClientX;
		m_wPosY += GetLineDirSize();
		if( m_wPosY >= m_wClientY + m_wClientH ){
			m_wPosY = m_wClientY + GetLineDirSize() - 1;
		}
		m_wPosStartX = m_wPosX;
		dwReadSize = 1;
		break;
	case 0x0E:
		//LS1 GLにG1セット
		m_GL = &m_G1;
		dwReadSize = 1;
		break;
	case 0x0F:
		//LS0 GLにG0セット
		m_GL = &m_G0;
		dwReadSize = 1;
		break;
	case 0x19:
		//SS2 シングルシフト
		//G2で呼ぶ(マクロ展開を考慮してGLは入れ替えない)
		if( GL_GR( pbSrc+1, dwSrcSize-1, &dwReadBuff, &m_G2 ) == FALSE ){
			return FALSE;
		}
		dwReadSize = 1+dwReadBuff;
		break;
	case 0x1D:
		//SS3 シングルシフト
		//G3で呼ぶ(マクロ展開を考慮してGLは入れ替えない)
		if( GL_GR( pbSrc+1, dwSrcSize-1, &dwReadBuff, &m_G3 ) == FALSE ){
			return FALSE;
		}
		dwReadSize = 1+dwReadBuff;
		break;
	case 0x1B:
		//ESC エスケープシーケンス
		if( ESC( pbSrc+1, dwSrcSize-1, &dwReadBuff ) == FALSE ){
			return FALSE;
		}
		dwReadSize = 1+dwReadBuff;
		break;
	case 0x08:
		//APB 動作位置後退
		{
			CheckModify();
			m_bPosInit = TRUE;
			WORD wDirX = GetCharDirSize();
			if( m_wPosX < m_wClientX + wDirX ){
				WORD wDirY = GetLineDirSize();
				m_wPosX = m_wClientX + m_wClientW / wDirX * wDirX;
				if( m_wPosY < m_wClientY + wDirY*2-1 ){
					m_wPosY = m_wClientY + (m_wClientH/wDirY+1) * wDirY - 1;
				}
				m_wPosY -= wDirY;
			}
			m_wPosX -= wDirX;
			m_wPosStartX = m_wPosX;
			dwReadSize = 1;
		}
		break;
	case 0x09:
		//APF 動作位置前進
		CheckModify();
		ActivePositionForward(1);
		//文字出力がないのでm_wPosStartXを更新しないと進行に矛盾がおこる
		m_wPosStartX = m_wPosX;
		dwReadSize = 1;
		break;
	case 0x0A:
		//APD 動作行前進
		CheckModify();
		m_bPosInit = TRUE;
		m_wPosY += GetLineDirSize();
		if( m_wPosY >= m_wClientY + m_wClientH ){
			m_wPosY = m_wClientY + GetLineDirSize() - 1;
		}
		m_wPosStartX = m_wPosX;
		dwReadSize = 1;
		break;
	case 0x0B:
		//APU 動作行後退
		{
			CheckModify();
			m_bPosInit = TRUE;
			WORD wDirY = GetLineDirSize();
			if( m_wPosY < m_wClientY + wDirY*2-1 ){
				m_wPosY = m_wClientY + (m_wClientH/wDirY+1) * wDirY - 1;
			}
			m_wPosY -= wDirY;
			m_wPosStartX = m_wPosX;
			dwReadSize = 1;
		}
		break;
	case 0x16:
		//PAPF 指定動作位置前進
		if( dwSrcSize < 2 ){
			return FALSE;
		}
		CheckModify();
		ActivePositionForward(pbSrc[1] - 0x40);
		m_wPosStartX = m_wPosX;
		dwReadSize = 2;
		break;
	case 0x1C:
		//APS 動作位置指定
		if( dwSrcSize < 3 ){
			return FALSE;
		}
		CheckModify();
		m_bPosInit = TRUE;
		//動作位置基準点は左下なので1行前進しておく(参考:mark10als)
		m_wPosY = m_wClientY + GetLineDirSize() * (pbSrc[1] - 0x40 + 1) - 1;
		m_wPosX = m_wClientX + GetCharDirSize() * (pbSrc[2] - 0x40);
		m_wPosStartX = m_wPosX;
		dwReadSize = 3;
		break;
	case 0x0C:
		//CS
		{
			dwReadSize = 1;
			CheckModify();
			CAPTION_DATA Item;
			Item.bClear = TRUE;
			Item.dwWaitTime = m_dwWaitTime;
			m_pCaptionList->push_back(Item);

			m_wSWFMode = m_wInitSWFMode;
			InitCaption();
		}
		break;
	default:
		dwReadSize = 1;
		break;
	}

	*pdwReadSize = dwReadSize;

	//DEBUG_OUT(pbSrc[0]==0x0E ? TEXT(__FUNCTION__) TEXT("(): GL<-G1\n") :
	//          pbSrc[0]==0x0F ? TEXT(__FUNCTION__) TEXT("(): GL<-G0\n") : NULL);
	return TRUE;
}
BOOL CARIB8CharDecode::CSI( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize )
{
	DWORD dwReadSize = 0;

	//中間文字0x20まで移動
	WORD wP1 = 0;
	WORD wP2 = 0;
	int nParam = 0;
	for( ; dwReadSize+1<dwSrcSize; dwReadSize++ ){
		if( pbSrc[dwReadSize] == 0x20 ){
			if( nParam==0 ){
				wP1 = wP2;
			}
			nParam++;
			break;
		}else if( pbSrc[dwReadSize] == 0x3B ){
			if( nParam==0 ){
				wP1 = wP2;
				wP2 = 0;
			}
			nParam++;
		}else if( 0x30<=pbSrc[dwReadSize] && pbSrc[dwReadSize]<=0x39 ){
			if( nParam<=1 ){
				wP2 = wP2*10+(pbSrc[dwReadSize]&0x0F);
			}
		}
	}
	//終端文字に移動
	if( ++dwReadSize >= dwSrcSize ){
		return FALSE;
	}

	switch(pbSrc[dwReadSize]){
		case 0x53:
			//SWF
			if( nParam==1 ){
				m_wSWFMode = wP1;
			}else{
				//未サポート
			}
			if( InitCaption() == FALSE ){
				return FALSE;
			}
			break;
		case 0x6E:
			//RCS
			m_bRasterColorIndex = (BYTE)(wP1&0x7F);
			break;
		case 0x61:
			//ACPS
			m_wPosStartX = m_wPosX = wP1;
			if( nParam>=2 ){
				m_wPosY = wP2;
			}
			break;
		case 0x56:
			//SDF
			m_wClientW = wP1;
			if( nParam>=2 ){
				m_wClientH = wP2;
			}
			break;
		case 0x5F:
			//SDP
			m_wClientX = wP1;
			if( nParam>=2 ){
				m_wClientY = wP2;
			}
			if( m_bPosInit == FALSE ){
				m_wPosStartX = m_wPosX = m_wClientX;
				m_wPosY = m_wClientY + GetLineDirSize() - 1;
			}
			break;
		case 0x57:
			//SSM
			m_wCharW = wP1;
			if( nParam>=2 ){
				m_wCharH = wP2;
			}
			if( m_bPosInit == FALSE ){
				m_wPosY = m_wClientY + GetLineDirSize() - 1;
			}
			break;
		case 0x58:
			//SHS
			m_wCharHInterval = wP1;
			break;
		case 0x59:
			//SVS
			m_wCharVInterval = wP1;
			break;
		case 0x42:
			//GSM
			//未サポート
			break;
		case 0x5D:
			//GAA
			//未サポート
			break;
		case 0x5E:
			//SRC
			//未サポート
			break;
		case 0x62:
			//TCC
			//未サポート
			break;
		case 0x65:
			//CFS
			//未サポート
			break;
		case 0x63:
			//ORN
			if( wP1 == 0x02 ){
				m_bShadow = TRUE;
			}
			break;
		case 0x64:
			//MDF
			if( wP1 == 0 ){
				m_bBold = FALSE;
				m_bItalic = FALSE;
			}else if( wP1 == 1 ){
				m_bBold = TRUE;
			}else if( wP1 == 2 ){
				m_bItalic = TRUE;
			}else if( wP1 == 3 ){
				m_bBold = TRUE;
				m_bItalic = TRUE;
			}
			break;
		case 0x66:
			//XCS
			//未サポート
			break;
		case 0x68:
			//PRA
			m_bPRA = (BYTE)(wP1 + 1);
			CheckModify(TRUE);
			m_bPRA = 0;
			break;
		case 0x54:
			//CCC
			//未サポート
			break;
		case 0x67:
			//SCR
			//未サポート
			break;
		default:
			break;
	}
	dwReadSize++;

	*pdwReadSize = dwReadSize;

	return TRUE;
}