Recently I hacked a Mario Brothers Cartridge and erased everything but the clouds. This continuous work was being carried out by myself and your favorite BEIGE representatives Paul Davis, Joe Beuckman, and Joe Bonn. This page is a tutorial explaining how / why the work was made. I have chosen to present my motives behind the work by adding my thoughts about the project as comments in the source code. As a programmer [not a very good one, though a programmer none the less] my thoughts and motives are most easily exemplified by my code. Also: thanks for 21c for letting post this.
Note: I am in the process of changing the code for this...because I intend to start working on more cartridges with sound, I am rewriting the code for a different assembler X11 using code by Beige's Paul Davis that we used for our Landscape Cartridge....please stay tuned....
Thank you, Cory Arcangel / BEIGE
SOURCE CODE [with comments]:
Below I will go through the source code line by line. The idea here is to simply write a program that will take the clouds from Mario Brothers and scroll them across the screen. Here comes the first line of code:
; BEIGE 2002 - Cory Arcangel
; "you mess with the best, you die like the rest" - Anon
; "punks jump up to get beat down" ¬ Brand Nubian
When computer code is made public it is common for programmers to put contact information for a variety of reasons. Here I have also included a few small phrases aimed at media artists who think they can step to my style. This is a trait I inherited from the early commodore64 cracking scene.
Before I get started with the code I would like to take this opportunity to state that I am not really a programmer. The first time I took a class in "computer science" was at a summer school when I was 8 or 9 years old and I remember crying and switching to the "storytelling" class. Years later in college I still didn't like computer science and got below 50% on most of my exams. I have grown used to programming since only because it is the mechanism that seems to make most of the world move. Believe me, if I could order Pizzas [dominos has a great online delivery mechanism], by painting, I definitely would paint. So the first line in this program that actually does anything is:
The above line, along with the rest of this program, is written in a language called assembly language. Assembly language is the lowest level someone can program. It is one step away from the ones and zeros, and in some cases involves actual ones and zeros. I tend to prefer assembly because it gives me control over the machine and assures me that aesthetic choices are based on the hardware of the machine and not, say, some dupe at Macromedia. The above line of code tells our assembler that the processor for with which we intend our program to run on is the 6502 chip. This is the chip that made the Apple II possible and thus revolutionized home computing. The Nintendo runs on a modified version of this chip. It should not be suprising that the Nintendo and Apple run on the same processor because video game systems are really just home computers with out disk drives.
DELAYSCROLL EQU #$01
NTShow EQU #$00
SCROLL EQU #$00
ORG $8000 ;32Kb PRG-ROM, 8Kb CHR-ROM
I like the idea of making things out of trash [one can easily find an NES in a dumpster these days], and I like the idea of actually having to break into something that I find in the trash even better. The only way to make work for the NES is to hack and solder a cartridge. To do this, I will clip off the program chip from an actual Mario cartridge, burn my new information [the output of this code compiled] to a chip, and solder it in the place of the old one. The above line tells the compiler that the chip we want this code to be burned on is 32k.
The next part of code tells the cartridge what to do when we press the reset button on the NES. This code is from a Canadian NES genius named Chris Covell, who apparently got it from Duck Hunt. Awesome. I learned to program in assembly language looking at examples of code posted by Chris Covell, and as with a lot of this 8-bit work, information comes mostly from a hobby scene. In my opinion these are the true hero's of contemporary computer art. Out of the hobby scene have come portable playstations, Dreamcasts that boot LINUX, and even hard drives that play music by spinning at different speeds.
cld ;Clear decimal flag
sei ;Disable interrupts
.WaitV lda $2002
.Clear sta ($00),y
.ClearPPU sta $2007
.ClearSpr sta $2004
ldx #$0D ;Colour Value (White)
ldy #$20 ;Clear BG & Sprite palettes.
.InitPal stx $2007
Here I am unscrewing a Mario Brothers Cartridge. I usually get them from here, or here, or here.
Inside one will find this. Small isn't it? The chip on the left contains the Mario graphics and the chip on the right contains the program code.
Ever wonder why Mario and Zelda were little squares? The Nintendo can only display graphics in 8 pixel by 8 pixel squares, and can only hold 8k of graphics in total therefore Mario and Zelda were simply adhering to the hardware limitations of the Nintendo System. These two hardware limitations defined the aesthetic of most early 80's video games on the Nintendo, and making "art" for this system is a study of these limitations. Below I load up the color that this cartridge will use into the palette RAM. The Nintendo can only display 4 colors in any 8*8 square. For this cartridge I will use black, blue, light blue and white which translates to $od, $11, $21, $30 in the Nintendos palette.
lda #$21 ;background [powder blue]
lda #$30 ;cloud inside [white]
lda #$11 ; highlight [blue]
lda #$0d ;outline [black]
Here I am clipping off the program chip.
A typical NES Cartridge has two chips. One is a graphics chip, and the other is a program chip. Basically the program chip tells the graphics chip where to put the graphics, and thus if you do this in a interesting manner, you have a video game. When making a "Super Mario Clouds" cartridge, I only modify the program chip, and I leave the graphic chip from the original game intact. Therefore since I do not touch the graphics from the original cartridge, the clouds you see are the actual factory soldered clouds that come on the Mario cartridge. There is no generation loss, and no "copying" because I did not even have to make a copy. Wasss up.
The code below is where I load up the clouds.
lda #$20 ;Load up entire name & attribute table for screen 0.
lda ($00),X ;Load up NES image
These cartridges use 32k 28 pin 8-bit Eproms. Usually I get Am27C256. Try Jameco for these.
For this cartridge I simply draw everything and then turn the screen on. The NES can not just draw a picture to the screen like a modern computer [in fact to make something that looks similar on a modern computer would take about 3 minutes in Photoshop ]. It is too slow for that, so in order to change backgrounds one has to turn the screen off, draw a new picture, and turn it back on again. This is why the screen goes black for a split second between worlds on most early NES games. I turn the screen on by placing a sequence of ones and zeros into a specific Nintendo memory location. One highlight of working in assembly language is being able to actually use ones and zeros.
sta $24 ;scroll
Below is the file which sets the pattern of the clouds. I typed this by hand. I really didn't need to do it by hand, but it makes me feel better. Not that anyone could ever see the difference anyway, so you will just have to trust me. It is written in a format called HEX which is shorthand for binary.
INCLUDE Clouds.NAM -< click HERE
That's it for the intro code. Now below I make it scroll
Once you solder on a 28pin low profile socket and solder it onto the board where you clipped off the program chip you sawp these chips in and out of the cartridge.
A TV works by drawing a picture faster than your eye can see every 1/60th of a second. [In Europe it is 1/50th] Every time this scan line gets to the bottom of the screen it has to jump back to the top. This is called a vertical blanking interrupt. The NES can only draw graphics to the screen when this line is jumping from the bottom of the screen to the top. Below is the code which scrolls the clouds during this period where the electron beam is jumping. A highlight of working on early game systems is this intimate access to the display machanism of the television.
cmp $24 ;scroll
inc $24 ;scroll
lda $24 ;scroll
That's all the code. Now we just need to set the vector table appropriately. This tells the cartridge what to do when you put it in.
dc.w IRQ_Routine ;Not used, just points to RTI
The end. The cartridge is complete. Not that bad. Actually programming for the NES is pretty simple. Now I would compile this program, and then burn it to a chip. Check the pictures along the side of the page.
Download the cartridge here:
The end cartridge work in an standard Nintendo. As my friend DRX in Bodenstandig would say "kick the balistixx"
Another example of plug and play technbology 1984 style.
Hardware / Software
Mario Brothers Cartridge