OpenCores
URL https://opencores.org/ocsvn/s80186/s80186/trunk

Subversion Repositories s80186

[/] [s80186/] [trunk/] [sim/] [cppmodel/] [instructions/] [push.cpp] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jamieiles
// Copyright Jamie Iles, 2017
2
//
3
// This file is part of s80x86.
4
//
5
// s80x86 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.
9
//
10
// s80x86 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.
14
//
15
// You should have received a copy of the GNU General Public License
16
// along with s80x86.  If not, see <http://www.gnu.org/licenses/>.
17
 
18
// push r/m
19
void EmulatorPimpl::pushff()
20
{
21
    assert(modrm_decoder->raw_reg() == 6);
22
 
23
    registers->set(SP, registers->get(SP) - 2);
24
    auto val = read_data<uint16_t>();
25
    auto addr = get_phys_addr(registers->get(SS), registers->get(SP));
26
    mem->write<uint16_t>(addr, val);
27
}
28
 
29
// push imm16
30
void EmulatorPimpl::push68()
31
{
32
    auto val = fetch_16bit();
33
 
34
    registers->set(SP, registers->get(SP) - 2);
35
    auto addr = get_phys_addr(registers->get(SS), registers->get(SP));
36
    mem->write<uint16_t>(addr, val);
37
}
38
 
39
// push imm8
40
void EmulatorPimpl::push6a()
41
{
42
    auto val = sign_extend<int16_t, uint8_t>(fetch_byte());
43
 
44
    registers->set(SP, registers->get(SP) - 2);
45
    auto addr = get_phys_addr(registers->get(SS), registers->get(SP));
46
    mem->write<uint16_t>(addr, val);
47
}
48
 
49
// push r
50
void EmulatorPimpl::push50_57()
51
{
52
    auto reg = static_cast<GPR>(static_cast<int>(AX) + (opcode & 0x7));
53
 
54
    registers->set(SP, registers->get(SP) - 2);
55
    auto val = registers->get(reg);
56
    auto addr = get_phys_addr(registers->get(SS), registers->get(SP));
57
    mem->write<uint16_t>(addr, val);
58
}
59
 
60
// push sr
61
void EmulatorPimpl::pushsr()
62
{
63
    auto reg = static_cast<GPR>(static_cast<int>(ES) + ((opcode >> 3) & 0x3));
64
    auto val = registers->get(reg);
65
 
66
    registers->set(SP, registers->get(SP) - 2);
67
    auto addr = get_phys_addr(registers->get(SS), registers->get(SP));
68
    mem->write<uint16_t>(addr, val);
69
}
70
 
71
// pushf
72
void EmulatorPimpl::pushf9c()
73
{
74
    auto val = registers->get_flags();
75
    registers->set(SP, registers->get(SP) - 2);
76
    auto addr = get_phys_addr(registers->get(SS), registers->get(SP));
77
    mem->write<uint16_t>(addr, val);
78
}
79
 
80
void EmulatorPimpl::pusha60()
81
{
82
    auto sp = registers->get(SP);
83
 
84
    push_word(registers->get(AX));
85
    push_word(registers->get(CX));
86
    push_word(registers->get(DX));
87
    push_word(registers->get(BX));
88
    push_word(sp);
89
    push_word(registers->get(BP));
90
    push_word(registers->get(SI));
91
    push_word(registers->get(DI));
92
}
93
 
94
void EmulatorPimpl::popa61()
95
{
96
    registers->set(DI, pop_word());
97
    registers->set(SI, pop_word());
98
    registers->set(BP, pop_word());
99
    pop_word();
100
    registers->set(BX, pop_word());
101
    registers->set(DX, pop_word());
102
    registers->set(CX, pop_word());
103
    registers->set(AX, pop_word());
104
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.