#!/usr/bin/python
import sys
from interface import ProgrammerInterface
if len(sys.argv) > 2:
rom, serial_port, baud_rate = int(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) > 3 else 57600
else:
raise Exception("Invalid arguments")
#
# Define the values for the control signals
#
# EEPROM 2, bits D23 - D16
CE = 1 << 23 # 0x800000 - Count Enable
HLT = 1 << 22 # 0x400000 - Halt
PCI = 1 << 21 # 0x200000 - PC In
PCO = 1 << 20 # 0x100000 - PC Out
MAI = 1 << 19 # 0x080000 - Memory Address In
MI = 1 << 18 # 0x040000 - Memory In
MO = 1 << 17 # 0x020000 - Memory Out
IRI = 1 << 16 # 0x010000 - Instruction Register In
# EEPROM 1, bits D15 - D08
EO = 1 << 15 # 0x008000 - Sigma Out (ALU value)
OI = 1 << 14 # 0x004000 - Output In
AI = 1 << 13 # 0x002000 - A Register In
AO = 1 << 12 # 0x001000 - A register Out
BI = 1 << 11 # 0x000800 - B register In
BO = 1 << 10 # 0x000400 - B register Out
ALM = 1 << 9 # 0x000200 - ALU Mode
AL0 = 1 << 8 # 0x000100 - ALU function 0
# EEPROM 0, bits D07 - D00
AL1 = 1 << 7 # 0x000080 - ALU function 1
AL2 = 1 << 6 # 0x000040 - ALU function 2
AL3 = 1 << 5 # 0x000020 - ALU function 3
ALCI = 1 << 4 # 0x000010 - ALU Carry In
n3 = 1 << 3 # 0x000008 -
n2 = 1 << 2 # 0x000004 -
n1 = 1 << 1 # 0x000002 -
n0 = 1 << 0 # 0x000001 -
"""
Constant control words
"""
CW_0 = MAI | PCO
CW_1 = MO | IRI | CE
#
# Define the control words per machine code instruction
# 256 instructions x 8 bytes = 2K bytes
#
instr = {
# === NO Operation
#
0x00: [ CW_0, CW_1, 0, 0, 0, 0, 0, 0, ], # NOP
# === LOAD instructions
#
0x01: [ CW_0, CW_1, PCO|MAI, MO|CE|AI, 0, 0, 0, 0, ], # LDAi, val
0x02: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|AI|CE, 0, 0, 0, ], # LDAm addr
0x07: [ CW_0, CW_1, PCO|MAI, MO|CE|BI, 0, 0, 0, 0, ], # LDBi, val
0x08: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|BI|CE, 0, 0, 0, ], # LDBm addr
# === STORE instructions
#
0x10: [ CW_0, CW_1, PCO|MAI, MO|MAI, AO|MI|CE, 0, 0, 0, ], # STAm addr
0x11: [ CW_0, CW_1, PCO|MAI, MO|MAI, BO|MI|CE, 0, 0, 0, ], # STBm addr
# === ARITHMETIC instructions
#
0x20: [ CW_0, CW_1, AL3|AL0|EO|AI|CE, 0, 0, 0, 0, 0, ], # ADD
0x21: [ CW_0, CW_1, PCO|MAI, MO|BI, AL3|AL0|EO|AI|CE, 0, 0, 0, ], # ADDi val
0x22: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|BI, AL3|AL0|EO|AI|CE, 0, 0, ], # ADDm addr
0x24: [ CW_0, CW_1, AL2|AL1|EO|AI|CE, 0, 0, 0, 0, 0, ], # SUB
0x25: [ CW_0, CW_1, PCO|MAI, MO|BI, AL2|AL1|EO|AI|CE, 0, 0, 0, ], # SUBi val
0x26: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|BI, AL2|AL1|EO|AI|CE, 0, 0, ], # SUBm addr
0x28: [ CW_0, CW_1, AO|BI, ALM|AL3|AL2|EO|AI, AL3|AL0|EO|AI, AO|BI, 0, 0, ], # INCA
0x29: [ CW_0, CW_1, ALM|AL3|AL2|EO|AI, AL3|AL0|EO|AI, AO|BI, 0, 0, 0, ], # INCB
# === LOGIC instructions
#
0x30: [ CW_0, CW_1, ALM|AL2|AL1|EO|AI|CE, 0, 0, 0, 0, 0, ], # XOR
0x31: [ CW_0, CW_1, PCO|MAI, MO|BI, ALM|AL2|AL1|EO|AI|CE, 0, 0, 0, ], # XORi val
0x32: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|BI, ALM|AL2|AL1|EO|AI|CE, 0, 0, ], # 0x32 - XORm mem
0x34: [ CW_0, CW_1, ALM|AL3|AL1|AL0|EO|AI|CE, 0, 0, 0, 0, 0, ], # AND
0x35: [ CW_0, CW_1, PCO|MAI, MO|BI, ALM|AL3|AL1|AL0|EO|AI|CE, 0, 0, 0, ], # ANDi val
0x36: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|BI, ALM|AL3|AL1|AL0|EO|AI|CE, 0, 0, ], # ANDm mem
0x38: [ CW_0, CW_1, ALM|AL3|AL2|AL1|EO|AI|CE, 0, 0, 0, 0, 0, ], # OR
0x39: [ CW_0, CW_1, PCO|MAI, MO|BI, ALM|AL3|AL2|AL1|EO|AI|CE, 0, 0, 0, ], # ORi val
0x3A: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|BI, ALM|AL3|AL2|AL1|EO|AI|CE, 0, 0, ], # ORm mem
0x3C: [ CW_0, CW_1, ALM|EO|AI, 0, 0, 0, 0, 0, ], # NOTA
0x3D: [ CW_0, CW_1, ALM|AL2|AL0|EO|BI, 0, 0, 0, 0, 0, ], # NOTB
0x3E: [ CW_0, CW_1, ALM|AL1|AL0|EO|AI, 0, 0, 0, 0, 0, ], # CLRA
0x3F: [ CW_0, CW_1, ALM|AL1|AL0|EO|BI, 0, 0, 0, 0, 0, ], # CLRB
# === JUMP instructions
#
0x40: [ CW_0, CW_1, PCO|MAI, MO|PCI, 0, 0, 0, 0, ], # JMPi val
0x41: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|PCI, 0, 0, 0, ], # JMPm addr
# === OUTPUT instructions
#
0x50: [ CW_0, CW_1, AO|OI, 0, 0, 0, 0, 0, ], # OUTA
0x51: [ CW_0, CW_1, BO|OI, 0, 0, 0, 0, 0, ], # OUTB
0x54: [ CW_0, CW_1, PCO|MAI, MO|OI|CE, 0, 0, 0, 0, ], # OUTi
0x55: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|OI|CE, 0, 0, 0, ], # OUTm
# === MOVE instructions
#
0x60: [ CW_0, CW_1, PCO|MAI, MO|BI|CE, PCO|MAI, BO|MI|CE, 0, 0, ], # MOVi val
0x61: [ CW_0, CW_1, PCO|MAI, MO|MAI, MO|BI|CE, PCO|MAI, BO|MI|CE, 0, ], # MOVm ad1, ad2
# === HALT instruction
#
0xFF: [ MAI|PCO, MO|IRI|CE, HLT, 0, 0, 0, 0, 0, ], # HLT
}
interface = ProgrammerInterface(serial_port, baud_rate)
for op, contr in instr.iteritems():
address = op << 3
for i in range(0, len(contr)):
interface.write(address + i, contr[i] >> rom)