PC88 のグラフィック性能は、他のメーカーの機種に比べてあまり進化しませんでしたが
パレット切り替え可能な 8 色カラーや漢字など一通りの機能は揃っています。
ここでは主に SR 以降の機能を書きます。
基本的にグラフィックデータの読み書きはメモリ、モードの設定は I/O ポートです。
こちらでは、テキストの方で操作した I/O ポートはあまり弄りませんが DMA を停止するとテキストだけでなくグラフィック画面も表示されなくなるので注意しましょう。
VRAM メモリマップ。
400 ラインモードでは 200ライン分の VRAM を 2 つ使って 400 ラインを構成します。
400 ラインモードの方は B と R プレーンに色をつけていますが、画面への出力は白黒になります。B が上半分で R が下半分。
あわわ、これだと 200 ラインの方は 1/3 ずつ分担みたいに見えてしまいますが、もちろん RGB の合成色が出ます。
アドレス範囲は $C000-$FE7F 固定で、640x200 が 80byte * 200 のメモリ配置になっており、
RGB それぞれ 3 プレーンが同じアドレス空間のバンク切り替えとなっています。
ドットは 1byte(8bit) で 8 ドットを表現します。
400 ラインモードのときは B, R プレーン 2 つで 1 画面ですが、200 ラインと同様にメモリ範囲はそれぞれ $C000-$FE7F を使います。
画面が繋がっているからといって $FE80-$FFFF に何か書きこんでも表示はされません。
$FE80-$FFFF も表示されないだけで、同じく VRAM です。後述の ALU は、この画面外領域でも有効です。
切り替えの I/O ポートは $5C,$5D,$5F で、メインメモリ(とテキストVRAM)に戻すには $5F に出力します。出力する値はなんでも可。
この VRAM バンク切り替えを使ったアクセスを「独立アクセスモード」といいます。
640x200 の場合、ドットは縦長になります。640x400 だとほぼ正方形。
解像度・色のモードは以下のようになっています。
- 640x200 3 プレーン 白黒モード
- 640x200 3 プレーン 8 色デジタルカラーモード
- 640x200 3 プレーン 8 色アナログカラーモード
- 640x400 1 プレーン 白黒モード
I/O ポート $31 の bit4=0 で白黒に、bit4=1 でカラーになります。
これが白黒の時、かつ bit0=0 なら 640x400 になります。つまり、400ラインモードは白黒のみということ。
また、当然ですが 400 ラインが表示できる 24KHz モニターが必要になります。
白黒モードは実は「白」と「黒」だけでも無いのですが、詳細は白黒の項で。
デジタルとアナログは I/O ポート $32 の bit5=0 でデジタル、bit5=1 でアナログになります。
こちらもアナログカラーが表示できるモニターが必要です。
当時は単色のモニターなんかも普通にあったのです。
さらに、SR 以降ではアクセスモードが二つあります。
この二つは同じく I/O ポート $32 の bit6=0 で独立アクセスモード、bit6=1 で拡張アクセスモードとなっています。
独立アクセスモードは V1 までと同じで、上に書いた I/O ポート $5C,$5D,$5E で BRG それぞれに切り替えて一つずつアクセスする方法です。
拡張アクセスモードは、SR 以降で新設された ALU 機能を使って、3 プレーンを同時にアクセスする機能です。
RGB のどのプレーンにアクセスするか、プレーンを選択して各々あるいは同時にアクセスすることが出来ます。
余談ですが、V1 モードでは VRAM を「選択しているだけで」実行速度が遅くなります。
メモリ空間の $C000-$FFFF がメイン RAM 以外の状態にあるときは実行速度が低下します。
以下のテストコードで実験できます。
110 CLEAR ,&HBFFF:DEFINT A-Z:'V1S
120 S=&HB000:E=&HB016:DEF USR=S
130 FOR A=S TO E:READ B$:POKE A,VAL("&H"+B$):NEXT
140 TIME$="00:00:00"
150 A=USR(0):PRINT TIME$:END
160 data F3,D3,5C,11,0A,00,21,00,00,2B,7D,B4,20,FB,1B,7B,B2,20,F6,D3,5F,FB,C9
170 ' ^^ change to 5F
|
65536*10 の空ループを実行するだけです。上記のまま(VRAM.B を選択した状態)だと 22 秒かかりますが、
メイン RAM (F3,D3,5F に書き換え)を選択した状態だと 6 秒で終わります。V1S のみで V1H/V2 では影響ありません。
I/O ポート。既に挙げたテキストの方にも関連する設定がありますが、ここでは主にグラフィック関連のものを掲載します。
I/O ポート $34 【出力】 |
bit | 7 | 未使用 |
bit | 6 | ALU プレーン G に対する処理指定 H |
bit | 5 | ALU プレーン R に対する処理指定 H |
bit | 4 | ALU プレーン B に対する処理指定 H |
bit | 3 | 未使用 |
bit | 2 | ALU プレーン G に対する処理指定 L |
bit | 1 | ALU プレーン R に対する処理指定 L |
bit | 0 | ALU プレーン B に対する処理指定 L |
ALU モードの際に、各プレーンに対してどの処理を適用するかを決定します。
処理は 4 種類あり、2bit で指定します。内容は以下。すべて論理演算です。
この I/O ポート $34 の設定を使用するためには、ポート $35 で「I/O ポート $34 の設定を使ったライト」の設定にしなければなりません。
H | L | 処理内容 | 書き込む値 | VRAM上の値 | 結果 |
0 | 0 | not AND ビットリセット | 0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 0 |
0 | 1 | OR ビットセット | 0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
1 | 0 | XOR ビット反転 | 0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | NOP なにもしない | 0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
例えば B プレーンにビット反転をする場合は bit4=1 bit0=0 とします。
この論理演算は ALU モードで「書き込む値」との論理演算です。
not AND は「ビット反転した上で AND」の意味です。「マスク」に使える他、$FF を書き込むと VRAM 上のデータは全て $00 になります。
3 プレーン共に処理を not AND にして VRAM に $FF を 16000byte 書き込むことで高速に画面消去ができます。
not AND でマスクデータを書き込んで OR でキャラデータを合成する、というのがキャラクタなどを重ね合わせる上での常套手段です。
最後の「何もしない」というのも大事です。
これを指定することにより、特定のプレーンにだけ論理演算を適用することが出来るのです。
論理演算だけなので、逆に「そのまま上書きする」という設定がありません。この点が若干不便なところ。
I/O ポート $35 【出力】 |
bit | 7 | 0=メインRAMアクセス 1=グラフィックVRAMアクセス |
bit | 6 | 未使用 |
bit | 5 | 00=I/O ポート $34 の設定を使ったライト 01=3プレーンの分のリードデータを3プレーン同時ライト 10=RプレーンのデータをBプレーンへ転送 11=BプレーンのデータをRプレーンへ転送 |
bit | 4 |
bit | 3 | 未使用 |
bit | 2 | Gプレーンの比較データ |
bit | 1 | Rプレーンの比較データ |
bit | 0 | Bプレーンの比較データ |
ALU 機能の要。
bit7 でアクセス先を変えられますが、少しややこしいので注意しましょう。
この設定は「ALU が ON の時に」アクセス先を変えるものです。
ALU ON の時 $C000-$FFFF の空間は I/O ポート $5C-$5F の設定にかかわらずグラフィック VRAM になりますが、
この ALU ON の状態(I/O $32.bit6=1)を維持したまま、一時的にアクセス先を切り替えられる、という意味です。
つまり、I/O ポート $32 の ALU ON が前提であり、この bit7=1 に変えるだけではグラフィック VRAM はアクセスできません。
そして、bit7=0 でメインRAM を選択したとき、アクセスできるのは「メイン RAM かテキストVRAM」です。
I/O ポート $5C〜$5F の状態にかかわらず、グラフィック VRAM はアクセスできません。これらはあくまで独立アクセス用。
反対に I/O ポート $32 でテキスト VRAM が選択されている場合は、テキスト VRAM へのアクセスができます。
ややこしいので、筆者はこの bit7 は 常に 1 で使用しています。
メイン RAM やテキスト VRAM をアクセスしたい場合は、 I/O ポート $32 で ALU そのものをオフにするようにしています。
bit5,4=00 にすると上で説明した I/O ポート $34 の設定を使用した論理演算アクセスになります。
↓に詳しく書きましたが、こちらは書き込みに push 命令で 16bit 幅の書き込みを使っても大丈夫です。
バッファは関係ないので、push 命令では 16bit レジスタの中身が「8bit 単位で論理演算後、書き込み」という動作が下位・上位の 2 回分繰り返されます。
このモードは「ライト」とありますが、読み込みの場合は↓の 3 プレーン同時リードと同じ動作で、バッファに 3 プレーン分のデータが入ります。
bit5,4=01 の設定は VRAM から 1byte 読み込んだときに 3 プレーン分のデータをバッファに読み込み、
書き込む時には、バッファにため込んだデータを 3 プレーンに同時に書き込みます。
このモードは VRAM 同士のコピーなので、論理演算などは挟まず(I/O ポート $34 の設定は使わず)単純な上書きができます。スクロールなどに利用できます。
ここで「バッファに」という所がポイントで、ALU 拡張アクセスモードでは VRAM からの読み込みは、レジスタに格納されません。
レジスタに格納されるのは bit2-0 で設定できる「比較データ」であり、VRAM の中身はユーザーからは見えない 8bit 幅のバッファに格納されます。
8bit 幅なのでこの 3 プレーン同時アクセスモードでは、つぎのような方法は使えません。
ld a,%10010000 ;G.VRAMアクセス / 3プレーン同時読み書きモード
out ($35),a
ld hl,($C000) :2byteずつ読み込んだつもり
ld ($C002),hl ;2byteずつ書き込んでいるつもり
|
以下のやりかたが正解。
ld a,%10010000 ;G.VRAMアクセス / 3プレーン同時読み書きモード
out ($35),a
ld a,($C000) :1byte読み込み この a は VRAM の中身ではなくダミー。
ld ($C002),a ;1byte書き込み こちらも、a の中身を書き込んでいるわけではない。
|
読み書きについては、その「動作」が大事、ということです。
このモードでは pop/push 命令も 8bit 幅バッファの中身を 2 回分読み書きしてしまうことになるので正常に働きません。
また、以下のようなやり方でも ALU バッファへの取り込みができます。
HL レジスタさえ適切に設定してあれば、A レジスタを破壊せずに、ALU バッファに取り込みできるウマい手です。
bit5,4=10,11 は、主に 400 ライン白黒モードで使います。200ラインやカラーモードでも一応使えなくはないですが実用性はなさそう。
10 の場合、読み込みを R プレーンから、書き込みを B プレーンに行います。
11 の場合、読み込みを B プレーンから、書き込みを R プレーンに行います。
400 ライン白黒の場合に読み=書きのアドレスにして LDIR 命令を使うと半画面単位のスクロールが簡単にできます。
独立アクセスモードの時は、一々バンクを切り替えないといけないので、B,R プレーンが同時にアクセスできると楽、という話。
とはいえ・・・使用頻度は低いです。
Bit2-0 は、比較データの設定です。上で説明したとおり、ALU モードでの読み込み動作でレジスタに入るのは「比較データ」です。
たとえば、bit2-0(GRB) を 011 = 紫にしたとします。
その上で、ALU モードで読み込みを行うと、レジスタには「読み込んだ VRAM アドレスのドットが紫の部分だけが 1、それ以外は 0 」になります。
つまり、8bit 幅 3 プレーン分の ALU バッファとの「比較」という意味なのでした。
これが何の役に立つかというと、ペイントをする際の境界領域の判定に使えるのです。
色の違う境界部分を検出することでペイントが高速化できます。
ちょっと頑張れば当たり判定に使うこともできそうです。
I/O ポート $52 【出力】 |
bit | 7 | 未使用 |
bit | 6 | 白黒モード時の背景色 G |
bit | 5 | 白黒モード時の背景色 R |
bit | 4 | 白黒モード時の背景色 B |
bit | 3 | 未使用 |
bit | 2 | ボーダーカラー G |
bit | 1 | ボーダーカラー R |
bit | 0 | ボーダーカラー B |
あまり使用頻度は高くなさそうですが、グラフィックの白黒モード(200/400ライン共)時に「黒」の部分を任意の 8 色に変えることが出来ます。
I/O ポート $31 の bit4=0 の白黒の他に、$32 の bit5=0 デジタルモードである必要があります。
アナログで背景色を設定するにはポート $54 を使いましょう。
ボーダーカラーは PC-8801 初代機のみの機能で表示画面外の色を設定できたのですが、mk2 以降で削除されてしまいました。
背景色は「黒」の方ですが、白黒モードの「白」の部分は 200/400 ライン問わず、以下の特徴があります。
- グラフィックはテキストアトリビュートカラーの影響を受けるようになる。装飾は反転のみ有効。
- テキストアトリビュートなので、色が適用されるのはテキスト文字(に相当する縦横ドット)単位。
- デジタルモードの場合、白黒グラフィックの「白」の部分はデジタル 8 色からテキストアトリビュートで設定した色が適用される。
- デジタルパレットの変更は影響なし。仮に全て 0=黒 にしたとしてもテキストおよび、白黒グラフィックの「白」はデジタル 8 色が適用される。
- アナログモードで、アナログパレット設定を変更してあると、白黒グラフィックの「白」にはその色が適用される。
- 同じく、アナログパレット設定を変更してあると、テキスト文字はアナログ色になる。
テキストがアナロググラフィックパレットの影響を受けるようになり、グラフィックがテキストアトリビュートの影響を受けるようになります。
白黒モード時に CRTC にリセットコマンドを送って止めると、「白」の部分はカラーコード 0 番の色になるようです。
アナログパレット 0 番に黒以外の色を入れておくと確認できます。
ちょっと分かりづらいのでテスト用のプログラムを挙げておきます。
10 new cmd ' V2
20 screen 1,0,0,7 'color graphic
30 console 0,24,1,1 '8col text
40 y=7
50 for p=0 to 7:line(p*50,0)-(p*50+50,100),p,bf:next
60 for p=1 to 7:cmd pal p,(p and 4)*y*16+(p and 2)*y*4+(p and 1)*y:next
70 cmd pal 0,3*64+2*8+1
|
上記のプログラムで、カラーグラフィックで以下のようにアナログ色設定されることを確認します。
続けて、以下のように入力します。
screen 0,0,0,7
out &h51,0
|
白黒グラフィックになり、
有意なドット部分(青〜白でボックスフィルされた領域)がアナログカラーパレット 0 番で設定された色になります。
I/O ポート $53 【出力】 |
bit | 7 | 未使用 |
bit | 6 | 未使用 |
bit | 5 | 未使用 |
bit | 4 | 未使用 |
bit | 3 | 白黒モード時 G プレーンを 0=表示する 1=表示しない |
bit | 2 | 白黒モード時 R プレーンを 0=表示する 1=表示しない |
bit | 1 | 白黒モード時 B プレーンを 0=表示する 1=表示しない |
bit | 0 | テキスト画面を 0=表示する 1=表示しない |
グラフィック画面の表示・非表示設定は白黒グラフィックモードの時のみ有効。400ラインの時は G プレーンは無関係です。
テキストの表示・非表示はカラーグラフィックモードでも有効です。
後述の通り、白黒グラフィックモードでは、パレットを操作して特定のプレーンを表示したり非表示にしたりできないので
この I/O ポートを使って同等の処理を行います。
なお、白黒グラフィックモードで、テキストアトリビュートを使って色を付ける場合、この I/O ポートでテキスト画面を消去したとしても
アトリビュートによる着色の効果はなくなりません。
(覚書:M88 は 400ラインの時、G プレーンを表示する設定にしていると、R,B テキストプレーンも表示されてしまう)
I/O ポート $54-$5B(デジタル)【出力】 |
bit | 7 | 未使用 |
bit | 6 | 未使用 |
bit | 5 | 未使用 |
bit | 4 | 未使用 |
bit | 3 | 未使用 |
bit | 2 | G プレーン 1=オン 0=オフ |
bit | 1 | R プレーン 1=オン 0=オフ |
bit | 0 | B プレーン 1=オン 0=オフ |
|
I/O ポート $54-$5B(アナログ) 【出力】 |
bit | 7 | 00=R,Bプレーンの設定 01=Gプレーンの設定 |
bit | 6 |
bit | 5 | Rのbit2 |
bit | 4 | Rのbit1 |
bit | 3 | Rのbit0 |
bit | 2 | B(G)のbit2 |
bit | 1 | B(G)のbit1 |
bit | 0 | B(G)のbit0 |
|
カラーコードの 0 〜 7 に対応する $54 〜 $5B の 8 個の I/O ポートがグラフィックのパレット設定です。
デジタル・アナログで同じ I/O ポートを使用します。
デジタルは I/O ポート $32 の bit5=0、アナログは bit5=1 で決定されます。
V2 モードは起動直後はアナログモードになっています。
SR で拡張された I/O ポートは V1 モードでもアクセス出来てしまうのですが、アナログパレットに関しても V1/V2 モードで有効です。
テキストをカラーモード&グラフィックを白黒モードに設定すると V1/V2 に限らずテキストやセミグラフィックにアナログカラーを適用することが出来ます。
これに 32 行表示や 50 行表示を組み合わせると 160x100 ドットセミグラフィックに 2x3 や 2x2 ドット単位でアナログカラーを適用できたりします。
32/50 行表示についてはアラカルトの項で。
テキスト(セミグラ)+アナログ限定ですが背景色(ポート$54で設定)も変えられるので、画面全体としては 8+1 色が出せることになります。
白黒グラフィックモードの時は、$54 〜 $5B のパレット操作は無効です。
設定値自体は有効でカラーグラフィックに戻ったらきちんと反映されますが、白黒モードでは単に各 RGB プレーンのドットが 1 の所が点灯する動作になります。
従って、カラーグラフィックでよくある「パレットを弄って B プレーンのみを表示させる」ようなことはできません。
白黒モードでこのような処理をする場合は I/O ポート $53 をつかいましょう。
デジタルの場合は どう組み合わせても既存の 8 色にしかならないので、カラーコード → 色への対応を「読み替える」ような動作になります。
アナログは bit7,6=00 の時は bit5-0 に R と B の 3bit ずつの色設定値を、bit7,6=01 の時は bit2-0 に G の 3bit 設定値を書き込みます。
RGB で 3bit * 3bit * 3bit で 9bit = 全 512 色から 8 色を選べることになります。
パレット設定はデジタルモード(I/O ポート $32 bit5=0)の時にアナログ用の設定をすると、デジタル色として設定されてしまいます。
bit7,6=00 であるものとして設定されてしまうということです。
アナログパレット設定は若干面倒くさいので、設定ルーチンを用意しておくとラクです。
;アナログパレット設定 0-255 で ok
PalMacro: macro R, G, B
dw $4000 | ((G >> 5) << 8) | ((R >> 5) << 3) | (B >> 5)
endm
SetAnalogPalette:
; call WaitVBlank
ld c,$54 ;$54-$5B
ld hl,.data
ld b,8*3
.loop:
outi ;R,B bit76:00
outi ;G bit76:01
inc c
djnz .loop
ret
.data: ; R G B
PalMacro 0, 0, 0 ; 黒
PalMacro 0, 0, 255 ; 青 B
PalMacro 255, 0, 0 ; 赤 R
PalMacro 255, 0, 255 ; 紫 B+R
PalMacro 0, 255, 0 ; 緑 G
PalMacro 0, 255, 255 ; 水色 G+B
PalMacro 255, 255, 0 ; 黄色 G+R
PalMacro 255, 255, 255 ; 白 G+R+B
|
パレット機能があることにより、8 色ながら単に色を変えられるという以上の効果を得ることができます。
デジタル 8 色でもフェードアウト的なことができたり、あえて同じ色を 2 つ以上設定して特殊(っぽく見える)効果を実現したり等々。
便宜上 RGB プレーンといっていますが、パレット機能により、たとえば B プレーンに何か書き込めば単純に「青」になる、わけではないという点は
押さえておくと良いと思います。
I/O ポート $54(アナログ背景色) 【出力】 |
bit | 7 | 10=R,Bプレーンの設定 11=Gプレーンの設定 |
bit | 6 |
bit | 5 | Rのbit2 |
bit | 4 | Rのbit1 |
bit | 3 | Rのbit0 |
bit | 2 | B(G)のbit2 |
bit | 1 | B(G)のbit1 |
bit | 0 | B(G)のbit0 |
デジタル・アナログパレットのカラーコード 0 と I/O ポートは共通ですが、白黒モードの背景色をアナログで指定できます。違いは bit7,6。
bit7,6=10 の時は bit5-0 に R と B の 3bit ずつの色設定値を、bit7,6=11 の時は bit2-0 に G の 3bit 設定値を書き込みます。
200 ラインでも 400 ラインでも、白黒モードであれば設定は有効です。
結局、白も黒もアナログ色に変えられるので「白黒」モードとは一体・・・という感じ。
SR で拡張された I/O ポートは V1 モードでもアクセス出来てしまうのですが、8 色あるアナログパレット同様に BG パレットも V1/V2 で設定できます。
上で述べたテキスト(セミグラフィック)にアナログカラーを適用する方法を応用すると 8+1 色を画面全体で出せます。
ただし V1 モードで電源 on するとアナログ BG パレットが初期化されないため、BG が真っ白に設定されることがあります。
一度でも V2 でリセットすれば大丈夫ですが、V1 でも手動で out $54,$80, out $54,$C0 すれば黒設定になります。
I/O ポート $5C 【入力】 |
bit | 7 | 未使用 |
bit | 6 | 未使用 |
bit | 5 | 未使用 |
bit | 4 | 未使用 |
bit | 3 | 未使用 |
bit | 2 | Gプレーンが 1=選択されている 0=選択されていない |
bit | 1 | Rプレーンが 1=選択されている 0=選択されていない |
bit | 0 | Bプレーンが 1=選択されている 0=選択されていない |
|
I/O ポート $5C 【出力】 |
bit | 7-6 | 独立アクセスモードの時 B プレーンを選択する |
I/O ポート $5D 【出力】 |
bit | 7-6 | 独立アクセスモードの時 R プレーンを選択する |
I/O ポート $5E 【出力】 |
bit | 7-6 | 独立アクセスモードの時 G プレーンを選択する |
I/O ポート $5F 【出力】 |
bit | 7-6 | 独立アクセスモードの時、メインRAMを選択する |
|
VRAM 独立アクセスモードのとき、I/O ポート $5C-$5F でアドレス空間 $C000-$FFFF のバンクを切り替えられます。
書き込む値は何でも OK。
そして、今どのバンクが選択されているかは I/O ポート $5C のリードで取得できます。
3 プレーンすべて選択されていなければ、メイン RAM と見なせます。
割り込みでバンクを切り替えて復帰する際などに必要になるかもしれません。
ALU モードにすると、この情報はリセットされメインメモリ選択状態になるようです。
ALU モードを解除しても RGB プレーン選択状態は復活しません。
画面周りは他機種との・他社との差別化が、文字通り『目で見て分かる』ので、技術競争が最も激しかった部分と言えます。
単純にキャラクタを描画する処理についても様々なテクニックが使われており、Z80 ならではかつ PC88 ならではの高速化が突き詰められました。
詳細は長くなるので省きますが、基本的にはここに記した機能をフルに使って実現されたものです。
一例としてキャラクタの重ね合わせつき表示について示します。
VRAM は RGB が 3 プレーンあり、そのドット配置パターンによる 8 通り = 8 色について、パレットが設定できます。
ということは 3 プレーンのうち、どれか一つ(あるいは二つ)を背景として設定して、残りのプレーンにキャラクタを表示すれば、
複雑な重ね合わせ処理をしなくてもハードウェアの仕様そのままで、背景+キャラの重ね合わせが実現出来ることになります。
この手法は初代 PC88 の時代によく使われました。
この例では背景を G プレーンに取り、キャラクタを R,B プレーンに取っています。
『背景をそのまま透過させたい部分』『背景にかぶせて表示したい部分』がパレット上どうなっているか、がポイントです。
どうでもいいけど、このキャラなんなんだ。
また、重ね合わせが必要ない場面でも、RGB 3 プレーンのうち、あえて 3 プレーンを全てつかわずに 2 プレーンだけ使うことことにより
処理を 2/3 にするなどの高速化・データの省サイズ化も実際に使われました。
デザインに工夫は必要ですが、大きなサイズのアニメパターンを高速に表示する場合などに有効です。
冒頭でも説明したとおり、V1 ではテキスト画面を表示しておくと遅くなるので、テキストを非表示にするテクニックもよく使われました。
最後に、ALU を使った場合と使わなかった場合の重ね合わせ付きキャラクタ表示サンプルを置いておきます。
V2 モード用ですが、V1 の場合は ALU 未使用の処理がそのまま使えます。
マスクパターンを用意すること、AND/OR などの論理演算を使うこと、が重要です。
ちらつきまくりですが、そんなものです。工夫のしがいがあるとも(強引に)言えます。
alu_test3.zip