LCOV - code coverage report
Current view: top level - asar - libsmw.h (source / functions) Coverage Total Hit
Test: asar build #66 Lines: 86.8 % 91 79
Test Date: 2024-01-16 02:45:19 Functions: 100.0 % 2 2
Branches: 84.9 % 106 90

             Branch data     Line data    Source code
       1                 :             : #pragma once
       2                 :             : 
       3                 :             : #include "errors.h"
       4                 :             : #include "autoarray.h"
       5                 :             : #include <cstdint>
       6                 :             : 
       7                 :             : extern const unsigned char * romdata;
       8                 :             : extern int romlen;
       9                 :             : extern asar_error_id openromerror;
      10                 :             : bool openrom(const char * filename, bool confirm=true);
      11                 :             : uint32_t closerom(bool save = true);
      12                 :             : 
      13                 :             : enum mapper_t {
      14                 :             :         invalid_mapper,
      15                 :             :         lorom,
      16                 :             :         hirom,
      17                 :             :         sa1rom,
      18                 :             :         bigsa1rom,
      19                 :             :         sfxrom,
      20                 :             :         exlorom,
      21                 :             :         exhirom,
      22                 :             :         norom
      23                 :             : } extern mapper;
      24                 :             : 
      25                 :             : extern int sa1banks[8];//only 0, 1, 4, 5 are used
      26                 :             : 
      27                 :             : void addromwrite(int pcoffset, int numbytes);
      28                 :             : void writeromdata(int pcoffset, const void * indata, int numbytes);
      29                 :             : void writeromdata_byte(int pcoffset, unsigned char indata);
      30                 :             : void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes);
      31                 :             : 
      32                 :             : struct writtenblockdata {
      33                 :             :         int pcoffset;
      34                 :             :         int snesoffset;
      35                 :             :         int numbytes;
      36                 :             : };
      37                 :             : 
      38                 :             : extern autoarray<writtenblockdata> writtenblocks;
      39                 :             : 
      40                 :      319125 : inline int snestopc(int addr)
      41                 :             : {
      42   [ +  +  -  + ]:      319125 :         if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
      43         [ +  + ]:      319117 :         if (mapper==lorom)
      44                 :             :         {
      45                 :             :                 // randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used
      46                 :             :                 // for SRAM, the high pages are available for ROM data though
      47         [ +  - ]:      313111 :                 if ((addr&0xFE0000)==0x7E0000 ||//wram
      48         [ +  + ]:      313111 :                         (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
      49         [ +  + ]:      313101 :                         (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
      50                 :           5 :                                 return -1;
      51                 :      313101 :                 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
      52                 :      313101 :                 return addr;
      53                 :             :         }
      54         [ +  + ]:        3003 :         if (mapper==hirom)
      55                 :             :         {
      56         [ +  - ]:        1588 :                 if ((addr&0xFE0000)==0x7E0000 ||//wram
      57         [ +  + ]:        1588 :                         (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
      58                 :           0 :                                 return -1;
      59                 :        1588 :                 return addr&0x3FFFFF;
      60                 :             :         }
      61         [ +  + ]:        2209 :         if (mapper==exlorom)
      62                 :             :         {
      63         [ +  - ]:        1496 :                 if ((addr&0xF00000)==0x700000 ||//wram, sram
      64         [ +  + ]:        1496 :                         (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
      65                 :           0 :                                 return -1;
      66         [ +  + ]:        1496 :                 if (addr&0x800000)
      67                 :             :                 {
      68                 :         294 :                         addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
      69                 :             :                 }
      70                 :             :                 else
      71                 :             :                 {
      72                 :        1202 :                         addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
      73                 :             :                 }
      74                 :        1496 :                 return addr;
      75                 :             :         }
      76         [ +  + ]:        1461 :         if (mapper==exhirom)
      77                 :             :         {
      78         [ +  - ]:        1548 :                 if ((addr&0xFE0000)==0x7E0000 ||//wram
      79         [ +  + ]:        1548 :                         (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
      80                 :           0 :                         return -1;
      81         [ +  + ]:        1548 :                 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
      82                 :         344 :                 return addr&0x3FFFFF;
      83                 :             :         }
      84         [ +  + ]:         687 :         if (mapper==sfxrom)
      85                 :             :         {
      86                 :             :                 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
      87         [ +  - ]:          92 :                 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
      88         [ +  - ]:          92 :                         (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
      89         [ +  + ]:          92 :                         (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
      90                 :           0 :                                 return -1;
      91         [ -  + ]:          92 :                 if (addr&0x400000) return addr&0x3FFFFF;
      92                 :          92 :                 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
      93                 :             :         }
      94         [ +  + ]:         641 :         if (mapper==sa1rom)
      95                 :             :         {
      96         [ +  - ]:         202 :                 if ((addr&0x408000)==0x008000)
      97                 :             :                 {
      98                 :         202 :                         return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
      99                 :             :                 }
     100         [ #  # ]:           0 :         if ((addr&0xC00000)==0xC00000)
     101                 :             :         {
     102                 :           0 :             return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
     103                 :             :         }
     104                 :           0 :                 return -1;
     105                 :             :         }
     106         [ +  + ]:         540 :         if (mapper==bigsa1rom)
     107                 :             :         {
     108         [ +  + ]:         404 :                 if ((addr&0xC00000)==0xC00000)//hirom
     109                 :             :                 {
     110                 :         192 :                         return (addr&0x3FFFFF)|0x400000;
     111                 :             :                 }
     112   [ +  +  +  - ]:         212 :                 if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom
     113                 :             :                 {
     114         [ +  + ]:         212 :                         if ((addr&0x008000)==0x000000) return -1;
     115                 :         212 :                         return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
     116                 :             :                 }
     117                 :           0 :                 return -1;
     118                 :             :         }
     119         [ +  - ]:         338 :         if (mapper==norom)
     120                 :             :         {
     121                 :         676 :                 return addr;
     122                 :             :         }
     123                 :           0 :         return -1;
     124                 :             : }
     125                 :             : 
     126                 :      159706 : inline int pctosnes(int addr)
     127                 :             : {
     128         [ +  + ]:      159706 :         if (addr<0) return -1;
     129         [ +  + ]:      159706 :         if (mapper==lorom)
     130                 :             :         {
     131         [ +  + ]:      158458 :                 if (addr>=0x400000) return -1;
     132                 :      158458 :                 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
     133                 :      158458 :                 return addr|0x800000;
     134                 :             :         }
     135         [ +  + ]:         624 :         if (mapper==hirom)
     136                 :             :         {
     137         [ +  + ]:         196 :                 if (addr>=0x400000) return -1;
     138                 :         196 :                 return addr|0xC00000;
     139                 :             :         }
     140         [ +  + ]:         526 :         if (mapper == exlorom)
     141                 :             :         {
     142         [ +  + ]:         156 :                 if (addr>=0x800000) return -1;
     143         [ +  + ]:         156 :                 if (addr&0x400000)
     144                 :             :                 {
     145                 :           6 :                         addr-=0x400000;
     146                 :           6 :                         addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
     147                 :           6 :                         return addr;
     148                 :             :                 }
     149                 :             :                 else
     150                 :             :                 {
     151                 :         150 :                         addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
     152                 :         150 :                         return addr|0x800000;
     153                 :             :                 }
     154                 :             :         }
     155         [ +  + ]:         448 :         if (mapper == exhirom)
     156                 :             :         {
     157         [ +  + ]:         180 :                 if (addr>=0x800000) return -1;
     158         [ +  + ]:         180 :                 if (addr&0x400000) return addr;
     159                 :         174 :                 return addr|0xC00000;
     160                 :             :         }
     161         [ +  + ]:         358 :         if (mapper==sa1rom)
     162                 :             :         {
     163         [ +  - ]:         276 :                 for (int i=0;i<8;i++)
     164                 :             :                 {
     165         [ +  + ]:         276 :                         if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);}
     166                 :             :                 }
     167                 :           0 :                 return -1;
     168                 :             :         }
     169         [ +  + ]:         300 :         if (mapper==bigsa1rom)
     170                 :             :         {
     171         [ +  + ]:         202 :                 if (addr>=0x800000) return -1;
     172         [ +  + ]:         202 :                 if ((addr&0x400000)==0x400000)
     173                 :             :                 {
     174                 :          96 :                         return addr|0xC00000;
     175                 :             :                 }
     176         [ +  + ]:         106 :                 if ((addr&0x600000)==0x000000)
     177                 :             :                 {
     178                 :          58 :                         return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
     179                 :             :                 }
     180         [ +  - ]:          48 :                 if ((addr&0x600000)==0x200000)
     181                 :             :                 {
     182                 :          48 :                         return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
     183                 :             :                 }
     184                 :           0 :                 return -1;
     185                 :             :         }
     186         [ +  + ]:         199 :         if (mapper==sfxrom)
     187                 :             :         {
     188         [ +  + ]:          58 :                 if (addr>=0x200000) return -1;
     189                 :          54 :                 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
     190                 :             :         }
     191         [ +  - ]:         170 :         if (mapper==norom)
     192                 :             :         {
     193                 :         340 :                 return addr;
     194                 :             :         }
     195                 :           0 :         return -1;
     196                 :             : }
     197                 :             : 
     198                 :             : int getpcfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00, bool write_rats=true);
     199                 :             : int getsnesfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00, bool write_rats=true);
     200                 :             : 
     201                 :             : void removerats(int snesaddr, unsigned char clean_byte);
     202                 :             : void handle_cleared_rats_tags();
     203                 :             : int ratsstart(int pcaddr);
     204                 :             : 
     205                 :             : void fixchecksum();
     206                 :             : 
     207                 :             : void WalkMetadata(int loc, void(*func)(int loc, char * name, int len, const unsigned char * contents));//This one calls func() for each metadata block in the RATS tag whose contents (metadata) start at loc in the ROM. Do not replace name with an invalid metadata name, and note that name is not null terminated.
        

Generated by: LCOV version 2.0-1