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

Subversion Repositories s80186

[/] [s80186/] [trunk/] [sim/] [cppmodel/] [instructions/] [aam.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
// aam
19
void EmulatorPimpl::aamd4()
20
{
21
    auto divisor = fetch_byte();
22
 
23
    if (divisor == 0) {
24
        auto flags = registers->get_flags();
25
        push_word(flags);
26
        push_word(registers->get(CS));
27
        push_word(registers->get(IP));
28
 
29
        flags &= ~(IF | TF);
30
        registers->set_flags(flags, IF | TF);
31
 
32
        auto new_cs = mem->read<uint16_t>(VEC_DIVIDE_ERROR + 2);
33
        auto new_ip = mem->read<uint16_t>(VEC_DIVIDE_ERROR + 0);
34
 
35
        registers->set(CS, new_cs);
36
        registers->set(IP, new_ip);
37
        jump_taken = true;
38
 
39
        return;
40
    }
41
 
42
    auto al = registers->get(AL);
43
    auto quotient = al / divisor;
44
    auto remainder = al % divisor;
45
 
46
    registers->set(AH, quotient);
47
    registers->set(AL, remainder);
48
 
49
    uint16_t flags = registers->get_flags();
50
    flags &= ~(PF | SF | ZF);
51
 
52
    if (!(registers->get(AX) & 0xffff))
53
        flags |= ZF;
54
    if (!__builtin_parity(registers->get(AL) & 0xff))
55
        flags |= PF;
56
    if (registers->get(AX) & 0x8000)
57
        flags |= SF;
58
 
59
    registers->set_flags(flags, SF | ZF | PF);
60
}

powered by: WebSVN 2.1.0

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