|
| 1 | +#CPU module |
| 2 | +import time |
| 3 | + |
| 4 | +def arrSet(len): |
| 5 | + arr = [] |
| 6 | + i = 0 |
| 7 | + while i < len: |
| 8 | + arr.append(0) |
| 9 | + i += 1 |
| 10 | + return arr |
| 11 | + |
| 12 | +rom = arrSet(512) |
| 13 | +regs = arrSet(16) |
| 14 | + |
| 15 | +execute = 1 |
| 16 | +jumped = 0 |
| 17 | + |
| 18 | +milli, lmilli = 0, 0 |
| 19 | + |
| 20 | +raw = open("rom.bin", "rb") |
| 21 | +i, byte = 0, raw.read(1) |
| 22 | +while byte: |
| 23 | + rom[i] = int.from_bytes(byte, "little") |
| 24 | + i += 1 |
| 25 | + byte = raw.read(1) |
| 26 | + |
| 27 | +while execute: |
| 28 | + lmilli = milli |
| 29 | + milli = int(round(time.time() * 1000)) |
| 30 | + if milli - lmilli > 0: regs[6] += milli - lmilli |
| 31 | + |
| 32 | + regs[5] = 1 |
| 33 | + |
| 34 | + if(regs[0] + 1 < len(rom)): |
| 35 | + lByte = rom[regs[0]] |
| 36 | + rByte = rom[regs[0] + 1] |
| 37 | + |
| 38 | + mode = lByte >> 6 |
| 39 | + opcode = (lByte >> 1) & 0b11111 |
| 40 | + arg1 = rByte >> 4 |
| 41 | + arg2 = rByte & 0b00001111 |
| 42 | + imm = ((lByte & 1) << 8) | rByte |
| 43 | + |
| 44 | + if opcode == 0x01: #clr |
| 45 | + regs[arg1] = 0 |
| 46 | + elif opcode == 0x02: #rst |
| 47 | + regs[0] = 0 |
| 48 | + elif opcode == 0x03: #hlt |
| 49 | + execute = 0 |
| 50 | + #0x04: mem not implemented |
| 51 | + elif opcode == 0x05: #mov - movm not implemented |
| 52 | + regs[arg2] = regs[arg1] |
| 53 | + elif opcode == 0x06: #ldm |
| 54 | + regs[arg2] = rom[regs[arg1]] |
| 55 | + #0x04: stm not implemented |
| 56 | + elif opcode == 0x08: #dat |
| 57 | + regs[0] += 2 |
| 58 | + regs[arg1] = (rom[regs[0]] << 8) | rom[regs[0] + 1] |
| 59 | + jumped = 1 |
| 60 | + elif opcode == 0x09: #add/i |
| 61 | + if mode & 1: |
| 62 | + regs[arg1] += regs[arg2] |
| 63 | + else: |
| 64 | + regs[1] = (regs[arg1] + regs[arg2]) if not mode >> 1 else (regs[2] + imm) |
| 65 | + elif opcode == 0x0A: #sub/d |
| 66 | + if mode & 1: |
| 67 | + regs[arg1] -= regs[arg2] |
| 68 | + else: |
| 69 | + regs[1] = (regs[arg1] - regs[arg2]) if not mode >> 1 else (regs[2] - imm) |
| 70 | + if regs[arg2] > regs[arg1]: regs[3] |= 6 |
| 71 | + elif opcode == 0x0B: #mul/i |
| 72 | + if mode & 1: |
| 73 | + regs[arg1] *= regs[arg2] |
| 74 | + else: |
| 75 | + regs[1] = (regs[arg1] * regs[arg2]) if not mode >> 1 else (regs[2] * imm) |
| 76 | + elif opcode == 0x0C: #div/d |
| 77 | + if mode & 1: |
| 78 | + regs[arg1] = int(regs[arg1] / regs[arg2]) |
| 79 | + else: |
| 80 | + regs[1] = int((regs[arg1] / regs[arg2]) if not mode >> 1 else (regs[2] / imm)) |
| 81 | + elif opcode == 0x0D: #shl |
| 82 | + regs[1] = (regs[arg1] << regs[arg2]) if not mode >> 1 else (regs[2] << imm) |
| 83 | + regs[3] |= 4 |
| 84 | + elif opcode == 0x0E: #shr |
| 85 | + regs[1] = (regs[arg1] >> regs[arg2]) if not mode >> 1 else (regs[2] >> imm) |
| 86 | + regs[3] |= 5 |
| 87 | + elif opcode == 0x0F: #and |
| 88 | + regs[1] = (regs[arg1] & regs[arg2]) if not mode >> 1 else (regs[2] & imm) |
| 89 | + elif opcode == 0x10: #or |
| 90 | + regs[1] = (regs[arg1] | regs[arg2]) if not mode >> 1 else (regs[2] | imm) |
| 91 | + elif opcode == 0x11: #not |
| 92 | + regs[1] = ~regs[arg1] |
| 93 | + elif opcode == 0x12: #xor |
| 94 | + regs[1] = (regs[arg1] ^ regs[arg2]) if not mode >> 1 else (regs[2] ^ imm) |
| 95 | + elif opcode == 0x13: #cmp |
| 96 | + if (regs[arg1] > regs[arg2]) if not mode >> 1 else (regs[2] > imm): regs[3] |= 1 |
| 97 | + if (regs[arg1] == regs[arg2]) if not mode >> 1 else (regs[2] == imm): regs[3] |= 2 |
| 98 | + if (regs[arg1] == 0) if not mode >> 1 else (regs[2] == 0): regs[3] |= 4 |
| 99 | + elif opcode == 0x14: #jmp |
| 100 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 101 | + jumped = 1 |
| 102 | + elif opcode == 0x15: #jal/nal |
| 103 | + if (regs[3] & 1) if not mode & 1 else (not regs[3] & 1): |
| 104 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 105 | + jumped = 1 |
| 106 | + elif opcode == 0x16: #jeq/neq |
| 107 | + if (regs[3] & 1) if not mode & 2 else (not regs[3] & 2): |
| 108 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 109 | + jumped = 1 |
| 110 | + elif opcode == 0x17: #jze/nze |
| 111 | + if (regs[3] & 4) if not mode & 1 else (not regs[3] & 4): |
| 112 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 113 | + jumped = 1 |
| 114 | + elif opcode == 0x18: #jof/nof |
| 115 | + if (regs[3] & 8) if not mode & 1 else (not regs[3] & 8): |
| 116 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 117 | + jumped = 1 |
| 118 | + elif opcode == 0x19: #juf/nuf |
| 119 | + if (regs[3] & 16) if not mode & 1 else (not regs[3] & 16): |
| 120 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 121 | + jumped = 1 |
| 122 | + elif opcode == 0x1A: #jng/nng |
| 123 | + if (regs[3] & 32) if not mode & 1 else (not regs[3] & 32): |
| 124 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 125 | + jumped = 1 |
| 126 | + elif opcode == 0x1B: #jin/nin |
| 127 | + if (regs[3] & 64) if not mode & 1 else (not regs[3] & 64): |
| 128 | + regs[0] = (regs[arg1]) if not mode >> 1 else imm |
| 129 | + jumped = 1 |
| 130 | + #0x1C: sdr not implemented |
| 131 | + #0x1D: gdr not implemented |
| 132 | + elif opcode == 0x1E: #deb |
| 133 | + print(regs[arg1]) |
| 134 | + #0x1F: ram dump not implemented |
| 135 | + |
| 136 | + if not jumped: |
| 137 | + if regs[0] < len(rom) - 1: |
| 138 | + regs[0] += 2 |
| 139 | + else: regs[0] = 0 |
| 140 | + else: jumped = 0 |
| 141 | + |
| 142 | + for i in range(16): |
| 143 | + if(regs[i] > 65535): regs[i] = 0 |
| 144 | + if(regs[i] < 0): regs[i] = 65535 |
0 commit comments