Source code for eight_bit_computer.language_defs

"""
Defnitions for the machine code and microcode.
"""

from .bitdef import remove_whitespace as rw
from .bitdef import merge

INSTRUCTION_GROUPS = {
    "COPY":  rw("00...... .... ..."),
    "LOAD":  rw("01...... .... ..."),
    "STORE": rw("10...... .... ..."),
    "ALU":   rw("11...... .... ..."),
}

SRC_REGISTERS = {
    "ACC":   rw("..000... .... ..."),
    "A":     rw("..001... .... ..."),
    "B":     rw("..010... .... ..."),
    "C":     rw("..011... .... ..."),
    "SP":    rw("..100... .... ..."),
    "PC":    rw("..101... .... ..."),
    "SP+/-": rw("..110... .... ..."),
    "CONST": rw("..111... .... ..."),
}

DEST_REGISTERS = {
    "ACC":   rw(".....000 .... ..."),
    "A":     rw(".....001 .... ..."),
    "B":     rw(".....010 .... ..."),
    "C":     rw(".....011 .... ..."),
    "SP":    rw(".....100 .... ..."),
    "PC":    rw(".....101 .... ..."),
    "SP+/-": rw(".....110 .... ..."),
    "CONST": rw(".....111 .... ..."),
}

ALU_OPERATIONS = {
    "ZERO":       rw("..0000.. .... ..."),
    "INCR":       rw("..0001.. .... ..."),
    "DECR":       rw("..0010.. .... ..."),
    "ADD":        rw("..0011.. .... ..."),
    "ADDC":       rw("..0100.. .... ..."),
    "SUB":        rw("..0101.. .... ..."),
    "SUBB":       rw("..0110.. .... ..."),
    "AND":        rw("..0111.. .... ..."),
    "NAND":       rw("..1000.. .... ..."),
    "OR":         rw("..1001.. .... ..."),
    "NOR":        rw("..1010.. .... ..."),
    "XOR":        rw("..1011.. .... ..."),
    "NXOR":       rw("..1100.. .... ..."),
    "NOT":        rw("..1101.. .... ..."),
    "LSHIFT":     rw("..1110.. .... ..."),
    "LSHIFTC":    rw("..1111.. .... ..."),

}

ALU_OPERANDS = {
    "ACC/CONST":    rw("......00 .... ..."),
    "A":            rw("......01 .... ..."),
    "B":            rw("......10 .... ..."),
    "C":            rw("......11 .... ..."),
}

FLAGS = {
    "ZERO": {
        "HIGH":         rw("........ 1... ..."),
        "LOW":          rw("........ 0... ..."),
    },
    "NEGATIVE": {
        "HIGH":         rw("........ .1.. ..."),
        "LOW":          rw("........ .0.. ..."),
    },
    "CARRY_BORROW": {
        "HIGH":         rw("........ ..1. ..."),
        "LOW":          rw("........ ..0. ..."),
    },
    "EQUAL": {
        "HIGH":         rw("........ ...1 ..."),
        "LOW":          rw("........ ...0 ..."),
    },
    "ANY":              rw("........ .... ..."),
}

STEPS = {
    0: rw("........ .... 000"),
    1: rw("........ .... 001"),
    2: rw("........ .... 010"),
    3: rw("........ .... 011"),
    4: rw("........ .... 100"),
    5: rw("........ .... 101"),
    6: rw("........ .... 110"),
    7: rw("........ .... 111"),
}

