Merge remote-tracking branch 'origin/master' into version/4.1
This commit is contained in:
@@ -1233,19 +1233,6 @@ nearcall(uint16_t new_ip)
|
||||
push(&ret_ip);
|
||||
}
|
||||
|
||||
static void
|
||||
farcall(uint16_t new_cs, uint16_t new_ip, int jump)
|
||||
{
|
||||
if (jump)
|
||||
wait(1, 0);
|
||||
pfq_do_suspend();
|
||||
wait(3, 0);
|
||||
push(&CS);
|
||||
load_cs(new_cs);
|
||||
wait(2, 0);
|
||||
nearcall(new_ip);
|
||||
}
|
||||
|
||||
static void
|
||||
farcall2(uint16_t new_cs, uint16_t new_ip)
|
||||
{
|
||||
@@ -1320,20 +1307,6 @@ sw_int(uint16_t intr)
|
||||
push(&old_ip);
|
||||
}
|
||||
|
||||
static void
|
||||
int1(void)
|
||||
{
|
||||
wait(2, 0);
|
||||
intr_routine(1, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
int2(void)
|
||||
{
|
||||
wait(2, 0);
|
||||
intr_routine(2, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
int3(void)
|
||||
{
|
||||
@@ -1341,17 +1314,6 @@ int3(void)
|
||||
intr_routine(3, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
int_o(void)
|
||||
{
|
||||
wait(4, 0);
|
||||
|
||||
if (cpu_state.flags & V_FLAG) {
|
||||
wait(2, 0);
|
||||
intr_routine(4, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
interrupt_808x(uint16_t addr)
|
||||
{
|
||||
@@ -2098,19 +2060,6 @@ farret(int far)
|
||||
set_ip(new_ip);
|
||||
}
|
||||
|
||||
/* The IRET microcode routine. */
|
||||
static void
|
||||
iret_routine(void)
|
||||
{
|
||||
wait(1, 0);
|
||||
farret(1);
|
||||
if (is_nec)
|
||||
cpu_state.flags = pop() | 0x8002;
|
||||
else
|
||||
cpu_state.flags = pop() | 0x0002;
|
||||
wait(1, 0);
|
||||
}
|
||||
|
||||
/* Executes instructions up to the specified number of cycles. */
|
||||
void
|
||||
execx86(int cycs)
|
||||
|
@@ -1,16 +0,0 @@
|
||||
#
|
||||
# 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
# running old operating systems and software designed for IBM
|
||||
# PC systems and compatibles from 1981 through fairly recent
|
||||
# system designs based on the PCI bus.
|
||||
#
|
||||
# This file is part of the 86Box distribution.
|
||||
#
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
#
|
||||
|
||||
add_library(808x OBJECT queue.c)
|
@@ -1,192 +0,0 @@
|
||||
/*
|
||||
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
* running old operating systems and software designed for IBM
|
||||
* PC systems and compatibles from 1981 through fairly recent
|
||||
* system designs based on the PCI bus.
|
||||
*
|
||||
* This file is part of the 86Box distribution.
|
||||
*
|
||||
* 808x CPU emulation, mostly ported from reenigne's XTCE, which
|
||||
* is cycle-accurate.
|
||||
*
|
||||
* Authors: gloriouscow, <https://github.com/dbalsom>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
* Copyright 2023 gloriouscow.
|
||||
* Copyright 2023 Miran Grca.
|
||||
*/
|
||||
#include <inttypes.h>
|
||||
#include <math.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include "x86.h"
|
||||
#include <86box/machine.h>
|
||||
#include <86box/io.h>
|
||||
#include <86box/mem.h>
|
||||
#include <86box/rom.h>
|
||||
#include <86box/nmi.h>
|
||||
#include <86box/pic.h>
|
||||
#include <86box/ppi.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/gdbstub.h>
|
||||
// #include "808x.h"
|
||||
#include "queue.h"
|
||||
|
||||
/* TODO: Move to cpu.h so this can eventually be reused for 286+ as well. */
|
||||
#define QUEUE_MAX 6
|
||||
|
||||
/* NOTE: When porting from Rust to C, please use uintptr_t and not size_t,
|
||||
so it can be printed with PRIuPTR. */
|
||||
typedef struct queue_t {
|
||||
uintptr_t size;
|
||||
uintptr_t len;
|
||||
uintptr_t back;
|
||||
uintptr_t front;
|
||||
uint8_t q[QUEUE_MAX];
|
||||
uint16_t preload;
|
||||
queue_delay_t delay;
|
||||
} queue_t;
|
||||
|
||||
static queue_t queue;
|
||||
|
||||
#ifdef ENABLE_QUEUE_LOG
|
||||
int queue_do_log = ENABLE_QUEUE_LOG;
|
||||
|
||||
static void
|
||||
queue_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (queue_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
# define queue_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
void
|
||||
queue_set_size(uintptr_t size)
|
||||
{
|
||||
if (size > QUEUE_MAX)
|
||||
fatal("Requested prefetch queue of %" PRIuPTR " bytes is too big\n", size);
|
||||
|
||||
queue.size = size;
|
||||
}
|
||||
|
||||
uintptr_t
|
||||
queue_get_len(void)
|
||||
{
|
||||
return queue.len;
|
||||
}
|
||||
|
||||
int
|
||||
queue_is_full(void)
|
||||
{
|
||||
return (queue.len != queue.size);
|
||||
}
|
||||
|
||||
uint16_t
|
||||
queue_get_preload(void)
|
||||
{
|
||||
uint16_t ret = queue.preload;
|
||||
queue.preload = 0x0000;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
queue_has_preload(void)
|
||||
{
|
||||
return (queue.preload & FLAG_PRELOADED) ? 1 : 0;
|
||||
}
|
||||
|
||||
void
|
||||
queue_set_preload(void)
|
||||
{
|
||||
uint8_t byte;
|
||||
|
||||
if (queue.len > 0) {
|
||||
byte = queue_pop();
|
||||
queue.preload = ((uint16_t) byte) | FLAG_PRELOADED;
|
||||
} else
|
||||
fatal("Tried to preload with empty queue\n");
|
||||
}
|
||||
|
||||
void
|
||||
queue_push8(uint8_t byte)
|
||||
{
|
||||
if (queue.len < queue.size) {
|
||||
queue.q[queue.front] = byte;
|
||||
queue.front = (queue.front + 1) % queue.size;
|
||||
queue.len++;
|
||||
|
||||
if (queue.len == 3)
|
||||
queue.delay = DELAY_WRITE;
|
||||
else
|
||||
queue.delay = DELAY_NONE;
|
||||
} else
|
||||
fatal("Queue overrun\n");
|
||||
}
|
||||
|
||||
void
|
||||
queue_push16(uint16_t word)
|
||||
{
|
||||
queue_push8((uint8_t) (word & 0xff));
|
||||
queue_push8((uint8_t) ((word >> 8) & 0xff));
|
||||
}
|
||||
|
||||
uint8_t
|
||||
queue_pop(void)
|
||||
{
|
||||
uint8_t byte = 0xff;
|
||||
|
||||
if (queue.len > 0) {
|
||||
byte = queue.q[queue.back];
|
||||
|
||||
queue.back = (queue.back + 1) % queue.size;
|
||||
queue.len--;
|
||||
|
||||
if (queue.len >= 3)
|
||||
queue.delay = DELAY_READ;
|
||||
else
|
||||
queue.delay = DELAY_NONE;
|
||||
} else
|
||||
fatal("Queue underrun\n");
|
||||
|
||||
return byte;
|
||||
}
|
||||
|
||||
queue_delay_t
|
||||
queue_get_delay(void)
|
||||
{
|
||||
return queue.delay;
|
||||
}
|
||||
|
||||
void
|
||||
queue_flush(void)
|
||||
{
|
||||
memset(&queue, 0x00, sizeof(queue_t));
|
||||
|
||||
queue.delay = DELAY_NONE;
|
||||
}
|
||||
|
||||
void
|
||||
queue_init(void)
|
||||
{
|
||||
queue_flush();
|
||||
|
||||
if (is8086)
|
||||
queue_set_size(6);
|
||||
else
|
||||
queue_set_size(4);
|
||||
}
|
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
* running old operating systems and software designed for IBM
|
||||
* PC systems and compatibles from 1981 through fairly recent
|
||||
* system designs based on the PCI bus.
|
||||
*
|
||||
* This file is part of the 86Box distribution.
|
||||
*
|
||||
* Prefetch queue implementation header.
|
||||
*
|
||||
* Authors: gloriouscow, <https://github.com/dbalsom>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
* Copyright 2023 gloriouscow.
|
||||
* Copyright 2023 Miran Grca.
|
||||
*/
|
||||
#ifndef EMU_QUEUE_H
|
||||
#define EMU_QUEUE_H
|
||||
|
||||
typedef enum queue_delay_t {
|
||||
DELAY_READ,
|
||||
DELAY_WRITE,
|
||||
DELAY_NONE
|
||||
} queue_delay_t;
|
||||
|
||||
#define FLAG_PRELOADED 0x8000
|
||||
|
||||
extern void queue_set_size(uintptr_t size);
|
||||
extern uintptr_t queue_get_len(void);
|
||||
extern int queue_is_full(void);
|
||||
extern uint16_t queue_get_preload(void);
|
||||
extern int queue_has_preload(void);
|
||||
extern void queue_set_preload(void);
|
||||
extern void queue_push8(uint8_t byte);
|
||||
extern void queue_push16(uint16_t word);
|
||||
extern uint8_t queue_pop(void);
|
||||
extern queue_delay_t queue_get_delay(void);
|
||||
extern void queue_flush(void);
|
||||
|
||||
extern void queue_init(void);
|
||||
|
||||
#endif /*EMU_QUEUE_H*/
|
@@ -36,6 +36,3 @@ endif()
|
||||
|
||||
add_subdirectory(softfloat)
|
||||
target_link_libraries(86Box softfloat)
|
||||
|
||||
add_subdirectory(808x)
|
||||
target_link_libraries(86Box 808x)
|
||||
|
Reference in New Issue
Block a user