Fixed problem in DeviceSettings::strParam, returned wrong string
[avr-sim.git] / src / Stack.cpp
blob404f6318033e6514e9e967d797728fe91af29743
1 /*
2 * avr-sim: An atmel AVR simulator
3 * Copyright (C) 2008 Tom Haber
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "Stack.h"
20 #include "Registers.h"
21 #include <cstring>
23 namespace avr {
25 Stack::Stack(Bus & bus, MMU & mmu, word mask)
26 : Hardware(bus), mmu(mmu), mask(mask), sp(0) {
29 void Stack::push(unsigned char val) {
30 mmu.writeByte(sp, val);
31 sp--;
32 setSP( sp );
35 unsigned char Stack::pop() {
36 sp++;
37 setSP( sp );
39 return mmu.readByte(sp);
42 void Stack::setSP(word sp) {
43 sp &= mask;
44 spl->set( getSPL() );
45 sph->set( getSPH() );
46 this->sp = sp;
49 bool Stack::attachReg(const char *name, IORegister *reg) {
50 if( strcmp(name, "sph") == 0 )
51 sph = reg;
52 else if( strcmp(name, "spl") == 0 )
53 spl = reg;
54 else
55 return false;
57 reg->registerHW(this);
58 return true;
61 bool Stack::finishBuild() {
62 return ( sph != 0 && spl != 0 );
65 void Stack::regChanged(IORegister *reg) {
66 if( reg == sph )
67 setSPH( (unsigned char)*sph );
68 else if( reg == spl )
69 setSPL( (unsigned char)*spl );