MODULE_CONTROL = {
    "ACC": {
        "IN":               rw("1....... ........ ........ ........"),
        "OUT":              rw(".1...... ........ ........ ........"),
    },
    "A": {
        "IN":               rw("..1..... ........ ........ ........"),
        "OUT":              rw("...1.... ........ ........ ........"),
    },
    "B": {
        "IN":               rw("....1... ........ ........ ........"),
        "OUT":              rw(".....1.. ........ ........ ........"),
    },
    "C": {
        "IN":               rw("......1. ........ ........ ........"),
        "OUT":              rw(".......1 ........ ........ ........"),
    },
    "ALU": {
        "STORE_RESULT":     rw("........ 1....... ........ ........"),
        "STORE_FLAGS":      rw("........ .1...... ........ ........"),
        "OUT":              rw("........ ..1..... ........ ........"),
        "A_IS_BUS":         rw("........ ...1.... ........ ........"),
        "S0_HIGH":          rw("........ ....1... ........ ........"),
        "S0_LOW":           rw("........ ....0... ........ ........"),
        "S1_HIGH":          rw("........ .....1.. ........ ........"),
        "S1_LOW":           rw("........ .....0.. ........ ........"),
        "S2_HIGH":          rw("........ ......1. ........ ........"),
        "S2_LOW":           rw("........ ......0. ........ ........"),
        "S3_HIGH":          rw("........ .......1 ........ ........"),
        "S3_LOW":           rw("........ .......0 ........ ........"),
        "M_HIGH":           rw("........ ........ 1....... ........"),
        "M_LOW":            rw("........ ........ 0....... ........"),
        "WITH_CARRY":       rw("........ ........ .1...... ........"),
        "NO_CARRY":         rw("........ ........ .0...... ........"),

    },
    "MAR": {
        "IN":               rw("........ ........ ..1..... ........"),
    },
    "RAM": {
        "IN":               rw("........ ........ ...1.... ........"),
        "OUT":              rw("........ ........ ....1... ........"),
        "SEL_PROG_MEM":     rw("........ ........ .....0.. ........"),
        "SEL_DATA_MEM":     rw("........ ........ .....1.. ........"),
    },
    "SP": {
        "IN":               rw("........ ........ ......1. ........"),
        "OUT":              rw("........ ........ .......1 ........"),
    },
    "PC": {
        "IN":               rw("........ ........ ........ 1......."),
        "OUT":              rw("........ ........ ........ .1......"),
        "COUNT":            rw("........ ........ ........ ..1....."),
    },
    "IR": {
        "IN":               rw("........ ........ ........ ...1...."),
    },
    "CU": {
        "STEP_RESET":       rw("........ ........ ........ ....1..."),
    },
    "CLOCK": {
        "HALT":             rw("........ ........ ........ .....1.."),
    },
}

ALU_CONTROL_FLAGS = {
    "A_PLUS_1": [

    ],
    "A_PLUS_B": [
        MODULE_CONTROL["ALU"]["S0_HIGH"],
        MODULE_CONTROL["ALU"]["S1_LOW"],
        MODULE_CONTROL["ALU"]["S2_LOW"],
        MODULE_CONTROL["ALU"]["S3_HIGH"],
        MODULE_CONTROL["ALU"]["M_LOW"],
        MODULE_CONTROL["ALU"]["NO_CARRY"],
    ],
    "A_MINUS_B": [

    ],
    "A_PLUS_B_PLUS_1": [

    ],
    "A_MINUS_B_MINS_1": [

    ],
    "A_AND_B": [

    ],
    "A_OR_B": [

    ],
    "A_NAND_B": [

    ],
    "A_XOR_B": [

    ],
    "NOT_A": [

    ],
    "A_PLUS_A": [

    ],
    "A_PLUS_A_PLUS_1": [

    ],
    "COMPARE_LTE_GT_EQ": [

    ],
    "COMPARE_LT_GTE": [

    ],
    "A": [

    ],
    "ZERO": [

    ],
}

EMPTY_ADDRESS = rw("........ .... ...")
MODULE_CONTROLS_DEFAULT = rw("00000000 00000000 00000000 00000000")


[docs]def instruction_byte_from_bitdefs(bitdefs): """ Extract an instruction byte from the bitdefs that make it up. If more than one bitdef is passed it will be merged with the others prior to extraction. Args: bitdefs list(str): List of bitdefs to potentially merge and extract Returns: str: Bitstring of the instruction byte """ merged_bitdefs = merge(bitdefs) return merged_bitdefs[0:8]