What the Motorola 68000 is
The Motorola 68000 is a CISC microprocessor from Motorola's 68k family. In practical Mega Drive work, you can think of it as the main processor that reads instructions from ROM, manipulates data in registers and memory, and coordinates the rest of the machine. It is often described as a 16/32-bit CPU: its programmer-visible registers are 32 bits wide, while the original 68000 communicates with external data through a 16-bit bus.
Why it is called 68000
The name belongs to Motorola's 6800 lineage, and it is commonly linked to the chip's roughly 68,000-transistor scale. That name is useful historical context, but it should not be read as a direct description of the instruction set or the size of every register.
Role in Sega Mega Drive / Genesis
In the Sega Mega Drive / Genesis, the 68000 is the central CPU for game logic. It drives the main program, prepares graphics and gameplay state, talks to the Video Display Processor, handles input and timing-sensitive routines, and coordinates with the Z80 sound side. The exact workload depends on the game, but for ROM hacking and reverse engineering the 68000 code is usually where the core rules and control flow begin.
General architecture
The original 68000 presents a clean programmer model: eight data registers, eight address registers, a Program Counter, and a Status Register. It can operate on bytes, words, and long words, and it has many addressing modes for moving between constants, registers, and memory. Mega Drive ROMs are also big-endian, which affects how multi-byte values appear in a hex editor.
Data and address registers
Data registers are named D0 through D7. They are general-purpose registers commonly used for arithmetic, counters, flags, temporary values, and packed game data. A word-sized instruction such asmove.waffects the lower 16-bit word of the destination data register.
Address registers are named A0 through A7. They normally hold memory addresses: pointers to tables, object data, tile maps, strings, stacks, or routines. A7 is also used as the stack pointer, so code that pushes values, calls subroutines, or returns from them depends on it being valid.
Program Counter and Status Register
The Program Counter points to the next instruction the CPU will fetch. Branches, jumps, traps, interrupts, and subroutine calls all change the flow by changing what the Program Counter will point to next.
The Status Register stores processor state. For everyday assembly reading, the most visible part is the condition code flags, such as zero, negative, carry, overflow, and extend. Compare and arithmetic instructions update these flags, and branch instructions read them to decide whether execution should continue normally or jump somewhere else.
Big-endian data and sizes
The 68000 is big-endian. When a multi-byte value is stored in ROM or RAM, the most significant byte comes first. For example, the word value$1234appears as 12 34in byte order, not34 12.
| Size | Bits | Common suffix | Typical use |
|---|---|---|---|
| Byte | 8 | .b | Small counters, flags, packed fields |
| Word | 16 | .w | Coordinates, tile IDs, many hardware values |
| Long word | 32 | .l | Pointers, larger arithmetic, full registers |
Code and data
Code is made of instructions the CPU executes. Data is information those instructions read or modify: numbers, pointers, animation frames, palette values, text, collision tables, and many other structures. In a ROM, code and data can sit close together, so one of the first reverse engineering skills is learning when bytes are being executed as instructions and when they are simply being read as values.
Simple assembly example
move.w #10,d0
add.w #5,d0
rtsmove.w #10,d0places the value 10 into the word part of D0. The suffix.wmeans this is a word-sized operation.
add.w #5,d0adds 5 to that word value in D0. After those two instructions, the word value being worked on is 15.
rtsreturns from the subroutine by taking the return address from the stack and continuing execution there.