mirror of
https://github.com/jtauber/applepy.git
synced 2024-06-09 21:29:26 +00:00
Convert to python3
This commit is contained in:
parent
8934c97938
commit
b717984056
26
applepy.py
26
applepy.py
|
@ -391,7 +391,7 @@ class Apple2:
|
||||||
|
|
||||||
rs, _, _ = select.select([listener], [], [], 2)
|
rs, _, _ = select.select([listener], [], [], 2)
|
||||||
if not rs:
|
if not rs:
|
||||||
print >>sys.stderr, "CPU module did not start"
|
print("CPU module did not start", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
self.cpu, _ = listener.accept()
|
self.cpu, _ = listener.accept()
|
||||||
|
|
||||||
|
@ -404,7 +404,7 @@ class Apple2:
|
||||||
break
|
break
|
||||||
cycle, rw, addr, val = struct.unpack("<IBHB", op)
|
cycle, rw, addr, val = struct.unpack("<IBHB", op)
|
||||||
if rw == 0:
|
if rw == 0:
|
||||||
self.cpu.send(chr(self.softswitches.read_byte(cycle, addr)))
|
self.cpu.send(bytes([self.softswitches.read_byte(cycle, addr)]))
|
||||||
elif rw == 1:
|
elif rw == 1:
|
||||||
self.display.update(addr, val)
|
self.display.update(addr, val)
|
||||||
else:
|
else:
|
||||||
|
@ -415,7 +415,7 @@ class Apple2:
|
||||||
quit = True
|
quit = True
|
||||||
|
|
||||||
if event.type == pygame.KEYDOWN:
|
if event.type == pygame.KEYDOWN:
|
||||||
key = ord(event.unicode) if event.unicode else 0
|
key = ord(event.unicode.encode("ascii")) if event.unicode else 0
|
||||||
if event.key == pygame.K_LEFT:
|
if event.key == pygame.K_LEFT:
|
||||||
key = 0x08
|
key = 0x08
|
||||||
if event.key == pygame.K_RIGHT:
|
if event.key == pygame.K_RIGHT:
|
||||||
|
@ -435,16 +435,16 @@ class Apple2:
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print >>sys.stderr, "ApplePy - an Apple ][ emulator in Python"
|
print("ApplePy - an Apple ][ emulator in Python", file=sys.stderr)
|
||||||
print >>sys.stderr, "James Tauber / http://jtauber.com/"
|
print("James Tauber / http://jtauber.com/", file=sys.stderr)
|
||||||
print >>sys.stderr
|
print(file=sys.stderr)
|
||||||
print >>sys.stderr, "Usage: applepy.py [options]"
|
print("Usage: applepy.py [options]", file=sys.stderr)
|
||||||
print >>sys.stderr
|
print(file=sys.stderr)
|
||||||
print >>sys.stderr, " -c, --cassette Cassette wav file to load"
|
print(" -c, --cassette Cassette wav file to load", file=sys.stderr)
|
||||||
print >>sys.stderr, " -R, --rom ROM file to use (default A2ROM.BIN)"
|
print(" -R, --rom ROM file to use (default A2ROM.BIN)", file=sys.stderr)
|
||||||
print >>sys.stderr, " -r, --ram RAM file to load (default none)"
|
print(" -r, --ram RAM file to load (default none)", file=sys.stderr)
|
||||||
print >>sys.stderr, " -p, --pc Initial PC value"
|
print(" -p, --pc Initial PC value", file=sys.stderr)
|
||||||
print >>sys.stderr, " -q, --quiet Quiet mode, no sounds (default sounds)"
|
print(" -q, --quiet Quiet mode, no sounds (default sounds)", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -98,12 +98,12 @@ def run(win):
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print >>sys.stderr, "ApplePy - an Apple ][ emulator in Python"
|
print("ApplePy - an Apple ][ emulator in Python", file=sys.stderr)
|
||||||
print >>sys.stderr, "James Tauber / http://jtauber.com/"
|
print("James Tauber / http://jtauber.com/", file=sys.stderr)
|
||||||
print >>sys.stderr
|
print(file=sys.stderr)
|
||||||
print >>sys.stderr, "Usage: applepy_curses.py [options]"
|
print("Usage: applepy_curses.py [options]", file=sys.stderr)
|
||||||
print >>sys.stderr
|
print(file=sys.stderr)
|
||||||
print >>sys.stderr, " -R, --rom ROM file to use (default A2ROM.BIN)"
|
print(" -R, --rom ROM file to use (default A2ROM.BIN)", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
32
control.py
32
control.py
|
@ -1,16 +1,16 @@
|
||||||
import json
|
import json
|
||||||
import sys
|
import sys
|
||||||
import urllib
|
import urllib.request, urllib.parse, urllib.error
|
||||||
|
|
||||||
URL_PREFIX = "http://localhost:6502"
|
URL_PREFIX = "http://localhost:6502"
|
||||||
|
|
||||||
|
|
||||||
def get(url):
|
def get(url):
|
||||||
return json.loads(urllib.urlopen(URL_PREFIX + url).read())
|
return json.loads(urllib.request.urlopen(URL_PREFIX + url).read())
|
||||||
|
|
||||||
|
|
||||||
def post(url, data=None):
|
def post(url, data=None):
|
||||||
return urllib.urlopen(URL_PREFIX + url, json.dumps(data) if data is not None else "")
|
return urllib.request.urlopen(URL_PREFIX + url, json.dumps(data) if data is not None else "")
|
||||||
|
|
||||||
|
|
||||||
def value(s):
|
def value(s):
|
||||||
|
@ -45,7 +45,7 @@ def cmd_disassemble(a):
|
||||||
addr = status["program_counter"]
|
addr = status["program_counter"]
|
||||||
disasm = get("/disassemble/%d" % addr)
|
disasm = get("/disassemble/%d" % addr)
|
||||||
for d in disasm:
|
for d in disasm:
|
||||||
print format_disassemble(d)
|
print(format_disassemble(d))
|
||||||
|
|
||||||
|
|
||||||
def cmd_dump(a):
|
def cmd_dump(a):
|
||||||
|
@ -80,7 +80,7 @@ def cmd_dump(a):
|
||||||
s += "."
|
s += "."
|
||||||
else:
|
else:
|
||||||
s += " "
|
s += " "
|
||||||
print s
|
print(s)
|
||||||
addr += 16
|
addr += 16
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,20 +89,20 @@ def cmd_help(a):
|
||||||
if len(a) > 1:
|
if len(a) > 1:
|
||||||
f = Commands.get(a[1])
|
f = Commands.get(a[1])
|
||||||
if f is not None:
|
if f is not None:
|
||||||
print f.__doc__
|
print(f.__doc__)
|
||||||
else:
|
else:
|
||||||
print "Unknown command:", a[1]
|
print("Unknown command:", a[1])
|
||||||
else:
|
else:
|
||||||
print "Commands:"
|
print("Commands:")
|
||||||
for c in sorted(Commands):
|
for c in sorted(Commands):
|
||||||
print " ", c
|
print(" ", c)
|
||||||
|
|
||||||
|
|
||||||
def cmd_peek(a):
|
def cmd_peek(a):
|
||||||
"""Peek memory location"""
|
"""Peek memory location"""
|
||||||
addr = value(a[1])
|
addr = value(a[1])
|
||||||
dump = get("/memory/%d" % addr)
|
dump = get("/memory/%d" % addr)
|
||||||
print "%04X: %02X" % (addr, dump[0])
|
print("%04X: %02X" % (addr, dump[0]))
|
||||||
|
|
||||||
|
|
||||||
def cmd_poke(a):
|
def cmd_poke(a):
|
||||||
|
@ -115,7 +115,7 @@ def cmd_poke(a):
|
||||||
def cmd_status(a):
|
def cmd_status(a):
|
||||||
"""CPU status"""
|
"""CPU status"""
|
||||||
status = get("/status")
|
status = get("/status")
|
||||||
print "A=%02X X=%02X Y=%02X S=%02X PC=%04X F=%c%c0%c%c%c%c%c" % (
|
print("A=%02X X=%02X Y=%02X S=%02X PC=%04X F=%c%c0%c%c%c%c%c" % (
|
||||||
status["accumulator"],
|
status["accumulator"],
|
||||||
status["x_index"],
|
status["x_index"],
|
||||||
status["y_index"],
|
status["y_index"],
|
||||||
|
@ -128,9 +128,9 @@ def cmd_status(a):
|
||||||
"I" if status["interrupt_disable_flag"] else "i",
|
"I" if status["interrupt_disable_flag"] else "i",
|
||||||
"Z" if status["zero_flag"] else "z",
|
"Z" if status["zero_flag"] else "z",
|
||||||
"C" if status["carry_flag"] else "c",
|
"C" if status["carry_flag"] else "c",
|
||||||
)
|
))
|
||||||
disasm = get("/disassemble/%d" % status["program_counter"])
|
disasm = get("/disassemble/%d" % status["program_counter"])
|
||||||
print format_disassemble(disasm[0])
|
print(format_disassemble(disasm[0]))
|
||||||
|
|
||||||
|
|
||||||
def cmd_quit(a):
|
def cmd_quit(a):
|
||||||
|
@ -155,15 +155,15 @@ Commands = {
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
print "ApplePy control console"
|
print("ApplePy control console")
|
||||||
while True:
|
while True:
|
||||||
s = raw_input("6502> ")
|
s = input("6502> ")
|
||||||
a = s.strip().split()
|
a = s.strip().split()
|
||||||
f = Commands.get(a[0])
|
f = Commands.get(a[0])
|
||||||
if f is not None:
|
if f is not None:
|
||||||
f(a)
|
f(a)
|
||||||
else:
|
else:
|
||||||
print "Unknown command:", s
|
print("Unknown command:", s)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
46
cpu6502.py
46
cpu6502.py
|
@ -3,7 +3,7 @@
|
||||||
# originally written 2001, updated 2011
|
# originally written 2001, updated 2011
|
||||||
|
|
||||||
|
|
||||||
import BaseHTTPServer
|
import http.server
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
import select
|
import select
|
||||||
|
@ -35,7 +35,7 @@ class ROM:
|
||||||
def load_file(self, address, filename):
|
def load_file(self, address, filename):
|
||||||
with open(filename, "rb") as f:
|
with open(filename, "rb") as f:
|
||||||
for offset, datum in enumerate(f.read()):
|
for offset, datum in enumerate(f.read()):
|
||||||
self._mem[address - self.start + offset] = ord(datum)
|
self._mem[address - self.start + offset] = datum
|
||||||
|
|
||||||
def read_byte(self, address):
|
def read_byte(self, address):
|
||||||
assert self.start <= address <= self.end
|
assert self.start <= address <= self.end
|
||||||
|
@ -365,7 +365,7 @@ class Disassemble:
|
||||||
return r, info[0]
|
return r, info[0]
|
||||||
|
|
||||||
|
|
||||||
class ControlHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
class ControlHandler(http.server.BaseHTTPRequestHandler):
|
||||||
|
|
||||||
def __init__(self, request, client_address, server, cpu):
|
def __init__(self, request, client_address, server, cpu):
|
||||||
self.cpu = cpu
|
self.cpu = cpu
|
||||||
|
@ -385,13 +385,13 @@ class ControlHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
r"/reset$": self.post_reset,
|
r"/reset$": self.post_reset,
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server)
|
http.server.BaseHTTPRequestHandler.__init__(self, request, client_address, server)
|
||||||
|
|
||||||
def log_request(self, code, size=0):
|
def log_request(self, code, size=0):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def dispatch(self, urls):
|
def dispatch(self, urls):
|
||||||
for r, f in urls.items():
|
for r, f in list(urls.items()):
|
||||||
m = re.match(r, self.path)
|
m = re.match(r, self.path)
|
||||||
if m is not None:
|
if m is not None:
|
||||||
f(m)
|
f(m)
|
||||||
|
@ -439,7 +439,7 @@ class ControlHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
end = int(e)
|
end = int(e)
|
||||||
else:
|
else:
|
||||||
end = addr
|
end = addr
|
||||||
self.response(json.dumps(list(map(self.cpu.read_byte, range(addr, end + 1)))))
|
self.response(json.dumps(list(map(self.cpu.read_byte, list(range(addr, end + 1))))))
|
||||||
|
|
||||||
def get_status(self, m):
|
def get_status(self, m):
|
||||||
self.response(json.dumps(dict((x, getattr(self.cpu, x)) for x in (
|
self.response(json.dumps(dict((x, getattr(self.cpu, x)) for x in (
|
||||||
|
@ -719,9 +719,9 @@ class CPU:
|
||||||
op = self.read_pc_byte()
|
op = self.read_pc_byte()
|
||||||
func = self.ops[op]
|
func = self.ops[op]
|
||||||
if func is None:
|
if func is None:
|
||||||
print "UNKNOWN OP"
|
print("UNKNOWN OP")
|
||||||
print hex(self.program_counter - 1)
|
print(hex(self.program_counter - 1))
|
||||||
print hex(op)
|
print(hex(op))
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
self.ops[op]()
|
self.ops[op]()
|
||||||
|
@ -736,9 +736,9 @@ class CPU:
|
||||||
op = self.read_pc_byte()
|
op = self.read_pc_byte()
|
||||||
func = self.ops[op]
|
func = self.ops[op]
|
||||||
if func is None:
|
if func is None:
|
||||||
print "UNKNOWN OP"
|
print("UNKNOWN OP")
|
||||||
print hex(self.program_counter - 1)
|
print(hex(self.program_counter - 1))
|
||||||
print hex(op)
|
print(hex(op))
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
self.ops[op]()
|
self.ops[op]()
|
||||||
|
@ -1172,15 +1172,15 @@ class CPU:
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print >>sys.stderr, "ApplePy - an Apple ][ emulator in Python"
|
print("ApplePy - an Apple ][ emulator in Python", file=sys.stderr)
|
||||||
print >>sys.stderr, "James Tauber / http://jtauber.com/"
|
print("James Tauber / http://jtauber.com/", file=sys.stderr)
|
||||||
print >>sys.stderr
|
print(file=sys.stderr)
|
||||||
print >>sys.stderr, "Usage: cpu6502.py [options]"
|
print("Usage: cpu6502.py [options]", file=sys.stderr)
|
||||||
print >>sys.stderr
|
print(file=sys.stderr)
|
||||||
print >>sys.stderr, " -b, --bus Bus port number"
|
print(" -b, --bus Bus port number", file=sys.stderr)
|
||||||
print >>sys.stderr, " -p, --pc Initial PC value"
|
print(" -p, --pc Initial PC value", file=sys.stderr)
|
||||||
print >>sys.stderr, " -R, --rom ROM file to use (default A2ROM.BIN)"
|
print(" -R, --rom ROM file to use (default A2ROM.BIN)", file=sys.stderr)
|
||||||
print >>sys.stderr, " -r, --ram RAM file to load (default none)"
|
print(" -r, --ram RAM file to load (default none)", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1220,8 +1220,8 @@ def get_options():
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
options = get_options()
|
options = get_options()
|
||||||
if options.bus is None:
|
if options.bus is None:
|
||||||
print "ApplePy cpu core"
|
print("ApplePy cpu core")
|
||||||
print "Run applepy.py instead"
|
print("Run applepy.py instead")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
mem = Memory(options)
|
mem = Memory(options)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user