Merge branch 'discord-rpc' of https://github.com/Project64Netplay/project64 into discord-rpc

This commit is contained in:
Cranky Supertoon 2019-12-22 18:53:00 -05:00
commit 4292920e99
43 changed files with 5478 additions and 1128 deletions

1
.gitignore vendored
View File

@ -20,6 +20,7 @@
Thumbs.db
/.vs
/git.properties
/Bin/Debug
/Bin/Debug64
/Bin/Package

578
Lang/Bosnian.pj.Lang Normal file
View File

@ -0,0 +1,578 @@
/ *************************************************** ********************************
* Meta informacije *
**************************************************** ******************************* /
// O DLL-u
# 1 # "Bosanski" // ID JEZIKA
# 2 # "Alen Alic" // Autor
# 3 # "2.3" // Verzija
# 4 # "November, 2019" // Datum
// O DLL dijalogu
# 5 # "Trenutni jezik"
# 6 # "Autor"
# 7 # "Verzija"
# 8 # "Datum"
# 9 # "Posetite početnu stranicu"
# 10 # "Baza podataka ROM-a (.RDB)"
# 11 # "Datoteka šifre šifre (.CHT)"
# 12 # "Prošireni ROM podaci (.RDX)"
// O INI naslovu
# 20 # "O konfiguriranju datoteka"
/ *************************************************** ********************************
* Meni *
**************************************************** ******************************* /
// Izbornik datoteke
# 100 # "& datoteka"
# 101 # "& Otvori ROM"
# 102 # "ROM i informacije ...."
# 103 # "Pokrenite emulaciju"
# 104 # "& Krajnja emulacija"
# 105 # "Odaberite ROM direktorijum ..."
# 106 # "Osveži listu ROM-a"
# 107 # "Najnoviji ROM"
# 108 # "Najnoviji ROM direktoriji"
# 109 # "E & xit"
# 110 # "Otvori i kombinovano"
// Sistemski meni
# 120 # "i sistem"
# 121 # "Poništi"
# 122 # "Pauza"
# 123 # "Generiranje bitmape"
# 124 # "Ograniči FPS"
# 125 # "I sačuvaj državu"
# 126 # "Spremi kao ..."
# 127 # "Stanje opterećenja"
# 128 # "Učitavanje ..."
# 129 # "Trenutna ušteda i tata"
# 130 # "Trikovi ..."
# 131 # "GS dugme"
# 132 # "R & esume"
# 133 # "Meko resetiranje"
# 134 # "& Hard Reset"
# 135 # "Zamjena i disk"
// Izbornik mogućnosti
# 140 # "Opcije"
# 141 # "i preko cijelog ekrana"
# 142 # "I uvijek u & vrhu"
# 143 # "Konfiguriranje grafičkog dodatka ..."
# 144 # "Konfiguriranje audio dodatka ..."
# 145 # "Konfiguriranje dodatka kontrolera ..."
# 146 # "Konfiguriranje RSP dodatka ..."
# 147 # "Prikaži upotrebu CPU-a"
# 148 # "& postavke ..."
// Meni za uklanjanje pogrešaka
# 160 # "i ispravljanje pogrešaka"
// Jezik meni
# 175 # "i jezik"
// Izbornik pomoći
# 180 # "Pomoć"
# 181 # "O Conf & ig datotekama"
# 182 # "& O projektu64"
# 183 # "Podrška i forum"
# 184 # "i početna stranica"
// Trenutni izbornik Slot za spremanje
# 190 # "Zadano"
# 191 # "Slot 1"
# 192 # "Slot 2"
# 193 # "Slot 3"
# 194 # "Slot 4"
# 195 # "Slot 5"
# 196 # "Slot 6"
# 197 # "Slot 7"
# 198 # "Slot 8"
# 199 # "Slot 9"
# 200 # "Slot 10"
# 201 # "Odabran je Slot (% ws)"
// Pojavni meni
# 210 # "Igraj igru"
# 211 # "Informacije o ROM-u"
# 212 # "Uređivanje postavki igre"
# 213 # "Uredi šifre"
# 214 # "Grafički dodatak"
# 215 # "Igraj igru s diskom"
// Alternativno ime za spremanje mjesta
# 220 # "Spremanje utora - zadano"
# 221 # "Spremite utor - 1"
# 222 # "Spremite utor - 2"
# 223 # "Spremite utor - 3"
# 224 # "Spremite utor - 4"
# 225 # "Spremite utor - 5"
# 226 # "Spremite utor - 6"
# 227 # "Spremite utor - 7"
# 228 # "Spremite utor - 8"
# 229 # "Spremite utor - 9"
# 230 # "Spremite utor - 10"
// Opisi menija
# 250 # "Otvori N64 ROM sliku"
# 251 # "Prikaži informacije o učitanoj slici"
# 252 # "Pokrenite emulaciju učitane ROM slike"
# 253 # "Zaustavljanje emulacije učitane ROM slike"
# 254 # "Odaberite ROM direktorijum"
# 255 # "Osveži trenutni popis ROM-a u pregledaču ROM-a"
# 256 # "Zatvorite ovu aplikaciju"
# 257 # "Ponovo pokrenite trenutnu ROM sliku (ponovno učitajte sve promjene postavki)"
# 258 # "Pauziranje / nastavak oponašanja trenutnog pokretačkog ROM-a"
# 259 # "Stvaranje bitmap slike trenutnog ekrana"
# 260 # "Ograniči FPS na ispravnu brzinu N64"
# 261 # "Spremanje trenutnog stanja sustava"
# 262 # "Spremanje trenutnog stanja sustava na odabranu lokaciju datoteke"
# 263 # "Učitavanje spremljenog stanja sustava"
# 264 # "Odaberite sačuvanu datoteku stanja sistema za učitavanje"
# 265 # "Omogući / onemogući GameShark cheats"
# 266 # "Gumb GameShark koristi se sa određenim varalicama."
# 267 # "Promjena emulacije iz prozora u režim preko cijelog ekrana."
# 268 # "Neka prozori ostanu iznad svih ostalih prozora"
# 269 # "Promjena postavki unutar grafičkog dodatka"
# 270 # "Promjena postavki unutar audio dodatka"
# 271 # "Promjena postavki unutar dodatka kontrolera (tj. Postavljanje tipki)"
# 272 # "Promjena postavki unutar RSP dodatka"
# 273 # "Prikaži korištenje emulatora CPU-a podijeljeno na različite resurse"
# 274 # "Pogledajte / promijenite postavke za ovu aplikaciju"
# 275 # "Pogledajte priručnik za aplikaciju"
# 276 # "Pogledajte FAQ za aplikaciju"
# 278 # "O aplikaciji i autorima"
# 277 # "O autorima datoteka za podršku"
# 279 # "Otvori prethodno otvorenu ROM sliku"
# 280 # "Odaberite ovaj direktorij kao svoj ROM direktorij"
# 281 # "Promjena aplikacije za upotrebu ovog jezika"
# 282 # "Odaberite ovu lokaciju za spremanje za sačuvano stanje"
# 283 # "Igraj odabranu igru"
# 284 # "Informacije o odabranoj igri"
# 285 # "Uređivanje postavki za odabranu igru"
# 286 # "Uredi varalice za odabranu igru"
/ *************************************************** ********************************
* ROM pregledač *
**************************************************** ******************************* /
// Polja preglednika ROM
# 300 # "Naziv datoteke"
# 301 # "Interno ime"
# 302 # "Dobro ime"
# 303 # "Status"
# 304 # "Veličina ROM-a"
# 305 # "Napomene (jezgro)"
# 306 # "Bilješke (zadani dodaci)"
# 307 # "Bilješke (korisnik)"
# 308 # "Cartridge ID"
# 309 # "proizvođač"
# 310 # "zemlja"
# 311 # "programer"
# 312 # "CRC1"
# 313 # "CRC2"
# 314 # "CIC čip"
# 315 # "Datum objavljivanja"
# 316 # "žanr"
# 317 # "Igrači"
# 318 # "Prisilne povratne informacije"
# 319 # "Format datoteke"
# 321 # "Ime"
// Odaberite ROM
# 320 # "Odaberi trenutni direktorij ROM-a"
// Poruke
# 340 # "Loš ROM? Upotrijebite GoodN64 i provjerite je li RDB ažuriran."
/ *************************************************** ********************************
* Opcije *
**************************************************** ******************************* /
// Opcije naslova
# 400 # "Podešavanja"
// Kartice
# 401 # "Dodaci"
# 402 # "Katalozi"
# 403 # "Opcije"
# 404 # "Izbor ROM-a"
# 405 # "Napredno"
# 406 # "Opće postavke"
# 407 # "Integracija školjke"
# 408 # "Napomene"
# 409 # "Prečice na tastaturi"
# 410 # "Status"
# 411 # "Repipiler"
# 412 # "Zadane vrednosti"
# 413 # "64DD"
// Dijalog dodataka
# 420 # "O"
# 421 # "RSP (procesor signala stvarnosti) dodatak:"
# 422 # "Video (grafički) dodatak:"
# 423 # "Audio (zvuk) dodatak:"
# 424 # "Ulazni (regulator) dodatak:"
# 425 # "Grafika HLE"
# 426 # "Audio HLE"
# 427 # "** Koristite sistemski dodatak **"
// Dijalog direktorija
# 440 # "Imenik dodataka:"
# 441 # "ROM direktorij:"
# 442 # "N64 izvorni spremanje imenika:"
# 443 # "Imenik sačuvanih država:"
# 444 # "Snimak ekrana:"
# 445 # "Zadnja mapa iz koje je ROM otvoren"
# 446 # "Odaberite direktorij dodataka"
# 447 # "Odaberite ROM direktorijum"
# 448 # "Odaberite N64 direktorijum izvornih sprema"
# 449 # "Odabir direktorija spremljenih stanja"
# 450 # "Odaberite direktorij slike ekrana"
# 451 # "Imenik pakiranja teksture:"
# 452 # "Odaberite direktorij paketa teksture"
// Opcije (općenito) Kartica
# 460 # "Pauziranje emulacije kada prozor nije aktivan"
# 461 # "Uđite u režim preko cijelog zaslona prilikom umetanja ROM-a"
# 462 # "Sakrij napredne postavke"
# 463 # "Zapamti odabrane varalice"
# 464 # "Onemogući čuvar zaslona prilikom pokretanja ROM-a"
# 465 # "Brzina prikaza"
# 466 # "Prikaz brzine:"
# 467 # "Provjeri da li se Project64 već pokreće"
# 468 # "Unique Game Save Directory"
# 469 # "Japanski maloprodajni put 64DD IPL ROM-a:"
# 470 # "Američki maloprodajni put 64DD IPL ROM-a:"
# 471 # "Razvoj 64DD IPL ROM putanje:"
# 472 # "Tip spremanja diska:"
// Kartica Browser Browser
# 480 # "Maks. Broj zapamćenih ROM-a (0-10):"
# 481 # "ROM-ovi"
# 482 # "Maks. Broj zapamćenih ROM-ova (0-10):"
# 483 # "dirs"
# 484 # "Koristite ROM pretraživač"
# 485 # "Koristi rekurziju direktorija"
# 486 # "Dostupna polja:"
# 487 # "Redosled polja:"
# 488 # "Dodaj ->"
# 489 # "<- Ukloni"
# 490 # "Gore"
# 491 # "Dolje"
# 492 # "Automatski osvježi pretraživač"
//Napredne opcije
# 500 # "Većina ovih promjena neće stupiti na snagu dok se ne otvori novi ROM ili ne resetira trenutni ROM."
# 501 # "Osnovne zadane postavke"
# 502 # "Jezgra CPU jezgre:"
# 503 # "Self mod metode"
# 504 # "Zadana veličina memorije:"
# 505 # "Napredno povezivanje blokova"
# 506 # "Pokrenite emulaciju kada se otvori ROM"
# 507 # "Uvek nadjačaj zadane postavke sa onima iz RDB-a"
# 508 # "Automatski komprimiranje spremljenih stanja"
# 509 # "Omogući uklanjanje pogrešaka"
# 510 # "Predmemorija"
# 511 # "PI DMA"
# 512 # "Početak promijenjen"
# 513 # "Zaštiti memoriju"
# 514 # "TLB uklanjanje"
// Opcije ROM-a
# 520 # "Jezgra CPU jezgre:"
# 521 # "VI nivo osvežavanja:"
# 522 # "Veličina memorije:"
# 523 # "Napredno povezivanje blokova"
# 524 # "Podrazumevani tip čuvanja:"
# 525 # "Faktor brojača:"
# 526 # "Veći međuspremnik kompiliranja"
# 527 # "Koristi TLB"
# 528 # "Registriraj predmemoriju"
# 529 # "Odgoda prekida SI"
# 530 # "Brzi SP"
# 531 # "Zadano"
# 532 # "RSP audio signal"
# 533 # "Fiksni vremenski raspored zvuka"
# 534 # "Metoda pretraživanja funkcije:"
# 535 # "Prilagođena self mod metoda"
# 536 # "Sinkronizacija pomoću zvuka"
# 537 # "Broj AI po bajtu"
# 538 # "32-bitni motor"
# 539 # "Odgoda DP prekida"
// Osnovni stilovi
# 540 # "Interpreter"
# 541 # "Repipiler"
# 542 # "Sinkroniziranje jezgara"
// Self Mod metode
# 560 # "Nema"
# 561 # "Predmemorija"
# 562 # "Zaštiti memoriju"
# 563 # "Provjera memorije i predmemorije"
# 564 # "Promjena memorije i predmemorije"
# 565 # "Provjera unaprijed memorije"
# 566 # "Izbriši kod u predmemoriji"
// Metoda pretraživanja funkcije
# 570 # "Tablica fizičkog pretraživanja"
# 571 # "Virtualna tablica za pretraživanje"
# 572 # "Promenite memoriju"
// Veličina RDRAM-a
# 580 # "4 MB"
# 581 # "8 MB"
// Napredno povezivanje blokova
# 600 # "uključeno"
# 601 # "Isključeno"
// Spremi tip
# 620 # "Koristi prvo korišten tip čuvanja"
# 621 # "4-kbitni EEPROM"
# 622 # "16-kbitni EEPROM"
# 623 # "SRAM"
# 624 # "Flash RAM-a"
// Sheb Integration Shell
# 640 # "Udruženje za proširenje datoteka:"
// Bilješke o ROM-u
# 660 # "ROM status:"
# 661 # "Osnovna napomena:"
# 662 # "Napomena o dodatku:"
// Selektor ubrzivača
# 680 # "CPU stanje:"
# 681 # "Stavka iz menija:"
# 682 # "Trenutni tasteri:"
# 683 # "Odaberite novi prečac:"
# 684 # "Trenutno dodeljeno:"
# 685 # "Dodijeli"
# 686 # "Ukloni"
# 687 # "Poništi sve"
# 688 # "Igra se ne igra"
# 689 # "Igranje"
# 690 # "Igra (prozora)"
# 691 # "Igranje (preko cijelog ekrana)"
# 692 # "Ključ za otkrivanje"
// Opcija brzine kadrova
# 700 # "Vertikalni prekidi u sekundi"
# 701 # "Prikaži liste u sekundi"
# 702 # "Postotak pune brzine"
// Povećajte brzinu
# 710 # "Povećajte brzinu igre"
# 711 # "Smanjivanje brzine igre"
// Dugmi na donjoj stranici
# 720 # "Poništi stranicu"
# 721 # "Poništi sve"
# 722 # "Primjeni"
# 723 # "Zatvori"
// Disk Save Type
# 730 # "Puna kopija diska"
# 731 # "Samo sačuvaj područje"
/ *************************************************** ********************************
* Informacije o ROM-u *
**************************************************** ******************************* /
// Naslov informacije o ROM-u
# 800 # "Informacije o ROM-u"
// Tekst s informacijama o ROM-u
# 801 # "Naziv ROM:"
# 802 # "Naziv datoteke:"
# 803 # "Lokacija:"
# 804 # "Veličina ROM-a:"
# 805 # "Cartridge ID:"
# 806 # "Proizvođač:"
# 807 # "Zemlja:"
# 808 # "CRC1:"
# 809 # "CRC2:"
# 810 # "CIC čip:"
# 811 # "MD5:"
/ *************************************************** ********************************
* Trikovi *
**************************************************** ******************************* /
// Cheat List
# 1000 # "Trikovi"
# 1001 # "Trikovi:"
# 1002 # "Napomene:"
# 1003 # "Označi sve"
# 1004 # "Označi sve"
// Dodaj Cheat
# 1005 # "Dodaj šifru"
# 1006 # "Ime:"
# 1007 # "Kod:"
# 1008 # "Umetni"
# 1009 # "Obriši"
# 1010 # "Beležnice:"
# 1011 # "Dodaj u DB"
// Proširenje koda
# 1012 # "Proširenja kodova"
# 1013 # "Molimo odaberite vrijednost koja će se koristiti za:"
# 1014 # "U redu"
# 1015 # "Otkaži"
// Digitalna vrijednost
# 1016 # "Količina cifre"
# 1017 # "Molimo odaberite vrijednost za:"
# 1018 # "i vrednost"
# 1019 # "od"
# 1020 # "do"
# 1021 # "i napomene:"
# 1022 # "Dodaj šifru"
# 1023 # "Nova prevara"
# 1024 # "<adresa> <vrijednost>"
# 1025 # "Opcije:"
# 1026 # "<vrijednost> <oznaka>"
// Uredi Cheat
# 1027 # "Uredi varalica"
# 1028 # "Ažuriraj šifru"
# 1029 # "Varalica je promijenjena. \ N \ nŽelite li ažurirati?"
# 1030 # "Šifra ažurirana"
// Cheat Popup Menu
# 1040 # "Dodaj novu šifru ..."
# 1041 # "Uredi"
# 1042 # "Obriši"
// uređivač prečaca
# 1100 # "Poništi prečice"
# 1101 # "Jeste li sigurni da želite resetirati prečice? \ N \ nOva akcija se ne može poništiti."
# 1102 # "Meni datoteke"
# 1103 # "Sistemski meni"
# 1104 # "Opcije"
# 1105 # "Spremi slotove"
/ *************************************************** ********************************
* Prozor za podršku *
**************************************************** ******************************* /
# 1200 # "Projekt podrške64"
# 1201 # "Project64 je softverski paket dizajniran za oponašanje sistema Nintendo64 video igara na računaru sa sistemom Microsoft Windows. To vam omogućuje reprodukciju pravog N64 softvera na gotovo isti način kao što je to slučaj s originalnim hardverskim sistemom. \ N \ nAko vam se sviđa Project64 i izvukli ste neke vrijednosti iz toga, molimo vas da podržite project64 ili kao zahvalnost ili vašu želju da se stalno poboljšava. \ n \ nAko ste podržali project64: "
# 1202 # "Unesite kôd obavijesti"
# 1203 # "Projekt podrške64"
# 1204 # "Nastavi"
# 1205 # "Unesite kod za podršku"
# 1206 # "Netačan kod podrške"
# 1207 # "hvala"
# 1208 # "Unesite kod"
# 1209 # "Unesite kod u e-poštu"
# 1210 # "OK"
# 1211 # "Otkaži"
/ *************************************************** ********************************
* Poruke *
**************************************************** ******************************* /
# 2000 # "*** CPU PAUZIRAN ***"
# 2001 # "Nastavljen procesor"
# 2002 # "U stalnoj petlji koja se ne može izaći. \ NEmulacija će se sada zaustaviti. \ N \ nProvjerite ROM i njegove postavke."
# 2003 # "Nije uspela dodeliti memoriju"
# 2004 # "Zadani ili odabrani video dodatak nedostaje ili je nevažeći. \ N \ nTrebate ući u Postavke i odabrati video (grafički) dodatak. \ NProvjerite da li imate najmanje jednu kompatibilnu datoteku dodataka u svojoj mapi dodataka."
# 2005 # "Zadani ili odabrani audio dodatak nedostaje ili je neispravan. \ N \ nTrebate ući u Postavke i odabrati audio (zvučni) dodatak. \ NProverite da li imate mapu jedne kompatibilne datoteke dodataka u svojoj mapi dodataka."
# 2006 # "Zadani ili odabrani RSP dodatak nedostaje ili je nevažeći. \ N \ nTrebate ući u Postavke i odabrati RSP (Reality Signal Processor) dodatak. \ NProvjerite da li imate najmanje jednu kompatibilnu datoteku dodataka u svojoj mapi dodataka. . "
# 2007 # "Zadani ili odabrani ulazni dodatak nedostaje ili je neispravan. \ N \ nTrebate ući u Postavke i odabrati ulazni (regulator) dodatak. \ NProverite da li imate mapu jedne kompatibilne datoteke dodataka u svojoj mapi dodataka."
# 2008 # "Nije uspjelo učitavanje dodatka:"
# 2009 # "Nije uspjelo učitavanje riječi. \ N \ nProvjerite ROM i njegove postavke."
# 2010 # "Otvaranje datoteke za spremanje nije uspjelo"
# 2011 # "Nije uspio otvoriti EEPROM"
# 2012 # "Neuspešno otvaranje flash RAM-a"
# 2013 # "Nije uspelo otvaranje mempak-a"
# 2014 # "Pokušaj otvaranja zip datoteke nije uspio. \ N \ n Vjerojatno oštećena zip datoteka - pokušajte ručno raspakirati ROM."
# 2015 # "Pokušaj otvaranja datoteke nije uspio."
# 2016 # "Došlo je do pogreške prilikom pokušaja otvaranja zip datoteke."
# 2017 # "Datoteka učitana ne čini se valjanim N64 ROM-om. \ N \ nOvjerite svoje ROM-ove s GoodN64."
# 2018 # "Nepoznata zemlja"
# 2019. # "Nepoznati CIC čip"
# 2020 # "Nepoznati format datoteke"
# 2021 # "Nepoznata radnja memorije \ n \ nEmulacija je zaustavljena"
# 2022 # "Neodvršeni R4300i kod kod"
# 2023 # "Izvođenje iz nekarpiranog prostora. \ N \ nProvjerite ROM i njegove postavke."
# 2024 # "Čini se da ovo sačuvano stanje ne odgovara tekućem ROM-u. \ N \ nDržave moraju biti spremljene i učitane između 100% identičnih ROM-ova. \ NPosebno REGION i VERSION moraju biti isti. \ NUmetanje ovog stanja je vjerovatno će prouzrokovati pad igre i / ili emulatora. \ n \ n Jeste li sigurni da želite nastaviti s učitavanjem? "
# 2025 # "Greška"
# 2026 # "Slijed autorskih prava nije pronađen u LUT-u. Igra više neće funkcionirati."
# 2027 # "Neuspjeh u zaštiti od kopiranja"
# 2028 # "Promjena dodatka zahtijeva Project64 za resetiranje tekućeg ROM-a. \ NAko ne želite izgubiti svoje mjesto, odgovorite ne i prvo spremite trenutno stanje. \ N \ nPromijenite dodatke i resetirajte ROM sada?"
# 2029 # "Promjena dodataka"
# 2030 # "Emulacija je završena"
# 2031 # "Emulacija je započela"
# 2032 # "Nije moguće učitati stanje"
# 2033 # "Opterećeno stanje"
# 2034 # "Spremljeno trenutno stanje u"
# 2035 # "Državni utor"
# 2036 # "Slika zamjene bajtova"
# 2037 # "Odabir slike N64"
# 2038 # "Opterećen"
# 2039 # "Učitavanje slike"
# 2040 # "ROM se ne može otvoriti jer se dodaci nisu uspješno inicijalizirali."
# 2041 # "Jeste li sigurni da zaista želite ovo izbrisati?"
# 2042 # "Obriši varalice"
# 2043 # "Naziv varalice se već koristi."
# 2044 # "Dostigli ste maksimalnu količinu varalica za ovaj ROM."
# 2045 # "Dodatak inicijalizaciji"
# 2046 # "Niste odabrali virtualni ključ koji ćete dodijeliti stavci izbornika."
# 2047 # "Morate odabrati stavku menija kojoj ćete dodijeliti ovaj ključ."
# 2048 # "Prečac je već dodijeljen drugoj stavci izbornika."
# 2049 # "Nije odabrana nijedna prečica za uklanjanje."
# 2050 # "ROM učitan. Čeka da se pokrene emulacija."
# 2051 # "beta64 verzije Project64 su samo za članove. \ N \ nAko imate račun na www.pj64-emu.com, ne biste trebali vidjeti ovu pogrešku !! \ nPolite da nas kontaktirate na web mjestu."
# 2052 # "Greška u programu"
# 2053 # "Nije pronađeno ime datoteke u datoteci 7z"
# 2054 # "Grafička emulacija niskog nivoa"
# 2055 # "Grafički LLE nije za opću upotrebu !!! \ nSavjetuje se da ovo koristite samo za testiranje, a ne za igranje igara. \ N \ nPromijenite na grafički LLE?"
# 2056 # "Audio visoka emulacija"
# 2057 # "Audio HLE zahtijeva dodatak treće strane !!! \ nAko ne upotrebljavate audio dodatak treće strane koji podržava HLE, nećete čuti zvuk. \ N \ nPromijenite na audio HLE?"
# 2058 # "Učitana datoteka ne čini se valjanim 64DD IPL ROM-om. \ N \ nOvjerite svoje ROM-ove s GoodN64."
# 2059 # "Nintendo 64DD Japanski maloprodajni IPL ROM nije pronađen. \ NTreba se reproducirati slike diska sa japanskom regijom 64DD. \ N \ n Molimo odaberite željeni ROM u postavkama."
# 2061 # "Nintendo 64DD američki maloprodajni IPL ROM nije pronađen. \ NZatravan je za reprodukciju slika diska američke regije 64DD. \ N \ n Molimo odaberite željeni ROM u postavkama."
# 2062 # "Nintendo 64DD razvojni IPL ROM nije pronađen. \ NZatravan je za reprodukciju slika diska sa razvojem 64DD. \ N \ n Molimo odaberite željeni ROM u postavkama."
/ *************************************************** ********************************
* Android *
**************************************************** ******************************* /
# 3000 # "Podešavanja"
# 3001 # "Pomoć / Forum"
# 3002 # "Izveštaj o problemu"
# 3003 # "O"
# 3004 # "Nedavno odigrano"
# 3005 # "Igre"
# 3006 # "Igra Dir"
# 3007 # "Odaberite fasciklu za skeniranje"
# 3008 # "Uključi poddirektoriju"
# 3009 # "Roditeljska mapa"
# 3010 # "Katalozi"
# 3011 # "Interna memorija"
# 3012 # "Skeniranje ..."
# 3013 # "OK"
# 3014 # "Otkaži"
# 3015 # "Informacije"
# 3016 # "Project64 za Android"
# 3017 # "Licenca"
# 3018 # "Revizija"
# 3019 # "Project64 za Android \ u2122 je luka za Windows verziju projekta64. Verzija Android \ u2122 može igrati većinu N64 igara."
# 3020 # "Autori projekta64."
# 3021 # "Razmirica"
// U meniju igre
# 3100 # "Podešavanja"
# 3101 # "Spremi državu"
# 3102 # "Stanje opterećenja"
# 3103 # "Kraj emulacije"
# 3104 # "Pauza"
# 3105 # "Nastavi"
# 3106 # "Brzina igre"
# 3107 # "Trenutno stanje uštede ..."
# 3108 # "Automatski"
# 3109 # "Slot"
# 3110 # "Poništi"
# 3111 # "Opcije za uklanjanje pogrešaka"
# 3112 # "Resetovanje funkcija vremena"
# 3113 # "Baci funkcija vremena"

