Table of Contents
--------------------------------------------------------------------------
1.0 Introduction
2.0 About the 65c816
3.0 Language Structure
4.0 Expanding a ROM
4.1 Chart of ROM sizes in Mbits
5.0 Pointer Structure
5.1 LoRom Address Equation
5.2 Pointer Equations
6.0 Title Screen Replacement
6.1 Programs to Use
7.0 A Simple Fadeout Routine
8.0 Where to Get Needed Tools
9.0 Credits
9.1 Document Information
Appendix A - 65c816 Instruction Set & Syntax
--------------------------------------------------------------------------
1.0 Introduction
This document was written for the aspiring ROM hacker with little to no experience in 65c816 programming. The basics have been thouroughly covered and I believe this should prove a significant aid to anyone interested in 65c816 ROM hacking. Hopefully this proves true. If you benefit from this document or have suggestions for changes to make to it, please eMail me at [email protected] with your comments. In the end, you the user determines the future of this document. For updates to this document check http://id.dragonfire.net/ ... Unless of course it is now the year 2001 and this has become another document floating around on an FTP with some author nobody knows what happened to. Then yer up shit creek :-)
--------------------------------------------------------------------------
2.0 About the 65c816
This processor was Nintendo's pride and joy for quite a few years. Basically, it is an upgrade to the good ole 6502 processor used in such popular systems as the NES and the Commodore Amiga. The main feature added was 24 bit addressing but the processor also supported a whole slew of new instructions and lots of other fetures you don't need to know about. Basically, this little guy chugged along at a whopping 2.68Mhz, not even as fast as the Sega Genesis though a couple years later. But the main power was it's ability to display 256 colors in four different layers on screen at a time. That and a lot of other super-neat things helped it in competeing on the 16-bit market and earn a place in all our hearts.
--------------------------------------------------------------------------
3.0 Language Structure
Well, time to make things get very very ugly. I'm sure you all are used to things like QBasic or C where you get to type in commands like;
10 Print "Hello World!"
or
cout<<"Hello World!"<0 wait
CPY #$0000 ; x=0
BNE loop ; if y<>1 loop
LDX #$00cf
dark
LDA $4210 ; vertical blank active?
AND #$80
BEQ dark ; if no, do dark
DEX
CPX #$0000
BNE dark ; if x<>0 then dark
This is closely based off of one of BeXXX's examples for a fadeout. But instead of drunked german notation, it has fairly understandable english notation so hopefully youc an now see the logic of this. Basically it's a looping routine that keeps decreasing the lightness to dark untill the screen is blanked.
--------------------------------------------------------------------------
8.0 Where to Get Needed Tools
I have a wide selection of tools at my webpage in the 65c816 section. http://id.dragonfire.net/
You can also get many things in terri public ftp. ftp://teeri.oulu.fi/pub/console/nintendo/
--------------------------------------------------------------------------
9.0 Credits
The following people have contributed to this text (whether they know it or not). Many many thanks go out to them.
Neill Corlett - reminded me of the lorom equation one time when I forgot it
Frank Hughes - tons of help and elpaling back when I was working on Ranma
Jeremy Chadwick - putting up with my stupid questions back when I was first learning
Carnivore - made a super-keen instruction -> output table I use
Amalgam - making sure this was semi-comprehensible.
--------------------------------------------------------------------------
9.1 Document Information
Questions, comments or complaints can be sent to me via eMail at [email protected]. Copyright c 1999 SysTEm[id]. All rights reserved. Last updated Sunday, April 25, 1999
--------------------------------------------------------------------------
Appendix A - 65c816 Instruction Set & Syntax
OpCode
Description
Syntax
SEP
Set Bits in P
sep #$30
ADC
Add With Carry
adc #$12
AND
Logical AND
and #$12
BIT
Bit Test
bit #$12
CMP
Compare Accumulator
cmp #$12
CPX
Compare X Register
cpx #$12
CPY
Compare Y Register
cpy #$12
DEC
Decrement Accumulator or Memory
dec $12
EOR
Exclusive OR Accumulator
eor #$12
INC
Increment Accumulator or Memory
inc $12
LDA
Load Accumulator
lda $12
LDX
Load X Register
ldx #$12
LDY
Load Y Register
ldy #$12
ORA
Logical OR Accumulator
ora #$12
ROL
Rotate Left Acc or Mem
rol $12
ROR
Rotate Right Acc or Mem
ror $12
SBC
Subtract With Carry
sbc #$12
STA
Store Accumulator
sta $12
STZ
Store X Register
stx $12
STY
Store Y Register
sty $12
CLR
Store a 0 into Memory
clr $12
BCC
Branch if Carry Clear
bcc $601e5
BCS
Branch if Carry Set
bcs $601e5
BEQ
Branch if Equal
beq $601e5
BMI
Branch if Minus
bmi $601e5
BNE
Branch if Not Equal
bne $601e5
BPL
Branch if Plus
bpl $601e5
BRA
Branch Always
bra $601e5
BVC
Branch if Overflow Clear
bvc $601e5
BVS
Branch if Overflow Set
bvs $601e5
CLC
Clear the Carry Flag
clc
CLD
Clear the Decimal Flag
cld
CLI
Clear the Interrupt Flag
cli
DEX
Decrement X Register
dex
DEY
Decrement Y Register
dey
INX
Increment X Register
inx
INY
Increment Y Register
iny
NOP
No Operation
nop
PLA
Pop Accumulator
pla
PLP
Pop P
plp
PLX
Pop X Register
plx
PLY
Pop Y Register
ply
SED
Set Decimal Flag
sed
SEI
Set Interrupt Flag
sri
TAX
Transfer Accumulator to X
tax
TAY
Transfer Accumulator to Y
tay
TSX
Transfer S to X
tsx
TXA
Transfer X to Accumulator
txa
TXS
Transfer X to S
txs
TXY
Transfer X to Y
txy
TYA
Transfer Y to Accumulator
tya
XCE
Exchange Carry w/ Emulation Bit
xce
BRK
Break Point Instruction
brk #$12
CSP
Call System Procedure
csp #$12
JMP
Jump to New Location
jmp $1234
JSR
Jump to Subroutine
jsr $1234
MVN
Block Move (decrement)
mvn $1234
MVP
Block Move (increment)
mvp $1234
RTI
Return From Interrupt
rti
RTL
Return From Long Subroutine
rtl
RTS
Return From Short Subroutine
rts
HLT
Halt the Clock
hlt
WAI
Wait for Interrupt
wai
SWA
Swap Accumulator
swa
I know this list is missing a lot of instructions, this is just the list of instructions I know for certain is supported by all the assemblers out there. Sorry to tell you but there is even more to learn. Hope this helps you to make sense out of some of assembler mess early on in the document.