ID - Idle
----------
SCENG            -- set scene good.
(HSE)==>RCOM1

RCOM1 - Read command
---------------------
HSI              -- raise internal handshake to prompt data
INWR             -- write data into IN register
(!HSE)==>ID
()==>RCOM2

RCOM2
------
INEN             -- attach IN to bus
IRWR             -- write data into IR
(NOP)==>ID
(IN) ==>IN1
(OUT)==>OUT1
(CLR)==>CLR1
(DRW)==>DRW1

IN1 - Service IN instruction
-----------------------------
HSI              -- raise internal handshake to prompt data
INWR             -- write data into In register
(!HSE)==>ID
()==>IN2

IN2
----
INEN             -- attach IN to bus
RFWR             -- write data into RF
()==>ID


OUT1 - Service OUT instruction
-------------------------------
RFRE             -- RF outputs data to bus
OUTW             -- write data to OUT register
(!HSE)==>ID
()==>OUT2

# Initialize loop variables

CLR1 - service CLR instruction
-------------------------------
ROMA = (00)      -- index literal 00 in ROM
ROMR             -- read from ROM 
COLWR            -- write value to color register
!SCENG

CLR2
-----
ROMA = (FF)      -- index literal FF in ROM
ROMR             -- read from ROM
ADWR = (ARG)     -- index ARG register
RFWR             -- write enable register file

CLR3
-----
ROMA = (FF)      -- index literal FF in ROM
ROMR             -- read from ROM
ADWR = (TP)      -- index TP register
RFWR             -- write enable register file

# setup address values

CLR4
-----
ADRE = (ARG)     -- select ARG for output
RFRE             -- set RF output to bus
OUTW             -- load OUT register

CLR5
-----
ALWR             -- address latch write

CLR6
-----
ADRE = (TP)      -- select TP for output
RFRE             -- set RF to output to bus
OUTW             -- load OUT register
ALUINST = <THRU> -- write throught to ACC
ACCW             -- load ACC register

# write to external memory, check for termination of inside loop

CLR7
-----
MEMWRITE         -- write to external memory
(ZERO)==>CLRA1

# loop not terminated, lcv--, jump back to top

CLR8
-----
ALUINST = <DEC>  -- set code for ALU dec
ADRE = (TP)      -- set TP for output
RFRE             -- read from RF
ACCW             -- write to ACC

CLR9
-----
ADWR = (TP)      -- set TP for input
RFWR             -- write to RF
ACCEN            -- connect ACC to bus
()==>CLR6

# inside loop terminated, check for outside loop termination

CLRA1
------
ADRE = (ARG)     -- set ARG for output
RFRE             -- read from RF
ALUINST = <THRU> -- set code for ALU pass through
ACCW             -- write to ACC
(ZERO)==>ID

# outside loop not terminated, lcv--, jump to top, reinit inner loop

CLRA2
------
ADRE = (ARG)     -- set ARG for output
RFRE             -- read from RF
ALUINST = <DEC>  -- set code for ALU dec
ACCW             -- write to ACC

CLRA3
------
ADWR = (ARG)     -- set ARG for input
RFWR             -- write to RF
ACCEN            -- connect ACC to bus
()==>CLR3

******************
* Line Draw Unit *
******************

# check whether object drawable

DRW1 - Bresenham linedraw instruction
--------------------------------------
ALUINST = <THRU> -- set ALU op to pass through
ADRE = (CO5)     -- set CO5 for output
RFRE             -- read from RF
COLWR            -- write value to color register
!SCENG           -- set scene not good

DRW2
-----
ALUINST = <AND>  -- set ALU op to XOR
ROMA = (F0)      -- set mask to isolate line flags
ROMR             -- read from ROM
(!ZERO)=>ID      -- if any flags set, skip out

# Calculate DX

DRW3
-----
ALUINST = <THRU> -- set ALU op to pass through
ADRE = (CO1)     -- set CO1 for output
RFRE             -- read from RF

DRW4
-----
ALUINST = <SUB>  -- set ALU op to subtraction
ADRE = (CO3)     -- CO3 for output
RFRE             -- read from RF
ACCW             -- load ACC register

DRW5
-----
ADWR = (DX)      -- select DX for input
RFWR             -- write to RF
ACCEN            -- set ACC to write to bus
SBWR             -- write sign bit to sign box

# Calculate DY

DRW6
-----
ALUINST = <THRU> -- set ALU op to pass through
ADRE = (CO2)     -- set CO2 for output
RFRE             -- read from RF

DRW7
-----
ALUINST = <sub>  -- set ALU op to subtraction
ADRE = (CO4)     -- CO4 for output
RFRE             -- read from RF
ACCW             -- load ACC register

DRW8
-----
ADWR = (DY)      -- select DY for input
RFWR             -- write to RF
ACCEN            -- set ACC to write to bus
SBWR             -- write sign bit to sign box

# Decide whether X or Y is to be iterated across (set FLIP bit)

DRW9
-----
ALUINST =   -- set ALU op to subtraction
ADRE = (DX)      -- set DX for output
RFRE             -- read from RF
ACCW             -- load ACC register
(NEG)==>DRWF1

