トランジスタ技術2004年5月号 正誤表

トランジスタ技術 2004年5月号の記事に誤りが見つかりました。申し訳ありません。


プログラムを実行するとスクロール表示中に別の文字が一瞬表示される

スクロールオフセットの計算を行う処理と、実際にスクロールする処理のタイミングがずれると、この現象が起こります。スクロール処理内でオフセットの計算も行うことで対処します。ソースコードのvram.cファイルの誤りとその訂正です。#ifdef TORAGI200405の後が掲載された(誤りのある)ソースコードで、#elseの後が訂正版です。訂正箇所は2ヶ所あります。

英数半角カナ版

vramGetData関数:

unsigned short vramGetData(int half, int row) {
        unsigned short v1, v2, v3;
        unsigned short n;

#ifdef TORAGI200405
        // VRAMに空きがあれば次の文字を展開する
        if (row == 0) {
                if (fillVramRequest == 1) {
                        fillVram();
                }
        }
#else
        // スクロールは最初の行を表示する前に行う
        if (row == 0) {
                // スクロール要求があれば
                if (fillVramRequest == 1) {
                        fillVramRequest = 0;
                        ++startColumn; // ビットパターンをシフトする
                        // シフト量が1文字分あれば
                        if (startColumn >= VRAM_FILL_WIDTH) {
                                startColumn = 0;
                                // VRAMの内容をずらして新しく1文字埋める
                                fillVram();
                        }
                }
        }
#endif

        // スクロールオフセットを考慮して出力するパターンを求める
        (以下、省略)

vramScroll関数:

void vramScroll() {

        // 表示する文字列が短ければスクロール不要
        if (messageByteLength <= 4) {
                return;
        }

#ifdef TORAGI200405
        // スクロールオフセットを+1して、オフセットが7を超えるとVRAM内容をシフトする
        ++startColumn;
        if (startColumn >= VRAM_FILL_WIDTH) {
                startColumn = 0;
                fillVramRequest = 1;
        }
#else
        // ここではスクロール要求を出すだけ
        fillVramRequest = 1;
#endif
}

漢字版

vramGetData関数:

unsigned short vramGetData(int half, int row) {
        unsigned short v1, v2, v3;
        unsigned short n;
        int upperLower;

#ifdef TORAGI200405
        // VRAMに空きがあれば次の文字を展開する
        if (row == 0) {
                if (fillVramRequest[VRAM_HALF_UPPER] == 1) {
                        fillVram(VRAM_HALF_UPPER);
                }
                if (fillVramRequest[VRAM_HALF_LOWER] == 1) {
                        fillVram(VRAM_HALF_LOWER);
                }
        }
#else
        // スクロールは最初の行を表示する前に行う
        if (row == 0) {
                // スクロール要求があれば
                if (fillVramRequest[VRAM_HALF_UPPER] == 1) {
                        fillVramRequest[VRAM_HALF_UPPER] = 0;
                        ++startColumn[VRAM_HALF_UPPER]; // ビットパターンをシフトする
                        // シフト量が1文字分あれば
                        if (startColumn[VRAM_HALF_UPPER] >= VRAM_FILL_WIDTH) {
                                startColumn[VRAM_HALF_UPPER] = 0;
                                // VRAMの内容をずらして新しく1文字埋める
                                fillVram(VRAM_HALF_UPPER);
                        }
                }
                if (fillVramRequest[VRAM_HALF_LOWER] == 1) {
                        fillVramRequest[VRAM_HALF_LOWER] = 0;
                        ++startColumn[VRAM_HALF_LOWER]; // ビットパターンをシフトする
                        // シフト量が1文字分あれば
                        if (startColumn[VRAM_HALF_LOWER] >= VRAM_FILL_WIDTH) {
                                startColumn[VRAM_HALF_LOWER] = 0;
                                // VRAMの内容をずらして新しく1文字埋める
                                fillVram(VRAM_HALF_LOWER);
                        }
                }
        }
#endif

        // スクロールオフセットを考慮して出力するパターンを求める

vramScroll関数:

void vramScroll(int upperLower) {
        // 表示する文字列が短ければスクロール不要
        if (messageByteLength[upperLower] <= 4) {
                return;
        }

#ifdef TORAGI200405
        // スクロールオフセットを+1して、オフセットが7を超えるとVRAM内容のシフト要求を出す
        ++startColumn[upperLower];
        if (startColumn[upperLower] >= VRAM_FILL_WIDTH) {
                startColumn[upperLower] = 0;
                fillVramRequest[upperLower] = 1;
        }
#else
        // ここではスクロール要求を出すだけ
        fillVramRequest[upperLower] = 1;
#endif

}

ホーム 特殊工作室