Add support for single-line cheats and PAR codes.
authoriLag <ilagdoesntcheckthisemail@gmail.com>
Wed, 22 Mar 2017 21:19:35 +0000 (14:19 -0700)
committernotaz <notasas@gmail.com>
Fri, 13 Oct 2017 21:53:09 +0000 (00:53 +0300)
notaz: include required header

pico/patch.c

index b961e80..40e8372 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include "pico_int.h"
  */
 
 #include "pico_int.h"
+#include "memory.h"
 #include "patch.h"
 
 struct patch
 #include "patch.h"
 
 struct patch
@@ -142,7 +143,7 @@ static void hex_decode(const char *code, struct patch *result)
 /* THIS is the function you call from the MegaDrive or whatever. This figures
  * out whether it's a genie or hex code, depunctuates it, and calls the proper
  * decoder. */
 /* THIS is the function you call from the MegaDrive or whatever. This figures
  * out whether it's a genie or hex code, depunctuates it, and calls the proper
  * decoder. */
-static void decode(const char* code, struct patch* result)
+void decode(const char* code, struct patch* result)
 {
   int len = strlen(code), i, j;
   char code_to_pass[16], *x;
 {
   int len = strlen(code), i, j;
   char code_to_pass[16], *x;
@@ -299,6 +300,8 @@ void PicoPatchPrepare(void)
                PicoPatches[i].addr &= ~1;
                if (PicoPatches[i].addr < Pico.romsize)
                        PicoPatches[i].data_old = *(unsigned short *)(Pico.rom + PicoPatches[i].addr);
                PicoPatches[i].addr &= ~1;
                if (PicoPatches[i].addr < Pico.romsize)
                        PicoPatches[i].data_old = *(unsigned short *)(Pico.rom + PicoPatches[i].addr);
+               else
+                       PicoPatches[i].data_old = (unsigned short) m68k_read16(PicoPatches[i].addr);
                if (strstr(PicoPatches[i].name, "AUTO"))
                        PicoPatches[i].active = 1;
        }
                if (strstr(PicoPatches[i].name, "AUTO"))
                        PicoPatches[i].active = 1;
        }
@@ -328,7 +331,15 @@ void PicoPatchApply(void)
                }
                else
                {
                }
                else
                {
-                       /* TODO? */
+                       if (PicoPatches[i].active)
+                               m68k_write16(PicoPatches[i].addr,PicoPatches[i].data);
+                       else {
+                               // if current addr is not patched by older patch, write back original val
+                               for (u = 0; u < i; u++)
+                                       if (PicoPatches[u].addr == addr) break;
+                               if (u == i)
+                                       m68k_write16(PicoPatches[i].addr,PicoPatches[i].data_old);
+                       }
                }
        }
 }
                }
        }
 }