factored out stack pull/push

This commit is contained in:
James Tauber 2011-08-06 21:30:58 -04:00
parent d6875b2419
commit ebca76c29b

View File

@ -325,6 +325,26 @@ class CPU:
#### ####
def push_byte(self, byte):
self.memory.write_byte(self.STACK_PAGE + self.stack_pointer, byte)
self.stack_pointer = (self.stack_pointer - 1) % 0x100
def pull_byte(self):
self.stack_pointer = (self.stack_pointer + 1) % 0x100
return self.memory.read_byte(self.STACK_PAGE + self.stack_pointer)
def push_word(self, word):
hi, lo = divmod(word, 0x100)
self.push_byte(hi)
self.push_byte(lo)
def pull_word(self):
s = self.STACK_PAGE + self.stack_pointer + 1
self.stack_pointer += 2
return self.memory.read_word(s)
####
def immediate_mode(self): def immediate_mode(self):
return self.get_pc() return self.get_pc()
@ -456,19 +476,11 @@ class CPU:
self.program_counter = operand_address self.program_counter = operand_address
def JSR(self, operand_address): def JSR(self, operand_address):
hi, lo = divmod(self.program_counter - 1, 0x100) self.push_word(self.program_counter - 1)
s = self.STACK_PAGE + self.stack_pointer
self.stack_pointer = (self.stack_pointer - 1)
self.memory.write_byte(s, hi)
s = self.STACK_PAGE + self.stack_pointer
self.stack_pointer = (self.stack_pointer - 1)
self.memory.write_byte(s, lo)
self.program_counter = operand_address self.program_counter = operand_address
def RTS(self): def RTS(self):
s = self.STACK_PAGE + self.stack_pointer + 1 self.program_counter = self.pull_word() + 1
self.program_counter = self.memory.read_word(s) + 1
self.stack_pointer = self.stack_pointer + 2 # TODO: what to do when stack is empty?
# BRANCHES # BRANCHES
@ -550,23 +562,16 @@ class CPU:
# PUSH / PULL # PUSH / PULL
def PHA(self): def PHA(self):
s = self.STACK_PAGE + self.stack_pointer self.push_byte(self.accumulator)
self.stack_pointer -= 1
self.memory.write_byte(s, self.accumulator)
def PHP(self): def PHP(self):
status = self.status_as_byte() self.push_byte(self.status_as_byte())
s = self.STACK_PAGE + self.stack_pointer
self.stack_pointer = (self.stack_pointer - 1) % 0x100
self.memory.write_byte(s, status)
def PLA(self): def PLA(self):
self.stack_pointer += 1 self.accumulator = self.update_nz(self.pull_byte())
self.accumulator = self.update_nz(self.memory.read_byte(self.STACK_PAGE + self.stack_pointer))
def PLP(self): def PLP(self):
self.stack_pointer = (self.stack_pointer + 1) % 0x100 self.status_from_byte(self.pull_byte())
self.status_from_byte(self.memory.read_byte(self.STACK_PAGE + self.stack_pointer))
# LOGIC # LOGIC
@ -639,33 +644,14 @@ class CPU:
def BRK(self): def BRK(self):
# push PC # push PC
pc_hi, pc_lo = divmod(self.program_counter, 0x100) self.push_word(self.program_counter + 1)
self.push_byte(self.status_as_byte())
s = self.STACK_PAGE + self.stack_pointer self.program_counter = self.memory.read_word(0xFFFE)
self.stack_pointer = (self.stack_pointer - 1) % 0x100
self.memory.write_byte(s, pc_hi)
self.stack_pointer = (self.stack_pointer - 1) % 0x100
self.memory.write_byte(s, pc_lo)
# PHP
status = self.status_as_byte()
s = self.STACK_PAGE + self.stack_pointer
self.stack_pointer = (self.stack_pointer - 1) % 0x100
self.memory.write_byte(s, status)
self.progress_counter = self.memory.read_word(0xFFFE)
self.break_flag = 1 self.break_flag = 1
def RTI(self): def RTI(self):
# PLP self.status_from_byte(self.pull_byte())
self.stack_pointer = (self.stack_pointer + 1) % 0x100 self.program_counter = self.pull_word()
self.status_from_byte(self.memory.read_byte(self.STACK_PAGE + self.stack_pointer))
# pull PC
s = self.STACK_PAGE + self.stack_pointer + 1
self.stack_pointer += 2
self.progress_counter = self.memory.read_word(s)
# @@@ IRQ # @@@ IRQ