576
Lang/Turkish.pj.Lang Normal file
View File

@ -0,0 +1,576 @@
/*********************************************************************************
* Meta Information *
*********************************************************************************/
//About DLL
#1 # "Turkish" // LANGUAGE ID
#2 # "Gürkan" // Author
#3 # "2.3.2" // Version
#4 # "10 November, 2019" // Date
//About DLL Dialog
#5 # "Mevcut Dil"
#6 # "Yazar"
#7 # "Sürüm"
#8 # "Tarih"
#9 # "Ana Sayfayı Ziyaret Et"
#10 # "ROM Veritabanı (.RDB)"
#11 # "Hile Kodu Dosyası (.CHT)"
#12 # "Genişletilmiş ROM Bilgisi (.RDX)"
//About INI title
#20 # "Yapılandırma Dosyaları Hakkında"
/*********************************************************************************
* Menu *
*********************************************************************************/
//File Menu
#100# "&Dosya"
#101# "&ROM Aç"
#102# "ROM &Bilgisi...."
#103# "Emülasyonu Başlat"
#104# "&Emülasyonu Sonlandır"
#105# "ROM Dizinini Seç..."
#106# "ROM Listesini Yenile"
#107# "Son kullanılan ROM"
#108# "Son kullanılan ROM Dizinleri"
#109# "Ç&ıkış"
#110# "Aç ve Birleştir"
//System Menu
#120# "&Sistem"
#121# "&Yeniden Başlat"
#122# "&Duraklat"
#123# "Bitmap Oluştur"
#124# "FPS'yi Sınırla"
#125# "&Durumu Kaydet"
#126# "Farklı Kaydet..."
#127# "&Durumu Yüke"
#128# "Yükle..."
#129# "Mevcut durumu kaydet"
#130# "Hileler..."
#131# "Game Shark (GS) Butonu"
#132# "Devam Et"
#133# "&Yazılımsal (Soft) Sıfırlama"
#134# "&Donanımsal (Hard) Sıfırlama"
#135# "Diski &Değiştir"
//Options Menu
#140# "&Seçenekler"
#141# "&Tam Ekran"
#142# "&Her Zaman &Üstte"
#143# "Grafik Eklentilerini Yapılandır..."
#144# "Ses Eklentilerini Yapılandır..."
#145# "Denetleyici Eklentilerini Yapılandır..."
#146# "RSP Eklentilerini Yapılandır..."
#147# "CPU Kullanımını Göster"
#148# "&Ayarlar..."
//Debugger Menu
#160# "&Hata Ayıklayıcı"
//Language Menu
#175# "&Dil"
//Help Menu
#180# "&Yardım"
#181# "Yapılandırma Dosyaları Hakkında"
#182# "&Project64 Hakkında"
#183# "Destek &Forumu"
#184# "&Ana Sayfa"
//Current Save Slot menu
#190# "Varsayılan"
#191# "Yuva 1"
#192# "Yuva 2"
#193# "Yuva 3"
#194# "Yuva 4"
#195# "Yuva 5"
#196# "Yuva 6"
#197# "Yuva 7"
#198# "Yuva 8"
#199# "Yuva 9"
#200# "Yuva 10"
#201# "Kayıt Yuvası (%ws) seçildi"
//Pop up Menu
#210# "Oyunu Oyna"
#211# "ROM Bilgileri"
#212# "Oyun Ayarlarını Düzenle"
#213# "Hileleri Düzenle"
#214# "Grafik Eklentisi"
#215# "Oyunu Disk ile Oyna"
//Alternate Name to save Slot
#220# "Kayıt Yuvası - Varsayılan"
#221# "Kayıt Yuvası - 1"
#222# "Kayıt Yuvası - 2"
#223# "Kayıt Yuvası - 3"
#224# "Kayıt Yuvası - 4"
#225# "Kayıt Yuvası - 5"
#226# "Kayıt Yuvası - 6"
#227# "Kayıt Yuvası - 7"
#228# "Kayıt Yuvası - 8"
#229# "Kayıt Yuvası - 9"
#230# "Kayıt Yuvası - 10"
// Menu Descriptions
#250# "Bir N64 ROM imajı aç"
#251# "Yüklenen imaj hakkındaki bilgileri görüntüle"
#252# "Yüklenen ROM imajının emülasyonunu başlat"
#253# "Yüklenen ROM imajının emülasyonunu durdur"
#254# "ROM dizinini seç"
#255# "ROM listesindeki mevcut ROM'ları yenile"
#256# "Bu uygulamadan çık"
#257# "Geçerli ROM imajını yeniden başlat (herhangi bir ayar değişikliğini yeniden yükle)"
#258# "Şu anda çalışan ROM emülasyonunu durdur/başlat"
#259# "Şu anki ekranın bitmap görüntüsünü oluştur"
#260# "FPS'yi N64'ün doğru hızıyla sınırlandır"
#261# "Mevcut sistem durumunu kaydet"
#262# "Mevcut sistem durumunu seçilen bir dosya konumuna kaydet"
#263# "Mevcut sistem durumunu yükle"
#264# "Yüklemek için kayıtlı olan bir sistem durum dosyası seç"
#265# "GameShark hilelerini etkinleştir/devre dışı bırak"
#266# "GameShark tuşu belirli hilelerle kullanılır."
#267# "Emülasyonu pencere modundan tam ekran moduna değiştir."
#268# "Pencereyi diğer tüm pencerelerin üstünde tut"
#269# "Grafik eklentisinin içindeki ayarları değiştir"
#270# "Ses eklentisinin içindeki ayarları değiştir"
#271# "Denetleyici eklentisinin içindeki ayarları değiştir (yani tuşları ayarla)"
#272# "RSP eklentisinin içindeki ayarları değiştir"
#273# "Emülatörün CPU kullanımını farklı kaynaklara ayrılmış olarak göster"
#274# "Bu uygulamanın ayarlarını görüntüle/değiştir"
#275# "Uygulama kılavuzunu görüntüle"
#276# "Uygulamanın SSS bölümünü görüntüle"
#278# "Uygulama ve yazarlar hakkında"
#277# "Destek dosyalarının yazarları hakkında"
#279# "Önceden açılmış olan bu ROM görüntüsünü aç"
#280# "Bu dizini ROM dizini olarak seç"
#281# "Uygulamayı bu dili kullanarak değiştir"
#282# "Kaydedilen durum için bu kaydetme konumunu seçin"
#283# "Seçili oyunu oyna"
#284# "Seçilen oyun hakkında bilgi"
#285# "Seçilen oyun için ayarları düzenle"
#286# "Seçilen oyun için hileleri düzenle"
/*********************************************************************************
* ROM Browser *
*********************************************************************************/
//ROM Browser Fields
#300# "Dosya Adı"
#301# "Dahili Ad"
#302# "GoodN64 Adı"
#303# "Durum"
#304# "ROM Boyutu"
#305# "Notlar (çekirdek)"
#306# "Notlar (varsayılan eklentiler)"
#307# "Notlar (kullanıcı)"
#308# "Kartuş ID'si"
#309# "Üretici"
#310# "Ülke"
#311# "Geliştirici"
#312# "CRC1"
#313# "CRC2"
#314# "CIC Yongası"
#315# "Çıkış Tarihi"
#316# "Tür"
#317# "Oyuncular"
#318# "Force Feedback"
#319# "Dosya Formatı"
#321# "Ad"
//Select ROM
#320# "Geçerli ROM dizinini seç"
//Messages
#340# "ROM kötü mü? GoodN64 kullanın ve RDB'nin güncel olup olmadığını kontrol edin."
/*********************************************************************************
* Options *
*********************************************************************************/
//Options Title
#400# "Ayarlar"
//Tabs
#401# "Eklentiler"
#402# "Dizinler"
#403# "Seçenekler"
#404# "ROM Seçimi"
#405# "Gelişmiş"
#406# "Genel Ayarlar"
#407# "Kabuk Entegrasyonu"
#408# "Notlar"
#409# "Klavye Kısayolları"
#410# "Durum"
#411# "Recompiler"
#412# "Varsayılan"
#413# "64DD"
//Plugin Dialog
#420# "Hakkında"
#421# " RSP (Gerçeklik Sinyal İşlemcisi) eklentisi: "
#422# " Video (grafik) eklentisi: "
#423# " Ses eklentisi: "
#424# " Girdi (denetleyici) eklentisi: "
#425# "Grafik YSE"
#426# "Ses YSE"
#427# "** Sistem Eklentisini Kullan **"
//Directory Dialog
#440# " Eklenti dizini: "
#441# " ROM dizini: "
#442# " N64 yerel kayıt dizini: "
#443# " Kayıtlı durumların dizini: "
#444# " Ekran görüntüsü dizini: "
#445# "ROMun açık olduğu son klasör"
#446# "Eklenti dizini seçin"
#447# "ROM dizini seçin"
#448# "N64 yerel kayıt dizini seç"
#449# "Kayıtlı durumların dizinini seç"
#450# "Ekran görüntüsü dizini seç"
#451# " Doku paketi dizini: "
#452# "Doku paketi dizini seç"
//Options (general) Tab
#460# "Pencere etkin değilken emülasyonu durdur"
#461# "ROM yüklenirken tam ekran moduna gir"
#462# "Gelişmiş ayarları gizle"
#463# "Seçilmiş hileleri hatırla"
#464# "ROM çalışırken ekran koruyucuyu devre dışı bırak"
#465# "Ekran hızı"
#466# "Hız göstergesi:"
#467# "Project64'ün zaten çalışıyor olup olmadığını kontrol et"
#468# "Benzersiz Oyun Kayıt Dizini"
#469# "Japon 64DD IPL ROM Yolu:"
#470# "Amerikan 64DD IPL ROM Yolu:"
#471# "Geliştirme 64DD IPL ROM Yolu:"
#472# "Disk Kayıt Türü:"
//ROM Browser Tab
#480# "Hatırlanan maksimum ROM sayısı (0-10):"
#481# "ROM'lar"
#482# "Hatırlanan maksimum ROM dizini sayısı (0-10):"
#483# "dizinler"
#484# "ROM listeleyicisini kullan"
#485# "Dizin özyinelemesini kullan"
#486# "Kullanılabilir alanlar:"
#487# "Alanların sırası:"
#488# "Ekle ->"
#489# "<- Kaldır"
#490# "Yukarı"
#491# "Aşağı"
#492# "Listeleyiciyi otomatik olarak yenile"
//Advanced Options
#500# "Bu değişikliklerin çoğu, yeni bir ROM açılana veya mevcut ROM yeniden başlatılıncaya kadar etkili olmaz."
#501# "Çekirdek Varsayılanları"
#502# "CPU çekirdeği stili:"
#503# "Kod işleme yöntemi"
#504# "Varsayılan bellek boyutu:"
#505# "Gelişmiş blok bağlantısı"
#506# "ROM açıldığında emülasyonu başlat"
#507# "RDB ayarlarıyla daima varsayılan ayarları geçersiz kıl"
#508# "Kayıtlı durumları otomatik olarak sıkıştır"
#509# "Hata Ayıklayıcıyı etkinleştir"
#510# "Önbellek"
#511# "PI DMA"
#512# "Başlangıç değiştirildi"
#513# "Belleği koru"
#514# "TLB unmapping"
//ROM Options
#520# "CPU çekirdeği stili:"
#521# "VI yenileme oranı:"
#522# "Bellek boyutu:"
#523# "Gelişmiş blok bağlantısı"
#524# "Varsayılan kayıt türü:"
#525# "Sayım faktörü:"
#526# "Büyük derleme tamponu"
#527# "TLB kullan"
#528# "Kayıtları önbelleğe alma"
#529# "SI kesmesini geciktirme"
#530# "Hızlı SP"
#531# "Varsayılan"
#532# "RSP ses sinyali"
#533# "Sabit ses zamanlaması"
#534# "Metot arama yöntemi:"
#535# "Özel kod işleme yöntemi"
#536# "Ses kullanarak senkronize et"
#537# "Bayt başına AI sayısı"
#538# "32 bit motor"
#539# "DP kesmesini geciktirme"
//Core Styles
#540# "Yorumlayıcı"
#541# "Recompiler"
#542# "Çekirdekleri senkronize et"
//Self Mod Methods
#560# "Yok"
#561# "Önbellek"
#562# "Belleği koru"
#563# "Belleği ve önbelleği kontrol et"
#564# "Belleği ve önbelleği değiştir"
#565# "Bellek ilerlemesini kontrol et"
#566# "Önbellekteki kodu temizle"
//Function Lookup method
#570# "Fiziksel arama tablosu"
#571# "Sanal arama tablosu"
#572# "Belleği değiştir"
//RDRAM Size
#580# "4 MB"
#581# "8 MB"
//Advanced Block Linking
#600# "Açık"
#601# "Kapalı"
//Save Type
#620# "İlk kullanılan kaydetme türünü kullan"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab
#640# "Dosya uzantısı ilişkilendirme:"
//ROM Notes
#660# "ROM durumu:"
#661# "Çekirdek notu:"
#662# "Eklenti notu:"
// Accelerator Selector
#680# "CPU durumu:"
#681# "Menü öğesi:"
#682# "Geçerli tuşlar:"
#683# "Yeni kısayol tuşu seç:"
#684# "Şu anda atanmış:"
#685# "Ata"
#686# "Kaldır"
#687# "Tümünü Sıfırla"
#688# "Oyun çalışmıyor"
#689# "Oyun çalışıyor"
#690# "Oyun çalışıyor (pencere modu)"
#691# "Oyun çalışıyor (tam ekran)"
#692# "Tuşu Algıla"
// Frame Rate Option
#700# "Saniyedeki dikey işkesme sinyalleri"
#701# "Saniyedeki listeleri göster"
#702# "Tam hız yüzdesi"
// Increase speed
#710# "Oyun Hızını Artır"
#711# "Oyun Hızını Azalt"
//Bottom page buttons
#720# "Sayfayı Sıfırla"
#721# "Tümünü Sıfırla"
#722# "Uygula"
#723# "Kapat"
//Disk Save Type
#730# "Tam Disk Kopyası"
#731# "Sadece Kayıtlı Alan"
/*********************************************************************************
* ROM Information *
*********************************************************************************/
//ROM Info Title
#800# "ROM Bilgileri"
//ROM Info Text
#801# "ROM adı:"
#802# "Dosya adı:"
#803# "Bölge:"
#804# "ROM boyutu:"
#805# "Kartuş ID'si:"
#806# "Üretici:"
#807# "Ülke:"
#808# "CRC1:"
#809# "CRC2:"
#810# "CIC Yongası:"
#811# "MD5:"
/*********************************************************************************
* Cheats *
*********************************************************************************/
//Cheat List
#1000# "Hileler"
#1001# "Hileler:"
#1002# " Notlar: "
#1003# "Tümünü İşaretle"
#1004# "Tümünün İşaretini Kaldır"
//Add Cheat
#1005# "Hile Ekle"
#1006# "Ad:"
#1007# "Kod:"
#1008# "Ekle"
#1009# "Temizle"
#1010# " Hile Notları: "
#1011# "DB'ye Ekle"
//Code extension
#1012# "Kod Uzantıları"
#1013# "Lütfen kullanılacak bir değer seçin:"
#1014# "Tamam"
#1015# "İptal"
//Digital Value
#1016# "Rakam Miktarı"
#1017# "Lütfen bir değer seçin:"
#1018# "&Değer"
#1019# "itibaren"
#1020# "için"
#1021# "&Notlar:"
#1022# "Hile Ekle"
#1023# "Yeni Hile"
#1024# "<adres> <deger>"
#1025# "Seçenekler:"
#1026# "<deger> <etiket>"
//Edit Cheat
#1027# "Hile Düzenle"
#1028# "Hile Güncelle"
#1029# "Hile değiştirildi.\n\nGüncellemek ister misiniz?"
#1030# "Hile güncellendi"
//Cheat Popup Menu
#1040# "Yeni Hile Ekle..."
#1041# "Düzenle"
#1042# "Sil"
// short-cut editor
#1100# "Kısayolları sıfırla"
#1101# "Kısayolları sıfırlamak istediğinize emin misiniz?\n\nBu işlem geri alınamaz."
#1102# "Dosya Menüsü"
#1103# "Sistem Menüsü"
#1104# "Seçenekler"
#1105# "Yuvaları Kaydet"
/*********************************************************************************
* Support Window *
*********************************************************************************/
#1200# "Project64'ü Destekle"
#1201# "Project64, Microsoft Windows tabanlı bir bilgisayarda Nintendo64 video oyun sistemini emüle etmek için tasarlanmış bir yazılım paketidir. Bu, gerçek N64 yazılımını, orijinal donanım sistemindeki gibi oynatmanızı sağlar.\n\nProject64'ten hoşlanıyorsanız ve onu kullanmaktan zevk alıyorsanız, lütfen project64'ü teşekkür olarak veya sürekli olarak iyileştirilme arzusuyla destekleyin.\n\nProject64'ü desteklediyseniz:"
#1202# "Bildirim kodunu giriniz"
#1203# "Project64'ü Destekle"
#1204# "Devam et"
#1205# "Lütfen destek kodunu giriniz"
#1206# "Yanlış destek kodu"
#1207# "Teşekkürler"
#1208# "Kodu giriniz"
#1209# "Lütfen e-postadaki kodu giriniz"
#1210# "Tamam"
#1211# "İptal"
/*********************************************************************************
* Messages *
*********************************************************************************/
#2000# "*** CPU DURAKLATILDI ***"
#2001# "CPU Başlatıldı"
#2002# "Program çıkış yapılamayan kalıcı bir döngüye girdi.\nEmülasyon şimdi duracak.\n\nROM'u ve ayarlarını doğrulayın."
#2003# "Bellek ayrılamadı"
#2004# "Varsayılan veya seçilen video eklentisi eksik veya geçersiz.\n\nAyarlar'a girmeniz ve bir video (grafik) eklentisi seçmeniz gerekiyor.\nEklenti klasörünüzde en az bir tane uyumlu eklenti dosyanızın olup olmadığını kontrol edin."
#2005# "Varsayılan veya seçilen ses eklentisi eksik veya geçersiz.\n\nAyarlar'a girmeniz ve bir ses eklentisi seçmeniz gerekiyor.\nEklenti klasörünüzde en az bir tane uyumlu eklenti dosyanızın olup olmadığını kontrol edin."
#2006# "Varsayılan veya seçilen RSP eklentisi eksik veya geçersiz.\n\nAyarlar'a girmeniz ve bir RSP (Gerçeklik Sinyal İşlemcisi) eklentisi seçmeniz gerekiyor.\nEklenti klasörünüzde en az bir tane uyumlu eklenti dosyanızın olup olmadığını kontrol edin."
#2007# "Varsayılan veya seçilen girdi eklentisi eksik veya geçersiz.\n\nAyarlar'a girmeniz ve bir girdi (denetleyici) eklentisi seçmeniz gerekiyor.\nEklenti klasörünüzde en az bir tane uyumlu eklenti dosyanızın olup olmadığını kontrol edin."
#2008# "Eklenti yüklenemedi:"
#2009# "Kelime yüklenemedi.\n\nROM'u ve ayarlarını doğrulayın."
#2010# "Kayıt dosyasıılamadı"
#2011# "EEPROM açılamadı"
#2012# "Flash RAM açılamadı"
#2013# "Mempak açılamadı"
#2014# "Zip dosyasıılamadı.\n\nMuhtemelen zip dosyası bozuk. ROM'u manuel olarak zipten çıkarmayı deneyin."
#2015# "Dosya açma girişimi başarısız oldu."
#2016# "Zip dosyasını açmaya çalışırken hata oluştu."
#2017# "Yüklenen dosya geçerli bir N64 ROM'u gibi görünmüyor.\n\nROM'larınızı GoodN64 ile doğrulayın."
#2018# "Bilinmeyen ülke"
#2019# "Bilinmeyen CIC yongası"
#2020# "Bilinmeyen dosya formatı"
#2021# "Bilinmeyen bellek işlemi\n\nEmülasyon durdu."
#2022# "İşlenmemiş R4300i işlem kodu(opcode)"
#2023# "Eşlenmemiş alandan yürütme.\n\nROM'u ve ayarlarını doğrulayın."
#2024# "Bu kayıtlı durum, çalışan ROM ile eşleşmiyor gibi görünüyor.\n\nDurumlar %100 aynı ROM'lar arasında kaydedilmeli ve yüklenmelidir.\nÖzellikle BÖLGE ve SÜRÜM aynı olmalıdır.\nBu durumu yüklemek, oyunun ve/veya emülatörün çökmesine neden olabilir.\n\nYüklemeye devam etmek istediğinize emin misiniz?"
#2025# "Hata"
#2026# "Telif hakkı dizisi LUT'ta bulunamadı. Oyun artık çalışmayacak."
#2027# "Kopya Koruma Hatası"
#2028# "Bir eklentiyi değiştirmek için Project64'ün çalışan bir ROM'u yeniden başlatması gerekiyor.\nEğer oyundaki yerinizi kaybetmek istemiyorsanız Hayır cevabını verin ve öncelikle mevcut durumu kaydedin.\n\nEklentiler değiştirilip ROM yeniden başlatılsın mı?"
#2029# "Eklentileri Değiştir"
#2030# "Emülasyon sona erdi"
#2031# "Emülasyon başladı"
#2032# "Durum yüklenemedi"
#2033# "Yüklü durum"
#2034# "Kaydedilen mevcut durum"
#2035# "Durum yuvası"
#2036# "İmaj byte değiştirme"
#2037# "N64 imajı seç"
#2038# "Yüklendi"
#2039# "İmaj yükleniyor"
#2040# "Eklentiler başarıyla başlatılmadığından ROM açılamıyor."
#2041# "Bunu gerçekten silmek istediğinize emin misiniz?"
#2042# "Hileyi Sil"
#2043# "Hile adı zaten kullanılıyor."
#2044# "Bu ROM için maksimum hile sınırına ulaştınız."
#2045# "Eklenti başlatılıyor"
#2046# "Menü öğesine atamak için bir sanal anahtar seçmediniz."
#2047# "Bu anahtarı atamak için bir menü öğesi seçmeniz gerekiyor."
#2048# "Kısayol zaten başka bir menü öğesine atanmış."
#2049# "Kaldırılacak kısayol seçilmedi."
#2050# "ROM yüklendi. Emülasyonun başlaması bekleniyor."
#2051# "Project64'ün beta sürümleri sadece üyeler içindir.\n\nEğer www.pj64-emu.com adresinde bir hesabınız varsa, bu hatayı görmemelisiniz!!\nLütfen siteden bize ulaşın."
#2052# "Program Hatası"
#2053# "7z dosyasında dosya adı bulunamadı"
#2054# "Grafik Düşük Seviye Emülasyon"
#2055# "Grafik DSE genel kullanım için değildir!!!\nBunu sadece test yapmak için kullanmanız ve oyun oynamak için kullanmamanız önerilir.\n\nGrafik DSE'ye değiştirilsin mi?"
#2056# "Ses Yüksek Seviye Emülasyon"
#2057# "Ses YSE üçüncü taraf bir eklenti gerektirir !!!\nEğer YSE'yi destekleyen bir üçüncü taraf ses eklentisi kullanmazsanız, ses duyamazsınız.\n\nSes YSE'ye değiştirilsin mi?"
#2058# "Yüklenen dosya geçerli bir 64DD IPL ROM'u gibi görünmüyor.\n\nROM'larınızı GoodN64 ile doğrulayın."
#2059# "Nintendo 64DD Japon IPL ROM'u bulunamadı.\nBu, Japon 64DD imaj görüntülerini oynatmak için gerekir.\n\nLütfen Ayarlar'dan istediğiniz ROM'u seçin."
#2061# "Nintendo 64DD Amerikan IPL ROM'u bulunamadı.\nBu, Amerikan 64DD imaj görüntülerini oynatmak için gerekir.\n\nLütfen Ayarlar'dan istediğiniz ROM'u seçin."
#2062# "Nintendo 64DD Geliştirme IPL ROM'u bulunamadı.\nBu, Geliştirme 64DD imaj görüntülerini oynatmak için gerekir.\n\nLütfen Ayarlar'dan istediğiniz ROM'u seçin."
/*********************************************************************************
* Android *
*********************************************************************************/
#3000# "Ayarlar"
#3001# "Yardım/Forum"
#3002# "Sorun Bildir"
#3003# "Hakkında"
#3004# "Son oynanılan"
#3005# "Oyunlar"
#3006# "Oyun Dizini"
#3007# "Taranacak bir klasör seç"
#3008# "Alt dizinleri dahil et"
#3009# "Ana klasör"
#3010# "Dizinler"
#3011# "Dahili bellek"
#3012# "Taranıyor..."
#3013# "Tamam"
#3014# "İptal"
#3015# "Bilgi"
#3016# "Android için Project64"
#3017# "Lisans"
#3018# "Revizyon"
#3019# "Android\u2122 için Project64, project64'ün Windows sürümünün bir bağlantı noktasıdır. Android\u2122 sürümü çoğu N64 oyununu oynatabilir."
#3020# "Project64 Yazarları."
#3021# "Discord"
//In game menu
#3100# "Ayarlar"
#3101# "Durumu Kaydet"
#3102# "Durumu Yükle"
#3103# "Emülasyonu Sonlandır"
#3104# "Duraklat"
#3105# "Devam et"
#3106# "Oyun Hızı"
#3107# "Mevcut Durum Kaydı..."
#3108# "Otomatik"
#3109# "Yuva"
#3110# "Yeniden başlat"
#3111# "Hata Ayıklama Seçenekleri"
#3112# "Metot Zamanlayıcılarını Sıfırla"
#3113# "Döküm Metodu Zamanlayıcıları"

