INIT: ld a, 0 ld (perdu), a ld hl, nextline ld (pointeur_sur_nextline), hl ; Le level a deja ete decide ; On sauve l'adresse pour le modulo ld hl, (pointeur_sur_liste) ld (pointeur_sur_liste_bak), hl ld a, 8 ld (modulo), a ret SCROLLSTEP: call BUILD_NEXTLINE call COPYFIRSTLINE ld hl, 37148 ld de, 37160 ld bc, 756 lddr call fastCopy ret CHECK_COLLISION: ld a, (ycoord) inc a ld e, a ld a, (xcoord) inc a call GET_PIXEL ld a, (hl) cp 255 jp z, collision pas_de_collision_gauche: ld a, (ycoord) inc a ld e, a ld a, (xcoord) add a, 5 call GET_PIXEL ld a, (hl) cp 255 jp z, collision pas_de_collision_droite: jp cc_fin collision: ld a, 1 ld (perdu), a cc_fin: ret ; Aller chercher un pixel dans le graphbuf GET_PIXEL: ld hl,0 ; Do y*12 ld d,0 add hl,de add hl,de add hl,de add hl,hl add hl,hl ld d,0 ; Do x/8 ld e,a srl e srl e srl e add hl,de ld de,8e29h add hl,de ; Add address to graphbuf ret perdu: .db 0 ; Copier la première ligne COPYFIRSTLINE: ld hl, (pointeur_sur_nextline) ld de, 8e29h ld bc, 12 ldir ret ; Construire une ligne ; Une ligne est un octet ; Les bords sont pleins, ensuite un 1 est un bloc de 8 pixels, un 0 un vide de 8 pixels ; On construit une ligne tous les 8 steps BUILD_NEXTLINE: ; remplir a gauche (2 cases toujours pleines sauf en random) ld hl, body_left ld ix, (pointeur_sur_liste) ld a, 10000000b ld b, 4 bl_loop: push af ld a, 0 ld (hl), a pop af push af and (ix) jp z, bl_suite push af ld a, 255 ld (hl), a pop af bl_suite: pop af rr a inc hl djnz bl_loop ;;;;;;; ;PART 2 ;;;;;;; ; remplir a droite ld hl, body_right ld ix, (pointeur_sur_liste) ld a, 00001000b ld b, 4 bl_loop2: push af ld a, 0 ld (hl), a pop af push af and (ix) jp z, bl_suite2 push af ld a, 255 ld (hl), a pop af bl_suite2: pop af rr a inc hl djnz bl_loop2 ; les timers ld a,(modulo) dec a ld (modulo), a cp 7 call z, DECALAGE_RANDOM ld a,(modulo) or a jp nz, bl_fin inc ix ld (pointeur_sur_liste), ix ld a, 8 ld (modulo), a ld a, (modulo_liste) dec a ld (modulo_liste), a or a jp nz, pas_de_retour ld a, 16 ld (modulo_liste), a ld hl, (pointeur_sur_liste_bak) ld (pointeur_sur_liste), hl ld a, (duree_level) dec a ld (duree_level), a pas_de_retour: NOP bl_fin: ret duree_level: .db 3 modulo: .db 8 modulo_liste: .db 16 ; Decaler de facon aleatoire à droite ou a gauche DECALAGE_RANDOM: ld a, (bool_decalage) or a jp z, dr_fin ; replacer le pointeur au debut ld hl, surplus_a_gauche ld (pointeur_sur_nextline), hl ; recuperer le decalage (0 est a fond a gauche) ld b, 8 call RANDOM_ION ld d, 0 ld e, a ld hl, (pointeur_sur_nextline) add hl, de ld (pointeur_sur_nextline), hl dr_fin: ret ; Activer les murs à droite et a gauche pour le mode normal MUR_INIT: ld a, 255 ld hl, nextline ld (hl), a inc hl ld (hl), a ld a, 255 ld hl, mur_droite ld (hl), a inc hl ld (hl), a ret ; Desactiver les murs pour le mode random (sinon c'est trop difficile) MUR_DEL: ld a, 0 ld hl, nextline ld (hl), a inc hl ld (hl), a ld a, 0 ld hl, mur_droite ld (hl), a inc hl ld (hl), a ret ; Faire une crolling vertical de en utilisant le byte en argument (registre a) ; Cela permet de faire un effet de style SCROLL_BYTE_EFFECT: ld b, 64 ld hl, 8e29h sbe_loop: push bc ld b, 12 sbe_loop2: ld (hl), a inc hl djnz sbe_loop2 push af push hl call FASTCOPY pop hl pop af pop bc djnz sbe_loop ret ; Remplir tout l'ecran avec le byte du registre a ; Cela peut permettre de faire un effet de clignotement (en fait pas sur) FILL_BYTE_EFFECT: ld b, 64 ld hl, 8e29h fbe_loop: push bc ld b, 12 fbe_loop2: ld (hl), a inc hl djnz fbe_loop2 pop bc djnz fbe_loop call FASTCOPY ret ; Valeurs par défaut et pointeurs pointeur_sur_decalage: .dw 0 pointeur_sur_nextline: .dw 0 surplus_a_gauche: .db 0, 255, 0, 255 nextline: .db 255, 255 body_left: .db 0, 0, 0, 0, ;toujours_libre: body_right: .db 0, 0, 0, 0, mur_droite: .db 255, 255 surplus_a_droite: .db 255, 0, 255, 0 pointeur_sur_liste_bak: .dw 0 pointeur_sur_liste: .dw 0