0E8196 A5 37 lda $37 //$37:スクロール方向 $37=#$01:上スクロール $37=#$02:右スクロール $37=#$03:下スクロール A=$37 0E8198 F0 03 beq $0E819D //$37が0ならスクロール判定を飛ばす 0E819A 20 78 82 jsr $28278 //スクロール判定へ //前画面へ行けるか判定 0E8278 A6 1F ldx $1F //$1F:横に長い画面のときの現在のマップのX座標 0E827A D0 3F bne $0E82BB //$1Fが0以外ならジャンプ(横に長い画面で、左端か右端にいないならスクロール判定をせずに死亡するかどうか判定へ) 0E827C A6 20 ldx $20 //$20:現在いるマップの番号 Xレジスタに読み込み X=$20 0E827E F0 18 beq $0E8298 //$20が0ならジャンプ(最初の画面にいるなら前画面へ行けるか判定をしない) 0E8280 E4 14 cpx $14 //$14:画面の左端を示す値 X-$14を計算 0E8282 D0 14 bne $0E8298 //X-$14が0以外ならジャンプ(画面左端にいないときは前画面へ行けるか判定をしない) 0E8284 A4 38 ldy $38 //$38:現在の位置を表す番号(横に長いマップの場合も1つのマップとして数える変数。#$00〜#$1F) 0E8286 88 dey //Y=Y-#$01(1画面前の位置を読み込む) 0E8287 20 A1 C7 jsr $00C7A1 //スクロール判定処理を呼び出し 0E828A 98 tya //A=Y 0E828B A4 37 ldy $37 //Y=$37 0E828D 39 CC 82 and $82CC,y //$37=#$01のときA= ($82CD=#$40 AND A) //$37=#$02のときA= ($82CE=#$00 AND A)  このときの演算値は$82CEが0のため必ず0になる //$37=#$03のときA= ($82CF=#$80 AND A) 0E8290 F0 06 beq $0E8298 //AND演算の結果が0ならジャンプ 0E8292 20 DD 8E jsr $0E8EDD //左端の値を決定する処理へジャンプ 0E8295 4C C8 82 jmp $282C8 //次画面へ行けるか判定 0E8298 E4 15 cpx $15 //$15:画面右端を示す値 X-$15を計算 0E829A D0 1F bne $0E82BB //X-$15が0以外ならジャンプ(画面右端にいないなら次画面へ行けるか判定をしない) 0E829C A4 38 ldy $38 //$38:現在の位置を表す番号(横に長いマップの場合も1つのマップとして数える変数。#$00〜#$1F) 0E829E 20 A1 C7 jsr $00C7A1 //スクロール判定処理を呼び出し 0E82A1 98 tya //A=Y 0E82A2 A4 37 ldy $37 //Y=$37 0E82A4 39 D0 82 and $82D0,y //$37=1のとき A= ($82D1=#$80 AND A) //$37=2のとき A= ($82D2=#$20 AND A) //$37=3のとき A= ($82D3=#$40 AND A) 0E82A7 F0 12 beq $0E82BB //AND演算の結果が0ならジャンプ 0E82A9 20 39 8F jsr $0E8F39 //次画面でのデータ読み込み処理へ 0E82AC A6 2A ldx $2A //$2A:ステージ番号 0E82AE A5 20 lda $20 //$20:現在いるマップの番号 0E82B0 DD 6F 90 cmp $906F,x 0E82B3 D0 03 bne $0E82B8 0E82B5 20 05 C8 jsr $38805 0E82B8 4C C8 82 jmp $282C8 //死亡するかどうかの判定 0E82BB A5 37 lda $37 //A=$37 0E82BD C9 03 cmp #$03 //A-#03(画面下に岩男が触れているとき) 0E82BF D0 07 bne $0E82C8 //0以外ならジャンプ 0E82C1 A9 01 lda #$01 //A=#$01 0E82C3 85 2C sta $2C //$2C=A 0E82C5 4C 0B C1 jmp $0E810B //死亡処理へ 0E82C8 A9 00 lda #$00 //A=#$00 0E82CA 85 37 sta $37 //$37=A 0E82CC 60 rts 0E82CD 40 rti //スクロール判定処理 00C7A1 A5 2A lda $2A 00C7A3 29 07 and #$07 00C7A5 20 00 C0 jsr $00C000 //バンク切り替えプログラム ディレイ時:Y=#$00〜#$1C 00C7A8 B9 00 B4 lda $B400,y //A=#$00〜#$FF 00C7AB A8 tay //Y=A 00C7AC A9 0E lda #$0E // 00C7AE 20 00 C0 jsr $00C000 //バンク切り替えプログラム ディレイ時:Y=#$00〜#$1C 00C7B1 60 rts //バンク切り替え 00C000 85 29 sta $29 00C002 85 69 sta $69 00C004 E6 68 inc $68 00C006 8D F0 FF sta $FFF0 00C009 4A lsr 00C00A 8D F0 FF sta $FFF0 00C00D 4A lsr 00C00E 8D F0 FF sta $FFF0 00C011 4A lsr 00C012 8D F0 FF sta $FFF0 00C015 4A lsr 00C016 8D F0 FF sta $FFF0 00C019 A9 00 lda #$00 00C01B 85 68 sta $68 00C01D A5 67 lda $67 00C01F D0 01 bne $00C022 //C006-C019でNMIが起きると、 //ここでサウンドコードが呼び出されYが狂う 00C021 60 rts //前画面に戻るときに左端、右端の値を決定する処理 0E8EDD 20 20 92 jsr $E9220 0E8EE0 A6 14 ldx $14 //X=$14 現在の左端を読み込み 0E8EE2 CA dex //X=X-1 0E8EE3 86 15 stx $15 //$15=X 左端から1を引いた値を保存する 0E8EE5 C6 38 dec $38 //$38=$38-#$01 0E8EE7 A4 38 ldy $38 //Y=$38 1画面前のマップ位置を読み込み 0E8EE9 20 A1 C7 jsr $00C7A1 //スクロール判定処理を呼び出し 0E8EEC 98 tya //A=Y 0E8EED 29 1F and #$1F //A=(#$1F AND A) 0E8EEF 85 14 sta $14 //A=$14 0E8EF1 8A txa //A=X 0E8EF2 38 sec //キャリーフラグをセット 0E8EF3 E5 14 sbc $14 //A=A-$14-0 0E8EF5 85 14 sta $14 //$14=A 0E8EF7 A5 15 lda $15 //次画面に行くときに左端、右端の値を決定する処理 0E8F3C A6 15 ldx $15 //X=$15 0E8F3E E8 inx //X=X+1 0E8F3F 8A txa //A=X 0E8F40 48 pha //Aをスタックにプッシュダウン ------------- 0E8FA7 E6 38 inc $38 //$38=$38+#$01 0E8FA9 A4 38 ldy $38 //Y=$38 一画面次のマップ位置を読み込み 0E8FAB 20 A1 C7 jsr $00C7A1 //スクロール判定を呼び出し 0E8FAE 98 tya //A=Y 0E8FAF 29 1F and #$1F //A=(#$1F AND A) 0E8FB1 85 14 sta $14 //A=$14 0E8FB3 68 pla //スタックからAにポップアップ 0E8FB4 AA tax //X=A 0E8FB5 18 clc //キャリーフラグをクリア 0E8FB6 65 14 adc $14 //A=A+$14+1 0E8FB8 85 15 sta $15 //$15=A 0E8FBA 86 14 stx $14 //$14=X