Skip to content

Instantly share code, notes, and snippets.

@zignig
Created February 11, 2020 12:00
Show Gist options
  • Save zignig/2ef6703fcb45eb8b3b31eb96466ad02e to your computer and use it in GitHub Desktop.
Save zignig/2ef6703fcb45eb8b3b31eb96466ad02e to your computer and use it in GitHub Desktop.

Revisions

  1. zignig created this gist Feb 11, 2020.
    142 changes: 142 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,142 @@
    from .registers import *
    from boneless.arch.opcode import *
    from boneless.arch.asm import Assembler
    import pprint
    from .uart import Serial
    from .leds import Blinker

    from .lister import register


    @register
    class Echo(Firmware):
    def instr(self):
    w = self.w
    w.req("current_value")
    ll = LocalLabels()
    s = Serial()
    return [
    # s.read(ret=w.current_value),
    # s.write(w.current_value),
    s.readword(ret=w.current_value),
    s.writeword(w.current_value),
    ]

    becomes
    Gizmotronic Boneless
    Show info
    FIRMWARE Echo
    [ Rem("['current_value', '', '', '', '', '', 'fp', 'ret']"),
    Label('init'),
    MOVI(R6, 512),
    LDW(R6, 0),
    Label('main'),
    [ [ JAL(R7, 'Serial.ReadWord'),
    Rem("Return word"),
    LD(R0, R6, -5)],
    [ Rem("Load word"),
    ST(R0, R6, -8),
    JAL(R7, 'Serial.WriteWord')]],
    J('main'),
    Label('lib_code'),
    [ [ [ Label('Serial.ReadBlock'),
    Rem("['rx_status', 'counter', 'leds', 'char', '', '', 'fp', 'ret']"),
    ADJW(-8),
    LDW(R6, 0),
    MOVI(R2, 1),
    MOVI(R1, 65535),
    Label('checkrx_3097986442'),
    Rem("load the RX status from the serial port"),
    [ SUBI(R1, R1, 1),
    CMPI(R1, 0),
    BEQ('blink_3097986442'),
    J('next_3097986442'),
    Label('blink_3097986442'),
    STXA(R2, 1),
    MOVI(R1, 65535),
    XORI(R2, R2, 65535),
    Label('next_3097986442')],
    LDXA(R0, 4),
    CMPI(R0, 1),
    BEQ('rxnext_3097986442'),
    J('checkrx_3097986442'),
    Label('rxnext_3097986442'),
    LDXA(R3, 5),
    MOVI(R0, 1),
    STXA(R0, 4),
    Label('rxwait_3097986442'),
    LDXA(R0, 4),
    CMPI(R0, 0),
    BEQ('rxack_3097986442'),
    J('rxwait_3097986442'),
    Label('rxack_3097986442'),
    MOVI(R0, 0),
    STXA(R0, 4),
    MOVI(R2, 0),
    MOVI(R1, 0),
    STXA(R2, 1),
    ADJW(8),
    JR(R7, 0)]],
    [ [ Label('Serial.Write'),
    Rem("['char', 'status', '', '', '', '', 'fp', 'ret']"),
    ADJW(-8),
    LDW(R6, 0),
    Label('txchar_86520491'),
    STXA(R0, 3),
    MOVI(R1, 1),
    STXA(R1, 2),
    MOVI(R1, 1),
    STXA(R1, 2),
    MOVI(R1, 0),
    STXA(R1, 2),
    Label('waitup_86520491'),
    LDXA(R1, 2),
    CMPI(R1, 1),
    BEQ('waitup_86520491'),
    Label('waitdown_86520491'),
    LDXA(R1, 2),
    CMPI(R1, 0),
    BEQ('waitdown_86520491'),
    ADJW(8),
    JR(R7, 0)]],
    [ [ Label('Serial.ReadWord'),
    Rem("['first', 'second', 'holding', 'word', '', '', 'fp', 'ret']"),
    ADJW(-8),
    LDW(R6, 0),
    MOVI(R2, 0),
    Rem("low byte"),
    [ JAL(R7, 'Serial.ReadBlock'),
    Rem("Return char"),
    LD(R0, R6, -5)],
    AND(R3, R0, R0),
    Rem("high byte"),
    [ JAL(R7, 'Serial.ReadBlock'),
    Rem("Return char"),
    LD(R1, R6, -5)],
    AND(R2, R1, R1),
    SLLI(R2, R2, 8),
    OR(R3, R3, R2),
    ADJW(8),
    JR(R7, 0)]],
    [ [ Label('Serial.WriteWord'),
    Rem("['word', 'holding', 'extra', '', '', '', 'fp', 'ret']"),
    ADJW(-8),
    LDW(R6, 0),
    NOP(0),
    NOP(0),
    Rem("write low byte"),
    ANDI(R1, R0, 255),
    [ Rem("Load char"),
    ST(R1, R6, -8),
    JAL(R7, 'Serial.Write')],
    NOP(0),
    NOP(0),
    Rem("write high byte"),
    SRLI(R1, R0, 8),
    [ Rem("Load char"),
    ST(R1, R6, -8),
    JAL(R7, 'Serial.Write')],
    ADJW(8),
    JR(R7, 0)]]],
    Label('program_start')]