|
|||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--NMOS6502
The NMOS6502 class emulates the standard NMOS 6502 microprocessor.
This is an early version that has not been completely tested !!
So it is buggy. ;o)
Unofficial opcodes and addressing modes are not implemented.
IRQ implementation is incomplete.
I would like to thank all the people who helped (huge list).
This code is GPL. :o)
This version is fast enough.
It can be extended to other CPU quite easily (you will have to modify this code a little bit if you plan to port Juergen's code, i will try to explain it later, or maybe i will do it).
Why not port Mame/Mess to Java ??
Copyright (c) 2000 Brice Fines.
Field Summary | |
protected UInt8 |
accumulator
Accumulator register. |
private int |
after_cli
Pending IRQ and last instruction cleared I. |
private int |
CLEAR_LINE
Clear line value. |
protected Pair |
effectiveAddress
Effective address. |
private int |
F_B
B flag value. |
protected int |
F_C
C flag value. |
protected int |
F_D
D flag value. |
private int |
F_I
I flag value. |
protected int |
F_N
N flag value. |
private int |
F_T
T flag value. |
protected int |
F_V
V flag value. |
protected int |
F_Z
Z flag value. |
protected int |
iCount
Number of cycles left. |
private int |
irq_callback
IRQ callbak. |
private int |
irq_state
IRQ state. |
private int |
M6502_INT_IRQ
IRQ interrupt value. |
private int |
M6502_INT_NMI
NMI interrupt value. |
private int |
M6502_INT_NONE
No interrupt value. |
private int |
M6502_IRQ_VEC
IRQ vector value. |
private int |
M6502_NMI_VEC
NMI vector value. |
private int |
M6502_RST_VEC
Reset vector value. |
private int |
M6502_SET_OVERFLOW
SET_OVERFLOW value. |
private int |
nmi_state
NMI state. |
protected int |
pending_irq
Nonzero if a NMI or IRQ is pending. |
private Pair |
previousProgramCounter
Previous program counter. |
protected UInt8 |
processorStatus
Processor status register. |
protected Pair |
programCounter
Program counter. |
private int |
so_state
Set overflow state. |
protected Pair |
stackPointer
Stack pointer. |
protected int |
tmp
Temporary variable used in adressing modes. |
protected UInt8 |
xIndexRegister
X index register. |
protected UInt8 |
yIndexRegister
Y index register. |
private Pair |
zeroPageAddress
Zero page address. |
Constructor Summary | |
NMOS6502()
Constructor. |
Method Summary | |
protected void |
ADC()
Add with carry. |
private void |
AND()
Logical AND. |
private void |
ASL()
Arithmetic shift left. |
private void |
BCC()
Branch if carry clear. |
private void |
BCS()
Branch if carry set. |
private void |
BEQ()
Branch if equal. |
private void |
BIT()
Bit test. |
private void |
BMI()
Branch if minus. |
private void |
BNE()
Branch if not equal. |
private void |
BPL()
Branch if plus. |
private void |
BRA(boolean condition)
Branch relative. |
private void |
BRK()
Break. |
private void |
BVC()
Branch if overflow clear. |
private void |
BVS()
Branch if overflow set. |
private void |
changePC16(int value)
This is provided as a dummy function. |
private void |
CLC()
Clear carry flag. |
private void |
CLD()
Clear decimal flag. |
private void |
CLI()
Clear interrupt flag. |
private void |
CLV()
Clear overflow flag. |
private void |
CMP()
Compare accumulator. |
private void |
CPX()
Compare index X. |
private void |
CPY()
Compare index Y. |
protected void |
debugRegisters()
Display the different registers. |
private void |
DEC()
Decrement memory. |
private void |
DEX()
Decrement index X. |
private void |
DEY()
Decrement index Y. |
private void |
EA_ABS()
Effective address = absolute address. |
protected void |
EA_ABX()
Effective address = absolute address + X. |
protected void |
EA_ABY()
Effective address = absolute address + Y. |
private void |
EA_IDX()
Effective address = zero page + X indirect. |
private void |
EA_IDY()
Effective address = zero page indirect + Y (post indexed). |
private void |
EA_IND()
Effective address = indirect. |
private void |
EA_ZPG()
Effective address = zero page address. |
private void |
EA_ZPX()
Effective address = zero page address + X. |
private void |
EA_ZPY()
Effective address = zero page address + Y. |
private void |
EOR()
Logical exclusive OR. |
protected int |
execute(int cycles)
Main loop. |
private void |
ILL()
Illegal opcode. |
private void |
INC()
Increment memory. |
private void |
INX()
Increment index X. |
private void |
INY()
Increment index Y. |
private void |
JMP()
Jump to address. |
private void |
JSR()
Jump to subroutine. |
private void |
LDA()
Load accumulator. |
private void |
LDX()
Load index X. |
private void |
LDY()
Load index Y. |
protected void |
LSR()
Logic shift right. |
private void |
m6502_set_irq_callback(int callback)
Set IRQ callback. |
protected void |
NOP()
No operation. |
private void |
opcode0x02()
Opcode 0x02. |
private void |
opcode0x03()
Opcode 0x03. |
private void |
opcode0x04()
Opcode 0x04. |
private void |
opcode0x07()
Opcode 0x07. |
private void |
opcode0x0B()
Opcode 0x0B. |
private void |
opcode0x0C()
Opcode 0x0C. |
private void |
opcode0x0F()
Opcode 0x0F. |
private void |
opcode0x12()
Opcode 0x12. |
private void |
opcode0x13()
Opcode 0x13. |
private void |
opcode0x14()
Opcode 0x14. |
private void |
opcode0x17()
Opcode 0x17. |
private void |
opcode0x1A()
Opcode 0x1A. |
private void |
opcode0x1B()
Opcode 0x1B. |
private void |
opcode0x1C()
Opcode 0x1C. |
private void |
opcode0x1F()
Opcode 0x1F. |
private void |
opcode0x22()
Opcode 0x22. |
private void |
opcode0x23()
Opcode 0x23. |
private void |
opcode0x27()
Opcode 0x27. |
private void |
opcode0x2B()
Opcode 0x2B. |
private void |
opcode0x2F()
Opcode 0x2F. |
private void |
opcode0x32()
Opcode 0x32. |
private void |
opcode0x33()
Opcode 0x33. |
private void |
opcode0x34()
Opcode 0x34. |
private void |
opcode0x37()
Opcode 0x37. |
private void |
opcode0x3A()
Opcode 0x3A. |
private void |
opcode0x3B()
Opcode 0x3B. |
private void |
opcode0x3C()
Opcode 0x3C. |
private void |
opcode0x3F()
Opcode 0x3F. |
private void |
opcode0x42()
Opcode 0x42. |
private void |
opcode0x43()
Opcode 0x43. |
private void |
opcode0x44()
Opcode 0x44. |
private void |
opcode0x47()
Opcode 0x47. |
private void |
opcode0x4B()
Opcode 0x4B. |
private void |
opcode0x4F()
Opcode 0x4F. |
private void |
opcode0x52()
Opcode 0x52. |
private void |
opcode0x53()
Opcode 0x53. |
private void |
opcode0x54()
Opcode 0x54. |
private void |
opcode0x57()
Opcode 0x57. |
private void |
opcode0x5A()
Opcode 0x5A. |
private void |
opcode0x5B()
Opcode 0x5B. |
private void |
opcode0x5C()
Opcode 0x5C. |
private void |
opcode0x5F()
Opcode 0x5F. |
private void |
opcode0x62()
Opcode 0x62. |
private void |
opcode0x63()
Opcode 0x63. |
private void |
opcode0x64()
Opcode 0x64. |
private void |
opcode0x67()
Opcode 0x67. |
private void |
opcode0x6B()
Opcode 0x6B. |
private void |
opcode0x6F()
Opcode 0x6F. |
private void |
opcode0x72()
Opcode 0x72. |
private void |
opcode0x73()
Opcode 0x73. |
private void |
opcode0x74()
Opcode 0x74. |
private void |
opcode0x77()
Opcode 0x77. |
private void |
opcode0x7A()
Opcode 0x7A. |
private void |
opcode0x7B()
Opcode 0x7B. |
private void |
opcode0x7C()
Opcode 0x7C. |
private void |
opcode0x7F()
Opcode 0x7F. |
private void |
opcode0x80()
Opcode 0x80. |
private void |
opcode0x82()
Opcode 0x82. |
private void |
opcode0x83()
Opcode 0x83. |
private void |
opcode0x87()
Opcode 0x87. |
private void |
opcode0x89()
Opcode 0x89. |
private void |
opcode0x8B()
Opcode 0x8B. |
private void |
opcode0x8F()
Opcode 0x8F. |
private void |
opcode0x92()
Opcode 0x92. |
private void |
opcode0x93()
Opcode 0x93. |
private void |
opcode0x97()
Opcode 0x97. |
private void |
opcode0x9B()
Opcode 0x9B. |
private void |
opcode0x9C()
Opcode 0x9C. |
private void |
opcode0x9E()
Opcode 0x9E. |
private void |
opcode0x9F()
Opcode 0x9F. |
private void |
opcode0xA3()
Opcode 0xA3. |
private void |
opcode0xA7()
Opcode 0xA7. |
private void |
opcode0xAB()
Opcode 0xAB. |
private void |
opcode0xAF()
Opcode 0xAF. |
private void |
opcode0xB2()
Opcode 0xB2. |
private void |
opcode0xB3()
Opcode 0xB3. |
private void |
opcode0xB7()
Opcode 0xB7. |
private void |
opcode0xBB()
Opcode 0xBB. |
private void |
opcode0xBF()
Opcode 0xBF. |
private void |
opcode0xC2()
Opcode 0xC2. |
private void |
opcode0xC3()
Opcode 0xC3. |
private void |
opcode0xC7()
Opcode 0xC7. |
private void |
opcode0xCB()
Opcode 0xCB. |
private void |
opcode0xCF()
Opcode 0xCF. |
private void |
opcode0xD2()
Opcode 0xD2. |
private void |
opcode0xD3()
Opcode 0xD3. |
private void |
opcode0xD4()
Opcode 0xD4. |
private void |
opcode0xD7()
Opcode 0xD7. |
private void |
opcode0xDA()
Opcode 0xDA. |
private void |
opcode0xDB()
Opcode 0xDB. |
private void |
opcode0xDC()
Opcode 0xDC. |
private void |
opcode0xDF()
Opcode 0xDF. |
private void |
opcode0xE2()
Opcode 0xE2. |
private void |
opcode0xE3()
Opcode 0xE3. |
private void |
opcode0xE7()
Opcode 0xE7. |
private void |
opcode0xEB()
Opcode 0xEB. |
private void |
opcode0xEF()
Opcode 0xEF. |
private void |
opcode0xF2()
Opcode 0xF2. |
private void |
opcode0xF3()
Opcode 0xF3. |
private void |
opcode0xF4()
Opcode 0xF4. |
private void |
opcode0xF7()
Opcode 0xF7. |
private void |
opcode0xFA()
Opcode 0xFA. |
private void |
opcode0xFB()
Opcode 0xFB. |
private void |
opcode0xFC()
Opcode 0xFC. |
private void |
opcode0xFF()
Opcode 0xFF. |
private void |
ORA()
Logical inclusive OR. |
private void |
PHA()
Push accumulator. |
private void |
PHP()
Push processor status (flags). |
private void |
PLA()
Pull accumulator. |
private void |
PLP()
Pull processor status (flags). |
private int |
PULL()
Pull a register from the stack. |
private void |
PUSH(int register)
Push a register onto the stack. |
protected void |
RD_ABS()
Read a value using EA_ABS and store it into tmp. |
protected void |
RD_ABX()
Read a value using EA_ABX and store it into tmp. |
protected void |
RD_ABY()
Read a value using EA_ABY and store it into tmp. |
private void |
RD_ACC()
Read accumulator value and store it into tmp. |
protected void |
RD_IDX()
Read a value using EA_IDX and store it into tmp. |
protected void |
RD_IDY()
Read a value using EA_IDY and store it into tmp. |
protected void |
RD_IMM()
Read directly a value and store it into tmp. |
protected void |
RD_ZPG()
Read a value using EA_ZPG and store it into tmp. |
protected void |
RD_ZPX()
Read a value using EA_ZPX and store it into tmp. |
protected void |
RD_ZPY()
Read a value using EA_ZPY and store it into tmp. |
protected abstract int |
RDMEM(int address)
Read from memory. |
private int |
readOpcode()
Read an opcode. |
private int |
readOpcodeArgument()
Read an opcode argument. |
protected void |
reset()
Reset the processor. |
private void |
ROL()
Rotate left. |
protected void |
ROR()
Rotate right. |
private void |
RTI()
Return from interrupt. |
private void |
RTS()
Return from subroutine. |
protected void |
SBC()
Subtract with carry. |
private void |
SEC()
Set carry flag. |
private void |
SED()
Set decimal flag. |
private void |
SEI()
Set interrupt flag. |
protected void |
set_irq_line(int irqline,
int state)
Set IRQ line. |
protected void |
set_nmi_line(int state)
Set NMI line. |
protected void |
setNZ(int condition)
Set N and Z flags in the processor status register according to condition. |
private void |
STA()
Store accumulator. |
private void |
STX()
Store index X. |
private void |
STY()
Store index Y. |
private void |
switchOpcode(int opcode)
Switch for opcode interpretation. |
protected void |
take_irq()
Take IRQ. |
private void |
TAX()
Transfer accumulator to index X. |
private void |
TAY()
Transfer accumulator to index Y. |
private void |
TSX()
Transfer stack LSB to index X. |
private void |
TXA()
Transfer index X to accumulator. |
private void |
TXS()
Transfer index X to stack LSB. |
private void |
TYA()
Transfer index Y to accumulator. |
protected void |
WB_ACC()
|
protected void |
WB_EA()
|
protected void |
WR_ABS()
Write a value from tmp using EA_ABS. |
protected void |
WR_ABX()
Write a value from tmp using EA_ABX. |
protected void |
WR_ABY()
Write a value from tmp using EA_ABY. |
protected void |
WR_IDX()
Write a value from tmp using EA_IDX. |
protected void |
WR_IDY()
Write a value from tmp using EA_IDY. |
protected void |
WR_ZPG()
Write a value from tmp using EA_ZPG. |
protected void |
WR_ZPX()
Write a value from tmp using EA_ZPX. |
protected void |
WR_ZPY()
Write a value from tmp using EA_ZPY. |
protected abstract void |
WRMEM(int address,
int data)
Write to memory. |
Methods inherited from class java.lang.Object |
|
Field Detail |
private Pair previousProgramCounter
protected Pair programCounter
protected Pair stackPointer
private Pair zeroPageAddress
protected Pair effectiveAddress
protected UInt8 accumulator
protected UInt8 xIndexRegister
protected UInt8 yIndexRegister
protected UInt8 processorStatus
private int after_cli
private int nmi_state
private int irq_state
private int so_state
protected int pending_irq
private int irq_callback
protected int iCount
protected int tmp
private final int M6502_INT_NONE
private final int M6502_INT_IRQ
private final int M6502_INT_NMI
private final int M6502_SET_OVERFLOW
private final int M6502_NMI_VEC
private final int M6502_RST_VEC
private final int M6502_IRQ_VEC
protected final int F_C
protected final int F_Z
private final int F_I
protected final int F_D
private final int F_B
private final int F_T
protected final int F_V
protected final int F_N
private final int CLEAR_LINE
Constructor Detail |
public NMOS6502()
Method Detail |
protected final void debugRegisters()
private final void changePC16(int value)
value
- is used for the new program counter.protected abstract void WRMEM(int address, int data)
address
- the memory address where you want to write.data
- the value you want to write.protected abstract int RDMEM(int address)
address
- is the memory address you want to read from.protected final void setNZ(int condition)
condition
- The condition.private final int readOpcode()
private final int readOpcodeArgument()
private final void BRA(boolean condition)
condition
- that indicates if the branch relative occurs.private final void EA_ZPG()
private final void EA_ZPX()
private final void EA_ZPY()
private final void EA_ABS()
protected final void EA_ABX()
protected final void EA_ABY()
private final void EA_IDX()
private final void EA_IDY()
private final void EA_IND()
protected final void RD_IMM()
private final void RD_ACC()
protected final void RD_ZPG()
protected final void RD_ZPX()
protected final void RD_ZPY()
protected final void RD_ABS()
protected final void RD_ABX()
protected final void RD_ABY()
protected final void RD_IDX()
protected final void RD_IDY()
protected final void WR_ZPG()
protected final void WR_ZPX()
protected final void WR_ZPY()
protected final void WR_ABS()
protected final void WR_ABX()
protected final void WR_ABY()
protected final void WR_IDX()
protected final void WR_IDY()
protected final void WB_ACC()
protected final void WB_EA()
private final void PUSH(int register)
register
- the byte to push.private final int PULL()
protected void ADC()
private final void AND()
private final void ASL()
private final void BCC()
private final void BCS()
private final void BEQ()
private final void BIT()
private final void BMI()
private final void BNE()
private final void BPL()
private final void BRK()
private final void BVC()
private final void BVS()
private final void CLC()
private final void CLD()
private final void CLI()
private final void CLV()
private final void CMP()
private final void CPX()
private final void CPY()
private final void DEC()
private final void DEX()
private final void DEY()
private final void EOR()
private final void ILL()
private final void INC()
private final void INX()
private final void INY()
private final void JMP()
private final void JSR()
private final void LDA()
private final void LDX()
private final void LDY()
protected final void LSR()
protected final void NOP()
private final void ORA()
private final void PHA()
private final void PHP()
private final void PLA()
private final void PLP()
private final void ROL()
protected final void ROR()
private final void RTI()
private final void RTS()
protected void SBC()
private final void SEC()
private final void SED()
private final void SEI()
private final void STA()
private final void STX()
private final void STY()
private final void TAX()
private final void TAY()
private final void TSX()
private final void TXA()
private final void TXS()
private final void TYA()
private void opcode0x80()
private void opcode0x02()
private void opcode0x22()
private void opcode0x42()
private void opcode0x62()
private void opcode0x82()
private void opcode0xC2()
private void opcode0xE2()
private void opcode0x12()
private void opcode0x32()
private void opcode0x52()
private void opcode0x72()
private void opcode0x92()
private void opcode0xB2()
private void opcode0xD2()
private void opcode0xF2()
private void opcode0x03()
private void opcode0x23()
private void opcode0x43()
private void opcode0x63()
private void opcode0x83()
private void opcode0xA3()
private void opcode0xC3()
private void opcode0xE3()
private void opcode0x13()
private void opcode0x33()
private void opcode0x53()
private void opcode0x73()
private void opcode0x93()
private void opcode0xB3()
private void opcode0xD3()
private void opcode0xF3()
private void opcode0x04()
private void opcode0x44()
private void opcode0x64()
private void opcode0x14()
private void opcode0x34()
private void opcode0x54()
private void opcode0x74()
private void opcode0xD4()
private void opcode0xF4()
private void opcode0x07()
private void opcode0x27()
private void opcode0x47()
private void opcode0x67()
private void opcode0x87()
private void opcode0xA7()
private void opcode0xC7()
private void opcode0xE7()
private void opcode0x17()
private void opcode0x37()
private void opcode0x57()
private void opcode0x77()
private void opcode0x97()
private void opcode0xB7()
private void opcode0xD7()
private void opcode0xF7()
private void opcode0x89()
private void opcode0x1A()
private void opcode0x3A()
private void opcode0x5A()
private void opcode0x7A()
private void opcode0xDA()
private void opcode0xFA()
private void opcode0x0B()
private void opcode0x2B()
private void opcode0x4B()
private void opcode0x6B()
private void opcode0x8B()
private void opcode0xAB()
private void opcode0xCB()
private void opcode0xEB()
private void opcode0x1B()
private void opcode0x3B()
private void opcode0x5B()
private void opcode0x7B()
private void opcode0x9B()
private void opcode0xBB()
private void opcode0xDB()
private void opcode0xFB()
private void opcode0x0C()
private void opcode0x1C()
private void opcode0x3C()
private void opcode0x5C()
private void opcode0x7C()
private void opcode0x9C()
private void opcode0xDC()
private void opcode0x9E()
private void opcode0xFC()
private void opcode0x0F()
private void opcode0x2F()
private void opcode0x4F()
private void opcode0x6F()
private void opcode0x8F()
private void opcode0xAF()
private void opcode0xCF()
private void opcode0xEF()
private void opcode0x1F()
private void opcode0x3F()
private void opcode0x5F()
private void opcode0x7F()
private void opcode0x9F()
private void opcode0xBF()
private void opcode0xDF()
private void opcode0xFF()
private final void switchOpcode(int opcode)
opcode
- the opcode to be interpreted.protected final void reset()
protected final int execute(int cycles)
cycles
- the number of cycles available to execute opcodes.protected final void set_nmi_line(int state)
state
- is the NMI line state.protected final void set_irq_line(int irqline, int state)
irqline
- is the IRQ line.state
- is the IRQ line state.private final void m6502_set_irq_callback(int callback)
callback
- ???.protected final void take_irq()
|
|||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |