onilink_

4004 rom emulation

Jan 14th, 2023 (edited)
813
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.18 KB | None | 0 0
  1.  
  2. local Input = {
  3.     Clk1 = 1,
  4.     Clk2 = 2,
  5.     Sync = 3,
  6.     D0 = 4,
  7.     D1 = 5,
  8.     D2 = 6,
  9.     D3 = 7,
  10.     Test = 8,
  11.     Poc  = 9
  12. }
  13.  
  14. local Output = {
  15.     CM_Rom = 1,
  16.     CM_Ram0 = 2,
  17.     CM_Ram1 = 3,
  18.     CM_Ram2 = 4,
  19.     CM_Ram3 = 5
  20. }
  21.  
  22. local sim = {}
  23.  
  24. function sim.create(editor)
  25.     -- initialize inputs
  26.     local proxy = editor:proxy()
  27.     for i=0, proxy:inputsCount()-1 do
  28.         proxy:writeInput(i, false)
  29.     end
  30.     proxy:simulate()
  31.    
  32.     -- find inputs nodes
  33.     sim.node_clk1 = editor:findNodeInput("CLK1")
  34.     sim.node_clk2 = editor:findNodeInput("CLK2")
  35.     sim.node_sync = editor:findNodeInput("SYNC")
  36.     sim.node_d0   = editor:findNodeInput("D0")
  37.     sim.node_d1   = editor:findNodeInput("D1")
  38.     sim.node_d2   = editor:findNodeInput("D2")
  39.     sim.node_d3   = editor:findNodeInput("D3")
  40.     sim.node_test = editor:findNodeInput("TEST")
  41.     sim.node_poc  = editor:findNodeInput("POC")
  42.    
  43.     sim.node_rom  = editor:findNodeOutput("ROM")
  44.     sim.node_ram0 = editor:findNodeOutput("RAM0")
  45.     sim.node_ram1 = editor:findNodeOutput("RAM1")
  46.     sim.node_ram2 = editor:findNodeOutput("RAM2")
  47.     sim.node_ram3 = editor:findNodeOutput("RAM3")
  48.    
  49.     sim.timer = 0
  50.     sim.timer_max = 2
  51.    
  52.     sim.cmrom = false
  53.     sim.cmrom_prev = false
  54.    
  55.     sim.read_rom   = false
  56.     sim.read_addr  = false
  57.     sim.read_cycle = 0
  58.     sim.rom_cursor = 0
  59.     sim.read_addr_cycle = 0
  60.    
  61.     sim.cycle = 0
  62.     sim.updates = {}
  63.     sim.inputs = {}
  64.     sim.outputs = {}
  65.    
  66.     sim.in_nodes = {
  67.         sim.node_clk1,
  68.         sim.node_clk2,
  69.         sim.node_sync,
  70.         sim.node_d0,
  71.         sim.node_d1,
  72.         sim.node_d2,
  73.         sim.node_d3,
  74.         sim.node_test,
  75.         sim.node_poc
  76.     }
  77.    
  78.     for i=1, Input.Poc do
  79.         sim.updates[i] = false
  80.         sim.inputs[i] = false
  81.     end
  82.    
  83.     for i=1, Output.CM_Ram3 do
  84.         sim.outputs[i] = false
  85.     end
  86.    
  87.     -- fill all registers
  88.     sim.program = {
  89.         0x20, 0xFF, 0x22, 0xFF, 0x24, 0xFF,
  90.         0x26, 0xFF, 0x28, 0xFF, 0x2A, 0xFF,
  91.         0x2C, 0xFF, 0x2E, 0xFF}
  92.    
  93.     -- generate rom data from object code
  94.     sim.rom_data = {}
  95.     for i=1, #sim.program do
  96.         table.insert(sim.rom_data, bit32_band(bit32_bsr(sim.program[i], 4), 0xF))
  97.         table.insert(sim.rom_data, bit32_band(sim.program[i], 0xF))
  98.     end
  99.    
  100.     sim.runInitSequence(proxy)
  101. end
  102.  
  103. -- ok
  104. function sim.runInitSequence(proxy)
  105.     for k=1, 1100 do
  106.         sim.inputs[Input.Clk1] = (sim.cycle+3) % 4 == 0
  107.         sim.inputs[Input.Clk2] = (sim.cycle+1) % 4 == 0
  108.         sim.inputs[Input.Sync] = sim.sync(32)
  109.         sim.inputs[Input.Test] = true
  110.         sim.inputs[Input.Poc ] = (sim.cycle < 1099)
  111.        
  112.         sim.cycle = sim.cycle+1
  113.        
  114.         for i=1, #sim.in_nodes do
  115.             proxy:write(sim.in_nodes[i], sim.inputs[i])
  116.         end
  117.         proxy:simulate()
  118.     end
  119. end
  120.  
  121. function sim.simulateOneClockPhase(proxy)
  122.    
  123.     sim.cmrom = proxy:read(sim.node_rom)
  124.     sim.inputs[Input.D0] = proxy:read(sim.in_nodes[Input.D0])
  125.     sim.inputs[Input.D1] = proxy:read(sim.in_nodes[Input.D1])
  126.     sim.inputs[Input.D2] = proxy:read(sim.in_nodes[Input.D2])
  127.     sim.inputs[Input.D3] = proxy:read(sim.in_nodes[Input.D3])
  128.    
  129.     sim.updatesSignals()
  130.     sim.signalsToUpdate()
  131.    
  132.     for i=1, #sim.in_nodes do
  133.         if(sim.updates[i]) then
  134.             proxy:write(sim.in_nodes[i], sim.inputs[i])
  135.         else
  136.             proxy:clear(sim.in_nodes[i])
  137.         end
  138.     end
  139.    
  140.     proxy:simulate()
  141. end
  142.  
  143. function sim.simulateOneInstructionCycle(proxy)
  144.     for i=1, 32 do
  145.         sim.simulateOneClockPhase(proxy)
  146.     end
  147. end
  148.  
  149. function sim.updatesSignals()
  150.     local pp_sync = sim.sync(30)
  151.     local p_sync  = sim.sync(31)
  152.    
  153.     sim.inputs[Input.Clk1] = (sim.cycle+3) % 4 == 0
  154.     sim.inputs[Input.Clk2] = (sim.cycle+1) % 4 == 0
  155.     sim.inputs[Input.Sync] = sim.sync(32)
  156.     sim.inputs[Input.Test] = false
  157.     sim.inputs[Input.Poc ] = false
  158.    
  159.     if(sim.cmrom_prev and not sim.cmrom) then
  160.         sim.inputs[Input.D0] = true
  161.         sim.inputs[Input.D1] = true
  162.         sim.inputs[Input.D2] = true
  163.         sim.inputs[Input.D3] = true
  164.         sim.read_rom = true
  165.         sim.read_cycle = 0
  166.     end
  167.    
  168.     if(sim.read_rom) then
  169.         local rom_index = 1 + sim.rom_cursor*2 + ((sim.read_cycle >= 4) and 1 or 0)
  170.         local data = 0
  171.         if(rom_index < #sim.rom_data) then
  172.             data = sim.rom_data[rom_index]
  173.         end
  174.        
  175.         sim.inputs[Input.D0] = bit32_band(bit32_bsr(data, 0), 1) ~= 0
  176.         sim.inputs[Input.D1] = bit32_band(bit32_bsr(data, 1), 1) ~= 0
  177.         sim.inputs[Input.D2] = bit32_band(bit32_bsr(data, 2), 1) ~= 0
  178.         sim.inputs[Input.D3] = bit32_band(bit32_bsr(data, 3), 1) ~= 0
  179.        
  180.         if(sim.read_cycle == 10) then
  181.             sim.read_rom = false
  182.         else
  183.             sim.read_cycle = sim.read_cycle + 1
  184.         end
  185.     end
  186.    
  187.     if(pp_sync and  not p_sync) then
  188.         sim.read_addr = true
  189.         sim.read_addr_cycle = 0
  190.         sim.rom_cursor = 0
  191.     end
  192.    
  193.     if(sim.read_addr) then
  194.         if(sim.read_addr_cycle % 4 == 0) then
  195.             local w = 0
  196.             w = bit32_bor(w, bit32_bsl(sim.inputs[Input.D0], 0))
  197.             w = bit32_bor(w, bit32_bsl(sim.inputs[Input.D1], 1))
  198.             w = bit32_bor(w, bit32_bsl(sim.inputs[Input.D2], 2))
  199.             w = bit32_bor(w, bit32_bsl(sim.inputs[Input.D3], 3))
  200.            
  201.             sim.rom_cursor = bit32_bor(bit32_bsl(sim.rom_cursor, 4), w)
  202.            
  203.             if(sim.read_addr_cycle >= 8) then
  204.                 sim.read_addr = false
  205.                 sim.rom_cursor =
  206.                     bit32_bor(
  207.                       bit32_bor(
  208.                         bit32_bsr(bit32_band(sim.rom_cursor, 0xF00), 8),
  209.                         bit32_band(sim.rom_cursor, 0x0F0)),
  210.                         bit32_bsr(bit32_band(sim.rom_cursor, 0x00F), 8));
  211.                
  212.             end
  213.         end
  214.        
  215.         sim.read_addr_cycle = sim.read_addr_cycle + 1
  216.     end
  217.    
  218.     sim.cycle = sim.cycle + 1
  219.    
  220.     sim.cmrom_prev = sim.cmrom
  221.    
  222. end
  223.  
  224. function sim.signalsToUpdate()
  225.     sim.updates[Input.Clk1] = true
  226.     sim.updates[Input.Clk2] = true
  227.     sim.updates[Input.Sync] = true
  228.    
  229.     if(sim.read_rom) then
  230.         sim.updates[Input.D0] = true
  231.         sim.updates[Input.D1] = true
  232.         sim.updates[Input.D2] = true
  233.         sim.updates[Input.D3] = true
  234.     else
  235.         sim.updates[Input.D0] = false
  236.         sim.updates[Input.D1] = false
  237.         sim.updates[Input.D2] = false
  238.         sim.updates[Input.D3] = false
  239.     end
  240.    
  241.     sim.updates[Input.Test] = true
  242.     sim.updates[Input.Poc ] = true
  243. end
  244.  
  245. function sim.update(editor, dt)
  246.     if(sim.wait(dt)) then
  247.         return
  248.     end
  249.    
  250.     local proxy = editor:proxy()
  251.     sim.simulateOneClockPhase(proxy)
  252. end
  253.  
  254. function sim.wait(dt)
  255.     sim.timer = sim.timer - dt
  256.     if(sim.timer > 0) then
  257.         return true
  258.     end
  259.     sim.timer = sim.timer_max
  260.     return false
  261. end
  262.  
  263. function sim.sync(n)
  264.     if(sim.cycle > 4) then
  265.         return math.floor((sim.cycle + n)/4) % 8 == 0
  266.     else
  267.         return false
  268.     end
  269. end
  270.  
  271. return sim
  272.  
  273.  
Advertisement
Add Comment
Please, Sign In to add comment