What is it?
It's some chat commands that let you write to my SNES's memory via the SD2SNES.
Because it could be fun.
!write HEX_ADDRESS HEX_VALUE !writeEx HEX_ADDRESS HEX_VALUE HEX_ADDRESS HEX_VALUE HEX_ADDRESS HEX_VALUE HEX_ADDRESS HEX_VALUE !w HEX_ADDRESS HEX_VALUE HEX_ADDRESS HEX_VALUE
What's new in 2.0 Beta?
Mostly stability fixes. CARL modules are no longer run during NMI, so fewer seizures. CARL modules can also be unloaded from the ASM itself. The protocol is documented on the Docs page. I may change this later...but I'll fix y'all's code if I do.
From 2.0 Alpha:
A new way to load assembly directly into Super Mario World and other games.
How it works?You !load and !unload short assembly modules by name from the Listings page.
Or you can add new ones!You have to login via Twitch, but after that, you can use the ASM Editor right in your browser.
You should probably read the Docs page if you're going to write any ASM though.It covers your execution environment and some gotchas.
You can now do linear writes. Makes it a bit easier to do long runs of writes.
!wl HEX_ADDRESS HEX_VALUE HEX_VALUE HEX_VALUE
!w HEX_ADDRESS $HEX_ADDRESS
!w HEX_ADDRESS *HEX_ADDRESS
You can now copy values from memory. It's restricted to WRAM for the time being, and you must prefix your value with a $ or a *.
!w 0x7E0DBE 0x09 -- Sets Mario's lives to 10 !w 0x7E1493 0xFF -- Ends the level, like Mario touched the ORB !w 0x7E0019 0x02 -- Gives Mario a cape.
And plenty more. Try some random ones and see if they crash the game! Or take a look at this partial memory map and try to do something interesting.
There's also a bunch of handy diagrams for hacking some of the graphics.
For your convenience, some of the commonly used addresses now are available as !commands:
!bonus_game_1ups 0xNN !bonus_game_end_timer 0xNN !can_climb_on_air 0xNN !can_scroll 0xNN !disable_ground_collision 0xNN !end_level_timer 0xNN !enemy_hop_counter 0xNN !freeze_everything 0xNN !generator_type 0xNN !invulnerability_timer 0xNN !is_multiplayer 0xNN !is_paused 0xNN !is_player2 0xNN !is_player2_overworld 0xNN !is_water_current 0xNN !is_water_level 0xNN !keyhole_timer 0xNN !layer_1_shake_timer 0xNN !loose_yoshi_flag 0xNN !luigi_overworld_x_hi 0xNN !luigi_overworld_x_lo 0xNN !luigi_overworld_y_hi 0xNN !luigi_overworld_y_lo 0xNN !luigi_submap 0xNN !mario_overworld_x_hi 0xNN !mario_overworld_x_lo 0xNN !mario_overworld_y_hi 0xNN !mario_overworld_y_lo 0xNN !mario_submap 0xNN !message_box_dispatch 0xNN !mode 0xNN !mosaic_value 0xNN !music_dispatch 0xNN !p_meter 0xNN !player_mode_dispatch 0xNN !player_stun_timer 0xNN !powerup 0xNN !pswitch_blue_timer 0xNN !pswitch_silver_timer 0xNN !queued_lives 0xNN !reserve_item 0xNN !screen_display_value 0xNN !scroll_mode 0xNN !scroll_screen 0xNN !side_exit_flag 0xNN !slippery_amount 0xNN !sparkle_timer 0xNN !star_timer 0xNN !switch_palace_flags 0xNN !timer_hundreds 0xNN !timer_ones 0xNN !timer_tens 0xNN !transition_counter 0xNN !transition_stars 0xNN !vx 0xNN !vy 0xNN !yoshi_egg_sprite 0xNN !yoshi_egg_timer 0xNN
You could also use !read (!r) HEX_ADDRESS to see the current value of anything you're interested in changing.
Also, us ng 0x to prefix your hex numbers is optional, but encouraged. They will, however, always be interpreted as hex.