From dfa6dc97bd20690de24bc172481dd23ae8b9b3b8 Mon Sep 17 00:00:00 2001 From: David Holm Date: Fri, 4 Jan 2019 22:53:06 +0100 Subject: [PATCH 01/18] main: Always pin to core #1 Pin the MiSTer process to core #1 in order to stay clear of the hardware interrupt handlers running in the Linux kernel on core #0. This gives a consistent improvement in the main loop cycle time of about 6-7x. --- main.cpp | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/main.cpp b/main.cpp index d0b0ca7..0682d4c 100644 --- a/main.cpp +++ b/main.cpp @@ -35,22 +35,13 @@ const char *version = "$VER:HPS" VDATE; int main(int argc, char *argv[]) { - /* - //placeholder for CPU1 dedicated process - if (!fork()) - { - cpu_set_t set; - CPU_ZERO(&set); - CPU_SET(1, &set); - sched_setaffinity(0, sizeof(set), &set); - - while (1) - { - sleep(2); - printf("Tick\n"); - } - } - */ + // Always pin main worker process to core #1 as core #0 is the + // hardware interrupt handler in Linux. This reduces idle latency + // in the main loop by about 6-7x. + cpu_set_t set; + CPU_ZERO(&set); + CPU_SET(1, &set); + sched_setaffinity(0, sizeof(set), &set); fpga_io_init(); fpga_gpo_write(0); From 18ec305841b1db5947917d668c966a97dd0d5549 Mon Sep 17 00:00:00 2001 From: David Holm Date: Thu, 3 Jan 2019 18:05:16 +0100 Subject: [PATCH 02/18] 3pp: libco v18 Adds the coroutine library libco by byuu. - https://byuu.org/library/libco/ --- 3pp/libco/amd64.c | 160 ++++++++++++++++ 3pp/libco/arm.c | 79 ++++++++ 3pp/libco/doc/style.css | 8 + 3pp/libco/doc/targets.html | 89 +++++++++ 3pp/libco/doc/usage.html | 107 +++++++++++ 3pp/libco/fiber.c | 51 ++++++ 3pp/libco/libco.c | 34 ++++ 3pp/libco/libco.h | 26 +++ 3pp/libco/ppc.c | 367 +++++++++++++++++++++++++++++++++++++ 3pp/libco/settings.h | 36 ++++ 3pp/libco/sjlj.c | 102 +++++++++++ 3pp/libco/ucontext.c | 69 +++++++ 3pp/libco/x86.c | 114 ++++++++++++ Makefile | 8 +- 14 files changed, 1247 insertions(+), 3 deletions(-) create mode 100644 3pp/libco/amd64.c create mode 100644 3pp/libco/arm.c create mode 100644 3pp/libco/doc/style.css create mode 100644 3pp/libco/doc/targets.html create mode 100644 3pp/libco/doc/usage.html create mode 100644 3pp/libco/fiber.c create mode 100644 3pp/libco/libco.c create mode 100644 3pp/libco/libco.h create mode 100644 3pp/libco/ppc.c create mode 100644 3pp/libco/settings.h create mode 100644 3pp/libco/sjlj.c create mode 100644 3pp/libco/ucontext.c create mode 100644 3pp/libco/x86.c diff --git a/3pp/libco/amd64.c b/3pp/libco/amd64.c new file mode 100644 index 0000000..235708a --- /dev/null +++ b/3pp/libco/amd64.c @@ -0,0 +1,160 @@ +/* + libco.amd64 (2016-09-14) + author: byuu + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#include "settings.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local long long co_active_buffer[64]; +static thread_local cothread_t co_active_handle = 0; +static void (*co_swap)(cothread_t, cothread_t) = 0; + +#ifdef LIBCO_MPROTECT + alignas(4096) +#else + section(text) +#endif +#ifdef _WIN32 + /* ABI: Win64 */ + static const unsigned char co_swap_function[4096] = { + 0x48, 0x89, 0x22, /* mov [rdx],rsp */ + 0x48, 0x8b, 0x21, /* mov rsp,[rcx] */ + 0x58, /* pop rax */ + 0x48, 0x89, 0x6a, 0x08, /* mov [rdx+ 8],rbp */ + 0x48, 0x89, 0x72, 0x10, /* mov [rdx+16],rsi */ + 0x48, 0x89, 0x7a, 0x18, /* mov [rdx+24],rdi */ + 0x48, 0x89, 0x5a, 0x20, /* mov [rdx+32],rbx */ + 0x4c, 0x89, 0x62, 0x28, /* mov [rdx+40],r12 */ + 0x4c, 0x89, 0x6a, 0x30, /* mov [rdx+48],r13 */ + 0x4c, 0x89, 0x72, 0x38, /* mov [rdx+56],r14 */ + 0x4c, 0x89, 0x7a, 0x40, /* mov [rdx+64],r15 */ + #if !defined(LIBCO_NO_SSE) + 0x0f, 0x29, 0x72, 0x50, /* movaps [rdx+ 80],xmm6 */ + 0x0f, 0x29, 0x7a, 0x60, /* movaps [rdx+ 96],xmm7 */ + 0x44, 0x0f, 0x29, 0x42, 0x70, /* movaps [rdx+112],xmm8 */ + 0x48, 0x83, 0xc2, 0x70, /* add rdx,112 */ + 0x44, 0x0f, 0x29, 0x4a, 0x10, /* movaps [rdx+ 16],xmm9 */ + 0x44, 0x0f, 0x29, 0x52, 0x20, /* movaps [rdx+ 32],xmm10 */ + 0x44, 0x0f, 0x29, 0x5a, 0x30, /* movaps [rdx+ 48],xmm11 */ + 0x44, 0x0f, 0x29, 0x62, 0x40, /* movaps [rdx+ 64],xmm12 */ + 0x44, 0x0f, 0x29, 0x6a, 0x50, /* movaps [rdx+ 80],xmm13 */ + 0x44, 0x0f, 0x29, 0x72, 0x60, /* movaps [rdx+ 96],xmm14 */ + 0x44, 0x0f, 0x29, 0x7a, 0x70, /* movaps [rdx+112],xmm15 */ + #endif + 0x48, 0x8b, 0x69, 0x08, /* mov rbp,[rcx+ 8] */ + 0x48, 0x8b, 0x71, 0x10, /* mov rsi,[rcx+16] */ + 0x48, 0x8b, 0x79, 0x18, /* mov rdi,[rcx+24] */ + 0x48, 0x8b, 0x59, 0x20, /* mov rbx,[rcx+32] */ + 0x4c, 0x8b, 0x61, 0x28, /* mov r12,[rcx+40] */ + 0x4c, 0x8b, 0x69, 0x30, /* mov r13,[rcx+48] */ + 0x4c, 0x8b, 0x71, 0x38, /* mov r14,[rcx+56] */ + 0x4c, 0x8b, 0x79, 0x40, /* mov r15,[rcx+64] */ + #if !defined(LIBCO_NO_SSE) + 0x0f, 0x28, 0x71, 0x50, /* movaps xmm6, [rcx+ 80] */ + 0x0f, 0x28, 0x79, 0x60, /* movaps xmm7, [rcx+ 96] */ + 0x44, 0x0f, 0x28, 0x41, 0x70, /* movaps xmm8, [rcx+112] */ + 0x48, 0x83, 0xc1, 0x70, /* add rcx,112 */ + 0x44, 0x0f, 0x28, 0x49, 0x10, /* movaps xmm9, [rcx+ 16] */ + 0x44, 0x0f, 0x28, 0x51, 0x20, /* movaps xmm10,[rcx+ 32] */ + 0x44, 0x0f, 0x28, 0x59, 0x30, /* movaps xmm11,[rcx+ 48] */ + 0x44, 0x0f, 0x28, 0x61, 0x40, /* movaps xmm12,[rcx+ 64] */ + 0x44, 0x0f, 0x28, 0x69, 0x50, /* movaps xmm13,[rcx+ 80] */ + 0x44, 0x0f, 0x28, 0x71, 0x60, /* movaps xmm14,[rcx+ 96] */ + 0x44, 0x0f, 0x28, 0x79, 0x70, /* movaps xmm15,[rcx+112] */ + #endif + 0xff, 0xe0, /* jmp rax */ + }; + + #include + + static void co_init() { + #ifdef LIBCO_MPROTECT + DWORD old_privileges; + VirtualProtect((void*)co_swap_function, sizeof co_swap_function, PAGE_EXECUTE_READ, &old_privileges); + #endif + } +#else + /* ABI: SystemV */ + static const unsigned char co_swap_function[4096] = { + 0x48, 0x89, 0x26, /* mov [rsi],rsp */ + 0x48, 0x8b, 0x27, /* mov rsp,[rdi] */ + 0x58, /* pop rax */ + 0x48, 0x89, 0x6e, 0x08, /* mov [rsi+ 8],rbp */ + 0x48, 0x89, 0x5e, 0x10, /* mov [rsi+16],rbx */ + 0x4c, 0x89, 0x66, 0x18, /* mov [rsi+24],r12 */ + 0x4c, 0x89, 0x6e, 0x20, /* mov [rsi+32],r13 */ + 0x4c, 0x89, 0x76, 0x28, /* mov [rsi+40],r14 */ + 0x4c, 0x89, 0x7e, 0x30, /* mov [rsi+48],r15 */ + 0x48, 0x8b, 0x6f, 0x08, /* mov rbp,[rdi+ 8] */ + 0x48, 0x8b, 0x5f, 0x10, /* mov rbx,[rdi+16] */ + 0x4c, 0x8b, 0x67, 0x18, /* mov r12,[rdi+24] */ + 0x4c, 0x8b, 0x6f, 0x20, /* mov r13,[rdi+32] */ + 0x4c, 0x8b, 0x77, 0x28, /* mov r14,[rdi+40] */ + 0x4c, 0x8b, 0x7f, 0x30, /* mov r15,[rdi+48] */ + 0xff, 0xe0, /* jmp rax */ + }; + + #include + #include + + static void co_init() { + #ifdef LIBCO_MPROTECT + unsigned long long addr = (unsigned long long)co_swap_function; + unsigned long long base = addr - (addr % sysconf(_SC_PAGESIZE)); + unsigned long long size = (addr - base) + sizeof co_swap_function; + mprotect((void*)base, size, PROT_READ | PROT_EXEC); + #endif + } +#endif + +static void crash() { + assert(0); /* called only if cothread_t entrypoint returns */ +} + +cothread_t co_active() { + if(!co_active_handle) co_active_handle = &co_active_buffer; + return co_active_handle; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) { + cothread_t handle; + if(!co_swap) { + co_init(); + co_swap = (void (*)(cothread_t, cothread_t))co_swap_function; + } + if(!co_active_handle) co_active_handle = &co_active_buffer; + size += 512; /* allocate additional space for storage */ + size &= ~15; /* align stack to 16-byte boundary */ + + if(handle = (cothread_t)malloc(size)) { + long long *p = (long long*)((char*)handle + size); /* seek to top of stack */ + *--p = (long long)crash; /* crash if entrypoint returns */ + *--p = (long long)entrypoint; /* start of function */ + *(long long*)handle = (long long)p; /* stack pointer */ + } + + return handle; +} + +void co_delete(cothread_t handle) { + free(handle); +} + +void co_switch(cothread_t handle) { + register cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif diff --git a/3pp/libco/arm.c b/3pp/libco/arm.c new file mode 100644 index 0000000..e7c57b4 --- /dev/null +++ b/3pp/libco/arm.c @@ -0,0 +1,79 @@ +/* + libco.arm (2016-09-14) + author: byuu + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#include "settings.h" + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local unsigned long co_active_buffer[64]; +static thread_local cothread_t co_active_handle = 0; +static void (*co_swap)(cothread_t, cothread_t) = 0; + +#ifdef LIBCO_MPROTECT + alignas(4096) +#else + section(text) +#endif +static const unsigned long co_swap_function[1024] = { + 0xe8a16ff0, /* stmia r1!, {r4-r11,sp,lr} */ + 0xe8b0aff0, /* ldmia r0!, {r4-r11,sp,pc} */ + 0xe12fff1e, /* bx lr */ +}; + +static void co_init() { + #ifdef LIBCO_MPROTECT + unsigned long addr = (unsigned long)co_swap_function; + unsigned long base = addr - (addr % sysconf(_SC_PAGESIZE)); + unsigned long size = (addr - base) + sizeof co_swap_function; + mprotect((void*)base, size, PROT_READ | PROT_EXEC); + #endif +} + +cothread_t co_active() { + if(!co_active_handle) co_active_handle = &co_active_buffer; + return co_active_handle; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) { + unsigned long* handle = 0; + if(!co_swap) { + co_init(); + co_swap = (void (*)(cothread_t, cothread_t))co_swap_function; + } + if(!co_active_handle) co_active_handle = &co_active_buffer; + size += 256; + size &= ~15; + + if((handle = (unsigned long*)malloc(size))) { + unsigned long* p = (unsigned long*)((unsigned char*)handle + size); + handle[8] = (unsigned long)p; + handle[9] = (unsigned long)entrypoint; + } + + return handle; +} + +void co_delete(cothread_t handle) { + free(handle); +} + +void co_switch(cothread_t handle) { + cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif diff --git a/3pp/libco/doc/style.css b/3pp/libco/doc/style.css new file mode 100644 index 0000000..5181afd --- /dev/null +++ b/3pp/libco/doc/style.css @@ -0,0 +1,8 @@ +body { + background: #333; + color: #fff; +} + +code { + background: #444; +} diff --git a/3pp/libco/doc/targets.html b/3pp/libco/doc/targets.html new file mode 100644 index 0000000..d6211a1 --- /dev/null +++ b/3pp/libco/doc/targets.html @@ -0,0 +1,89 @@ + + + + + + + +Supported targets:

+ +Note that supported targets are only those that have been tested and confirmed +working. It is quite possible that libco will work on more processors, compilers +and operating systems than those listed below. +
+ +libco.x86
+Overhead: ~5x
+Supported processor(s): 32-bit x86
+Supported compiler(s): any
+Supported operating system(s):
    +
  • Windows
  • +
  • Mac OS X
  • +
  • Linux
  • +
  • BSD
  • +
+
+ +libco.amd64
+Overhead: ~10x (Windows), ~6x (all other platforms)
+Supported processor(s): 64-bit amd64
+Supported compiler(s): any
+Supported operating system(s):
    +
  • Windows
  • +
  • Mac OS X
  • +
  • Linux
  • +
  • BSD
  • +
+
+ +libco.ppc
+Overhead: ~20x
+Supported processor(s): 32-bit PowerPC, 64-bit PowerPC
+Supported compiler(s): GNU GCC
+Supported operating system(s):
    +
