質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

Q&A

0回答

584閲覧

NESASM[横書き換えBGスクロールの誤差蓄積バグを直したいです]

littlestream

総合スコア35

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

0グッド

0クリップ

投稿2018/11/24 16:19

前提・実現したいこと

イメージ説明ファミコン[NES]のクロスアセンブラでのNESASMでの横スクロールの
BGスクロールバグの修正です。

ここに質問の内容を詳しく書いてください。
どうしても、なんの計算が間違っているのかわからないのですが、
ファミコンエミュレータの実行結果を見る限り、BGへの書き込みの僅かな
誤差が蓄積していってしまい、最終的には、何も描かれなくなります。どうすればこの問題が
解決するか知りたいです。

発生している問題・エラーメッセージ

ファミコンでのエラーメッセージは出ませんが、ネームテーブルの画面を見る限り、
BGの一番下に付けた区別をつけるために特定の文字列を
書いた種類のBG(16x16ドット)がいきなり上に上がってしまい、
それからどんどん下に下がっていきました。

エラーメッセージ

なし

該当のソースコード

ソースコード

ASM(6502)

1LOWVRAMADD=$4B 2HIGHVRAMADD=$4C 3LOWVRAMCNT=$4D 4ADDTBLNUM=$4E 5ADDTBLNUM2=$4F 6LOWVRAMADD2=$50 7HIGHVRAMADD2=$51 8LOWVRAMCNT2=$52 9ADDTBLNUMB=$53 10ADDTBLNUM2B=$54 11MAPCNT=$55 12LMAP=$56 13HMAP=$57 14VRAMLOCATE: 15 pha 16 lda $2002 17 stx $2006 18 sty $2006 19 pla 20 sta $2007 21 22 rts 23 24WriteBackGround: ;2000専用 25 ;inc LOWVRAMADD 26 lda <LOWVRAMADD ;VRAM下位アドレスをAに代入 27 ;下位VRAMアドレスをBGTBLの配列の添え字にしてADDTBLNUMだけ足して下位アドレスを更新する 28 tax ;X<-A 29 ldy BGTBL,x ;y<-BGTBL[x]; 30 tya ;A<-Y 31 clc ;c=0; 32 adc <ADDTBLNUM ;A+=ADDTBLNUM; 33 tay ;Y<-A 34 ;ldx <HIGHVRAMADD 35 lda MAPTMP ;A<-MAPTMP 36 asl a ;A*=2 37 asl a ;A*=2; 38 tax ;X<-A 39 lda BGPTN,x ;A<-BGPTN[X] 40 ldx <HIGHVRAMADD ;上位VRAMアドレス 41 jsr VRAMLOCATE ;BG書き込み 42 inc <LOWVRAMADD ;下位VRAMアドレスを以下同文 43 lda <LOWVRAMADD 44 tax 45 ldy BGTBL,x 46 tya 47 clc 48 adc <ADDTBLNUM 49 tay 50 ;ldx <HIGHVRAMADD 51 lda MAPTMP 52 asl a 53 asl a 54 tax 55 lda BGPTN,x 56 clc 57 adc #1 58 ldx <HIGHVRAMADD ;上位VRAMアドレス 59 jsr VRAMLOCATE ;BG書き込み 60 inc <LOWVRAMADD 61 lda <LOWVRAMADD 62 tax 63 ldy BGTBL,x 64 tya 65 clc 66 adc <ADDTBLNUM 67 tay 68 ;ldx <HIGHVRAMADD 69 lda MAPTMP 70 asl a 71 asl a 72 tax 73 lda BGPTN,x ;MAPTMPを4倍してBGPTNから得た数値に16足す 74 clc 75 adc #16 76 ldx <HIGHVRAMADD 77 jsr VRAMLOCATE 78 inc <LOWVRAMADD 79 lda <LOWVRAMADD 80 tax 81 ldy BGTBL,x 82 tya 83 clc 84 adc <ADDTBLNUM 85 tay 86 ;ldx <HIGHVRAMADD 87 lda MAPTMP 88 asl a 89 asl a 90 tax 91 lda BGPTN,x 92 clc 93 adc #17 94 ldx <HIGHVRAMADD 95 jsr VRAMLOCATE 96 inc <LOWVRAMADD 97 lda <LOWVRAMADD 98 sta <LOWVRAMADD 99 cmp #16 100 bne .skip ;16じゃなければ.skipへ飛ぶ 101 lda #0 102 sta <LOWVRAMADD ;16だったらloを0にする 103 lda <HIGHVRAMADD 104 clc 105 adc #1 106 sta <HIGHVRAMADD ;16だったらhiを+1する 107 ;inc <HIGHVRAMADD 108 ;lda <NameTblNum 109 ;cmp #0 110 ;bne .resetoff ;NameTblNumが0なら 111 lda <HIGHVRAMADD 112 cmp #$24 ;hiが#$24だったら#$20にする 113 bne .skip 114 lda #$20 115 sta <HIGHVRAMADD 116.resetoff 117 lda <ADDTBLNUM 118 sta <ADDTBLNUM2 119 120 lda <ADDTBLNUM ;テーブルに加算する値 121 clc 122 adc #2 123 sta <ADDTBLNUM 124 lda <ADDTBLNUM ;ADDTBLNUMは2つずつ足すので30(32?)になったらリセット 125 cmp #28 ;#32 126 bcc .skip 127 lda #0 128 sta <ADDTBLNUM 129 sta <LOWVRAMADD 130 lda <HIGHVRAMADD 131 cmp #$23 132 bcc .skip 133 lda <LOWVRAMADD 134 cmp #$C0 135 bcc .skip 136 ;bcc .skip ;254未満ならば.skipへ飛ぶ 137 lda #1 ;1 138 sta <NameTblNum 139 ldx #$24 ;254以上ならば上位バイトを#$24にする 140 stx <HIGHVRAMADD 141.skip 142 lda <LOWVRAMADD 143 bcc .skip2 144 lda #0 145 sta <LOWVRAMADD 146.skip2 147 inc <MAPCNT 148 tya 149 pha 150 ldy <MAPCNT ;yがごちゃ混ぜにならないように気を付ける 151 lda [LMAP],y 152 sta <MAPTMP 153 pla 154 tay 155 lda LMAP 156 cmp #255 157 bcc .skip3 158 inc <HMAP 159.skip3 160 lda LMAP 161 cmp #$00 162 bne .skip4 163 lda HMAP 164 cmp HIGH(MAP)+8 165 bne .skip4 166 lda HIGH(MAP) 167 sta HMAP 168 lda LOW(MAP) 169 sta LMAP 170.skip4 171 lda ScrollX ; 172 ;lda #0 ;debug ;スクロールを止める 173 sta $2005 ; 174 lda #0 ; 175 sta $2005 176 rts 177 178WriteBackGroundB2: ;2400専用 179 ;inc LOWVRAMADD2 180 lda <LOWVRAMADD2 181 tax 182 ldy BGTBL,x 183 tya 184 clc 185 adc <ADDTBLNUMB 186 tay 187 ldx <HIGHVRAMADD2 188 lda MAPTMP 189 asl a 190 asl a 191 tax 192 lda BGPTN,x 193 ldx <HIGHVRAMADD2 194 jsr VRAMLOCATE 195 inc <LOWVRAMADD2 ;1 196 lda <LOWVRAMADD2 197 tax 198 ldy BGTBL,x 199 tya 200 clc 201 adc <ADDTBLNUMB 202 tay 203 ldx <HIGHVRAMADD2 204 lda MAPTMP 205 asl a 206 asl a 207 tax 208 lda BGPTN,x 209 clc 210 adc #1 211 ldx <HIGHVRAMADD2 212 jsr VRAMLOCATE 213 inc <LOWVRAMADD2 ;2 214 lda <LOWVRAMADD2 215 tax 216 ldy BGTBL,x 217 tya 218 clc 219 adc <ADDTBLNUMB 220 tay 221 ldx <HIGHVRAMADD2 222 lda MAPTMP 223 asl a 224 asl a 225 tax 226 lda BGPTN,x 227 clc 228 adc #16 229 ldx <HIGHVRAMADD2 230 jsr VRAMLOCATE 231 inc <LOWVRAMADD2 ;3 232 lda <LOWVRAMADD2 233 tax 234 ldy BGTBL,x 235 tya 236 clc 237 adc <ADDTBLNUMB 238 tay 239 ldx <HIGHVRAMADD2 240 lda MAPTMP 241 asl a 242 asl a 243 tax 244 lda BGPTN,x 245 clc 246 adc #17 247 ldx <HIGHVRAMADD2 248 jsr VRAMLOCATE 249 inc <LOWVRAMADD2 ;4 250 lda <LOWVRAMADD2 251 sta <LOWVRAMADD2 252 cmp #16 253 bne .skip ;16じゃなければ.skipへ飛ぶ 254 lda #0 255 sta <LOWVRAMADD2 ;16だったらloを0にする 256 lda <HIGHVRAMADD2 257 clc 258 adc #1 259 sta <HIGHVRAMADD2 ;16だったらhiを+1する 260 ;inc <HIGHVRAMADD2 261 ;lda <NameTblNum 262 ;cmp #0 263 ;bne .resetoff ;NameTblNumが0なら 264 lda <HIGHVRAMADD2 265 cmp #$28 ;hiが#$28だったら#$24にする 266 bne .skip 267 lda #$24 268 sta <HIGHVRAMADD2 269.resetoff 270 lda <ADDTBLNUMB ;テーブルに加算する値 271 clc 272 adc #2 273 sta <ADDTBLNUMB 274 lda <ADDTBLNUMB 275 cmp #30 276 bcc .skip ;254未満ならば.skipへ飛ぶ 277 lda #0 278 sta <LOWVRAMADD2 279 lda <ADDTBLNUMB 280 cmp #30 ;32 281 bne .skip 282 lda #0 283 sta <ADDTBLNUMB 284 lda <HIGHVRAMADD2 285 cmp #$27 286 bne .skip 287 lda <LOWVRAMADD2 288 cmp #$C0 289 bne .skip 290 lda #0 ;0 291 sta <NameTblNum 292 293 ldx #$24 ;254以上ならば上位バイトを#$24にする 294 lda #0 295 sta <ADDTBLNUMB 296 stx <HIGHVRAMADD2 297 lda #0 298 sta <LOWVRAMADD2 299.skip 300 inc <MAPCNT 301 tya 302 pha 303 ldy <MAPCNT ;yがごちゃごちゃ混ぜ混ぜにならないように気を付ける 304 lda [LMAP],y 305 sta <MAPTMP 306 pla 307 tay 308 lda LMAP 309 cmp #255 310 bcc .skip3 311 inc <HMAP 312.skip3 313 lda LMAP 314 cmp #$00 315 bne .skip4 316 lda HMAP 317 cmp HIGH(MAP)+8 318 bne .skip4 319 lda HIGH(MAP) 320 sta HMAP 321 lda LOW(MAP) 322 sta LMAP 323.skip4 324 lda ScrollX ; 325 ;lda #0 ;debug ;スクロールを止める 326 sta $2005 ; 327 lda #0 ; 328 sta $2005 329 rts 330 331 332;BGTBL 333BGTBL: 334 .db 0,1,32,33 335 .db 64,65,96,97 336 .db 128,129,160,161 337 .db 192,193,224,225 338 339BGPTN: .db $00,$00,$00,$00,$02,$03,$12,$13,$04,$05,$14,$15,$06,$07,$16,$17 340 .db $08,$09,$18,$19 341 ;0 ;1 ;2 ;3 342 ;4 343

試したこと

fceuxでMemoryWatchという指定された数値を10進数で表示する機能を使いました。
gnesでメモリの値を見ました。
VirtuaNesでネームテーブルの状態を見ました。
これらのアセンブラソースコードを実際にプリンタで印刷しました。
アルゴリズムで同等の処理をcに移植しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問