package Ġorg . j gl rx av pok . k ame boy . memory . car tr idget ypes Ċ Ċ import Ġorg . j gl rx av pok . k ame boy . help ful . as Unsigned Ċ import Ġorg . j gl rx av pok . k ame boy . help ful . set Bits Ċ import Ġorg . j gl rx av pok . k ame boy . memory . Battery Ċ import Ġorg . j gl rx av pok . k ame boy . memory . Car tr idge Ċ import Ġorg . j gl rx av pok . k ame boy . time . Save State Element Ċ Ċ class ĠM BC 2 ( val Ġcar tr idge : ĠCar tr idge , Ġval Ġbattery : ĠB attery ): ĠCar tr idge Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" MB C 2 " ĊĠĠĠ Ġ@ Save State Element ĊĠĠĠ Ġvar Ġcurrent Bank Ġ= Ġ 1 ĊĠĠĠ Ġval ĠBank Size Ġ= Ġ 0 x 4 0 0 0 ĊĠĠĠ Ġval Ġb anks Ġ= ĠArray ( car tr idge . rom Bank Count ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġindex * Bank Size ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġstart + Bank Size ĊĠĠĠĠĠĠĠ Ġcar tr idge . raw Data . slice Array ( start Ġuntil Ġend ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Save State Element ĊĠĠĠ Ġprivate Ġvar Ġram Write Enabled Ġ= Ġtrue ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbattery . load RAM ( car tr idge ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( address : ĠInt , Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 x 2 0 0 0 .. 0 x 3 FFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbank Ġ= Ġvalue Ġand Ġ 0 b 0 0 0 1 1 1 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġlower Ġ 5 Ġbits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Bank Ġ= Ġif ( bank Ġ== Ġ 0 ) Ġ 1 Ġelse Ġcurrent Bank . set Bits ( bank , Ġ 0 .. 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 x 0 0 0 0 .. 0 x 1 FFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Ġ= Ġvalue Ġand Ġ 0 xF Ġ== Ġ 0 b 1 0 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( value Ġand Ġ( 1 Ġshl Ġ 4 ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ram Write Enabled Ġ&& Ġ! enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbattery . save RAM ( car tr idge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġram Write Enabled Ġ= Ġenable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 xA 0 0 0 .. 0 xB FFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( car tr idge . ram Bank Count Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ram Write Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcar tr idge . ram B anks [ 0 ]. write ( address , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġaccepts ( address : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaddress Ġin Ġ 0 .. 0 x 8 0 0 0 Ġ|| Ġaddress Ġin Ġ 0 xA 0 0 0 .. 0 xA 1 FF ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( address : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 x 0 0 0 0 .. 0 x 3 FFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb anks [ 0 ][ address ]. as Unsigned () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 x 4 0 0 0 .. 0 x 7 FFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Bank Ġ>= Ġb anks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbank Ġ= Ġb anks [ current Bank ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbank [ address - 0 x 4 0 0 0 ]. as Unsigned () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 xA 0 0 0 .. 0 xB FFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( car tr idge . ram Bank Count Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcar tr idge . ram B anks [ 0 ]. read ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 xFF ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" MB C 2 ( Current Bank =$ current Bank , ĠB attery =$ battery )" ĊĠĠĠ Ġ} Ċ Ċ }