def execute(self, event): source = self.ui.editor.GetText() start_addr = 0xC000 cart = Cartridge() if start_addr != 0: cart.set_org(start_addr) opcodes = semantic(syntax(lexical(source)), False, cart) self.ui.display.active_scene.input_opcodes(opcodes, 0xC000)
def test_ror_imm_with_binary(self): tokens = list(lexical('ROR #%00000100')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_BINARY_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_IMMEDIATE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x6a, 0x04])
def test_ror_imm_with_decimal(self): tokens = list(lexical('ROR #10')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_DECIMAL_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_IMMEDIATE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x6a, 0x0a])
def test_dec_zp(self): tokens = list(lexical('DEC $00')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_ADDRESS', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_ZEROPAGE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0xc6, 0x00])
def test_rol_imm(self): tokens = list(lexical('ROL #$10')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_HEX_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_IMMEDIATE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x2a, 0x10])
def test_lda_abs(self): tokens = list(lexical('LDA $1234')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_ADDRESS', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_ABSOLUTE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0xad, 0x34, 0x12])
def test_lsr_acc(self): tokens = list(lexical('LSR A')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_ACCUMULATOR', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_ACCUMULATOR', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x4a])
def test_eor(self): 'Test logical EOR operation with lowercase' tokens = list(lexical('eor #$10')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_HEX_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_IMMEDIATE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x49, 0x10])
def test_inesmir(self): tokens = list(lexical('.inesmir 1')) self.assertEquals(2, len(tokens)) self.assertEquals('T_DIRECTIVE', tokens[0]['type']) self.assertEquals('T_DECIMAL_ARGUMENT', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_DIRECTIVE', ast[0]['type']) code = semantic(ast, True) # self.assertEquals(1, get_var('inesmir')) self.assertEquals(code[7], 1)
def test_eor_zp(self): '''Test logical EOR operation between the content of the Accumulator and the content of zero page $00''' tokens = list(lexical('EOR $00')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_ADDRESS', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_ZEROPAGE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x45, 0x00])
def test_eor_imm_with_binary(self): '''Test logical EOR operation between binary %00000100 (Decimal 4) and the content of the Accumulator''' tokens = list(lexical('EOR #%00000100')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_BINARY_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_IMMEDIATE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x49, 0x04])
def test_eor_imm(self): '''Test logical EOR operation between $10 (Decimal 16) and the content of the Accumulator''' tokens = list(lexical('EOR #$10')) self.assertEquals(2, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_HEX_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_IMMEDIATE', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x49, 0x10])
def test_eor_absy(self): tokens = list(lexical('EOR $1234,Y')) self.assertEquals(4, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_ADDRESS', tokens[1]['type']) self.assertEquals('T_SEPARATOR', tokens[2]['type']) self.assertEquals('T_REGISTER', tokens[3]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_ABSOLUTE_Y', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x59, 0x34, 0x12])
def test_asm_compiler(self): cart = Cartridge() cart.path = 'fixtures/movingsprite/' opcodes = semantic(self.ast, True, cart=cart) self.assertIsNotNone(opcodes) _bin = bytearray(opcodes) f = open('fixtures/movingsprite/movingsprite.nes', 'rb') content = f.read() f.close() self.assertHexEquals(content, _bin)
def test_db_3(self): tokens = list(lexical('.db $80, $00, $03, $80')) self.assertEquals(8, len(tokens)) self.assertEquals('T_DIRECTIVE', tokens[0]['type']) # self.assertEquals('T_HEX_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_DIRECTIVE', ast[0]['type']) code = semantic(ast) self.assertIsNotNone(code) expected = [0x80, 0x0, 0x03, 0x80] self.assertEquals(expected, code)
def test_dec_zpx(self): tokens = list(lexical('DEC $10,X')) self.assertEquals(4, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_ADDRESS', tokens[1]['type']) self.assertEquals('T_SEPARATOR', tokens[2]['type']) self.assertEquals('T_REGISTER', tokens[3]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_ZEROPAGE_X', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0xd6, 0x10])
def test_dec_absx(self): tokens = list(lexical('DEC $1234,X')) self.assertEquals(4, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_ADDRESS', tokens[1]['type']) self.assertEquals('$1234', tokens[1]['value']) self.assertEquals('T_SEPARATOR', tokens[2]['type']) self.assertEquals('T_REGISTER', tokens[3]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_ABSOLUTE_X', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0xde, 0x34, 0x12])
def test_eor_indy(self): tokens = list(lexical('EOR ($20),Y')) self.assertEquals(6, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_OPEN', tokens[1]['type']) self.assertEquals('T_ADDRESS', tokens[2]['type']) self.assertEquals('T_CLOSE', tokens[3]['type']) self.assertEquals('T_SEPARATOR', tokens[4]['type']) self.assertEquals('T_REGISTER', tokens[5]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_INDIRECT_Y', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x51, 0x20])
def test_db_5_with_binary(self): code = ('.db %00000000, %00010000, %01010000, ' '%00010000, %00000000, %00000000, ' '%00000000, %00110000') tokens = list(lexical(code)) self.assertEquals(16, len(tokens)) self.assertEquals('T_DIRECTIVE', tokens[0]['type']) self.assertEquals('T_BINARY_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_DIRECTIVE', ast[0]['type']) code = semantic(ast) self.assertIsNotNone(code) expected = [0x00, 0x10, 0x50, 0x10, 0x00, 0x00, 0x00, 0x30] self.assertEquals(expected, code)
def test_db_4(self): code = '''.db $80, $00, $03, $80 .db $01, $02, $03, $04 ''' tokens = list(lexical(code)) self.assertEquals(18, len(tokens)) self.assertEquals('T_DIRECTIVE', tokens[0]['type']) # self.assertEquals('T_HEX_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(2, len(ast)) self.assertEquals('S_DIRECTIVE', ast[0]['type']) code = semantic(ast) self.assertIsNotNone(code) expected = [0x80, 0x0, 0x03, 0x80, 1, 2, 3, 4] self.assertEquals(expected, code)
def test_sta_indx(self): tokens = list(lexical('STA ($20,X)')) self.assertEquals(6, len(tokens)) self.assertEquals('T_INSTRUCTION', tokens[0]['type']) self.assertEquals('T_OPEN', tokens[1]['type']) self.assertEquals('T_ADDRESS', tokens[2]['type']) self.assertEquals('$20', tokens[2]['value']) self.assertEquals('T_SEPARATOR', tokens[3]['type']) self.assertEquals('T_REGISTER', tokens[4]['type']) self.assertEquals('T_CLOSE', tokens[5]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_INDIRECT_X', ast[0]['type']) code = semantic(ast) self.assertEquals(code, [0x81, 0x20])
def test(self): ast = [] token_counter = 0 for i, a in enumerate(self.syn): tokens = [] for j, l in enumerate(self.lex[token_counter:]): if l[0] == 'T_ENDLINE': token_counter = j + 1 break tokens.append({'type': l[0], 'value': l[1]}) ast.append({'type': self.syn[i], 'children': tokens}) # print ast compiled = semantic(ast) self.assertEquals(compiled, self.code)
def test_db_2(self): code = ( '.db $0F,$30,$31,$32,$33,$35,$36,$37,' # One-liner string ' $38,$39,$3A,$3B,$3C,$3D,$3E,$0F') tokens = list(lexical(code)) self.assertEquals(32, len(tokens)) self.assertEquals('T_DIRECTIVE', tokens[0]['type']) # self.assertEquals('T_HEX_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_DIRECTIVE', ast[0]['type']) code = semantic(ast) self.assertIsNotNone(code) expected = [ 0x0f, 0x30, 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x0F ] self.assertEquals(expected, code)
def test_db_1(self): code = ( '.db $0F,$01,$02,$03,$04,$05,$06,$07,' # One-liner string ' $08,$09,$0A,$0B,$0C,$0D,$0E,$0F') tokens = list(lexical(code)) self.assertEquals(32, len(tokens)) self.assertEquals('T_DIRECTIVE', tokens[0]['type']) # self.assertEquals('T_HEX_NUMBER', tokens[1]['type']) ast = syntax(tokens) self.assertEquals(1, len(ast)) self.assertEquals('S_DIRECTIVE', ast[0]['type']) code = semantic(ast) self.assertIsNotNone(code) expected = [ 0x0f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F ] self.assertEquals(expected, code)
def assertAsmResults(self, source_file, bin_file): path = 'fixtures/nerdynights/background/' f = open(path + source_file) code = f.read() f.close() tokens = lexical(code) ast = syntax(tokens) cart = Cartridge() cart.path = 'fixtures/nerdynights/background/' opcodes = semantic(ast, True, cart=cart) self.assertIsNotNone(opcodes) _bin = bytearray(opcodes) with open(path + bin_file, 'rb') as f: content = f.read() self.assertHexEquals(content, _bin)
def assembly(self, source, start_addr=0): cart = Cartridge() if start_addr != 0: cart.set_org(start_addr) return semantic(syntax(lexical(source)), False, cart)