View File

@ -1,26 +1,34 @@
# Project 64
Project64 is an N64 emulator for Windows and Android.
Project64 is a N64 emulator for Windows and Android.
## Installation
<sub>(note: ROMs will need to be downloaded separately)</sub>
## How to use
<sub>(Games not included - do not ask for ROMs.)</sub>
### Windows
An executable file for the most recent version of Project64 can be downloaded [here](https://www.pj64-emu.com/download/project64-latest).
Installer for the latest stable release: https://www.pj64-emu.com/download/project64-latest
Follow the instructions in the setup window to complete the installation.
##### System Requirements
<li>Operating system: Windows XP (or higher)</li>
<li>CPU: Any SSE2 CPU</li>
<li>RAM: 512MB or more</li>
<li>Graphics card: DirectX 9 card or higher</li>
#### System Requirements
* Operating system: Windows XP (or higher)
* CPU: Any SSE2 CPU
* RAM: 512MB or more
* Graphics card: DirectX 9 card or higher
### Android
Project64 is available for free in the Google Play store. The [Project 64 app](https://play.google.com/store/apps/details?id=emu.project64&hl=en&rdid=emu.project64&pli=1) can be downloaded to an Android phone or tablet.
Allow the requested permissions on your device as Project64 needs to be able to read your device's storage to read game files, save states, and configuration in order to run.
### Development Builds
Development Builds are based off the latest source at GitHub. This allows you to use the latest changes straight away, tho these changes may not be fully tested and have issues.
Official buildbot (Windows and Android): https://www.pj64-emu.com/nightly-builds
AppVeyor (Windows x86/x64): [![Build status](https://ci.appveyor.com/api/projects/status/sbtwyhaexslyhgx3?svg=true
)](https://ci.appveyor.com/project/project64/project64/branch/master)
<sub>Please note: x64 builds are **not** recommended for regular use! They are incomplete and very experimental, and currently _slower_ than 32-bit builds.</sub>
### License
Project64 is licensed under the

View File

@ -58,9 +58,7 @@ void PluginInit(void)
SetupTrace();
SetupAudioSettings();
StartTrace();
#ifdef _WIN32
SetTimerResolution();
#endif
//SetTimerResolution();
g_PluginInit = true;
}
@ -224,6 +222,9 @@ EXPORT int32_t CALL InitiateAudio(AUDIO_INFO Audio_Info)
g_SoundDriver->AI_Shutdown();
delete g_SoundDriver;
}
#ifdef _WIN32
SetTimerResolution();
#endif
g_AudioInfo = Audio_Info;
#ifdef _WIN32
g_SoundDriver = new DirectSoundDriver;

View File

@ -250,13 +250,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
Jump_Special[45] = SPECIAL_DADDU;
Jump_Special[46] = SPECIAL_DSUB;
Jump_Special[47] = SPECIAL_DSUBU;
Jump_Special[48] = UnknownOpcode;
Jump_Special[49] = UnknownOpcode;
Jump_Special[50] = UnknownOpcode;
Jump_Special[51] = UnknownOpcode;
Jump_Special[48] = SPECIAL_TGE;
Jump_Special[49] = SPECIAL_TGEU;
Jump_Special[50] = SPECIAL_TLT;
Jump_Special[51] = SPECIAL_TLTU;
Jump_Special[52] = SPECIAL_TEQ;
Jump_Special[53] = UnknownOpcode;
Jump_Special[54] = UnknownOpcode;
Jump_Special[54] = SPECIAL_TNE;
Jump_Special[55] = UnknownOpcode;
Jump_Special[56] = SPECIAL_DSLL;
Jump_Special[57] = UnknownOpcode;
@ -275,13 +275,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
Jump_Regimm[5] = UnknownOpcode;
Jump_Regimm[6] = UnknownOpcode;
Jump_Regimm[7] = UnknownOpcode;
Jump_Regimm[8] = UnknownOpcode;
Jump_Regimm[9] = UnknownOpcode;
Jump_Regimm[10] = UnknownOpcode;
Jump_Regimm[11] = UnknownOpcode;
Jump_Regimm[12] = UnknownOpcode;
Jump_Regimm[8] = REGIMM_TGEI;
Jump_Regimm[9] = REGIMM_TGEIU;
Jump_Regimm[10] = REGIMM_TLTI;
Jump_Regimm[11] = REGIMM_TLTIU;
Jump_Regimm[12] = REGIMM_TEQI;
Jump_Regimm[13] = UnknownOpcode;
Jump_Regimm[14] = UnknownOpcode;
Jump_Regimm[14] = REGIMM_TNEI;
Jump_Regimm[15] = UnknownOpcode;
Jump_Regimm[16] = REGIMM_BLTZAL;
Jump_Regimm[17] = REGIMM_BGEZAL;
@ -2048,9 +2048,49 @@ void R4300iOp::SPECIAL_DSUBU()
void R4300iOp::SPECIAL_TEQ()
{
if (_GPR[m_Opcode.rs].DW == _GPR[m_Opcode.rt].DW && HaveDebugger())
if (_GPR[m_Opcode.rs].DW == _GPR[m_Opcode.rt].DW)
{
g_Notify->DisplayError("Should trap this ???");
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::SPECIAL_TGE()
{
if (_GPR[m_Opcode.rs].DW >= _GPR[m_Opcode.rt].DW)
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::SPECIAL_TGEU()
{
if (_GPR[m_Opcode.rs].UDW >= _GPR[m_Opcode.rt].UDW)
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::SPECIAL_TLT()
{
if (_GPR[m_Opcode.rs].DW < _GPR[m_Opcode.rt].DW)
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::SPECIAL_TLTU()
{
if (_GPR[m_Opcode.rs].UDW < _GPR[m_Opcode.rt].UDW)
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::SPECIAL_TNE()
{
if (_GPR[m_Opcode.rs].DW != _GPR[m_Opcode.rt].DW)
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
@ -2220,6 +2260,63 @@ void R4300iOp::REGIMM_BGEZAL()
}
_GPR[31].DW = (int32_t)((*_PROGRAM_COUNTER) + 8);
}
void R4300iOp::REGIMM_TEQI()
{
if (_GPR[m_Opcode.rs].DW == (int64_t)((int16_t)m_Opcode.immediate))
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::REGIMM_TGEI()
{
if (_GPR[m_Opcode.rs].DW >= (int64_t)((int16_t)m_Opcode.immediate))
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::REGIMM_TGEIU()
{
int32_t imm32 = (int16_t)m_Opcode.immediate;
int64_t imm64;
imm64 = imm32;
if (_GPR[m_Opcode.rs].DW >= (uint64_t)imm64)
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::REGIMM_TLTI()
{
if (_GPR[m_Opcode.rs].DW < (int64_t)((int16_t)m_Opcode.immediate))
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::REGIMM_TLTIU()
{
int32_t imm32 = (int16_t)m_Opcode.immediate;
int64_t imm64;
imm64 = imm32;
if (_GPR[m_Opcode.rs].DW < (uint64_t)imm64)
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
void R4300iOp::REGIMM_TNEI()
{
if (_GPR[m_Opcode.rs].DW != (int64_t)((int16_t)m_Opcode.immediate))
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
}
}
/************************** COP0 functions **************************/
void R4300iOp::COP0_MF()
{

View File

@ -110,7 +110,12 @@ public:
static void SPECIAL_DADDU();
static void SPECIAL_DSUB();
static void SPECIAL_DSUBU();
static void SPECIAL_TGE();
static void SPECIAL_TGEU();
static void SPECIAL_TLT();
static void SPECIAL_TLTU();
static void SPECIAL_TEQ();
static void SPECIAL_TNE();
static void SPECIAL_DSLL();
static void SPECIAL_DSRL();
static void SPECIAL_DSRA();
@ -125,6 +130,12 @@ public:
static void REGIMM_BGEZL();
static void REGIMM_BLTZAL();
static void REGIMM_BGEZAL();
static void REGIMM_TEQI();
static void REGIMM_TGEI();
static void REGIMM_TGEIU();
static void REGIMM_TLTI();
static void REGIMM_TLTIU();
static void REGIMM_TNEI();
/************************** COP0 functions **************************/
static void COP0_MF();

View File

@ -155,13 +155,13 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_Special[45] = R4300iOp::SPECIAL_DADDU;
Jump_Special[46] = R4300iOp::SPECIAL_DSUB;
Jump_Special[47] = R4300iOp::SPECIAL_DSUBU;
Jump_Special[48] = R4300iOp::UnknownOpcode;
Jump_Special[49] = R4300iOp::UnknownOpcode;
Jump_Special[50] = R4300iOp::UnknownOpcode;
Jump_Special[51] = R4300iOp::UnknownOpcode;
Jump_Special[48] = R4300iOp::SPECIAL_TGE;
Jump_Special[49] = R4300iOp::SPECIAL_TGEU;
Jump_Special[50] = R4300iOp::SPECIAL_TLT;
Jump_Special[51] = R4300iOp::SPECIAL_TLTU;
Jump_Special[52] = R4300iOp::SPECIAL_TEQ;
Jump_Special[53] = R4300iOp::UnknownOpcode;
Jump_Special[54] = R4300iOp::UnknownOpcode;
Jump_Special[54] = R4300iOp::SPECIAL_TNE;
Jump_Special[55] = R4300iOp::UnknownOpcode;
Jump_Special[56] = R4300iOp::SPECIAL_DSLL;
Jump_Special[57] = R4300iOp::UnknownOpcode;
@ -180,13 +180,13 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_Regimm[5] = R4300iOp::UnknownOpcode;
Jump_Regimm[6] = R4300iOp::UnknownOpcode;
Jump_Regimm[7] = R4300iOp::UnknownOpcode;
Jump_Regimm[8] = R4300iOp::UnknownOpcode;
Jump_Regimm[9] = R4300iOp::UnknownOpcode;
Jump_Regimm[10] = R4300iOp::UnknownOpcode;
Jump_Regimm[11] = R4300iOp::UnknownOpcode;
Jump_Regimm[12] = R4300iOp::UnknownOpcode;
Jump_Regimm[8] = R4300iOp::REGIMM_TGEI;
Jump_Regimm[9] = R4300iOp::REGIMM_TGEIU;
Jump_Regimm[10] = R4300iOp::REGIMM_TLTI;
Jump_Regimm[11] = R4300iOp::REGIMM_TLTIU;
Jump_Regimm[12] = R4300iOp::REGIMM_TEQI;
Jump_Regimm[13] = R4300iOp::UnknownOpcode;
Jump_Regimm[14] = R4300iOp::UnknownOpcode;
Jump_Regimm[14] = R4300iOp::REGIMM_TNEI;
Jump_Regimm[15] = R4300iOp::UnknownOpcode;
Jump_Regimm[16] = REGIMM_BLTZAL;
Jump_Regimm[17] = REGIMM_BGEZAL;

View File

@ -438,6 +438,22 @@ void CRegisters::DoBreakException(bool DelaySlot)
m_PROGRAM_COUNTER = 0x80000180;
}
void CRegisters::DoTrapException(bool DelaySlot)
{
CAUSE_REGISTER = EXC_TRAP;
if (DelaySlot)
{
EPC_REGISTER = m_PROGRAM_COUNTER - 4;
CAUSE_REGISTER |= CAUSE_BD;
}
else
{
EPC_REGISTER = m_PROGRAM_COUNTER;
}
m_PROGRAM_COUNTER = 0x80000180;
}
void CRegisters::DoCopUnusableException(bool DelaySlot, int Coprocessor)
{
if (HaveDebugger())

View File

@ -631,6 +631,7 @@ public:
void CheckInterrupts ();
void DoAddressError ( bool DelaySlot, uint32_t BadVaddr, bool FromRead );
void DoBreakException ( bool DelaySlot );
void DoTrapException ( bool DelaySlot );
void DoCopUnusableException ( bool DelaySlot, int32_t Coprocessor );
bool DoIntrException ( bool DelaySlot );
void DoTLBReadMiss ( bool DelaySlot, uint32_t BadVaddr );

View File

@ -105,6 +105,77 @@ CArmRecompilerOps::CArmRecompilerOps() :
bool DelaySlotEffectsCompare(uint32_t PC, uint32_t Reg1, uint32_t Reg2);
void CArmRecompilerOps::Compile_TrapCompare(TRAP_COMPARE CompareType)
{
void *FunctAddress = NULL;
const char *FunctName = NULL;
switch (CompareType)
{
case CompareTypeTEQ:
FunctAddress = (void*)R4300iOp::SPECIAL_TEQ;
FunctName = "R4300iOp::SPECIAL_TEQ";
break;
case CompareTypeTNE:
FunctAddress = (void*)R4300iOp::SPECIAL_TNE;
FunctName = "R4300iOp::SPECIAL_TNE";
break;
case CompareTypeTGE:
FunctAddress = (void*)R4300iOp::SPECIAL_TGE;
FunctName = "R4300iOp::SPECIAL_TGE";
break;
case CompareTypeTGEU:
FunctAddress = (void*)R4300iOp::SPECIAL_TGEU;
FunctName = "R4300iOp::SPECIAL_TGEU";
break;
case CompareTypeTLT:
FunctAddress = (void*)R4300iOp::SPECIAL_TLT;
FunctName = "R4300iOp::SPECIAL_TLT";
break;
case CompareTypeTLTU:
FunctAddress = (void*)R4300iOp::SPECIAL_TLTU;
FunctName = "R4300iOp::SPECIAL_TLTU";
break;
case CompareTypeTEQI:
FunctAddress = (void*)R4300iOp::REGIMM_TEQI;
FunctName = "R4300iOp::REGIMM_TEQI";
break;
case CompareTypeTNEI:
FunctAddress = (void*)R4300iOp::REGIMM_TNEI;
FunctName = "R4300iOp::REGIMM_TNEI";
break;
case CompareTypeTGEI:
FunctAddress = (void*)R4300iOp::REGIMM_TGEI;
FunctName = "R4300iOp::REGIMM_TGEI";
break;
case CompareTypeTGEIU:
FunctAddress = (void*)R4300iOp::REGIMM_TGEIU;
FunctName = "R4300iOp::REGIMM_TGEIU";
break;
case CompareTypeTLTI:
FunctAddress = (void*)R4300iOp::REGIMM_TLTI;
FunctName = "R4300iOp::REGIMM_TLTI";
break;
case CompareTypeTLTIU:
FunctAddress = (void*)R4300iOp::REGIMM_TLTIU;
FunctName = "R4300iOp::REGIMM_TLTIU";
break;
default:
g_Notify->BreakPoint(__FILE__, __LINE__);
}
if (FunctName != NULL && FunctAddress != NULL)
{
if (m_Opcode.rs != 0) { WriteBack_GPR(m_Opcode.rs, false); }
if (m_Opcode.rt != 0) { WriteBack_GPR(m_Opcode.rt, false); }
CompileInterpterCall(FunctAddress, FunctName);
}
else
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
}
/************************** Branch functions ************************/
void CArmRecompilerOps::Compile_BranchCompare(BRANCH_COMPARE CompareType)
{

View File

@ -22,6 +22,9 @@ class CArmRecompilerOps :
public:
CArmRecompilerOps();
/*************************** Trap functions *************************/
void Compile_TrapCompare(TRAP_COMPARE CompareType);
/************************** Branch functions ************************/
void Compile_BranchCompare(BRANCH_COMPARE CompareType);
void Compile_Branch(BRANCH_COMPARE CompareType, BRANCH_TYPE BranchType, bool Link);

View File

@ -475,7 +475,9 @@ bool CCodeBlock::AnalyzeInstruction(uint32_t PC, uint32_t & TargetPC, uint32_t &
case R4300i_SPECIAL_DSLL32: case R4300i_SPECIAL_DSRL32: case R4300i_SPECIAL_DSRA32:
case R4300i_SPECIAL_MULT: case R4300i_SPECIAL_MULTU: case R4300i_SPECIAL_DIV:
case R4300i_SPECIAL_DIVU: case R4300i_SPECIAL_DMULT: case R4300i_SPECIAL_DMULTU:
case R4300i_SPECIAL_DDIV: case R4300i_SPECIAL_DDIVU:
case R4300i_SPECIAL_DDIV: case R4300i_SPECIAL_DDIVU: case R4300i_SPECIAL_TEQ:
case R4300i_SPECIAL_TNE: case R4300i_SPECIAL_TGE: case R4300i_SPECIAL_TGEU:
case R4300i_SPECIAL_TLT: case R4300i_SPECIAL_TLTU:
break;
case R4300i_SPECIAL_JALR:
case R4300i_SPECIAL_JR:
@ -556,6 +558,9 @@ bool CCodeBlock::AnalyzeInstruction(uint32_t PC, uint32_t & TargetPC, uint32_t &
LikelyBranch = true;
IncludeDelaySlot = true;
break;
case R4300i_REGIMM_TEQI: case R4300i_REGIMM_TNEI: case R4300i_REGIMM_TGEI:
case R4300i_REGIMM_TGEIU: case R4300i_REGIMM_TLTI: case R4300i_REGIMM_TLTIU:
break;
default:
if (Command.Hex == 0x0407000D)
{

View File

@ -583,6 +583,13 @@ bool CCodeSection::GenerateNativeCode(uint32_t Test)
case R4300i_SPECIAL_DSLL32: m_RecompilerOps->SPECIAL_DSLL32(); break;
case R4300i_SPECIAL_DSRL32: m_RecompilerOps->SPECIAL_DSRL32(); break;
case R4300i_SPECIAL_DSRA32: m_RecompilerOps->SPECIAL_DSRA32(); break;
case R4300i_SPECIAL_TEQ: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTEQ); break;
case R4300i_SPECIAL_TNE: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTNE); break;
case R4300i_SPECIAL_TGE: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTGE); break;
case R4300i_SPECIAL_TGEU: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTGEU); break;
case R4300i_SPECIAL_TLT: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTLT); break;
case R4300i_SPECIAL_TLTU: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTLTU); break;
break;
default:
m_RecompilerOps->UnknownOpcode(); break;
}
@ -596,6 +603,12 @@ bool CCodeSection::GenerateNativeCode(uint32_t Test)
case R4300i_REGIMM_BGEZL: m_RecompilerOps->Compile_BranchLikely(CRecompilerOps::CompareTypeBGEZ, false); break;
case R4300i_REGIMM_BLTZAL: m_RecompilerOps->Compile_Branch(CRecompilerOps::CompareTypeBLTZ, CRecompilerOps::BranchTypeRs, true); break;
case R4300i_REGIMM_BGEZAL: m_RecompilerOps->Compile_Branch(CRecompilerOps::CompareTypeBGEZ, CRecompilerOps::BranchTypeRs, true); break;
case R4300i_REGIMM_TEQI: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTEQI); break;
case R4300i_REGIMM_TNEI: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTNEI); break;
case R4300i_REGIMM_TGEI: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTGEI); break;
case R4300i_REGIMM_TGEIU: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTGEIU); break;
case R4300i_REGIMM_TLTI: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTLTI); break;
case R4300i_REGIMM_TLTIU: m_RecompilerOps->Compile_TrapCompare(CRecompilerOps::TRAP_COMPARE::CompareTypeTLTIU); break;
default:
m_RecompilerOps->UnknownOpcode(); break;
}

View File

@ -238,6 +238,9 @@ bool LoopAnalysis::CheckLoopRegisterUsage(CCodeSection * Section)
case R4300i_SPECIAL_DSLL32: SPECIAL_DSLL32(); break;
case R4300i_SPECIAL_DSRL32: SPECIAL_DSRL32(); break;
case R4300i_SPECIAL_DSRA32: SPECIAL_DSRA32(); break;
case R4300i_SPECIAL_TEQ: case R4300i_SPECIAL_TNE: case R4300i_SPECIAL_TGE:
case R4300i_SPECIAL_TGEU: case R4300i_SPECIAL_TLT: case R4300i_SPECIAL_TLTU:
break;
default:
g_Notify->BreakPoint(__FILE__, __LINE__);
#ifdef legacycode
@ -252,6 +255,9 @@ bool LoopAnalysis::CheckLoopRegisterUsage(CCodeSection * Section)
case R4300i_REGIMM:
switch (m_Command.rt)
{
case R4300i_REGIMM_TEQI: case R4300i_REGIMM_TNEI: case R4300i_REGIMM_TGEI:
case R4300i_REGIMM_TGEIU: case R4300i_REGIMM_TLTI: case R4300i_REGIMM_TLTIU:
break;
case R4300i_REGIMM_BLTZ:
case R4300i_REGIMM_BGEZ:
m_NextInstruction = DELAY_SLOT;

View File

@ -35,6 +35,24 @@ public:
CompareTypeCOP1BCF,
CompareTypeCOP1BCT,
};
enum TRAP_COMPARE
{
CompareTypeTEQ,
CompareTypeTNE,
CompareTypeTGE,
CompareTypeTGEU,
CompareTypeTLT,
CompareTypeTLTU,
CompareTypeTEQI,
CompareTypeTNEI,
CompareTypeTGEI,
CompareTypeTGEIU,
CompareTypeTLTI,
CompareTypeTLTIU,
};
/*************************** Trap functions *************************/
virtual void Compile_TrapCompare(TRAP_COMPARE CompareType) = 0;
/************************** Branch functions ************************/
virtual void Compile_Branch(BRANCH_COMPARE CompareType, BRANCH_TYPE BranchType, bool Link) = 0;

View File

@ -361,6 +361,84 @@ void CX86RecompilerOps::CompileWriteTLBMiss(x86Reg AddressReg, x86Reg LookUpReg)
bool DelaySlotEffectsCompare(uint32_t PC, uint32_t Reg1, uint32_t Reg2);
/*************************** Trap functions *************************/
void CX86RecompilerOps::Compile_TrapCompare(TRAP_COMPARE CompareType)
{
void *FunctAddress = NULL;
const char *FunctName = NULL;
switch (CompareType)
{
case CompareTypeTEQ:
FunctAddress = (void*)R4300iOp::SPECIAL_TEQ;
FunctName = "R4300iOp::SPECIAL_TEQ";
break;
case CompareTypeTNE:
FunctAddress = (void*)R4300iOp::SPECIAL_TNE;
FunctName = "R4300iOp::SPECIAL_TNE";
break;
case CompareTypeTGE:
FunctAddress = (void*)R4300iOp::SPECIAL_TGE;
FunctName = "R4300iOp::SPECIAL_TGE";
break;
case CompareTypeTGEU:
FunctAddress = (void*)R4300iOp::SPECIAL_TGEU;
FunctName = "R4300iOp::SPECIAL_TGEU";
break;
case CompareTypeTLT:
FunctAddress = (void*)R4300iOp::SPECIAL_TLT;
FunctName = "R4300iOp::SPECIAL_TLT";
break;
case CompareTypeTLTU:
FunctAddress = (void*)R4300iOp::SPECIAL_TLTU;
FunctName = "R4300iOp::SPECIAL_TLTU";
break;
case CompareTypeTEQI:
FunctAddress = (void*)R4300iOp::REGIMM_TEQI;
FunctName = "R4300iOp::REGIMM_TEQI";
break;
case CompareTypeTNEI:
FunctAddress = (void*)R4300iOp::REGIMM_TNEI;
FunctName = "R4300iOp::REGIMM_TNEI";
break;
case CompareTypeTGEI:
FunctAddress = (void*)R4300iOp::REGIMM_TGEI;
FunctName = "R4300iOp::REGIMM_TGEI";
break;
case CompareTypeTGEIU:
FunctAddress = (void*)R4300iOp::REGIMM_TGEIU;
FunctName = "R4300iOp::REGIMM_TGEIU";
break;
case CompareTypeTLTI:
FunctAddress = (void*)R4300iOp::REGIMM_TLTI;
FunctName = "R4300iOp::REGIMM_TLTI";
break;
case CompareTypeTLTIU:
FunctAddress = (void*)R4300iOp::REGIMM_TLTIU;
FunctName = "R4300iOp::REGIMM_TLTIU";
break;
default:
g_Notify->BreakPoint(__FILE__, __LINE__);
}
if (FunctName != NULL && FunctAddress != NULL)
{
if (IsMapped(m_Opcode.rs)) {
UnMap_GPR(m_Opcode.rs, true);
}
if (IsMapped(m_Opcode.rt)) {
UnMap_GPR(m_Opcode.rt, true);
}
m_RegWorkingSet.BeforeCallDirect();
MoveConstToVariable(m_Opcode.Hex, &R4300iOp::m_Opcode.Hex, "R4300iOp::m_Opcode.Hex");
Call_Direct(FunctAddress, FunctName);
m_RegWorkingSet.AfterCallDirect();
}
else
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
}
/************************** Branch functions ************************/
void CX86RecompilerOps::Compile_BranchCompare(BRANCH_COMPARE CompareType)
{

View File

@ -33,6 +33,9 @@ class CX86RecompilerOps :
protected CRecompilerSettings
{
public:
/*************************** Trap functions *************************/
void Compile_TrapCompare(TRAP_COMPARE CompareType);
/************************** Branch functions ************************/
void Compile_BranchCompare(BRANCH_COMPARE CompareType);
void Compile_Branch(BRANCH_COMPARE CompareType, BRANCH_TYPE BranchType, bool Link);

View File

@ -351,7 +351,6 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory)
AddHandler(Debugger_WriteBPExists, new CSettingTypeTempBool(false));
AddHandler(Debugger_ReadBPExists, new CSettingTypeTempBool(false));
AddHandler(Debugger_WaitingForStep, new CSettingTypeTempBool(false));
AddHandler(Debugger_AutoRefreshMemoryView, new CSettingTypeApplication("Debugger", "Auto Refresh Memory View", true));
AddHandler(Debugger_CPULoggingEnabled, new CSettingTypeApplication("Debugger", "Enable CPU Logging", false));
AddHandler(Debugger_CPULogBufferSize, new CSettingTypeApplication("Debugger", "CPU Log Buffer Size", (uint32_t)1024));
AddHandler(Debugger_ExceptionBreakpoints, new CSettingTypeApplication("Debugger", "Exception Breakpoints", (uint32_t)0));

View File

@ -262,7 +262,6 @@ enum SettingID
Debugger_WriteBPExists,
Debugger_ReadBPExists,
Debugger_WaitingForStep,
Debugger_AutoRefreshMemoryView,
Debugger_CPULoggingEnabled,
Debugger_CPULogBufferSize,
Debugger_ExceptionBreakpoints,

View File

@ -99,6 +99,7 @@
<ClCompile Include="UserInterface\Debugger\Debugger-TLB.cpp" />
<ClCompile Include="UserInterface\Debugger\Debugger-ViewMemory.cpp" />
<ClCompile Include="UserInterface\Debugger\Debugger.cpp" />
<ClCompile Include="UserInterface\Debugger\DebugMMU.cpp" />
<ClCompile Include="UserInterface\Debugger\DMALog.cpp" />
<ClCompile Include="UserInterface\Debugger\MemoryScanner.cpp" />
<ClCompile Include="UserInterface\Debugger\ScriptHook.cpp" />
@ -132,6 +133,7 @@
<ClCompile Include="UserInterface\SupportEnterCode.cpp" />
<ClCompile Include="UserInterface\SupportWindow.cpp" />
<ClCompile Include="UserInterface\WTLControls\EditNumber32.cpp" />
<ClCompile Include="UserInterface\WTLControls\HexEditCtrl.cpp" />
<ClCompile Include="UserInterface\WTLControls\ModifiedEditBox.cpp" />
<ClCompile Include="UserInterface\WTLControls\PartialGroupBox.cpp" />
</ItemGroup>
@ -168,6 +170,7 @@
<ClInclude Include="UserInterface\Debugger\Debugger-ViewMemory.h" />
<ClInclude Include="UserInterface\Debugger\debugger.h" />
<ClInclude Include="UserInterface\Debugger\DebuggerUI.h" />
<ClInclude Include="UserInterface\Debugger\DebugMMU.h" />
<ClInclude Include="UserInterface\Debugger\DMALog.h" />
<ClInclude Include="UserInterface\Debugger\MemoryScanner.h" />
<ClInclude Include="UserInterface\Debugger\OpInfo.h" />
@ -203,6 +206,7 @@
<ClInclude Include="UserInterface\SupportEnterCode.h" />
<ClInclude Include="UserInterface\SupportWindow.h" />
<ClInclude Include="UserInterface\WTLControls\EditNumber32.h" />
<ClInclude Include="UserInterface\WTLControls\HexEditCtrl.h" />
<ClInclude Include="UserInterface\WTLControls\ModifiedCheckBox.h" />
<ClInclude Include="UserInterface\WTLControls\ModifiedComboBox.h" />
<ClInclude Include="UserInterface\WTLControls\ModifiedEditBox.h" />

View File

@ -239,6 +239,11 @@
</ClCompile>
<ClCompile Include="UserInterface\DiscordRPC.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="UserInterface\WTLControls\HexEditCtrl.cpp">
<Filter>Source Files\User Interface Source\WTL Controls Source</Filter>
</ClCompile>
<ClCompile Include="UserInterface\Debugger\DebugMMU.cpp">
<Filter>Source Files\User Interface Source\Debugger Source</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@ -460,6 +465,11 @@
</ClInclude>
<ClInclude Include="UserInterface\DiscordRPC.h">
<Filter>Header Files</Filter>
<ClInclude Include="UserInterface\WTLControls\HexEditCtrl.h">
<Filter>Header Files\User Interface Headers\WTL Controls Headers</Filter>
</ClInclude>
<ClInclude Include="UserInterface\Debugger\DebugMMU.h">
<Filter>Header Files\User Interface Headers\Debugger Headers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>

View File

@ -18,6 +18,7 @@
#include <Project64-core/N64System/N64Class.h>
CBreakpoints::CBreakpoints() :
m_bHaveRegBP(false),
m_GPRWriteBP(0),
m_GPRReadBP(0),
m_HIWriteBP(false),
@ -359,22 +360,17 @@ size_t CBreakpoints::NumMemLocks()
return m_MemLocks.size();
}
bool CBreakpoints::HaveAnyGPRWriteBP(void) { return m_GPRWriteBP != 0; }
bool CBreakpoints::HaveAnyGPRReadBP(void) { return m_GPRReadBP != 0; }
bool CBreakpoints::HaveGPRWriteBP(int nReg) { return (m_GPRWriteBP & (1 << nReg)) != 0; }
bool CBreakpoints::HaveGPRReadBP(int nReg) { return (m_GPRReadBP & (1 << nReg)) != 0; }
void CBreakpoints::ToggleGPRWriteBP(int nReg) { m_GPRWriteBP ^= (1 << nReg); }
void CBreakpoints::ToggleGPRReadBP(int nReg) { m_GPRReadBP ^= (1 << nReg); }
void CBreakpoints::UpdateHaveRegBP(void)
{
m_bHaveRegBP = HaveAnyGPRWriteBP() || HaveAnyGPRReadBP() || HaveHIWriteBP() || HaveHIReadBP() || HaveLOWriteBP() || HaveLOReadBP();
}
bool CBreakpoints::HaveHIWriteBP(void) { return m_HIWriteBP; }
bool CBreakpoints::HaveHIReadBP(void) { return m_HIReadBP; }
bool CBreakpoints::HaveLOWriteBP(void) { return m_LOWriteBP; }
bool CBreakpoints::HaveLOReadBP(void) { return m_LOReadBP; }
void CBreakpoints::ToggleHIWriteBP(void) { m_HIWriteBP = !m_HIWriteBP; }
void CBreakpoints::ToggleHIReadBP(void) { m_HIReadBP = !m_HIReadBP; }
void CBreakpoints::ToggleLOWriteBP(void) { m_LOWriteBP = !m_LOWriteBP; }
void CBreakpoints::ToggleLOReadBP(void) { m_LOReadBP = !m_LOReadBP; }
void CBreakpoints::ToggleGPRWriteBP(int nReg) { m_GPRWriteBP ^= (1 << nReg); UpdateHaveRegBP(); }
void CBreakpoints::ToggleGPRReadBP(int nReg) { m_GPRReadBP ^= (1 << nReg); UpdateHaveRegBP(); }
void CBreakpoints::ToggleHIWriteBP(void) { m_HIWriteBP = !m_HIWriteBP; UpdateHaveRegBP(); }
void CBreakpoints::ToggleHIReadBP(void) { m_HIReadBP = !m_HIReadBP; UpdateHaveRegBP(); }
void CBreakpoints::ToggleLOWriteBP(void) { m_LOWriteBP = !m_LOWriteBP; UpdateHaveRegBP(); }
void CBreakpoints::ToggleLOReadBP(void) { m_LOReadBP = !m_LOReadBP; UpdateHaveRegBP(); }
void CBreakpoints::PreUpdateBP()
{

View File

@ -67,17 +67,19 @@ public:
void ClearMemLocks(void);
size_t NumMemLocks(void);
bool HaveAnyGPRReadBP(void);
bool HaveAnyGPRWriteBP(void);
bool HaveGPRWriteBP(int nReg);
bool HaveGPRReadBP(int nReg);
inline bool HaveRegBP(void) { return m_bHaveRegBP; }
inline bool HaveAnyGPRWriteBP(void) { return m_GPRWriteBP != 0; }
inline bool HaveAnyGPRReadBP(void) { return m_GPRReadBP != 0; }
inline bool HaveGPRWriteBP(int nReg) { return (m_GPRWriteBP & (1 << nReg)) != 0; }
inline bool HaveGPRReadBP(int nReg) { return (m_GPRReadBP & (1 << nReg)) != 0; }
inline bool HaveHIWriteBP(void) { return m_HIWriteBP; }
inline bool HaveHIReadBP(void) { return m_HIReadBP; }
inline bool HaveLOWriteBP(void) { return m_LOWriteBP; }
inline bool HaveLOReadBP(void) { return m_LOReadBP; }
void UpdateHaveRegBP(void);
void ToggleGPRWriteBP(int nReg);
void ToggleGPRReadBP(int nReg);
bool HaveHIWriteBP(void);
bool HaveHIReadBP(void);
bool HaveLOWriteBP(void);
bool HaveLOReadBP(void);
void ToggleHIWriteBP(void);
void ToggleHIReadBP(void);
void ToggleLOWriteBP(void);
@ -95,6 +97,7 @@ private:
memlocks_t m_MemLocks;
bool m_bHaveRegBP;
uint32_t m_GPRWriteBP, m_GPRReadBP;
bool m_HIWriteBP, m_HIReadBP, m_LOWriteBP, m_LOReadBP;
};

View File

@ -0,0 +1,304 @@
#include <stdafx.h>
#include "DebugMMU.h"
#include <Common/MemoryManagement.h>
uint32_t* CDebugMMU::PAddrWordPtr(uint32_t paddr)
{
if (g_MMU == NULL)
{
return NULL;
}
paddr = paddr & ~3;
// RDRAM & DMEM/IMEM
if ((paddr < g_MMU->RdramSize()) ||
(paddr >= 0x04000000 && paddr <= 0x04001FFF))
{
return (uint32_t*)(g_MMU->Rdram() + paddr);
}
// 64DD buffer
if (paddr >= 0x05000000 && paddr <= 0x050004FF)
{
// todo
return NULL;
}
// Cartridge Domain 1 (Address 1) (64DD IPL ROM)
if (paddr >= 0x06000000 && paddr <= 0x06FFFFFF)
{
uint32_t iplRomOffset = paddr - 0x06000000;
if (g_DDRom != NULL && iplRomOffset < g_DDRom->GetRomSize())
{
return (uint32_t*)(g_MMU->Rdram() + paddr);
}
return NULL;
}
// Cartridge Domain 2 (Address 2) (SRAM/FlashRAM)
if (paddr >= 0x08000000 && paddr < 0x08FFFFFF)
{
// stored in a file
return NULL;
}
// Cartridge ROM
if (paddr >= 0x10000000 && paddr <= 0x15FFFFFF)
{
uint32_t cartRomOffset = paddr - 0x10000000;
if (g_Rom != NULL && cartRomOffset < g_Rom->GetRomSize())
{
return (uint32_t*)(g_Rom->GetRomAddress() + cartRomOffset);
}
return false;
}
// PIF ROM
if (paddr >= 0x1FC00000 && paddr <= 0x1FC007BF)
{
return NULL;
}
// PIF RAM
if (paddr >= 0x1FC007C0 && paddr <= 0x1FC007FF)
{
uint32_t pifRamOffset = paddr - 0x1FC007C0;
return (uint32_t*)(g_MMU->PifRam() + pifRamOffset);
}
switch (paddr)
{
case 0x03F00000: return &g_Reg->RDRAM_CONFIG_REG;
case 0x03F00004: return &g_Reg->RDRAM_DEVICE_ID_REG;
case 0x03F00008: return &g_Reg->RDRAM_DELAY_REG;
case 0x03F0000C: return &g_Reg->RDRAM_MODE_REG;
case 0x03F00010: return &g_Reg->RDRAM_REF_INTERVAL_REG;
case 0x03F00014: return &g_Reg->RDRAM_REF_ROW_REG;
case 0x03F00018: return &g_Reg->RDRAM_RAS_INTERVAL_REG;
case 0x03F0001C: return &g_Reg->RDRAM_MIN_INTERVAL_REG;
case 0x03F00020: return &g_Reg->RDRAM_ADDR_SELECT_REG;
case 0x03F00024: return &g_Reg->RDRAM_DEVICE_MANUF_REG;
case 0x04040010: return &g_Reg->SP_STATUS_REG;
case 0x04040014: return &g_Reg->SP_DMA_FULL_REG;
case 0x04040018: return &g_Reg->SP_DMA_BUSY_REG;
case 0x0404001C: return &g_Reg->SP_SEMAPHORE_REG;
case 0x04080000: return &g_Reg->SP_PC_REG;
case 0x0410000C: return &g_Reg->DPC_STATUS_REG;
case 0x04100010: return &g_Reg->DPC_CLOCK_REG;
case 0x04100014: return &g_Reg->DPC_BUFBUSY_REG;
case 0x04100018: return &g_Reg->DPC_PIPEBUSY_REG;
case 0x0410001C: return &g_Reg->DPC_TMEM_REG;
case 0x04300000: return &g_Reg->MI_MODE_REG;
case 0x04300004: return &g_Reg->MI_VERSION_REG;
case 0x04300008: return &g_Reg->MI_INTR_REG;
case 0x0430000C: return &g_Reg->MI_INTR_MASK_REG;
case 0x04400000: return &g_Reg->VI_STATUS_REG;
case 0x04400004: return &g_Reg->VI_ORIGIN_REG;
case 0x04400008: return &g_Reg->VI_WIDTH_REG;
case 0x0440000C: return &g_Reg->VI_INTR_REG;
case 0x04400010: return &g_Reg->VI_V_CURRENT_LINE_REG;
case 0x04400014: return &g_Reg->VI_BURST_REG;
case 0x04400018: return &g_Reg->VI_V_SYNC_REG;
case 0x0440001C: return &g_Reg->VI_H_SYNC_REG;
case 0x04400020: return &g_Reg->VI_LEAP_REG;
case 0x04400024: return &g_Reg->VI_H_START_REG;
case 0x04400028: return &g_Reg->VI_V_START_REG;
case 0x0440002C: return &g_Reg->VI_V_BURST_REG;
case 0x04400030: return &g_Reg->VI_X_SCALE_REG;
case 0x04400034: return &g_Reg->VI_Y_SCALE_REG;
case 0x04600000: return &g_Reg->PI_DRAM_ADDR_REG;
case 0x04600004: return &g_Reg->PI_CART_ADDR_REG;
case 0x04600008: return &g_Reg->PI_RD_LEN_REG;
case 0x0460000C: return &g_Reg->PI_WR_LEN_REG;
case 0x04600010: return &g_Reg->PI_STATUS_REG;
case 0x04600014: return &g_Reg->PI_DOMAIN1_REG;
case 0x04600018: return &g_Reg->PI_BSD_DOM1_PWD_REG;
case 0x0460001C: return &g_Reg->PI_BSD_DOM1_PGS_REG;
case 0x04600020: return &g_Reg->PI_BSD_DOM1_RLS_REG;
case 0x04600024: return &g_Reg->PI_DOMAIN2_REG;
case 0x04600028: return &g_Reg->PI_BSD_DOM2_PWD_REG;
case 0x0460002C: return &g_Reg->PI_BSD_DOM2_PGS_REG;
case 0x04600030: return &g_Reg->PI_BSD_DOM2_RLS_REG;
case 0x04700000: return &g_Reg->RI_MODE_REG;
case 0x04700004: return &g_Reg->RI_CONFIG_REG;
case 0x04700008: return &g_Reg->RI_CURRENT_LOAD_REG;
case 0x0470000C: return &g_Reg->RI_SELECT_REG;
case 0x04700010: return &g_Reg->RI_REFRESH_REG;
case 0x04700014: return &g_Reg->RI_LATENCY_REG;
case 0x04700018: return &g_Reg->RI_RERROR_REG;
case 0x0470001C: return &g_Reg->RI_WERROR_REG;
case 0x04800018: return &g_Reg->SI_STATUS_REG;
case 0x05000500: return &g_Reg->ASIC_DATA;
case 0x05000504: return &g_Reg->ASIC_MISC_REG;
case 0x05000508: return &g_Reg->ASIC_STATUS;
case 0x0500050C: return &g_Reg->ASIC_CUR_TK;
case 0x05000510: return &g_Reg->ASIC_BM_STATUS;
case 0x05000514: return &g_Reg->ASIC_ERR_SECTOR;
case 0x05000518: return &g_Reg->ASIC_SEQ_STATUS;
case 0x0500051C: return &g_Reg->ASIC_CUR_SECTOR;
case 0x05000520: return &g_Reg->ASIC_HARD_RESET;
case 0x05000524: return &g_Reg->ASIC_C1_S0;
case 0x05000528: return &g_Reg->ASIC_HOST_SECBYTE;
case 0x0500052C: return &g_Reg->ASIC_C1_S2;
case 0x05000530: return &g_Reg->ASIC_SEC_BYTE;
case 0x05000534: return &g_Reg->ASIC_C1_S4;
case 0x05000538: return &g_Reg->ASIC_C1_S6;
case 0x0500053C: return &g_Reg->ASIC_CUR_ADDR;
case 0x05000540: return &g_Reg->ASIC_ID_REG;
case 0x05000544: return &g_Reg->ASIC_TEST_REG;
case 0x05000548: return &g_Reg->ASIC_TEST_PIN_SEL;
}
return NULL;
}
bool CDebugMMU::DebugLW_PAddr(uint32_t paddr, uint32_t& value)
{
if (g_MMU == NULL)
{
return false;
}
uint32_t* ptr = PAddrWordPtr(paddr);
if (ptr != NULL)
{
value = *ptr;
return true;
}
if (paddr >= 0x08000000 && paddr < 0x08FFFFFF) // Cartridge Domain 2 (Address 2)
{
uint32_t saveOffset = paddr & 0x000FFFFF;
if (g_System->m_SaveUsing == SaveChip_Sram && saveOffset <= 0x7FFF) // sram
{
uint8_t tmp[4] = "";
CSram *sram = g_MMU->GetSram();
sram->DmaFromSram(tmp, paddr - 0x08000000, 4);
value = tmp[3] << 24 | tmp[2] << 16 | tmp[1] << 8 | tmp[0];
return true;
}
else if (g_System->m_SaveUsing == SaveChip_FlashRam && saveOffset == 0) // flash ram status
{
CFlashram* flashRam = g_MMU->GetFlashram();
value = flashRam->ReadFromFlashStatus(0x08000000);
return true;
}
}
if (paddr == 0x04500004)
{
if (g_System->bFixedAudio())
{
value = g_Audio->GetLength();
}
else
{
CAudioPlugin* audioPlg = g_Plugins->Audio();
value = (audioPlg->AiReadLength != NULL) ? audioPlg->AiReadLength() : 0;
}
return true;
}
if (paddr == 0x0450000C)
{
value = g_System->bFixedAudio() ? g_Audio->GetStatus() : g_Reg->AI_STATUS_REG;
return true;
}
return false;
}
bool CDebugMMU::DebugLW_VAddr(uint32_t vaddr, uint32_t& value)
{
if (vaddr <= 0x7FFFFFFF || vaddr >= 0xC0000000) // KUSEG, KSEG2 (TLB)
{
if (g_MMU == NULL)
{
return false;
}
return g_MMU->LW_VAddr(vaddr, value);
}
uint32_t paddr = vaddr & 0x1FFFFFFF;
return DebugLW_PAddr(paddr, value);
}
bool CDebugMMU::DebugLB_PAddr(uint32_t vaddr, uint8_t& value)
{
uint32_t word;
if (!DebugLW_PAddr(vaddr & ~3, word))
{
return false;
}
value = (word >> (24 - (vaddr & 3) * 8)) & 0xFF;
return true;
}
bool CDebugMMU::DebugLB_VAddr(uint32_t vaddr, uint8_t& value)
{
uint32_t word;
if (!DebugLW_VAddr(vaddr & ~3, word))
{
return false;
}
value = (word >> (24 - (vaddr & 3) * 8)) & 0xFF;
return true;
}
bool CDebugMMU::DebugSB_PAddr(uint32_t paddr, uint8_t value)
{
bool bWriteToRom = false;
if (paddr >= 0x10000000 && paddr <= 0x1FBFFFFF)
{
uint32_t romOffset = paddr - 0x10000000;
if (romOffset > g_Rom->GetRomSize())
{
return false;
}
bWriteToRom = true;
}
int nbyte = 3 - (paddr & 3);
uint8_t* ptr = (uint8_t*)PAddrWordPtr(paddr & ~3);
if (ptr == NULL)
{
return false;
}
if (bWriteToRom)
{
ProtectMemory(g_Rom->GetRomAddress(), g_Rom->GetRomSize(), MEM_READWRITE);
}
ptr[nbyte] = value;
if (bWriteToRom)
{
ProtectMemory(g_Rom->GetRomAddress(), g_Rom->GetRomSize(), MEM_READONLY);
}
return true;
}
bool CDebugMMU::DebugSB_VAddr(uint32_t vaddr, uint8_t value)
{
if (vaddr <= 0x7FFFFFFF || vaddr >= 0xC0000000) // KUSEG, KSEG2 (TLB)
{
if (g_MMU == NULL)
{
return false;
}
return g_MMU->SB_VAddr(vaddr, value);
}
uint32_t paddr = vaddr & 0x1FFFFFFF;
return DebugSB_PAddr(paddr, value);
}

View File

@ -0,0 +1,15 @@
#pragma once
#include <stdafx.h>
class CDebugMMU
{
private:
uint32_t* PAddrWordPtr(uint32_t paddr);
public:
bool DebugLW_PAddr(uint32_t paddr, uint32_t& value);
bool DebugLW_VAddr(uint32_t vaddr, uint32_t& value);
bool DebugLB_PAddr(uint32_t paddr, uint8_t& value);
bool DebugLB_VAddr(uint32_t vaddr, uint8_t& value);
bool DebugSB_PAddr(uint32_t paddr, uint8_t value);
bool DebugSB_VAddr(uint32_t vaddr, uint8_t value);
};

View File

@ -24,28 +24,6 @@ CDebugStackTrace::~CDebugStackTrace()
{
}
void CDebugStackTrace::PushEntry(uint32_t routineAddress, uint32_t callingAddress)
{
if (m_EntriesIndex < STACKTRACE_MAX_ENTRIES)
{
m_Entries[m_EntriesIndex] = { routineAddress, callingAddress };
m_EntriesIndex++;
}
}
void CDebugStackTrace::PopEntry()
{
if (m_EntriesIndex > 0)
{
m_EntriesIndex--;
}
}
void CDebugStackTrace::ClearEntries()
{
m_EntriesIndex = 0;
}
LRESULT CDebugStackTrace::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
DlgResize_Init();

View File

@ -32,9 +32,27 @@ public:
void Refresh();
void PushEntry(uint32_t routineAddress, uint32_t callingAddress);
void PopEntry();
void ClearEntries();
inline void PushEntry(uint32_t routineAddress, uint32_t callingAddress)
{
if (m_EntriesIndex < STACKTRACE_MAX_ENTRIES)
{
m_Entries[m_EntriesIndex] = { routineAddress, callingAddress };
m_EntriesIndex++;
}
}
inline void PopEntry()
{
if (m_EntriesIndex > 0)
{
m_EntriesIndex--;
}
}
inline void ClearEntries()
{
m_EntriesIndex = 0;
}
private:

File diff suppressed because it is too large Load Diff

View File

@ -11,9 +11,78 @@
#pragma once
#include "Debugger-AddSymbol.h"
#include <UserInterface/WTLControls/HexEditCtrl.h>
#include <Project64/UserInterface/WTLControls/TooltipDialog.h>
typedef struct
{
NMHDR nmh;
int nItem;
} NMMTRCLICK;
enum
{
MTCN_RCLICK
};
class CMemTabCtrl :
public CWindowImpl<CMemTabCtrl, CTabCtrl>
{
private:
int m_nItemRClick;
public:
CMemTabCtrl() :
m_nItemRClick(-1)
{
}
BOOL Attach(HWND hWndNew)
{
return SubclassWindow(hWndNew);
}
private:
void OnLButtonDblClk(UINT /*nFlags*/, CPoint /*point*/)
{
NMHDR nmh = { m_hWnd, (UINT_PTR)::GetDlgCtrlID(m_hWnd), NM_DBLCLK };
::SendMessage(::GetParent(m_hWnd), WM_NOTIFY, NM_DBLCLK, (LPARAM)&nmh);
}
void OnRButtonDown(UINT /*nFlags*/, CPoint point)
{
TCHITTESTINFO ht = { point, 0};
int nItem = ::SendMessage(m_hWnd, TCM_HITTEST, 0, (LPARAM)&ht);
if (nItem != -1)
{
m_nItemRClick = nItem;
}
}
void OnRButtonUp(UINT /*nFlags*/, CPoint point)
{
TCHITTESTINFO ht = { point, 0 };
int nItem = ::SendMessage(m_hWnd, TCM_HITTEST, 0, (LPARAM)&ht);
if (nItem != -1 && nItem == m_nItemRClick)
{
NMMTRCLICK nmrc = { { m_hWnd, (UINT_PTR)::GetDlgCtrlID(m_hWnd), MTCN_RCLICK }, nItem };
::SendMessage(::GetParent(m_hWnd), WM_NOTIFY, MTCN_RCLICK, (LPARAM)&nmrc);
}
m_nItemRClick = -1;
}
BEGIN_MSG_MAP_EX(CMemTabCtrl)
MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
MSG_WM_RBUTTONDOWN(OnRButtonDown)
MSG_WM_RBUTTONUP(OnRButtonUp)
MSG_WM_RBUTTONDBLCLK(OnRButtonDown)
END_MSG_MAP()
};
class CDebugMemoryView :
public CDebugDialog < CDebugMemoryView >
public CDebugDialog<CDebugMemoryView>,
public CDialogResize<CDebugMemoryView>,
public CToolTipDialog<CDebugMemoryView>
{
public:
enum { IDD = IDD_Debugger_Memory };
@ -21,74 +90,201 @@ public:
CDebugMemoryView(CDebuggerUI * debugger);
virtual ~CDebugMemoryView(void);
void ShowAddress(DWORD Address, bool VAddr);
void ShowAddress(uint32_t address, bool bVirtual);
private:
enum
{
WM_SHOWADDRESS = WM_USER + 1
};
enum
{
COLOR_DEFAULT = RGB(0, 0, 0),
COLOR_READONLY = RGB(0, 100, 0),
BKCOLOR_DEFAULT = RGB(255, 255, 255),
COLOR_CHANGED = RGB(255, 0, 0),
BKCOLOR_HOT = RGB(240, 240, 240),
BKCOLOR_LOCKED = RGB(100, 100, 0),
COLOR_BP = RGB(255, 255, 255),
BKCOLOR_RWBP = RGB(100, 0, 100),
BKCOLOR_RBP = RGB(0, 0, 100),
BKCOLOR_WBP = RGB(100, 0, 0),
BKCOLOR_CPUREAD = RGB(200, 200, 255),
BKCOLOR_CPUWRITE = RGB(255, 200, 200),
BKCOLOR_SYMBOL0 = RGB(208, 240, 208),
BKCOLOR_SYMBOL1 = RGB(176, 208, 176),
BKCOLOR_SAFEEDIT = RGB(255, 230, 255),
COLOR_SAFEEDIT = RGB(255, 0, 255)
};
enum
{
MEMSB_HOTADDR,
MEMSB_BLOCK,
MEMSB_BLOCKLEN,
MEMSB_DMAINFO,
MEMSB_SAFEMODE,
MEMSB_NUM_PANES
};
enum
{
MEMSB_HOTADDR_W = 160,
MEMSB_BLOCK_W = 120 + MEMSB_HOTADDR_W,
MEMSB_BLOCKLEN_W = 60 + MEMSB_BLOCK_W,
MEMSB_DMAINFO_W = 60 + MEMSB_BLOCKLEN_W,
MEMSB_SAFEMODE_W = -1
};
enum edit_type_t
{
SE_FILL,
//SE_DATA
};
typedef struct
{
edit_type_t type;
uint32_t startAddress;
uint32_t endAddress;
uint8_t value;
//uint8_t* data;
} edit_t;
typedef struct
{
uint32_t vaddr;
uint32_t paddr;
uint32_t size;
const char* caption;
} jump_item_t;
typedef struct
{
uint32_t address;
bool bVirtual;
int numBytesPerGroup;
} tab_info_t;
static jump_item_t JumpItems[];
static int GetJumpItemIndex(uint32_t address, bool bVirtual);
CHexEditCtrl m_HexEditCtrl;
CEditNumber32 m_MemAddr;
CAddSymbolDlg m_AddSymbolDlg;
CButton m_VirtualCheckbox;
CMemTabCtrl m_TabCtrl;
CStatusBarCtrl m_StatusBar;
CComboBox m_CmbJump;
std::vector<tab_info_t> m_TabData;
CBreakpoints* m_Breakpoints;
int m_WriteTargetColorStride;
int m_ReadTargetColorStride;
int m_SymbolColorStride;
int m_SymbolColorPhase;
uint32_t m_ContextMenuAddress;
uint32_t m_HotAddress;
bool m_bIgnoreAddressInput;
bool m_bVirtualMemory;
bool m_bSafeEditMode;
std::vector<edit_t> m_SafeEditQueue;
bool GetByte(uint32_t address, uint8_t* value);
bool SetByte(uint32_t address, uint8_t value);
void SetupJumpMenu(bool bVirtual);
bool GetSafeEditValue(uint32_t address, uint8_t* value);
void ApplySafeEdits(void);
void CopyTextToClipboard(const char* text);
void CopyBytesToClipboard(uint32_t startAddress, uint32_t endAddress, bool bHex, bool bIncludeAddresses = false, bool bRowAddresses = false);
void CopyGameSharkCodeToClipboard(uint32_t startAddress, uint32_t endAddress);
void FillRange(uint32_t startAddress, uint32_t endAddress, uint8_t value);
void FollowPointer(bool bContextMenuAddress = true);
void JumpToSelection(void);
int AddTab(uint32_t address, bool bVirtual, int numBytesPerGroup);
int InsertTab(int nItem, uint32_t address, bool bVirtual, int numBytesPerGroup);
void DeleteTab(int index);
void UpdateCurrentTab(uint32_t address);
void OpenNewTab(uint32_t address, bool bVirtual, int numBytesPerGroup, bool bInsert = false, bool bOpenExisting = false);
void OpenDuplicateTab(void);
void CloseTab(int nItem);
void CloseCurrentTab(void);
void TabSelChanged(void);
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnShowAddress(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
void OnAddrChanged(UINT Code, int id, HWND ctl);
void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar);
void OnExitSizeMove(void);
LRESULT OnDestroy(void);
LRESULT OnHxGetByteInfo(LPNMHDR lpNMHDR);
LRESULT OnHxSetNibble(LPNMHDR lpNMHDR);
LRESULT OnHxSetByte(LPNMHDR lpNMHDR);
LRESULT OnHxRightClick(LPNMHDR lpNMHDR);
LRESULT OnHxEnterPressed(LPNMHDR lpNMHDR);
LRESULT OnHxRedrawStarted(LPNMHDR lpNMHDR);
LRESULT OnHxBaseAddrChanged(LPNMHDR lpNMHDR);
LRESULT OnHxHotAddrChanged(LPNMHDR lpNMHDR);
LRESULT OnHxCopy(LPNMHDR lpNMHDR);
LRESULT OnHxPaste(LPNMHDR lpNMHDR);
LRESULT OnHxCtrlKeyPressed(LPNMHDR lpNMHDR);
LRESULT OnHxFillRange(LPNMHDR lpNMHDR);
LRESULT OnHxInsertModeChanged(LPNMHDR lpNMHDR);
LRESULT OnHxSelectionChanged(LPNMHDR lpNMHDR);
LRESULT OnHxGroupSizeChanged(LPNMHDR lpNMHDR);
LRESULT OnTabSelChange(LPNMHDR lpNMHDR);
LRESULT OnTabDblClick(LPNMHDR lpNMHDR);
LRESULT OnTabRClick(LPNMHDR lpNMHDR);
LRESULT OnStatusBarClick(LPNMHDR lpNMHDR);
void OnJumpComboSelChange(UINT uNotifyCode, int nID, CWindow wndCtl);
BEGIN_MSG_MAP_EX(CDebugMemoryView)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_SHOWADDRESS, OnShowAddress)
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
COMMAND_HANDLER_EX(IDC_ADDR_EDIT, EN_CHANGE, OnAddrChanged)
NOTIFY_HANDLER_EX(IDC_MEM_DETAILS, LCN_MODIFIED, OnMemoryModified)
NOTIFY_HANDLER_EX(IDC_MEM_DETAILS, LCN_RIGHTCLICK, OnMemoryRightClicked)
NOTIFY_HANDLER_EX(IDC_MEM_DETAILS, LCN_HOTITEMCHANGED, OnHotItemChanged)
MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)
MSG_WM_EXITSIZEMOVE(OnExitSizeMove)
MSG_WM_DESTROY(OnDestroy)
MSG_WM_VSCROLL(OnVScroll)
COMMAND_HANDLER_EX(IDC_CMB_JUMP, CBN_SELCHANGE, OnJumpComboSelChange)
NOTIFY_HANDLER_EX(IDC_STATUSBAR, NM_CLICK, OnStatusBarClick)
NOTIFY_HANDLER_EX(IDC_MEMTABS, NM_DBLCLK, OnTabDblClick)
NOTIFY_HANDLER_EX(IDC_MEMTABS, TCN_SELCHANGE, OnTabSelChange)
NOTIFY_HANDLER_EX(IDC_MEMTABS, MTCN_RCLICK, OnTabRClick)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_GETBYTEINFO, OnHxGetByteInfo)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_SETNIBBLE, OnHxSetNibble)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_SETBYTE, OnHxSetByte)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_RCLICK, OnHxRightClick)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_HOTADDRCHANGED, OnHxHotAddrChanged)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_REDRAWSTARTED, OnHxRedrawStarted)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_BASEADDRCHANGED, OnHxBaseAddrChanged)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_HOTADDRCHANGED, OnHxHotAddrChanged)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_PASTE, OnHxPaste)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_CTRLKEYPRESSED, OnHxCtrlKeyPressed)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_FILLRANGE, OnHxFillRange)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_COPY, OnHxCopy)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_INSERTMODECHANGED, OnHxInsertModeChanged)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_ENTERPRESSED, OnHxEnterPressed)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_SELCHANGED, OnHxSelectionChanged)
NOTIFY_HANDLER_EX(IDC_HEXEDIT, HXN_GROUPSIZECHANGED, OnHxGroupSizeChanged)
CHAIN_MSG_MAP(CDialogResize<CDebugMemoryView>)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled);
void OnAddrChanged(UINT Code, int id, HWND ctl);
void OnVScroll(int request, short Pos, HWND ctrl);
void OnExitSizeMove(void);
LRESULT OnActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnMemoryModified(LPNMHDR lpNMHDR);
LRESULT OnMemoryRightClicked(LPNMHDR lpNMHDR);
LRESULT OnHotItemChanged(LPNMHDR lpNMHDR);
LRESULT OnDestroy(void);
BEGIN_DLGRESIZE_MAP(CDebugMemoryView)
DLGRESIZE_CONTROL(IDC_CMB_JUMP, DLSZ_MOVE_X)
DLGRESIZE_CONTROL(IDC_STATUSBAR, DLSZ_SIZE_X | DLSZ_MOVE_Y)
DLGRESIZE_CONTROL(IDC_HEXEDIT, DLSZ_SIZE_X | DLSZ_SIZE_Y)
DLGRESIZE_CONTROL(IDC_MEMTABS, DLSZ_SIZE_X)
DLGRESIZE_CONTROL(IDC_SCRL_BAR, DLSZ_MOVE_X | DLSZ_SIZE_Y)
END_DLGRESIZE_MAP()
void Insert_MemoryLineDump(int LineNumber);
void RefreshMemory(bool ResetCompare);
BEGIN_TOOLTIP_MAP()
TOOLTIP(IDC_SYMBOLS_BTN, "Symbols...")
TOOLTIP(IDC_CHK_VADDR, "Checked = Use virtual address space (CPU), Unchecked = Use physical address space (RCP)")
END_TOOLTIP_MAP()
};
HANDLE m_AutoRefreshThread;
static DWORD WINAPI AutoRefreshProc(void* _self);
void SelectColors(uint32_t address, bool changed, COLORREF& bgColor, COLORREF& fgColor, COLORREF& fgHiColor);
bool GetItemOffset(LPNMHDR lpNMHDR, uint32_t &offset);
bool GetItemAddress(LPNMHDR lpNMHDR, uint32_t &address);
void CopyNumber(uint32_t address, int numBytes);
enum { MemoryToDisplay = 0x100 };
static CDebugMemoryView* _this;
static HHOOK hWinMessageHook;
static LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
void InterceptMouseWheel(WPARAM wParam, LPARAM lParam);
CEditNumber32 m_MemAddr;
CListCtrl * m_MemoryList;
CAddSymbolDlg m_AddSymbolDlg;
CStatic m_SymInfo;
CStatic m_DMAInfo;
bool m_bAutoRefreshEnabled;
CBreakpoints* m_Breakpoints;
int m_SymbolColorStride;
int m_SymbolColorPhase;
DWORD m_CtxMenuAddr;
DWORD m_DataStartLoc;
bool m_DataVAddrr;
BYTE m_CurrentData[MemoryToDisplay];
bool m_DataValid[MemoryToDisplay];
DWORD m_CompareStartLoc;
bool m_CompareVAddrr;
BYTE m_CompareData[MemoryToDisplay];
bool m_CompareValid[MemoryToDisplay];
};

View File

@ -233,10 +233,6 @@ void CDebuggerUI::OpenMemoryDump()
void CDebuggerUI::OpenMemoryWindow(void)
{
if (g_MMU == NULL)
{
return;
}
if (m_MemoryView == NULL)
{
m_MemoryView = new CDebugMemoryView(this);
@ -462,192 +458,6 @@ CCPULog* CDebuggerUI::CPULog()
return m_CPULog;
}
// thread safe LW_PAddr
// does not trigger application breakpoint if paddr is invalid
bool CDebuggerUI::DebugLW_PAddr(uint32_t paddr, uint32_t& value)
{
if (g_MMU == NULL)
{
return false;
}
if ((paddr < g_MMU->RdramSize()) || // RDRAM
(paddr >= 0x04000000 && paddr <= 0x04001FFF)) // DMEM/IMEM
{
value = *(uint32_t*)(g_MMU->Rdram() + paddr);
return true;
}
else if (paddr >= 0x05000000 && paddr <= 0x050004FF) // 64DD buffer
{
// todo
return false;
}
else if (paddr >= 0x06000000 && paddr <= 0x06FFFFFF) // Cartridge Domain 1 (Address 1) (64DD IPL ROM)
{
uint32_t iplRomOffset = paddr - 0x06000000;
if (g_DDRom != NULL && iplRomOffset < g_DDRom->GetRomSize())
{
value = *(uint32_t*)(g_MMU->Rdram() + paddr);
return true;
}
}
else if (paddr >= 0x08000000 && paddr < 0x08FFFFFF) // Cartridge Domain 2 (Address 2)
{
uint32_t saveOffset = paddr & 0x000FFFFF;
if (g_System->m_SaveUsing == SaveChip_Sram && saveOffset <= 0x7FFF) // sram
{
uint8_t tmp[4] = "";
CSram *sram = g_MMU->GetSram();
sram->DmaFromSram(tmp, paddr - 0x08000000, 4);
value = tmp[3] << 24 | tmp[2] << 16 | tmp[1] << 8 | tmp[0];
return true;
}
else if (g_System->m_SaveUsing == SaveChip_FlashRam && saveOffset == 0) // flash ram status
{
CFlashram* flashRam = g_MMU->GetFlashram();
value = flashRam->ReadFromFlashStatus(0x08000000);
return true;
}
}
else if (paddr >= 0x10000000 && paddr <= 0x15FFFFFF) // Cartridge ROM
{
uint32_t cartRomOffset = paddr - 0x10000000;
if (g_Rom != NULL && paddr < g_Rom->GetRomSize())
{
value = *(uint32_t*)(g_Rom->GetRomAddress() + cartRomOffset);
return true;
}
}
else if (paddr >= 0x1FC00000 && paddr <= 0x1FC007BF) // PIF ROM
{
return false;
}
else if (paddr >= 0x1FC007C0 && paddr <= 0x1FC007FF) // PIF RAM
{
uint32_t pifRamOffset = paddr - 0x1FC007C0;
value = *(uint32_t*)(g_MMU->PifRam() + pifRamOffset);
return true;
}
// note: write-only registers are excluded
switch (paddr)
{
case 0x03F00000: value = g_Reg->RDRAM_CONFIG_REG; return true;
case 0x03F00004: value = g_Reg->RDRAM_DEVICE_ID_REG; return true;
case 0x03F00008: value = g_Reg->RDRAM_DELAY_REG; return true;
case 0x03F0000C: value = g_Reg->RDRAM_MODE_REG; return true;
case 0x03F00010: value = g_Reg->RDRAM_REF_INTERVAL_REG; return true;
case 0x03F00014: value = g_Reg->RDRAM_REF_ROW_REG; return true;
case 0x03F00018: value = g_Reg->RDRAM_RAS_INTERVAL_REG; return true;
case 0x03F0001C: value = g_Reg->RDRAM_MIN_INTERVAL_REG; return true;
case 0x03F00020: value = g_Reg->RDRAM_ADDR_SELECT_REG; return true;
case 0x03F00024: value = g_Reg->RDRAM_DEVICE_MANUF_REG; return true;
case 0x04040010: value = g_Reg->SP_STATUS_REG; return true;
case 0x04040014: value = g_Reg->SP_DMA_FULL_REG; return true;
case 0x04040018: value = g_Reg->SP_DMA_BUSY_REG; return true;
case 0x0404001C: value = g_Reg->SP_SEMAPHORE_REG; return true;
case 0x04080000: value = g_Reg->SP_PC_REG; return true;
case 0x0410000C: value = g_Reg->DPC_STATUS_REG; return true;
case 0x04100010: value = g_Reg->DPC_CLOCK_REG; return true;
case 0x04100014: value = g_Reg->DPC_BUFBUSY_REG; return true;
case 0x04100018: value = g_Reg->DPC_PIPEBUSY_REG; return true;
case 0x0410001C: value = g_Reg->DPC_TMEM_REG; return true;
case 0x04300000: value = g_Reg->MI_MODE_REG; return true;
case 0x04300004: value = g_Reg->MI_VERSION_REG; return true;
case 0x04300008: value = g_Reg->MI_INTR_REG; return true;
case 0x0430000C: value = g_Reg->MI_INTR_MASK_REG; return true;
case 0x04400000: value = g_Reg->VI_STATUS_REG; return true;
case 0x04400004: value = g_Reg->VI_ORIGIN_REG; return true;
case 0x04400008: value = g_Reg->VI_WIDTH_REG; return true;
case 0x0440000C: value = g_Reg->VI_INTR_REG; return true;
case 0x04400010: value = g_Reg->VI_V_CURRENT_LINE_REG; return true;
case 0x04400014: value = g_Reg->VI_BURST_REG; return true;
case 0x04400018: value = g_Reg->VI_V_SYNC_REG; return true;
case 0x0440001C: value = g_Reg->VI_H_SYNC_REG; return true;
case 0x04400020: value = g_Reg->VI_LEAP_REG; return true;
case 0x04400024: value = g_Reg->VI_H_START_REG; return true;
case 0x04400028: value = g_Reg->VI_V_START_REG; return true;
case 0x0440002C: value = g_Reg->VI_V_BURST_REG; return true;
case 0x04400030: value = g_Reg->VI_X_SCALE_REG; return true;
case 0x04400034: value = g_Reg->VI_Y_SCALE_REG; return true;
case 0x04600000: value = g_Reg->PI_DRAM_ADDR_REG; return true;
case 0x04600004: value = g_Reg->PI_CART_ADDR_REG; return true;
case 0x04600008: value = g_Reg->PI_RD_LEN_REG; return true;
case 0x0460000C: value = g_Reg->PI_WR_LEN_REG; return true;
case 0x04600010: value = g_Reg->PI_STATUS_REG; return true;
case 0x04600014: value = g_Reg->PI_DOMAIN1_REG; return true;
case 0x04600018: value = g_Reg->PI_BSD_DOM1_PWD_REG; return true;
case 0x0460001C: value = g_Reg->PI_BSD_DOM1_PGS_REG; return true;
case 0x04600020: value = g_Reg->PI_BSD_DOM1_RLS_REG; return true;
case 0x04600024: value = g_Reg->PI_DOMAIN2_REG; return true;
case 0x04600028: value = g_Reg->PI_BSD_DOM2_PWD_REG; return true;
case 0x0460002C: value = g_Reg->PI_BSD_DOM2_PGS_REG; return true;
case 0x04600030: value = g_Reg->PI_BSD_DOM2_RLS_REG; return true;
case 0x04700000: value = g_Reg->RI_MODE_REG; return true;
case 0x04700004: value = g_Reg->RI_CONFIG_REG; return true;
case 0x04700008: value = g_Reg->RI_CURRENT_LOAD_REG; return true;
case 0x0470000C: value = g_Reg->RI_SELECT_REG; return true;
case 0x04700010: value = g_Reg->RI_REFRESH_REG; return true;
case 0x04700014: value = g_Reg->RI_LATENCY_REG; return true;
case 0x04700018: value = g_Reg->RI_RERROR_REG; return true;
case 0x0470001C: value = g_Reg->RI_WERROR_REG; return true;
case 0x04800018: value = g_Reg->SI_STATUS_REG; return true;
case 0x05000500: value = g_Reg->ASIC_DATA; return true;
case 0x05000504: value = g_Reg->ASIC_MISC_REG; return true;
case 0x05000508: value = g_Reg->ASIC_STATUS; return true;
case 0x0500050C: value = g_Reg->ASIC_CUR_TK; return true;
case 0x05000510: value = g_Reg->ASIC_BM_STATUS; return true;
case 0x05000514: value = g_Reg->ASIC_ERR_SECTOR; return true;
case 0x05000518: value = g_Reg->ASIC_SEQ_STATUS; return true;
case 0x0500051C: value = g_Reg->ASIC_CUR_SECTOR; return true;
case 0x05000520: value = g_Reg->ASIC_HARD_RESET; return true;
case 0x05000524: value = g_Reg->ASIC_C1_S0; return true;
case 0x05000528: value = g_Reg->ASIC_HOST_SECBYTE; return true;
case 0x0500052C: value = g_Reg->ASIC_C1_S2; return true;
case 0x05000530: value = g_Reg->ASIC_SEC_BYTE; return true;
case 0x05000534: value = g_Reg->ASIC_C1_S4; return true;
case 0x05000538: value = g_Reg->ASIC_C1_S6; return true;
case 0x0500053C: value = g_Reg->ASIC_CUR_ADDR; return true;
case 0x05000540: value = g_Reg->ASIC_ID_REG; return true;
case 0x05000544: value = g_Reg->ASIC_TEST_REG; return true;
case 0x05000548: value = g_Reg->ASIC_TEST_PIN_SEL; return true;
case 0x04500004:
if (g_System->bFixedAudio())
{
value = g_Audio->GetLength();
}
else
{
CAudioPlugin* audioPlg = g_Plugins->Audio();
value = (audioPlg->AiReadLength != NULL) ? audioPlg->AiReadLength() : 0;
}
return true;
case 0x0450000C:
value = g_System->bFixedAudio() ? g_Audio->GetStatus() : g_Reg->AI_STATUS_REG;
return true;
}
return false;
}
bool CDebuggerUI::DebugLW_VAddr(uint32_t vaddr, uint32_t& value)
{
if (vaddr <= 0x7FFFFFFF || vaddr >= 0xC0000000) // KUSEG, KSEG2 (TLB)
{
if (g_MMU == NULL)
{
return false;
}
return g_MMU->LW_VAddr(vaddr, value);
}
uint32_t paddr = vaddr & 0x1FFFFFFF;
return DebugLW_PAddr(paddr, value);
}
// CDebugger implementation
void CDebuggerUI::TLBChanged()
@ -730,19 +540,19 @@ void CDebuggerUI::HandleCartToRamDMA(void)
// Called from the interpreter core at the beginning of every CPU step
void CDebuggerUI::CPUStepStarted()
{
uint32_t pc = g_Reg->m_PROGRAM_COUNTER;
COpInfo opInfo(R4300iOp::m_Opcode);
bool bStoreOp = opInfo.IsStoreCommand();
uint32_t storeAddress = bStoreOp ? opInfo.GetLoadStoreAddress() : 0;
if (isStepping() && bCPULoggingEnabled())
{
Debug_RefreshCPULogWindow();
}
uint32_t pc = g_Reg->m_PROGRAM_COUNTER;
COpInfo opInfo(R4300iOp::m_Opcode);
if (opInfo.IsStoreCommand())
if(bStoreOp && m_Breakpoints->NumMemLocks() > 0)
{
uint32_t memoryAddress = opInfo.GetLoadStoreAddress();
if (m_Breakpoints->MemLockExists(memoryAddress, opInfo.NumBytesToStore()))
if (m_Breakpoints->MemLockExists(storeAddress, opInfo.NumBytesToStore()))
{
// Memory is locked, skip op
g_Settings->SaveBool(Debugger_SkipOp, true);
@ -750,37 +560,35 @@ void CDebuggerUI::CPUStepStarted()
}
}
m_ScriptSystem->HookCPUExec()->InvokeByAddressInRange(pc);
if (SkipOp()) { return; }
m_ScriptSystem->HookCPUExecOpcode()->InvokeByAddressInRange_MaskedOpcode(pc, R4300iOp::m_Opcode.Hex);
if (SkipOp()) { return; }
m_ScriptSystem->HookCPUGPRValue()->InvokeByAddressInRange_GPRValue(pc);
if (SkipOp()) { return; }
// Memory events, pi cart -> ram dma
if (opInfo.IsLoadStoreCommand()) // Read and write instructions
if (m_ScriptSystem->HaveCallbacks())
{
uint32_t memoryAddress = opInfo.GetLoadStoreAddress();
m_ScriptSystem->HookCPUExec()->InvokeByAddressInRange(pc);
if (SkipOp()) { return; }
if (opInfo.IsLoadCommand()) // Read instructions
m_ScriptSystem->HookCPUExecOpcode()->InvokeByAddressInRange_MaskedOpcode(pc, R4300iOp::m_Opcode.Hex);
if (SkipOp()) { return; }
m_ScriptSystem->HookCPUGPRValue()->InvokeByAddressInRange_GPRValue(pc);
if (SkipOp()) { return; }
if (bStoreOp)
{
m_ScriptSystem->HookCPURead()->InvokeByAddressInRange(memoryAddress);
m_ScriptSystem->HookCPUWrite()->InvokeByAddressInRange(storeAddress);
if (SkipOp()) { return; }
}
else // Write instructions
{
m_ScriptSystem->HookCPUWrite()->InvokeByAddressInRange(memoryAddress);
if (SkipOp()) { return; }
if (memoryAddress == 0xA460000C) // PI_WR_LEN_REG
{
HandleCartToRamDMA();
}
if (opInfo.IsLoadCommand())
{
m_ScriptSystem->HookCPURead()->InvokeByAddressInRange(opInfo.GetLoadStoreAddress());
if (SkipOp()) { return; }
}
}
if (bStoreOp && storeAddress == 0xA460000C) // PI_WR_LEN_REG
{
HandleCartToRamDMA();
}
if (CDebugSettings::ExceptionBreakpoints() != 0)
{
if (pc == 0x80000000 || pc == 0x80000080 ||
@ -793,36 +601,39 @@ void CDebuggerUI::CPUStepStarted()
}
}
if (m_Breakpoints->HaveAnyGPRWriteBP())
if (m_Breakpoints->HaveRegBP())
{
int nReg = 0;
opInfo.WritesGPR(&nReg);
if (m_Breakpoints->HaveAnyGPRWriteBP())
{
int nReg = 0;
opInfo.WritesGPR(&nReg);
if (nReg != 0 && m_Breakpoints->HaveGPRWriteBP(nReg))
if (nReg != 0 && m_Breakpoints->HaveGPRWriteBP(nReg))
{
g_Settings->SaveBool(Debugger_SteppingOps, true);
}
}
if (m_Breakpoints->HaveAnyGPRReadBP())
{
int nReg1 = 0, nReg2 = 0;
opInfo.ReadsGPR(&nReg1, &nReg2);
if ((nReg1 != 0 && m_Breakpoints->HaveGPRReadBP(nReg1)) ||
(nReg2 != 0 && m_Breakpoints->HaveGPRReadBP(nReg2)))
{
g_Settings->SaveBool(Debugger_SteppingOps, true);
}
}
if (m_Breakpoints->HaveHIWriteBP() && opInfo.WritesHI() ||
m_Breakpoints->HaveLOWriteBP() && opInfo.WritesLO() ||
m_Breakpoints->HaveHIReadBP() && opInfo.ReadsHI() ||
m_Breakpoints->HaveLOReadBP() && opInfo.ReadsLO())
{
g_Settings->SaveBool(Debugger_SteppingOps, true);
}
}
if (m_Breakpoints->HaveAnyGPRReadBP())
{
int nReg1 = 0, nReg2 = 0;
opInfo.ReadsGPR(&nReg1, &nReg2);
if ((nReg1 != 0 && m_Breakpoints->HaveGPRReadBP(nReg1)) ||
(nReg2 != 0 && m_Breakpoints->HaveGPRReadBP(nReg2)))
{
g_Settings->SaveBool(Debugger_SteppingOps, true);
}
}
if (m_Breakpoints->HaveHIWriteBP() && opInfo.WritesHI() ||
m_Breakpoints->HaveLOWriteBP() && opInfo.WritesLO() ||
m_Breakpoints->HaveHIReadBP() && opInfo.ReadsHI() ||
m_Breakpoints->HaveLOReadBP() && opInfo.ReadsLO())
{
g_Settings->SaveBool(Debugger_SteppingOps, true);
}
}
// Called before opcode is executed (not called if SkipOp is set)
@ -837,15 +648,15 @@ void CDebuggerUI::CPUStep()
// Called after opcode has been executed
void CDebuggerUI::CPUStepEnded()
{
if (m_StackTrace == NULL)
{
return;
}
OPCODE Opcode = R4300iOp::m_Opcode;
uint32_t op = Opcode.op;
uint32_t funct = Opcode.funct;
if (m_StackTrace == NULL)
{
m_StackTrace = new CDebugStackTrace(this);
}
if (op == R4300i_JAL || ((op == R4300i_SPECIAL) && (funct == R4300i_SPECIAL_JALR) && (Opcode.rd == 31))) // JAL or JALR RA, x
{
m_StackTrace->PushEntry(R4300iOp::m_JumpToLocation, g_Reg->m_PROGRAM_COUNTER);

View File

@ -989,9 +989,9 @@ bool CMemoryScanner::NextScan()
int CMemoryScanner::HexDigitVal(char c)
{
if (c >= '0' && c < '9') return (c - '0');
if (c >= 'A' && c < 'F') return (c - 'A') + 0x0A;
if (c >= 'a' && c < 'f') return (c - 'a') + 0x0A;
if (c >= '0' && c <= '9') return (c - '0');
if (c >= 'A' && c <= 'F') return (c - 'A') + 0x0A;
if (c >= 'a' && c <= 'f') return (c - 'a') + 0x0A;
return 0;
}

View File

@ -17,6 +17,7 @@ int CScriptHook::Add(CScriptInstance* scriptInstance, void* heapptr, uint32_t pa
jsCallback.param4 = param4;
jsCallback.bOnce = bOnce;
m_Callbacks.push_back(jsCallback);
m_ScriptSystem->CallbackAdded();
return jsCallback.callbackId;
}
@ -122,6 +123,7 @@ void CScriptHook::RemoveById(int callbackId)
if (m_Callbacks[i].callbackId == callbackId)
{
m_Callbacks.erase(m_Callbacks.begin() + i);
m_ScriptSystem->CallbackRemoved();
return;
}
}
@ -135,6 +137,7 @@ void CScriptHook::RemoveByParam(uint32_t param)
if (m_Callbacks[i].param == param)
{
m_Callbacks.erase(m_Callbacks.begin() + i);
m_ScriptSystem->CallbackRemoved();
return;
}
}
@ -148,6 +151,7 @@ void CScriptHook::RemoveByInstance(CScriptInstance* scriptInstance)
if (m_Callbacks[i].scriptInstance == scriptInstance)
{
m_Callbacks.erase(m_Callbacks.begin() + i);
m_ScriptSystem->CallbackRemoved();
}
}
}