# Proceed with line draw initialization

DRW10
------
ALUINST = <SHIFT>-- set ALU op for bitshift
ADRE = (DY)      -- set DY for output
RFRE             -- read from RF
ACCW             -- load ACC register

DRW11
------
ADWR = (DY)      -- select DY for input
RFWR             -- write to RF
ACCEN            -- set ACC to write to bus
SBWR             -- write sign bit to sign box

DRW12
------
ALUINST =   -- set ALU op for subtract
ADRE = (DX)      -- set DX for output
RFRE             -- read from RF
ACCW             -- load ACC register

DRW13
------
ADWR = (E)       -- select E for input
RFWR             -- write to RF
ACCEN            -- set ACC to write to bus
SBWR             -- write sign bit to sign box

DRW14
------
ADWR = (I)       -- select I for input
RFWR             -- write to RF
ADRE = (DX)      -- select DX for output
RFRE             -- read from RF

DRW15
------
ALUINST = <SHIFT>-- set ALU op for bitshift
ADRE = (DX)      -- set DX for output
RFRE             -- read from RF
ACCW             -- load ACC register

DRW16
------
ADWR = (DX)      -- select DX for input
RFWR             -- write to RF
ACCEN            -- set ACC to write bus
SBWR             -- write sign bit to sign box

# Check terminate condition for linedraw

DRW17
------
ALUINST = <THRU> -- set ALU op for pass through
ADRE = (I)       -- select I for output
RFRE             -- read from RF
(ZERO)==>ID

# Plot value at (x1, y1)

DRW18
------
ADRE = (X1)      -- select X1 for output
RFRE             -- read from RF
OUTW             -- write to OUT

DRW19
------
ALWR             -- address latch write

DRW20
------
ADRE = (Y1)      -- select Y1 for output
RFRE             -- read from RF
OUTW             -- write to OUT

DRW21
------
MEMWRITE         -- write to external memory

# Check accumulated error, inc/decrement values

DRW22
------
ALUop = <THRU>   -- set code for ALU pass through
ADRE = (E)       -- set E for output
RFRE             -- read from RF
ACCW             -- write to ACC
(NEG)==>DRW34

# Branch One (E > 0)

DRW23
------
ALUop = <THRU>   -- set code for ALU pass through
ADRE = (DY)      -- set DY for output
RFRE             -- read from RF
ACCW             -- write to ACC
(NEG)==>DRW25

DRW24
------
ALUop = <INC>    -- set code for ALU increment
ADDRE = (Y1)     -- set Y1 for output
RFRE             -- read from RF
ACCW             -- write to ACC
()==>DRW26

DRW25
------
ALUop = <DEC>    -- set code for ALU decrement
ADDRE = (Y1)     -- set Y1 for output
RFRE             -- read from RF
ACCW             -- write to ACC

DRW26
------
ADWR = (Y1)      -- select Y1 for input
RFWR             -- write to RF
ACCEN            -- set ACC to write bus

DRW27
------
ALUop = <THRU>   -- set code for ALU pass through
ADDRE = (E)      -- set Y1 for output
RFRE             -- read from RF
ACCW             -- write to ACC

DRW28
------
ALUop = <ADD>    -- set code for ALU add
ADDRE = (DY)     -- set DY for output
RFRE             -- read from RF
ACCW             -- write to ACC

DRW29
------
ALUop =     -- set code for ALU subtract
ADDRE = (DX)     -- set DX for output
RFRE             -- read from RF
ACCW             -- write to ACC

DRW30
------
ADWR = (E)       -- select E for input
RFWR             -- write to RF
ACCEN            -- set ACC to write bus
SBWR             -- write sign bit to sign box
()==>DRW34

# Branch Two (E < 0)

DRW31
------
ALUop = <THRU>   -- set code for ALU pass through
ADDRE = (E)      -- set E for output
RFRE             -- read from RF
ACCW             -- write to ACC

DRW32
------
ALUop = <ADD>    -- set code for ALU add
ADDRE = (DY)     -- set DY for output
RFRE             -- read from RF
ACCW             -- write to ACC

DRW33
------
ADWR = (DY)      -- select DY for input
RFWR             -- write to RF
ACCEN            -- set ACC to write bus
SBWR             -- write sign bit to sign box

# Branches One and Two rejoin.  End of loop increment

DRW34
------
ALUop = <INC>   -- set code for ALU increment
ADDRE = (X1)    -- set X1 for output
RFRE            -- read from RF
ACCW            -- write to ACC

DRW35
------
ADWR = (X1)     -- select X1 for input
RFWR            -- write to RF
ACCEN           -- set ACC to write bus


DRW36
------
ALUop = <DEC>   -- set code for ALU decrement
ADDRE = (I)     -- set I for output
RFRE            -- read from RF
ACCW            -- write to ACC

# Return to end-of-draw test condition

DRW37
------
ADWR = (I)      -- select I for input
RFWR            -- write to RF
ACCEN           -- set ACC to write bus
SBWR            -- write sign bit to sign box
()==>17