Advertisement
flip_floopOG

Untitled

Apr 25th, 2024 (edited)
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.23 KB | None | 0 0
  1. output1 = [0] * 32768
  2. output2 = [0] * 32768
  3. output3 = [0] * 32768
  4.  
  5.  
  6. # define opcodes
  7. NOP =  0b00000000
  8. LDA =  0b00000001
  9. ADD =  0b00000010
  10. SUB =  0b00000011
  11. STA =  0b00000100
  12. LDI =  0b00000101
  13. JMP =  0b00000110
  14. JZ  =  0b00000111
  15. JC  =  0b00001000
  16. ADI =  0b00001001
  17. INC =  0b00001010
  18. DEC =  0b00001011
  19. OUT =  0b00001110
  20. MEO  = 0b00001100
  21. HALT = 0b00001111
  22.  
  23. # define control signals
  24. HLT =  0b000000010000000000000000
  25. MI  =  0b000000100000000000000000
  26. RI  =  0b000001000000000000000000
  27. RO  =  0b000010000000000000000000
  28. IO  =  0b000100000000000000000000
  29. II  =  0b001000000000000000000000
  30. AI  =  0b010000000000000000000000
  31. AO   = 0b100000000000000000000000
  32.  
  33. EO   = 0b000000000000000100000000
  34. SU   = 0b000000000000001000000000
  35. BI   = 0b000000000000010000000000
  36. OI   = 0b000000000000100000000000
  37. CE   = 0b000000000001000000000000
  38. CO   = 0b000000000010000000000000
  39. J    = 0b000000000100000000000000
  40. FI   = 0b000000001000000000000000
  41.  
  42. MR   = 0b000000000000000010000000 # Microcode reset
  43. STO  = 0b000000000000000001000000 # Stack Out
  44. STI  = 0b000000000000000000100000 # Stack In
  45. STIN = 0b000000000000000000010000 # Stack Increase
  46. STDC = 0b000000000000000000001000 # Stack Decrease
  47.  
  48. # define CPU flags EEPROM address bits
  49. CF_ADDR_BIT = 13
  50. ZF_ADDR_BIT = 12
  51.  
  52. # define microcode array
  53. microcode = [
  54.     [NOP,  MI|CO, RO|II|CE|MR],                            # 00000000 NOP
  55.     [LDA,  MI|CO, RO|II|CE, IO|MI, RO|AI|MR],              # 00000001 LDA
  56.     [ADD,  MI|CO, RO|II|CE, IO|MI, RO|BI, EO|AI|FI|MR],    # 00000010 ADD
  57.     [SUB,  MI|CO, RO|II|CE, IO|MI, RO|BI, EO|AI|SU|FI|MR], # 00000011 SUB
  58.     [STA,  MI|CO, RO|II|CE, IO|MI, AO|RI|MR],              # 00000100 STA
  59.     [LDI,  MI|CO, RO|II|CE, IO|AI|MR],                     # 00000101 LDI
  60.     [JMP,  MI|CO, RO|II|CE, IO|J|MR],                      # 00000110 JMP
  61.     [JZ,   MI|CO, RO|II|CE|MR],                            # 00000111 JZ
  62.     [JC,   MI|CO, RO|II|CE|MR],                            # 00001000 JC
  63.     [ADI,  MI|CO, RO|II|CE, IO|BI, EO|AI|FI|MR],           # 00001001 ADI
  64.     [MEO,  MI|CO, RO|II|CE, IO|MI, RO|OI|MR],              # 00001100 OUT
  65.     [OUT,  MI|CO, RO|II|CE, AO|OI|MR],                     # 00001110 OUT
  66.     [HALT, MI|CO, RO|II|CE, HLT]                           # 00001111 HLT
  67. ]
  68.  
  69. # populate ROM with the first two micro-instruction stages for all possible opcodes
  70. for i in range(4096):
  71.     address = i << 3
  72.     output1[address] = ((MI|CO) & 0xFF0000) >> 16
  73.     output1[address+1] = ((RO|II|CE) & 0xFF0000) >> 16
  74.     output2[address] = ((MI|CO) & 0x00FF00) >> 8
  75.     output2[address+1] = ((RO|II|CE) & 0x00FF00) >> 8
  76.     output3[address] = ((MI|CO) & 0x0000FF)
  77.     output3[address+1] = ((RO|II|CE) & 0x0000FF)
  78.  
  79. # load ROM with micro-instructions    
  80. for cf in [0,1]:
  81.     for zf in [0,1]:
  82.  
  83.         # calculate base address as a function of CF and ZF
  84.         base_addr = (cf * 2 ** CF_ADDR_BIT) | (zf * 2 ** ZF_ADDR_BIT)
  85.  
  86.         # set up JC microcode according to CF flag value
  87.         if cf == 1:
  88.             # override default JC micro-code for CF = 1
  89.             microcode[8] = [JC, MI|CO, RO|II|CE, IO|J]
  90.         else:
  91.             microcode[8] = [JC, MI|CO, RO|II|CE]
  92.  
  93.         # set up JZ microcode according to ZF flag value
  94.         if zf == 1:
  95.             # override default JZ micro-code for ZF = 1
  96.             microcode[7] = [JZ, MI|CO, RO|II|CE, IO|J]
  97.         else:
  98.             microcode[7] = [JZ, MI|CO, RO|II|CE]
  99.  
  100.         # populate micro-code
  101.         for inst in microcode:
  102.             opCode = inst[0]
  103.             signals = inst[1:]
  104.             for stage, signal in enumerate(signals):
  105.                 address = base_addr | (opCode << 3) | stage
  106.                 output1[address] = (signal & 0xFF0000) >> 16
  107.                 output2[address] = (signal & 0x00FF00) >> 8
  108.                 output3[address] = (signal & 0x0000FF)
  109.  
  110. with open('eeprom1.bin', 'wb') as file1:
  111.     for x in output1:
  112.         file1.write(x.to_bytes(1, byteorder='big', signed=False))
  113.  
  114. with open('eeprom2.bin', 'wb') as file2:
  115.     for x in output2:
  116.         file2.write(x.to_bytes(1, byteorder='big', signed=False))
  117.        
  118. with open('eeprom3.bin', 'wb') as file3:
  119.     for x in output3:
  120.         file3.write(x.to_bytes(1, byteorder='big', signed=False))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement