package Ġch ol iver . n esp ot . map pers Ċ Ċ import Ġch ol iver . n esp ot . BASE _ PR G _ ROM Ċ import Ġch ol iver . n esp ot . car tr idge . Car tr idge Ċ import Ġch ol iver . n esp ot . car tr idge . Mapper Ċ import Ġch ol iver . n esp ot . car tr idge . Rom Ċ import Ġch ol iver . n esp ot . common . Address Ċ import Ġch ol iver . n esp ot . common . Data Ċ import Ġch ol iver . n esp ot . common . is Bit Set Ċ Ċ // Ġhttps :// wiki . nes dev . com / w / index . php / MMC 1 Ċ class ĠM mc 1 Mapper ( rom : ĠR om , Ġprivate Ġval Ġget Step Count : Ġ() Ġ-> ĠInt ) Ġ: ĠMapper Ġ{ ĊĠ Ġoverride Ġval Ġpr g Data Ġ= Ġrom . prg Data ĊĠ Ġoverride Ġval Ġchr Data Ġ= Ġif Ġ( rom . chr Data . isEmpty ()) ĠByteArray ( CH R _ RAM _ SIZE ) Ġelse Ġrom . chr Data ĊĠ Ġoverride Ġval Ġpr g Bank Size Ġ= ĠPR G _ BANK _ SIZE ĊĠ Ġoverride Ġval Ġchr Bank Size Ġ= ĠC HR _ BANK _ SIZE ĊĠ Ġoverride Ġval Ġpersist Ram Ġ= Ġtrue ĊĊĠ Ġprivate Ġval Ġnum P rg B anks Ġ= Ġ( rom . prg Data . size Ġ/ ĠPR G _ BANK _ SIZE ) ĊĠ Ġprivate Ġval Ġnum Chr B anks Ġ= Ġ( chr Data . size Ġ/ ĠC HR _ BANK _ SIZE ) ĊĠ Ġprivate Ġvar Ġsr Count Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġsr Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġchr 0 Bank Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġchr 1 Bank Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġpr g Bank Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġchr Mode Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġpr g Mode Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġprev Step Ġ= Ġ- 1 ĊĊĠ Ġoverride Ġfun ĠCar tr idge . on Startup () Ġ{ ĊĠĠĠ Ġpr g . bank Map [ 1 ] Ġ= Ġnum P rg B anks Ġ- Ġ 1 ĠĠĠ Ġ// ĠB ubble ĠBob ble Ġrelies Ġon Ġthis ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠCar tr idge . on P rg Set ( addr : ĠAddress , Ġdata : ĠData ) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġdon 't Ġupdate Ġon Ġconsecutive Ġstores Ġ( we Ġapproximate Ġthis Ġas Ġmultiple Ġstores Ġin Ġthe Ġsame Ġinstruction Ġstep ) ĊĠĠĠ Ġval Ġcurrent Step Ġ= Ġget Step Count () ĊĠĠĠ Ġif Ġ( current Step Ġ!= Ġprev Step ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( data . is Bit Set ( 7 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠReset ĊĠĠĠĠĠĠĠ Ġsr Count Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġsr Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsr Ġ= Ġ( sr Ġshr Ġ 1 ) Ġor Ġ(( data Ġand Ġ 1 ) Ġshl Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(-- sr Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ(( addr Ġand Ġ 0 x 6 0 0 0 ) Ġshr Ġ 1 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchr . mirror ing Ġ= ĠR om . Mirror ing . values ()[ ( sr Ġand Ġ 0 x 0 3 )] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpr g Mode Ġ= Ġ( sr Ġand Ġ 0 x 0 C ) Ġshr Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchr Mode Ġ= Ġ( sr Ġand Ġ 0 x 1 0 ) Ġshr Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġchr 0 Bank Ġ= Ġsr Ġ% Ġnum Chr B anks ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġchr 1 Bank Ġ= Ġsr Ġ% Ġnum Chr B anks ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġpr g Bank Ġ= Ġsr Ġ% Ġnum P rg B anks ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġupdate P rg Bank Map () ĊĠĠĠĠĠĠĠĠĠ Ġupdate Chr Bank Map () ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠReset ĊĠĠĠĠĠĠĠĠĠ Ġsr Count Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠ Ġsr Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprev Step Ġ= Ġcurrent Step ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠCar tr idge . update P rg Bank Map () Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġpr g . bank Map ĊĠĠĠ Ġwhen Ġ( prg Mode ) Ġ{ ĊĠĠĠĠĠĠ 0 , Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġmap [ 0 ] Ġ= Ġpr g Bank Ġand Ġ 0 x 0 E ĊĠĠĠĠĠĠĠ Ġmap [ 1 ] Ġ= Ġpr g Bank Ġor Ġ 0 x 0 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġmap [ 0 ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġmap [ 1 ] Ġ= Ġpr g Bank ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġmap [ 0 ] Ġ= Ġpr g Bank ĊĠĠĠĠĠĠĠ Ġmap [ 1 ] Ġ= Ġnum P rg B anks Ġ- Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠCar tr idge . update Chr Bank Map () Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġchr . bank Map ĊĠĠĠ Ġwhen Ġ( chr Mode ) Ġ{ ĊĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġmap [ 0 ] Ġ= Ġchr 0 Bank Ġand Ġ 0 x 1 E ĊĠĠĠĠĠĠĠ Ġmap [ 1 ] Ġ= Ġchr 0 Bank Ġor Ġ 0 x 0 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġmap [ 0 ] Ġ= Ġchr 0 Bank ĊĠĠĠĠĠĠĠ Ġmap [ 1 ] Ġ= Ġchr 1 Bank ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠC HR _ RAM _ SIZE Ġ= Ġ 8 1 9 2 ĊĠĠĠ Ġconst Ġval ĠPR G _ BANK _ SIZE Ġ= Ġ 1 6 3 8 4 ĊĠĠĠ Ġconst Ġval ĠC HR _ BANK _ SIZE Ġ= Ġ 4 0 9 6 ĊĠĠĠ Ġconst Ġval ĠBASE _ SR Ġ= ĠBASE _ PR G _ ROM ĊĠ Ġ} Ċ } Ċ