Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions applepy.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ def __init__(self):

def toggle(self, cycle):
if self.last_toggle is not None:
l = (cycle - self.last_toggle) / Speaker.CPU_CYCLES_PER_SAMPLE
l = (cycle - self.last_toggle) // Speaker.CPU_CYCLES_PER_SAMPLE
self.buffer.extend([0, 26000] if self.polarity else [0, -2600])
self.buffer.extend((l - 2) * [16384] if self.polarity else [-16384])
self.polarity = not self.polarity
Expand Down Expand Up @@ -391,7 +391,7 @@ def __init__(self, options, display, speaker, cassette):

rs, _, _ = select.select([listener], [], [], 2)
if not rs:
print >>sys.stderr, "CPU module did not start"
print("CPU module did not start", file=sys.stderr)
sys.exit(1)
self.cpu, _ = listener.accept()

Expand All @@ -404,7 +404,7 @@ def run(self):
break
cycle, rw, addr, val = struct.unpack("<IBHB", op)
if rw == 0:
self.cpu.send(chr(self.softswitches.read_byte(cycle, addr)))
self.cpu.send(struct.pack("B", self.softswitches.read_byte(cycle, addr)))
elif rw == 1:
self.display.update(addr, val)
else:
Expand All @@ -415,7 +415,7 @@ def run(self):
quit = True

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:
key = 0x08
if event.key == pygame.K_RIGHT:
Expand All @@ -435,16 +435,16 @@ def run(self):


def usage():
print >>sys.stderr, "ApplePy - an Apple ][ emulator in Python"
print >>sys.stderr, "James Tauber / http://jtauber.com/"
print >>sys.stderr
print >>sys.stderr, "Usage: applepy.py [options]"
print >>sys.stderr
print >>sys.stderr, " -c, --cassette Cassette wav file to load"
print >>sys.stderr, " -R, --rom ROM file to use (default A2ROM.BIN)"
print >>sys.stderr, " -r, --ram RAM file to load (default none)"
print >>sys.stderr, " -p, --pc Initial PC value"
print >>sys.stderr, " -q, --quiet Quiet mode, no sounds (default sounds)"
print("ApplePy - an Apple ][ emulator in Python", file=sys.stderr)
print("James Tauber / http://jtauber.com/", file=sys.stderr)
print(file=sys.stderr)
print("Usage: applepy.py [options]", file=sys.stderr)
print(file=sys.stderr)
print(" -c, --cassette Cassette wav file to load", file=sys.stderr)
print(" -R, --rom ROM file to use (default A2ROM.BIN)", file=sys.stderr)
print(" -r, --ram RAM file to load (default none)", file=sys.stderr)
print(" -p, --pc Initial PC value", file=sys.stderr)
print(" -q, --quiet Quiet mode, no sounds (default sounds)", file=sys.stderr)
sys.exit(1)


Expand Down
12 changes: 6 additions & 6 deletions applepy_curses.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,12 @@ def run(win):


def usage():
print >>sys.stderr, "ApplePy - an Apple ][ emulator in Python"
print >>sys.stderr, "James Tauber / http://jtauber.com/"
print >>sys.stderr
print >>sys.stderr, "Usage: applepy_curses.py [options]"
print >>sys.stderr
print >>sys.stderr, " -R, --rom ROM file to use (default A2ROM.BIN)"
print("ApplePy - an Apple ][ emulator in Python", file=sys.stderr)
print("James Tauber / http://jtauber.com/", file=sys.stderr)
print(file=sys.stderr)
print("Usage: applepy_curses.py [options]", file=sys.stderr)
print(file=sys.stderr)
print(" -R, --rom ROM file to use (default A2ROM.BIN)", file=sys.stderr)
sys.exit(1)


Expand Down
32 changes: 16 additions & 16 deletions control.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import json
import sys
import urllib
import urllib.request, urllib.parse, urllib.error

URL_PREFIX = "http://localhost:6502"


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):
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):
Expand Down Expand Up @@ -45,7 +45,7 @@ def cmd_disassemble(a):
addr = status["program_counter"]
disasm = get("/disassemble/%d" % addr)
for d in disasm:
print format_disassemble(d)
print(format_disassemble(d))


def cmd_dump(a):
Expand Down Expand Up @@ -80,7 +80,7 @@ def cmd_dump(a):
s += "."
else:
s += " "
print s
print(s)
addr += 16


Expand All @@ -89,20 +89,20 @@ def cmd_help(a):
if len(a) > 1:
f = Commands.get(a[1])
if f is not None:
print f.__doc__
print(f.__doc__)
else:
print "Unknown command:", a[1]
print("Unknown command:", a[1])
else:
print "Commands:"
print("Commands:")
for c in sorted(Commands):
print " ", c
print(" ", c)


def cmd_peek(a):
"""Peek memory location"""
addr = value(a[1])
dump = get("/memory/%d" % addr)
print "%04X: %02X" % (addr, dump[0])
print("%04X: %02X" % (addr, dump[0]))


