今回は自分がハマったバグをご紹介。題してZ80バグ取りクイズです😁まず、大前提としてアセンブラはAILZ80ASMを使用しています。動作環境はPC-6001mk2の戦士カートリッジです。GVRAMと全く同じアドレスにExtRAMが割り当てられており、読み込みは ExtRAM、書き込みは INRAM という状態になっています。さて、下記のルーチンのバグが分かりますでしょうか?


  • 指定範囲が正しく消えない

;----------------------------------------------------------------------- ; 横16ドットキャラを消去する ; HL 消去アドレス
; EraseChara16x4: di ld (.stack), sp ld bc, +VRAM.WIDTH .lpAtrb REPT 4 ld sp, hl ; SP コピー元 pop de push de add hl, bc ENDM ld bc, -VRAM.WIDTH set 5, h .lpGrph REPT 4 ld sp, hl ; SP コピー元 pop de push de add hl, bc ENDM .stack equ $ + 1 .exit ld sp, 0 ; SP 元に戻す ei ret
解答はこちら

アイディクーリング(Id-Cooling) Intel&AMD用 薄型CPUクーラー IS-40X-V3
アイディクーリング(Id-Cooling)
2023-10-05
※ AsRock DeskMiniの許容クーラーの高さが47mm、このクーラーが45mmで本当にギリギリ使えます。SO-DIMMの高さは35mmまでとメモリも選びますが、導入さえ出来れば、システム全体を冷やすトップフローなので効果は高いと思います。

  • 描画するとキャラ画像下部にゴミが入る

;----------------------------------------------------------------------- ; ショット画像を描画する ; HL 画像データアドレス ; DE 描画アドレス ; DrawBullet8x8: ld (DrawShot8x16.begin), sp di ld sp, hl ex de, hl ld bc, - VRAM.WIDTH - $2000 jp DrawShot8x16.line8 DrawShot8x16: .unit equ 6 .line8 equ .begin - .unit * 8 ld (.begin), sp di ld sp, hl ex de, hl ld bc, VRAM.WIDTH - $2000 REPT 16 pop de ; 1 ld (hl), e ; 1 set 5, h ; 2 ld (hl), d ; 1 add hl, bc ; 1 = 6 ENDM .begin equ $ + 1 ld sp, 0 ei ret
解答はこちら

※こちらは高さ57mmなのでAsRock DeskMiniではなくMini-ITX マザーボードに搭載するのを想定されて設計されていると思われます。よく冷えて静かというかなり良い製品だと思います。この値段が安い部類に入るのは今時だとは思いますけどね…