mirror of
https://github.com/safiire/n65.git
synced 2024-12-12 15:29:12 +00:00
Converted symbol arithmetic tests to spec, removed mintest
This commit is contained in:
parent
96b7fcf3ef
commit
2b5e170922
@ -54,7 +54,7 @@ module N65
|
|||||||
scope[symbol.to_sym] = value
|
scope[symbol.to_sym] = value
|
||||||
end
|
end
|
||||||
|
|
||||||
# Separate arithmetic from scope name
|
# Separate arithmetic from symbol
|
||||||
def find_arithmetic(name)
|
def find_arithmetic(name)
|
||||||
last_name = name.split('.').last
|
last_name = name.split('.').last
|
||||||
md = last_name.match(%r{([+\-*/])(\d+)$})
|
md = last_name.match(%r{([+\-*/])(\d+)$})
|
||||||
@ -62,7 +62,7 @@ module N65
|
|||||||
|
|
||||||
unless md.nil?
|
unless md.nil?
|
||||||
full_match, operator, argument = md.to_a
|
full_match, operator, argument = md.to_a
|
||||||
name.gsub!(full_match, '')
|
name = name.gsub(full_match, '')
|
||||||
f = ->(value) { value.send(operator.to_sym, argument.to_i) }
|
f = ->(value) { value.send(operator.to_sym, argument.to_i) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -22,7 +22,6 @@ Gem::Specification.new do |spec|
|
|||||||
spec.required_ruby_version = '>= 2.4.0'
|
spec.required_ruby_version = '>= 2.4.0'
|
||||||
|
|
||||||
spec.add_development_dependency 'bundler'
|
spec.add_development_dependency 'bundler'
|
||||||
spec.add_development_dependency 'minitest'
|
|
||||||
spec.add_development_dependency 'rake'
|
spec.add_development_dependency 'rake'
|
||||||
spec.add_development_dependency 'rubocop'
|
spec.add_development_dependency 'rubocop'
|
||||||
spec.add_development_dependency 'rspec'
|
spec.add_development_dependency 'rspec'
|
||||||
|
@ -203,7 +203,7 @@ RSpec.describe(N65::SymbolTable) do
|
|||||||
0xea, # NOP
|
0xea, # NOP
|
||||||
0xea, # NOP
|
0xea, # NOP
|
||||||
0xea, # NOP
|
0xea, # NOP
|
||||||
0x60 # RTS forward_symbol
|
0x60 # RTS
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
let(:emitted_rom) { assembler.emit_binary_rom.bytes[16...26] }
|
let(:emitted_rom) { assembler.emit_binary_rom.bytes[16...26] }
|
||||||
@ -214,4 +214,78 @@ RSpec.describe(N65::SymbolTable) do
|
|||||||
expect(emitted_rom).to eq(correct_binary)
|
expect(emitted_rom).to eq(correct_binary)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when setting a symbols value' do
|
||||||
|
before do
|
||||||
|
subject.define_symbol('variable', 0xff)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can resolve to that value' do
|
||||||
|
expect(subject.resolve_symbol('variable')).to eq(0xff)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when performing artithmetic on a symbol' do
|
||||||
|
before do
|
||||||
|
subject.define_symbol('variable', 0x20)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can perform addition on the symbol' do
|
||||||
|
expect(subject.resolve_symbol('variable+1')).to eq(0x21)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can perform subtraction on the symbol' do
|
||||||
|
expect(subject.resolve_symbol('variable-16')).to eq(0x10)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can perform multiplication on the symbol' do
|
||||||
|
expect(subject.resolve_symbol('variable*2')).to eq(0x40)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can perform division on the symbol' do
|
||||||
|
expect(subject.resolve_symbol('variable/2')).to eq(0x10)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when performing arithmetic on a scope struct' do
|
||||||
|
let(:assembler) { N65::Assembler.new }
|
||||||
|
let(:program) do
|
||||||
|
<<~'ASM'
|
||||||
|
.ines {"prog": 1, "char": 0, "mapper": 0, "mirror": 0}
|
||||||
|
|
||||||
|
.org $0020
|
||||||
|
.scope struct
|
||||||
|
.space a 1
|
||||||
|
.space b 1
|
||||||
|
.
|
||||||
|
|
||||||
|
.org $8000
|
||||||
|
.scope main
|
||||||
|
sei
|
||||||
|
cld
|
||||||
|
lda struct+1 zp
|
||||||
|
lda struct*2 zp
|
||||||
|
rts
|
||||||
|
.
|
||||||
|
ASM
|
||||||
|
end
|
||||||
|
let(:emitted_rom) { assembler.emit_binary_rom.bytes[16...23] }
|
||||||
|
let(:correct_binary) do
|
||||||
|
[
|
||||||
|
0x78, # sei
|
||||||
|
0xd8, # cld
|
||||||
|
0xa5, # lda
|
||||||
|
0x21, # $20 + 1
|
||||||
|
0xa5, # lda
|
||||||
|
0x40, # $20 * 2
|
||||||
|
0x60 # rts
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
before { assembler.assemble_string(program) }
|
||||||
|
|
||||||
|
it 'assembles the symbol arithmetic correctly' do
|
||||||
|
expect(emitted_rom).to eq(correct_binary)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
gem 'minitest'
|
|
||||||
require 'minitest/autorun'
|
|
||||||
require 'minitest/unit'
|
|
||||||
require_relative '../lib/n65'
|
|
||||||
|
|
||||||
class TestArithmeticSymbols < MiniTest::Test
|
|
||||||
include N65
|
|
||||||
|
|
||||||
def test_identify_plain_symbol
|
|
||||||
re = Regexp.new(Regexes::Sym)
|
|
||||||
assert_match(re, 'dog')
|
|
||||||
assert_match(re, 'animal.dog')
|
|
||||||
assert_match(re, 'global.animal.dog')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_symbol_values
|
|
||||||
st = SymbolTable.new
|
|
||||||
st.define_symbol('variable', 0xff)
|
|
||||||
assert_equal(0xff, st.resolve_symbol('variable'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_perform_symbolic_arithmetic
|
|
||||||
st = SymbolTable.new
|
|
||||||
st.define_symbol('variable', 0x20)
|
|
||||||
assert_equal(0x21, st.resolve_symbol('variable+1'))
|
|
||||||
assert_equal(0x40, st.resolve_symbol('variable*2'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_symbol_addition
|
|
||||||
program = <<-ASM
|
|
||||||
.ines {"prog": 1, "char": 0, "mapper": 0, "mirror": 0}
|
|
||||||
|
|
||||||
.org $0020
|
|
||||||
.scope struct
|
|
||||||
.space a 1
|
|
||||||
.space b 1
|
|
||||||
.
|
|
||||||
|
|
||||||
.org $8000
|
|
||||||
.scope main
|
|
||||||
sei
|
|
||||||
cld
|
|
||||||
lda struct+1 zp
|
|
||||||
lda struct*2 zp
|
|
||||||
rts
|
|
||||||
.
|
|
||||||
ASM
|
|
||||||
|
|
||||||
assembler = Assembler.new
|
|
||||||
program.split(/\n/).each do |line|
|
|
||||||
assembler.assemble_one_line(line)
|
|
||||||
end
|
|
||||||
assembler.fulfill_promises
|
|
||||||
|
|
||||||
binary = assembler.emit_binary_rom[16...23].split(//).map(&:ord)
|
|
||||||
|
|
||||||
## So yay, arithmetic on symbols works now :)
|
|
||||||
correct = [
|
|
||||||
0x78, # sei
|
|
||||||
0xd8, # cld
|
|
||||||
0xa5, # lda
|
|
||||||
0x21, # $20 + 1
|
|
||||||
0xa5, # lda
|
|
||||||
0x40, # $20 * 2
|
|
||||||
0x60 # rts
|
|
||||||
]
|
|
||||||
assert_equal(binary, correct)
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in New Issue
Block a user