def cmd_poke(a):
Expand All @@ -115,7 +115,7 @@ def cmd_poke(a):
def cmd_status(a):
"""CPU 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["x_index"],
status["y_index"],
Expand All @@ -128,9 +128,9 @@ def cmd_status(a):
"I" if status["interrupt_disable_flag"] else "i",
"Z" if status["zero_flag"] else "z",
"C" if status["carry_flag"] else "c",
)
))
disasm = get("/disassemble/%d" % status["program_counter"])
print format_disassemble(disasm[0])
print(format_disassemble(disasm[0]))


def cmd_quit(a):
Expand All @@ -155,15 +155,15 @@ def cmd_reset(a):


def main():
print "ApplePy control console"
print("ApplePy control console")
while True:
s = raw_input("6502> ")
s = input("6502> ")
a = s.strip().split()
f = Commands.get(a[0])
if f is not None:
f(a)
else:
print "Unknown command:", s
print("Unknown command:", s)

if __name__ == "__main__":
main()
73 changes: 37 additions & 36 deletions cpu6502.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# originally written 2001, updated 2011


import BaseHTTPServer
import http.server
import json
import re
import select
Expand Down Expand Up @@ -35,7 +35,7 @@ def load(self, address, data):
def load_file(self, address, filename):
with open(filename, "rb") as f:
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):
assert self.start <= address <= self.end
Expand Down Expand Up @@ -365,7 +365,7 @@ def disasm(self, pc):
return r, info[0]


class ControlHandler(BaseHTTPServer.BaseHTTPRequestHandler):
class ControlHandler(http.server.BaseHTTPRequestHandler):

def __init__(self, request, client_address, server, cpu):
self.cpu = cpu
Expand All @@ -385,13 +385,13 @@ def __init__(self, request, client_address, server, cpu):
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):
pass

def dispatch(self, urls):
for r, f in urls.items():
for r, f in list(urls.items()):
m = re.match(r, self.path)
if m is not None:
f(m)
Expand Down Expand Up @@ -439,7 +439,7 @@ def get_memory(self, m):
end = int(e)
else:
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):
self.response(json.dumps(dict((x, getattr(self.cpu, x)) for x in (
Expand Down Expand Up @@ -505,10 +505,10 @@ class CPU:
STACK_PAGE = 0x100
RESET_VECTOR = 0xFFFC

def __init__(self, options, memory):
def __init__(self, memory, pc=None):
self.memory = memory

self.control_server = BaseHTTPServer.HTTPServer(("127.0.0.1", 6502), ControlHandlerFactory(self))
self.control_server = memory.use_bus and http.server.HTTPServer(("127.0.0.1", 6502), ControlHandlerFactory(self))

self.accumulator = 0x00
self.x_index = 0x00
Expand All @@ -528,8 +528,8 @@ def __init__(self, options, memory):

self.setup_ops()
self.reset()
if options.pc is not None:
self.program_counter = options.pc
if pc is not None:
self.program_counter = pc
self.running = True
self.quit = False

Expand Down Expand Up @@ -704,23 +704,24 @@ def run(self, bus_port):
# a connection is accepted until the response
# is sent. TODO: use an async HTTP server that
# handles input data asynchronously.
sockets = [self.control_server]
rs, _, _ = select.select(sockets, [], [], timeout)
for s in rs:
if s is self.control_server:
self.control_server._handle_request_noblock()
else:
pass
if self.control_server:
sockets = [self.control_server]
rs, _, _ = select.select(sockets, [], [], timeout)
for s in rs:
if s is self.control_server:
self.control_server._handle_request_noblock()
else:
pass

count = 1000
while count > 0 and self.running:
self.cycles += 2 # all instructions take this as a minimum
op = self.read_pc_byte()
func = self.ops[op]
if func is None:
print "UNKNOWN OP"
print hex(self.program_counter - 1)
print hex(op)
print("UNKNOWN OP")
print(hex(self.program_counter - 1))
print(hex(op))
break
else:
self.ops[op]()
Expand All @@ -735,9 +736,9 @@ def test_run(self, start, end):
op = self.read_pc_byte()
func = self.ops[op]
if func is None:
print "UNKNOWN OP"
print hex(self.program_counter - 1)
print hex(op)
print("UNKNOWN OP")
print(hex(self.program_counter - 1))
print(hex(op))
break
else:
self.ops[op]()
Expand Down Expand Up @@ -1156,10 +1157,10 @@ def NOP(self):

def BRK(self):
self.cycles += 5
self.break_flag = 1 # set break_flag before status pushed
self.push_word(self.program_counter + 1)
self.push_byte(self.status_as_byte())
self.program_counter = self.read_word(0xFFFE)
self.break_flag = 1

def RTI(self):
self.cycles += 4
Expand All @@ -1171,15 +1172,15 @@ def RTI(self):


def usage():
print >>sys.stderr, "ApplePy - an Apple ][ emulator in Python"
print >>sys.stderr, "James Tauber / http://jtauber.com/"
print >>sys.stderr
print >>sys.stderr, "Usage: cpu6502.py [options]"
print >>sys.stderr
print >>sys.stderr, " -b, --bus Bus port number"
print >>sys.stderr, " -p, --pc Initial PC value"
print >>sys.stderr, " -R, --rom ROM file to use (default A2ROM.BIN)"
print >>sys.stderr, " -r, --ram RAM file to load (default none)"
print("ApplePy - an Apple ][ emulator in Python", file=sys.stderr)
print("James Tauber / http://jtauber.com/", file=sys.stderr)
print(file=sys.stderr)
print("Usage: cpu6502.py [options]", file=sys.stderr)
print(file=sys.stderr)
print(" -b, --bus Bus port number", file=sys.stderr)
print(" -p, --pc Initial PC value", file=sys.stderr)
print(" -R, --rom ROM file to use (default A2ROM.BIN)", file=sys.stderr)
print(" -r, --ram RAM file to load (default none)", file=sys.stderr)
sys.exit(1)


Expand Down Expand Up @@ -1219,11 +1220,11 @@ def __init__(self):
if __name__ == "__main__":
options = get_options()
if options.bus is None:
print "ApplePy cpu core"
print "Run applepy.py instead"
print("ApplePy cpu core")
print("Run applepy.py instead")
sys.exit(0)

mem = Memory(options)

cpu = CPU(options, mem)
cpu = CPU(mem, options.pc)
cpu.run(options.bus)