585 lines
9.1 KiB
NASM
585 lines
9.1 KiB
NASM
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
|
|
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 load", $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
|
|
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 #$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
|
|
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
|
|
|
|
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:
|
|
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
|
|
|
|
;===================================================================================================
|
|
|
|
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, 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
|