View File

@ -21,6 +21,7 @@ CScriptSystem::CScriptSystem(CDebuggerUI* debugger)
WSAStartup(MAKEWORD(2, 2), &wsaData);
m_NextCallbackId = 0;
m_NumCallbacks = 0;
m_Debugger = debugger;
@ -207,4 +208,17 @@ CScriptHook* CScriptSystem::GetHook(const char* hookId)
int CScriptSystem::GetNextCallbackId()
{
return m_NextCallbackId++;
}
}
void CScriptSystem::CallbackAdded()
{
m_NumCallbacks++;
}
void CScriptSystem::CallbackRemoved()
{
if (m_NumCallbacks > 0)
{
m_NumCallbacks--;
}
}

View File

@ -43,7 +43,7 @@ private:
} INSTANCE_ENTRY;
CDebuggerUI* m_Debugger;
int m_NumCallbacks;
char* m_APIScript;
vector<HOOKENTRY> m_Hooks;
@ -103,6 +103,13 @@ public:
CScriptHook* GetHook(const char* hookId);
int GetNextCallbackId();
void CallbackAdded();
void CallbackRemoved();
inline int HaveCallbacks()
{
return m_NumCallbacks != 0;
}
void DeleteStoppedInstances();
INSTANCE_STATE GetInstanceState(char* scriptName);

