eprom bits: 19; bus bits: 34+? ictr (4): 0 - nope 1 - wSTH write stage H 2 - wSTL write stage L 3 - wIPH write IP H 4 - wIPL write IP L 5 - wDPH write DP H 6 - wDPL write DP L 7 - bbrk break from break (latch inst, reset icnt) 8 - brk break (reset instruction latch to 0, reset icnt) 9 - brk1 break if data:0 is true (1) 10 - brk0 break if data:0 is false (0) 11 - IP++ inc IP (12 - wID write ID from data bus) addr (1): 0 - IP IP*16 to system addr 1 - DP DP*16 to system addr data (4): 0 - 0 (all zero) 1 - &SEG (==1) 2 - &SP (==2) 3 - 3 4 - ? 5 - ? 6 - REG_HI (0x00 in thread mode or 0x80 in interrupt mode) 7 - STK_HI (0x01 in thread mode or 0x81 in interrupt mode) 8 - rDPL read DP L 9 - rIC instC*8 10 - rID instD 11 - rIDH instD:H (high bits: 0) 12 - rIDL instD:L (high bits: 0) 13 - rIPH read IP H 14 - rIPL read IP L 15 - x high impedance devctrl (3): 0 - x high impedance 1 - rMEM read memory 2 - wMEM write memory 3 - rIO read I/O 4 - wIO write I/O alu instruction (5) aluctrl2 (2) (could save these packing them in alu instructions 5 bits) 0 - nop 1 - wP write ALU P 2 - wQ write ALU Q microcode instructions: 00 000000 00000000 - break (any instruction executes this at its end) 0. addr=IP data=- alu=- ictrl=stL devctrl=rMEM 1. addr=- data=- alu=- ictrl=IP++ devctrl=- 2. addr=IP data=- alu=- ictrl=stH devctrl=rMEM 3. addr=- data=- alu=- ictrl=IP++ devctrl=- 4. bbrk 00 000000 oooooooo - short jump +o (destroys flags) 0. addr=- data=rIPL alu=wP ictrl=- devctrl=- ; P = IP:L 1. addr=- data=o alu=wQ ictrl=- devctrl=- ; Q = O 2. addr=- data=- alu=add ictrl=wIPL devctrl=- ; IP:L = P+Q 3. addr=- data=rIPH alu=wP ictrl=- devctrl=- ; P = IP:H 4. addr=- data=0 alu=wQ ictrl=- devctrl=- ; Q = 0 5. addr=- data=- alu=addc ictrl=wIPH devctrl=- ; IP:H = P+Q+Carry 6. brk 00 000001 oooooooo - short jump -o (destroys flags) 0. addr=- data=rIPL alu=wP ictrl=- devctrl=- ; P = IP:L 1. addr=- data=o alu=wQ ictrl=- devctrl=- ; Q = O 2. addr=- data=- alu=sub ictrl=wIPL devctrl=- ; IP:L = P-Q 3. addr=- data=rIPH alu=wP ictrl=- devctrl=- ; P = IP:H 4. addr=- data=0 alu=wQ ictrl=- devctrl=- ; Q = 0 5. addr=- data=- alu=subc ictrl=wIPH devctrl=- ; IP:H = P-Q-Carry 6. brk 00 000010 aaaaaaaa - far jump to SEG:a 0. addr=- data=0 alu=- ictrl=wDPH devctrl=- ; \ 1. addr=- data=&SEG alu=- ictrl=wDPL devctrl=- ; `\ DP = &SEG 2. addr=DP data=- alu=- ictrl=wIPH devctrl=- ; IP:H = *DP (= SEG) 3. addr=- data=o alu=- ictrl=wDPL devctrl=- ; IP:L = a 4. brk 01 000001 aaaabbbb - move register: a = b (sets flags) 0. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 1. addr=- data=rIDL alu=- ictrl=wDPL devctrl=- ; `\ DP = &b 2. addr=DP data=- alu=wP ictrl=- devctrl=rMEM ; P = *DP (= b) 3. addr=- data=rIDH alu=- ictrl=wDPL devctrl=- ; DP = &a 4. addr=DP data=- alu=prp ictrl=wIPL devctrl=wMEM ; *DP = P 5. brk 01 ?????? xxxxrrrr - push register r (destroys flags) 0. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 1. addr=- data=rIDL alu=- ictrl=wDPL devctrl=- ; `\ DP = &r 2. addr=DP data=- alu=wQ ictrl=- devctrl=rMEM ; Q = *DP (Q = r) 3. addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 4. addr=DP data=- alu=wP ictrl=- devctrl=rMEM ; P = *DP (P = SP) 5. addr=- data=STK_HI alu=- ictrl=wDPH devctrl=- ; DPH=1 (stack segment) 6. addr=- data=- alu=prp ictrl=wDPL devctrl=- ; DP = P (DP = 1:SP) 7. addr=DP data=- alu=prq ictrl=- devctrl=wMEM ; *DP = Q (*(1:SP) = Q) 8. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 9. addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 10.addr=DP data=- alu=inc ictrl=- devctrl=wMEM ; *DP = P+1 (SP = SP+1) 11.brk 01 ?????? xxxxrrrr - puship (pushes next IP; destroys flags) 0. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 1. addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 2. addr=DP data=- alu=wP ictrl=- devctrl=rMEM ; P = *DP (P = SP) 3. addr=- data=STK_HI alu=- ictrl=wDPH devctrl=- ; DPH=1 (stack segment) 4. addr=- data=- alu=prp ictrl=wDPL devctrl=- ; DP = P (DP = 1:SP) 5. addr=DP data=- alu=- ictrl=rIPL devctrl=wMEM ; *DP = IPL (*(1:SP) = IPL) 6. addr=- data=- alu=inc ictrl=wDPL devctrl=- ; DPL = P+1 (DP = 1:(SP+1)) 7. addr=DP data=- alu=- ictrl=rIPH devctrl=wMEM ; *DP = IPH (*(1:(SP+1)) = IPL) 8. addr=- data=rDPL alu=wP ictrl=- devctrl=- ; P = DPL (SP+1) 9. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 10.addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 11.addr=DP data=- alu=inc ictrl=wDPL devctrl=wMEM ; *DP = SP+2 (SP = SP+2) 12.brk 01 ?????? xxxxrrrr - popip (pops IP; destroys flags) 0. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 1. addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 2. addr=DP data=- alu=wP ictrl=- devctrl=rMEM ; P = *DP (P = SP) 3. addr=- data=- alu=dec ictrl=wDPL devctrl=- ; DPL = P-1 (DPL = SP-1) 4. addr=- data=STK_HI alu=- ictrl=wDPH devctrl=- ; DPH=1 (stack segment); DP=1:(SP-1) 5. addr=DP data=- alu=- ictrl=wIPH devctrl=rMEM ; IPH = *DP (IPH = *(1:(SP-1))) 6 .addr=- data=rDPL alu=wP ictrl=- devctrl=- ; P = DPL (SP-1) 7. addr=- data=- alu=dec ictrl=wDPL devctrl=- ; DPL = P-1 (DP = 1:(SP-2)) 8. addr=DP data=- alu=- ictrl=wIPL devctrl=rMEM ; IPL = *DP (IPL = *(1:(SP-2))) 9. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 10.addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 11.addr=DP data=- alu=prp ictrl=- devctrl=wMEM ; *DP = SP-2 (SP = SP-2) 12.brk 01 ?????? xxxxrrrr - ret (pops IP an IP+=2 to jump over call's jmp; destroys flags) 0. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 1. addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 2. addr=DP data=- alu=wP ictrl=- devctrl=rMEM ; P = *DP (P = SP) 3. addr=- data=- alu=dec ictrl=wDPL devctrl=- ; DPL = P-1 (DPL = SP-1) 4. addr=- data=STK_HI alu=- ictrl=wDPH devctrl=- ; DPH=1 (stack segment); DP=1:(SP-1) 5. addr=DP data=- alu=- ictrl=wIPH devctrl=rMEM ; IPH = *DP (IPH = *(1:(SP-1))) 6 .addr=- data=rDPL alu=wP ictrl=- devctrl=- ; P = DPL (SP-1) 7. addr=- data=- alu=dec ictrl=wDPL devctrl=- ; DPL = P-1 (DP = 1:(SP-2)) 8. addr=DP data=- alu=- ictrl=wIPL devctrl=rMEM ; IPL = *DP (IPL = *(1:(SP-2))) 9. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 10.addr=- data=&SP alu=- ictrl=wDPL devctrl=- ; `\ DP = &SP 11.addr=DP data=- alu=prp ictrl=IP++ devctrl=wMEM ; *DP = SP-2 (SP = SP-2); IP++ 12.addr=- data=- alu=- ictrl=- devctrl=- ; need to release ictrl (IP++ is edge triggered?) 13.addr=- data=- alu=- ictrl=IP++ devctrl=- ; IP++ 14.brk 01 000001 aaaabbbb - add registers: a = a+b (sets flags) 0. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 1. addr=- data=rIDL alu=- ictrl=wDPL devctrl=- ; `\ DP = &b 2. addr=DP data=- alu=wP ictrl=- devctrl=rMEM ; P = *DP (= b) 3. addr=- data=rIDH alu=- ictrl=wDPL devctrl=- ; DP = &a 4. addr=DP data=- alu=wQ ictrl=- devctrl=rMEM ; Q = *DP (= a) 5. addr=DP data=- alu=add ictrl=wIPL devctrl=wMEM ; *DP = P+Q 6. brk 1 0000 rrr iiiiiiii - load intermediate into register: r = i (sets flags?) 0. addr=- data=rID alu=wP ictrl=- devctrl=- ; P = i 1. addr=- data=REG_HI alu=- ictrl=wDPH devctrl=- ; \ 2. addr=- data=r alu=- ictrl=wDPL devctrl=- ; `\ DP = &r 3. addr=DP data=- alu=prp ictrl=- devctrl=wMEM ; *DP = P (r = i) 4. brk