diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 873df1e..754ca76 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -186,6 +186,11 @@ org $A1A000 ; static mapping area. Referenced by front end. Do not move. incsrc invertedstatic.asm warnpc $A1A100 +org $A1B000 +incsrc failure.asm +warnpc $A1FF00 + + org $A1FF00 ; static mapping area incsrc init.asm diff --git a/bsodencode.txt b/bsodencode.txt new file mode 100644 index 0000000..81e1890 --- /dev/null +++ b/bsodencode.txt @@ -0,0 +1,71 @@ + =00 +A=01 +a=01 +B=02 +b=02 +C=03 +c=03 +D=04 +d=04 +E=05 +e=05 +F=06 +f=06 +G=07 +g=07 +H=08 +h=08 +I=09 +i=09 +J=0A +j=0A +K=0B +k=0B +L=0C +l=0C +M=0D +m=0D +N=0E +n=0E +O=0F +o=0F +P=10 +p=10 +Q=11 +q=11 +R=12 +r=12 +S=13 +s=13 +T=14 +t=14 +U=15 +u=15 +V=16 +v=16 +W=17 +w=17 +X=18 +x=18 +Y=19 +y=19 +Z=1A +z=1A +0=1B +1=1C +2=1D +3=1E +4=1F +5=20 +6=21 +7=22 +8=23 +9=24 +.=25 +#=26 +?=27 +-=28 +/=29 +,=2A +'=2B +;=2C \ No newline at end of file diff --git a/bsodfont.1bpp b/bsodfont.1bpp new file mode 100644 index 0000000..2c8e2f8 Binary files /dev/null and b/bsodfont.1bpp differ diff --git a/bsodhex.2bpp b/bsodhex.2bpp new file mode 100644 index 0000000..fabf08e Binary files /dev/null and b/bsodhex.2bpp differ diff --git a/failure.asm b/failure.asm new file mode 100644 index 0000000..863c557 --- /dev/null +++ b/failure.asm @@ -0,0 +1,565 @@ +pushtable + +table "bsodencode.txt" + +; Uncomment this to force a crash to test message +;pushpc : org $008132 : db 0 : pullpc + +;=================================================================================================== + +DontUseZSNES: + SEP #$35 ; sets carry and I flag too + + LDA.b #$00 + STA.l $4200 ; disable NMI and IRQ + STA.l $420C ; disable HDMA + + ROR ; A = 0x80 from carry + STA.l $2100 + STA.l $2115 + + ; Empty VRAM + LDA.b #AllZeros>>16 : STA.l $4304 + + REP #$20 + + LDA.w #AllZeros + STA.l $4302 + + LDA.w #$1809 + STA.l $4300 + + LDA.w #$0000 + STA.l $4305 + + LDA.w #$0001 + STA.l $420B + + JSR ConfigurePPUForFailureReport + JSR ConfigureBSODVWF + + STZ.b VWFR + LDA.w #ZSNESMessage + JSR DrawVWFMessage + + LDA.w #$0F0F + STA.w $2100 + +-- BRA -- + +ZSNESMessage: + db "It has been detected that you are attempting to load", $80 + db "this ROM on a low-quality emulator.", $80 + db "The randomizer is designed to work on real hardware,", $80 + db "which this application cannot emulate properly;", $80 + db "as such, this ROM file refuses to boot.", $80 + db "Please upgrade to a more accurate emulator such as", $80 + db "SNES9X or BSNES/higan.", $80 + db $FF + +;=================================================================================================== + +AllZeros: + db $00 + +UselessStackTooFar: + dw $137 + +Crashed: +;=================================================================================================== +;=================================================================================================== +;=================================================================================================== +; !!!DO NOT TRY TO OPTIMIZE THIS CODE!!! +; IT IS INTENTIONALLY AVOIDING CHANGING CERTAIN REGISTERS, ESPECIALLY THE STACK. +;=================================================================================================== +;=================================================================================================== +;=================================================================================================== + SEP #$35 ; sets carry and I flag too + + LDA.b #$00 + STA.l $4200 ; disable NMI and IRQ + STA.l $420C ; disable HDMA + + ROR ; A = 0x80 from carry + STA.l $2100 + STA.l $2115 + + ; Empty VRAM + LDA.b #AllZeros>>16 : STA.l $4304 + + REP #$38 + + LDA.w #AllZeros + STA.l $4302 + + LDA.w #$1809 + STA.l $4300 + + LDA.w #$0000 + STA.l $4305 + + LDA.w #$0001 + STA.l $420B + +;=================================================================================================== + + ; Create report + LDA.w #$2100 + TCD + +;--------------------------------------------------------------------------------------------------- + + ; Report status + + ; stack pointer + LDA.w #$0C38>>1 + STA.b $2116 + + TSC + XBA + AND.w #$00FF + ORA.w #$0100 + STA.b $2118 + + TSC + AND.w #$00FF + ORA.w #$0100 + STA.l $2118 + + ; game module + LDA.w #$0C78>>1 + STA.b $2116 + + LDA.l $10 + AND.w #$00FF + ORA.w #$0100 + STA.b $2118 + + LDA.l $11 + AND.w #$00FF + ORA.w #$0100 + STA.b $2118 + +;--------------------------------------------------------------------------------------------------- + + ; Report stack + TSC + INC + STA.l $7F0100 + + LDA.l UselessStackTooFar + + ; For now, we can report as much of the stack as possible + ; If desired later on, uncomment the code below to keep the stack limited to + ; where it was last doing stuff +; TSC +; +; ; keep stack in a useful range +; CMP.w #$01FF ; this means we pulled too much and the stack is useless +; BCC .stack_fine +; +; JMP .skip_stack +; +;.stack_fine +; CMP.l UselessStackTooFar +; BCS .stack_adjusted +; +; ; this means we went too far in, and the stack contains little useful info +; LDA.l UselessStackTooFar +; +;.stack_adjusted + STA.l $7F0000 + + LDX.w #$01FF + + LDA.w #$0C04>>1 + +.next_row + STA.l $7F0004 + STA.b $2116 + + LDY.w #20 + + TXA + +.next_char + ; set carry to see if we should color this value as being in the stack + CMP.l $7F0100 + + LDA.l $000000,X + AND.w #$00FF + ORA.w #$0500 + BCS .in_stack + + AND.w #$01FF + +.in_stack + STA.b $2118 + + DEX + TXA + CMP.l $7F0000 + BEQ .skip_stack + + DEY + BNE .next_char + +.done_row + CLC + + LDA.l $7F0004 + ADC.w #32 + BRA .next_row + +;=================================================================================================== +;=================================================================================================== +;=================================================================================================== + ; once the stack is reported, we can start doing stuff that mucks with it +.skip_stack + LDA.w #$0000 + TCD + +; TSC +; STA.b $80 ; remember stack for later messages + + LDA.w #$01FF + TCS + + JSR ConfigurePPUForFailureReport + JSR ConfigureBSODVWF + JSR LoadBSODHexFont + + STZ.b VWFR + + LDA.w #BSODMessage + JSR DrawVWFMessage + + LDA.w #$0F0F + STA.w $2100 + +-- BRA -- + +; LDA.w #$0000 +; TCD +; +; TSC + + +BSODMessage: + db "A fatal error has occurred and resulted in an", $80 + db "unrecoverable crash. ?", $80 + db "If you believe this was the result of a bug caused by", $80 + db "the randomizer itself, please screenshot this message", $80 + db "and share it in the #bug-reports channel of the official", $80 + db "ALTTPR discord along with a detailed description of", $80 + db "what you were doing, including video if available.", $80 + db "Please also make a savestate now and include that in", $80 + db "your report.", $80 + db $FF + +;=================================================================================================== + +DrawVWFMessage: + STA.b $06 + +.next + LDA.b ($06) + INC.b $06 + AND.w #$00FF + CMP.w #$0080 + BEQ .done_row + + CMP.w #$00FF + BEQ .done_message + + JSR DrawFailureVWFChar + + BRA .next + +.done_message + RTS + +.done_row + LDA.b VWFR + ASL + TAX + LDA.w .row_offset,X + STA.w $2116 + + INC.b VWFR + + LDA.w #$1800 + STA.w $4300 + + LDA.w #20*16 + STA.w $4305 + + LDA.w #$1000 + STA.w $4302 + + SEP #$20 + + STZ.w $2115 + STZ.w $4304 + + LDA.b #$01 + STA.w $420B + + REP #$20 + + JSR ResetVFW + + BRA .next + + +.row_offset + dw $10F8 + dw $11E8 + dw $12D8 + dw $13C8 + dw $14B8 + dw $15A8 + dw $1698 + dw $1788 + dw $1878 + dw $1968 + dw $1A58 + + + +;=================================================================================================== + +VWFL = $40 +VWFX = $44 +VWFS = $46 +VWFP = $48 +VWFR = $4A + +;=================================================================================================== + +DrawFailureVWFChar: + AND.w #$00FF + STA.b VWFL + + TAX + + ASL + ASL + ASL + ADC.w #BSODFontGFX + STA.b $08 + + LDA.b VWFP + AND.w #$FFF8 + STA.w VWFX + + LDA.b VWFP + AND.w #$0007 + STA.w VWFS + + ; carry set on purpose to add letter spacing + SEC + LDA.w BSODCharWidths,X + AND.w #$00FF + ADC.b VWFP + STA.b VWFP + + LDY.w #$0000 + +.next_row + LDA.b ($08),Y + AND.w #$00FF + XBA + LDX.w VWFS + BEQ ++ + +-- LSR + DEX + BNE -- + +++ LDX.w VWFX + SEP #$20 + ORA.w $1008,X + STA.w $1008,X + + XBA + ORA.w $1000,X + STA.w $1000,X + + REP #$20 + INX + STX.w VWFX + + INY + CPY.w #$0008 + BCC .next_row + + RTS + +;=================================================================================================== + +LoadBSODHexFont: + REP #$20 + + LDA.w #BSODHex + STA.w $4302 + + LDA.w #$1801 + STA.w $4300 + + LDA.w #$1000 + STA.w $4305 + + LDA.w #$2800 + STA.w $2116 + + SEP #$20 + LDA.b #BSODHex>>16 + STA.w $4304 + + LDA.b #$01 + STA.w $420B + + REP #$30 + + RTS + +;=================================================================================================== + +ConfigureBSODVWF: + REP #$30 + + LDA.w #$2100 + TCD + + SEP #$30 + + LDX.b #$FF + LDY.b #$7F + + STZ.b $2121 + STZ.b $2122 : STZ.b $2122 + + STX.b $2122 : STY.b $2122 + + LDA.b #$05 + STA.b $2121 + + LDA.b #$11 : STA.b $2122 : STY.b $2122 + + LDA.b #$21 : STA.b $2121 + STX.b $2122 : STY.b $2122 + + LDA.b #$25 : STA.b $2121 + LDA.b #$11 : STA.b $2122 : STY.b $2122 + + REP #$30 + + PEA.w $0001 + + LDA.w #15 + STA.w $28 + + LDA.w #$0042>>1 + BRA .start + +.next_row + PHA + + LDA.w $20 + CLC + LDA.w $20 + ADC.w #32 + +.start + STA.w $20 + STA.b $2116 + + PLA + + LDY.w #30 + +.next_char + STA.b $2118 + INC + DEY + BNE .next_char + + DEC.w $28 + BNE .next_row + + LDA.w #$0000 + TCD + +ResetVFW: + REP #$30 + + LDX.w #$0400 + +-- STZ.w $1000,X + DEX + DEX + BPL -- + + STZ.b VWFL + STZ.b VWFX + STZ.b VWFS + STZ.b VWFP + + RTS + +;=================================================================================================== + +ConfigurePPUForFailureReport: + SEP #$30 + + PHK + PLB + + STZ.w $2105 ; BG mode 0 + STZ.w $2106 ; no mosaic + STZ.w $2107 ; BG1 tilemap to $0000 + STZ.w $212D + + STZ.w $210D : STZ.w $210D + STZ.w $210E : STZ.w $210E + STZ.w $210F : STZ.w $210F + STZ.w $2110 : STZ.w $2110 + + + STZ.w $2123 + STZ.w $2131 + STZ.w $2133 + + LDA.b #$04 + STA.w $2108 ; BG1 tilemap to $0800 + + LDA.b #$21 + STA.w $210B + + LDA.b #$03 + STA.w $212C + + RTS + +;=================================================================================================== + +BSODHex: +incbin "bsodhex.2bpp" + +BSODFontGFX: +incbin "bsodfont.1bpp" + +BSODCharWidths: + ; [space] + db 3 + + ; A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + db 4, 4, 3, 4, 3, 3, 4, 3, 1, 4, 3, 3, 5, 4, 4, 4, 5, 4, 4, 3, 4, 5, 5, 3, 3, 3 + + ; 0 1 2 3 4 5 6 7 8 9 . # ? - / , ' + db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 5, 8, 3, 3, 2, 1 + +;=================================================================================================== + +pulltable diff --git a/hooks.asm b/hooks.asm index 9821194..a3ade27 100755 --- a/hooks.asm +++ b/hooks.asm @@ -38,6 +38,28 @@ JML.l CheckZSNES ReturnCheckZSNES: ;-------------------------------------------------------------------------------- +;================================================================================ +; Ok so basically, in rare cases, major glitches may try to read far into the +; A bus until they reach a value of $FFFF +; For maximum security of vanilla behavior, I am reserving this space +; that could otherwise be considered free ROM. +;-------------------------------------------------------------------------------- +org $0089C2 +dw $FFFF, $FFFF, $FFFF, $FFFF +dw $FFFF, $FFFF, $FFFF, $FFFF +dw $FFFF, $FFFF, $FFFF, $FFFF + +;================================================================================ +; BSOD for BRK and COP opcodes +;-------------------------------------------------------------------------------- +org $00FFB7 +SoftwareInterrupt: +JML Crashed + +org $00FFE4 : dw SoftwareInterrupt +org $00FFE6 : dw SoftwareInterrupt +org $00FFF4 : dw SoftwareInterrupt + ;================================================================================ ; Dungeon Entrance Hook (works, but not needed at the moment) ;-------------------------------------------------------------------------------- diff --git a/zsnes.asm b/zsnes.asm index 5c27ec6..734defb 100644 --- a/zsnes.asm +++ b/zsnes.asm @@ -11,6 +11,5 @@ CheckZSNES: LDA #$01FF : TCS ; thing we wrote over - initialize stack JML.l ReturnCheckZSNES .zsnes - -STP ; ! + JML DontUseZSNES ;--------------------------------------------------------------------------------