;#define Francais #define English .nolist #INCLUDE "DWEDIT.INC" .list #ifdef TI83P ;Quand on compile pour 83+: .org progstart-2 ;indique l'adresse de début du fichier quand on l'exécute .db $BB,$6D ;sert à identifier le fichier comme programme en asm #else ;Si on compile pas pour 83+, c'est pour 83- .org progstart ;indique l'adresse de début du fichier quand on l'exécute #endif ;à la suite, c'est pareil pour 83 et 83+ ret ;Si on exécute ce fichier du tios, il quitte tout de suite jr nc,start ;saute à l'adresse de start .db "Bouncy!",0 ;description du programme start: ;icone : ;.db 00003F806DC05B4076C0 ;.db 3F800018003C003C0018 ;.db 00007FF853283FF00000 #define STextWrite set 7,(iy+14h) #define RTextWrite res 7,(iy+14h) #define STextInverse set 3,(iy+05h) #define RTextInverse res 3,(iy+05h) #define frstlvl saferam5 #define prelvladr frstlvl+2 #define adrlvl prelvladr+2 #define AdrLVL adrlvl+2 #define adrbrique AdrLVL+2 #define pausebarresave RamStart ; (256 octets) #define brictombante pausebarresave+156 #define decalageecransave saferam4 #define nextlvlt AppBackupScreen ; (123 octets avant la table de 9a pour l'interuption) #define xlvl nextlvlt+2 #define nmrlvl xlvl+1 #define Hscore nmrlvl+1 #define Btime Hscore+2 #define nligne Btime+2 #define nbrligne nligne+1 #define temps nbrligne+1 #define taillelvlflash temps+2 #define extention taillelvlflash+2 #define xbat extention+3 #define xbatN xbat+1 #define dimbat xbatN+1 #define rdimbat dimbat+1 #define xlazer rdimbat+1 #define xglu xlazer+1 #define dir xglu+1 #define xpos dir+1 #define xposN xpos+1 #define ypos xposN+1 #define yposN ypos+1 #define xdern yposN+1 #define ydern xdern+1 #define perdu ydern+1 #define vie perdu+1 #define stoptemp vie+1 #define initialisationzero stoptemp+2 #define bonus initialisationzero #define vitesse bonus+1 #define glu vitesse+1 #define tempsglu glu+1 #define nbrball tempsglu+2 #define invsens nbrball+1 #define icebat invsens+2 #define fury icebat+2 #define barre fury+1 #define rbll barre+2 #define lazer rbll+1 #define ylazer lazer+1 #define score ylazer+1 #define deuxcentieme score+2 #define secjeu deuxcentieme+2 #define decalageecran secjeu+2 #define decalagebric decalageecran+1 #define brictombanteY decalagebric+1 #define tempsexplosion brictombanteY+1 #define nbombe tempsexplosion+1 #define nomlvl nbombe+1 #define particuleballe nomlvl+9 #define bombe particuleballe+1 #define adrballes saferam1 #define adrbonus tempSwapArea #define briclvl saferam3 #define bonuslvl briclvl+56 restart: di ;on désactive les interruptions pendant l'installation de notre routine ld hl,$9900 ;\ ld de,$9901 ; |Création de la table de 256 ld bc,256 ; |octets, remplie toujours de $9a ld (hl),$9a ; | ldir ;/ ld hl,interrupt_start ;\ ld de,$9a9a ; |copie toute la routine d'interruption ld bc,interrupt_end-interrupt_start ; |à l'adresse $9a9a ldir ;/ ld a,$99 ;\Charge dans i le vecteur de l'interruption: $99 ld i,a ;/On doit avant charger la valeur dans a, puis charger a dans i im 2 ;L'interruption est installée, on active maintenant le mode 2 ei ;On peut alors réactiver les interruptions. ld hl,0 ld (temps),hl xor a ld (decalagebric),a ld (nomlvl+8),a bcall(_zeroop1) ld a,$15 ld (op1),a cherchepremier: ld a,$44 ; Up call chargeniveau STextWrite jp nc,selectlvl erreur: ;ERREUR aucun niveau trouvé #ifdef Francais ld hl,256*2+3 #endif #ifdef English ld hl,256*1+3 #endif ld (currow),hl ld hl,erreurS bcall(_puts) bcall(_getkey) ret selectlvl ld a,-1 ld (dirlvl+1),a raffmenu: ld hl,bnscoefdif ld a,(difficulte) ld e,a add a,a add a,a add a,a add a,a sub e ld d,0 ld e,a add hl,de ld de,bnscoef ld bc,15 ldir ld hl,(adrlvl) call dezip bcall(_cleargbuf) call affbric ld hl,256*50+6 ld (pencol),hl ld de,nomlvl ld hl,op1+1 ld bc,8 ldir ld hl,nomlvl bcall(_vputs) ld hl,58*256+9 ld (pencol),hl ld a,(xlvl) inc a call affa ld a,'/' bcall(_vputmap) ld a,(nmrlvl) inc a call affa STextInverse ld hl,256*49+46 ld (pencol),hl ld a,(difficulte) cp 3 jr z,affbtime ld hl,(Hscore) push hl ld hl,HightscoreS jr affhscore affbtime: ld hl,(Btime) push hl ld hl,BestTimeS affhscore: bcall(_vputs) pop hl call affhl RTextInverse ld hl,256*50+84 ld (pencol),hl ld a,(vitesseball) call affa1 ld a,75 ld l,49 ld bc,256*15+3 ld ix,vitesseS call largesprite ld hl,256*57+55 ld (pencol),hl ld hl,difficulteS ld a,(difficulte) ld e,a add a,a add a,a add a,e ld d,0 ld e,a add hl,de bcall(_vputs) ld a,53 ld l,56 ld bc,256*8+3 ld ix,boutonS call largesprite xor a ld l,49 ld ix,fleche ld b,15 call ionputsprite slctlvlkey ld a,(temps) cp 48 jp m,montrenivpasraf xor a ld (temps),a call ionfastcopy call affbric ld a,(nbrligne) or a jr z,montrenivpasbas ld a,(nligne) dirlvl: add a,0 ld (nligne),a ld bc,(nbrligne) cp c jr nz,montrenivpashaut ld a,-1 ld (dirlvl+1),a montrenivpashaut: or a jr nz,montrenivpasbas ld a,1 ld (dirlvl+1),a montrenivpasbas: ld hl,(adrlvl) call dezip call affbric montrenivpasraf: halt bcall(_getcsc) cp $37 ret z cp $32 jr nz,difficultepasinc ld a,(difficulte) inc a cp 4 jr nz,difficultepasreset xor a difficultepasreset: ld (difficulte),a jp raffmenu difficultepasinc cp $31 jr nz,vitessepasinc ld a,(vitesseball) inc a cp 10 jr nz,vitessepasreset xor a vitessepasreset: ld (vitesseball),a jp raffmenu vitessepasinc: cp 02 jp nz,selectpasgauche ld a,(xlvl) or a jp z,slctlvlkey call prelvl jp selectlvl selectpasgauche: cp 03 jp nz,slctpasdr ld bc,(xlvl) ld a,(nmrlvl) cp c jp z,slctlvlkey call nextlvl jp selectlvl slctpasdr: cp 04 jp nz,selecetpashaut selecthaut: ld a,$44 ; Up call chargeniveau jp nc,paspremierniveau xor a ld (op1+1),a call chargeniveaumemesense paspremierniveau: jp selectlvl selecetpashaut: cp 01 jr nz,slctpasbas selectbas: ld a,$47 ; Down call chargeniveau jp nc,pasdernierniveau ld a,255 ld (op1+1),a call chargeniveaumemesense pasdernierniveau: jp selectlvl slctpasbas: cp $36 jp nz,slctlvlkey di ;on désactive les interruptions pendant l'installation de notre routine ld hl,$9900 ;\ ld de,$9901 ; |Création de la table de 256 ld bc,256 ; |octets, remplie toujours de $9a ld (hl),$9a ; | ldir ;/ ld hl,interruptj_start ;\ ld de,$9a9a ; |copie toute la routine d'interruption ld bc,interruptj_end-interrupt_start ; |à l'adresse $9a9a ldir ;/ ld a,$99 ;\Charge dans i le vecteur de l'interruption: $99 ld i,a ;/On doit avant charger la valeur dans a, puis charger a dans i im 2 ;L'interruption est installée, on active maintenant le mode 2 ei ;On peut alors réactiver les interruptions. restartcontrelamontre: ld a,(nbrligne) ld (nligne),a ; ld hl,(adrlvl) ; call dezip call clearbric ld hl,(adrlvl) inc hl inc hl ld a,(hl) ld (stoptemp+1),a inc hl ld a,(hl) ld (stoptemp),a ld a,255 ld (dir),a ld a,4 ld (nextlvlt),a ld a,(nligne) add a,7 ld (nligne),a ld a,32 ld (vie),a ; ld hl,0 ; ld (deuxcentieme),hl ; ld (secjeu),hl ; ld (score),hl ; xor a ; ld (decalagebric),a ; ld (brictombanteY),a ; ld (decalageecran),a ; ld (nbombe),a ; ld (tempsexplosion),a ld hl,initialisationzero ld (hl),0 ld de,initialisationzero+1 ld bc,26 ldir reini: ld a,$FF out (1),a ld a,$BF out (1),a in a,(1) cp $DF jr z,reini bcall(_cleargbuf) ld bc,3 ; call inilvl ld hl,ininwlvl ld de,xbatN ldir call affbric call affbat call creatbll debut: ;################################################################## ;# # ;# Affichage et collision du laser # ;# # ;################################################################## ld a,(ylazer) or a jp z,paslazer call afflazer ld a,(xlazer) ld b,$0C call divabyb ld d,a ld hl,ylazer dec (hl) ld a,(hl) ; cp $30 ; jp p,lzpasbric ld b,7 call divabyb cp 7 jp p,lzpasbric ld e,a ld (xybric+1),de push de add a,a add a,a add a,a ; and $F8 add a,d ld hl,briclvl ld d,0 ld e,a add hl,de pop de ld a,(hl) or a jp z,lzpasbric cp 6+1 jp p,lzpasbric push af xor a ld (ylazer),a ld a,d add a,a add a,d add a,a add a,a ld d,a ld a,e add a,a add a,a add a,a sub e ld e,a pop af call postcollisionbrique ; cp 6 ; jp z,lzpasbric ; cp 4 ; jr z,lazerbombe ; cp 5 ; jr nz,lazerpasbombe ;lazerbombe: ; ld h,a ; ld a,(xlazer) ; ld b,12 ; call divabyb ; ld d,a ; ld a,(ylazer) ; ld b,7 ; call divabyb ; ld e,a ; ld a,h ; call amorcebombe ; jr lzpasbric ;lazerpasbombe: ; push hl ; call affbric ; pop hl ; dec (hl) ; call affbric ; jp paslazer lzpasbric: ld a,(ylazer) or a call nz,afflazer paslazer: ;################################################################## ;# # ;# Affichage et collision des bonus # ;# # ;################################################################## ld hl,bonus ld a,(hl) or a jp z,pasbonus ld hl,adrbonus bonuss: push af call bonushlix inc hl ld c,(hl) inc hl ld a,(decalagebric) or a jr z,pasdecalagbonus ld a,(decalagebric) ; xor %1111 1111 cpl and %0000 1111 jr nz,pasdecalagbonus inc (hl) pasdecalagbonus: ld d,(hl) inc hl ld e,(hl) ld b,07 ld a,d cp 64 jp p,bonusdel cp 57 jp m,bonuspaspxlo ld a,64 sub d ld b,a bonuspaspxlo: ld a,e cp $E0 ld a,c jp nz,bonuspaspxl ld c,02 push hl ld l,d push ix push de push af call largesprite pop af pop de pop ix pop hl bonuspaspxl: ex de,hl ld bc,$0020 add hl,bc ex de,hl ld (hl),e dec hl ld (hl),d ld c,a ld a,d cp 57 ld a,c ld b,07 jp m,bonuspasf ; ld c,a ; ld a,d ; cp 64 ; ld a,c ; jp m,bonuspasf2 bonusdel: ld d,h ld e,l push hl ;.db 1B1B2323 dec de dec de inc hl inc hl ld bc,bonus ld a,(bc) dec a ld (bc),a inc a add a,a add a,a ld b,00 ld c,a ldir pop hl dec hl dec hl jp bonusf bonuspasf2: ld c,a ld a,64 sub d ld b,a ld a,c bonuspasf: inc hl inc hl push hl ld l,a ld a,e or a jp nz,bonuspaspxl2 ld a,l ld h,a ld l,d push hl ld hl,xbatN ld c,(hl) pop hl ld a,l cp 53 jp m,bonuspasdel cp 62 jp p,bonuspasdel ld a,h add a,$0C cp c jp m,bonuspasdel push af ld a,(dimbat) add a,a add a,a ld e,a pop af sub e sub 20 cp c jp p,bonuspasdel pop hl dec hl dec hl dec hl dec hl ld a,(hl) push hl inc a cp 08 jp nz,bnspasglu ld (glu),a ld hl,(tempsglu) ld de,1024 add hl,de ld (tempsglu),hl bnspasglu: cp 01 jr nz,bnspasvie ld hl,vie inc (hl) bnspasvie: cp 11 jr nz,bnspasmort push hl ld hl,vie dec (hl) pop hl jp z,quitescore bnspasmort: cp 10 jr nz,bnspasscore ld hl,(score) ld de,10 add hl,de ld (score),hl bnspasscore: cp 02 jp nz,bnspasnxtlvl ld a,(nextlvlt) set 0,a ld (nextlvlt),a and %0001 0000 jr nz,bnspasnxtlvl ld a,1 ld (decalageecran),a bnspasnxtlvl: cp $0C jp nz,bnspasprelvl ld a,(nextlvlt) set 1,a ld (nextlvlt),a and %0001 0000 jr nz,bnspasprelvl ld a,1 ld (decalageecran),a bnspasprelvl: cp 05 jp nz,bnspaslazer ld hl,lazer inc (hl) inc (hl) inc (hl) inc (hl) bnspaslazer: cp 06 jp nz,bnspasrbll ld a,$FF ;/!\ ld (rbll),a ld hl,(score) ld de,24 add hl,de ld (score),hl bnspasrbll: cp 09 jp nz,bnspasbarre ld hl,(barre) ld de,0 or a sbc hl,de push hl call z,affbarre pop hl ld de,512 add hl,de ld (barre),hl bnspasbarre: cp 04 jp nz,bnspasnbll push bc push af call creatbll pop af pop bc bnspasnbll: cp 03 jp nz,bnspasfury ld a,4 ;/!\ ld (fury),a bnspasfury: cp $0D jp nz,bnspasinv ld hl,(invsens) ld de,256 add hl,de ld (invsens),hl ld hl,(score) ld de,32 add hl,de ld (score),hl bnspasinv: cp $0E jp nz,bnspasice ld hl,(icebat) ld de,256 add hl,de ld (icebat),hl ld hl,(score) ld de,10 add hl,de ld (score),hl bnspasice: cp 07 jp nz,bnspasdimp push af ld a,(dimbat) cp 04 jp z,dimpasp push bc call affbat ld hl,dimbat inc (hl) ld hl,rdimbat ld a,(hl) add a,04 ld (hl),a ld b,a ld a,(xbatN) dec a dec a cp 0 jp p,bnsdimppasecranm xor a bnsdimppasecranm: ld c,a add a,b ld b,a ld a,95 sub b jp p,bnsdimppasecranp add a,c ld c,a bnsdimppasecranp: ld a,c ld (xbatN),a call affbat pop bc dimpasp: pop af bnspasdimp: cp $0F jp nz,bnspasdimm push af ld hl,(score) ld de,24 add hl,de ld (score),hl ld a,(dimbat) or a jp z,dimpasm push bc call affbat ld hl,dimbat dec (hl) ld hl,rdimbat ld a,(hl) sub 04 ld (hl),a ld hl,xbatN inc (hl) inc (hl) call affbat pop bc dimpasm: pop af bnspasdimm: pop hl inc hl inc hl jp bonusdel bonuspasdel: ld a,h ld c,02 call largesprite bonuspaspxl2: pop hl bonusf: pop af dec a or a jp nz,bonuss pasbonus: ;################################################################## ;# # ;# Affichage et collision des balles # ;# (et création des bonus) # ;# # ;################################################################## ; xor a ; ld (nextlvlt),a ld hl,rbll ld a,(hl) or a jp z,pastremble dec (hl) pastremble ld a,(nbrball) or a jp nz,viepasperdue call creatbll ld a,(vie) dec a or a jp z,quitescore ld (vie),a viepasperdue: ld a,(nbrball) ld hl,adrballes ;$87CC nxtball: ld de,xglu ld bc,6 ldir push af push hl ld a,(decalageecran) cpl and %0011 0000 jr nz,pastdtdeviball ; and %0011 0000 ; cp %0011 0000 ; jr nz,pastdtdeviball ld b,02 call defaults pastdtdeviball: xor a ld (perdu),a ld a,(xglu) bit 7,a jr nz,droitexglu ld a,1 jr gauchexglu droitexglu: ld a,255 gauchexglu: ld (sensxglu+1),a ld a,(xglu) and %0100 0000 ld (particuleballe),a jr z,ballpasparticule ld a,(tempsexplosion) cp 1 jr nz,particulepasdetruite ld a,1 ld (perdu),a particulepasdetruite: ballpasparticule: ld a,(xglu) and %0011 1111 ld (xglu),a ld a,(decalagebric) or a jr z,pasdecalagball ld a,(decalagebric) ; xor %1111 1111 cpl and %0000 1111 jr nz,pasdecalagball ; ld hl,ydern ; inc (hl) ld hl,yposN inc (hl) pasdecalagball: ld a,(xposN) ld (xdern),a ld a,(yposN) ld (ydern),a ld a,(yposN) cp 63 jp p,dernballpasaff ld l,a ld a,64 sub l ld b,a cp 6 jp m,daffyp ld b,5 daffyp ld a,(xposN) ld ix,ball call ionputsprite dernballpasaff: ld a,(rbll) or a jp z,pasrbll ld b,02 call defaults pasrbll ld a,(xglu) or a jr z,pasglu ld a,(glu) or a jr nz,glupasviseur ld a,(rdimbat) add a,4 ld c,a ld a,(xglu) sensxglu: add a,0 ld (xglu),a cp c jp m,pasviseurD ld a,-1 ld (sensxglu+1),a jr pasviseurG pasviseurD: cp 2 jp p,pasviseurG ld a,1 ld (sensxglu+1),a pasviseurG: glupasviseur: ld a,$10 ld (dir),a ld a,(xbatN) ld hl,(xglu) add a,l sub 5 ld (xposN),a jp bllmovf pasglu ld a,(particuleballe) or a jr z,pastestralparticule ld a,(bombe) and %1000 0000 jr nz,pastestralpetiteparticule ld a,(tempsexplosion) and %0000 0001 jr nz,bllmovf pastestralpetiteparticule: pastestralparticule: ld d,0 ld a,(dir) cp $10 jp m,XpYp cp $20 jp m,XmYp cp $30 jp m,XmYm jp XpYm bllmovf ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ld a,(particuleballe) or a jp nz,particulepascoll ld a,(yposN) ld bc,(decalagebric-1) sra b sra b sra b sra b add a,b ;sub b jr nc,calcycllpasneg xor a calcycllpasneg: ld b,7 call divabyb ld e,a add a,a add a,a add a,a ld l,a ld a,(xposN) ld b,12 call divabyb ld d,a add a,l ld b,0 ld c,a ld hl,briclvl add hl,bc call cllbric inc hl inc d call cllbric ld bc,7 add hl,bc dec d inc e call cllbric inc hl inc d call cllbric ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ld a,(yposN) cp 55 jp m,cbatF cp 62 jp p,cbatF ld bc,(xbatN) ld a,(xposN) add a,04 cp c jp m,cbatF sub 04 ld de,(rdimbat) sub e cp c jp p,cbatF add a,e sub c add a,04 srl e srl e inc e ld b,e add a,a add a,a call divabyb add a,a or a jp nz,cbatpg ld a,$01 cbatpg: cp $20 jp nz,cbatpd ld a,$1F cbatpd: add a,$20 ld (dir),a ld hl,yposN ld (hl),$36 ld a,(glu) cp 8 jr nz,cbatF ld a,(xposN) ld bc,(xbatN) sub c add a,5 ld (xglu),a cbatF: particulepascoll: ld a,(xposN) cp $5C jp m,pasxp call bounceX ld a,$5B ld (xposN),a pasxp: or a jp p,pasxm call bounceX xor a ld (xposN),a pasxm: push af ld a,(yposN) cp 60 jp m,pasyp push af ld hl,(barre) ld de,0 or a sbc hl,de jr z,pasbarrecll pop af ld a,60 push af ld (yposN),a call bounceY jr barrecllfin pasbarrecll: ld a,(yposN) cp 64 jp m,barrecllfin ld hl,perdu ld (hl),1 barrecllfin: pop af pasyp: or a jp p,pasym call bounceY xor a ld (yposN),a pasym: ld l,a pop af ld h,a ld a,l cp 63 jp p,balledisparue ld a,(particuleballe) or a jr z,ballaffpasparticule ld a,(tempsexplosion) cp 1 jr z,balledisparue ballaffpasparticule: ld a,64 sub l ld b,a cp 6 jp m,affyp ld b,5 affyp ld a,h ld ix,ball call ionputsprite balledisparue: pop hl ld bc,6 ld d,h ld e,l or a sbc hl,bc ld a,(perdu) or a jr z,ballepasperdue pop af push af push hl or a jr z,derniereballeperdue add a,a add a,a add a,a ld b,0 ld c,a ex de,hl ldir derniereballeperdue: ld a,(nbrball) dec a ld (nbrball),a ; ld a,(ydern) ; cp 63 ; jr nz,ballperdu ; ld l,a ; ld a,(xdern) ; ld ix,ball ; ld b,1 ; call ionputsprite pop hl jr ballperdu ballepasperdue: ex de,hl ld a,(sensxglu+1) and %1000 0000 ld hl,xglu ld b,(hl) or b ld b,a ld a,(particuleballe) or b ld (hl),a ld bc,6 ldir ex de,hl ballperdu: pop af dec a or a jp nz,nxtball ballpasmove: ld a,(nbrball) or a jp nz,viepasperdue2 call creatbll ld a,(vie) dec a or a jp z,quitescore ld (vie),a viepasperdue2: ;################################################################## ;# # ;# Création lazer et Balle contre vie # ;# # ;################################################################## ld a,$FF out (1),a ld a,$DF out (1),a in a,(1) cp $7F call z,alpha cp $BF call nz,pasmath call z,math ;################################################################## ;# # ;# Gestion de la montée de l'écran # ;# # ;################################################################## ld a,(decalagebric) or a jp nz,decalagbric ld a,(nextlvlt) and %1111 0100 ; or a jp nz,forcenextligne ld hl,briclvl+55 ld c,%1000 0000 testnextlignestop: ld b,8 testnextligne: ld a,(hl) dec hl or a jr z,testnextlignesuite bit 4,a jp nz,pasnextligne cp 6 jp p,testnextlignesuite jp pasnextligne testnextlignesuite: djnz testnextligne ; ld a,(nligne) ; or a ; jr z,pasnextligne ld de,(stoptemp) ld a,c srl c and d ; or a jr nz,testnextlignestop ld hl,(nligne) ld h,0 ld de,6 add hl,de add hl,hl add hl,hl ld de,(adrbrique) add hl,de ld ix,briquepoints ld bc,4*256+0 sommelignepoints: ld a,(hl) and %0000 1111 ld (briquepointsl+2),a briquepointsl: ld a,(ix+0) add a,c ld c,a ld a,(hl) and %1111 0000 rra rra rra rra ld (briquepointsh+2),a briquepointsh: ld a,(ix+0) add a,c ld c,a inc hl djnz sommelignepoints ld hl,(score) add hl,bc ld (score),hl ld bc,(nligne) ld a,(nbrligne) sub c ld c,a and %0000 0111 ; or a jr nz,pasdecalagestop ld a,c srl a srl a srl a inc a inc a ld d,0 ld e,a ld hl,(adrlvl) inc hl add hl,de ld a,(hl) ld hl,(stoptemp) ld l,a ld (stoptemp),hl pasdecalagestop: ld hl,(stoptemp) ld a,h and %0111 1111 ld h,a add hl,hl ld (stoptemp),hl ;test: ; ld a,$FF ; out (1),a ; ld a,$F7 ; out (1),a ; in a,(1) ; cp $7F ; jr nz,test forcenextligne: ld a,(nbombe) or a jr z,pasdecalagebombe ld hl,bombe ld b,a decalagebombe: inc (hl) inc hl djnz decalagebombe pasdecalagebombe: ld hl,briclvl+48 ld b,8 pasbrictombantetest: ld a,(hl) or a jr nz,brictombantecalc inc hl djnz pasbrictombantetest jr brictombantepascalc brictombantecalc: call affbric ld hl,gbuf + 504 ld de,brictombante ld bc,84 ldir call affbric ld hl,gbuf + 504 ld de,brictombante ld b,84 sauvebrictombante: ld a,(de) xor (hl) ld (de),a inc de inc hl djnz sauvebrictombante ld hl,brictombante + 71 ld de,brictombante + 83 ld b,84 - 12 sauvebrictombantexor: ld a,(de) xor (hl) ld (de),a dec de dec hl djnz sauvebrictombantexor ld a,42 ld (brictombanteY),a brictombantepascalc: ld a,112 ld (decalagebric),a ld a,(nligne) or a jr z,nextlignevide dec a ld (nligne),a ld bc,(nbrligne) cp c jr nz,pasfindebutlvl ld a,(nextlvlt) res 2,a ld (nextlvlt),a pasfindebutlvl: nextlignevide: call deziphaut pasnextligne: ; jr pasdecalagbric ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; decalagbric: ld a,(decalagebric) or a jr z,pasdecalagbric ld a,$FF out (1),a ld a,$FE out (1),a in a,(1) bit 3,a jr z,hautforcedecalagebric ld a,(nextlvlt) and %1111 0100 ; or a ld a,(decalagebric) jr z,pasforcedecalagebric hautforcedecalagebric: ld a,(decalagebric) and %1111 0000 ; or a jr z,finforcedecalagebric pasforcedecalagebric: dec a finforcedecalagebric: ld (decalagebric),a ; xor %1111 1111 cpl and %0000 1111 ; or a jr nz,pasdecalagvisiblebric call decalygb call afflinebric ld a,(brictombanteY) or a jr z,decalagepasbrictombante inc a cp 64 jr nz,decalagepasbrictombantefin xor a decalagepasbrictombantefin: ld (brictombanteY),a decalagepasbrictombante: ld hl,(barre) ld de,0 or a sbc hl,de call nz,affbarre ld a,(ylazer) or a jr z,pasdecalaglazer inc a ld (ylazer),a pasdecalaglazer: pasdecalagvisiblebric: pasdecalagbric: ld hl,brictombanteY ld a,(hl) or a jr z,pasaffbrictombante inc (hl) cp 64 jr nz,affbrictombantepasfin ld (hl),0 jr pasaffbrictombante affbrictombantepasfin: ld b,84 cp 58 jp m,affbrictombantepaspartiel push af ld b,a ld a,64 sub b ld b,a add a,a add a,b add a,a add a,a ld b,a pop af affbrictombantepaspartiel: ld l,a add a,a add a,l ld h,0 ld l,a add hl,hl add hl,hl ld de,gbuf add hl,de ld de,brictombante ex de,hl affbrictombante: ld a,(de) xor (hl) ld (de),a inc hl inc de djnz affbrictombante pasaffbrictombante: ; ld hl,256*49+46 ; ld (pencol),hl ; ld hl,(temps) ; call affhl ;################################################################## ;# # ;# Teste de passage au niveau suivant # ;# # ;################################################################## ld a,(nligne) or a jr nz,restebrique ld hl,briclvl ld b,56 restebriquecassabletest: ld a,(hl) or a jr z,restebriquecassabletestsuite cp 6 jp m,restebrique restebriquecassabletestsuite: inc hl djnz restebriquecassabletest ld a,(nextlvlt) set 0,a ld (nextlvlt),a ld a,(brictombanteY) or a jr nz,restebrique ; ld a,(decalagebric) ; or a ; jr nz,restebrique ld hl,briclvl ld b,56 restebriquetest: ld a,(hl) or a jr nz,restebrique inc hl djnz restebriquetest call jnextlvl restebrique: ;################################################################## ;# # ;# Tremblement de l'écran 1/2 # ;# # ;################################################################## ld a,(decalageecran) or a jr z,pastremblement inc a ld (decalageecran),a or a jr nz,tremblementpasfin ld a,(nextlvlt) ; or a and %1111 0111 jr z,tremblementpasfin ld a,(nextlvlt) set 4,a ld (nextlvlt),a tremblementpasfin: and %0000 1100 jr nz,pastremblement ld hl,gbuf ld de,decalageecransave ld a,(decalageecran) and %0011 0000 ; or a jr z,pastremblement sra a sra a ld b,a add a,b add a,b ld b,0 ld c,a push bc ldir pop bc push bc ld hl,gbuf add hl,bc ex de,hl ld hl,768 or a sbc hl,bc ld b,h ld c,l ex de,hl ld de,gbuf ldir pop bc dec bc ld hl,gbuf+767 ld (hl),0 ld de,gbuf+766 lddr pastremblement: ;################################################################## ;# # ;# Gestion de la vitesse # ;# # ;################################################################## ld a,(vitesseball) or a jr z,imagesuivante inc a ld e,a rallentisseur: halt ld hl,(temps) ld a,h or a jr nz,imagesuivante ld a,l and %0111 1111 ;c'est bizare apparemment les registres sont signés, je ne m'en étais j'amais aperçu avant. cp e jp m,rallentisseur imagesuivante: call ionfastcopy ld hl,0 ld (temps),hl ld hl,(deuxcentieme) ; ld de,200 ld de,116 or a sbc hl,de jp m,secondepasfini ld (deuxcentieme),hl ld hl,(secjeu) inc hl ld (secjeu),hl ; ld hl,256*49+46 ; ld (pencol),hl ; ld hl,(secjeu) ; call affhl secondepasfini: ei ;################################################################## ;# # ;# Tremblement de l'écran 2/2 # ;# # ;################################################################## ld a,(decalageecran) or a jr z,pastremblement2 and %0000 1100 jr nz,pastremblement2 ld a,(decalageecran) and %0011 0000 ; or a jr z,pastremblement2 sra a sra a ld b,a add a,b add a,b ld b,0 ld c,a ld hl,gbuf+767 or a sbc hl,bc push bc ex de,hl ld hl,768 or a sbc hl,bc ld b,h ld c,l ex de,hl ld de,gbuf+767 lddr pop bc ld de,gbuf ld hl,decalageecransave ldir pastremblement2: ;################################################################## ;# # ;# Temporisation de certain évenement # ;# # ;################################################################## ld hl,(barre) ld de,0 or a sbc hl,de jp z,pasbarretemps dec hl ld (barre),hl or a sbc hl,de call z,affbarre pasbarretemps: ld hl,(tempsglu) ; ld de,0 or a sbc hl,de jp z,pasglutemps dec hl ld (tempsglu),hl or a sbc hl,de jr nz,pasfinglutemps xor a ld (glu),a pasfinglutemps: pasglutemps: ld a,(tempsexplosion) or a jr z,pasexplosiontemps dec a ld (tempsexplosion),a cp 8 push af call z,explosion pop af or a jr nz,pasexplosiontempsfin ld a,(nbombe) dec a ld (nbombe),a jr z,explosionfinale ld hl,bombe+1 ld de,bombe ld b,0 ld c,a ldir ; ld a,(bombe) ; and %1000 000 ld a,16 ; jr nz,nextbombegrosse ; ld a,8 ;nextbombegrosse: ld (tempsexplosion),a call creerparticule explosionfinale: pasexplosiontempsfin: pasexplosiontemps: ;################################################################## ;# # ;# Gestion de la plupart des touches # ;# # ;################################################################## ld a,$FF out (1),a ld a,$DF out (1),a in a,(1) cp $DF jr nz,pastilt ld a,(nextlvlt) and %1111 0100 ; or a jp nz,pastilt ld a,%11101111 ld (decalageecran),a pastilt: ld a,$FF out (1),a ld a,$FE out (1),a in a,(1) push af ld a,(invsens) or a jp z,pasinvsens dec a ld (invsens),a pop af xor 06 push af pasinvsens pop af bit 2,a call z,drt bit 1,a call z,gch ld a,$FF out (1),a ld a,$BF out (1),a in a,(1) cp $BF di ret z ei ; cp 7F ; jp z,newgm cp $DF call z,seconde ld a,$FF out (1),a ld a,$EF out (1),a in a,(1) cp $BF jp z,restart ld a,$FF out (1),a ld a,$F7 out (1),a in a,(1) cp $7F call z,stat ;################################################################## ;# # ;# Affichage déplacement et collision de la batte # ;# # ;################################################################## call affbat ld a,(vitesse) ld b,04 push af ld hl,icebat ld a,(hl) or a jp z,pasicebat dec (hl) ld b,02 pasicebat pop af ld hl,(xbat) cp $80 jp m,vtssp xor $FF sub b cp $80 jp m,vtsspasstpm xor a vtsspasstpm xor $FF ld (vitesse),a xor $FF sla a push hl ld h,00 ld l,a add hl,hl ld b,h ld c,l pop hl or a sbc hl,bc jp p,xbatmovf ld h,00 ld bc,vitesse ld a,(bc) xor $80 ld (bc),a jp xbatmovf vtssp: sub b cp $80 jp m,vtsspasstpp xor a vtsspasstpp: ld (vitesse),a sla a ld b,00 ld c,a add hl,bc add hl,bc ld a,h ld bc,(rdimbat) add a,c cp $60 jp m,xbatmovf ld a,$60 sub c ld h,a ld bc,vitesse ld a,(bc) xor $80 ld (bc),a xbatmovf: ld (xbat),hl call affbat jp debut ;################################################################## ;# # ;# Divise a par b # ;# # ;################################################################## divabyb: ld c,00 divabybs: cp b jp m,divabybf sub b inc c jp divabybs divabybf: ld b,c ld c,a ld a,b ret ;################################################################## ;# # ;# Vide le tempon de l'écran # ;# # ;################################################################## clrgb: ld hl,gbuf ld (hl),00 ld de,gbuf +1 ld bc,$02FE ldir ret ;################################################################## ;# # ;# Descent d'un pixel le tempon # ;# # ;################################################################## decalygb: call affbat ld hl,$9340 + 767 - 12 ld de,$9340 + 767 ld bc,768 lddr jp affbat ;################################################################## ;# # ;# Affiche une barre noire au milieu du tempon # ;# # ;################################################################## affbarre: ld hl,$9634 ld b,$0C affbarres: ld a,(hl) xor $FF ld (hl),a inc hl ; dec b ; ld a,b ; or a djnz affbarres ret ;################################################################## ;# # ;# Affichage du laser # ;# # ;################################################################## afflazer: ld a,(xlazer) ld hl,(ylazer) ld b,08 ld ix,lazerS call ionputsprite ret ;################################################################## ;# # ;# Attendre que la touche 2nd soit lachée # ;# # ;################################################################## attendssecondelache: ld a,$FF out (1),a ld a,$BF out (1),a in a,(1) cp $BF cp $DF jr z,attendssecondelache ret ;################################################################## ;# # ;# Cherche l'adresse du meilleur temps # ;# # ;################################################################## cherchebtimehl: ld hl,(AdrLVL) inc hl ld de,(xlvl) ld d,0 add hl,de add hl,de ret ;################################################################## ;# # ;# Si on fini en contre la montre... # ;# # ;################################################################## fincontrelamontre: call affrecord ld hl,(secjeu) ld de,(Btime) or a sbc hl,de jp p,restartcontrelamontre call cherchebtimehl ld de,(secjeu) ld (hl),e inc hl ld (hl),d jp restart ;################################################################## ;# # ;# Affiche le résultat et le meilleur sur une barre noire # ;# # ;################################################################## affrecord: call barrenoire STextInverse #ifdef Francais ld hl,256*26+12 #endif #ifdef English ld hl,256*26+19 #endif ld (pencol),hl ld a,(difficulte) cp 3 jr z,affrecordtime ld hl,(score) push hl ld hl,nouveauscoreS push hl ld hl,(Hscore) push hl ld hl,meilleurscoreS jr affrecordscore affrecordtime: ld hl,(secjeu) push hl ld hl,nouveautempsS push hl ld hl,(Btime) push hl ld hl,meilleurtempsS affrecordscore: bcall(_vputs) pop hl call affhl #ifdef Francais ld hl,256*32+12 #endif #ifdef English ld hl,256*32+19 #endif ld (pencol),hl pop hl bcall(_vputs) pop hl call affhl RTextInverse ld hl,0 ld (temps),hl call ionfastcopy call attendssecondelache affrecordattends: ld a,$FF out (1),a ld a,$BF out (1),a in a,(1) cp $BF di ret z ei cp $DF jr nz,affrecordattends call attendssecondelache ret ;################################################################## ;# # ;# Passage au niveau suivant ou précedant pendant le jeu # ;# # ;################################################################## jnextlvl: ld a,(nextlvlt) bit 1,a ld a,4 ld (nextlvlt),a jp nz,jprelvl call clearbric ; call clrgb ; cp 01 ; jp nz,jprelvl ld a,(difficulte) cp 3 jp z,fincontrelamontre ld a,(nmrlvl) ld bc,(xlvl) cp c jp nz,jpasfin jrestart: ld hl,(frstlvl) xor a ld (xlvl),a jp jprelvlf jpasfin: call nextlvl jr jprelvlf jprelvl: ld de,xlvl ld a,(de) or a jp z,jrestart call prelvl jprelvlf: ld hl,(adrlvl) ld a,(hl) ld (nbrligne),a add a,7 ld (nligne),a inc hl inc hl ld a,(hl) ld (stoptemp+1),a inc hl ld a,(hl) ld (stoptemp),a call dezipinit call clearbric ; ld bc,16 ;inilvl: ; ld hl,ininwlvl ; ld de,xbatN ; ldir ; call affbric ; ld bc,(rdimbat) ; srl c ; ld a,$30 ; sub c ; ld (xbatN),a ; call affbat ; call creatbll ld a,(vie) inc a ld (vie),a ret ;################################################################## ;# # ;# Création d'une nouvelle balle en mode viseur # ;# # ;################################################################## adrdernballhl: ld hl,(nbrball) ld h,0 add hl,hl ld d,h ld e,l add hl,hl add hl,de ld de,adrballes ;$87CC add hl,de ret creatbll: ld a,(nbrball) and %1000 0000 ret nz call adrdernballhl ld bc,(rdimbat-1) dec b call ionrandom inc a ld (hl),a inc hl ex de,hl ld bc,(xbatN) add a,c ld (newbll+2),a ld hl,newbll ld bc,6 ldir ld hl,nbrball inc (hl) ; ld a,$2E ld l,$36 ld ix,ball ld b,5 call ionputsprite ret ;################################################################## ;# # ;# Passage au niveau suivant ou précedant # ;# # ;################################################################## prelvl: ld hl,xlvl dec (hl) ld a,(hl) ld b,a ld hl,(frstlvl) ld (adrlvl),hl or a ret z prelvls: push hl ; ld hl,(adrlvl) ; ld a,(hl) ; inc hl ; inc hl ; add a,6 ; sra a ; sra a ; appartient à dezip... routine ? sra a ; inc a ; ld d,0 ; ld e,a ; add hl,de ; ld (adrbrique),hl; pop hl call nextlvlhl ;test: jr test djnz prelvls ret nextlvl: ; ld hl,xlvl ; inc (hl) ; ld hl,(adrlvl) ;nextlvlhl: ; ld a,(hl) ; inc hl ; ld de,$001C ; or a ; jp nz,nextlvlrand ; add hl,de ;nextlvlrand ; add hl,de ; ld (adrlvl),hl ; ret ld hl,xlvl inc (hl) ld hl,(adrlvl) nextlvlhl: ld a,(hl) inc hl ld c,(hl) add a,7 ld h,0 ld l,a add hl,hl add hl,hl ex de,hl ld hl,(adrbrique) ld a,c or a jr nz,nextlvlrand add hl,de nextlvlrand: add hl,de ld (adrlvl),hl ld a,(hl) ld (nligne),a ld (nbrligne),a ret ;################################################################## ;# # ;# Efface le tempon des briques # ;# # ;################################################################## clearbric: ld hl,briclvl ld (hl),0 ld de,briclvl+1 ld bc,55 ldir ret ;################################################################## ;# # ;# Copie la nouvelle ligne de bique et descent les autres # ;# # ;################################################################## deziphaut: ld de,briclvl+55 ;8*(7)-1 ld hl,briclvl+47 ;8*(7-1)-1 ld bc,48 lddr ld de,bonuslvl+55 ;8*(7) ld hl,bonuslvl+47 ;8*(7-1) ld bc,48 lddr ld a,(nextlvlt) bit 3,a jr nz,deziphautnextlignevide ld a,(nligne) or a jr nz,deziphautpasfinlvl ld a,(nextlvlt) set 3,a ld (nextlvlt),a deziphautpasfinlvl: ld a,4 ld (ziphautSM+1),a call dezipinit ld a,28 ld (ziphautSM+1),a ret deziphautnextlignevide: ld de,briclvl+1 ld hl,briclvl ld (hl),0 ld bc,7 ldir ret ;################################################################## ;# # ;# Copie les brique qui seront visibles # ;# # ;################################################################## dezipinit: ld hl,(adrlvl) dezip: push hl call cherchebtimehl ld e,(hl) inc hl ld d,(hl) ld (Btime),de pop hl ld a,(hl) ld (nbrligne),a inc hl ld b,(hl) inc hl ; ld a,(ziphautSM+1) ; cp 28 ; jr nz,dezippasstopinit ; ld d,(hl) ; inc hl ; ld e,(hl) ; dec hl ; ld (stoptemp),de ;dezippasstopinit: ld a,(nbrligne) ; ld b,a sra a add a,3 sra a sra a inc a ld d,0 ld e,a add hl,de ld (adrbrique),hl ex de,hl ld hl,(nligne) ld h,0 add hl,hl add hl,hl add hl,de ; ld a,(nextlvlt) ; cp 3 ; jr nz,dezippasdebutlvl ; ld de,56 ; add hl,de ;dezippasdebutlvl ld de,briclvl ld a,b or a jp z,bonusfixe push hl ld hl,bonuslvl ld c,$38 bonusrand: push bc ld b,63 call ionrandom pop bc ld (hl),0 cp b jp p,pasbonusrand push bc push hl push de ld c,$0F ld b,0 ld hl,bnscoef bnssomme: ld a,(hl) inc hl add a,b ld b,a dec c ld a,c or a jp nz,bnssomme call ionrandom ld c,a inc c ld b,0 ld d,0 ld hl,bnscoef bnsrdtst: ld a,(hl) inc hl add a,b ld b,a inc d cp c jp m,bnsrdtst ld a,d pop de pop hl pop bc ld (hl),a pasbonusrand: inc hl dec c ld a,c or a jp nz,bonusrand pop hl jr dezips bonusfixe: ; ld b,28 call dezips ex de,hl ld bc,(adrbrique) ld hl,(nligne) ld h,0 ld de,(nbrligne) ld d,0 add hl,de ld de,7 add hl,de add hl,hl add hl,hl add hl,bc ; ld b,28 ld de,bonuslvl dezips: ziphautSM: ld b,28 dezipsuite: ld a,(hl) ; and $F0 srl a srl a srl a srl a ld (de),a inc de ld a,(hl) and $0F ld (de),a inc de inc hl djnz dezipsuite ret ;################################################################## ;# # ;# Cherche l'adresse du bonus correspondant un n° # ;# # ;################################################################## bonushlix: ld a,(hl) ld b,a bonusaix: add a,a add a,a add a,a sub b add a,a ld b,00 ld c,a push hl ld hl,bonusSprite add hl,bc ex (sp),hl ex (sp),ix ex (sp),hl pop hl ret ;################################################################## ;# # ;# Collision Balle/Brique # ;# # ;################################################################## ;hl : adresse de la brique ;d : n° de collone pour la brique ;e : n° de ligne pour la brique ;xposN et yposN sont les coordonnées entières de la balle cllbric: ld a,e cp 7 ret p ld a,d cp 8 ret p ld (xybric+1),de ex de,hl push de push hl ld a,h add a,a add a,a ld h,a add a,a add a,h ld h,a ld a,l add a,a add a,a add a,a sub l ld l,a ; ld de,briclvl ; ld hl,$0000 ;cllbricS: ld a,(decalagebric) sra a sra a sra a sra a ld b,a ld a,l sub b ;add a,l ld l,a ld a,(de) or a jp z,cllbricpas ; cp 4 ; Les 4 premiers types de briques doivent être casser pour passer à la suite du niveau ; jp p,bricprsc ; push hl ; ld hl,nextlvlt ; ld (hl),0 ; pop hl ;bricprsc: ld bc,cassebric+1 xor a ld (bc),a ; ld a,(bc) ld a,(yposN) add a,05 cp l jp m,cllbricpas sub $0B cp l jp p,cllbricpas ld a,(xposN) add a,05 cp h jp m,cllbricpas sub $11 cp h jp p,cllbricpas ld bc,xposN ld a,(de) cp 07 ; Brique de type flèche vers la gauche jp nz,cllpasgauche ld a,(dir) cp 34 jp p,pasflechegchpashaut inc a inc a pasflechegchpashaut: cp 30 jp m,pasflechegchpasbas dec a dec a pasflechegchpasbas: ld (dir),a jp cllbricpas cllpasgauche: ld a,(de) cp 08 ; Brique de type flèche vers la droite jp nz,cllpasdroite ld a,(dir) cp 32 jp p,pasflechedrtpashaut cp 2 jp m,pasflechedrtpashaut dec a dec a pasflechedrtpashaut: cp 32 jp m,pasflechedrtpasbas cp 62 jp p,pasflechedrtpasbas inc a inc a pasflechedrtpasbas: ld (dir),a jp cllbricpas cllpasdroite: ld bc,yposN ld a,(de) cp 09 ; Brique de type flèche vers le haut jp nz,cllpasht ld a,(dir) cp 16 jp m,pasflechehtpashaut cp 48 jp p,pasflechehtpashaut inc a inc a jr pasflechehtpasbas pasflechehtpashaut: cp 32 jp m,pasflechehtbaspas dec a dec a pasflechehtbaspas: inc a inc a and 63 cp 255 jp nz,pasflechehtpasbas xor a pasflechehtpasbas: ld (dir),a jp cllbricpas cllpasht: ld a,(de) cp 10 ; Brique de type flèche vers le bas jp nz,cllpasbs ld a,(dir) cp 16 jp m,pasflechebspashaut cp 48 jp p,pasflechebspashaut dec a dec a jr pasflechebspasbas pasflechebspashaut: cp 32 jp m,pasflechebsbaspas inc a inc a pasflechebsbaspas: inc a inc a and 63 cp 255 jp nz,pasflechebspasbas xor a pasflechebspasbas: ld (dir),a jp cllbricpas cllpasbs: ld a,(yposN) sub l ld c,a cp -4 jp m,bricpasclly cp 6 jp p,bricpasclly ld a,(xposN) sub h ld b,a cp -3 jp m,bricpasclly cp 10 jp p,bricpasclly ld a,(ydern) ld (yposN),a ;;;;bizarre ; ld a,(decalagebric) ; or a ; jr nz,incassablestop ; ld a,(de) ; cp 06 ; Brique de type incassable ; jp nz,incassablestop ; ld a,(yposN) ; cp l ; jp m,incassablestop ; ld a,l ; add a,6 ; ld (yposN),a ;incassablestop: ld a,(de) cp 06 ; Brique incassable (même avec le bonus qui enlève le rebond sur les briques cassables) jp z,pasfuryY ld a,(fury) or a pasfuryY: push hl push de push bc call z,bounceY pop bc pop de pop hl ld a,1 ld (cassebric+1),a ; jp bricpascllx bricpasclly: ld a,c cp -3 jp m,bricpascllx cp 5 jp p,bricpascllx ld a,b cp -4 jp m,bricpascllx cp 11 jp p,bricpascllx ld a,(xdern) ld (xposN),a ld a,(de) cp 06 ; Brique incassable (même avec le bonus qui enlève le rebond sur les briques cassables) jp z,pasfuryX ld a,(fury) or a pasfuryX: push hl push de call z,bounceX pop de pop hl ld a,1 ld (cassebric+1),a bricpascllx: cassebric: ld a,0 or a jr z,pasfurydec ex de,hl push bc call postcollisionbrique pop bc ld hl,fury ld a,(hl) or a jp z,pasfurydec dec (hl) pasfurydec: cllbricpas: ; ld bc,(decalagebric) ; ld a,l ; sub c ; ld l,a ; push hl ; ld bc,$5300 ; or a ; sbc hl,bc ; pop hl ; jp p,cllbricyp ; ld bc,$0C00 ; add hl,bc ; jp cllbricxpF ;cllbricyp: ; ld bc,$53F9 ; or a ; sbc hl,bc ;cllbricxpF: ; inc de ; push hl ; ld bc,$0031 ; or a ; sbc hl,bc ; jp z,cllbricF ; pop hl ; jp cllbricS ;cllbricF: ; pop hl pop hl pop de ex de,hl ret ;################################################################## ;# # ;# Effets des collisions avec une brique # ;# # ;################################################################## ;hl : adresse de la brique ;d : abscisse de la brique ;e : ordonnée de la brique postcollisionbrique: ld a,(hl) or a ret z ld a,(hl) cp 06 ; Brique incassable ret p push de push hl call affbric pop hl pop de ld a,(hl) dec a cp 03 ; 04-05 Bombes jp m,briquepasexplosion push de push hl inc a xybric: ld de,0 call amorcebombe pop hl pop de ld a,(hl) briquepasexplosion: ld (hl),a or a jp nz,affbric call creationbonus jp affbric ; ret ;################################################################## ;# # ;# Création d'un bonus # ;# # ;################################################################## ; hl : adresse de la brique ; d : abscisse de la brique ; e : ordonnée de la brique creationbonus: ld bc,$0038 add hl,bc ld a,(difficulte) cp 3 ret z ld a,(hl) or a ret z dec a ld b,a ld hl,bonus ld a,(hl) cp 80 ret z inc (hl) add a,a add a,a push bc ld b,00 ld c,a ld hl,adrbonus add hl,bc pop bc ld a,b ld (hl),a inc hl ld (hl),d inc hl ld a,e and %1000 0000 jr z,bonusypositif ld e,0 bonusypositif: ld (hl),e inc hl ld (hl),0 ld a,b call bonusaix ld a,d ld l,e ld bc,$0702 call largesprite ret ;################################################################## ;# # ;# Amorçage d'une Bombe # ;# # ;################################################################## amorcebombe: ; ld b,8 ld c,a cp 5 jr nz,paschainebombegrande ; ld b,16 ld a,%0000 1000 or d ld d,a ld a,4 paschainebombegrande: cp 4 ret nz ld a,16 or c ld (hl),a ld a,d rla rla rla rla add a,e ld hl,bombe ld de,(nbombe) ld d,0 add hl,de ld (hl),a ld a,e inc a ld (nbombe),a cp 1 ret nz ; ld a,b ld a,16 ld (tempsexplosion),a call creerparticule ret ;################################################################## ;# # ;# Création des particules d'une explosion # ;# # ;################################################################## creerparticule: call adrdernballhl ld a,(bombe) ld b,a and %0111 0000 rra ld c,a rra add a,c add a,3 ld d,a ld a,b and %0000 1111 ld b,a add a,a add a,a add a,a sub b add a,2 ld bc,(decalageecran) cp c jp m,creerparticulehorsecran sub c creerparticulehorsecran: ld e,a ld a,(nbrball) add a,8 ld (nbrball),a xor a ld b,8 creerparticuleballe ld (hl),64 inc hl ld (hl),a inc hl inc hl ld (hl),d inc hl inc hl ld (hl),e inc hl add a,8 djnz creerparticuleballe ret ;################################################################## ;# # ;# Explosion d'une Bombe # ;# # ;################################################################## explosion: call affbric ld a,(bombe) ld b,a and %0111 0000 rra rra rra rra ld d,a ld a,b and %0000 1111 ld e,a ld a,b and %1000 0000 jr nz,grandeexplosion call suprbric dec d dec e ; ld a,3 ; ld (tailleexplosionx+1),a ld b,3 ld c,3 jr explosiony grandeexplosion: call suprbric dec d dec d dec e dec e ; ld a,5 ; ld (tailleexplosionx+1),a ld b,5 ld c,5 explosiony: push de push bc ; tailleexplosionx: ld b,3 ;ou 5 ld b,c explosionx: push bc call suprbric push de cp 16 jp m,passuprbricexplosion ld (hl),a passuprbricexplosion: call amorcebombe pop de pop bc inc d djnz explosionx pop bc pop de inc e djnz explosiony call affbric ret ;################################################################## ;# # ;# Suppression d'une Brique # ;# # ;################################################################## ;d : n° de collone pour la brique ;e : n° de ligne pour la brique suprbric: push de ld a,d and %1111 1000 ; cp 7 |... cp 0 jr nz,suprbricfin; ret p...| ret m ld a,e and %1111 1000 jr nz,suprbricfin ld a,e cp 7 jr z,suprbricfin add a,a add a,a add a,a add a,d ld d,0 ld e,a ld hl,briclvl add hl,de ld a,(hl) ld (hl),0 or a jr z,suprbricpasbonus cp 3+1 jp p,suprbricpasbonus pop de push de push af call clbricxy call creationbonus pop af suprbricpasbonus: suprbricfin: pop de ret clbricxy: ld a,d add a,a add a,d add a,a add a,a ld d,a ld a,e add a,a add a,a add a,a sub e ld e,a ret ;################################################################## ;# # ;# Affichage de la 1ère ligne de pixels des Briques à l'écran # ;# # ;################################################################## afflinebric: ld de,briclvl ld a,(decalagebric) cp 111 ret z sra a sra a sra a and %1111 1110 ld c,a ld b,8 ld ix,gbuf afflinebricsuite: ld a,(de) inc de push de ld de,0 or a jr z,afflinebricvide and %0000 1111 dec a add a,a add a,a ld e,a add a,a add a,e add a,c ld hl,bric1 ld d,00 ld e,a add hl,de ld d,(hl) inc hl ld e,(hl) afflinebricvide: ld a,%0000 0001 and b jr z,afflinebricpaire ; ex de,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; ex de,hl rlc d rlc d rlc d rlc d rlc e rlc e rlc e rlc e ld a,d and %1111 0000 xor e ld e,a ld a,d and %0000 1111 ld d,a afflinebricpaire: ld a,(ix) xor d ld (ix),a ld a,(ix+1) xor e ld (ix+1),a inc ix ld a,%0000 0001 and b jr z,afflinebricpaire2 inc ix afflinebricpaire2: pop de djnz afflinebricsuite ret ;################################################################## ;# # ;# Affichage des Briques # ;# # ;################################################################## affbric: ld de,briclvl affbricde: ld hl,0 affbricS: ld a,(de) and %0000 1111 ; or a jr z,affbricvide push hl push de dec a add a,a add a,a ld b,a add a,a add a,b ld ix,bric1 ld b,00 ld c,a add ix,bc ld a,(decalagebric) sra a sra a sra a sra a ld b,a ld a,l sub b ;add a,l or a ld l,a ld bc,$0602 jp p,affbricpashaut ;test: jr test ld a,6 add a,l cp 1 jp m,affbrichorsecran ld b,a ld a,l neg add a,a ld d,0 ld e,a add ix,de ld l,0 affbricpashaut ld a,h call largesprite affbrichorsecran: pop de pop hl affbricvide: push de push hl ld de,$5300 or a sbc hl,de pop hl jp p,bricyp ld de,$0C00 add hl,de jp bricxpF bricyp ld de,$53F9 or a sbc hl,de bricxpF pop de inc de push hl ld bc,$0031 or a sbc hl,bc jp z,affbricF pop hl jp affbricS affbricF pop hl ret ;################################################################## ;# # ;# Cherche les niveau # ;# # ;################################################################## chargeniveau: ld (FindAlphaSens+1),a chargeniveaumemesense: chercheniveau: FindAlphaSens: bcall(_FindAlphaUp) ret c bcall(_chksysvar) ld a,b or a jr z,appvarenram push bc ex de,hl ld de,18 add hl,de ; en archive il faut sauter le nom de la variable et divers choses avant d'arriver aux données ld (adrflash+1),hl ld de,taillelvlflash ld bc,5 push hl bcall(_flashtoram) pop hl pop bc ld de,taillelvlflash appvarenram: ex de,hl inc hl inc hl ld a,(hl) cp 'B' jr nz,chercheniveau inc hl ld a,(hl) cp 'N' jr nz,chercheniveau inc hl ld a,(hl) cp 'C' jr nz,chercheniveau ld a,b or a jr z,pascopietemp push af bcall(_PushOp1) ld hl,BncytempS bcall(_Mov9ToOP1) bcall(_chkFindSym) jp c,bncytempnexistepas bcall(_DelVar) bncytempnexistepas: ld hl,(taillelvlflash) dec hl dec hl dec hl bcall(_createappvar) pop af adrflash: ld hl,0 ld bc,(taillelvlflash) dec bc dec bc dec bc inc de inc de inc hl inc hl inc hl inc hl inc hl push de bcall(_flashtoram) pop hl dec hl push hl bcall(_PopOp1) pop hl bncytempexiste: pascopietemp: inc hl ld d,(hl) inc hl ld e,(hl) ld (Hscore),de inc hl ld (AdrLVL),hl ld a,(hl) ld (nmrlvl),a inc hl ld d,0 ld e,a inc de add hl,de add hl,de ld a,(hl) ld (nligne),a ld (nbrligne),a ld (frstlvl),hl ld (adrlvl),hl xor a ld (xlvl),a ret ;################################################################## ;# # ;# Affiche une barre noire au milieu du tempon # ;# # ;################################################################## barrenoire: ld hl,$9340 + 312 ;+12*26+4 ld (hl),$FF ld de,$9340 + 313 ld bc,155 ldir ret ;################################################################## ;# # ;# Attend que le touche STAT soit lachée # ;# # ;################################################################## attendsstatlache: ld a,$FF out (1),a ld a,$F7 out (1),a in a,(1) cp $7F jr z,attendsstatlache ret ;################################################################## ;# # ;# Met le jeu en pause # ;# # ;################################################################## stat: di call attendsstatlache ld hl,gbuf + 312 ;+12*26 ld de,pausebarresave ld bc,156 ldir call barrenoire STextInverse #ifdef Francais ld hl,256*26+34 #endif #ifdef English ld hl,256*26+31 #endif ld (pencol),hl ld hl,viesS bcall(_vputs) ld a,(vie) call affa ld hl,256*32+27 ld (pencol),hl ld a,(difficulte) cp 3 jr z,pausechrono ld hl,scoreS bcall(_vputs) ld hl,(score) jr pausescore pausechrono: ld hl,tempsS bcall(_vputs) ld hl,(secjeu) pausescore: call affhl RTextInverse call ionfastcopy ei statlache: halt ld a,$FF out (1),a ld a,$F7 out (1),a in a,(1) cp $7F jr nz,statlache call attendsstatlache ld de,gbuf + 312 ;+12*26+4 ld hl,pausebarresave ld bc,156 ldir ret ;################################################################## ;# # ;# Sacrifie une vie contre une balle # ;# # ;################################################################## pasmath: ld a,$3A ;ld a,(NN) ld (math),a ret math: ld a,(vie) cp 1 ret z dec a ld (vie),a ld a,$C9 ;ret ld (math),a call creatbll ret ;################################################################## ;# # ;# Tire le laser # ;# # ;################################################################## alpha: push af ld a,(ylazer) or a jr nz,alphafin ld a,(lazer) or a jr z,alphafin dec a ld (lazer),a ld hl,ylazer ld (hl),56 ld a,(xbatN) ld bc,(rdimbat) srl c add a,c ld (xlazer),a call afflazer alphafin: pop af ret ;################################################################## ;# # ;# Lache les balles # ;# # ;################################################################## seconde: ld bc,(nbrball-1) ld hl,adrballes ;$87CC ld de,6 secs: ld a,(hl) and %0100 0000 ld (hl),a add hl,de djnz secs ret ;################################################################## ;# # ;# Mouvement de la batte # ;# # ;################################################################## gch ld hl,vitesse ld a,(hl) cp $80 jp m,gchp cp $90 jp m,gchS gchp sub $10 ld (hl),a ret gchS ld (hl),$80 ret drt push af ld hl,vitesse ld a,(hl) cp $7F jp p,drtm cp $6F jp p,drtS drtm add a,$10 ld (hl),a pop af ret drtS ld (hl),$7F pop af ret ;################################################################## ;# # ;# Affichage de la batte # ;# # ;################################################################## affbat: ld a,(dimbat) ld e,a add a,a add a,a add a,a add a,e ld e,a ld d,00 ld a,(xbatN) and $7F ld l,$3B ld bc,$0303 ld ix,bat ex (sp),hl ex (sp),ix ex (sp),hl add hl,de ex (sp),hl ex (sp),ix ex (sp),hl jp largesprite ;################################################################## ;# # ;# Rebond de la balle # ;# # ;################################################################## bounceX ld hl,dir ld a,(hl) cp $20 jp p,bounceXp ld b,a ld a,$20 sub b ld (hl),a jp default bounceXp ld b,a ld a,$60 sub b ld (hl),a jp default bounceY ld hl,dir ld b,(hl) ld a,$40 sub b ld (hl),a default: ld b,$20 defaults: call ionrandom or a jr nz,defautpasdirm call dirm ld a,(hl) and %1011 1111 ; or a jp z,dirp cp $20 jp z,dirp ret defautpasdirm: cp 01 ret nz call dirp ld a,(hl) and %1011 1111 ; or a jp z,dirm cp $20 jp z,dirm ret ;################################################################## ;# # ;# Ajout du "sin" et du "cos" sur la position de la balle # ;# # ;################################################################## XpYp: ld e,a ld hl,dirVl add hl,de ld b,00 ld c,(hl) ld hl,(xpos) add hl,bc ld (xpos),hl ld hl,dirVlF or a sbc hl,de ld b,00 ld c,(hl) ld hl,(ypos) add hl,bc ld (ypos),hl jp bllmovf XpYm: sub $30 ld e,a ld hl,dirVl add hl,de ld b,00 ld c,(hl) ld hl,(ypos) or a sbc hl,bc ld (ypos),hl ld hl,dirVlF or a sbc hl,de ld b,00 ld c,(hl) ld hl,(xpos) add hl,bc ld (xpos),hl jp bllmovf XmYp sub $10 ld e,a ld hl,dirVl add hl,de ld b,00 ld c,(hl) ld hl,(ypos) add hl,bc ld (ypos),hl ld hl,dirVlF or a sbc hl,de ld b,00 ld c,(hl) ld hl,(xpos) or a sbc hl,bc ld (xpos),hl jp bllmovf XmYm sub $20 ld e,a ld hl,dirVl add hl,de ld b,00 ld c,(hl) ld hl,(xpos) or a sbc hl,bc ld (xpos),hl ld hl,dirVlF or a sbc hl,de ld b,00 ld c,(hl) ld hl,(ypos) or a sbc hl,bc ld (ypos),hl jp bllmovf ;################################################################## ;# # ;# Incremente ou décremente l'angle de la balle # ;# # ;################################################################## dirm ld hl,dir ld a,(hl) or a jp z,dirmS dec (hl) ret dirmS ld (hl),$3F ret dirp ld hl,dir ld a,(hl) cp $3F jp z,dirpS inc (hl) ret dirpS ld (hl),00 ret ;################################################################## ;# # ;# Affiche des valeures decimalles à l'écran # ;# # ;################################################################## affhl: ld de,10000 call affhlN ld de,1000 call affhlN ld de,100 call affhlN ld a,l jr affhlsuite affhlN: call divhlparde push hl ld a,c call affa1 pop hl ret affa: ld b,100 call divabyb call affa1 affhlsuite: ld b,10 call divabyb call affa1 affa1: ld e,c add a,$30 push de bcall(_vputmap) pop de ld a,e ret divhlparde: or a ld bc,0 DivhlbyDE: sbc hl,de jp c,nomore inc bc jp z,suite jp DivhlbyDE nomore: add hl,de ret suite: ld hl,0 ret ;################################################################## ;# # ;# Affiche le score et retourne au menu # ;# # ;################################################################## quitescore: ld a,(difficulte) cp 3 jp z,restartcontrelamontre ld hl,(score) ; ld a,(vitesseball) ; inc a ; bcall(_divhlbya) ; ld (score),hl push hl call affrecord pop de ld hl,(Hscore) or a sbc hl,de jp p,restart ld hl,(AdrLVL) ; dec hl dec hl ld (hl),e dec hl ld (hl),d jp restart largesprite: di call ionlargesprite ; les sprites étant relativement petits pas de compensation du temps d'appel de ionlargesprite. ei ret ;ionputsprite: interrupt_start: ex af,af' ;Échange les registres af et af' exx ;échange les registres hl bc et de avec leur registre 'shadow' ld hl,(temps) inc hl ld (temps),hl ; ld hl,(deuxcentieme) ; inc hl ; ld (deuxcentieme),hl jp $003A ;exécute l'interruption du TiOS, sans passer par les ex af,af' et exx interrupt_end: ;On spécifie la fin de l'interruption pour sa copie à l'adresse $9a9a interruptj_start: ex af,af' ;Échange les registres af et af' exx ;échange les registres hl bc et de avec leur registre 'shadow' ld hl,(temps) inc hl ld (temps),hl ld hl,(deuxcentieme) inc hl ld (deuxcentieme),hl ld a,$08 ;\ out ($03),a ; |On resette les triggers pour que ld a,$0F ; |l'interruption redémarre la prochaine fois out ($03),a ;/ ex af,af' ;On remet les registres normaux exx ;idem ei ;On réactive les interruptions reti ;On quitte l'interruption interruptj_end: ;############################################################################### ;# # ;# Routines communes # ;# # ;############################################################################### ; aucune de triée (peut être dans la prochaine version) dirVl: .db $FF,$FF,$FB,$F5,$ED,$E2,$D5,$C6,$B5,$A2,$8E,$79,$62,$4A,$32,$19 dirVlF: .db 00 ball: .db $70,$F8,$F8,$F8,$70 ;,$00,$00,$00 particule: .db %01010 000 .db %10101 000 .db %01010 000 .db %10101 000 .db %01010 000 bat: .db $FF,$00,$00,$99,$00,$00,$7E,$00,$00 .db $FF,$F0,$00,$96,$90,$00,$7F,$E0,$00 .db $FF,$FF,$00,$A5,$A5,$00,$7F,$FE,$00 .db $FF,$FF,$F0,$A2,$F4,$50,$7F,$FF,$E0 .db $FF,$FF,$FF,$A3,$3C,$C5,$7F,$FF,$FE bric1: ; Briques classiques .db $7F,$C0,$A4,$A0,$C9,$20,$92,$60,$A4,$A0,$7F,$C0 .db $7F,$C0,$AA,$A0,$D5,$60,$AA,$A0,$D5,$60,$7F,$C0 .db $7F,$C0,$DB,$60,$B6,$E0,$ED,$A0,$DB,$60,$7F,$C0 ; Bombes .db %00111000,%00000000 .db %01000100,%00100000 .db %10011010,%01100000 .db %10001010,%00010000 .db %01000101,%00100000 .db %00111000,%11000000 .db %00111000,%00000000 .db %01111100,%00100000 .db %11100110,%01100000 .db %11110110,%00010000 .db %01111101,%00100000 .db %00111000,%11000000 ; Incassable .db $7F,$C0,$FF,$E0,$DB,$60,$A4,$A0,$80,$20,$7F,$C0 ; Flèches .db $1C,$70,$38,$E0,$71,$C0,$71,$C0,$38,$E0,$1C,$70 .db $E3,$80,$71,$C0,$38,$E0,$38,$E0,$71,$C0,$E3,$80 .db $30,$C0,$79,$E0,$FF,$F0,$CF,$30,$86,$10,$86,$10 .db $00,$00,$86,$10,$CF,$30,$FF,$F0,$79,$E0,$30,$C0 bonusSprite: .db $1F,$80,$7F,$E0,$80,$10,$A9,$50,$C0,$30,$7F,$E0,$1F,$80 .db $1F,$80,$79,$E0,$F8,$70,$80,$10,$F8,$70,$79,$E0,$1F,$80 .db $1F,$80,$7C,$60,$F0,$30,$80,$30,$F0,$30,$7C,$60,$1F,$80 .db $1F,$80,$7C,$60,$D8,$30,$88,$30,$D8,$30,$7C,$60,$1F,$80 .db $1F,$80,$7B,$E0,$EB,$B0,$EA,$B0,$EE,$B0,$7E,$E0,$1F,$80 ; .db $1F,$80,$79,$E0,$F0,$F0,$E0,$70,$F9,$F0,$79,$E0,$1F,$80 .db %00011111,%10000000 .db %01111111,%11100000 .db %11111001,%11110000 .db %10110110,%11010000 .db %11001111,%00110000 .db %01111111,%11100000 .db %00011111,%10000000 .db $1F,$80,$6F,$60,$CF,$30,$80,$10,$CF,$30,$6F,$60,$1F,$80 .db $1F,$80,$65,$E0,$DD,$50,$D5,$50,$E5,$10,$7F,$E0,$1F,$80 .db $1F,$80,$7F,$E0,$FF,$F0,$80,$10,$FF,$F0,$7F,$E0,$1F,$80 .db $07,$80,$08,$00,$3F,$00,$10,$00,$3F,$00,$08,$00,$07,$80 .db $1F,$80,$71,$E0,$EA,$F0,$E0,$F0,$E0,$F0,$75,$E0,$1F,$80 .db $1F,$80,$79,$E0,$E1,$F0,$80,$10,$E1,$F0,$79,$E0,$1F,$80 .db $1D,$80,$78,$E0,$DD,$70,$DF,$B0,$EB,$B0,$71,$E0,$1B,$80 .db $1F,$80,$72,$60,$D6,$F0,$D6,$70,$D6,$F0,$72,$60,$1F,$80 .db $1F,$80,$6F,$60,$E6,$70,$80,$10,$E6,$70,$6F,$60,$1F,$80 lazerS: .db $80,$80,$80,$80,$80,$80,$80,$80 fleche: .db %00100000 .db %01110000 .db %11111000 .db %00000000 .db %00000000 .db %11111000 .db %01110000 .db %00100000 .db %00000000 .db %00000000 .db %00100100 .db %01100110 .db %11100111 .db %01100110 .db %00100100 vitesseS: .db %00000000,%11111000,%00000000 .db %00000001,%00000100,%00000000 .db %00000001,%00000100,%00000000 .db %00000001,%00000100,%00000000 .db %00000001,%00000100,%00000000 .db %00000001,%00000100,%00000000 .db %00000001,%00000100,%00000000 .db %00111111,%00000111,%11100000 .db %01111111,%11111111,%11110000 .db %11001111,%11011101,%11101000 .db %10111001,%10101010,%11001000 .db %11011010,%10001000,%10101000 .db %11101001,%10111011,%10101000 .db %10011011,%11001100,%11001000 .db %11111111,%11111111,%11111000 boutonS: .db %00111111,%11111111,%11100000 .db %01111111,%11111111,%11110000 .db %11111111,%11111111,%11111000 .db %11111111,%11111111,%11111000 .db %11111111,%11111111,%11111000 .db %11111111,%11111111,%11111000 .db %11111111,%11111111,%11111000 .db %11111111,%11111111,%11111000 BncytempS: .db $15 .db "Bncytemp",0 hightscoreS: .db "HS : ",0 besttimeS .db "BT : ",0 ;vitesseS: ;.db "Speed : ",0 vitesseball: .db 0 difficulte: .db 00 #ifdef Francais viesS: .db "Vies : ",0 scoreS: .db "Score : ",0 tempsS: .db "Temps : ",0 erreurS: .db "Aucun niveau " .db " trouv",$96,0 nouveautempsS: .db "Nouveau Temps : ",0 meilleurtempsS: .db "Meilleur Temps : ",0 nouveauscoreS: .db "Nouveau Score : ",0 meilleurscoreS: .db "Meilleur Score : ",0 #endif #ifdef English viesS: .db "Lifes : ",0 scoreS: .db "Score : ",0 tempsS: .db "Time : ",0 erreurS: .db "No level found",0 nouveautempsS: .db "New Time : ",0 meilleurtempsS: .db "Best Time : ",0 nouveauscoreS: .db "New Score : ",0 meilleurscoreS: .db "Best Score : ",0 #endif newbll: .db $10,$00,$2E,$00,$36 ininwlvl: .db 40 ; xbatN ;.db 0 ; vitesse ;.db 0 ; glu ;.db 0,0; tempsglu ;.db 0 ; nbrball ;.db 0,0; invsens ;.db 0,0; icebat ;.db 0 ; fury ;.db 0,0; barre ;.db 0 ; rbll ;.db 0 ; lazer ;.db 0 ; ylazer .db 2 ; dimbat .db 16 ; rdimbat ;.db 0 ; bonus ;.db 0 ; decalagebric ;.db 0 ; brictombanteY difficulteS: .db "Easy",0 .db "Norm",0 .db "Hard",0 .db "Time",0 bnscoef: ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ;sélectioné: .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 bnscoefdif: ;.db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,15, 1, 1, 1, 1 ;facile: .db 4, 3, 5,10,15, 1,15, 8,15, 1, 1, 4, 1, 1, 1 ;moyen: .db 2, 3, 6, 6, 6, 4, 9, 6, 7, 3, 2, 4, 5, 8, 5 ;difficile .db 1, 4, 8, 4, 1,14, 1, 1, 1, 8,15, 3,12, 9,11 briquepoints: .db 0, 1, 2, 3, 1, 1, 4, 6, 6, 1, 8 ;Bonus: ; 1 -> Vie suplémentaie ; 2 -> Niveau suivant ; 3 -> Balle en furie ; 4 -> Balle suplémantaire ; 5 -> Recharge de lazer ; 6 -> Balle(s) folle(s) ; 7 -> Agrandissement de la batte ; 8 -> Balle(s) collantes ; 9 -> Barre de protection ; 10 -> Augmentation du score ; 11 -> Vie perdue ; 12 -> Niveau précédant ; 13 -> Invertion des touches ; 14 -> Batte glissante ; 15 -> Diminution de la batte .END .END