.$Qi!= $!R FJJ'1X3οߔK VrMsʚaX'v#aV8@Ro0`ր%cN84>Dxˈ:e|c<%8 r!GOOMBAGOOMBAGMBAHٟHYHdAD dT,0Q 4 4:9Q 4 4:N8Q 4 4: S 4:8  0S`H`hH`/.$Qi!= $!R FJJ'1X3οߔK VrMsʚaX'v#aV8@Ro0`ր%cN84>Dxˈ:e|c<%8 r!GOOMBAGOOMBAGMBA 0Uih7 RUD@ 0X@ q`PUUQ HAptbd5Q1QUUQl)`D` P@ @I Hps'6FTQE%In@p`P+5@;7g;#Oh(qF&PRQ oOwww.a$PcWЏ`^&'_ ?dP@*Q?piIp`5SQUEU`ߖ_p`_c~P?@G@FTtU4b_`dHpw6fP0;UhGsPpIwrF@TPAUE@?c@`@wGfaUP ?Ph`tp@ff1UU$b!o{׀(2?ulB_a{%aQbrf>)< ^ 5~C?B{A H7p6 `^Q5UU@IFtrdUQE@??faUR0U?@)A)(wJfZS00%1[1F!wpfU!U UU4AwwGf~_ @DwfaS#P`@A0PU@k_ ! T?2ifa$UEDQ$!?^%^?#I@hwttFbBEqA  wBd@Q@biq_TR0BC?ww??QbTUBU4$??dQC!?ۙA_swwbE3_Ai~$_~`1P0S$I`QiÆqw 6UT'@i `h`GGGf&A%`iݑhHq#FF]E$E~a Iqi!GOETHH#`P1a C@q@81b@r6F0`ffPFR??01?HB*i8btwa79*Q@ _ TPp#```0w%FS ?`0660SS R8 DqF6 Qy@`p?TPU4q? ~@  7 _0\/zz @0H??*kp3$$$$RSSC4FF%RteC4VG%RddC455%BBBBX=RJZ9gs{X=LJZ1gs{gCClC)C] 𵆰KN$kIHRR!B!GOys@-h$U`!!4, W@  7B  ?' xG 7(9"HBa8dI# h@C8!> - @'% x 7 / ' L '` h #@ Hx( GhCXC C2C J'PhR{3:3z;@* 9+ѐpGhC񵂰 )Hh.8PCpR(0 9 B %($EHh( "B"1# .1o0:0z!@4B Hh ))IBIIIBIIAG1hCHIh h`B@@#@Oi#B i1a)ۉ HaaI ` !@CpGhCCC!"R( KR(HQ1B !HpG0  #GK *KK#A#CETS0 \ ,!!1BCR0(۰pG0*A A"I2 "HpG@I" pG@NhH1iCA@@ 0a xA(h (ya` h 7B  ?'! 1@#BHМC` GC "JI# h@#[B EHpEI hO#'<pK $x#Cp"Cp8< $Qx9K!CQph !#B!`4I`4I3IMH`$] h`!!4,*L C8a!Lhi@Hhh (ڠ!I!IXH` 8@H8@$( 2`!4 ,L C I  IMGC2lCC `8` $M/`U/ HC(a/ / ` Ӯh/ѰI/IX` @/(/ H @O8CGC h`` G G Oh 0*2Rh"B"]GCK"hB"%0NGCB828!RGOFFONwith RONOFFSLOWMO5min10min30minOFFIIIIIIIIIIIIIIINormalTurboCrapProtGBAGBPNDS1P2PLink2PLink3PLink4PBlackGreyBlueNoneYellowGreyMulti1Multi2ZeldaMetroidAdvIslandAdvIsland2BaloonKidBatmanBatmanROTJBionicComCV AdvDr.MarioKirbyDK LandDMGMGBSGBCGBAGBAuto Goomba Pogoomba ' I" ;`AHx('@I XhF? @HAIx XiFhFiF" F;O @ 2 2 > GPowered by XGFLASH2.com 2005uChav2.2 on wC`C`B autofire: A autofire: 2`Controller: Display->Other Settings->Link TransferSleepRestartSave State->Load State->Manage SRAM->Exit Q" 6h:H;Ix X:hFiF 8H8Ox8:XhFiF 6L7Ix X6hFiF x4I X4hFiF 4H4h :XhFiF y0:XhFiF /H/x:XhFiF /H/hhFiF G Other Settings(`VSync: _`FPS-Meter: C`Autosleep: `EWRAM speed: 2Swap A-B: Autoload state: (Goomba detection: PaGame Boy:  " HIh XhFIiF 7HIx XhFfOKBa  @&60`.CH p ;pAH[#  >Np00Xp!000pp@;p#C3H&1H1A1HA(1%H&V f>Й(`]0 Z&v  # 06N<,$$ 4D=- Hh. 47?/ JGgCTCC brac#\T3:рpG H!I LhB 8hB <`x`Gg1W!"Cxx;Cx?;Cx?;CY02*ۀpG e") |"* wZ'?рG Write error! Memory full. Delete some games.1K1Oh#[<f'BC#fB7B+) #[B 5 (92>.'C.`h`=- 9*d'C'``` I02 `!Ip02B @I9 GCg^)2:p01ypG "S!H9 !7< 9< !7< }9 79 G00:00:00 - 00/00kKCIh h&1+AL! + + h)89B)) !`  Y'# ` B )"B" 0 1_Bѡh7  &.ѽB  i"2 D/"3 =( ("B" 0." )7 (" H` `GCgPush SELECT to deleteSave state:Load state:Erase SRAM:CKL(#[30 g``Hh`Hh2`HOx(8I Hh1.1"8NGg0CPCuCgCTC LjF ` (ќG  "! h-!h8BH ` 8@jF (H8@C #L!:#k LjF `  @"! h("! h 8@jF H8@GgCd#C% I NBh3B1` *I `GgCIh" J)0% )>hI`GgCH#h@pGlC( Hh/jF!(HhGPCTC(јG ") O#!";HhjF!v( "!6( g Saving.gPC(4! N(-h()!D("#[M0"#K!I H631!"H`!8Gg0!HKJ?"!GgA(< Hx8Hhw! ! -hB "RIH<// "Ah J00""RIH"GdCPCHx"Hh-jF! (hBE"R I HjF!8(zGdCPC  .MiF(`(G @&h%(B(!{%mH5hB#[B I") `%5<- M"!(h)h8BH(` 8@iF ( H8@CpC ROM not found.I(IjF! ("L#[0" IHhqHhHqHIx xCI x CI xICqHxHhO`/"! #[0"Gg0g8\_C(C_dCPC(!jF! (Jy`Ay J`y Jp!@ Jp!@ J#pI@@ pG8\_C(C_&O(C !I%=p70BjF! Z(L#[0"IHJhqHhHqHxqxyCq/`"! #[0"Gg0g8\_CC8O8J9j `%3L.S][D/7>W S BՉ-63CCBiсщ) щIaZ %KB$H!!с!C P CKBH!KBH!KBPh(Е`h(Аh8`HH8bH#CpG!`Q`сQ`gC @0&@  HKhB Hx( H! I CII#CpGC0vC CB0ӄFR) xp@Iу:Ӱɸ:Ұ 2 p Cp p p xpI@R`FpG CCXPpGR\TpG/Y@P@ KRB#BBRB[AB Z@P@Y@pGGGGG G(G0G8G CфF0 LC+@# @pB0`FpG xpI[*pG2x+ x1p2+pG/KRB#BBRB[ABpGFCˀ  xx[IR gFpGFRp@: C C  :ӁTR`FpGxG0`B @ @   !QR B0`BaB/F C ӰL;C+@рҰ xpI@+ R`FpG p@R`FpGxG--N< \/ Divide by zero///4 ,P$PP //38//1e "" \  /\ \$/< }Ϡ0\ }Ϡ@\  @0}ϠP\ // XTS4xVͫ0 FhnzZ~h2 0;.Yk  RT;h;h;h;;;T; T; = = =<<<<<===<<<<<<" =l=H=T; O-<04 +**)HAIB*@/@GPO|xt,`- .{H x@@44P,T(X$\ㄔGO 2 ZB^?O/pD-逡$ b(`4@ 0 PPQ0S$pD/XCP ` w9`9@9,C BB4Cx0@P`x404x40x4L-`ጠ匰Z @O PPQP$T0IE?@  L/xxxx h>P`@: ;;,'t,C2\+phà`àbàcàdàeàhàiàlàmàpàrà`sàtàu` àxàyà|à}ààà`bcdehilmprs`tu` xy|}wxFFFG8GhGGG H(??(@@(AA(B?(M3"o{3"o{3"o{3"o{UUUUUUUUUUUUUUUUUUZJZcUUUތk)ZcZJggU F%)YZJZcޢBk{URZJ!1sJ!!scR)祥{))Bu)ksJ!!scR)祥{))BތZsJ!!kkcB{))BȐPDBRRRRZZk{!BRZ{9RZ{9RZ{9Zk{!Bε!)99JZ9ﭥkZZB猥BRkRRRBZޜkf!BRUURBΌZR>sB3 wx#5 ZM`) UUUѩQH%GGM[jcBs{!%   @h*>` ; 8L 50@  ,$ /P-"P-p???????-???/@-L =@P 1 @@@0S@/0S@/                  @-BJRZbjrz "&.B1.07, T\ 0P@0/P00/$0/  R 0/޼ DP`l  0܀P:O-@PB A  ᠀堐cp@DA`PPP` \ EX P: O 0@-S"I 0  \0 Π0 S( 000 Q@@Ao 0!CexV4-$2X$QP$? @P,,0 R :Q0A 2 --N< \  Divide by zero!"!!"!"!!""!!"!""""!"!!""!!"!""""!!!!!!""""!"!!"!!!!!!!"!!""!!"!!!!!!!"""""!!"!!!!!!!!!!!!!0CFGNINTENDOxG[?xGbxGDxG\?xGZxGxG\xG xGxGxGexGxGqxGxGXTW@XTW@XTWXXTW$ %Ƞ B.瀀XTWX XTW2T12@XTW21TE112@XTWX\ကXTW0@2#D#@XTWČ~ B. B.XTW'1p2#!2XTW%Ƞ +LကXTWXE XTWe\2T12eT@XTWe\21TE112eT@XTWTXကXTW0L2#@#L@XTW$ PI@XTWhXTW$ &Ƞ B.瀀XTWh XTW2d12@XTW21dF112@XTWhlကXTW0E@2#@XTWXTW'1p2#!2XTW&Ƞ +LကXTWhF XTWfl2d12fd@XTWfl21dF112fd@XTWdhကXTW(0d@2E@XTW@HXTWxXTW$ 'Ƞ B.x XTWx XTW2t12@XTW21tG112@XTWx|ကXTWD QDR T"@ 22#1@XTW@T 2231@XTW@HXTW'1p2#!2XTW'Ƞ +xLကXTWxG XTWg|2t12gt@XTWg|21tG112gt@XTWtxကXTWD$ 2@XTW@HXTW|XTW$ 'Ƞ B.xG XTW||倀XTW'Ƞ + 212  B.XTW'Ƞ + 21@112  B.XTW'Ƞ B.XTW12@XTW@HXTW|'1p2#!2XTW'Ƞ +xGLကXTW|@|倀XTW2D12@XTW21DD112@XTWLကXTW22#@XTWXT@XTWXP@XTWXT@XTWXP@XTWXT@XTW'Ƞ +X\ကXTWXP@XTWT%T@XTWT&T\@XTWTP@XTWT'T\@XTWTP@XTW'Ƞ +TXကXTWT$T@XTWh`@XTWhd@XTWhd@XTWh`@XTWhd@XTW'Ƞ +hlကXTWh`@XTWd%dl@XTWd`@XTWd&d@XTWd'dl@XTWd`@XTW'Ƞ +dhကXTWd$d@XTWxp@XTWxt@XTWxp@XTWxt@XTWxt@XTW'Ƞ +x|ကXTWxp@XTWt%t|@XTWtp@XTWt&t|@XTWtp@XTWt't@XTW'Ƞ +txကXTWt$t@XTW% 'Ƞ B.瀀XTW%'Ƞ B.瀀XTW& 'Ƞ B.瀀XTW&'Ƞ B.瀀XTW' 'Ƞ B.瀀XTW'Ƞ  B.瀀XTW PI@XTW@H$ 'Ƞ B.瀀XTWD@XTWD@XTWD@XTWD@XTWD@XTWD@XTW'Ƞ +LကXTW$@02!2D@XTW$D02!2@XTW$@02!2D@XTW$D02!2@XTW$@02!2D@XTW$D02!2@XTW'Ƞ +$L02!2XTW$@02!2@XTW(!$@02!2@XTW(!$@02!2@XTW(!$@02!2@XTW(!$@02!2@XTW(!$@02!2@XTW(!$@02!2@XTW'Ƞ + (!$@02!2XTW(!$@02!2@XTW$@T02 2#!2@XTW$DT02 2#!2@XTW$@T02 2#!2@XTW$DT02 2#!2@XTW$@T02 2#!2@XTW$DT02 2#!2@XTW'Ƞ +$LT02 2#!2XTW$@T02 2#!2@XTW2##?$@2# 2#D1!2@XTW2##?$@2# 2#D1!2@XTW2##?$@2# 2#D1!2@XTW2##?$@2# 2#D1!2@XTW2##?$@2# 2#D1!2@XTW2##?$@2# 2#D1!2@XTW'Ƞ + 2##?$@2# 2#D1!2XTW2##?$@2# 2#D1!2@XTW2@1@XTW2D1@XTW2@1@XTW2D1@XTW2@1@XTW2D1@XTW'Ƞ +2L1XTW2@1@XTW0@41@XTW0D41@XTW0@41@XTW0D41@XTW0@41@XTW0D41@XTW'Ƞ +0L41XTW@1@XTW0@1@XTW0D1@XTW0@1@XTW0D1@XTW0@1@XTW0D1@XTW'Ƞ +0L1XTW0@1@XTW$T02 2#!2@XTW$T02 2#!2@XTW$T02 2#!2@XTW$T02 2#!2@XTW$T02 2#!2@XTW$T02 2#!2@XTW'Ƞ +$ T02 2#!2XTW$T02 2#!2@XTWg XTW|Ě -,XȌ,Ȍ|ĊTXXTW XTW -XTWa XTW%|ĚL|Ċ --,Ȍ ,Q XTW$L02!2XTWI|ĚL|Ċ --,Ȍ ,Q  -XTWXTW@H|Ě -,Ȍ,Ȍ|Ċ -XTWXTWXTW I|ĚL|Ċ --,Ȍ ,Qf  -XTW (!$@02!2XTWI XTW|Ě -,hȌ,Ȍ|ĊdhXTWJ XTW XTW&|ĚL|Ċ --,Ȍ ,Q XTW$LT02 2#!2XTWIOhXTWXTW}XTW 2##?$@2# 2#D1!2XTWI& $ XTW|Ě -,xȌ,Ȍ|ĊtxXTW%( $ v뀀XTW'|ĚL|Ċ --,Ȍ ,Q XTW2L1XTWI |(!|02 "2XTW' -@XTWČ$  B.XTW0L41XTWI( LXTW|Ě -,Ȍ,HȌ|ĊL0P ;XTW%( oLကXTW@XTW  $|ĚL|Ċ --,Ȍ ,Q8 XTW0L1@XTWI0s|(!x02 "2XTW|t倀XTWČ +LXTW|Ě -,Ȍ,Ȍ|Ċ -H@H$ T02 2#!2XTWI80O- ģij,F.  !#RO/#>5:5`   h/<<3   4# R $# ,/  /"P" R" B4 4@ FxGQEĊQEĊ x ĊG @ĊQEOĊ$ P P@ $ @: $  vR $ $@ H  P  X ` @ I|ĚL|Ċ --,Ȍ ,Q  -XTWPFPFh>P01// \J" 3--:--. .:::::::.TA`AlAxAA:AAAAAAAAA:B B,B8BDBPB\B:::::::::BBBBBBBBBBBBBBBB@56d6677:477778::::::::::-::::::::::::::::::::::::::::::::::::::::: \(UWQL \UWQLRead from OAM. Wrote to OAM. \J2--:----:::::::-<@H@T@`@l@:x@@@@@@@@@:A AA$A0A  ˌ  ˌLT!L t >  ˌ  +xxxxSNtuuh>Ix^Z!`@@&9_9_9_9_`?DDDD@ D H L P T X T X  PO4OdO::::(;|;;;-<;:: v  (;=L<$<!Q@-U@ nO4rOP$ P$ P$ P$ P$ (;<<: 9: =0=:+ P CSv(;\=;;?(;=<:(;=::C9@-0<<<<8$@DA$HLI -$@DHL$T?99 0Px h8Tx0`|  P 8Lt@`4PhH 4 ` |       8 P l        4 P |        @ X t       $ @ X t       <X p0\(<Pdx @l4p$`(\$THH0Lh ,Hh(Dd0d<l (ldlBDTl$ X h P$     !(!d!!!!!0"X"""""#<#T#### $ $$$$:::::::(::::8 ;;D+`a(`a,$0400 call mem_Copy  ë Date 971026c0 ldh [rBGP],a xor a ld [VBlankDone],a ld )ff s nٙgcnܙ3>SPACE INV DEMO$q "   *    A "    A *  <@!\!\>G10>@A>>@!" !P>"  z0͠0͠ z/E&~C!<0O~" >1 NZ(`8` Z`(`X` NC(`x` [HL]`` [HL+]`` [HL-]`` [HLI]`` [HLD]`` HL(`8` AF(`X` [BC]`x` BC(`` [DE]`` DE(`` [SP]`` SP(`` A`(`8` B`(`X` [$FF00+C]|` [C](`` C`(`` D`(`` E`(`` H`(`` L`(`)@`(`A\La)__TIME__@$2ax`06:29:56)__DATE__B[a@Vb`26 October 1997)_RS$`B|aPDb)__FILE__Da(@b` si.asmpaa*si.asm_0$`0`$`(`$`"``!a` `"a,``06:29:56`0 IF \1 > 1.5 WARN "Version \1 or later of 'hardware.inc' is required." ENDC D$aL6a6aP`26 October 1997)HARDWARE_INC-- rNR31 EQU $1B rAUD3LEN EQU rNR31 ; -- ; -- AUD3LEVEL/NR32 ($FF1C) ; -- Select output level ; -- ; -- Bit 6-5 - Select output level ; -- 00: 0/1 (mute) ; -- 01: 1/1 ; -- 10: 1/2 ; -- 11: 1/4 ; -- rNR32 EQU $1C rAUD3LEVEL EQU rNR32 ; -- ; -- AUD3LOW/NR33 ($FF1D) ; -- Frequency lo (W) ; -- ; -- see AUD1LOW for info ; -- rNR33 EQU $1D rAUD3LOW EQU rNR33 ; -- ; -- AUD3HIGH/NR34 ($FF1E) ; -- Frequency hi (W) ; -- ; -- see AUD1HIGH for info ; -- rNR34 EQU $1E rAUD3HIGH EQU rNR34 ; -- ; -- AUD4LEN/NR41 ($FF20) ; -- Sound length (R/W) ; -- ; -- Bit 5-0 - Sound length data (# 0-63) ; -- rNR41 EQU $20 rAUD4LEN EQU rNR41 ; -- ; -- AUD4ENV/NR42 ($FF21) ; -- Envelope (R/W) ; -- ; -- see AUD1ENV for info ; -- rNR42 EQU $21 rAUD4ENV EQU rNR42 ; -- ; -- AUD4POLY/NR42 ($FF22) ; -- Polynomial counter (R/W) ; -- ; -- Bit 7-4 - Selection of the shift clock frequency of the (scf) ; -- polynomial counter (0000-1101) ; -- freqEQUdrf*1/2^scf (not sure) ; -- Bit 3 - Selection of the polynomial counter's step ; -- 0: 15 steps ; -- 1: 7 steps ; -- Bit 2-0 - Selection of the dividing ratio of frequencies (drf) ; -- 000: f/4 001: f/8 010: f/16 011: f/24 ; -- 100: f/32 101: f/40 110: f/48 111: f/56 (fEQU4.194304 Mhz) ; -- rNR42_2 EQU $22 rAUD4POLY EQU rNR42_2 ; -- ; -- AUD4GO/NR43 ($FF23) ; -- (has wrong name and value (ff30) in Dr.Pan's doc!) ; -- ; -- Bit 7 - Inital ; -- Bit 6 - Counter/consecutive selection ; -- rNR43 EQU $23 rAUD4GO EQU rNR43 ; silly name! ;*************************************************************************** ;* ;* Cart related ;* ;*************************************************************************** CART_ROM EQU 0 CART_ROM_MBC1 EQU 1 CART_ROM_MBC1_RAM EQU 2 CART_ROM_MBC1_RAM_BAT EQU 3 CART_ROM_MBC2 EQU 5 CART_ROM_MBC2_BAT EQU 6 CART_ROM_RAM EQU 8 CART_ROM_RAM_BAT EQU 9 CART_ROM_256K EQU 0 CART_ROM_512K EQU 1 CART_ROM_1M EQU 2 CART_ROM_2M EQU 3 CART_ROM_4M EQU 4 CART_ROM_8M EQU 5 CART_ROM_16M EQU 6 CART_RAM_NONE EQU 0 CART_RAM_16K EQU 1 CART_RAM_64K EQU 1 CART_RAM_256K EQU 3 ;*************************************************************************** ;* ;* Keypad related ;* ;*************************************************************************** PADF_DOWN EQU $80 PADF_UP EQU $40 PADF_LEFT EQU $20 PADF_RIGHT EQU $10 PADF_START EQU $08 PADF_SELECT EQU $04 PADF_B EQU $02 PADF_A EQU $01 PADB_DOWN EQU $7 PADB_UP EQU $6 PADB_LEFT EQU $5 PADB_RIGHT EQU $4 PADB_START EQU $3 PADB_SELECT EQU $2 PADB_B EQU $1 PADB_A EQU $0 ;*************************************************************************** ;* ;* Screen related ;* ;*************************************************************************** SCRN_X EQU 160 ; Width of screen in pixels SCRN_Y EQU 144 ; Height of screen in pixels SCRN_X_B )LCDCF_BG9C00rAUD4POLYB8b")LCDCF_OBJ8pa(`aBa#(a(`aa(`a1/1 ; -- ldh a,[rSTAT] and STATF_BUSY jr nz,@-4 @(`a$a WARN "Version \1 or later of 'hardware.inc' is required." ENDC HIG(`a$aE) ; -- Frequency hi (W) ; -- ; -- see AUD1HIGH for info ; -- rNR34 EQU $1E rAUD3HIGH EQU rNR34 ; -- ; -- AUD4LEN/NR41 ($FF20) ; -- Sound length (R/W) ; -- ; -- Bit 5-0 - Sound length data (# 0-63) ; -- rNR41 EQU $20 rAUD4LEN EQU rNR41 ; -- ; -- AUD4ENV/NR42 ($FF21) ; -- Envelope (R/W) ; -- ; -- see AUD1ENV for info ; -- rNR42 EQU $21 rAUD4ENV EQU rNR42 ; -- ; -- AUD4POLY/NR42 ($FF22) ; -- Polynomial counter (R/W) ; -- ; -- Bit 7-4 - Selection of the shift clock frequency of the (scf) ; -- polynomial counter (0000-1101) ; -- freqEQUdrf*1/2^scf (not sure) ; -- Bit 3 - Selection of the polynomial counter's step ; -- 0: 15 steps ; -- 1: 7 steps ; -- Bit 2-0 - Selection of the dividing ratio of frequencies (drf) ; -- 000: f/4 001: f/8 010: f/16 011: f/24 ; -- 100: f/32 101: f/40 110: f/48 111: f/56 (fEQU4.194304 Mhz) ; -- rNR42_2 EQU $22 rAUD4POLY EQU rNR42_2 ; -- ; -- AUD4GO/NR43 ($FF23) ; -- (has wrong name and value (ff30) in Dr.Pan's doc!) ; -- ; -- Bit 7 - Inital ; -- Bit 6 - Counter/consecutive selection ; -- rNR43 EQU $23 rAUD4GO EQU rNR43 ; silly name! ;*************************************************************************** ;* ;* Cart related ;* ;*************************************************************************** CART_ROM EQU 0 CART_ROM_MBC1 EQU 1 CART_ROM_MBC1_RAM EQU 2 CART_ROM_MBC1_RAM_BAT EQU 3 CART_ROM_MBC2 EQU 5 CART_ROM_MBC2_BAT EQU 6 CART_ROM_RAM EQU 8 CART_ROM_RAM_BAT EQU 9 CART_ROM_256K EQU 0 CART_ROM_512K EQU 1 CART_ROM_1M EQU 2 CART_ROM_2M EQU 3 CART_ROM_4M EQU 4 CART_ROM_8M EQU 5 CART_ROM_16M EQU 6 CART_RAM_NONE EQU 0 CART_RAM_16K EQU 1 CART_RAM_64K EQU 1 CART_RAM_256K EQU 3 ;*************************************************************************** ;* ;* Keypad related ;* ;*************************************************************************** PADF_DOWN EQU $80 PADF_UP EQU $40 PADF_LEFT EQU $20 PADF_RIGHT EQU $10 PADF_START EQU $08 PADF_SELECT EQU $04 PADF_B EQU $02 PADF_A EQU $01 PADB_DOWN EQU $7 PADB_UP EQU $6 PADB_LEFT EQU $5 PADB_RIGHT EQU $4 PADB_START EQU $3 PADB_SELECT EQU $2 PADB_B EQU $1 PADB_A EQU $0 ;*************************************************************************** ;* ;* Screen related ;* ;*************************************************************************** SCRN_X EQU 160 ; Width of screen in pixels SCRN_Y EQU 144 ; Height of screen in pixels SCRN_X_B (`a$aBaPrAUD3ENA EQU 20 ; Width of screen in bytes SCRN_Y_B EQU 18 ; Height of screen in bytes SCRN_VX EQU 256 ; Virtual width of screen in pixels SCRN_VY EQU 256 ; Virtual height of screen in pixels SCRN_VX_B EQU 32 ; Virtual width of screen in bytes SCRN_VY_B EQU 32 ; Virtual height of screen in bytes NINTENDO_LOGO: MACRO ;* ;* Nintendo scrolling logo ;* (Code won't work on a real GameBoy) ;* (if next six lines are altered.) DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E ENDM ENDC ;HARDWARE_INC rNR30 ; -- ; -- AUD3LEN/NR31 ($FF1B) ; -- Sound length (R/W) ; -- ; -- Bit 7-0 - Sound length ; |(`a(aest ;* bc - bytecount ;* ;*************************************************************************** mem_CopyVRAM:: inc b inc c jr .skip .loop di lcd_WaitVRAM ld a,[hl+] ld [de],a ei inc de .skip dec c jr nz,.loop dec b jr nz,.loop ret ENDC ;MEMORY1_ASM rNR12 EQU $12 rAUD1ENV EQU rNR12 rNR13 EQU $13 rAUD1LOW EQU rNR13 rNR14 EQU $14 rAUD1HIGH EQU rNR14 rNR21 EQU $16 rAUD2LEN EQU rNR21 )MEMORY1_ASM17 rAUD2ENV EQU rNR22 rNR23 EQU $18 rAUD2LOW EQU rNR23 rNR24 EQU $19 rAUD2HIGH EQU rNR24 D  IF \1 > 1.0 WARN "Version \1 or later of 'memory1.asm' is required." ENDC !|a$ac:\A\GB\include\memory1.asm rNR31 EQU $1B rAUD3LEN EQU rNR31  (`a$a ; Width of screen in bytes SCRN_Y_B EQU 18 ; Height of screen in bytes SCRN_VX EQU 256 ; Virtual width of screen in pixels SCRN_VY EQU 256 ; Virtual height of screen in pixels SCRN_VX_B EQU 32 ; Virtual width of screen in bytes SCRN_VY_B EQU 32 ; Virtual height of screen in bytes NINTENDO_LOGO: MACRO ;* ;* Nintendo scrolling logo ;* (Code won't work on a real GameBoy) ;* (if next six lines are altered.) DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E ENDM ENDC ;HARDWARE_INC rNR30 ; -- ; -- AUD3LEN/NR31 ($FF1B) ; -- Sound length (R/W) ; -- ; -- Bit 7-0 - Sound length ; -- rNR31 EQU $1B rAUD3LEN EQU rNR31 ; -- ; -- AUD3LEVEL/NR32 ($FF1C) ; -- Select output level ; -- ; -- Bit 6-5 - Select output level ; -- 00: 0/1 (mute) ; -- 01: $0,$0,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #12 db $0,$0,$0,$0,$0,$0,$0,R$0,aa asi.asm$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #13 db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 db $0,$0,$0U0,$LaXa asi.asm0,$0,$0,$0,$0,$0,$0,$0 ; Row #14 db $0,$0,$0,$a,$b,$c,$0,$a,$b,$c,$0,$a,$b,$c,$0,$a db $b,$c,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0j,$0 aa1si.asm,$0,$1a,$1b,$1c,$0,$1a,$1b,$1c,$0,$1a,$1b,$1c,$0,$1a db $1b,$1c,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 u Ȣaآa$si.asm0,$0,$0,$0 db $0,$0,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #17 db $0,$0,$0,$0,$0,$d,$e,$0,$0,$0z,$0aa asi.asm,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #18 ; db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20 ; d,$2Da a ca`a Phapa Laa(a( 000002      &D8>@!E ! >G10>@A>>@!" !P>"  z0P0P z/E&~C!<0O~" >1si.asm] si.asm`si.asmb si.asmesi.asmk si.asml si.asmzsi.asm& si.asm6si.asm9 si.asm=si.asmB si.asmRsi.asmUsi.asmj si.asmu si.asmzsi.asm? hl,TileData+1 ld de,$8000 ld bc,$1000 call mem_Copy ; Copy tile set to memory ld hl,MapData+4 ld de,$9800 ld bc,$0400 call mem_Copy ; Copy tile map to memory ld a,$c0 ldh [rBGP],a ; Set BG default colors xor a ;Initialize interupt vars ld [VBlankDone],a ld [XOffset],a ld a,$40 ; Set LCDC Intr to LYC ldh [rSTAT],a ld a,3 ldh [rIE],a ;enable LCD interrupt ld a,%10010101 ; LCD Controller = On ldh [rLCDC],a ei ; Clear whole X offset table to 00 ld hl,XOffsetTable ld b,144 clroff1: xor a ld [hl+],a dec b jr nz,clroff1 ; Position "invaders" to the right side of screen ld hl,XOffsetTable + 8 ld b,80 clroff2: ld a,$ec ld [hl+],a dec b jr nz,clroff2 ;* Main Loop - scroll Invaders 32 pixels to the left * ;* then 32 pixels to the right & start over. * ld d,1 loop1: ld c,32 loop2: ld a,d ld [XOffset],a call VBlankWait xor a ld [XOffset],a ld b,5 loop3: call VBlankWait dec b jr nz,lo)SPR_DMAsi.asmB(aHaȠa E(`a$aBasi.asmsi.asm@@@BܙaSTATF_VB] Saasi.asmB (`a(a,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db `$0,\6aasi.asm; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; b; d SaDasi.asm0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #28 ; db $0,$0,$0,$0,$e0,$Saasi.asm; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #29 ; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$k ; d_aasi.asm0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #30 ; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$l 0,$_aTasi.asm; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #31 ; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$z; da a8aLa asi.asm0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #5 db $0,$0,$8,$0,$8,$0,$8,$0,$8,$0,$8,$0,$8,$0,$8,$0 db $8,$0,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,& ; Мaa si.asmb $0,$0,$9,$0,$9,$0,$9,$0,$9,$0,$9,$0,$9,$0,$9,$0 db $9,$0,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row6$0,aa asi.asm$0,$9,$0 db $9,$0,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #8 db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$09,$0\aha 4+aPa asi.asm$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,$0 ; Row #9 db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 db $0,$0,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0=,$0a$a asi.asmw #10 db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 db $0,$0,$0,$0,$20,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0 ; db $0,$0,$0,$0,$0,$0,$0,B #1ԟaa asi.asm,$0,$0,$0,$0,$0,$0 db b,5 loop3: call VBlankWait dec b jr nz,loop3 dec c jr nz,loop2 ld a,d cpl inc a ld d,a jr loop1 VBlankWait: xor a ld [VBlankDone],a lpp1: ld a,[VBlankDone] or a jr z,lpp1 ret LCDIntr: push af push hl ldh a,[$45] ld l,a inc a cp 144 jr nz,l2947 ld a,1 l2947: ldh [$45],a ld h,XOffsetTable / 256 ld a,[hl] ldh [$43],a pop hl pop af reti VBlankIntr: push af push bc push hl ld hl,XOffsetTable + $17 ld b,60 ld a,[XOffset] ld c,a Vloop: ld a,[hl] add a,c ld [hl+],a dec b jr nz,Vloop ld a,1 ld [VBlankDone],a pop hl pop bc pop af reti (`a|a dec c jr nz,loop2 ; d = -d ld a,d cpl inc a ld d,a jr loop1 ; Wait for VBlank Interrupt to occur VBlankWait: xor a ld [VBlankDone],a lpp1: ld a,[VBlankDone] or a jr z,lpp1 ret ; LCD Interrupt Routine LCDIntr: push af push hl ldh a,[$45] ld l,a inc a cp 144 ; $90 jr nz,l2947 ld a,1 l2947: ldh [$45],a ; Set scroll X register ld h,XOffsetTable / 256 ld a,[hl] ldh [$43],a ; ScrollX = [$c000 + [$45]] pop hl pop af reti ; VBlank Interrupt Routine VBlankIntr: push af push bc push hl ld hl,XOffsetTable + $17 ld b,60 ld a,[XOffset] ld c,a Vloop: ld a,[hl] add a,c ld [hl+],a dec b jr nz,Vloop ld a,1 ld [VBlankDone],a pop hl pop bc pop af reti 8k db 1,1 ; Maker ID db 0 ; Version =0 db $e2 ; Complement check (important) dw $c40e ; Checksum (not important) INCLUDE "memory1.asm" INCLUDE "export.asm" begin: di ; The stack initializes to $FFFE xor a ;a = 0 ldh [rIF],a ;clear pending interrupts ldh [rIE],a ;disable interrupts ldh [$26],a ;kill all sounds ; Must be in VBL before turning the screen off. WaitVBL: ldh a,[rLY] ; $ff44=LCDC Y-Pos cp $90 ; $90 and bigger = in VBL jr c,WaitVBL ; Loop until it is $90 or > ld a,%00010101 ; LCD Controller = Off [No picture on screen] ; WindowBank = $9800 [Not used] ; Window = OFF ; BG Chr = $8000 ; BG Bank= $9800 ; OBJ = 8x16 ; OBJ = Off ; BG = On ldh [rLCDC],a ld