@@ -217,6 +217,7 @@ presetIndex := $60E
217
217
pausedOutOfDateRenderFlags := $60F ; 0 - statistics 1 - saveslot
218
218
debugLevelEdit := $610
219
219
debugNextCounter := $611
220
+ regionFlag := $612
220
221
221
222
; ... $67F
222
223
musicStagingSq1Lo: = $0680
@@ -278,6 +279,7 @@ highScoreNames := $0700
278
279
highScoreScoresA: = $0730
279
280
; highScoreScoresB:= $073C
280
281
highScoreLevels := $0748
282
+ ; .. bunch of unused stuff: highScoreNames sized
281
283
initMagic := $0750 ; Initialized to a hard-coded number. When resetting, if not correct number then it knows this is a cold boot
282
284
283
285
menuSeedCursorIndex := $760
@@ -330,9 +332,9 @@ MMC1_CHR1 := $DFFF
330
332
.segment "PRG_chunk1" : absolute
331
333
332
334
; incremented to reset MMC1 reg
333
- initRam: ldx #$00
335
+ initRam:
336
+ ldx #$00
334
337
jmp initRamContinued
335
-
336
338
nmi: pha
337
339
txa
338
340
pha
@@ -500,6 +502,53 @@ initRamContinued:
500
502
@continue:
501
503
jmp @mainLoop
502
504
505
+ checkRegion:
506
+ lda regionFlag
507
+ beq @check
508
+ rts
509
+ @check:
510
+ lda #1
511
+ sta regionFlag
512
+ ; region detection via http://forums.nesdev.com/viewtopic.php?p=163258#p163258
513
+ ;;; use the power-on wait to detect video system-
514
+ ldx #0
515
+ ldy #0
516
+ @vwait1:
517
+ bit $2002
518
+ bpl @vwait1 ; at this point, about 27384 cycles have passed
519
+ @vwait2:
520
+ inx
521
+ bne @noincy
522
+ iny
523
+ @noincy:
524
+ bit $2002
525
+ bpl @vwait2 ; at this point, about 57165 cycles have passed
526
+
527
+ ;;; BUT because of a hardware oversight, we might have missed a vblank flag.
528
+ ;;; so we need to both check for 1Vbl and 2Vbl
529
+ ;;; NTSC NES: 29780 cycles / 12.005 -> $9B0 or $1361 (Y:X)
530
+ ;;; PAL NES: 33247 cycles / 12.005 -> $AD1 or $15A2
531
+ ;;; Dendy: 35464 cycles / 12.005 -> $B8A or $1714
532
+
533
+ tya
534
+ cmp #16
535
+ bcc @nodiv2
536
+ lsr
537
+ @nodiv2:
538
+ clc
539
+ adc #<-9
540
+ cmp #3
541
+ bcc @noclip3
542
+ lda #3
543
+ @noclip3:
544
+ ;;; Right now, A contains 0,1,2,3 for NTSC,PAL,Dendy,Bad
545
+ cmp #0
546
+ beq @ntsc
547
+ lda #1
548
+ sta palFlag
549
+ @ntsc:
550
+ rts
551
+
503
552
gameMode_playAndEndingHighScore_jmp:
504
553
jsr gameMode_playAndEndingHighScore
505
554
rts
@@ -578,6 +627,11 @@ playState_playerControlsActiveTetrimino:
578
627
gameMode_legalScreen: ; boot
579
628
; ABSS goes to gameTypeMenu instead of here
580
629
630
+ ; reset cursors (seems to cause problems on misterFPGA)
631
+ lda #$0
632
+ sta practiseType
633
+ sta menuSeedCursorIndex
634
+
581
635
; set start level to 18
582
636
lda #$08
583
637
sta startLevel
@@ -590,35 +644,10 @@ gameMode_legalScreen: ; boot
590
644
dex
591
645
bpl @loop
592
646
593
- ; reset cursors (seems to cause problems on misterFPGA)
594
- lda #$0
595
- sta practiseType
596
- sta menuSeedCursorIndex
597
-
598
647
; default pace to A
599
648
lda #$A
600
649
sta paceModifier
601
650
602
- ; region detection
603
- ldx #0
604
- ldy #0
605
- @vwait1:
606
- bit $2002
607
- bpl @vwait1
608
- @vwait2:
609
- inx
610
- bne @noincy
611
- iny
612
- @noincy:
613
- bit $2002
614
- bpl @vwait2
615
-
616
- cpx #$40 ;
617
- bmi @ntsc
618
- lda #1
619
- sta palFlag
620
- @ntsc:
621
-
622
651
; fallthrough
623
652
gameMode_titleScreen:
624
653
inc gameMode
@@ -651,6 +680,7 @@ gameMode_gameTypeMenu:
651
680
jsr changeCHRBank0
652
681
lda #$00
653
682
jsr changeCHRBank1
683
+ jsr checkRegion
654
684
jsr waitForVBlankAndEnableNmi
655
685
jsr updateAudioWaitForNmiAndResetOamStaging
656
686
jsr updateAudioWaitForNmiAndEnablePpuRendering
@@ -2568,14 +2598,6 @@ pickTetriminoPre:
2568
2598
beq pickTetriminoPreset
2569
2599
jmp pickRandomTetrimino
2570
2600
2571
- pickTetriminoPost:
2572
- lda practiseType
2573
- cmp #MODE_DROUGHT
2574
- beq pickTetriminoDrought
2575
- lda spawnID ; restore A
2576
- rts
2577
-
2578
-
2579
2601
pickTetriminoTSpin:
2580
2602
lda #$2
2581
2603
sta spawnID
@@ -2587,9 +2609,27 @@ pickTetriminoTap:
2587
2609
rts
2588
2610
2589
2611
pickTetriminoSeed:
2590
- ldx #set_seed
2591
- ldy #$02
2592
- jsr generateNextPseudorandomNumber
2612
+ jsr setSeedNextRNG
2613
+
2614
+ ; SPSv2
2615
+
2616
+ lda set_seed_input+2
2617
+ ror
2618
+ ror
2619
+ ror
2620
+ ror
2621
+ and #$F
2622
+ cmp #0
2623
+ beq @compatMode
2624
+
2625
+ adc #1
2626
+ sta tmp3 ; step + 1 in tmp3
2627
+ @loop:
2628
+ jsr setSeedNextRNG
2629
+ dec tmp3
2630
+ lda tmp3
2631
+ bne @loop
2632
+ @compatMode:
2593
2633
2594
2634
inc set_seed+2 ; 'spawnCount'
2595
2635
lda set_seed
@@ -2624,6 +2664,12 @@ pickTetriminoSeed:
2624
2664
sta spawnID
2625
2665
rts
2626
2666
2667
+ setSeedNextRNG:
2668
+ ldx #set_seed
2669
+ ldy #$02
2670
+ jsr generateNextPseudorandomNumber
2671
+ rts
2672
+
2627
2673
pickTetriminoPreset:
2628
2674
presetBitmask := tmp2
2629
2675
@start:
@@ -2656,6 +2702,13 @@ presetBitmask := tmp2
2656
2702
sta spawnID
2657
2703
rts
2658
2704
2705
+ pickTetriminoPost:
2706
+ lda practiseType
2707
+ cmp #MODE_DROUGHT
2708
+ beq pickTetriminoDrought
2709
+ lda spawnID ; restore A
2710
+ rts
2711
+
2659
2712
pickTetriminoDrought:
2660
2713
lda spawnID ; restore A
2661
2714
cmp #$12
0 commit comments