From e6d966cebc15e21cb64012d314f74f54dc35eead Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Fri, 14 Apr 2023 00:04:10 +0300 Subject: Get interrupts working --- asm/bootstrap.atk16 | 5 +- digital/atk16.dig | 1104 +++++++++++++++++++++++++++++------------- digital/atk16_mem.dig | 2 +- digital/atk16_ucode_addr.dig | 741 ++++++++++++++++++++++++++++ src/asm_ops.py | 7 + src/ucode.py | 54 ++- 6 files changed, 1538 insertions(+), 375 deletions(-) create mode 100644 digital/atk16_ucode_addr.dig diff --git a/asm/bootstrap.atk16 b/asm/bootstrap.atk16 index c7ab63e..73165b9 100644 --- a/asm/bootstrap.atk16 +++ b/asm/bootstrap.atk16 @@ -7,10 +7,11 @@ hlt_isr ; 0x12 ISR2 hlt_isr ; 0x13 ISR3 stack_segment ; 0x14 Stack address + 0x0 ; 0x15 Interrupt PC address (IPCA) @label hlt_isr - ldi 0x55 RA - hlt + ldi 0x55 RE + rti @label program_segment @address 0x0 diff --git a/digital/atk16.dig b/digital/atk16.dig index 2b804fd..d1787ab 100644 --- a/digital/atk16.dig +++ b/digital/atk16.dig @@ -71,20 +71,6 @@ - - Tunnel - - - rotation - - - - NetName - PC_IE - - - - CounterPreset @@ -115,32 +101,8 @@ - - - - Ground - - - rotation - - - - - Tunnel - - - rotation - - - - NetName - PC_CO - - - - Tunnel @@ -155,20 +117,6 @@ - - Tunnel - - - rotation - - - - NetName - CLK - - - - atk16_mem.dig @@ -217,30 +165,6 @@ - - Tunnel - - - rotation - - - - NetName - OPCODE - - - - - - Probe - - - Label - OPCODE - - - - Testcase @@ -300,7 +224,7 @@ program(0x4051, 0x40a2, 0x029b) rotation - + @@ -318,7 +242,7 @@ program(0x4051, 0x40a2, 0x029b) Frequency - 50 + 15 @@ -328,60 +252,6 @@ program(0x4051, 0x40a2, 0x029b) - - DipSwitch - - - Label - IRQ0 - - - - - - Ground - - - rotation - - - - - - - Ground - - - rotation - - - - - - - Ground - - - rotation - - - - - - - Splitter - - - Input Splitting - 1*4 - - - Output Splitting - 4 - - - - atk16_decoder.dig @@ -397,10 +267,10 @@ program(0x4051, 0x40a2, 0x029b) NetName - FLAG_EQ + FLAG_S - + Tunnel @@ -430,16 +300,6 @@ program(0x4051, 0x40a2, 0x029b) - - Tunnel - - - NetName - OPCODE - - - - Tunnel @@ -721,14 +581,28 @@ program(0x4051, 0x40a2, 0x029b) - Splitter + Driver - Input Splitting - 3,1,4 + Bits + 16 + + + flipSelPos + true + + + + + + Probe + + + Label + Bus - + Tunnel @@ -739,52 +613,48 @@ program(0x4051, 0x40a2, 0x029b) NetName - OPCODE + MAR_IE - + - BitSelector + Tunnel - Selector Bits - 2 + rotation + + + + NetName + PC_OE - + Tunnel - - rotation - - NetName - FLAG_EQ + CLK - + - Splitter + Tunnel rotation - - - - Input Splitting - 3 + - Output Splitting - 2, + NetName + IM_M - + Tunnel @@ -795,50 +665,48 @@ program(0x4051, 0x40a2, 0x029b) NetName - FR_Q + OPCODE - + - EEPROM + Probe - - AddrBits - 8 - Label - UCODE + OPCODE + + + + + Tunnel + - Bits - 16 + rotation + - Data - c,221,3040,8000,4*0,c,221,3040,8000,4*0,c,221,3440,8000,4*0,c -,221,3440,8000,4*0,c,221,88,60,8000,0,0,0,c,221,88,60,8000,0,0,0 -,c,221,88,110,8000,0,0,0,c,221,88,110,8000,0,0,0,c,221,840,8000 -,4*0,c,221,840,8000,4*0,c,221,82,8000,4*0,c,221,82,8000,4*0,c -,221,c02,8000,4*0,c,221,c02,8000,4*0,c,221,8000,5*0,c,221,82,8000 -,4*0,c,221,8000,5*0,c,221,c02,8000,4*0,c,221,44,8000,4*0,c,221 -,44,8000,4*0,c,221,8000,5*0,c,221,8000,5*0,c,221,8000,5*0,c,221 -,8000,5*0,c,221,8000,5*0,c,221,8000,5*0,c,221,8000,5*0,c,221,8000 -,5*0,c,221,8000,5*0,c,221,8000,5*0,c,221,4000,5*0,c,221,4000 + NetName + PC_CO - + - VDD + Tunnel rotation - + + + + NetName + CLK - + Ground @@ -848,17 +716,21 @@ program(0x4051, 0x40a2, 0x029b) - + - VDD + Tunnel rotation - + + + + NetName + PC_IE - + Splitter @@ -869,14 +741,14 @@ program(0x4051, 0x40a2, 0x029b) Input Splitting - 16 + 24 Output Splitting - 1*16 + 1*24 - + Tunnel @@ -886,7 +758,7 @@ program(0x4051, 0x40a2, 0x029b) PC_CO - + Tunnel @@ -896,7 +768,7 @@ program(0x4051, 0x40a2, 0x029b) PC_IE - + Tunnel @@ -906,7 +778,7 @@ program(0x4051, 0x40a2, 0x029b) PC_OE - + Tunnel @@ -916,7 +788,7 @@ program(0x4051, 0x40a2, 0x029b) MAR_IE - + Tunnel @@ -926,7 +798,7 @@ program(0x4051, 0x40a2, 0x029b) MEM_IE - + Tunnel @@ -936,7 +808,7 @@ program(0x4051, 0x40a2, 0x029b) MEM_OE - + Tunnel @@ -946,7 +818,7 @@ program(0x4051, 0x40a2, 0x029b) R1_OE - + Tunnel @@ -956,7 +828,7 @@ program(0x4051, 0x40a2, 0x029b) IR_IE - + Tunnel @@ -966,7 +838,7 @@ program(0x4051, 0x40a2, 0x029b) ALU_OE - + Tunnel @@ -976,7 +848,7 @@ program(0x4051, 0x40a2, 0x029b) US_RS - + Tunnel @@ -986,7 +858,7 @@ program(0x4051, 0x40a2, 0x029b) FR_IE - + Tunnel @@ -996,12 +868,12 @@ program(0x4051, 0x40a2, 0x029b) RW_IE - + Stop - + Tunnel @@ -1011,7 +883,7 @@ program(0x4051, 0x40a2, 0x029b) LI_OE - + Tunnel @@ -1021,7 +893,7 @@ program(0x4051, 0x40a2, 0x029b) IM_M - + Tunnel @@ -1031,31 +903,26 @@ program(0x4051, 0x40a2, 0x029b) R2_OE - + - Driver - - - Bits - 16 - - - flipSelPos - true - - - + atk16_ucode_addr.dig + + - Probe + Tunnel - Label - Bus + rotation + + + + NetName + FLAG_S - + Tunnel @@ -1066,10 +933,10 @@ program(0x4051, 0x40a2, 0x029b) NetName - MAR_IE + FR_Q - + Tunnel @@ -1080,20 +947,105 @@ program(0x4051, 0x40a2, 0x029b) NetName - PC_OE + OPCODE - + - Tunnel + Splitter - NetName - CLK - + Input Splitting + 1*4 + + + Output Splitting + 4 + - + + + + EEPROM + + + AddrBits + 8 + + + Label + UCODE + + + Bits + 24 + + + Data + c,221,3040,8000,4*0,c,221,3040,8000,4*0,c,221,3440,8000,4*0,c +,221,3440,8000,4*0,c,221,88,60,8000,0,0,0,c,221,88,60,8000,0,0,0 +,c,221,88,110,8000,0,0,0,c,221,88,110,8000,0,0,0,c,221,840,8000 +,4*0,c,221,840,8000,4*0,c,221,82,8000,4*0,c,221,82,8000,4*0,c +,221,c02,8000,4*0,c,221,c02,8000,4*0,c,221,8000,5*0,c,221,82,8000 +,4*0,c,221,8000,5*0,c,221,c02,8000,4*0,c,221,44,8000,4*0,c,221 +,44,8000,4*0,c,221,8000,5*0,c,221,8000,5*0,c,221,8000,5*0,c,221 +,8000,5*0,c0004,10008,22,8000,4*0,c0004,10008,22,8000,4*0,c0004 +,10008,22,8000,4*0,c0004,10008,22,8000,4*0,c,221,120002,8000,4*0 +,c,221,120002,8000,4*0,c,221,4000,5*0,c,221,4000 + + + + + + VDD + + + rotation + + + + + + + Ground + + + rotation + + + + + + + VDD + + + rotation + + + + + + + Tunnel + + + NetName + OPCODE + + + + + + Tunnel + + + NetName + IT_N + + + Tunnel @@ -1104,10 +1056,312 @@ program(0x4051, 0x40a2, 0x029b) NetName - IM_M + US_Q - + + + + Tunnel + + + NetName + ISRA_OE + + + + + + Tunnel + + + rotation + + + + NetName + IM_EN + + + + + + Tunnel + + + rotation + + + + NetName + IM_DS + + + + + + Tunnel + + + NetName + IPC_IE + + + + + + Tunnel + + + NetName + IPC_OE + + + + + + Driver + + + Bits + 16 + + + flipSelPos + true + + + + + + Tunnel + + + NetName + ISRA_OE + + + + + + Const + + + Value + 4 + + + Bits + 14 + + + intFormat + hex + + + + + + Tunnel + + + rotation + + + + NetName + IT_N + + + + + + Splitter + + + Input Splitting + 2,14 + + + Output Splitting + 16 + + + + + + Register + + + Label + IPC + + + Bits + 16 + + + + + + Tunnel + + + rotation + + + + NetName + IPC_IE + + + + + + Driver + + + Bits + 16 + + + flipSelPos + true + + + + + + Tunnel + + + NetName + IPC_OE + + + + + + Tunnel + + + rotation + + + + NetName + CLK + + + + + + Tunnel + + + NetName + IM_EN + + + + + + Tunnel + + + NetName + IM_DS + + + + + + Keyboard + + + + + Tunnel + + + rotation + + + + NetName + CLK + + + + + + VDD + + + rotation + + + + + + + RS_FF_AS + + + + + Tunnel + + + rotation + + + + NetName + IM_DS + + + + + + Ground + + + rotation + + + + + + + Ground + + + rotation + + + + + + + Ground + + + rotation + + + + + + + LED + + + rotation + + + + @@ -1136,37 +1390,53 @@ program(0x4051, 0x40a2, 0x029b) - - + + + + + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + @@ -1176,12 +1446,24 @@ program(0x4051, 0x40a2, 0x029b) - - + + - - + + + + + + + + + + + + + + @@ -1200,20 +1482,20 @@ program(0x4051, 0x40a2, 0x029b) - - + + - - + + - - + + - - + + @@ -1231,13 +1513,33 @@ program(0x4051, 0x40a2, 0x029b) + + + + + + + + + + + + + + + + - + - - + + + + + + @@ -1280,24 +1582,28 @@ program(0x4051, 0x40a2, 0x029b) - - + + + + + + - - + + - - + + - - + + @@ -1311,6 +1617,18 @@ program(0x4051, 0x40a2, 0x029b) + + + + + + + + + + + + @@ -1320,32 +1638,44 @@ program(0x4051, 0x40a2, 0x029b) - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + @@ -1372,24 +1702,24 @@ program(0x4051, 0x40a2, 0x029b) - - + + - - + + - - + + - - + + - - + + @@ -1416,24 +1746,24 @@ program(0x4051, 0x40a2, 0x029b) - - + + - - + + - - + + - - + + - - + + @@ -1447,6 +1777,10 @@ program(0x4051, 0x40a2, 0x029b) + + + + @@ -1456,20 +1790,28 @@ program(0x4051, 0x40a2, 0x029b) - - + + - - + + + + + + + + + + - - + + - - + + @@ -1481,19 +1823,31 @@ program(0x4051, 0x40a2, 0x029b) - + + + + + + + + + + + + + - - + + - - + + - - + + @@ -1501,10 +1855,14 @@ program(0x4051, 0x40a2, 0x029b) - + - + + + + + @@ -1520,36 +1878,56 @@ program(0x4051, 0x40a2, 0x029b) - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - + + - - + + @@ -1567,6 +1945,10 @@ program(0x4051, 0x40a2, 0x029b) + + + + @@ -1579,26 +1961,26 @@ program(0x4051, 0x40a2, 0x029b) - - - - - - + + - - + + + + + + @@ -1607,6 +1989,14 @@ program(0x4051, 0x40a2, 0x029b) + + + + + + + + @@ -1616,8 +2006,8 @@ program(0x4051, 0x40a2, 0x029b) - - + + @@ -1633,16 +2023,32 @@ program(0x4051, 0x40a2, 0x029b) - + + + + + + + + + + + + + + + + + diff --git a/digital/atk16_mem.dig b/digital/atk16_mem.dig index 5c56552..540e64d 100644 --- a/digital/atk16_mem.dig +++ b/digital/atk16_mem.dig @@ -67,7 +67,7 @@ Data - 4014,2a00,6014,13*8000,4*15,8000,4055,f000,400a,9e00,1fe0,3178 + 4014,2a00,6015,13*8000,4*16,8010,0,4855,e000,400a,9e00,1fe0,3178 ,1b48,6001,f000,3148,1b48,3150,1b48,1011,860a,3158,1b48,4200,4401 ,650,1280,14c0,1009,8408,61fa,1b49,2540,1b49,2340,1b49,2f40,51c0 ,10c0,1b49,2740,1b49,2540,1b49,2340,1b49,2f40,51c0 diff --git a/digital/atk16_ucode_addr.dig b/digital/atk16_ucode_addr.dig new file mode 100644 index 0000000..682c90e --- /dev/null +++ b/digital/atk16_ucode_addr.dig @@ -0,0 +1,741 @@ + + + 2 + + + romContent + + + + + + Width + 6 + + + + + In + + + Description + Flag selector from instruction + + + Label + FLAG_S + + + Bits + 3 + + + + + + In + + + Description + Flag register output value + + + Label + FR_Q + + + Bits + 4 + + + + + + In + + + Description + OPCODE + + + Label + OP + + + Bits + 4 + + + + + + Tunnel + + + NetName + OP + + + + + + Tunnel + + + NetName + FLAG_S + + + + + + Tunnel + + + NetName + FR_Q + + + + + + In + + + Description + Microsequencer value + + + Label + US_Q + + + Bits + 3 + + + + + + Tunnel + + + NetName + US_Q + + + + + + In + + + Description + Interrupt request bus + + + Label + IRQ + + + Bits + 4 + + + + + + PriorityEncoder + + + Selector Bits + 2 + + + Label + Interrupts + + + + + + Splitter + + + Input Splitting + 4 + + + Output Splitting + 1*4 + + + + + + Multiplexer + + + Bits + 5 + + + + + + Splitter + + + Input Splitting + 3,5 + + + + + + Tunnel + + + rotation + + + + NetName + US_Q + + + + + + Out + + + Label + ADDR + + + Bits + 8 + + + + + + And + + + + + Tunnel + + + rotation + + + + NetName + OP + + + + + + Splitter + + + Input Splitting + 1,4 + + + Output Splitting + 5 + + + + + + Tunnel + + + rotation + + + + NetName + FC + + + + + + Splitter + + + Input Splitting + 2,3 + + + Output Splitting + 5 + + + + + + BitSelector + + + Selector Bits + 2 + + + + + + Tunnel + + + rotation + + + + NetName + FLAG_S + + + + + + Splitter + + + rotation + + + + Input Splitting + 3 + + + Output Splitting + 2, + + + + + + Tunnel + + + rotation + + + + NetName + FR_Q + + + + + + Tunnel + + + NetName + FC + + + + + + Out + + + Description + Interrupt number + + + rotation + + + + Label + IT_N + + + Bits + 2 + + + + + + Out + + + Label + INT_ACTIVE + + + + + + In + + + Description + Interrupt mask assert active + + + Label + IM_EN + + + + + + In + + + Description + Interrupt mask assert not active + + + Label + IM_DS + + + + + + RS_FF_AS + + + valueIsProbe + true + + + Label + INT MASK + + + + + + D_FF + + + + + Comparator + + + Bits + 3 + + + + + + Const + + + Value + 0 + + + Bits + 3 + + + + + + Tunnel + + + rotation + + + + NetName + US_Q + + + + + + Const + + + Value + 6 + + + Bits + 3 + + + intFormat + bin + + + + + + Register + + + Label + INT LINE + + + Bits + 2 + + + + + + VDD + + + rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/asm_ops.py b/src/asm_ops.py index 61e2caa..78ec356 100644 --- a/src/asm_ops.py +++ b/src/asm_ops.py @@ -109,6 +109,11 @@ def make_lpc(meta: Meta, symbols: Symbols, target: str) -> int: (target_e << 9) return word +def make_rti(meta: Meta, symbols: Symbols) -> int: + """RTI 1110 XXXX XXXX XXXX""" + word = (0b1110 << 12) + return word + def make_hlt(meta: Meta, symbols: Symbols) -> int: """HLT 1111 XXXX XXXX XXXX""" word = (0b1111 << 12) @@ -126,6 +131,7 @@ operations: OpWordDict = { "brr": make_brr, "bri": make_bri, "lpc": make_lpc, + "rti": make_rti, "hlt": make_hlt, } @@ -147,6 +153,7 @@ default_expansions: OpExpansionDict = { "brr": lambda *args: expand_id("brr", *args), "bri": lambda *args: expand_id("bri", *args), "lpc": lambda *args: expand_id("lpc", *args), + "rti": lambda *args: expand_id("rti", *args), "hlt": lambda *args: expand_id("hlt", *args), } diff --git a/src/ucode.py b/src/ucode.py index 1d050c8..07d0554 100755 --- a/src/ucode.py +++ b/src/ucode.py @@ -12,26 +12,34 @@ if len(sys.argv) != 2: outfile_path = sys.argv[1] -PC_CO = 0b0000_0000_0000_0001 -PC_IE = 0b0000_0000_0000_0010 -PC_OE = 0b0000_0000_0000_0100 -MAR_IE = 0b0000_0000_0000_1000 -MEM_IE = 0b0000_0000_0001_0000 -MEM_OE = 0b0000_0000_0010_0000 -RW_IE = 0b0000_0000_0100_0000 -R1_OE = 0b0000_0000_1000_0000 -R2_OE = 0b0000_0001_0000_0000 -IR_IE = 0b0000_0010_0000_0000 -IM_M = 0b0000_0100_0000_0000 -LI_OE = 0b0000_1000_0000_0000 -ALU_OE = 0b0001_0000_0000_0000 -FR_IE = 0b0010_0000_0000_0000 -HALT = 0b0100_0000_0000_0000 -US_RS = 0b1000_0000_0000_0000 +PC_CO = 1 << 0 +PC_IE = 1 << 1 +PC_OE = 1 << 2 +MAR_IE = 1 << 3 +MEM_IE = 1 << 4 +MEM_OE = 1 << 5 +RW_IE = 1 << 6 +R1_OE = 1 << 7 +R2_OE = 1 << 8 +IR_IE = 1 << 9 +IM_M = 1 << 10 +LI_OE = 1 << 11 +ALU_OE = 1 << 12 +FR_IE = 1 << 13 +HALT = 1 << 14 +US_RS = 1 << 15 +ISRA_OE = 1 << 16 +IM_DS = 1 << 17 +IM_EN = 1 << 18 +IPC_IE = 1 << 19 +IPC_OE = 1 << 20 +NOP5 = 1 << 21 +NOP6 = 1 << 22 +NOP7 = 1 << 23 BRANCH_FLAG_STATES_N = 2 UCODE_N: int = 2**3 -CONTROL_WORD_SIZE = 2 +CONTROL_WORD_SIZE = 3 def not_branch(bs: list[int]) -> list[list[int]]: return BRANCH_FLAG_STATES_N * [bs] @@ -71,12 +79,12 @@ ucode = [ nop(), # NOP 1011 XXXX XXXX XXXX nop(), - # NOP 1100 XXXX XXXX XXXX - nop(), - # NOP 1101 XXXX XXXX XXXX - nop(), - # NOP 1110 XXXX XXXX XXXX - nop(), + # ISRP0 1100 XXXX XXXX XXXX + not_branch([IM_EN|PC_OE|IPC_IE, ISRA_OE|MAR_IE, MEM_OE|PC_IE, US_RS, 0, 0, 0, 0]), + # ISRP1 1101 XXXX XXXX XXXX + not_branch([IM_EN|PC_OE|IPC_IE, ISRA_OE|MAR_IE, MEM_OE|PC_IE, US_RS, 0, 0, 0, 0]), + # RTI 1110 XXXX XXXX XXXX + not_branch([*fetch, IM_DS|IPC_OE|PC_IE, US_RS, 0, 0, 0, 0]), # HLT 1111 XXXX XXXX XXXX not_branch([*fetch, HALT, 0, 0, 0, 0, 0]), ] -- cgit v1.3