2017-01-03 19:29:36 +00:00
|
|
|
# 6502-emu
|
2017-01-03 21:30:18 +00:00
|
|
|
A relatively bug-free and simple 6502 emulator. It is capable of running ehBasic.
|
2017-01-03 19:39:48 +00:00
|
|
|
|
|
|
|
Many 6502 emulators make extensive use of macros, which I personally think makes
|
|
|
|
code harder to understand. At the other extreme, some emulators implement each
|
|
|
|
addressing mode of each instruction separately, which is a big waste of time and
|
|
|
|
makes the code harder to maintain.
|
|
|
|
|
|
|
|
I chose a middle-ground, and used lookup tables for instruction decoding and address
|
|
|
|
decoding. This also gets rid of the common "giant opcode switch statement" (which
|
|
|
|
can be seen in my CHIP8 emulator project).
|
|
|
|
|
|
|
|
### Usage Example:
|
|
|
|
|
|
|
|
```
|
|
|
|
[david@D-ARCH 6502-emu]$ ./6502-emu examples/ehbasic.rom
|
|
|
|
|
|
|
|
Enhanced 6502 BASIC 2.22 (c) Lee Davison
|
|
|
|
[C]old/[W]arm ?
|
|
|
|
|
|
|
|
Memory size ?
|
|
|
|
|
|
|
|
40191 Bytes free
|
|
|
|
|
|
|
|
Enhanced BASIC 2.22
|
|
|
|
|
|
|
|
Ready
|
|
|
|
10 X1=59
|
|
|
|
15 Y1=21
|
|
|
|
20 I1=-1.0
|
|
|
|
23 I2=1.0
|
|
|
|
26 R1=-2.0
|
|
|
|
28 R2=1.0
|
|
|
|
30 S1=(R2-R1)/X1
|
|
|
|
35 S2=(I2-I1)/Y1
|
|
|
|
40 FOR Y=0 TO Y1
|
|
|
|
50 I3=I1+S2*Y
|
|
|
|
60 FOR X=0 TO X1
|
|
|
|
70 R3=R1+S1*X
|
|
|
|
73 Z1=R3
|
|
|
|
76 Z2=I3
|
|
|
|
80 FOR N=0 TO 30
|
|
|
|
90 A=Z1*Z1
|
|
|
|
95 B=Z2*Z2
|
|
|
|
100 IF A+B>4.0 GOTO 130
|
|
|
|
110 Z2=2*Z1*Z2+I3
|
|
|
|
115 Z1=A-B+R3
|
|
|
|
120 NEXT N
|
|
|
|
130 PRINT CHR$(63-N);
|
|
|
|
140 NEXT X
|
|
|
|
150 PRINT
|
|
|
|
160 NEXT Y
|
|
|
|
170 END
|
|
|
|
|
|
|
|
RUN
|
|
|
|
??????>>>>>===============<<<<<<;;;:7143;<<<<====>>>>>>>>>>>
|
|
|
|
?????>>>================<<<<<<<;;;984+18:;;<<<<=====>>>>>>>>
|
|
|
|
????>>>===============<<<<<<<;;::85 )/:;;;;<<=====>>>>>>>
|
|
|
|
???>>===============<<<<<<;:9999875 689::::;<<=====>>>>>
|
|
|
|
??>>=============<<<<;;;;::7/ '3 56446;<======>>>>
|
|
|
|
??>===========<<<;;;;;;:::863 +8:;<======>>>
|
|
|
|
?>========<<<;6::::::::997! &89;<<======>>
|
|
|
|
?====<<<<<;;;:83567.678874 ,:<<=======>
|
|
|
|
?=<<<<<<;;;;:986' /4 +:<<<======>
|
|
|
|
?<<<<<<;;::8675( ( 9;<<<======>
|
|
|
|
?;;:999:88460 '9:;<<<======>
|
|
|
|
?;;:999:88460 '9:;<<<======>
|
|
|
|
?<<<<<<;;::8675( ( 9;<<<======>
|
|
|
|
?=<<<<<<;;;;:986' /4 +:<<<======>
|
|
|
|
?====<<<<<;;;:83567.678874 ,:<<=======>
|
|
|
|
?>========<<<;6::::::::997! &89;<<======>>
|
|
|
|
??>===========<<<;;;;;;:::863 +8:;<======>>>
|
|
|
|
??>>=============<<<<;;;;::7/ '3 56446;<======>>>>
|
|
|
|
???>>===============<<<<<<;:9999875 689::::;<<=====>>>>>
|
|
|
|
????>>>===============<<<<<<<;;::85 )/:;;;;<<=====>>>>>>>
|
|
|
|
?????>>>================<<<<<<<;;;984+18:;;<<<<=====>>>>>>>>
|
|
|
|
??????>>>>>===============<<<<<<;;;:7143;<<<<====>>>>>>>>>>>
|
|
|
|
|
|
|
|
Ready
|
|
|
|
|
|
|
|
```
|
2017-01-03 21:07:58 +00:00
|
|
|
|
|
|
|
### TODO:
|
|
|
|
|
|
|
|
- Decimal mode.
|
|
|
|
- Cycle-accurate timing.
|
|
|
|
- GDB interface for easy debugging of 6502 programs (and the emulator itself).
|
|
|
|
- Implement more hardware devices (mainly a 6522, also some character/graphics LCDs).
|
|
|
|
- Turn it into a NES emulator.
|