1
0
mirror of https://github.com/safiire/n65.git synced 2024-12-13 06:29:16 +00:00
n65/test/test_assembler.rb

136 lines
3.4 KiB
Ruby
Raw Normal View History

2015-02-18 03:05:37 +00:00
gem 'minitest'
require 'minitest/autorun'
require 'minitest/unit'
require_relative '../lib/assembler.rb'
2015-02-18 03:05:37 +00:00
class TestAssembler < MiniTest::Test
def setup
## Remember the modes which can use 16-bit absolute labels are:
## - absolute
## - absolute_x
## - absolute_y
## The JMP instruction can use 16-bit labels
## - absolute
## - indirect (it is the only indirect instruction)
##
## The Branching instructions can use labels, but they are all relative 8-bit addresses
end
def test_adc
asm = <<-'ASM'
ADC #$FF ; Immediate
label:
ADC $FF ; Zero Page
ADC $FF, X ; Zero Page X
ADC $FFFF ; Absolute
ADC $FFFF, X ; Absolute X
ADC $FFFF, Y ; Absolute Y
ADC label ; Absolute Label
ADC label, X ; Absolute X Label
ADC label, Y ; Absolute Y Label
ADC ($FF, X) ; Indirect X
ADC ($FF), Y ; Indirect Y
ASM
assembler = Assembler6502::Assembler.new(asm)
correct = %w{69 ff 65 ff 75 ff 6d ff ff 7d ff ff 79 ff ff 6d 02 06 7d 02 06 79 02 06 61 ff 71 ff}
assert_equal(correct, assembler.hexdump)
end
def test_and
asm = <<-'ASM'
AND #$FF ; Immediate
label:
AND $FF ; Zero Page
AND $FF, X ; Zero Page X
AND $FFFF ; Absolute
AND $FFFF, X ; Absolute X
AND $FFFF, Y ; Absolute Y
AND label ; Absolute Label
AND label, X ; Absolute X Label
AND label, Y ; Absolute Y Label
AND ($FF, X) ; Indirect X
AND ($FF), Y ; Indirect Y
ASM
assembler = Assembler6502::Assembler.new(asm)
correct = %w{29 ff 25 ff 35 ff 2d ff ff 3d ff ff 39 ff ff 2d 02 06 3d 02 06 39 02 06 21 ff 31 ff}
assert_equal(correct, assembler.hexdump)
end
def test_asl
asm = <<-'ASM'
ASL ; Implied
label:
ASL $FF ; Zero Page
ASL $FF, X ; Zero Page X
ASL $FFFF ; Absolute
ASL $FFFF, X ; Absolute X
ASL label ; Absolute Label
ASL label, X ; Absolute X Label
ASM
assembler = Assembler6502::Assembler.new(asm)
correct = %w{0a 06 ff 16 ff 0e ff ff 1e ff ff 0e 01 06 1e 01 06}
assert_equal(correct, assembler.assemble)
2015-02-18 03:05:37 +00:00
end
def test_bit
asm = <<-'ASM'
BIT $FF ; Zero Page
label:
BIT $FFFF ; Absolute
BIT label ; Absolute
ASM
assembler = Assembler6502::Assembler.new(asm)
correct = %w{24 ff 2c ff ff 2c 02 06}
assert_equal(correct, assembler.assemble)
2015-02-18 03:05:37 +00:00
end
def test_branches
asm = <<-'ASM'
LDX #$08
decrement:
DEX
STX $0200
CPX #$03
BNE decrement
STX $0201
BPL decrement
BMI decrement
BVC decrement
BVS decrement
BCC decrement
BCS decrement
BEQ decrement
BRK
ASM
assembler = Assembler6502::Assembler.new(asm)
correct = %w{a2 08 ca 8e 00 02 e0 03 d0 f8 8e 01 02 10 f3 30 f1 50 ef 70 ed 90 eb b0 e9 f0 e7 00}
assert_equal(correct, assembler.assemble)
2015-02-18 03:05:37 +00:00
end
def test_stack_instructions
asm = <<-'ASM'
TXS
TSX
PHA
PLA
PHP
PLP
NOP
ASM
assembler = Assembler6502::Assembler.new(asm)
correct = %w{9a ba 48 68 08 28 ea}
assert_equal(correct, assembler.assemble)
2015-02-18 03:05:37 +00:00
end
end