View File

@ -12,6 +12,7 @@
#include <Project64-core/Debugger.h>
#include <Common/SyncEvent.h>
#include <Project64-core/Settings/DebugSettings.h>
#include "DebugMMU.h"
class CDumpMemory;
class CDebugMemoryView;
@ -33,7 +34,8 @@ class CScriptSystem;
class CDebuggerUI :
public CDebugger,
public CDebugSettings
public CDebugSettings,
public CDebugMMU
{
public:
CDebuggerUI();
@ -88,8 +90,8 @@ public:
static void GameNameChanged(CDebuggerUI * _this);
static void SteppingOpsChanged(CDebuggerUI * _this);
bool DebugLW_PAddr(uint32_t vaddr, uint32_t& value);
bool DebugLW_VAddr(uint32_t vaddr, uint32_t& value);
//bool DebugLW_PAddr(uint32_t vaddr, uint32_t& value);
//bool DebugLW_VAddr(uint32_t vaddr, uint32_t& value);
protected:
void TLBChanged(void);

View File

@ -1258,7 +1258,6 @@ void CMainMenu::FillOutMenu(HMENU hMenu)
Item.Reset(SUB_MENU, EMPTY_STRING, EMPTY_STDSTR, &DebugR4300Menu, L"&R4300i");
DebugMenu.push_back(Item);
Item.Reset(SUB_MENU, EMPTY_STRING, EMPTY_STDSTR, &DebugMemoryMenu, L"Memory");
Item.SetItemEnabled(CPURunning);
DebugMenu.push_back(Item);
DebugMenu.push_back(MENU_ITEM(SPLITER));
Item.Reset(SUB_MENU, EMPTY_STRING, EMPTY_STDSTR, &DebugProfileMenu, L"Profile");

View File

@ -13,11 +13,11 @@
#include <Project64-core/N64System/N64DiskClass.h>
RomInformation::RomInformation(const char * RomFile) :
m_DeleteRomInfo(true),
m_DeleteDiskInfo(true),
m_FileName(RomFile ? RomFile : ""),
m_pRomInfo(NULL),
m_pDiskInfo(NULL)
m_DeleteRomInfo(true),
m_DeleteDiskInfo(true),
m_FileName(RomFile ? RomFile : ""),
m_pRomInfo(NULL),
m_pDiskInfo(NULL)
{
if (m_FileName.length() == 0) { return; }
if ((CPath(m_FileName).GetExtension() != "ndd") && (CPath(m_FileName).GetExtension() != "d64"))
@ -43,18 +43,20 @@ m_pDiskInfo(NULL)
}
RomInformation::RomInformation(CN64Rom * RomInfo) :
m_DeleteRomInfo(false),
m_DeleteDiskInfo(false),
m_FileName(RomInfo ? RomInfo->GetFileName().c_str() : ""),
m_pRomInfo(RomInfo)
m_DeleteRomInfo(false),
m_DeleteDiskInfo(false),
m_FileName(RomInfo ? RomInfo->GetFileName().c_str() : ""),
m_pRomInfo(RomInfo),
m_pDiskInfo(NULL)
{
}
RomInformation::RomInformation(CN64Disk * DiskInfo) :
m_DeleteRomInfo(false),
m_DeleteDiskInfo(false),
m_FileName(DiskInfo ? DiskInfo->GetFileName().c_str() : ""),
m_pDiskInfo(DiskInfo)
m_DeleteRomInfo(false),
m_DeleteDiskInfo(false),
m_FileName(DiskInfo ? DiskInfo->GetFileName().c_str() : ""),
m_pRomInfo(NULL),
m_pDiskInfo(DiskInfo)
{
}

View File

@ -510,24 +510,19 @@ BEGIN
COMBOBOX IDC_LANG_SEL,105,77,112,120,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END
IDD_Debugger_Memory DIALOGEX 0, 0, 435, 204
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
IDD_Debugger_Memory DIALOGEX 0, 0, 321, 199
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Memory"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
EDITTEXT IDC_ADDR_EDIT,35,5,49,12,ES_AUTOHSCROLL
LTEXT "Address:",IDC_STATIC,4,6,29,11
CONTROL "Is VAddr?",IDC_CHK_VADDR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,111,7,46,8
PUSHBUTTON "Dump",IDC_DUMP_MEM,319,4,54,13
PUSHBUTTON "Search",IDC_SEARCH_MEM,377,4,54,13
SCROLLBAR IDC_SCRL_BAR,421,23,11,154,SBS_VERT
PUSHBUTTON "Refresh",IDC_REFRSH_MEM,161,4,54,13
CONTROL "Mem Details",IDC_MEM_DETAILS,"ListCtrl",WS_TABSTOP,4,23,416,154
PUSHBUTTON "...",IDC_SYMBOLS_BTN,86,4,21,13
LTEXT "",IDC_SYM_INFO,8,198,418,8
LTEXT "",IDC_DMA_INFO,8,208,415,8
GROUPBOX "",IDC_STATIC,4,190,428,30
CONTROL "Auto",IDC_CHK_AUTOREFRESH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,220,7,31,8
EDITTEXT IDC_ADDR_EDIT,5,20,49,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_SYMBOLS_BTN,58,20,21,13
CONTROL "Virtual",IDC_CHK_VADDR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,83,20,40,13
CONTROL "HexEdit",IDC_HEXEDIT,"HexEditCtrl",WS_TABSTOP,0,36,310,147
SCROLLBAR IDC_SCRL_BAR,310,36,11,147,SBS_VERT
CONTROL "",IDC_MEMTABS,"SysTabControl32",TCS_FOCUSNEVER,0,3,319,13
COMBOBOX IDC_CMB_JUMP,194,20,123,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_STATUSBAR,"msctls_statusbar32",WS_TABSTOP,0,188,321,11
END
IDD_Debugger_Search DIALOGEX 0, 0, 357, 257
@ -1598,8 +1593,7 @@ BEGIN
IDD_Debugger_Memory, DIALOG
BEGIN
RIGHTMARGIN, 431
BOTTOMMARGIN, 203
BOTTOMMARGIN, 196
END
IDD_Debugger_Search, DIALOG
@ -1955,23 +1949,39 @@ IDR_MEM_BP_POPUP MENU
BEGIN
POPUP "PopupMenu"
BEGIN
MENUITEM "Toggle read breakpoint", ID_POPUPMENU_TOGGLERBP
MENUITEM "Toggle write breakpoint", ID_POPUPMENU_TOGGLEWBP
MENUITEM "Clear all breakpoints", ID_POPUPMENU_CLEARALLBPS
MENUITEM "Read breakpoint\tCtrl+R", ID_POPUPMENU_TOGGLERBP
MENUITEM "Write breakpoint\tCtrl+W", ID_POPUPMENU_TOGGLEWBP
MENUITEM "Lock value\tCtrl+E", ID_POPUPMENU_TOGGLELOCK
MENUITEM SEPARATOR
MENUITEM "Toggle lock", ID_POPUPMENU_TOGGLELOCK
MENUITEM "Clear locks", ID_POPUPMENU_CLEARLOCKS
MENUITEM "Clear breakpoints\tCtrl+Q", ID_POPUPMENU_CLEARALLBPS
MENUITEM "Clear locks\tCtrl+Q", ID_POPUPMENU_CLEARLOCKS
MENUITEM SEPARATOR
MENUITEM "View disassembly...", ID_POPUPMENU_VIEWDISASM
MENUITEM "Jump here\tCtrl+G", ID_POPUPMENU_JUMPHERE
MENUITEM "Follow pointer\tCtrl+Space", ID_POPUPMENU_FOLLOWPOINTER
MENUITEM SEPARATOR
POPUP "Byte group size"
BEGIN
MENUITEM "1\tCtrl+1", ID_POPUPMENU_BYTEGROUPSIZE_1
MENUITEM "2\tCtrl+2", ID_POPUPMENU_BYTEGROUPSIZE_2
MENUITEM "4\tCtrl+4", ID_POPUPMENU_BYTEGROUPSIZE_4
MENUITEM "8\tCtrl+8", ID_POPUPMENU_BYTEGROUPSIZE_8
END
MENUITEM "Safe mode\tINS", ID_POPUPMENU_SAFEMODE
MENUITEM SEPARATOR
MENUITEM "Add symbol...", ID_POPUPMENU_ADDSYMBOL
MENUITEM "View disassembly...", ID_POPUPMENU_VIEWDISASM
MENUITEM "Dump...\tCtrl+S", ID_POPUPMENU_DUMP
MENUITEM "Search...\tCtrl+F", ID_POPUPMENU_SEARCH
MENUITEM SEPARATOR
POPUP "Copy"
POPUP "Copy special"
BEGIN
MENUITEM "Word", ID_POPUPMENU_COPY_WORD
MENUITEM "Halfword", ID_POPUPMENU_COPY_HALFWORD
MENUITEM "Byte", ID_POPUPMENU_COPY_BYTE
MENUITEM "Data with group addresses", ID_POPUPMENU_COPYDATAWITHGROUPADDRESSES
MENUITEM "Data with row addresses", ID_POPUPMENU_COPYDATAWITHROWADDRESSES
MENUITEM "GameShark code", ID_POPUPMENU_COPYGAMESHARKCODE
END
MENUITEM "Copy\tCtrl+C", ID_POPUPMENU_COPY
MENUITEM "Paste\tCtrl+V", ID_POPUPMENU_PASTE
MENUITEM "Zero-fill\tDEL", ID_POPUPMENU_ZEROFILL
END
END

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,309 @@
#pragma once
#include <stdafx.h>
enum
{
HXN_REDRAWSTARTED,
HXN_GETBYTEINFO,
HXN_SETBYTE,
HXN_SETNIBBLE,
HXN_FILLRANGE,
HXN_RCLICK,
HXN_INSERTMODECHANGED,
HXN_HOTADDRCHANGED,
HXN_BASEADDRCHANGED,
HXN_GROUPSIZECHANGED,
HXN_SELCHANGED,
HXN_CTRLKEYPRESSED,
HXN_ENTERPRESSED,
HXN_COPY,
HXN_PASTE,
};
enum HXCOLUMN
{
HX_COL_NONE = -1,
HX_COL_ADDRESS,
HX_COL_HEXDATA,
HX_COL_ASCII
};
typedef struct HXBYTEINFO_S
{
bool bHidden;
bool bValid;
uint8_t value;
COLORREF color;
COLORREF bkColor;
bool operator==(const HXBYTEINFO_S& b) const
{
return memcmp(this, &b, sizeof(HXBYTEINFO_S)) == 0;
}
bool operator!=(const HXBYTEINFO_S& b) const
{
return memcmp(this, &b, sizeof(HXBYTEINFO_S)) != 0;
}
} HXBYTEINFO;
template<>
struct std::hash<HXBYTEINFO>
{
std::size_t operator()(const HXBYTEINFO& k) const
{
return (size_t)(k.bValid * 0xFFFFFFFF) ^ (k.value * 0x1010101) ^ k.color ^ k.bkColor;
}
};
typedef struct
{
NMHDR nmh;
uint32_t address;
size_t numBytes;
bool bIgnoreDiff;
HXBYTEINFO* oldBytes;
HXBYTEINFO* newBytes;
} NMHXGETBYTEINFO;
typedef struct
{
NMHDR nmh;
bool bInsert;
uint32_t address;
uint8_t value;
} NMHXSETBYTE;
typedef struct
{
NMHDR nmh;
bool bInsert;
uint32_t address;
bool bLoNibble;
uint8_t value;
} NMHXSETNIBBLE;
typedef struct
{
NMHDR nmh;
bool bInsert;
uint32_t startAddress;
uint32_t endAddress;
uint8_t value;
} NMHXFILLRANGE;
typedef struct
{
NMHDR nmh;
uint32_t address;
uint32_t length;
uint8_t* data;
} NMHXSETBYTES;
typedef struct
{
NMHDR nmh;
uint32_t address;
} NMHXRCLICK;
typedef struct
{
NMHDR nmh;
uint32_t address;
HXCOLUMN column;
} NMHXPASTE;
typedef struct
{
NMHDR nmh;
int nChar;
} NMHXCTRLKEYPRESSED;
class CHexEditCtrl :
public CWindowImpl<CHexEditCtrl>
{
public:
CHexEditCtrl(void);
~CHexEditCtrl(void);
DECLARE_WND_CLASS(_T("HexEditCtrl"))
BOOL Attach(HWND hWnd);
HWND Detach(void);
static char ByteAscii(uint8_t value);
static uint8_t HexCharValue(char c);
static int CALLBACK HaveFontCb(CONST LOGFONTA *lplf, CONST TEXTMETRICA *lptm, DWORD FontType, LPARAM lParam);
static bool HaveFont(HDC hdc, const char* name);
void Draw(void);
void Copy(void);
void Paste(bool bAdvanceCaret = true);
void SetBaseAddress(uint32_t address);
void SetByteGroupSize(int nBytes);
uint32_t GetBaseAddress(void);
uint32_t GetCaretAddress(void);
uint32_t GetHotAddress(void);
int GetNumBytesPerGroup(void);
int GetNumBytesPerRow(void);
int GetNumVisibleBytes(void);
bool GetSelectionRange(uint32_t* startAddress, uint32_t* endAddress);
HXCOLUMN GetFocusedColumn(void);
bool GetInsertMode(void);
private:
enum HXCELLSIDE
{
HX_LEFT,
HX_RIGHT
};
enum
{
TIMER_ID_AUTO_REFRESH,
TIMER_ID_DRAG_SCROLL
};
enum
{
BKCOLOR_DEFAULT = RGB(255, 255, 255),
BKCOLOR_ADDR = RGB(220, 220, 220),
COLOR_ADDR = RGB(40, 40, 40),
BKCOLOR_SEL_FOCUSED = RGB(51, 153, 255),
COLOR_SEL_FOCUSED = RGB(255, 255, 255),
BKCOLOR_SEL_UNFOCUSED = RGB(200, 200, 200),
COLOR_SEL_UNFOCUSED = RGB(0, 0, 0),
BKCOLOR_HOT = RGB(140, 140, 140)
};
typedef struct
{
HXCOLUMN column;
uint32_t asciiAddress;
HXCELLSIDE asciiCellSide;
uint32_t hexAddress;
HXCELLSIDE hexCellSide;
} HXHITTEST;
typedef struct
{
CRect rcHex;
CRect rcAscii;
} HXRECTPAIR;
uint32_t m_BaseAddress;
uint32_t m_DrawnBaseAddress;
uint32_t m_SelStartAddress;
HXCELLSIDE m_SelStartCellSide;
uint32_t m_SelEndAddress;
HXCELLSIDE m_SelEndCellSide;
uint32_t m_RealSelStartAddress;
uint32_t m_RealSelEndAddress;
bool m_bHaveRealSel;
bool m_bInsertMode;
bool m_bHaveCaret;
bool m_bCaretVisible;
uint32_t m_CaretAddress;
bool m_bCaretLoNibble;
bool m_bShowHotAddress;
uint32_t m_HotAddress;
HXCOLUMN m_FocusedColumn;
HFONT m_Font;
HBITMAP m_BackBMP;
HDC m_BackDC;
HCURSOR m_hCursorIBeam;
HCURSOR m_hCursorDefault;
int m_DragScrollDelta;
bool m_bDblClicked;
bool m_bLButtonDown;
bool m_bMouseDragging;
bool m_bLayoutChanged;
int m_CharWidth;
int m_CharHeight;
CRect m_AddressColumnRect;
CRect m_HexDataColumnRect;
CRect m_AsciiColumnRect;
int m_NumBytesPerGroup;
int m_NumByteGroupsPerRow;
int m_NumBytesPerRow;
int m_NumVisibleRows;
int m_NumVisibleBytes;
HXBYTEINFO* m_NewBytes;
HXBYTEINFO* m_OldBytes;
static COLORREF BlendColor(COLORREF c1, COLORREF c2);
static uint32_t SatAdd32(uint32_t a, uint32_t b);
static uint32_t SatAdd32(uint32_t a, int b);
void DrawAddressColumn(void);
void DrawHeader(void);
void Text(int x, int y, const char *text, COLORREF bg, COLORREF fg, CRect* rcOut);
bool IsSelected(uint32_t address);
int GetSelDirection(void);
void CancelSelection(void);
void SelectAllVisible(void);
void UpdateRealSelection(void);
uint32_t LineAddress(uint32_t address);
void GetHexCellPos(int index, CRect* rc);
void GetAsciiCellPos(int index, CRect* rc);
void HitTest(int x, int y, HXHITTEST* pht);
void ShowCaret(void);
void HideCaret(void);
void CaretIncrementNibble(void);
void CaretDecrementNibble(void);
bool UpdateCaretUI(bool bEnsureVisible, bool bTop = false);
void EnsureCaretAddressVisible(bool bTop = false);
bool IsCaretAddressVisible(void);
void UpdateLayoutInfo(void);
void ReallocByteBuffers(void);
LRESULT Notify(UINT code);
LRESULT NotifyGetByteInfo(uint32_t address, size_t numBytes, bool bIgnoreDiff, HXBYTEINFO* oldBytes, HXBYTEINFO* newBytes);
LRESULT NotifySetByte(uint32_t address, uint8_t value);
LRESULT NotifySetNibble(uint32_t address, bool bLoNibble, uint8_t value);
LRESULT NotifyFillRange(uint32_t startAddress, uint32_t endAddress, uint8_t value);
LRESULT NotifyCtrlKeyPressed(int nChar);
LRESULT NotifyPaste(uint32_t address);
LRESULT NotifyRightClick(uint32_t address);
void OnLButtonDown(UINT nFlags, CPoint point);
void OnLButtonDblClk(UINT nFlags, CPoint point);
void OnLButtonUp(UINT nFlags, CPoint point);
void OnRButtonDown(UINT nFlags, CPoint point);
void OnRButtonUp(UINT nFlags, CPoint point);
void OnMouseMove(UINT nFlags, CPoint point);
BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
void OnSetFocus(CWindow wndOld);
void OnKillFocus(CWindow wndFocus);
void OnTimer(UINT_PTR nIDEvent);
UINT OnGetDlgCode(LPMSG lpMsg);
void OnPaint(CDCHandle dc);
BOOL OnSetCursor(CWindow wnd, UINT nHitTest, UINT message);
void OnWindowPosChanged(LPWINDOWPOS lpWndPos);
BEGIN_MSG_MAP_EX(CHexEditCtrl)
MSG_WM_RBUTTONDOWN(OnRButtonDown)
MSG_WM_LBUTTONDOWN(OnLButtonDown)
MSG_WM_LBUTTONUP(OnLButtonUp)
MSG_WM_RBUTTONUP(OnRButtonUp)
MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
MSG_WM_MOUSEMOVE(OnMouseMove)
MSG_WM_MOUSEWHEEL(OnMouseWheel)
MSG_WM_KEYDOWN(OnKeyDown)
MSG_WM_CHAR(OnChar)
MSG_WM_SETFOCUS(OnSetFocus)
MSG_WM_KILLFOCUS(OnKillFocus)
MSG_WM_TIMER(OnTimer)
MSG_WM_GETDLGCODE(OnGetDlgCode)
MSG_WM_PAINT(OnPaint)
MSG_WM_SETCURSOR(OnSetCursor)
MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged)
END_MSG_MAP()
};

