r6502 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.md +15 -0
- data/bin/6502_functional_test.bin +0 -0
- data/bin/6502_functional_test.lst +13999 -0
- data/bin/klaus_dormann_test.rb +23 -0
- data/lib/r6502/cpu_execution.rb +3 -1
- data/lib/r6502/cpu_instructions.rb +8 -14
- data/lib/r6502/instr_table.rb +3 -3
- data/r6502.gemspec +1 -1
- data/spec/r6502/cpu_execution_spec.rb +1 -1
- data/spec/r6502/cpu_instructions_spec.rb +12 -6
- metadata +4 -1
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$LOAD_PATH.unshift File.expand_path('../../lib',__FILE__)
|
3
|
+
require 'r6502'
|
4
|
+
require 'pry'
|
5
|
+
|
6
|
+
@mem = R6502::Memory.new
|
7
|
+
@asm = R6502::Assembler.new(@mem)
|
8
|
+
@cpu = R6502::Cpu.new(@mem)
|
9
|
+
@cpu.pc = 0x0400
|
10
|
+
|
11
|
+
code = IO.read('6502_functional_test.bin')
|
12
|
+
raise 'too much code' if code.bytesize > 2**16
|
13
|
+
|
14
|
+
@mem.instance_variable_set( :@mem_array, code.unpack('C*') )
|
15
|
+
|
16
|
+
begin
|
17
|
+
last_pc = @cpu.pc
|
18
|
+
@cpu.step
|
19
|
+
end while last_pc != @cpu.pc #run it until we hit a `jmp *` loop
|
20
|
+
|
21
|
+
puts "loop at pc = 0x#{@cpu.pc.to_s(16)}"
|
22
|
+
|
23
|
+
binding.pry
|
data/lib/r6502/cpu_execution.rb
CHANGED
@@ -30,6 +30,8 @@ module R6502
|
|
30
30
|
case mode
|
31
31
|
when :imp
|
32
32
|
nil
|
33
|
+
when :acc
|
34
|
+
nil
|
33
35
|
when :imm
|
34
36
|
sec_word
|
35
37
|
when :zp
|
@@ -58,7 +60,7 @@ module R6502
|
|
58
60
|
lb = @mem.get( 0xff & sec_word )
|
59
61
|
hb = @mem.get( 0xff & sec_word + 1)
|
60
62
|
addr = (hb<<8) + lb
|
61
|
-
|
63
|
+
addr + @y
|
62
64
|
end
|
63
65
|
end
|
64
66
|
def inc_pc_by_mode(mode)
|
@@ -330,14 +330,7 @@ module R6502
|
|
330
330
|
inc_pc_by_mode(mode)
|
331
331
|
end
|
332
332
|
def jmp(arg, mode)
|
333
|
-
|
334
|
-
when :abs
|
335
|
-
@pc = arg
|
336
|
-
else #indirect
|
337
|
-
lsb = @mem.get( arg )
|
338
|
-
msb = @mem.get( arg + 1)
|
339
|
-
@pc = lsb + msb<<8
|
340
|
-
end
|
333
|
+
@pc = arg
|
341
334
|
end
|
342
335
|
def lda(arg, mode)
|
343
336
|
case mode
|
@@ -390,8 +383,8 @@ module R6502
|
|
390
383
|
addr = 0x0100 + (0xff & @s)
|
391
384
|
val = @n #bit 7
|
392
385
|
val = (val<<1) + @v #bit 6
|
393
|
-
val = (val<<1) + 1 #bit 5
|
394
|
-
val = (val<<1) +
|
386
|
+
val = (val<<1) + 1 #bit 5, reserved
|
387
|
+
val = (val<<1) + 1 #bit 4, break
|
395
388
|
val = (val<<1) + @d #bit 3
|
396
389
|
val = (val<<1) + @i #bit 2
|
397
390
|
val = (val<<1) + @z #bit 1
|
@@ -412,6 +405,7 @@ module R6502
|
|
412
405
|
# bit 5
|
413
406
|
@v = 0x1 & (val>>6)
|
414
407
|
@n = 0x1 & (val>>7)
|
408
|
+
@s += 1
|
415
409
|
inc_pc_by_mode(mode)
|
416
410
|
end
|
417
411
|
def sta(arg, mode)
|
@@ -500,17 +494,17 @@ module R6502
|
|
500
494
|
@pc = 0xffff&((hi<<8) + lo)
|
501
495
|
end
|
502
496
|
def jsr( arg, mode )
|
503
|
-
@mem.set(0x0100 + @s, @pc>>8)
|
497
|
+
@mem.set(0x0100 + @s, (@pc+2)>>8)
|
504
498
|
@s -= 1
|
505
|
-
@mem.set(0x0100 + @s, (
|
499
|
+
@mem.set(0x0100 + @s, 0xff&(@pc+2))
|
506
500
|
@s -= 1
|
507
501
|
@pc = arg
|
508
502
|
end
|
509
503
|
def rts( arg, mode )
|
510
|
-
hi = @mem.get(0x0100 + @s + 1)
|
511
|
-
@s += 1
|
512
504
|
lo = @mem.get(0x0100 + @s + 1)
|
513
505
|
@s += 1
|
506
|
+
hi = @mem.get(0x0100 + @s + 1)
|
507
|
+
@s += 1
|
514
508
|
@pc = 0xffff&((hi<<8) + lo + 1)
|
515
509
|
end
|
516
510
|
end
|
data/lib/r6502/instr_table.rb
CHANGED
@@ -123,7 +123,7 @@ module R6502
|
|
123
123
|
0xac => [:ldy, :abs],
|
124
124
|
0xbc => [:ldy, :absx],
|
125
125
|
#lsr,
|
126
|
-
0x4a => [:lsr, :
|
126
|
+
0x4a => [:lsr, :acc],
|
127
127
|
0x46 => [:lsr, :zp],
|
128
128
|
0x56 => [:lsr, :zpx],
|
129
129
|
0x4e => [:lsr, :abs],
|
@@ -156,13 +156,13 @@ module R6502
|
|
156
156
|
#iny,
|
157
157
|
0xc8 => [:iny, :imp],
|
158
158
|
#rol,
|
159
|
-
0x2a => [:rol, :
|
159
|
+
0x2a => [:rol, :acc],
|
160
160
|
0x26 => [:rol, :zp],
|
161
161
|
0x36 => [:rol, :zpx],
|
162
162
|
0x2e => [:rol, :abs],
|
163
163
|
0x3e => [:rol, :absx],
|
164
164
|
#ror,
|
165
|
-
0x6a => [:ror, :
|
165
|
+
0x6a => [:ror, :acc],
|
166
166
|
0x66 => [:ror, :zp],
|
167
167
|
0x76 => [:ror, :zpx],
|
168
168
|
0x6e => [:ror, :abs],
|
data/r6502.gemspec
CHANGED
@@ -69,7 +69,7 @@ module R6502
|
|
69
69
|
@cpu.mem.set( 0x10, 0xa0 )
|
70
70
|
@cpu.mem.set( 0x11, 0xb0 )
|
71
71
|
@cpu.mem.set( 0xb0a4, 0xcd )
|
72
|
-
@cpu.decode_arg(:indy, 0x10, 0x66).should ==
|
72
|
+
@cpu.decode_arg(:indy, 0x10, 0x66).should == 0xb0a4
|
73
73
|
end
|
74
74
|
it "executes a single instr. from PC value and mem" do
|
75
75
|
@cpu.pc = 0x2000
|
@@ -983,10 +983,8 @@ module R6502
|
|
983
983
|
@cpu.pc.should == 0x2000
|
984
984
|
|
985
985
|
@cpu.pc = 0x1000
|
986
|
-
@mem.set( 0x2000, 0x00 )
|
987
|
-
@mem.set( 0x2001, 0x11 )
|
988
986
|
@cpu.jmp(0x2000, :ind)
|
989
|
-
@cpu.pc.should ==
|
987
|
+
@cpu.pc.should == 0x2000
|
990
988
|
end
|
991
989
|
it "jsr" do
|
992
990
|
@cpu.s = 0xff
|
@@ -995,11 +993,18 @@ module R6502
|
|
995
993
|
@mem.get(0x01ff).should == 0x06
|
996
994
|
@mem.get(0x01fe).should == 0x02
|
997
995
|
@cpu.pc.should == 0x1000
|
996
|
+
|
997
|
+
@cpu.s = 0xff
|
998
|
+
@cpu.pc = 0x06ff
|
999
|
+
@cpu.jsr(0x1000, :abs)
|
1000
|
+
@mem.get(0x01ff).should == 0x07
|
1001
|
+
@mem.get(0x01fe).should == 0x01
|
1002
|
+
@cpu.pc.should == 0x1000
|
998
1003
|
end
|
999
1004
|
it "rts" do
|
1000
1005
|
@cpu.s = 0xfd
|
1001
|
-
@mem.set(0x01ff,
|
1002
|
-
@mem.set(0x01fe,
|
1006
|
+
@mem.set(0x01ff, 0xab)
|
1007
|
+
@mem.set(0x01fe, 0xcd)
|
1003
1008
|
@cpu.rts(nil, :imp)
|
1004
1009
|
@cpu.pc.should == 0xabce
|
1005
1010
|
end
|
@@ -1125,7 +1130,7 @@ module R6502
|
|
1125
1130
|
@cpu.s = 0xfe
|
1126
1131
|
@cpu.php(nil, :imp)
|
1127
1132
|
@cpu.s.should == 0xfd
|
1128
|
-
@mem.get( 0x01fe ).should ==
|
1133
|
+
@mem.get( 0x01fe ).should == 0b01111010
|
1129
1134
|
end
|
1130
1135
|
it "plp" do
|
1131
1136
|
@cpu.c = 1
|
@@ -1142,6 +1147,7 @@ module R6502
|
|
1142
1147
|
@cpu.s = 0xfe
|
1143
1148
|
@cpu.plp(nil, :imp)
|
1144
1149
|
@cpu.pc.should == 0x0101
|
1150
|
+
@cpu.s.should == 0xff
|
1145
1151
|
|
1146
1152
|
@cpu.c.should == 0
|
1147
1153
|
@cpu.z.should == 1
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r6502
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Landers
|
@@ -18,6 +18,9 @@ extra_rdoc_files: []
|
|
18
18
|
files:
|
19
19
|
- LICENSE
|
20
20
|
- README.md
|
21
|
+
- bin/6502_functional_test.bin
|
22
|
+
- bin/6502_functional_test.lst
|
23
|
+
- bin/klaus_dormann_test.rb
|
21
24
|
- bin/r6502
|
22
25
|
- lib/r6502.rb
|
23
26
|
- lib/r6502/assembler.rb
|