rearrange globals
[picodrive.git] / pico / carthw / svp / svp.c
index 76904ae..c50eb85 100644 (file)
@@ -1,17 +1,38 @@
-// The SVP chip emulator
-
-// (c) Copyright 2008, Grazvydas "notaz" Ignotas
-// Free for non-commercial use.
-
-// For commercial use, separate licencing terms must be obtained.
-
-
-#include "../../pico_int.h"
-#include "../../cpu/drc/cmn.h"
+/*
+ * The SVP chip emulator
+ *
+ * Copyright (c) GraÅžvydas "notaz" Ignotas, 2008
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the organization nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pico/pico_int.h>
+#include <cpu/drc/cmn.h>
 #include "compiler.h"
 
+#define SVP_CYCLES_LINE 850
+
 svp_t *svp = NULL;
-int PicoSVPCycles = 850; // cycles/line, just a guess
 static int svp_dyn_ready = 0;
 
 /* save state stuff */
@@ -36,8 +57,8 @@ static void PicoSVPReset(void)
 
        memcpy(svp->iram_rom + 0x800, Pico.rom + 0x800, 0x20000 - 0x800);
        ssp1601_reset(&svp->ssp1601);
-#ifndef PSP
-       if ((PicoOpt&POPT_EN_SVP_DRC) && svp_dyn_ready)
+#ifdef _SVP_DRC
+       if ((PicoIn.opt & POPT_EN_DRC) && svp_dyn_ready)
                ssp1601_dyn_reset(&svp->ssp1601);
 #endif
 }
@@ -46,7 +67,7 @@ static void PicoSVPReset(void)
 static void PicoSVPLine(void)
 {
        int count = 1;
-#if defined(ARM) || defined(PSP)
+#if defined(__arm__) || defined(PSP)
        // performance hack
        static int delay_lines = 0;
        delay_lines++;
@@ -56,38 +77,35 @@ static void PicoSVPLine(void)
        delay_lines = 0;
 #endif
 
-#ifndef PSP
-       if ((PicoOpt&POPT_EN_SVP_DRC) && svp_dyn_ready)
-               ssp1601_dyn_run(PicoSVPCycles * count);
+#ifdef _SVP_DRC
+       if ((PicoIn.opt & POPT_EN_DRC) && svp_dyn_ready)
+               ssp1601_dyn_run(SVP_CYCLES_LINE * count);
        else
 #endif
        {
-               ssp1601_run(PicoSVPCycles * count);
+               ssp1601_run(SVP_CYCLES_LINE * count);
                svp_dyn_ready = 0; // just in case
        }
 
        // test mode
-       //if (Pico.m.frame_count == 13) PicoPad[0] |= 0xff;
+       //if (Pico.m.frame_count == 13) PicoIn.pad[0] |= 0xff;
 }
 
 
-static int PicoSVPDma(unsigned int source, int len, unsigned short **srcp, unsigned short **limitp)
+static int PicoSVPDma(unsigned int source, int len, unsigned short **base, unsigned int *mask)
 {
        if (source < Pico.romsize) // Rom
        {
-               source -= 2;
-               *srcp = (unsigned short *)(Pico.rom + (source&~1));
-               *limitp = (unsigned short *)(Pico.rom + Pico.romsize);
-               return 1;
+               *base = (unsigned short *)(Pico.rom + (source & 0xfe0000));
+               *mask = 0x1ffff;
+               return source - 2;
        }
        else if ((source & 0xfe0000) == 0x300000)
        {
                elprintf(EL_VDPDMA|EL_SVP, "SVP DmaSlow from %06x, len=%i", source, len);
-               source &= 0x1fffe;
-               source -= 2;
-               *srcp = (unsigned short *)(svp->dram + source);
-               *limitp = (unsigned short *)(svp->dram + sizeof(svp->dram));
-               return 1;
+               *base = (unsigned short *)svp->dram;
+               *mask = 0x1ffff;
+               return source - 2;
        }
        else
                elprintf(EL_VDPDMA|EL_SVP|EL_ANOMALY, "SVP FIXME unhandled DmaSlow from %06x, len=%i", source, len);
@@ -98,7 +116,7 @@ static int PicoSVPDma(unsigned int source, int len, unsigned short **srcp, unsig
 
 void PicoSVPInit(void)
 {
-#ifndef PSP
+#ifdef _SVP_DRC
        // this is to unmap tcache and make
        // mem available for large ROMs, MCD, etc.
        drc_cmn_cleanup();
@@ -107,7 +125,7 @@ void PicoSVPInit(void)
 
 static void PicoSVPExit(void)
 {
-#ifndef PSP
+#ifdef _SVP_DRC
        ssp1601_dyn_exit();
 #endif
 }
@@ -115,26 +133,23 @@ static void PicoSVPExit(void)
 
 void PicoSVPStartup(void)
 {
-       void *tmp;
+       int ret;
 
        elprintf(EL_STATUS, "SVP startup");
 
-       tmp = realloc(Pico.rom, 0x200000 + sizeof(*svp));
-       if (tmp == NULL)
-       {
+       ret = PicoCartResize(Pico.romsize + sizeof(*svp));
+       if (ret != 0) {
                elprintf(EL_STATUS|EL_SVP, "OOM for SVP data");
                return;
        }
 
-       //PicoOpt &= ~0x20000;
-       Pico.rom = tmp;
-       svp = (void *) ((char *)tmp + 0x200000);
+       svp = (void *) ((char *)Pico.rom + Pico.romsize);
        memset(svp, 0, sizeof(*svp));
 
        // init SVP compiler
        svp_dyn_ready = 0;
-#ifndef PSP
-       if (PicoOpt & POPT_EN_SVP_DRC) {
+#ifdef _SVP_DRC
+       if (PicoIn.opt & POPT_EN_DRC) {
                if (ssp1601_dyn_startup())
                        return;
                svp_dyn_ready = 1;
@@ -153,7 +168,6 @@ void PicoSVPStartup(void)
        svp_states[1].ptr = svp->dram;
        svp_states[2].ptr = &svp->ssp1601;
        carthw_chunks = svp_states;
-       PicoAHW |= PAHW_SVP;
+       PicoIn.AHW |= PAHW_SVP;
 }
 
-