View File

@ -91,10 +91,8 @@
#define RSP_ABOUT 1006
#define IDC_ASSIGN 1006
#define IDC_BTN_CHOOSE_FILE 1006
#define IDC_DUMP_MEM 1006
#define IDC_INFO_FILENAME 1007
#define IDC_BTN_RDRAM 1007
#define IDC_REFRSH_MEM 1007
#define IDC_INFO_ROMNAME 1008
#define IDC_RESET_PAGE 1008
#define IDC_INFO_CARTID 1009
@ -194,7 +192,6 @@
#define IDC_DIRECT_READ 1057
#define IDC_DMA_READ 1058
#define IDC_CONT_PAK 1059
#define IDC_SEARCH_MEM 1059
#define IDC_BTN_ROM 1061
#define IDC_TEXTURE_OTHER 1062
#define IDC_TEXTURE_DIR 1063
@ -202,7 +199,6 @@
#define IDC_TEXTURE_DEFAULT 1064
#define IDC_LST_RESULTS 1064
#define IDC_SELECT_TEXTURE_DIR 1065
#define IDC_MEM_DETAILS 1065
#define IDC_PLUGIN_OTHER 1066
#define IDC_PLUGIN_DIR 1067
#define IDC_PLUGIN_DEFAULT 1068
@ -508,9 +504,7 @@
#define IDC_COP0_17_EDIT 1332
#define IDC_COP0_18_EDIT 1333
#define IDC_FILTER_STATIC 1339
#define IDC_SYM_INFO 1348
#define IDC_BLOCK_INFO 1350
#define IDC_DMA_INFO 1351
#define IDC_BACK_BTN 1352
#define IDC_FORWARD_BTN 1353
#define IDC_PC_EDIT 1354
@ -604,7 +598,6 @@
#define IDC_DD44_EDIT 1443
#define IDC_DD48_EDIT 1444
#define IDC_ROM_FIXEDAUDIO 1445
#define IDC_CHK_AUTOREFRESH 1446
#define IDC_SHOW_FILE_EXTENSIONS 1447
#define IDC_ENHANCEMENTLIST 1450
#define IDC_OVERCLOCK 1451
@ -719,6 +712,10 @@
#define IDC_CHK_FP_CO 1566
#define IDC_CHK_FP_CU 1567
#define IDC_CHK_FP_CI 1568
#define IDC_HEXEDIT 1569
#define IDC_MEMTABS 1571
#define IDC_STATUSBAR 1572
#define IDC_CMB_JUMP 1573
#define ID_POPUPMENU_PLAYGAMEWITHDISK 40008
#define ID_POPUPMENU_ADDSYMBOL 40013
#define ID_POPUPMENU_VIEWDISASM 40017
@ -758,9 +755,21 @@
#define ID_RESULTS_ADDALLTOWATCHLIST 40080
#define ID_WATCHLIST_CHANGE_ADDRESS 40082
#define ID_WATCHLIST_CHANGE_ADDRESSBY 40084
#define ID_POPUPMENU_COPY_WORD 40089
#define ID_POPUPMENU_COPY_HALFWORD 40090
#define ID_POPUPMENU_COPY_BYTE 40091
#define ID_POPUPMENU_PASTE 40092
#define ID_POPUPMENU_COPY 40093
#define ID_POPUPMENU_FOLLOWPOINTER 40095
#define ID_POPUPMENU_ZEROFILL 40097
#define ID_POPUPMENU_BYTEGROUPSIZE_1 40103
#define ID_POPUPMENU_BYTEGROUPSIZE_2 40104
#define ID_POPUPMENU_BYTEGROUPSIZE_4 40105
#define ID_POPUPMENU_BYTEGROUPSIZE_8 40106
#define ID_POPUPMENU_SAFEMODE 40107
#define ID_POPUPMENU_DUMP 40108
#define ID_POPUPMENU_SEARCH 40109
#define ID_POPUPMENU_JUMPHERE 40113
#define ID_POPUPMENU_COPYGAMESHARKCODE 40118
#define ID_POPUPMENU_COPYDATAWITHROWADDRESSES 40119
#define ID_POPUPMENU_COPYDATAWITHGROUPADDRESSES 40120
#define ID_POPUPMENU_ROMDIRECTORY 40137
#define ID_POPUPMENU_REFRESHROMLIST 40138
#define ID_POPUPMENU_PLAYGAME 40152
@ -780,6 +789,9 @@
#define _APS_NEXT_RESOURCE_VALUE 211
#define _APS_NEXT_COMMAND_VALUE 40092
#define _APS_NEXT_CONTROL_VALUE 1516
#define _APS_NEXT_RESOURCE_VALUE 219
#define _APS_NEXT_COMMAND_VALUE 40121
#define _APS_NEXT_CONTROL_VALUE 1574
#define _APS_NEXT_SYMED_VALUE 102
#endif
#endif

