To clear something up 02022b4c is value checked by several routines (for more than one thing). This value is set at the routine for special 0x156 (this routine is called by a special pokemon battle, not the special). It checks a word at 02022b4c, if the 3rd byte of the word is 80, you don't have the silph scope, marowak doesn't appear and can't be battled. If it's set it to A0 you do have the silph scope, marowak appears and can be battled. Either way, it is still uncatchable. Also I say "3rd byte of the word" but when the game writes the value, it writes it as a halfword.
Example of what the byte would look like: 0000A000, 00008004
Special 0x156 routine: 0807F904
If you go into a wild battle, and have it break at the first write to 02022b4c, then write 0000a000, you'll get the ghost to show up, and the marowak-animation sequence with an uncatchable pokemon. If you write 00008000, you'll get the ghost to show up, but you won't be able to identify or battle it. No matter what, the pokemon is uncatchable. So I'm sure that the catchable/uncatchable value is either stored somewhere completely different, or at 02022b4c at a different point in time.
Also, while testing, I found that setting the last byte to 1C will get you the tutorial battle with Gary/Oak.
The script that the marowak uses: 081634B8
Special 0x156 is never used, but it's routine is called by the wildbattle2 (or it could be one of the two other special commands for all I know).
0807F730 is a check for a regular pokemon vs wild ghost pokemon battle. If 0 is set then 0 is stored at 02022b4c and you get a regular battle, if 1 is set then you get a unidentified ghost pokemon battle.
Also while messing around, I found out that the tutorial battle vs gary happens when you set the last byte equal to 1c. It does take priority over the ghost battles so that gets mention.
EDIT: I've figured out how make a pokemon uncatchable.
During a battle set the word 02022b4c equal to 0x8000. After refreshing the battle(go into your bag or something), it becomes an uncatchable ghost.
If you set it to 0xA000 however, it becomes an uncatchable pokemon.
It's worth mention that setting it to 0x2000 does not make a pokemon uncatchable. So it's not 1 bit that makes it uncatchable.
0x8000 - (00000000000000001000000000000000) Uncatchable ghost, does not change the name to ghost though.
0xA000 - (00000000000000001010000000000000) Uncatchable pokemon.
0x2000 - (00000000000000000010000000000000) I speculated that it would make the pokemon uncatchable but it does NOT. YOU get a regular battle, a catchable pokemon if you set it equal to this.
- However, the problem with setting it equal to 0xA000 before the battle is the text still prints that a "ghost appears" and then it goes through the animation and prints "it was a mother marowak."
- I think the bit set with 0x2000 is the silph scope bit somehow.