+
  • Mac OS X
  • +
  • Linux
  • +
  • BSD
  • +
  • Playstation 3
  • + +
    + +Note: this module contains compiler flags to enable/disable FPU and Altivec +support. + +
    + +libco.fiber
    +Overhead: ~15x
    +Supported processor(s): Processor independent
    +Supported compiler(s): any
    +Supported operating system(s):
      +
    • Windows
    • +
    +
    + +libco.sjlj
    +Overhead: ~30x
    +Supported processor(s): Processor independent
    +Supported compiler(s): any
    +Supported operating system(s):
      +
    • Mac OS X
    • +
    • Linux
    • +
    • BSD
    • +
    • Solaris
    • +
    +
    + +libco.ucontext
    +Overhead: ~300x
    +Supported processor(s): Processor independent
    +Supported compiler(s): any
    +Supported operating system(s):
      +
    • Linux
    • +
    • BSD
    • +
    +
    + + + diff --git a/3pp/libco/doc/usage.html b/3pp/libco/doc/usage.html new file mode 100644 index 0000000..3f0d81c --- /dev/null +++ b/3pp/libco/doc/usage.html @@ -0,0 +1,107 @@ + + + + + + + +License:

    +libco is released to the public domain. +
    + +Contact:

    +At present, you may contact me at setsunakun0 at hotmail dot com.
    +I am interested in knowing of any projects that make use of this library, +though this is only a courtesy. +
    + +Foreword:

    +libco is a cross-platform, public domain implementation of +cooperative-multithreading; a feature that is sorely lacking +from the ISO C/C++ standard.
    +The library is designed for maximum speed and portability, and +not for safety or features. If safety or extra functionality is desired, +a wrapper API can easily be written to encapsulate all library functions.
    +Behavior of executing operations that are listed as not permitted +below result in undefined behavior. They may work anyway, they +may cause undesired / unknown behavior, or they may crash the +program entirely.
    +The goal of this library was to simplify the base API as much as possible, +implementing only that which cannot be implemented using pure C. Additional +functionality after this would only complicate ports of this library to new +platforms. +
    + +Porting:

    +This document is included as a reference for porting libco. Please submit any +ports you create to me, so that libco can become more useful. Please note that +since libco is public domain, you must submit your code as a work of the +public domain in order for it to be included in the official distribution. +Full credit will be given in the source code of the official release. Please +do not bother submitting code to me under any other license -- including GPL, +LGPL, BSD or CC -- I am not interested in creating a library with multiple +different licenses depending on which targets are used. +
    + +Synopsis:

    + +typedef void* cothread_t;
    +
    +cothread_t co_active();
    +cothread_t co_create(unsigned int heapsize, void (*coentry)(void));
    +void       co_delete(cothread_t cothread);
    +void       co_switch(cothread_t cothread);
    +
    +
    + +Usage: +
    + +typedef void* cothread_t;

    +Handle to cothread.
    +Handle must be of type void*.
    +A value of null (0) indicates an uninitialized or invalid +handle, whereas a non-zero value indicates a valid handle. +
    + +cothread_t co_active();

    +Return handle to current cothread. Always returns a valid handle, even when +called from the main program thread. +
    + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void));

    +Create new cothread.
    +Heapsize is the amount of memory allocated for the cothread stack, specified +in bytes. This is unfortunately impossible to make fully portable. It is +recommended to specify sizes using `n * sizeof(void*)'. It is better to err +on the side of caution and allocate more memory than will be needed to ensure +compatibility with other platforms, within reason. A typical heapsize for a +32-bit architecture is ~1MB.
    +When the new cothread is first called, program execution jumps to coentry. +This function does not take any arguments, due to portability issues with +passing function arguments. However, arguments can be simulated by the use +of global variables, which can be set before the first call to each cothread.
    +coentry() must not return, and should end with an appropriate co_switch() +statement. Behavior is undefined if entry point returns normally.
    +Library is responsible for allocating cothread stack memory, to free +the user from needing to allocate special memory capable of being used +as program stack memory on platforms where this is required.
    +User is always responsible for deleting cothreads with co_delete().
    +Return value of null (0) indicates cothread creation failed. +
    + +void co_delete(cothread_t cothread);

    +Delete specified cothread.
    +Null (0) or invalid cothread handle is not allowed.
    +Passing handle of active cothread to this function is not allowed.
    +Passing handle of primary cothread is not allowed. +
    + +void co_switch(cothread_t cothread);

    +Switch to specified cothread.
    +Null (0) or invalid cothread handle is not allowed.
    +Passing handle of active cothread to this function is not allowed. +
    + + + diff --git a/3pp/libco/fiber.c b/3pp/libco/fiber.c new file mode 100644 index 0000000..f2c5b72 --- /dev/null +++ b/3pp/libco/fiber.c @@ -0,0 +1,51 @@ +/* + libco.win (2008-01-28) + authors: Nach, byuu + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" + +#define WINVER 0x0400 +#define _WIN32_WINNT 0x0400 +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local cothread_t co_active_ = 0; + +static void __stdcall co_thunk(void* coentry) { + ((void (*)(void))coentry)(); +} + +cothread_t co_active() { + if(!co_active_) { + ConvertThreadToFiber(0); + co_active_ = GetCurrentFiber(); + } + return co_active_; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) { + if(!co_active_) { + ConvertThreadToFiber(0); + co_active_ = GetCurrentFiber(); + } + return (cothread_t)CreateFiber(heapsize, co_thunk, (void*)coentry); +} + +void co_delete(cothread_t cothread) { + DeleteFiber(cothread); +} + +void co_switch(cothread_t cothread) { + co_active_ = cothread; + SwitchToFiber(cothread); +} + +#ifdef __cplusplus +} +#endif diff --git a/3pp/libco/libco.c b/3pp/libco/libco.c new file mode 100644 index 0000000..13eb237 --- /dev/null +++ b/3pp/libco/libco.c @@ -0,0 +1,34 @@ +/* + libco + license: public domain +*/ + +#if defined(__clang__) + #pragma clang diagnostic ignored "-Wparentheses" +#endif + +#if defined(__clang__) || defined(__GNUC__) + #if defined(__i386__) + #include "x86.c" + #elif defined(__amd64__) + #include "amd64.c" + #elif defined(__arm__) + #include "arm.c" + #elif defined(_ARCH_PPC) + #include "ppc.c" + #elif defined(_WIN32) + #include "fiber.c" + #else + #include "sjlj.c" + #endif +#elif defined(_MSC_VER) + #if defined(_M_IX86) + #include "x86.c" + #elif defined(_M_AMD64) + #include "amd64.c" + #else + #include "fiber.c" + #endif +#else + #error "libco: unsupported processor, compiler or operating system" +#endif diff --git a/3pp/libco/libco.h b/3pp/libco/libco.h new file mode 100644 index 0000000..792df0b --- /dev/null +++ b/3pp/libco/libco.h @@ -0,0 +1,26 @@ +/* + libco v18 (2016-09-14) + author: byuu + license: public domain +*/ + +#ifndef LIBCO_H +#define LIBCO_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* cothread_t; + +cothread_t co_active(); +cothread_t co_create(unsigned int, void (*)(void)); +void co_delete(cothread_t); +void co_switch(cothread_t); + +#ifdef __cplusplus +} +#endif + +/* ifndef LIBCO_H */ +#endif diff --git a/3pp/libco/ppc.c b/3pp/libco/ppc.c new file mode 100644 index 0000000..efec3aa --- /dev/null +++ b/3pp/libco/ppc.c @@ -0,0 +1,367 @@ +/* + libco.ppc (2016-09-14) + author: blargg + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#include "settings.h" + +#include +#include +#include + +#if LIBCO_MPROTECT + #include + #include +#endif + +/* state format (offsets in 32-bit words) + + +0 pointer to swap code + rest of function descriptor for entry function + +8 PC ++10 SP + special registers + GPRs + FPRs + VRs + stack +*/ + +enum { state_size = 1024 }; +enum { above_stack = 2048 }; +enum { stack_align = 256 }; + +static thread_local cothread_t co_active_handle = 0; + +/* determine environment */ + +#define LIBCO_PPC64 (_ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__) + +/* whether function calls are indirect through a descriptor, or are directly to function */ +#ifndef LIBCO_PPCDESC + #if !_CALL_SYSV && (_CALL_AIX || _CALL_AIXDESC || LIBCO_PPC64) + #define LIBCO_PPCDESC 1 + #endif +#endif + +#ifdef LIBCO_MPROTECT + alignas(4096) +#else + section(text) +#endif +static const uint32_t libco_ppc_code[1024] = { + #if LIBCO_PPC64 + 0x7d000026, /* mfcr r8 */ + 0xf8240028, /* std r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0xf9c40048, /* std r14,72(r4) */ + 0xf9e40050, /* std r15,80(r4) */ + 0xfa040058, /* std r16,88(r4) */ + 0xfa240060, /* std r17,96(r4) */ + 0xfa440068, /* std r18,104(r4) */ + 0xfa640070, /* std r19,112(r4) */ + 0xfa840078, /* std r20,120(r4) */ + 0xfaa40080, /* std r21,128(r4) */ + 0xfac40088, /* std r22,136(r4) */ + 0xfae40090, /* std r23,144(r4) */ + 0xfb040098, /* std r24,152(r4) */ + 0xfb2400a0, /* std r25,160(r4) */ + 0xfb4400a8, /* std r26,168(r4) */ + 0xfb6400b0, /* std r27,176(r4) */ + 0xfb8400b8, /* std r28,184(r4) */ + 0xfba400c0, /* std r29,192(r4) */ + 0xfbc400c8, /* std r30,200(r4) */ + 0xfbe400d0, /* std r31,208(r4) */ + 0xf9240020, /* std r9,32(r4) */ + 0xe8e30020, /* ld r7,32(r3) */ + 0xe8230028, /* ld r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030, /*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0xe9c30048, /* ld r14,72(r3) */ + 0xe9e30050, /* ld r15,80(r3) */ + 0xea030058, /* ld r16,88(r3) */ + 0xea230060, /* ld r17,96(r3) */ + 0xea430068, /* ld r18,104(r3) */ + 0xea630070, /* ld r19,112(r3) */ + 0xea830078, /* ld r20,120(r3) */ + 0xeaa30080, /* ld r21,128(r3) */ + 0xeac30088, /* ld r22,136(r3) */ + 0xeae30090, /* ld r23,144(r3) */ + 0xeb030098, /* ld r24,152(r3) */ + 0xeb2300a0, /* ld r25,160(r3) */ + 0xeb4300a8, /* ld r26,168(r3) */ + 0xeb6300b0, /* ld r27,176(r3) */ + 0xeb8300b8, /* ld r28,184(r3) */ + 0xeba300c0, /* ld r29,192(r3) */ + 0xebc300c8, /* ld r30,200(r3) */ + 0xebe300d0, /* ld r31,208(r3) */ + 0x7ccff120, /* mtcr r6 */ + #else + 0x7d000026, /* mfcr r8 */ + 0x90240028, /* stw r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0x91a4003c, /* stw r13,60(r4) */ + 0x91c40040, /* stw r14,64(r4) */ + 0x91e40044, /* stw r15,68(r4) */ + 0x92040048, /* stw r16,72(r4) */ + 0x9224004c, /* stw r17,76(r4) */ + 0x92440050, /* stw r18,80(r4) */ + 0x92640054, /* stw r19,84(r4) */ + 0x92840058, /* stw r20,88(r4) */ + 0x92a4005c, /* stw r21,92(r4) */ + 0x92c40060, /* stw r22,96(r4) */ + 0x92e40064, /* stw r23,100(r4) */ + 0x93040068, /* stw r24,104(r4) */ + 0x9324006c, /* stw r25,108(r4) */ + 0x93440070, /* stw r26,112(r4) */ + 0x93640074, /* stw r27,116(r4) */ + 0x93840078, /* stw r28,120(r4) */ + 0x93a4007c, /* stw r29,124(r4) */ + 0x93c40080, /* stw r30,128(r4) */ + 0x93e40084, /* stw r31,132(r4) */ + 0x91240020, /* stw r9,32(r4) */ + 0x80e30020, /* lwz r7,32(r3) */ + 0x80230028, /* lwz r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030, /*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0x81a3003c, /* lwz r13,60(r3) */ + 0x81c30040, /* lwz r14,64(r3) */ + 0x81e30044, /* lwz r15,68(r3) */ + 0x82030048, /* lwz r16,72(r3) */ + 0x8223004c, /* lwz r17,76(r3) */ + 0x82430050, /* lwz r18,80(r3) */ + 0x82630054, /* lwz r19,84(r3) */ + 0x82830058, /* lwz r20,88(r3) */ + 0x82a3005c, /* lwz r21,92(r3) */ + 0x82c30060, /* lwz r22,96(r3) */ + 0x82e30064, /* lwz r23,100(r3) */ + 0x83030068, /* lwz r24,104(r3) */ + 0x8323006c, /* lwz r25,108(r3) */ + 0x83430070, /* lwz r26,112(r3) */ + 0x83630074, /* lwz r27,116(r3) */ + 0x83830078, /* lwz r28,120(r3) */ + 0x83a3007c, /* lwz r29,124(r3) */ + 0x83c30080, /* lwz r30,128(r3) */ + 0x83e30084, /* lwz r31,132(r3) */ + 0x7ccff120, /* mtcr r6 */ + #endif + + #ifndef LIBCO_PPC_NOFP + 0xd9c400e0, /* stfd f14,224(r4) */ + 0xd9e400e8, /* stfd f15,232(r4) */ + 0xda0400f0, /* stfd f16,240(r4) */ + 0xda2400f8, /* stfd f17,248(r4) */ + 0xda440100, /* stfd f18,256(r4) */ + 0xda640108, /* stfd f19,264(r4) */ + 0xda840110, /* stfd f20,272(r4) */ + 0xdaa40118, /* stfd f21,280(r4) */ + 0xdac40120, /* stfd f22,288(r4) */ + 0xdae40128, /* stfd f23,296(r4) */ + 0xdb040130, /* stfd f24,304(r4) */ + 0xdb240138, /* stfd f25,312(r4) */ + 0xdb440140, /* stfd f26,320(r4) */ + 0xdb640148, /* stfd f27,328(r4) */ + 0xdb840150, /* stfd f28,336(r4) */ + 0xdba40158, /* stfd f29,344(r4) */ + 0xdbc40160, /* stfd f30,352(r4) */ + 0xdbe40168, /* stfd f31,360(r4) */ + 0xc9c300e0, /* lfd f14,224(r3) */ + 0xc9e300e8, /* lfd f15,232(r3) */ + 0xca0300f0, /* lfd f16,240(r3) */ + 0xca2300f8, /* lfd f17,248(r3) */ + 0xca430100, /* lfd f18,256(r3) */ + 0xca630108, /* lfd f19,264(r3) */ + 0xca830110, /* lfd f20,272(r3) */ + 0xcaa30118, /* lfd f21,280(r3) */ + 0xcac30120, /* lfd f22,288(r3) */ + 0xcae30128, /* lfd f23,296(r3) */ + 0xcb030130, /* lfd f24,304(r3) */ + 0xcb230138, /* lfd f25,312(r3) */ + 0xcb430140, /* lfd f26,320(r3) */ + 0xcb630148, /* lfd f27,328(r3) */ + 0xcb830150, /* lfd f28,336(r3) */ + 0xcba30158, /* lfd f29,344(r3) */ + 0xcbc30160, /* lfd f30,352(r3) */ + 0xcbe30168, /* lfd f31,360(r3) */ + #endif + + #ifdef __ALTIVEC__ + 0x7ca042a6, /* mfvrsave r5 */ + 0x39040180, /* addi r8,r4,384 */ + 0x39240190, /* addi r9,r4,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x90a40034, /* stw r5,52(r4) */ + 0x4182005c, /* beq- 2 */ + 0x7e8041ce, /* stvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea049ce, /* stvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec041ce, /* stvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee049ce, /* stvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0041ce, /* stvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2049ce, /* stvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4041ce, /* stvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6049ce, /* stvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8041ce, /* stvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa049ce, /* stvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc041ce, /* stvx v30,r0,r8 */ + 0x7fe049ce, /* stvx v31,r0,r9 */ + 0x80a30034, /*2:lwz r5,52(r3) */ + 0x39030180, /* addi r8,r3,384 */ + 0x39230190, /* addi r9,r3,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x7ca043a6, /* mtvrsave r5 */ + 0x4d820420, /* beqctr */ + 0x7e8040ce, /* lvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea048ce, /* lvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec040ce, /* lvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee048ce, /* lvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0040ce, /* lvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2048ce, /* lvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4040ce, /* lvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6048ce, /* lvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8040ce, /* lvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa048ce, /* lvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc040ce, /* lvx v30,r0,r8 */ + 0x7fe048ce, /* lvx v31,r0,r9 */ + #endif + + 0x4e800420, /* bctr */ +}; + +#if LIBCO_PPCDESC + /* function call goes through indirect descriptor */ + #define CO_SWAP_ASM(x, y) ((void (*)(cothread_t, cothread_t))(uintptr_t)x)(x, y) +#else + /* function call goes directly to code */ + #define CO_SWAP_ASM(x, y) ((void (*)(cothread_t, cothread_t))(uintptr_t)libco_ppc_code)(x, y) +#endif + +static uint32_t* co_create_(unsigned size, uintptr_t entry) { + (void)entry; + + uint32_t* t = (uint32_t*)malloc(size); + + #if LIBCO_PPCDESC + if(t) { + memcpy(t, (void*)entry, sizeof(void*) * 3); /* copy entry's descriptor */ + *(const void**)t = libco_ppc_code; /* set function pointer to swap routine */ + } + #endif + + return t; +} + +cothread_t co_create(unsigned int size, void (*entry_)(void)) { + uintptr_t entry = (uintptr_t)entry_; + uint32_t* t = 0; + + /* be sure main thread was successfully allocated */ + if(co_active()) { + size += state_size + above_stack + stack_align; + t = co_create_(size, entry); + } + + if(t) { + uintptr_t sp; + int shift; + + /* save current registers into new thread, so that any special ones will have proper values when thread is begun */ + CO_SWAP_ASM(t, t); + + #if LIBCO_PPCDESC + entry = (uintptr_t)*(void**)entry; /* get real address */ + #endif + + /* put stack near end of block, and align */ + sp = (uintptr_t)t + size - above_stack; + sp -= sp % stack_align; + + /* on PPC32, we save and restore GPRs as 32 bits. for PPC64, we + save and restore them as 64 bits, regardless of the size the ABI + uses. so, we manually write pointers at the proper size. we always + save and restore at the same address, and since PPC is big-endian, + we must put the low byte first on PPC32. */ + + /* if uintptr_t is 32 bits, >>32 is undefined behavior, + so we do two shifts and don't have to care how many bits uintptr_t is. */ + #if LIBCO_PPC64 + shift = 16; + #else + shift = 0; + #endif + + /* set up so entry will be called on next swap */ + t[ 8] = (uint32_t)(entry >> shift >> shift); + t[ 9] = (uint32_t)entry; + + t[10] = (uint32_t)(sp >> shift >> shift); + t[11] = (uint32_t)sp; + } + + return t; +} + +void co_delete(cothread_t t) { + free(t); +} + +static void co_init_(void) { + #if LIBCO_MPROTECT + long page_size = sysconf(_SC_PAGESIZE); + if(page_size > 0) { + uintptr_t align = page_size; + uintptr_t begin = (uintptr_t)libco_ppc_code; + uintptr_t end = begin + sizeof libco_ppc_code; + + /* align beginning and end */ + end += align - 1; + end -= end % align; + begin -= begin % align; + + mprotect((void*)begin, end - begin, PROT_READ | PROT_EXEC); + } + #endif + + co_active_handle = co_create_(state_size, (uintptr_t)&co_switch); +} + +cothread_t co_active() { + if(!co_active_handle) co_init_(); + + return co_active_handle; +} + +void co_switch(cothread_t t) { + cothread_t old = co_active_handle; + co_active_handle = t; + + CO_SWAP_ASM(t, old); +} diff --git a/3pp/libco/settings.h b/3pp/libco/settings.h new file mode 100644 index 0000000..b419683 --- /dev/null +++ b/3pp/libco/settings.h @@ -0,0 +1,36 @@ +#ifdef LIBCO_C + +/*[amd64, arm, ppc, x86]: + by default, co_swap_function is marked as a text (code) section + if not supported, uncomment the below line to use mprotect instead */ +/* #define LIBCO_MPROTECT */ + +/*[amd64]: + Win64 only: provides a substantial speed-up, but will thrash XMM regs + do not use this unless you are certain your application won't use SSE */ +/* #define LIBCO_NO_SSE */ + +#ifdef LIBCO_C + #ifdef LIBCO_MP + #define thread_local __thread + #else + #define thread_local + #endif +#endif + +#if __STDC_VERSION__ >= 201112L + #ifndef _MSC_VER + #include + #endif +#else + #define alignas(bytes) +#endif + +#ifndef _MSC_VER + #define section(name) __attribute__((section("." #name "#"))) +#else + #define section(name) __declspec(allocate("." #name)) +#endif + +/* ifdef LIBCO_C */ +#endif diff --git a/3pp/libco/sjlj.c b/3pp/libco/sjlj.c new file mode 100644 index 0000000..dfa0aa4 --- /dev/null +++ b/3pp/libco/sjlj.c @@ -0,0 +1,102 @@ +/* + libco.sjlj (2008-01-28) + author: Nach + license: public domain +*/ + +/* + note this was designed for UNIX systems. Based on ideas expressed in a paper by Ralf Engelschall. + for SJLJ on other systems, one would want to rewrite springboard() and co_create() and hack the jmb_buf stack pointer. +*/ + +#define LIBCO_C +#include "libco.h" + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + sigjmp_buf context; + void (*coentry)(void); + void* stack; +} cothread_struct; + +static thread_local cothread_struct co_primary; +static thread_local cothread_struct* creating; +static thread_local cothread_struct* co_running = 0; + +static void springboard(int ignored) { + if(sigsetjmp(creating->context, 0)) { + co_running->coentry(); + } +} + +cothread_t co_active() { + if(!co_running) co_running = &co_primary; + return (cothread_t)co_running; +} + +cothread_t co_create(unsigned int size, void (*coentry)(void)) { + if(!co_running) co_running = &co_primary; + + cothread_struct *thread = (cothread_struct*)malloc(sizeof(cothread_struct)); + if(thread) { + struct sigaction handler; + struct sigaction old_handler; + + stack_t stack; + stack_t old_stack; + + thread->coentry = thread->stack = 0; + + stack.ss_flags = 0; + stack.ss_size = size; + thread->stack = stack.ss_sp = malloc(size); + if(stack.ss_sp && !sigaltstack(&stack, &old_stack)) { + handler.sa_handler = springboard; + handler.sa_flags = SA_ONSTACK; + sigemptyset(&handler.sa_mask); + creating = thread; + + if(!sigaction(SIGUSR1, &handler, &old_handler)) { + if(!raise(SIGUSR1)) { + thread->coentry = coentry; + } + sigaltstack(&old_stack, 0); + sigaction(SIGUSR1, &old_handler, 0); + } + } + + if(thread->coentry != coentry) { + co_delete(thread); + thread = 0; + } + } + + return (cothread_t)thread; +} + +void co_delete(cothread_t cothread) { + if(cothread) { + if(((cothread_struct*)cothread)->stack) { + free(((cothread_struct*)cothread)->stack); + } + free(cothread); + } +} + +void co_switch(cothread_t cothread) { + if(!sigsetjmp(co_running->context, 0)) { + co_running = (cothread_struct*)cothread; + siglongjmp(co_running->context, 1); + } +} + +#ifdef __cplusplus +} +#endif diff --git a/3pp/libco/ucontext.c b/3pp/libco/ucontext.c new file mode 100644 index 0000000..72ea871 --- /dev/null +++ b/3pp/libco/ucontext.c @@ -0,0 +1,69 @@ +/* + libco.ucontext (2008-01-28) + author: Nach + license: public domain +*/ + +/* + WARNING: the overhead of POSIX ucontext is very high, + assembly versions of libco or libco_sjlj should be much faster + + this library only exists for two reasons: + 1: as an initial test for the viability of a ucontext implementation + 2: to demonstrate the power and speed of libco over existing implementations, + such as pth (which defaults to wrapping ucontext on unix targets) + + use this library only as a *last resort* +*/ + +#define LIBCO_C +#include "libco.h" + +#define _BSD_SOURCE +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local ucontext_t co_primary; +static thread_local ucontext_t* co_running = 0; + +cothread_t co_active() { + if(!co_running) co_running = &co_primary; + return (cothread_t)co_running; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) { + if(!co_running) co_running = &co_primary; + ucontext_t* thread = (ucontext_t*)malloc(sizeof(ucontext_t)); + if(thread) { + if((!getcontext(thread) && !(thread->uc_stack.ss_sp = 0)) && (thread->uc_stack.ss_sp = malloc(heapsize))) { + thread->uc_link = co_running; + thread->uc_stack.ss_size = heapsize; + makecontext(thread, coentry, 0); + } else { + co_delete((cothread_t)thread); + thread = 0; + } + } + return (cothread_t)thread; +} + +void co_delete(cothread_t cothread) { + if(cothread) { + if(((ucontext_t*)cothread)->uc_stack.ss_sp) { free(((ucontext_t*)cothread)->uc_stack.ss_sp); } + free(cothread); + } +} + +void co_switch(cothread_t cothread) { + ucontext_t* old_thread = co_running; + co_running = (ucontext_t*)cothread; + swapcontext(old_thread, co_running); +} + +#ifdef __cplusplus +} +#endif diff --git a/3pp/libco/x86.c b/3pp/libco/x86.c new file mode 100644 index 0000000..def3ac1 --- /dev/null +++ b/3pp/libco/x86.c @@ -0,0 +1,114 @@ +/* + libco.x86 (2016-09-14) + author: byuu + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#include "settings.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__clang__) || defined(__GNUC__) + #define fastcall __attribute__((fastcall)) +#elif defined(_MSC_VER) + #define fastcall __fastcall +#else + #error "libco: please define fastcall macro" +#endif + +static thread_local long co_active_buffer[64]; +static thread_local cothread_t co_active_handle = 0; +static void (fastcall *co_swap)(cothread_t, cothread_t) = 0; + +#ifdef LIBCO_MPROTECT + alignas(4096) +#else + section(text) +#endif +/* ABI: fastcall */ +static const unsigned char co_swap_function[4096] = { + 0x89, 0x22, /* mov [edx],esp */ + 0x8b, 0x21, /* mov esp,[ecx] */ + 0x58, /* pop eax */ + 0x89, 0x6a, 0x04, /* mov [edx+ 4],ebp */ + 0x89, 0x72, 0x08, /* mov [edx+ 8],esi */ + 0x89, 0x7a, 0x0c, /* mov [edx+12],edi */ + 0x89, 0x5a, 0x10, /* mov [edx+16],ebx */ + 0x8b, 0x69, 0x04, /* mov ebp,[ecx+ 4] */ + 0x8b, 0x71, 0x08, /* mov esi,[ecx+ 8] */ + 0x8b, 0x79, 0x0c, /* mov edi,[ecx+12] */ + 0x8b, 0x59, 0x10, /* mov ebx,[ecx+16] */ + 0xff, 0xe0, /* jmp eax */ +}; + +#ifdef _WIN32 + #include + + static void co_init() { + #ifdef LIBCO_MPROTECT + DWORD old_privileges; + VirtualProtect((void*)co_swap_function, sizeof co_swap_function, PAGE_EXECUTE_READ, &old_privileges); + #endif + } +#else + #include + #include + + static void co_init() { + #ifdef LIBCO_MPROTECT + unsigned long addr = (unsigned long)co_swap_function; + unsigned long base = addr - (addr % sysconf(_SC_PAGESIZE)); + unsigned long size = (addr - base) + sizeof co_swap_function; + mprotect((void*)base, size, PROT_READ | PROT_EXEC); + #endif + } +#endif + +static void crash() { + assert(0); /* called only if cothread_t entrypoint returns */ +} + +cothread_t co_active() { + if(!co_active_handle) co_active_handle = &co_active_buffer; + return co_active_handle; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) { + cothread_t handle; + if(!co_swap) { + co_init(); + co_swap = (void (fastcall*)(cothread_t, cothread_t))co_swap_function; + } + if(!co_active_handle) co_active_handle = &co_active_buffer; + size += 256; /* allocate additional space for storage */ + size &= ~15; /* align stack to 16-byte boundary */ + + if(handle = (cothread_t)malloc(size)) { + long *p = (long*)((char*)handle + size); /* seek to top of stack */ + *--p = (long)crash; /* crash if entrypoint returns */ + *--p = (long)entrypoint; /* start of function */ + *(long*)handle = (long)p; /* stack pointer */ + } + + return handle; +} + +void co_delete(cothread_t handle) { + free(handle); +} + +void co_switch(cothread_t handle) { + register cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif diff --git a/Makefile b/Makefile index fb5c97f..ce193d8 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,8 @@ LD = $(CC) STRIP = $(BASE)-strip INCLUDE = -I./ -INCLUDE = -I./support/minimig +INCLUDE += -I./support/minimig +INCLUDE += -I./3pp/libco PRJ = MiSTer SRC = $(wildcard *.c) @@ -21,11 +22,12 @@ ARCHIE_SRC = $(wildcard ./support/archie/*.cpp) ST_SRC = $(wildcard ./support/st/*.cpp) X86_SRC = $(wildcard ./support/x86/*.cpp) SNES_SRC = $(wildcard ./support/snes/*.cpp) +LIBCO_SRC = 3pp/libco/arm.c VPATH = ./:./support/minimig:./support/sharpmz:./support/archie:./support/st:./support/x86:./support/snes -OBJ = $(SRC:.c=.o) $(SRC2:.cpp=.o) $(MINIMIG_SRC:.cpp=.o) $(SHARPMZ_SRC:.cpp=.o) $(ARCHIE_SRC:.cpp=.o) $(ST_SRC:.cpp=.o) $(X86_SRC:.cpp=.o) $(SNES_SRC:.cpp=.o) -DEP = $(SRC:.c=.d) $(SRC2:.cpp=.d) $(MINIMIG_SRC:.cpp=.d) $(SHARPMZ_SRC:.cpp=.d) $(ARCHIE_SRC:.cpp=.d) $(ST_SRC:.cpp=.d) $(X86_SRC:.cpp=.d) $(SNES_SRC:.cpp=.d) +OBJ = $(SRC:.c=.o) $(SRC2:.cpp=.o) $(MINIMIG_SRC:.cpp=.o) $(SHARPMZ_SRC:.cpp=.o) $(ARCHIE_SRC:.cpp=.o) $(ST_SRC:.cpp=.o) $(X86_SRC:.cpp=.o) $(SNES_SRC:.cpp=.o) $(LIBCO_SRC:.c=.o) +DEP = $(SRC:.c=.d) $(SRC2:.cpp=.d) $(MINIMIG_SRC:.cpp=.d) $(SHARPMZ_SRC:.cpp=.d) $(ARCHIE_SRC:.cpp=.d) $(ST_SRC:.cpp=.d) $(X86_SRC:.cpp=.d) $(SNES_SRC:.cpp=.d) $(LIBCO_SRC:.c=.d) DFLAGS = $(INCLUDE) CFLAGS = $(DFLAGS) -Wall -Wextra -c -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DVDATE=\"`date +"%y%m%d"`\" From 3908a7f5833f09fcd5383b9f15c830d71500f287 Mon Sep 17 00:00:00 2001 From: David Holm Date: Thu, 3 Jan 2019 18:08:54 +0100 Subject: [PATCH 03/18] main, scheduler: Improve latency by coroutine scheduling Schedules tasks in the main loop using coroutines so that long running tasks, particularly relating to the UI, can yield execution in order to call the poll functions at a tighter interval. --- main.cpp | 23 ++----------- menu.h | 2 ++ scheduler.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ scheduler.h | 8 +++++ 4 files changed, 107 insertions(+), 20 deletions(-) create mode 100644 scheduler.cpp create mode 100644 scheduler.h diff --git a/main.cpp b/main.cpp index d0b0ca7..e9107a9 100644 --- a/main.cpp +++ b/main.cpp @@ -30,6 +30,7 @@ along with this program. If not, see . #include "user_io.h" #include "input.h" #include "fpga_io.h" +#include "scheduler.h" const char *version = "$VER:HPS" VDATE; @@ -75,26 +76,8 @@ int main(int argc, char *argv[]) FindStorage(); user_io_init((argc > 1) ? argv[1] : ""); - while(1) - { - if(!is_fpga_ready(1)) - { - printf("FPGA is not ready. JTAG uploading?\n"); - printf("Waiting for FPGA to be ready...\n"); + scheduler_init(); + scheduler_run(); - //enable reset in advance - fpga_core_reset(1); - - while (!is_fpga_ready(0)) - { - sleep(1); - } - reboot(0); - } - - user_io_poll(); - input_poll(0); - HandleUI(); - } return 0; } diff --git a/menu.h b/menu.h index 3705abe..bebf1f0 100644 --- a/menu.h +++ b/menu.h @@ -1,6 +1,8 @@ #ifndef MENU_H #define MENU_H +#include + // UI strings, used by boot messages extern const char *config_memory_chip_msg[]; extern const char *config_memory_slow_msg[]; diff --git a/scheduler.cpp b/scheduler.cpp new file mode 100644 index 0000000..e504126 --- /dev/null +++ b/scheduler.cpp @@ -0,0 +1,94 @@ +#include "scheduler.h" +#include +#include "libco.h" +#include "menu.h" +#include "user_io.h" +#include "input.h" +#include "fpga_io.h" + +static cothread_t co_scheduler = nullptr; +static cothread_t co_poll = nullptr; +static cothread_t co_ui = nullptr; +static cothread_t co_last = nullptr; + +static void scheduler_wait_fpga_ready(void) +{ + while (!is_fpga_ready(1)) + { + printf("FPGA is not ready. JTAG uploading?\n"); + printf("Waiting for FPGA to be ready...\n"); + + //enable reset in advance + fpga_core_reset(1); + + while (!is_fpga_ready(0)) + { + sleep(1); + } + reboot(0); + } +} + +static void scheduler_co_poll(void) +{ + for (;;) + { + scheduler_wait_fpga_ready(); + + user_io_poll(); + input_poll(0); + + scheduler_yield(); + } +} + +static void scheduler_co_ui(void) +{ + for (;;) + { + HandleUI(); + + scheduler_yield(); + } +} + +static void scheduler_schedule(void) +{ + if (co_last == co_poll) + { + co_last = co_ui; + co_switch(co_ui); + } + else + { + co_last = co_poll; + co_switch(co_poll); + } +} + +void scheduler_init(void) +{ + const unsigned int co_stack_size = 262144 * sizeof(void*); + + co_poll = co_create(co_stack_size, scheduler_co_poll); + co_ui = co_create(co_stack_size, scheduler_co_ui); +} + +void scheduler_run(void) +{ + co_scheduler = co_active(); + + for (;;) + { + scheduler_schedule(); + } + + co_delete(co_ui); + co_delete(co_poll); + co_delete(co_scheduler); +} + +void scheduler_yield(void) +{ + co_switch(co_scheduler); +} diff --git a/scheduler.h b/scheduler.h new file mode 100644 index 0000000..15207fb --- /dev/null +++ b/scheduler.h @@ -0,0 +1,8 @@ +#ifndef SCHEDULER_H +#define SCHEDULER_H + +void scheduler_init(void); +void scheduler_run(void); +void scheduler_yield(void); + +#endif From abf99063dc63fd09e4b74f2fe61a7bdb8bc1deae Mon Sep 17 00:00:00 2001 From: David Holm Date: Thu, 3 Jan 2019 18:10:46 +0100 Subject: [PATCH 04/18] file_io: Yield while loading directories Yield at an interval during the loading of directory entries as well as while sorting them in order to not starve the poll functions. The maximum time between calls to `user_io_poll` in the main loop were measured while loading a folder containing 29026 entries: - Original main-loop: 591ms - With coroutines + yields: 29ms The amount of time it takes to load and sort the 29026 entries: - Original main-loop: 591ms - With coroutines + yields: 686ms By increasing the value of `YieldIterations` in `file_io.cpp` the load time will decrease while increasing the delay between calls to `user_io_poll`. --- file_io.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/file_io.cpp b/file_io.cpp index 502d8d7..542cfc9 100644 --- a/file_io.cpp +++ b/file_io.cpp @@ -22,9 +22,12 @@ #include "user_io.h" #include "cfg.h" #include "input.h" +#include "scheduler.h" typedef std::vector DirentVector; +static const size_t YieldIterations = 128; + DirentVector DirItem; int iSelectedEntry = 0; // selected entry index int iFirstEntry = 0; @@ -520,6 +523,11 @@ struct DirentComp { bool operator()(const dirent& de1, const dirent& de2) { + if (++iterations % YieldIterations == 0) + { + scheduler_yield(); + } + if ((de1.d_type == DT_DIR) && !strcmp(de1.d_name, "..")) return true; if ((de2.d_type == DT_DIR) && !strcmp(de2.d_name, "..")) return false; @@ -545,6 +553,8 @@ struct DirentComp return strcasecmp(de1.d_name, de2.d_name) < 0; } + + size_t iterations = 0; }; static int get_stmode(const char *path) @@ -635,8 +645,13 @@ int ScanDirectory(char* path, int mode, const char *extension, int options, cons } struct dirent *de; - while((de = readdir(d))) + for (size_t i = 0; (de = readdir(d)); i++) { + if (0 < i && i % YieldIterations == 0) + { + scheduler_yield(); + } + if (de->d_type == DT_DIR) { if (!strcmp(de->d_name, ".")) continue; From 6f84a4f2d7faf9d2cd30cb96d7756be21723497e Mon Sep 17 00:00:00 2001 From: David Holm Date: Sat, 5 Jan 2019 11:07:34 +0100 Subject: [PATCH 05/18] makefile: Move defines to DFLAGS All defines should be set in `DFLAGS` or dependencies might not be generated correctly. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ce193d8..c4ae010 100644 --- a/Makefile +++ b/Makefile @@ -29,8 +29,8 @@ VPATH = ./:./support/minimig:./support/sharpmz:./support/archie:./support/st:./s OBJ = $(SRC:.c=.o) $(SRC2:.cpp=.o) $(MINIMIG_SRC:.cpp=.o) $(SHARPMZ_SRC:.cpp=.o) $(ARCHIE_SRC:.cpp=.o) $(ST_SRC:.cpp=.o) $(X86_SRC:.cpp=.o) $(SNES_SRC:.cpp=.o) $(LIBCO_SRC:.c=.o) DEP = $(SRC:.c=.d) $(SRC2:.cpp=.d) $(MINIMIG_SRC:.cpp=.d) $(SHARPMZ_SRC:.cpp=.d) $(ARCHIE_SRC:.cpp=.d) $(ST_SRC:.cpp=.d) $(X86_SRC:.cpp=.d) $(SNES_SRC:.cpp=.d) $(LIBCO_SRC:.c=.d) -DFLAGS = $(INCLUDE) -CFLAGS = $(DFLAGS) -Wall -Wextra -c -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DVDATE=\"`date +"%y%m%d"`\" +DFLAGS = $(INCLUDE) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DVDATE=\"`date +"%y%m%d"`\" +CFLAGS = $(DFLAGS) -Wall -Wextra -c -O3 LFLAGS = -lc -lstdc++ -lrt $(PRJ): $(OBJ) From 65a07e2c122ef8ccbe83b7859204e2c67dd19fff Mon Sep 17 00:00:00 2001 From: David Holm Date: Thu, 27 Dec 2018 21:26:00 +0100 Subject: [PATCH 06/18] makefile: Support verbose build Show build commands as they are being executed if `V=1` is specified when running `make`. --- Makefile | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index c4ae010..4c8ebda 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,3 @@ - # makefile to fail if any command in pipe is failed. SHELL = /bin/bash -o pipefail @@ -9,6 +8,12 @@ CC = $(BASE)-gcc LD = $(CC) STRIP = $(BASE)-strip +ifeq ($(V),1) + Q := +else + Q := @ +endif + INCLUDE = -I./ INCLUDE += -I./support/minimig INCLUDE += -I./3pp/libco @@ -34,35 +39,35 @@ CFLAGS = $(DFLAGS) -Wall -Wextra -c -O3 LFLAGS = -lc -lstdc++ -lrt $(PRJ): $(OBJ) - @$(info $@) - @$(LD) -o $@ $+ $(LFLAGS) - @cp $@ $@.elf - @$(STRIP) $@ + $(Q)$(info $@) + $(Q)$(LD) -o $@ $+ $(LFLAGS) + $(Q)cp $@ $@.elf + $(Q)$(STRIP) $@ clean: - rm -f *.d *.o *.elf *.map *.lst *.bak *.rej *.org *.user *~ $(PRJ) - rm -rf obj .vs DTAR* x64 + $(Q)rm -f *.d *.o *.elf *.map *.lst *.bak *.rej *.org *.user *~ $(PRJ) + $(Q)rm -rf obj .vs DTAR* x64 cleanall: - rm -rf *.d *.o *.elf *.map *.lst *.bak *.rej *.org *.user *~ $(PRJ) - rm -rf obj .vs DTAR* x64 - find . -name '*.o' -delete - find . -name '*.d' -delete + $(Q)rm -rf $(OBJ) $(DEP) *.elf *.map *.lst *.bak *.rej *.org *.user *~ $(PRJ) + $(Q)rm -rf obj .vs DTAR* x64 + $(Q)find . -name '*.o' -delete + $(Q)find . -name '*.d' -delete %.o: %.c - @$(info $<) - @$(CC) $(CFLAGS) -std=gnu99 -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' + $(Q)$(info $<) + $(Q)$(CC) $(CFLAGS) -std=gnu99 -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' %.o: %.cpp - @$(info $<) - @$(CC) $(CFLAGS) -std=gnu++14 -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' + $(Q)$(info $<) + $(Q)$(CC) $(CFLAGS) -std=gnu++14 -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' -include $(DEP) %.d: %.c - @$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' + $(Q)$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' %.d: %.cpp - @$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' + $(Q)$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' # Ensure correct time stamp main.o: $(filter-out main.o, $(OBJ)) From 7abfbd07dd79c5bfada6bce46a10dce1ef7d0823 Mon Sep 17 00:00:00 2001 From: David Holm Date: Sat, 5 Jan 2019 11:20:14 +0100 Subject: [PATCH 07/18] makefile: Make obj and dep rules unique per language The make rules for objects and dependency files must be unique per language or make won't understand when to rebuild them. Before this change, if a cpp-file was changed, make would match it to the rule for C files because it comes first in the `Makefile` and not rebuild anything. --- Makefile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 4c8ebda..4d17d69 100644 --- a/Makefile +++ b/Makefile @@ -31,8 +31,8 @@ LIBCO_SRC = 3pp/libco/arm.c VPATH = ./:./support/minimig:./support/sharpmz:./support/archie:./support/st:./support/x86:./support/snes -OBJ = $(SRC:.c=.o) $(SRC2:.cpp=.o) $(MINIMIG_SRC:.cpp=.o) $(SHARPMZ_SRC:.cpp=.o) $(ARCHIE_SRC:.cpp=.o) $(ST_SRC:.cpp=.o) $(X86_SRC:.cpp=.o) $(SNES_SRC:.cpp=.o) $(LIBCO_SRC:.c=.o) -DEP = $(SRC:.c=.d) $(SRC2:.cpp=.d) $(MINIMIG_SRC:.cpp=.d) $(SHARPMZ_SRC:.cpp=.d) $(ARCHIE_SRC:.cpp=.d) $(ST_SRC:.cpp=.d) $(X86_SRC:.cpp=.d) $(SNES_SRC:.cpp=.d) $(LIBCO_SRC:.c=.d) +OBJ = $(SRC:.c=.c.o) $(SRC2:.cpp=.cpp.o) $(MINIMIG_SRC:.cpp=.cpp.o) $(SHARPMZ_SRC:.cpp=.cpp.o) $(ARCHIE_SRC:.cpp=.cpp.o) $(ST_SRC:.cpp=.cpp.o) $(X86_SRC:.cpp=.cpp.o) $(SNES_SRC:.cpp=.cpp.o) $(LIBCO_SRC:.c=.c.o) +DEP = $(SRC:.c=.cpp.d) $(SRC2:.cpp=.cpp.d) $(MINIMIG_SRC:.cpp=.cpp.d) $(SHARPMZ_SRC:.cpp=.cpp.d) $(ARCHIE_SRC:.cpp=.cpp.d) $(ST_SRC:.cpp=.cpp.d) $(X86_SRC:.cpp=.cpp.d) $(SNES_SRC:.cpp=.cpp.d) $(LIBCO_SRC:.c=.c.d) DFLAGS = $(INCLUDE) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DVDATE=\"`date +"%y%m%d"`\" CFLAGS = $(DFLAGS) -Wall -Wextra -c -O3 @@ -54,20 +54,20 @@ cleanall: $(Q)find . -name '*.o' -delete $(Q)find . -name '*.d' -delete -%.o: %.c +%.c.o: %.c $(Q)$(info $<) $(Q)$(CC) $(CFLAGS) -std=gnu99 -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' -%.o: %.cpp +%.cpp.o: %.cpp $(Q)$(info $<) $(Q)$(CC) $(CFLAGS) -std=gnu++14 -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' -include $(DEP) -%.d: %.c - $(Q)$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' +%.c.d: %.c + $(Q)$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.c.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' -%.d: %.cpp - $(Q)$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' +%.cpp.d: %.cpp + $(Q)$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.cpp.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g' # Ensure correct time stamp -main.o: $(filter-out main.o, $(OBJ)) +main.cpp.o: $(filter-out main.cpp.o, $(OBJ)) From 62de1cabc73896128b8238dc39433a5d43c17f92 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sat, 5 Jan 2019 18:54:17 +0800 Subject: [PATCH 08/18] input: add tweaks for Logitech F710. --- input.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/input.cpp b/input.cpp index 0ec2fbf..56f3e01 100644 --- a/input.cpp +++ b/input.cpp @@ -2161,6 +2161,7 @@ int input_test(int getchar) uint16_t extra_axis = 2; if (input[i].vid == 0x0079 && input[i].pid == 0x0006) extra_axis = 0; // AliExpress USB encoder PCB floods axis 2 if (input[i].vid == 0x045e && input[i].pid == 0x028e) extra_axis = 3; // 8BitDo Retro Receiver + if (input[i].vid == 0x046d && input[i].pid == 0xc21f) extra_axis = 3; // Logitech F710 if(ev.code == base_axis || ev.code == extra_axis || ev.code == 16) // x { @@ -2182,6 +2183,7 @@ int input_test(int getchar) extra_axis = 5; if (input[i].vid == 0x045e && input[i].pid == 0x028e) extra_axis = 4; // 8BitDo Retro Receiver + if (input[i].vid == 0x046d && input[i].pid == 0xc21f) extra_axis = 4; // Logitech F710 if (ev.code == base_axis || ev.code == extra_axis || ev.code == 17) // y { @@ -2201,7 +2203,8 @@ int input_test(int getchar) } } - if (input[i].vid == 0x045e && input[i].pid == 0x028e) // 8BitDo Retro Receiver + if ((input[i].vid == 0x045e && input[i].pid == 0x028e) || // 8BitDo Retro Receiver + (input[i].vid == 0x046d && input[i].pid == 0xc21f)) // Logitech F710 { ev.type = EV_KEY; if (ev.code == 2) From 7b123e08039165d1cb8c857c50041820c62cdc98 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sat, 5 Jan 2019 19:12:45 +0800 Subject: [PATCH 09/18] lib folder for 3rd-party libraries. --- Makefile | 4 ++-- MiSTer.vcxproj | 4 ++++ MiSTer.vcxproj.filters | 18 ++++++++++++++++++ {3pp => lib}/libco/amd64.c | 0 {3pp => lib}/libco/arm.c | 0 {3pp => lib}/libco/doc/style.css | 0 {3pp => lib}/libco/doc/targets.html | 0 {3pp => lib}/libco/doc/usage.html | 0 {3pp => lib}/libco/fiber.c | 0 {3pp => lib}/libco/libco.c | 0 {3pp => lib}/libco/libco.h | 0 {3pp => lib}/libco/ppc.c | 0 {3pp => lib}/libco/settings.h | 0 {3pp => lib}/libco/sjlj.c | 0 {3pp => lib}/libco/ucontext.c | 0 {3pp => lib}/libco/x86.c | 0 16 files changed, 24 insertions(+), 2 deletions(-) rename {3pp => lib}/libco/amd64.c (100%) rename {3pp => lib}/libco/arm.c (100%) rename {3pp => lib}/libco/doc/style.css (100%) rename {3pp => lib}/libco/doc/targets.html (100%) rename {3pp => lib}/libco/doc/usage.html (100%) rename {3pp => lib}/libco/fiber.c (100%) rename {3pp => lib}/libco/libco.c (100%) rename {3pp => lib}/libco/libco.h (100%) rename {3pp => lib}/libco/ppc.c (100%) rename {3pp => lib}/libco/settings.h (100%) rename {3pp => lib}/libco/sjlj.c (100%) rename {3pp => lib}/libco/ucontext.c (100%) rename {3pp => lib}/libco/x86.c (100%) diff --git a/Makefile b/Makefile index 4d17d69..bab56c8 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ endif INCLUDE = -I./ INCLUDE += -I./support/minimig -INCLUDE += -I./3pp/libco +INCLUDE += -I./lib/libco PRJ = MiSTer SRC = $(wildcard *.c) @@ -27,7 +27,7 @@ ARCHIE_SRC = $(wildcard ./support/archie/*.cpp) ST_SRC = $(wildcard ./support/st/*.cpp) X86_SRC = $(wildcard ./support/x86/*.cpp) SNES_SRC = $(wildcard ./support/snes/*.cpp) -LIBCO_SRC = 3pp/libco/arm.c +LIBCO_SRC = lib/libco/arm.c VPATH = ./:./support/minimig:./support/sharpmz:./support/archie:./support/st:./support/x86:./support/snes diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index 941417f..3d24be6 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -53,6 +53,8 @@ + + @@ -88,6 +90,8 @@ + + diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters index 3b13493..adfc3ec 100644 --- a/MiSTer.vcxproj.filters +++ b/MiSTer.vcxproj.filters @@ -9,6 +9,12 @@ {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd + + {0c4bf53d-7986-4434-bbd2-734da3553be9} + + + {da657dc9-d7b4-417e-b916-6543cf17b67e} + @@ -94,6 +100,12 @@ Source Files + + Source Files\lib + + + Source Files\lib + @@ -201,5 +213,11 @@ Header Files + + Header Files\lib + + + Header Files\lib + \ No newline at end of file diff --git a/3pp/libco/amd64.c b/lib/libco/amd64.c similarity index 100% rename from 3pp/libco/amd64.c rename to lib/libco/amd64.c diff --git a/3pp/libco/arm.c b/lib/libco/arm.c similarity index 100% rename from 3pp/libco/arm.c rename to lib/libco/arm.c diff --git a/3pp/libco/doc/style.css b/lib/libco/doc/style.css similarity index 100% rename from 3pp/libco/doc/style.css rename to lib/libco/doc/style.css diff --git a/3pp/libco/doc/targets.html b/lib/libco/doc/targets.html similarity index 100% rename from 3pp/libco/doc/targets.html rename to lib/libco/doc/targets.html diff --git a/3pp/libco/doc/usage.html b/lib/libco/doc/usage.html similarity index 100% rename from 3pp/libco/doc/usage.html rename to lib/libco/doc/usage.html diff --git a/3pp/libco/fiber.c b/lib/libco/fiber.c similarity index 100% rename from 3pp/libco/fiber.c rename to lib/libco/fiber.c diff --git a/3pp/libco/libco.c b/lib/libco/libco.c similarity index 100% rename from 3pp/libco/libco.c rename to lib/libco/libco.c diff --git a/3pp/libco/libco.h b/lib/libco/libco.h similarity index 100% rename from 3pp/libco/libco.h rename to lib/libco/libco.h diff --git a/3pp/libco/ppc.c b/lib/libco/ppc.c similarity index 100% rename from 3pp/libco/ppc.c rename to lib/libco/ppc.c diff --git a/3pp/libco/settings.h b/lib/libco/settings.h similarity index 100% rename from 3pp/libco/settings.h rename to lib/libco/settings.h diff --git a/3pp/libco/sjlj.c b/lib/libco/sjlj.c similarity index 100% rename from 3pp/libco/sjlj.c rename to lib/libco/sjlj.c diff --git a/3pp/libco/ucontext.c b/lib/libco/ucontext.c similarity index 100% rename from 3pp/libco/ucontext.c rename to lib/libco/ucontext.c diff --git a/3pp/libco/x86.c b/lib/libco/x86.c similarity index 100% rename from 3pp/libco/x86.c rename to lib/libco/x86.c From 13ca537cbf771bdbc87fb7ee1cb8229892963291 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sat, 5 Jan 2019 19:15:14 +0800 Subject: [PATCH 10/18] minimig_boot: fix the warnings. --- support/minimig/minimig_boot.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/support/minimig/minimig_boot.cpp b/support/minimig/minimig_boot.cpp index 5b7f3fb..4ef3d01 100644 --- a/support/minimig/minimig_boot.cpp +++ b/support/minimig/minimig_boot.cpp @@ -169,7 +169,7 @@ static void BootClearScreen(int adr, int size) static void BootUploadLogo() { - fileTYPE file = { 0 }; + fileTYPE file = {}; int x, y; int i = 0; int adr; @@ -228,7 +228,7 @@ static void BootUploadLogo() static void BootUploadBall() { - fileTYPE file = { 0 }; + fileTYPE file = {}; int x; int i = 0; int adr; @@ -258,7 +258,7 @@ static void BootUploadBall() static void BootUploadCopper() { - fileTYPE file = { 0 }; + fileTYPE file = {}; int x; int i = 0; int adr; From 1620069edf8778c060703d4a1a8e8aed6f91a687 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sat, 5 Jan 2019 20:43:39 +0800 Subject: [PATCH 11/18] VS project update. --- MiSTer.vcxproj | 10 ++++++++-- MiSTer.vcxproj.filters | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index 3d24be6..9cff2b6 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -29,12 +29,16 @@ git.lnk ./build.sh MiSTer git.lnk ./clean.sh - WIN32;VDATE="000000";_FILE_OFFSET_BITS=64;_LARGEFILE64_SOURCE;$(NMakePreprocessorDefinitions) - c:\Work\Git\opt\gcc54\arm-linux-gnueabihf\libc\usr\include;$(NMakeIncludeSearchPath) + __USE_GNU ;_GNU_SOURCE;VDATE="000000";_FILE_OFFSET_BITS=64;_LARGEFILE64_SOURCE;$(NMakePreprocessorDefinitions) + c:\Work\Git\opt\gcc54\arm-linux-gnueabihf\libc\usr\include;c:\Work\Git\opt\gcc54\lib\gcc\arm-linux-gnueabihf\5.4.1\include;c:\Work\Git\opt\gcc54\arm-linux-gnueabihf\include\c++\5.4.1;$(NMakeIncludeSearchPath);lib\libco $(TEMP) $(TEMP) + + + + @@ -58,6 +62,7 @@ + @@ -95,6 +100,7 @@ + diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters index adfc3ec..ae40f58 100644 --- a/MiSTer.vcxproj.filters +++ b/MiSTer.vcxproj.filters @@ -106,6 +106,9 @@ Source Files\lib + + Source Files + @@ -219,5 +222,8 @@ Header Files\lib + + Header Files + \ No newline at end of file From 7de4788f9a1ee63605f3c53469b1a2741d787e66 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sat, 5 Jan 2019 23:41:44 +0800 Subject: [PATCH 12/18] One more update in VS project. --- MiSTer.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index 9cff2b6..2543498 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -29,7 +29,7 @@ git.lnk ./build.sh MiSTer git.lnk ./clean.sh - __USE_GNU ;_GNU_SOURCE;VDATE="000000";_FILE_OFFSET_BITS=64;_LARGEFILE64_SOURCE;$(NMakePreprocessorDefinitions) + __GNUC__;__USE_GNU ;_GNU_SOURCE;VDATE="000000";_FILE_OFFSET_BITS=64;_LARGEFILE64_SOURCE;$(NMakePreprocessorDefinitions) c:\Work\Git\opt\gcc54\arm-linux-gnueabihf\libc\usr\include;c:\Work\Git\opt\gcc54\lib\gcc\arm-linux-gnueabihf\5.4.1\include;c:\Work\Git\opt\gcc54\arm-linux-gnueabihf\include\c++\5.4.1;$(NMakeIncludeSearchPath);lib\libco $(TEMP) $(TEMP) From ed36841f78fd8a520fc69b8921fdb529c542016f Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sun, 6 Jan 2019 23:47:10 +0800 Subject: [PATCH 13/18] Fix the warnings. --- MiSTer.vcxproj | 2 +- support/minimig/minimig_config.cpp | 15 +++++++-------- support/minimig/minimig_fdd.cpp | 14 +++++++------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index 2543498..3518958 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -29,7 +29,7 @@ git.lnk ./build.sh MiSTer git.lnk ./clean.sh - __GNUC__;__USE_GNU ;_GNU_SOURCE;VDATE="000000";_FILE_OFFSET_BITS=64;_LARGEFILE64_SOURCE;$(NMakePreprocessorDefinitions) + __arm__;__GNUC__;__USE_GNU ;_GNU_SOURCE;VDATE="000000";_FILE_OFFSET_BITS=64;_LARGEFILE64_SOURCE;$(NMakePreprocessorDefinitions) c:\Work\Git\opt\gcc54\arm-linux-gnueabihf\libc\usr\include;c:\Work\Git\opt\gcc54\lib\gcc\arm-linux-gnueabihf\5.4.1\include;c:\Work\Git\opt\gcc54\arm-linux-gnueabihf\include\c++\5.4.1;$(NMakeIncludeSearchPath);lib\libco $(TEMP) $(TEMP) diff --git a/support/minimig/minimig_config.cpp b/support/minimig/minimig_config.cpp index 344e525..af8c11d 100644 --- a/support/minimig/minimig_config.cpp +++ b/support/minimig/minimig_config.cpp @@ -35,7 +35,7 @@ typedef struct unsigned char autofire; } configTYPE_old; -configTYPE config = { 0 }; +configTYPE config = { }; unsigned char romkey[3072]; static void SendFileV2(fileTYPE* file, unsigned char* key, int keysize, int address, int size) @@ -61,7 +61,7 @@ static void SendFileV2(fileTYPE* file, unsigned char* key, int keysize, int addr for (int j = 0; j<512; j++) { buf[j] ^= key[keyidx++]; - if (keyidx >= keysize) keyidx -= keysize; + if ((int)keyidx >= keysize) keyidx -= keysize; } } EnableOsd(); @@ -86,7 +86,7 @@ static void SendFileV2(fileTYPE* file, unsigned char* key, int keysize, int addr static char UploadKickstart(char *name) { - fileTYPE file = { 0 }; + fileTYPE file = {}; int keysize = 0; BootPrint("Checking for Amiga Forever key file:"); @@ -168,7 +168,7 @@ static char UploadKickstart(char *name) static char UploadActionReplay() { - fileTYPE file = { 0 }; + fileTYPE file = {}; if(FileOpen(&file, "Amiga/HRTMON.ROM") || FileOpen(&file, "HRTMON.ROM")) { int adr, data; @@ -378,7 +378,6 @@ unsigned char LoadConfiguration(int num) static const char config_id[] = "MNMGCFG0"; char updatekickstart = 0; char result = 0; - unsigned char key, i; const char *filename = GetConfigurationName(num); @@ -387,7 +386,7 @@ unsigned char LoadConfiguration(int num) if(filename && (size = FileLoadConfig(filename, 0, 0))>0) { BootPrint("Opened configuration file\n"); - printf("Configuration file size: %s, %lu\n", filename, size); + printf("Configuration file size: %s, %d\n", filename, size); if (size == sizeof(config)) { static configTYPE tmpconf; @@ -439,7 +438,7 @@ unsigned char LoadConfiguration(int num) } else printf("Cannot load configuration file\n"); } - else printf("Wrong configuration file size: %lu (expected: %lu)\n", size, sizeof(config)); + else printf("Wrong configuration file size: %d (expected: %u)\n", size, sizeof(config)); } if (!result) { BootPrint("Can not open configuration file!\n"); @@ -502,7 +501,7 @@ void MinimigReset() void SetKickstart(char *name) { - int len = strlen(name); + uint len = strlen(name); if (len > (sizeof(config.kickstart) - 1)) len = sizeof(config.kickstart) - 1; memcpy(config.kickstart, name, len); config.kickstart[len] = 0; diff --git a/support/minimig/minimig_fdd.cpp b/support/minimig/minimig_fdd.cpp index 22f0f08..fabd0cf 100644 --- a/support/minimig/minimig_fdd.cpp +++ b/support/minimig/minimig_fdd.cpp @@ -35,7 +35,7 @@ along with this program. If not, see . unsigned char drives = 0; // number of active drives reported by FPGA (may change only during reset) adfTYPE *pdfx; // drive select pointer -adfTYPE df[4] = { 0 }; // drive information structure +adfTYPE df[4] = {}; // drive information structure static uint8_t sector_buffer[512]; @@ -71,13 +71,13 @@ void SendSector(unsigned char *pData, unsigned char sector, unsigned char track, // odd bits of header x = 0x55; checksum[0] = x; - y = track >> 1 & 0x55; + y = (track >> 1) & 0x55; checksum[1] = y; spi_w(B2W(x,y)); - x = sector >> 1 & 0x55; + x = (sector >> 1) & 0x55; checksum[2] = x; - y = 11 - sector >> 1 & 0x55; + y = ((11 - sector) >> 1) & 0x55; checksum[3] = y; spi_w(B2W(x, y)); @@ -90,7 +90,7 @@ void SendSector(unsigned char *pData, unsigned char sector, unsigned char track, x = sector & 0x55; checksum[2] ^= x; - y = 11 - sector & 0x55; + y = (11 - sector) & 0x55; checksum[3] ^= y; spi_w(B2W(x, y)); @@ -135,8 +135,8 @@ void SendSector(unsigned char *pData, unsigned char sector, unsigned char track, p = pData; while (i--) { - x = *p++ >> 1 | 0xAA; - y = *p++ >> 1 | 0xAA; + x = (*p++ >> 1) | 0xAA; + y = (*p++ >> 1) | 0xAA; spi_w(B2W(x, y)); } From 5f8fbe52534ced44f6c69efa028d413826bbbae9 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sun, 6 Jan 2019 23:47:46 +0800 Subject: [PATCH 14/18] Open joystick buttons setup menu if not defined. --- input.cpp | 12 +++++++++--- menu.cpp | 16 +++++++++++++--- menu.h | 2 ++ user_io.cpp | 4 ++-- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/input.cpp b/input.cpp index 56f3e01..2bdbe9d 100644 --- a/input.cpp +++ b/input.cpp @@ -1190,8 +1190,8 @@ void finish_map_setting(int dismiss) } else { - if (dismiss) input[mapping_dev].has_map = 0; - else FileSaveConfig(get_map_name(mapping_dev, 0), &input[mapping_dev].map, sizeof(input[mapping_dev].map)); + for (int i = 0; i < NUMDEV; i++) input[i].has_map = 0; + if (!dismiss) FileSaveConfig(get_map_name(mapping_dev, 0), &input[mapping_dev].map, sizeof(input[mapping_dev].map)); if (is_menu_core()) input[mapping_dev].has_mmap = 0; } } @@ -1545,8 +1545,9 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int input[dev].map[13] = 0; input[dev].map[14] = 0; input[dev].map[15] = 0; + input[dev].has_map++; } - input[dev].has_map = 1; + input[dev].has_map++; } if (!input[dev].has_mmap) @@ -1716,6 +1717,11 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int } } } + else if (input[dev].has_map == 2) + { + if (ev->value == 1) joy_digital(0, 0, 0, 3, 17); + return; + } else { for (int i = 0; i <= 15; i++) diff --git a/menu.cpp b/menu.cpp index 9bfd67f..db1d98f 100644 --- a/menu.cpp +++ b/menu.cpp @@ -1567,11 +1567,11 @@ void HandleUI(void) case MENU_JOYDIGMAP: helptext = 0; menumask = 1; - OsdSetTitle("Joystick", 0); + OsdSetTitle("Define buttons", 0); menustate = MENU_JOYDIGMAP1; parentstate = MENU_JOYDIGMAP; for (int i = 0; i < OsdGetSize() - 1; i++) OsdWrite(i, "", 0, 0); - OsdWrite(OsdGetSize() - 1, " Cancel", menusub == 0, 0); + OsdWrite(OsdGetSize() - 1, " ESC \x16 Cancel", menusub == 0, 0); break; case MENU_JOYDIGMAP1: @@ -1603,7 +1603,7 @@ void HandleUI(void) OsdWrite(3, s, 0, 0); if (get_map_button()) { - if (get_map_type()) OsdWrite(OsdGetSize() - 1, " finish (SPACE - skip)", menusub == 0, 0); + if (get_map_type()) OsdWrite(OsdGetSize() - 1, " Enter \x16 Finish, Space \x16 Skip", menusub == 0, 0); else OsdWrite(OsdGetSize() - 1, "", 0, 0); sprintf(s, " %s ID: %04x:%04x", get_map_type() ? "Joystick" : "Keyboard", get_map_vid(), get_map_pid()); @@ -3393,6 +3393,16 @@ void HandleUI(void) } } +void open_joystick_setup() +{ + OsdSetSize(16); + menusub = 0; + OsdClear(); + OsdEnable(DISABLE_KEYBOARD); + start_map_setting(joy_bcount ? joy_bcount + 4 : 8); + menustate = MENU_JOYDIGMAP; +} + void ScrollLongName(void) { // this function is called periodically when file selection window is displayed diff --git a/menu.h b/menu.h index bebf1f0..d271d3e 100644 --- a/menu.h +++ b/menu.h @@ -26,4 +26,6 @@ void substrcpy(char *d, char *s, char idx); extern char joy_bnames[12][32]; extern int joy_bcount; +void open_joystick_setup(); + #endif diff --git a/user_io.cpp b/user_io.cpp index b88b84a..c4bb749 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -2473,8 +2473,8 @@ void user_io_kbd(uint16_t key, int press) else { if (is_menu_core()) printf("PS2 code(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); - - if ((has_menu() || osd_is_visible || (get_key_mod() & (LALT | RALT | RGUI | LGUI))) && (((key == KEY_F12) && ((!is_x86_core() && !is_archie()) || (get_key_mod() & (RGUI | LGUI)))) || key == KEY_MENU)) menu_key_set(KEY_F12); + if (!osd_is_visible && !is_menu_core() && key == KEY_MENU && press == 3) open_joystick_setup(); + else if ((has_menu() || osd_is_visible || (get_key_mod() & (LALT | RALT | RGUI | LGUI))) && (((key == KEY_F12) && ((!is_x86_core() && !is_archie()) || (get_key_mod() & (RGUI | LGUI)))) || key == KEY_MENU)) menu_key_set(KEY_F12); else if (osd_is_visible) { if (press == 1) menu_key_set(key); From aaf0712856ecf5162fa96dbd82078b18b644b2d0 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Tue, 8 Jan 2019 10:07:11 +0800 Subject: [PATCH 15/18] Makefile: fix files deletion, disable strict-aliasing warning. --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index bab56c8..515a154 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ OBJ = $(SRC:.c=.c.o) $(SRC2:.cpp=.cpp.o) $(MINIMIG_SRC:.cpp=.cpp.o) $(SHARPMZ_SR DEP = $(SRC:.c=.cpp.d) $(SRC2:.cpp=.cpp.d) $(MINIMIG_SRC:.cpp=.cpp.d) $(SHARPMZ_SRC:.cpp=.cpp.d) $(ARCHIE_SRC:.cpp=.cpp.d) $(ST_SRC:.cpp=.cpp.d) $(X86_SRC:.cpp=.cpp.d) $(SNES_SRC:.cpp=.cpp.d) $(LIBCO_SRC:.c=.c.d) DFLAGS = $(INCLUDE) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DVDATE=\"`date +"%y%m%d"`\" -CFLAGS = $(DFLAGS) -Wall -Wextra -c -O3 +CFLAGS = $(DFLAGS) -Wall -Wextra -Wno-strict-aliasing -c -O3 LFLAGS = -lc -lstdc++ -lrt $(PRJ): $(OBJ) @@ -45,8 +45,9 @@ $(PRJ): $(OBJ) $(Q)$(STRIP) $@ clean: - $(Q)rm -f *.d *.o *.elf *.map *.lst *.bak *.rej *.org *.user *~ $(PRJ) + $(Q)rm -f *.elf *.map *.lst *.user *~ $(PRJ) $(Q)rm -rf obj .vs DTAR* x64 + $(Q)find . \( -name '*.o' -o -name '*.d' -o -name '*.bak' -o -name '*.rej' -o -name '*.org' \) -exec rm -f {} \; cleanall: $(Q)rm -rf $(OBJ) $(DEP) *.elf *.map *.lst *.bak *.rej *.org *.user *~ $(PRJ) From f344ac931aeca05763312deb4ca2c655c677b530 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Tue, 8 Jan 2019 10:08:02 +0800 Subject: [PATCH 16/18] Fix the warnings. --- support/archie/archie.cpp | 14 ++++---- support/archie/archie.h | 6 ++-- support/minimig/minimig_fdd.cpp | 9 +++-- support/minimig/minimig_hdd.cpp | 21 +++++++----- support/sharpmz/sharpmz.cpp | 33 ++++++++++-------- support/st/st_ikbd.cpp | 11 +++--- support/st/st_ikbd.h | 2 +- support/st/st_tos.cpp | 60 ++++++++++++++++++--------------- support/st/st_tos.h | 12 +++---- support/x86/x86.cpp | 19 ++++++----- 10 files changed, 103 insertions(+), 84 deletions(-) diff --git a/support/archie/archie.cpp b/support/archie/archie.cpp index 1431918..f338e00 100644 --- a/support/archie/archie.cpp +++ b/support/archie/archie.cpp @@ -19,7 +19,7 @@ typedef struct static archie_config_t config; -fileTYPE floppy[MAX_FLOPPY] = { 0 }; +fileTYPE floppy[MAX_FLOPPY] = {}; #define ARCHIE_FILE_TX 0x53 #define ARCHIE_FILE_TX_DAT 0x54 @@ -83,7 +83,7 @@ const char *archie_get_rom_name(void) return p; } -const char *archie_get_floppy_name(char i) +const char *archie_get_floppy_name(int i) { if (!floppy[i].size) return "* no disk *"; @@ -125,7 +125,7 @@ void archie_send_file(unsigned char id, char *name) { archie_debugf("Sending file with id %d", id); - fileTYPE file = { 0 }; + fileTYPE file = {}; if (!FileOpen(&file, name)) return; // prepare transmission of new file @@ -184,7 +184,7 @@ void archie_fdc_set_status(void) DisableFpga(); } -void archie_set_floppy(char i, char *name) +void archie_set_floppy(int i, char *name) { if (!name) { @@ -202,7 +202,7 @@ void archie_set_floppy(char i, char *name) archie_fdc_set_status(); } -char archie_floppy_is_inserted(char i) +char archie_floppy_is_inserted(int i) { return(floppy[i].size != 0); } @@ -264,7 +264,7 @@ static void archie_kbd_reset(void) void archie_init(void) { - char i; + int i; archie_debugf("init"); @@ -301,7 +301,7 @@ void archie_init(void) char fdc_name[] = "Archie/FLOPPY0.ADF"; fdc_name[13] = '0' + i; if (FileOpen(&floppy[i], fdc_name)) - archie_debugf("Inserted floppy %d with %d bytes", i, floppy[i].size); + archie_debugf("Inserted floppy %d with %llu bytes", i, floppy[i].size); else floppy[i].size = 0; } diff --git a/support/archie/archie.h b/support/archie/archie.h index 1f743b3..ddee96e 100644 --- a/support/archie/archie.h +++ b/support/archie/archie.h @@ -8,10 +8,10 @@ void archie_poll(void); void archie_kbd(unsigned short code); void archie_mouse(unsigned char b, int16_t x, int16_t y); const char *archie_get_rom_name(void); -const char *archie_get_floppy_name(char b); +const char *archie_get_floppy_name(int b); void archie_set_rom(char *); -void archie_set_floppy(char i, char *); -char archie_floppy_is_inserted(char i); +void archie_set_floppy(int i, char *); +char archie_floppy_is_inserted(int i); void archie_save_config(void); void archie_set_ar(char i); diff --git a/support/minimig/minimig_fdd.cpp b/support/minimig/minimig_fdd.cpp index fabd0cf..98aa48e 100644 --- a/support/minimig/minimig_fdd.cpp +++ b/support/minimig/minimig_fdd.cpp @@ -166,7 +166,7 @@ void ReadTrack(adfTYPE *drive) unsigned char status; unsigned char track; unsigned short dsksync; - unsigned short dsklen; + //unsigned short dsklen; uint16_t tmp; //unsigned short n; @@ -201,7 +201,7 @@ void ReadTrack(adfTYPE *drive) status = (uint8_t)(tmp>>8); // read request signal track = (uint8_t)tmp; // track number (cylinder & head) dsksync = spi_w(0); // disk sync - dsklen = spi_w(0) & 0x3FFF; // mfm words to transfer + //dsklen = spi_w(0) & 0x3FFF; // mfm words to transfer DisableFpga(); if (track >= drive->tracks) @@ -218,7 +218,7 @@ void ReadTrack(adfTYPE *drive) status = (uint8_t)(tmp >> 8); // read request signal track = (uint8_t)tmp; // track number (cylinder & head) dsksync = spi_w(0); // disk sync - dsklen = spi_w(0) & 0x3FFF; // mfm words to transfer + //dsklen = spi_w(0) & 0x3FFF; // mfm words to transfer if (track >= drive->tracks) track = drive->tracks - 1; @@ -281,7 +281,7 @@ void ReadTrack(adfTYPE *drive) unsigned char FindSync(adfTYPE *drive) // reads data from fifo till it finds sync word or fifo is empty and dma inactive (so no more data is expected) { - unsigned char c1, c2, c3, c4; + unsigned char c1, c2; unsigned short n; uint16_t tmp; @@ -641,7 +641,6 @@ void InsertFloppy(adfTYPE *drive, char* path) return; } - unsigned char i, j; unsigned long tracks; // calculate number of tracks in the ADF image file diff --git a/support/minimig/minimig_hdd.cpp b/support/minimig/minimig_hdd.cpp index 004dfdd..27a1105 100644 --- a/support/minimig/minimig_hdd.cpp +++ b/support/minimig/minimig_hdd.cpp @@ -81,12 +81,12 @@ typedef struct uint16_t sector_count; } hdfTYPE; -static hdfTYPE HDF[4] = { 0 }; +static hdfTYPE HDF[4] = {}; static uint8_t sector_buffer[512]; static void CalcGeometry(hdfTYPE *hdf) { - uint32_t head, cyl, spt; + uint32_t head = 0, cyl = 0, spt = 0; uint32_t sptt[] = { 63, 127, 255, 0 }; uint32_t total = hdf->file.size / 512; for (int i = 0; sptt[i] != 0; i++) @@ -205,7 +205,6 @@ static uint32_t RDBChecksum(uint32_t *p, int set) // if the HDF file doesn't have a RigidDiskBlock, we synthesize one static void FakeRDB(hdfTYPE *hdf) { - int i; // start by clearing the sector buffer memset(sector_buffer, 0, 512); @@ -285,7 +284,8 @@ static void FakeRDB(hdfTYPE *hdf) // builds Identify Device struct static void IdentifyDevice(uint16_t *pBuffer, hdfTYPE *hdf) { - char *p, i, x; + char *p, x; + int i; uint32_t total_sectors = hdf->cylinders * hdf->heads * hdf->sectors; memset(pBuffer, 0, 512); @@ -368,6 +368,7 @@ static void WriteStatus(uint8_t status) static void ATA_Recalibrate(uint8_t* tfr, hdfTYPE *hdf) { // Recalibrate 0x10-0x1F (class 3 command: no data) + (void)hdf; hdd_debugf("IDE%d: Recalibrate", hdf->unit); WriteTaskFile(0, 0, tfr[6] & 0x40 ? 0 : 1, 0, 0, tfr[6] & 0xF0); WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ); @@ -376,6 +377,8 @@ static void ATA_Recalibrate(uint8_t* tfr, hdfTYPE *hdf) static void ATA_Diagnostic(uint8_t* tfr, hdfTYPE *hdf) { // Execute Drive Diagnostic (0x90) + (void)hdf; + (void)tfr; hdd_debugf("IDE: Drive Diagnostic"); WriteTaskFile(1, 0, 0, 0, 0, 0); WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ); @@ -383,7 +386,6 @@ static void ATA_Diagnostic(uint8_t* tfr, hdfTYPE *hdf) static void ATA_IdentifyDevice(uint8_t* tfr, hdfTYPE *hdf) { - int i; // Identify Device (0xec) hdd_debugf("IDE%d: Identify Device", hdf->unit); IdentifyDevice((uint16_t*)sector_buffer, hdf); @@ -401,6 +403,7 @@ static void ATA_IdentifyDevice(uint8_t* tfr, hdfTYPE *hdf) static void ATA_Initialize(uint8_t* tfr, hdfTYPE *hdf) { // Initialize Device Parameters (0x91) + (void)hdf; hdd_debugf("Initialize Device Parameters"); hdd_debugf("IDE%d: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X", hdf->unit, tfr[0], tfr[1], tfr[2], tfr[3], tfr[4], tfr[5], tfr[6], tfr[7]); WriteTaskFile(0, tfr[2], tfr[3], tfr[4], tfr[5], tfr[6]); @@ -535,7 +538,7 @@ static void WriteSector(hdfTYPE *hdf) else { GetRDBGeometry(hdf); - printf("Using new CHS: %u/%u/%u (%lu MB)\n", hdf->cylinders, hdf->heads, hdf->sectors, ((((uint32_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11)); + printf("Using new CHS: %u/%u/%u (%llu MB)\n", hdf->cylinders, hdf->heads, hdf->sectors, ((((uint64_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11)); } } FileWriteSec(&hdf->file, sector_buffer); @@ -660,6 +663,8 @@ static void ATA_WriteMultiple(uint8_t* tfr, hdfTYPE *hdf) void HandleHDD(uint8_t c1, uint8_t c2) { + (void)c2; + if (c1 & CMD_IDECMD) { uint8_t unit = 0; @@ -727,7 +732,7 @@ uint8_t OpenHardfile(uint8_t unit) SetHardfileGeometry(hdf, !strcasecmp(".hdf", config.hardfile[unit].filename + strlen(config.hardfile[unit].filename) - 4)); printf("size: %llu (%llu MB)\n", hdf->file.size, hdf->file.size >> 20); printf("CHS: %u/%u/%u", hdf->cylinders, hdf->heads, hdf->sectors); - printf(" (%lu MB), ", ((((uint32_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11)); + printf(" (%llu MB), ", ((((uint64_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11)); printf("Offset: %d\n", hdf->offset); return 1; } @@ -742,7 +747,7 @@ uint8_t OpenHardfile(uint8_t unit) int checkHDF(const char* name, struct RigidDiskBlock **rdb) { - fileTYPE file = { 0 }; + fileTYPE file = {}; *rdb = NULL; if (FileOpenEx(&file, name, O_RDONLY)) diff --git a/support/sharpmz/sharpmz.cpp b/support/sharpmz/sharpmz.cpp index b735b6a..1568bc5 100644 --- a/support/sharpmz/sharpmz.cpp +++ b/support/sharpmz/sharpmz.cpp @@ -253,7 +253,7 @@ int sharpmz_reload_config(short setStatus) // void sharpmz_init(void) { - char i; + int i; sharpmz_debugf("Sharp MZ Series Initialisation"); @@ -1253,7 +1253,7 @@ void sharpmz_set_fdc_rom_enabled(short machineModel, short on, short setStatus) // short sharpmz_get_custom_rom_enabled(short machineModel, short romType) { - short romEnabled; + short romEnabled = 0; machineModel &= 0x07; romType &= 0x07; @@ -1492,7 +1492,7 @@ void sharpmz_send_file(romData_t &image, char *dirPrefix) unsigned int actualReadSize; unsigned long time = GetTimer(0); unsigned short i; - fileTYPE file = { 0 }; + fileTYPE file = {}; // If a prefix is given (ie. core directory), prepend it before use. // @@ -1528,7 +1528,7 @@ void sharpmz_send_file(romData_t &image, char *dirPrefix) sharpmz_debugf("["); for (i = 0; i < image.loadSize; i += actualReadSize) { - if (!(i & 127)) sharpmz_debugf("*"); + if (!(i & 127)) { sharpmz_debugf("*"); } // Work out size of data block to read. int readSize = (image.loadSize - i >= 512 ? 512 : image.loadSize - i); @@ -1574,7 +1574,7 @@ void sharpmz_send_file(romData_t &image, char *dirPrefix) short sharpmz_read_ram(const char *memDumpFile, short bank) { unsigned int actualWriteSize; - fileTYPE file = { 0 }; + fileTYPE file = {}; // Open the memory image debug file for writing. if (!sharpmz_file_write(&file, memDumpFile)) @@ -1585,7 +1585,7 @@ short sharpmz_read_ram(const char *memDumpFile, short bank) // Depending on the bank, or all banks, loop until request is complete. // - for(unsigned int mb=(bank == SHARPMZ_MEMBANK_ALL ? 0 : bank); mb <= (bank == SHARPMZ_MEMBANK_ALL ? SHARPMZ_MEMBANK_MAXBANKS-1 : bank); mb++) + for(unsigned int mb=(bank == SHARPMZ_MEMBANK_ALL ? 0 : bank); mb <= (uint)(bank == SHARPMZ_MEMBANK_ALL ? SHARPMZ_MEMBANK_MAXBANKS-1 : bank); mb++) { // Skip bank 1, as SYSROM spans two physical banks 0 and 1. if(mb == 1) mb = SHARPMZ_MEMBANK_SYSRAM; @@ -1603,7 +1603,7 @@ short sharpmz_read_ram(const char *memDumpFile, short bank) sharpmz_debugf("["); for (unsigned long j = 0; j < MZBANKSIZE[mb] or actualWriteSize == 0; j += actualWriteSize) { - if (!(j & 127)) sharpmz_debugf("*"); + if (!(j & 127)) { sharpmz_debugf("*"); } spi_read(sector_buffer, 512, 0); @@ -1637,7 +1637,7 @@ short sharpmz_read_tape_header(const char *tapeFile) // Handle for the MZF file to be processed. // - fileTYPE file = { 0 }; + fileTYPE file = {}; // Try and open the tape file, exit if it cannot be opened. // @@ -1668,13 +1668,13 @@ short sharpmz_load_tape_to_ram(const char *tapeFile, unsigned char dstCMT) { unsigned int actualReadSize; unsigned long time = GetTimer(0); - char fileName[17]; + //char fileName[17]; //sharpmz_debugf("Sending tape file:%s to emulator ram", tapeFile); // Handle for the MZF file to be processed. // - fileTYPE file = { 0 }; + fileTYPE file = {}; // Try and open the tape file, exit if it cannot be opened. // @@ -1692,10 +1692,12 @@ short sharpmz_load_tape_to_ram(const char *tapeFile, unsigned char dstCMT) // Some sanity checks. // if(tapeHeader.dataType == 0 || tapeHeader.dataType > 5) return(4); + /* for(int i=0; i < 17; i++) { fileName[i] = tapeHeader.fileName[i] == 0x0d ? 0x00 : tapeHeader.fileName[i]; } + */ // Debug output to indicate the file loaded and information about the tape image. // @@ -1756,7 +1758,7 @@ short sharpmz_load_tape_to_ram(const char *tapeFile, unsigned char dstCMT) sharpmz_debugf("["); for (unsigned short i = 0; i < tapeHeader.fileSize; i += actualReadSize) { - if (!(i & 127)) sharpmz_debugf("*"); + if (!(i & 127)) { sharpmz_debugf("*"); } DISKLED_ON; actualReadSize = sharpmz_file_read(&file, sector_buffer, 512); @@ -1865,7 +1867,7 @@ short sharpmz_save_tape_from_cmt(const char *tapeFile) // Handle for the MZF file to be written. // - fileTYPE file = { 0 }; + fileTYPE file = {}; // Read the header, then data, but limit data size to the 'file size' stored in the header. // @@ -1946,6 +1948,7 @@ short sharpmz_save_tape_from_cmt(const char *tapeFile) void sharpmz_select_file(const char* pFileExt, unsigned char Options, char *fs_pFileExt, char chdir, char *SelectedPath) { sharpmz_debugf("pFileExt = %s\n", pFileExt); + (void)chdir; if (strncasecmp(SHARPMZ_CORE_NAME, SelectedPath, strlen(SHARPMZ_CORE_NAME))) strcpy(SelectedPath, SHARPMZ_CORE_NAME); @@ -1991,17 +1994,19 @@ void sharpmz_ui(int idleState, int idle2State, int system static short scrollPos = 0; static short volumeDir = 0; int menuItem; - int subItem; + uint32_t subItem; short romEnabled; short itemCount; char sBuf[40]; char *fileName; + (void)plus; + (void)minus; // Idle2 state (MENU_NONE2) is our main hook, when the HandleUI state machine reaches this state, if the menu key is pressed, // we takeover control in this method. // - if(*menustate == idle2State && menu) + if(*menustate == (uint32_t)idle2State && menu) { OsdSetSize(16); *menusub = 0; diff --git a/support/st/st_ikbd.cpp b/support/st/st_ikbd.cpp index 2ad1f68..ce81c86 100644 --- a/support/st/st_ikbd.cpp +++ b/support/st/st_ikbd.cpp @@ -375,10 +375,11 @@ void ikbd_reset(void) { // process inout from atari core into ikbd void ikbd_handle_input(unsigned char cmd) { // store byte in buffer - ikbd.buffer.byte[ikbd.buffer.size++] = cmd; + unsigned char *byte = ikbd.buffer.byte; + byte[(int)(ikbd.buffer.size++)] = cmd; // check if there's a known command in the buffer - char c; + int c; for (c = 0; ikbd_command_handler[c].length && (ikbd_command_handler[c].code != ikbd.buffer.command.code); c++); @@ -445,7 +446,7 @@ static void ikbd_update_time() void ikbd_poll(void) { #ifdef IKBD_DEBUG static unsigned long xtimer = 0; - static int last_cnt = 0; + static unsigned int last_cnt = 0; if (CheckTimer(xtimer)) { xtimer = GetTimer(2000); if (ikbd.tx_cnt != last_cnt) { @@ -469,7 +470,7 @@ void ikbd_poll(void) { /* --------- joystick ---------- */ if (ikbd.state & IKBD_STATE_JOYSTICK_EVENT_REPORTING) { - char i; + int i; for (i = 0; i<2; i++) { unsigned char state = ikbd.joy[i].state; @@ -599,7 +600,7 @@ void ikbd_keyboard(unsigned char code) { enqueue(code); } -void ikbd_mouse(unsigned char b, char x, char y) { +void ikbd_mouse(unsigned char b, signed char x, signed char y) { // honour reversal of y axis if (ikbd.state & IKBD_STATE_MOUSE_Y_BOTTOM) diff --git a/support/st/st_ikbd.h b/support/st/st_ikbd.h index dcd0cdf..8c1391d 100644 --- a/support/st/st_ikbd.h +++ b/support/st/st_ikbd.h @@ -5,7 +5,7 @@ void ikbd_init(void); void ikbd_poll(void); void ikbd_reset(void); void ikbd_joystick(unsigned char joy, unsigned char map); -void ikbd_mouse(unsigned char buttons, char x, char y); +void ikbd_mouse(unsigned char buttons, signed char x, signed char y); void ikbd_keyboard(unsigned char code); #endif // IKBD_H diff --git a/support/st/st_tos.cpp b/support/st/st_tos.cpp index c0c5ea4..1d9ba66 100644 --- a/support/st/st_tos.cpp +++ b/support/st/st_tos.cpp @@ -36,10 +36,10 @@ static struct { fileTYPE file; unsigned char sides; unsigned char spt; -} fdd_image[2] = { 0 }; +} fdd_image[2] = {}; // one harddisk -fileTYPE hdd_image[2] = { 0 }; +fileTYPE hdd_image[2] = {}; unsigned long hdd_direct = 0; static unsigned char dma_buffer[512]; @@ -66,7 +66,7 @@ static const char *acsi_cmd_name(int cmd) { return cmdname[cmd]; } -void tos_set_video_adjust(char axis, char value) { +void tos_set_video_adjust(int axis, char value) { config.video_adjust[axis] += value; EnableFpga(); @@ -76,7 +76,7 @@ void tos_set_video_adjust(char axis, char value) { DisableFpga(); } -char tos_get_video_adjust(char axis) { +char tos_get_video_adjust(int axis) { return config.video_adjust[axis]; } @@ -105,6 +105,7 @@ static void mist_set_control(unsigned long ctrl) { DisableFpga(); } +/* static void mist_memory_read(char *data, unsigned long words) { EnableFpga(); spi8(MIST_READ_MEMORY); @@ -117,6 +118,7 @@ static void mist_memory_read(char *data, unsigned long words) { DisableFpga(); } +*/ static void mist_memory_write(unsigned char *data, unsigned long words) { EnableFpga(); @@ -162,6 +164,7 @@ void mist_memory_set(char data, unsigned long words) { // enable direct sd card access on acsi0 void tos_set_direct_hdd(char on) { + (void)on; config.sd_direct = 0; tos_debugf("ACSI: disable direct sd access"); @@ -208,12 +211,12 @@ static void handle_acsi(unsigned char *buffer) { if (length == 0) length = 256; if (user_io_dip_switch1()) { - tos_debugf("ACSI: target %d.%d, \"%s\" (%02x)", target, device, acsi_cmd_name(cmd), cmd); + tos_debugf("ACSI: target %u.%u, \"%s\" (%02x)", target, device, acsi_cmd_name(cmd), cmd); tos_debugf("ACSI: lba %lu (%lx), length %u", lba, lba, length); - tos_debugf("DMA: scnt %u, addr %p", scnt, dma_address); + tos_debugf("DMA: scnt %u, addr %X", scnt, dma_address); if (buffer[20] == 0xa5) { - tos_debugf("DMA: fifo %d/%d %x %s", + tos_debugf("DMA: fifo %u/%u %x %s", (buffer[21] >> 4) & 0x0f, buffer[21] & 0x0f, buffer[22], (buffer[2] & 1) ? "OUT" : "IN"); tos_debugf("DMA stat=%x, mode=%x, fdc_irq=%d, acsi_irq=%d", @@ -308,7 +311,7 @@ static void handle_acsi(unsigned char *buffer) { asc[target] = 0x00; } else { - tos_debugf("ACSI: read (%d+%d) exceeds device limits (%d)", + tos_debugf("ACSI: read (%lu+%u) exceeds device limits (%lu)", lba, length, blocks); dma_ack(0x02); asc[target] = 0x21; @@ -348,7 +351,7 @@ static void handle_acsi(unsigned char *buffer) { asc[target] = 0x00; } else { - tos_debugf("ACSI: write (%d+%d) exceeds device limits (%d)", + tos_debugf("ACSI: write (%lu+%u) exceeds device limits (%lu)", lba, length, blocks); dma_ack(0x02); asc[target] = 0x21; @@ -380,7 +383,7 @@ static void handle_acsi(unsigned char *buffer) { case 0x1a: // mode sense if (device == 0) { - tos_debugf("ACSI: mode sense, blocks = %u", blocks); + tos_debugf("ACSI: mode sense, blocks = %lu", blocks); bzero(dma_buffer, 512); dma_buffer[3] = 8; // size of extent descriptor list dma_buffer[5] = blocks >> 16; @@ -430,7 +433,7 @@ static void handle_fdc(unsigned char *buffer) { unsigned char fdc_cmd = buffer[4]; unsigned char fdc_track = buffer[5]; unsigned char fdc_sector = buffer[6]; - unsigned char fdc_data = buffer[7]; + //unsigned char fdc_data = buffer[7]; unsigned char drv_sel = 3 - ((buffer[8] >> 2) & 3); unsigned char drv_side = 1 - ((buffer[8] >> 1) & 1); @@ -450,7 +453,7 @@ static void handle_fdc(unsigned char *buffer) { offset += fdc_sector - 1; if (user_io_dip_switch1()) { - tos_debugf("FDC %s req %d sec (%c, SD:%d, T:%d, S:%d = %d) -> %p", + tos_debugf("FDC %s req %d sec (%c, SD:%d, T:%d, S:%d = %d) -> %X", (fdc_cmd & 0x10) ? "multi" : "single", scnt, 'A' + drv_sel - 1, drv_side, fdc_track, fdc_sector, offset, dma_address); @@ -534,6 +537,7 @@ static void mist_get_dmastate() { #define PLANES 4 static void tos_write(const char *str); +/* static void tos_color_test() { unsigned short buffer[COLORS][PLANES]; @@ -569,6 +573,7 @@ static void tos_color_test() { // for(;;); #endif } +*/ static void tos_write(const char *str) { static int y = 0; @@ -614,7 +619,7 @@ static void tos_clr() { extern unsigned char charfont[256][8]; static void tos_font_load() { - fileTYPE file = { 0 }; + fileTYPE file = {}; if (FileOpen(&file, "SYSTEM.FNT")) { if (file.size == 4096) { int i; @@ -648,7 +653,7 @@ static void tos_font_load() { void tos_load_cartridge(const char *name) { - fileTYPE file = { 0 }; + fileTYPE file = {}; if (name) strncpy(config.cart_img, name, 11); @@ -658,7 +663,7 @@ void tos_load_cartridge(const char *name) int i; unsigned char buffer[512]; - tos_debugf("%s:\n size = %d", config.cart_img, file.size); + tos_debugf("%s:\n size = %llu", config.cart_img, file.size); int blocks = file.size / 512; tos_debugf(" blocks = %d", blocks); @@ -697,7 +702,7 @@ char tos_cartridge_is_inserted() { void tos_upload(const char *name) { - fileTYPE file = { 0 }; + fileTYPE file = {}; // set video offset in fpga tos_set_video_adjust(0, 0); @@ -727,7 +732,7 @@ void tos_upload(const char *name) unsigned long time; unsigned long tos_base = TOS_BASE_ADDRESS_192k; - tos_debugf("TOS.IMG:\n size = %d", file.size); + tos_debugf("TOS.IMG:\n size = %llu", file.size); if (file.size >= 256 * 1024) tos_base = TOS_BASE_ADDRESS_256k; @@ -737,7 +742,7 @@ void tos_upload(const char *name) int blocks = file.size / 512; tos_debugf(" blocks = %d", blocks); - tos_debugf(" address = $%08x", tos_base); + tos_debugf(" address = $%08lx", tos_base); // clear first 16k mist_memory_set_address(0, 16384 / 512, 0); @@ -828,7 +833,7 @@ void tos_upload(const char *name) #endif time = GetTimer(0) - time; - tos_debugf("TOS.IMG uploaded in %lu ms (%d kB/s / %d kBit/s)", + tos_debugf("TOS.IMG uploaded in %lu ms (%llu kB/s / %llu kBit/s)", time >> 20, file.size / (time >> 20), 8 * file.size / (time >> 20)); } @@ -851,9 +856,9 @@ void tos_upload(const char *name) // try to open both floppies int i; for (i = 0; i<2; i++) { - char msg[] = "Found floppy disk image for drive X: "; + //char msg[] = "Found floppy disk image for drive X: "; char name[] = "DISK_A.ST"; - msg[34] = name[5] = 'A' + i; + //msg[34] = name[5] = 'A' + i; tos_insert_disk(i, name); } @@ -889,6 +894,7 @@ void tos_upload(const char *name) mist_set_control(config.system_ctrl); } +/* static unsigned long get_long(char *buffer, int offset) { unsigned long retval = 0; int i; @@ -898,6 +904,7 @@ static unsigned long get_long(char *buffer, int offset) { return retval; } +*/ void tos_poll() { // 1 == button not pressed, 2 = 1 sec exceeded, else timer running @@ -950,9 +957,8 @@ static void nice_name(char *dest, char *src) { static char buffer[17]; // local buffer to assemble file name (8+3+2) -char *tos_get_disk_name(char index) { +char *tos_get_disk_name(int index) { fileTYPE file; - char *c; if (index <= 1) file = fdd_image[index].file; @@ -983,14 +989,14 @@ char *tos_get_cartridge_name() { return buffer; } -char tos_disk_is_inserted(char index) { +char tos_disk_is_inserted(int index) { if (index <= 1) return (fdd_image[index].file.size != 0); return hdd_image[index - 2].size != 0; } -void tos_select_hdd_image(char i, const char *name) +void tos_select_hdd_image(int i, const char *name) { tos_debugf("Select ACSI%c image %s", '0' + i, name); @@ -1015,7 +1021,7 @@ void tos_select_hdd_image(char i, const char *name) mist_set_control(config.system_ctrl); } -void tos_insert_disk(char i, const char *name) +void tos_insert_disk(int i, const char *name) { if (i > 1) { @@ -1136,7 +1142,7 @@ void tos_config_init(void) int size = FileLoadConfig(CONFIG_FILENAME, 0, 0); if (size>0) { - tos_debugf("Configuration file size: %lu (should be %lu)", size, sizeof(tos_config_t)); + tos_debugf("Configuration file size: %u (should be %u)", size, sizeof(tos_config_t)); if (size == sizeof(tos_config_t)) { FileLoadConfig(CONFIG_FILENAME, &config, size); diff --git a/support/st/st_tos.h b/support/st/st_tos.h index 58b0323..89e4357 100644 --- a/support/st/st_tos.h +++ b/support/st/st_tos.h @@ -85,11 +85,11 @@ unsigned long tos_system_ctrl(void); void tos_upload(const char *); void tos_poll(); void tos_update_sysctrl(unsigned long); -char *tos_get_disk_name(char); -char tos_disk_is_inserted(char index); -void tos_insert_disk(char i, const char *name); +char *tos_get_disk_name(int); +char tos_disk_is_inserted(int index); +void tos_insert_disk(int i, const char *name); void tos_eject_all(); -void tos_select_hdd_image(char i, const char *name); +void tos_select_hdd_image(int i, const char *name); void tos_set_direct_hdd(char on); char tos_get_direct_hdd(); void tos_reset(char cold); @@ -98,8 +98,8 @@ char *tos_get_cartridge_name(); char tos_cartridge_is_inserted(); void tos_load_cartridge(const char *); -void tos_set_video_adjust(char axis, char value); -char tos_get_video_adjust(char axis); +void tos_set_video_adjust(int axis, char value); +char tos_get_video_adjust(int axis); void tos_config_init(void); void tos_config_save(void); diff --git a/support/x86/x86.cpp b/support/x86/x86.cpp index aabb4a3..0221352 100644 --- a/support/x86/x86.cpp +++ b/support/x86/x86.cpp @@ -72,6 +72,7 @@ static uint8_t dma_sdio(int status) return res; } +/* static uint32_t dma_get(uint32_t address) { EnableFpga(); @@ -81,6 +82,7 @@ static uint32_t dma_get(uint32_t address) DisableFpga(); return res; } +*/ static void dma_set(uint32_t address, uint32_t data) { @@ -111,7 +113,7 @@ static void dma_rcvbuf(uint32_t address, uint32_t length, uint32_t *data) static int load_bios(const char* name, uint8_t index) { - fileTYPE f = { 0 }; + fileTYPE f = {}; static uint32_t buf[128]; if (!FileOpen(&f, name)) return 0; @@ -155,10 +157,10 @@ static bool floppy_is_2_88m= false; #define CMOS_FDD_TYPE ((floppy_is_2_88m) ? 0x50 : (floppy_is_1_44m || floppy_is_1_68m) ? 0x40 : (floppy_is_720k) ? 0x30 : (floppy_is_1_2m) ? 0x20 : 0x10) -static fileTYPE fdd_image0 = { 0 }; -static fileTYPE fdd_image1 = { 0 }; -static fileTYPE hdd_image0 = { 0 }; -static fileTYPE hdd_image1 = { 0 }; +static fileTYPE fdd_image0 = {}; +static fileTYPE fdd_image1 = {}; +static fileTYPE hdd_image0 = {}; +static fileTYPE hdd_image1 = {}; static bool boot_from_floppy = 1; #define IMG_TYPE_FDD0 0x0800 @@ -210,8 +212,8 @@ static int img_write(uint32_t type, uint32_t lba, void *buf, uint32_t len) #define IOWR(base, reg, value) dma_set(base+(reg<<2), value) static uint32_t cmos[128]; - -void cmos_set(int addr, uint8_t val) +/* +static void cmos_set(uint addr, uint8_t val) { if (addr >= sizeof(cmos)) return; @@ -229,6 +231,7 @@ void cmos_set(int addr, uint8_t val) IOWR(RTC_BASE, 0x2E, cmos[0x2E]); IOWR(RTC_BASE, 0x2F, cmos[0x2F]); } +*/ static int fdd_set(char* filename) { @@ -661,7 +664,7 @@ struct sd_param_t uint32_t bl_cnt; }; -static struct sd_param_t sd_params = { 0 }; +static struct sd_param_t sd_params = {}; void x86_poll() { From bf1982330900641884680d710fcbd24a170bc765 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Tue, 8 Jan 2019 17:45:07 +0800 Subject: [PATCH 17/18] Support up to 6 gamepads. --- input.cpp | 227 +++++++++++++++++++++++++++++----------------------- user_io.cpp | 35 ++++---- 2 files changed, 141 insertions(+), 121 deletions(-) diff --git a/input.cpp b/input.cpp index 2bdbe9d..7e86fe5 100644 --- a/input.cpp +++ b/input.cpp @@ -17,6 +17,7 @@ #include "errno.h" #define NUMDEV 10 +#define NUMPLAYERS 6 static int ev2amiga[] = { @@ -970,24 +971,24 @@ uint32_t get_key_mod() typedef struct { uint16_t vid, pid; - char led; - char last_x, last_y; // last x & y axis bitmasks for each alternative directional control scheme (DPAD, Analog pad etc.) + uint8_t led; + uint8_t last_x, last_y; // last x & y axis bitmasks for each alternative directional control scheme (DPAD, Analog pad etc.) - char has_map; + uint8_t num; + uint8_t has_map; uint32_t map[32]; - char has_mmap; + uint8_t has_mmap; uint32_t mmap[32]; uint16_t jkmap[1024]; - char has_kbdmap; + uint8_t has_kbdmap; uint8_t kbdmap[256]; int accx, accy; } devInput; static devInput input[NUMDEV] = {}; -static int first_joystick = -1; int mfd = -1; int mwd = -1; @@ -1281,10 +1282,10 @@ static int keyrah_trans(int key, int press) static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int dev); static int kbd_toggle = 0; -static uint16_t joy[2] = { 0 }, joy_prev[2] = { 0 }; -static uint16_t autofire[2] = { 0 }; -static uint16_t autofirecodes[2][16] = { 0 }; -static int af_delay[2] = { 50, 50 }; +static uint16_t joy[NUMPLAYERS] = {}, joy_prev[NUMPLAYERS] = {}; +static uint16_t autofire[NUMPLAYERS] = {}; +static uint16_t autofirecodes[NUMPLAYERS][16] = {}; +static int af_delay[NUMPLAYERS] = {}; static unsigned char mouse_btn = 0; static int mouse_emu = 0; @@ -1295,88 +1296,92 @@ static int mouse_emu_y = 0; static uint32_t mouse_timer = 0; -static void joy_digital(int num, uint16_t mask, uint16_t code, char press, int bnum) +static void joy_digital(int jnum, uint16_t mask, uint16_t code, char press, int bnum) { static char str[128]; - static uint16_t lastcode[2], lastmask[2]; + static uint16_t lastcode[NUMPLAYERS], lastmask[NUMPLAYERS]; + int num = jnum - 1; - if (num < 2) + if (num < NUMPLAYERS) { - if (bnum != 17 && bnum != 16) + if (jnum) { - if (press) - { - lastcode[num] = code; - lastmask[num] = mask; - } - else - { - lastcode[num] = 0; - lastmask[num] = 0; - } - } - else if (!user_io_osd_is_visible()) - { - if (lastcode[num]) + if (bnum != 17 && bnum != 16) { if (press) { - int found = 0; - int zero = -1; - for (int i = 0; i < 16; i++) + lastcode[num] = code; + lastmask[num] = mask; + } + else + { + lastcode[num] = 0; + lastmask[num] = 0; + } + } + else if (!user_io_osd_is_visible()) + { + if (lastcode[num]) + { + if (press) { - if (!autofirecodes[num][i]) zero = i; - if (autofirecodes[num][i] == lastcode[num]) + int found = 0; + int zero = -1; + for (int i = 0; i < 16; i++) { - found = 1; - autofirecodes[num][i] = 0; - break; + if (!autofirecodes[num][i]) zero = i; + if (autofirecodes[num][i] == lastcode[num]) + { + found = 1; + autofirecodes[num][i] = 0; + break; + } + } + + if (!found && zero >= 0) autofirecodes[num][zero] = lastcode[num]; + autofire[num] = !found ? autofire[num] | lastmask[num] : autofire[num] & ~lastmask[num]; + + if (hasAPI1_5()) + { + if (!found) sprintf(str, "Auto fire: %d ms", af_delay[num] * 2); + else sprintf(str, "Auto fire: OFF"); + Info(str); + } + else InfoMessage((!found) ? "\n\n Auto fire\n ON" : + "\n\n Auto fire\n OFF"); + } + return; + } + else if (joy[num] & 0xF) + { + if (press) + { + if (joy[num] & 9) + { + af_delay[num] += 25 << ((joy[num] & 1) ? 1 : 0); + if (af_delay[num] > 500) af_delay[num] = 500; + } + else + { + af_delay[num] -= 25 << ((joy[num] & 2) ? 1 : 0); + if (af_delay[num] < 25) af_delay[num] = 25; + } + + static char str[256]; + + if (hasAPI1_5()) + { + sprintf(str, "Auto fire period: %d ms", af_delay[num] * 2); + Info(str); + } + else + { + sprintf(str, "\n\n Auto fire period\n %dms", af_delay[num] * 2); + InfoMessage(str); } } - - if (!found && zero >= 0) autofirecodes[num][zero] = lastcode[num]; - autofire[num] = !found ? autofire[num] | lastmask[num] : autofire[num] & ~lastmask[num]; - - if (hasAPI1_5()) - { - if (!found) sprintf(str, "Auto fire: %d ms", af_delay[num] * 2); - else sprintf(str, "Auto fire: OFF"); - Info(str); - } - else InfoMessage((!found) ? "\n\n Auto fire\n ON" : - "\n\n Auto fire\n OFF"); + return; } - return; - } - else if(joy[num] &0xF) - { - if (press) - { - if (joy[num] & 9) - { - af_delay[num] += 25 << ((joy[num] & 1) ? 1 : 0); - if (af_delay[num] > 500) af_delay[num] = 500; - } - else - { - af_delay[num] -= 25 << ((joy[num] & 2) ? 1 : 0); - if (af_delay[num] < 25) af_delay[num] = 25; - } - - static char str[256]; - - if (hasAPI1_5()) - { - sprintf(str, "Auto fire period: %d ms", af_delay[num] * 2); - Info(str); - } - else - { - sprintf(str, "\n\n Auto fire period\n %dms", af_delay[num] * 2); - InfoMessage(str); - } - } - return; } } @@ -1447,7 +1452,7 @@ static void joy_digital(int num, uint16_t mask, uint16_t code, char press, int b input_cb(&ev, 0, 0); } - else + else if(jnum) { if (press) joy[num] |= mask; else joy[num] &= ~mask; @@ -1465,10 +1470,11 @@ static void joy_digital(int num, uint16_t mask, uint16_t code, char press, int b static void joy_analog(int num, int axis, int offset) { - static int pos[2][2] = { 0 }; + static int pos[NUMPLAYERS][2] = {}; - if (num < 2) + if (num > 0 && num < NUMPLAYERS+1) { + num--; pos[num][axis] = offset; user_io_analog_joystick(num, (char)(pos[num][0]), (char)(pos[num][1])); } @@ -1652,7 +1658,24 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int //joystick buttons, digital directions if (ev->code >= 256) { - if (first_joystick < 0) first_joystick = dev; + if (!input[dev].num) + { + for (uint8_t num = 1; num < NUMDEV + 1; num++) + { + int found = 0; + for (int i = 0; i < NUMDEV; i++) + { + found = (input[i].num == num); + if (found) break; + } + + if (!found) + { + input[dev].num = num; + break; + } + } + } if (user_io_osd_is_visible()) { @@ -1712,7 +1735,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int { if (ev->code == input[dev].map[i]) { - if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, 0, ev->value, i); + if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, 0, ev->value, i); return; } } @@ -1729,7 +1752,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int if (ev->code == input[dev].map[i]) { if (i <= 3 && origcode == ev->code) origcode = 0; // prevent autofire for original dpad - if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, origcode, ev->value, i); + if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, origcode, ev->value, i); return; } } @@ -1739,7 +1762,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int if (ev->code == input[dev].mmap[i]) { if (origcode == ev->code) origcode = 0; // prevent autofire for original dpad - if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << (i - 8), origcode, ev->value, i - 8); + if (ev->value <= 1) joy_digital(input[dev].num, 1 << (i - 8), origcode, ev->value, i - 8); return; } } @@ -1747,7 +1770,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int if (ev->code == input[dev].mmap[17]) { - if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 0, 0, ev->value, 17); + if (ev->value <= 1) joy_digital(input[dev].num, 0, 0, ev->value, 17); return; } @@ -1811,7 +1834,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int if (ev->code == input[dev].map[i]) { if (i <= 3 && origcode == ev->code) origcode = 0; // prevent autofire for original dpad - if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 1 << i, origcode, ev->value, i); + if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 1 : 2, 1 << i, origcode, ev->value, i); return; } } @@ -1819,7 +1842,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int if (ev->code == input[dev].mmap[16]) { - if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 0, 0, ev->value, 16); + if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 1 : 2, 0, 0, ev->value, 16); return; } } @@ -1920,7 +1943,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int else { // skip if first joystick is not defined. - if (first_joystick < 0) break; + if (!input[dev].num) break; // TODO: // 1) add analog axis mapping @@ -1931,7 +1954,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int int offset = 0; if (value < 127 || value>129) offset = value - 128; //printf("analog_x = %d\n", offset); - joy_analog((first_joystick == dev) ? 0 : 1, 0, offset); + joy_analog(input[dev].num, 0, offset); return; } @@ -1940,7 +1963,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int int offset = 0; if (value < 127 || value>129) offset = value - 128; //printf("analog_y = %d\n", offset); - joy_analog((first_joystick == dev) ? 0 : 1, 1, offset); + joy_analog(input[dev].num, 1, offset); return; } } @@ -2101,12 +2124,12 @@ int input_test(int getchar) { //keyboard, buttons case EV_KEY: - printf("Input event: type=EV_KEY, code=%d(0x%x), value=%d\n", ev.code, ev.code, ev.value); + printf("Input event: type=EV_KEY, code=%d(0x%x), value=%d, jnum=%d, ID:%04x:%04x\n", ev.code, ev.code, ev.value, input[i].num, input[i].vid, input[i].pid); break; //mouse case EV_REL: - printf("Input event: type=EV_REL, Axis=%d, Offset:=%d\n", ev.code, ev.value); + printf("Input event: type=EV_REL, Axis=%d, Offset:=%d, jnum=%d, ID:%04x:%04x\n", ev.code, ev.value, input[i].num, input[i].vid, input[i].pid); break; case EV_SYN: @@ -2128,7 +2151,7 @@ int input_test(int getchar) if (input[i].vid == 0x0079 && input[i].pid == 0x0006) { if (ev.code == 2) break; } - printf("Input event: type=EV_ABS, Axis=%d, Offset:=%d.", ev.code, ev.value); + printf("Input event: type=EV_ABS, Axis=%d, Offset:=%d, jnum=%d, ID:%04x:%04x.", ev.code, ev.value, input[i].num, input[i].vid, input[i].pid); printf(" ABS_INFO: min = %d max = %d", absinfo.minimum, absinfo.maximum); if (absinfo.fuzz) printf(" fuzz = %d", absinfo.fuzz); if (absinfo.resolution) printf(" res = %d", absinfo.resolution); @@ -2136,7 +2159,7 @@ int input_test(int getchar) break; default: - printf("Input event: type=%d, code=%d(0x%x), value=%d(0x%x)\n", ev.type, ev.code, ev.code, ev.value, ev.value); + printf("Input event: type=%d, code=%d(0x%x), value=%d(0x%x), jnum=%d, ID:%04x:%04x\n", ev.type, ev.code, ev.code, ev.value, ev.value, input[i].num, input[i].vid, input[i].pid); } } @@ -2165,9 +2188,9 @@ int input_test(int getchar) uint16_t base_axis = !user_io_get_joy_transl() ? 0 : ~ev.code; uint16_t extra_axis = 2; - if (input[i].vid == 0x0079 && input[i].pid == 0x0006) extra_axis = 0; // AliExpress USB encoder PCB floods axis 2 if (input[i].vid == 0x045e && input[i].pid == 0x028e) extra_axis = 3; // 8BitDo Retro Receiver if (input[i].vid == 0x046d && input[i].pid == 0xc21f) extra_axis = 3; // Logitech F710 + if (input[i].vid == 0x0079 && input[i].pid == 0x0006) extra_axis = 0; // AliExpress USB encoder PCB floods axis 2 if(ev.code == base_axis || ev.code == extra_axis || ev.code == 16) // x { @@ -2185,11 +2208,11 @@ int input_test(int getchar) } base_axis = !user_io_get_joy_transl() ? 1 : ~ev.code; - if (input[i].vid == 0x0079 && input[i].pid == 0x0006) base_axis = 3; // AliExpress USB encoder PCB extra_axis = 5; if (input[i].vid == 0x045e && input[i].pid == 0x028e) extra_axis = 4; // 8BitDo Retro Receiver if (input[i].vid == 0x046d && input[i].pid == 0xc21f) extra_axis = 4; // Logitech F710 + if (input[i].vid == 0x0079 && input[i].pid == 0x0006) extra_axis = 3; // AliExpress USB encoder PCB if (ev.code == base_axis || ev.code == extra_axis || ev.code == 17) // y { @@ -2274,8 +2297,8 @@ int input_test(int getchar) int input_poll(int getchar) { - static int af[2] = { 0 }; - static uint32_t time[2] = { 0 }; + static int af[NUMPLAYERS] = {}; + static uint32_t time[NUMPLAYERS] = {}; int ret = input_test(getchar); if (getchar) return ret; @@ -2307,8 +2330,10 @@ int input_poll(int getchar) if (!mouse_emu_x && !mouse_emu_y) mouse_timer = 0; - for (int i = 0; i < 2; i++) + for (int i = 0; i < NUMPLAYERS; i++) { + if (!af_delay[i]) af_delay[i] = 50; + if (!time[i]) time[i] = GetTimer(af_delay[i]); int send = 0; diff --git a/user_io.cpp b/user_io.cpp index c4bb749..27877b2 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -609,7 +609,7 @@ int user_io_get_joyswap() void user_io_analog_joystick(unsigned char joystick, char valueX, char valueY) { - uint8_t joy = (!joyswap) ? joystick : joystick ? 0 : 1; + uint8_t joy = (joystick>1 || !joyswap) ? joystick : joystick^1; if (core_type == CORE_TYPE_8BIT) { @@ -626,13 +626,7 @@ void user_io_analog_joystick(unsigned char joystick, char valueX, char valueY) void user_io_digital_joystick(unsigned char joystick, uint16_t map, int newdir) { - uint8_t joy = (!joyswap) ? joystick : joystick ? 0 : 1; - - if (is_minimig()) - { - spi_uio_cmd16(UIO_JOYSTICK0 + joy, map); - return; - } + uint8_t joy = (joystick>1 || !joyswap) ? joystick : joystick ^ 1; // atari ST handles joystick 0 and 1 through the ikbd emulated by the io controller // but only for joystick 1 and 2 @@ -642,8 +636,9 @@ void user_io_digital_joystick(unsigned char joystick, uint16_t map, int newdir) return; } - spi_uio_cmd16(UIO_JOYSTICK0 + joy, map); - if (joy_transl == 1 && newdir) + spi_uio_cmd16((joy < 2) ? (UIO_JOYSTICK0 + joy) : (UIO_JOYSTICK2 + joy - 2), map); + + if (!is_minimig() && joy_transl == 1 && newdir) { user_io_analog_joystick(joystick, (map & 2) ? 128 : (map & 1) ? 127 : 0, (map & 8) ? 128 : (map & 4) ? 127 : 0); } @@ -2943,10 +2938,10 @@ static void adjust_vsize(char force) if ((res & 0x8000) && (nres != res || force)) { nres = res; - uint16_t scr_hsize = spi_w(0); - uint16_t scr_vsize = spi_w(0); + uint16_t scr_hsize = spi_w(0); + uint16_t scr_vsize = spi_w(0); DisableIO(); - + printf("\033[1;37mVMODE: resolution: %u x %u, mode: %u\033[0m\n", scr_hsize, scr_vsize, res & 255); static int loaded = 0; @@ -2991,14 +2986,14 @@ static void store_vsize() spi_uio_cmd_cont(UIO_GET_VMODE); uint16_t res = spi_w(0); - uint16_t scr_hsize = spi_w(0); - uint16_t scr_vsize = spi_w(0); - uint16_t scr_hbl_l = spi_w(0); - uint16_t scr_hbl_r = spi_w(0); - uint16_t scr_vbl_t = spi_w(0); - uint16_t scr_vbl_b = spi_w(0); + uint16_t scr_hsize = spi_w(0); + uint16_t scr_vsize = spi_w(0); + uint16_t scr_hbl_l = spi_w(0); + uint16_t scr_hbl_r = spi_w(0); + uint16_t scr_vbl_t = spi_w(0); + uint16_t scr_vbl_b = spi_w(0); DisableIO(); - + printf("\033[1;37mVMODE: store position: [%u-%u, %u-%u]\033[0m\n", scr_hbl_l, scr_hbl_r, scr_vbl_t, scr_vbl_b); uint32_t mode = scr_hsize | (scr_vsize << 12) | ((res & 0xFF) << 24); From 3d1976ce2cf5fb7d4f1683ae30bcdfbde6dfef97 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Tue, 8 Jan 2019 19:23:30 +0800 Subject: [PATCH 18/18] Release 20190108. --- releases/MiSTer_20190108 | Bin 0 -> 277632 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 releases/MiSTer_20190108 diff --git a/releases/MiSTer_20190108 b/releases/MiSTer_20190108 new file mode 100644 index 0000000000000000000000000000000000000000..21961e794f646f3228a23a5dc698abfedf2eb0f8 GIT binary patch literal 277632 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

    OldW1Yd76z&8=Kd%dzfjvM!|ogasL+O_xC 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

    9o%~WA{7ahSI6>nQwQ(9_s4q~T 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 literal 0 HcmV?d00001