View File

@ -32,11 +32,11 @@ rd "%base_dir%\Bin\Package" /Q /S > NUL 2>&1
md "%base_dir%\Bin\Package"
md "%base_dir%\Bin\Package\Config"
md "%base_dir%\Bin\Package\Lang"
md "%base_dir%\Bin\Package\Plugin"
md "%base_dir%\Bin\Package\Plugin\Audio"
md "%base_dir%\Bin\Package\Plugin\GFX"
md "%base_dir%\Bin\Package\Plugin\Input"
md "%base_dir%\Bin\Package\Plugin\RSP"
md "%base_dir%\Bin\Package\Plugin%VSPlatform%"
md "%base_dir%\Bin\Package\Plugin%VSPlatform%\Audio"
md "%base_dir%\Bin\Package\Plugin%VSPlatform%\GFX"
md "%base_dir%\Bin\Package\Plugin%VSPlatform%\Input"
md "%base_dir%\Bin\Package\Plugin%VSPlatform%\RSP"
copy "%base_dir%\Bin\Release%VSPlatform%\Project64.exe" "%base_dir%\Bin\Package"
copy "%base_dir%\Config\Video.rdb" "%base_dir%\Bin\Package\Config"
@ -46,12 +46,12 @@ copy "%base_dir%\Config\Project64.enh" "%base_dir%\Bin\Package\Config"
copy "%base_dir%\Config\Project64.rdb" "%base_dir%\Bin\Package\Config"
copy "%base_dir%\Config\Project64.rdx" "%base_dir%\Bin\Package\Config"
copy "%base_dir%\Lang\*.pj.Lang" "%base_dir%\Bin\Package\Lang"
copy "%base_dir%\Plugin%VSPlatform%\Audio\Jabo_Dsound.dll" "%base_dir%\Bin\Package\Plugin\Audio"
copy "%base_dir%\Plugin%VSPlatform%\Audio\Project64-Audio.dll" "%base_dir%\Bin\Package\Plugin\Audio"
copy "%base_dir%\Plugin%VSPlatform%\GFX\Jabo_Direct3D8.dll" "%base_dir%\Bin\Package\Plugin\GFX"
copy "%base_dir%\Plugin%VSPlatform%\GFX\Project64-Video.dll" "%base_dir%\Bin\Package\Plugin\GFX"
copy "%base_dir%\Plugin%VSPlatform%\Input\PJ64_NRage.dll" "%base_dir%\Bin\Package\Plugin\Input"
copy "%base_dir%\Plugin%VSPlatform%\RSP\RSP 1.7.dll" "%base_dir%\Bin\Package\Plugin\RSP"
copy "%base_dir%\Plugin%VSPlatform%\Audio\Jabo_Dsound.dll" "%base_dir%\Bin\Package\Plugin%VSPlatform%\Audio"
copy "%base_dir%\Plugin%VSPlatform%\Audio\Project64-Audio.dll" "%base_dir%\Bin\Package\Plugin%VSPlatform%\Audio"
copy "%base_dir%\Plugin%VSPlatform%\GFX\Jabo_Direct3D8.dll" "%base_dir%\Bin\Package\Plugin%VSPlatform%\GFX"
copy "%base_dir%\Plugin%VSPlatform%\GFX\Project64-Video.dll" "%base_dir%\Bin\Package\Plugin%VSPlatform%\GFX"
copy "%base_dir%\Plugin%VSPlatform%\Input\PJ64_NRage.dll" "%base_dir%\Bin\Package\Plugin%VSPlatform%\Input"
copy "%base_dir%\Plugin%VSPlatform%\RSP\RSP 1.7.dll" "%base_dir%\Bin\Package\Plugin%VSPlatform%\RSP"
cd %base_dir%\Bin\Package
"%zip%" a -tzip -r "%base_dir%\Package\%ZipFileName%" *