pushtable table "bsodencode.txt" ; Uncomment this to force a crash to test message ;pushpc ; org $8132 : 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 SEP #$20 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_line1 : JSR DrawVWFLine LDA.w #ZSNESMessage_line2 : JSR DrawVWFLine LDA.w #ZSNESMessage_line3 : JSR DrawVWFLine LDA.w #ZSNESMessage_line4 : JSR DrawVWFLine LDA.w #ZSNESMessage_line5 : JSR DrawVWFLine LDA.w #ZSNESMessage_line6 : JSR DrawVWFLine LDA.w #ZSNESMessage_line7 : JSR DrawVWFLine LDA.w #$0F0F STA.w $2100 -- BRA -- ZSNESMessage: .line1 db "It has been detected that you are attempting to play", $FF .line2 db "this ROM on a low-quality emulator.", $FF .line3 db "The randomizer is designed to work on real hardware,", $FF .line4 db "which this application cannot emulate properly;", $FF .line5 db "As such, this ROM file refuses to boot.", $FF .line6 db "Please upgrade to a more accurate emulator such as", $FF .line7 db "SNES9X or BSNES/higan.", $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 SEP #$20 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 ;=================================================================================================== ; Create report REP #$30 LDA.w #$2100 TCD ;--------------------------------------------------------------------------------------------------- ; Report status ; stack pointer LDA.w #$0438>>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 #$0478>>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 ; 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 LDA.l UselessStackTooFar ; also comment out this line when doing the above ; 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 #$0404>>1 .next_row STA.l $7F0002 STA.l $7F0004 LDY.w #20 .next_char STA.b $2116 TXA CMP.l $7F0100 LDA.l $000000,X AND.w #$00FF ORA.w #$0500 BCS ++ AND.w #$01FF ++ STA.b $2118 DEX TXA CMP.l $7F0000 BEQ .skip_stack DEY BEQ .done_row LDA.l $7F0002 INC STA.l $7F0002 BRA .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 REP #$30 SEP #$10 LDA.w #$0000 TCD TSC STA.b $80 ; remember stack for later messages JSR ConfigurePPUForFailureReport JSR ConfigureBSODVWF JSR LoadBSODFont STZ.b VWFR LDA.w #BSODMessage_line1 : JSR DrawVWFLine LDA.w #BSODMessage_line2 : JSR DrawVWFLine LDA.w #BSODMessage_line3 : JSR DrawVWFLine LDA.w #BSODMessage_line4 : JSR DrawVWFLine LDA.w #BSODMessage_line5 : JSR DrawVWFLine LDA.w #BSODMessage_line6 : JSR DrawVWFLine LDA.w #BSODMessage_line7 : JSR DrawVWFLine LDA.w #$0F0F STA.w $2100 -- BRA -- ; LDA.w #$0000 ; TCD ; ; TSC BSODMessage: .line1 db "A fatal error has occurred and resulted in an", $FF .line2 db "unrecoverable crash. ?", $FF .line3 db "If you believe this is the result of a bug caused by", $FF .line4 db "the randomizer itself, please screenshot this message", $FF .line5 db "and share it in the #bug-reports channel of the official", $FF .line6 db "ALTTPR discord, along with a detailed description of", $FF .line7 db "what you were doing, including video if available.", $FF ;=================================================================================================== DrawVWFLine: STA.b $06 .next LDA.b ($06) AND.w #$00FF CMP.w #$00FF BEQ .done_row JSR DrawFailureVWFChar INC.b $06 BRA .next .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 LDA.b #$80 STA.w $2115 REP #$20 JMP ResetVFW .row_offset dw $10F8 dw $11E8 dw $12D8 dw $13C8 dw $14B8 dw $15A8 dw $1698 dw $1788 ;=================================================================================================== VWFL = $40 VWFX = $44 VWFS = $46 VWFP = $48 VWFR = $4A ;=================================================================================================== DrawFailureVWFChar: REP #$30 PHY PHX 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 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 REP #$30 PLX PLY RTS ;=================================================================================================== LoadBSODFont: REP #$20 LDA.w #BSODHex STA.w $4302 LDA.w #$1801 STA.w $4300 LDA.w #$1000 STA.w $4305 LDA.w #$1800 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 #$20 STZ.b $2121 STZ.b $2122 STZ.b $2122 LDA.b #$FF STA.b $2122 LDA.b #$7F STA.b $2122 STZ.b $2122 STZ.b $2122 STZ.b $2122 STZ.b $2122 STZ.b $2122 STZ.b $2122 LDA.b #$11 STA.b $2122 LDA.b #$7F STA.b $2122 REP #$20 PEA.w $0001 LDA.w #8 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 $210D STZ.w $210D STZ.w $210E STZ.w $210E STZ.w $2123 STZ.w $2131 STZ.w $2133 LDA.b #$01 STA.w $210B STA.w $212C STA.w $212D 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, 4, 4, 3, 3, 4, 3, 1, 4, 3, 3, 5, 4, 4, 4, 5, 4, 4, 3, 4, 5, 5, 3, 5, 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