/* UBYTE SCD_DirectTx;*/ UBYTE SCD_DebugSwitch = 0;/*By Y.Suzuki 1998/01/20*/ void SCDC_MTxCodeConvertTask(void) /* void SCDC_G3_MemTx(void) */ { #if (PRO_COM_CODEC_TYPE == SOFTWARE) struct CdcBlk_t encdata,*Sedp; struct CdcBlk_t decdata,*Sddp; UBYTE reduce_f; UBYTE mode_skip,n; UBYTE stop_on; WORD status; UBYTE next_line_no; UBYTE first_line_encode; /* TTIを除く画データの先頭行をエンコードする直前まで1 */ /* RLバッファ */ struct WorkBuf_t *a_buf; struct WorkBuf_t *b_buf; struct WorkBuf_t *c_buf; struct WorkBuf_t *tmp; struct reduction_t reduc_data,*rp; UWORD tsk_sw_line_no; UBYTE print_on; UBYTE scan_on; UBYTE panel_on; rp = &reduc_data; status = 0;/* OK */ stop_on = 0; tsk_sw_line_no = 0; /* SCD_Debg_line_no = 0; */ next_line_no = 0; print_on = 0; scan_on= 0; panel_on = 0; first_line_encode = 1; /* By Y.Suzuki 1997/08/25 */ /** コーデック初期化 */ ScdcErrFlag = 0; Sedp = &encdata; Sddp = &decdata; CodecPageStatus = CDC_READY; EncodeDataCount = 0; Sedp->BufMode = ECM_BUF; Sddp->BufMode = MEM1; SoftEncodeInitial(Sedp); SoftDecodeInitial(Sddp); SCD_EOL_WriteCount = 0; /* By Y.Suzuki 1997/04/14 */ if (SCD_DebugSwitch) { SCD_SkipMrEol = 0; /* By Y.Suzuki 1998/1/20 */ } /* タスクスイッチ調整用メンテナンスSW−Fをコピーする By Y.Suzuki 1997/10/17 */ CopyFromMantSwF(); /** RLバッファアドレスセット */ /*EncRlBufInit(Sedp->Img_Size);縮小の場合もSrcのイメージサイズで初期化*/ /*------3本のバッファを初期化する EncRlBufInit(Sddp->Img_Size); DecRlBufInit(Sddp->Img_Size); --------*/ RlBufInit(Sddp->Img_Size); a_buf = &RL1; b_buf = &RL2; c_buf = &RL3; /* SCD 大域変数ヘ移動 By Y.Suzuki 1997/03/07 */ SCD_TxMode = TxMode; /* ダイレクト送信有無 By Y.Suzuki 1997/02/14 */ SCD_CheckDirectTx(); if (SCD_DirectTx) { Sddp->Wp = Sedp->Wp; Sddp->Wp->Buf = Sedp->Wp->Buf; Sddp->Wp->Adr = Sedp->Wp->Adr; Sddp->Wp->Bit = Sedp->Wp->Bit; } /** 縮小制御 */ mode_skip = GetModeSkip(SYS_DocBlock.Src.Mode,SYS_DocBlock.Dst.Mode); reduce_f = SetReduce(&(SYS_DocBlock.Src), &(SYS_DocBlock.Dst)); if(reduce_f == 1) { SetSkip(A3_TO_A4,rp); } else if(reduce_f == 2) { SetSkip(A3_TO_B4,rp); } else if(reduce_f == 3) { SetSkip(B4_TO_A4,rp); } else { SetSkip(100,rp); } CodecPageStatus = CDC_CONTINUE; /** 初期化 By Y.Suzuki 1997/09/19 */ /** キャラクタ送信 */ if(FCM_PtnrChkTTI_TxAvailable() == TTI_TX_AVAILABLE) {/** TTI送信あり */ SF_ECM_CharTx(Sedp,a_buf,b_buf); /* 参照ラインのクリア By Y.Suzuki 1997/08/26 */ a_buf->Cout = 0; b_buf->Cout = 0; c_buf->Cout = 0; PutRL(a_buf,Sddp->Img_Size,0); PutRL(b_buf,Sddp->Img_Size,0); PutRL(c_buf,Sddp->Img_Size,0); #if(0) /* By Y.Suzuki 1997/08/26 */ tmp = c_buf; c_buf = a_buf; a_buf = tmp; #endif /* CodecPageStatus = CDC_CONTINUE;ここでは、遅い T3.1 になることがある */ /* メモリ読み出し DMA 256 単位でよいか? */ /* if (CHK_UNI_TTI_Inside() == TTI_INSIDE) [* USA以外のため 96/05/16 By T.Yamaguchi */ if ((CHK_UNI_TTI_Inside() == TTI_INSIDE) || (CommandFileOptionItem == SYS_CIPHER_TX)) { /* スクランブル送信時TTIアウトサイドにすると元に戻らない。By Y.Suzuki 1998/04/23 */ /* 16ラインデコード読み飛ばし */ if(SCD_DirectTx == 1) { /* TTIインサイドのときは、ダイレクト送信できない By Y.Suzuki 1997/08/13 */ SCD_DirectTx = 0; } n = (UBYTE)(16 * ModePara(SYS_DocBlock.Src.Mode)); if (n > 64) {/* By Y.Suzuki 1997/08/28 */ n = 64; } while (n--) { /* dst -> src に変更 Mar 26 '93 */ /* Caution! a_bufをデコード用,b_bufを参照用として使用する */ status = Mem_Decode(Sddp,c_buf,a_buf); if(SCD_DBG_RLOVER == 2) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x04; } tmp = a_buf; a_buf = c_buf; c_buf = tmp; } } } /* By Y.Suzuki 1997/10/17 * if (SYS_FaxComTxType == SYS_SCANNER_TX) { * EcmBufferBaseWritePoint = 0x1000000 + Sedp->Wp->Adr; * return; * } */ /* コーデックステータス とりあえず By Y.Suzuki 1996/07/04 */ /* CodecPageStatus = CDC_CONTINUE; * 初期化 */ n = 0; do { /*1ラインごとの処理。RTC検出までループ*/ if (SCD_DebugSwitch) {/*By Y.Suzuki 1998/01/20*/ if (!SCD_SkipMrEol) { tmp = c_buf; c_buf = b_buf; b_buf = a_buf; a_buf = tmp; } } else { tmp = c_buf; c_buf = b_buf; b_buf = a_buf; a_buf = tmp; } /* 停止キー確認、極性反転チェック */ /* if (SYS_FaxComStopSwitch() == 1) [ * ストップSwONの時 */ if (MDM_TxStopSwFlag == 1) { /** ストップSwONの時 */ stop_on = 1; CodecPageStatus = CDC_STOPPED; break; } if (n != 1) {/* EFINE --> FINE への縮小ではない */ n = mode_skip; } /* 自動タスクスイッチ時間調節の処理 By Y.Suzuki 1997/08/13 */ /* パネル使用中追加 By Y.Suzuki 1997/10/08 */ #if (0) ** scan_on = CMN_CheckScanEnable(); ** panel_on = CMN_CheckPanelBusy(); ** タスク id を直接参照 By Y.Suzuki 1997/12/04 #endif print_on = CMN_CheckPrinting(); if (tskno_SCN_DocumentStoreTask != 0xFFFF) { scan_on = TRUE; } else { scan_on = 0; } if (tskno_OPR_KeyTimerTask != 0xFFFF) { panel_on = TRUE; } else { panel_on = 0; } if ((print_on == TRUE) && (scan_on == TRUE)) { #if (PRO_CODEC_NUMBER == CDC_SINGLE) /* By Y.Suzuki 1997/12/05 */ /* ポプラLでB4−A4の縮小G3送信+コピープリント+コピースキャンでエラーラインがあったので By Y.Suzuki 1997/12/05 */ SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 80; #else SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 60; #endif } else if ((print_on == TRUE) || (scan_on == TRUE)) { SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 30; } else { if (panel_on) { SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 15; } else { SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 0; } } if (reduce_f) { #if (PRO_CODEC_NUMBER == CDC_SINGLE) /* By Y.Suzuki 1997/12/05 */ /* ポプラLでB4−A4の縮小G3送信+コピープリント+コピースキャンでエラーラインがあったので By Y.Suzuki 1997/12/05 */ SCD_MaintenanceSwitch[SCD_MNT_SW_F2] += 40; #else SCD_MaintenanceSwitch[SCD_MNT_SW_F2] += 30; #endif } if (!SCD_DirectTx) { do { do { /** 1ラインデコード */ /* Caution! a_bufをデコード用,b_bufを参照用として使用する */ status = Mem_Decode(Sddp,a_buf,b_buf); if(SCD_DBG_RLOVER == 2) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x04; } /*For Debug By Y.Suzuki 1998/01/20*/ if ((status == TX_MEM_ERR) && (SYS_DocBlock.Src.Code == SYS_MR_CODE) && SCD_DebugSwitch) { SCD_SkipMrEol = 1; PutRL(a_buf,Sddp->Img_Size,0); /* RLバッファ全白クリア By Y.Suzuki 1997/09/30 */ continue;/* By Y.Suzuki 1997/02/17 */ } if ((status == TX_MEM_ERR) && (SYS_DocBlock.Src.Code == SYS_MMR_CODE)) { CodecPageStatus = CDC_DECODE_ERROR; ScdcErrFlag = 1; status = RTC; break; } if (status == RTC) { break; } if(n && ReductionFromR12 != 2) {/** モード変更による副走査間引き処理 */ tmp = a_buf; a_buf = b_buf; b_buf = tmp; } else if (ReductionFromR12 == 2 && n == 2) {/* EFINEからFINEへの縮小あり 11.55-->7.7 */ n--; break; } else if (n) { tmp = a_buf; a_buf = b_buf; b_buf = tmp; } }while(n--); if(!reduce_f){ break; } else if (reduce_f == 6) {/** HFINEからのモード変更のみあり By Y.Suzuki 1997/01/17 */ RedLine(Sddp,b_buf,reduce_f); if(SCD_DBG_OldRlSize) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 1; } if(SCD_DBG_RLOVER == 4) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x10; } break; } else if (reduce_f == R12_TO_R8) {/** R12からR8のモード変更のみあり By Y.Suzuki 1997/11/13 */ RedLineR12ToR8(Sddp,b_buf,reduce_f); if(SCD_DBG_OldRlSize) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 1; } if(SCD_DBG_RLOVER == 4) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x10; } break; } else if(!Skip(rp)){/** 主走査縮小による副走査間引き処理 */ /** 主走査縮小 */ #if (0) /* By Y.Suzuki 1997/01/16 */ if (ReductionFromHfine) {/* R16 --> R8 の縮小を行う。縮小率50% By Y.Suzuki 1997/01/16 */ RedLine(Sddp,b_buf,reduce_f); } #endif if (ReductionFromR12) {/* R12からの縮小あり By Y.Suzuki 1997/11/13 */ RedLineR12ToR8(Sddp,b_buf,reduce_f); } else { RedLine(Sddp,b_buf,reduce_f); } if(SCD_DBG_OldRlSize) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 1; } if(SCD_DBG_RLOVER == 4) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x10; } break; } if (status == RTC) { next_line_no = 1; break; } tmp = a_buf; a_buf = b_buf; b_buf = tmp; if (n != 1) {/* EFINE --> FINE への縮小ではない */ n = mode_skip; } }while(1); /* ECMWrite()内で256バイトに1msタスク切替えする By Y.Suzuki 1996/08/23 */ /** タスクスイッチング 5ms 100ライン毎 で256バイトデータがそろった場合 */ #if(0) // /* if((++tsk_sw_line_no > 10) && TxStartFlag) [ By Y.Suzuki 1996/08/16 */ // if((++tsk_sw_line_no > 10) && SCD_DirectTx) {/* 復活 By Y.Suzuki 1997/08/13 */ // /* ダイレクト送信時タスクスイッチ用 */ // tsk_sw_line_no = 0; /* By Y.Suzuki 1996/07/06 */ // /* if((++SCD_Debg_line_no > 10) && TxStartFlag) [ // SCD_Debg_line_no = 0; */ // if (SYB_MaintenanceSwitch[MNT_SW_F2]) { // wai_oneshot(SYB_MaintenanceSwitch[MNT_SW_F2]); // } // else { // wai_oneshot(5); // } // } #endif if (next_line_no) {/* 縮小送信のRTC検出時、最後のラインが読み飛ばしのとき */ break; } /** 1ラインエンコード */ /* Caution! enc_rl_aをエンコード用,enc_rl_bを参照用として使用する */ SCD_EOL_WriteCount++; /* By Y.Suzuki 1997/04/14 */ if (reduce_f && first_line_encode) {/* 縮小送信時の参照ライン をセット By Y.Suzuki 1997/08/25 */ c_buf->Cout = 0; PutRL(c_buf,Sedp->Img_Size,0); first_line_encode = 0; } Ecm_Encode(Sedp,b_buf,c_buf); if(SCD_DBG_PMODE == 5) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x80; } if(SCD_DBG_ENC_RLSIZE == 1) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x20; } if(SCD_DBG_ENC_RLSIZE == 3) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x40; } } else {/* ダイレクト送信 By Y.Suzuki 1997/02/14 */ status = Mem_Decode(Sddp,a_buf,b_buf); if(SCD_DBG_RLOVER == 2) { SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x04; } if ((status == TX_MEM_ERR) && (SYS_DocBlock.Src.Code == SYS_MMR_CODE)) { CodecPageStatus = CDC_DECODE_ERROR; ScdcErrFlag = 1; status = RTC; break; } if(++tsk_sw_line_no > 10) {/* 復活 By Y.Suzuki 1996/08/16 */ /* ダイレクト送信時タスクスイッチ用 */ tsk_sw_line_no = 0; /* By Y.Suzuki 1996/07/06 */ #if (0)/* EcmWrite でやってるので不要 By Y.Suzuki 1997/11/29 */ ** if (SYB_MaintenanceSwitch[MNT_SW_F2]) { ** wai_oneshot(SYB_MaintenanceSwitch[MNT_SW_F2]); ** } ** else { ** wai_oneshot(5); ** } #endif } } } while(status != RTC); /* rtc書き込み */ if (SCD_DirectTx) {/* ダイレクト送信 By Y.Suzuki 1997/02/15 */ #if defined(DEU) WriteRtcToEcmByte(Sddp); #else WriteRtcToEcm(Sddp); #endif } else { SCD_EOL_WriteCount = 0xFFFF; /* By Y.Suzuki 1997/04/14 */ #if defined(DEU) WriteRtcToEcmByte(Sedp); #else WriteRtcToEcm(Sedp); #endif } if((CodecPageStatus == CDC_CONTINUE) && !ScdcErrFlag) { CodecPageStatus = CDC_RTC_DET; } /* コーデック終了処理ソフトコーデックは、特にやることない */ /* 戻り値セット、ページ終了、停止キー有り */ else if(stop_on) { CodecPageStatus = CDC_STOPPED; } /* 送信開始フラグON */ /* ** 64K以上のPIX送出中に通信予約クリアするとループするので条件削除する ** 1997/08/12 By T.Yamaguchi */ /* if(!ScdcErrFlag & !stop_on) { */ if(!TxStartFlag) { TxStartFlag = 1; } /* エンコードデータ数セット */ /* } */ /* タスク終了 */ /* exi_tsk(); By Y.Suzuki 1997/01/18 */ wai_tsk(0xffff); }
static int FuncCompileIfElse( FUNC *func ) { FUNC *table[100], *loop, *temp ; int i, j, count, unknown ; ifelsedir direction ; for( loop = func ; loop ; loop = loop->next ) loop->unknown = 0 ; /* * First find an if/else tree * */ count = 0 ; direction = DIR_UNKNOWN ; for( loop = func ; loop ; loop = loop->next ) { if( !loop->ignore && ExprLabelEqual(loop->label, iif) ) { if( count && (direction == DIR_FORWARD) ) break ; if( !count ) direction = DIR_FORWARD ; table[count] = loop ; loop = SetSkip( loop ) ; count++ ; if( direction == DIR_REVERSE ) break ; /* final $if */ } else if( !loop->ignore && ( ExprLabelEqual( loop->label, ielse ) || ExprLabelEqual( loop->label, ielseif ) ) ) { if( !count ) direction = DIR_REVERSE ; table[count] = loop ; loop = SetSkip( loop ) ; count++ ; if( (direction == DIR_FORWARD) && ExprLabelEqual(loop->label, ielse) ) break ; /* final $else */ } else if( count && !ExprLabelEqual(loop->label, imacro) ) break ; } if( !count ) return 0 ; if( count >= 100 ) IOerror( FuncBomb, "FuncCompileIfElse", "internal table exceeded" ) ; if( direction == DIR_UNKNOWN ) IOerror( FuncBomb, "FuncCompileIfElse", "cannot determine direction" ) ; /* * Swap ends if tree is reversed * */ if( direction == DIR_REVERSE ) { for( i = 0 ; i < count / 2 ; i++ ) { temp = table[i] ; table[i] = table[ count - i - 1 ] ; table[ count - i - 1 ] = temp ; } if( !ExprLabelEqual( table[0]->label, iif ) ) IOerror( FuncBomb, "FuncCompileIfElse", "if/else tree has no if" ) ; } /* * Check some syntax * */ if( FuncArgCount( table[0] ) != 1 ) { IOerror( FuncBomb, "FuncCompileIfElse", "wrong number of arguments to $if" ) ; } for( i = 1 ; i < count - 1 ; i++ ) { if( FuncArgCount( table[i] ) != 1 ) { IOerror( FuncBomb, "FuncCompileIfElse", "wrong number of arguments to $elseif" ) ; } if( ExprLabelEqual( table[i]->label, ielse ) ) { IOerror( FuncBomb, "FuncCompileIfElse", "$else embedded in $if/$else tree" ) ; } } if( ExprLabelEqual(table[count - 1]->label, ielse) && (FuncArgCount( table[count - 1] ) != 0) ) IOerror( FuncBomb, "FuncCompileIfElse", "wrong number of arguments to $else" ) ; /* * Find the true branch * */ unknown = 0 ; for( i = 0 ; i < count ; i++ ) { if( ExprNonDepend( FuncArg( table[i], 0 ), VAR_SET, 0 ) ) { unknown = 1 ; break ; } if( ExprLabelEqual( table[i]->label, ielse ) ) /* leftover */ break ; if( ExprValue( FuncArg( table[i], 0 ) ) ) /* true */ break ; } /* * Set the final state * */ for( j = 0 ; j < count ; j++ ) { if( unknown ) loop = SetUnknown( table[j] ) ; else { if( i == j ) loop = SetTrue( table[j] ) ; else loop = SetFalse( table[j] ) ; } if( (direction == DIR_REVERSE) && (j == 0) ) func = loop ; if( (direction == DIR_FORWARD) && (j == count - 1) ) func = loop ; } /* * func is now the last FUNC of the tree * */ if( func && func->next ) return !unknown + FuncCompileIfElse( func->next ) ; else return !unknown ; }