


convgeneric.exe -m 0 -single -g face.png -flat |
affiche_referenceld hl,texturemap+64ld de,#C000ld xl,128 ; parcourir 128 lignes de la texture.affiche_referenceld b,64 ; on va construire 64 octetspush de.dispr ld a,(hl) : add a : inc l : or (hl) : inc l : ld (de),a : inc e : djnz .dispr ; à partir de 128 pixels exx : pop de : ld a,e : ld hl,#800 : add hl,de : ex hl,de : ld bc,64 : ldir : exx ; duplication des lignesld e,aex hl,deld bc,2*#800 : add hl,bc : jr nc,.pas_doverflow ; sauter 2 lignesld bc,64-#4000 : add hl,bc.pas_doverflowex hl,deinc h : ld a,l : sub 128 : ld l,a ; sauter le blanc dans le spritedec xljr nz,.affiche_referenceret |
BULLE_SIZE=64BULLE_HALF=BULLE_SIZE>>1boule_carreerepeat BULLE_SIZE+2,yrepeat BULLE_SIZE+2,x cx=(x-BULLE_HALF-2)/BULLE_HALF cy=(y-BULLE_HALF-2)/BULLE_HALF no=sqrt(cx*cx+cy*cy) ; distance rapport au centre if no>1 || x<=2 || x>=BULLE_SIZE+1 || y==BULLE_SIZE+2; ça veut dire qu'on est hors du cercle, on met simplement la valeur normale lowbyte=x-BULLE_HALF-2 highbyte=hi(texturemap)+y-1 ;64+y-BULLE_HALF-2 else coef=1+no*no ; va nous donner une valeur entre 1 et 2 coef=coef*BULLE_HALF/2.3 ; Ici on peut jouer avec une valeur entre 2 et 5 if coef>BULLE_HALF : coef=BULLE_HALF : endif lowbyte=cx*coef highbyte=hi(texturemap)+cy*coef+BULLE_HALF ;+64 endif ; inscrire la valeur 16 bits dans le tableau defb lowbyte+33+64,highbyterendrend |
; SP = données de translation de notre sprite ; DE = adresse écran des lignes paires; HL'= adresse écran des lignes paires; DE'= adresse écran des lignes impairesaffiche_bouleld sp,boule_carreerepeat BULLE_HALF+1 pop hl : add hl,bc : ld a,(hl) : add a : pop hl : add hl,bc : or (hl) : ld (de),a : inc e ; on traite les pixels 2 à 2 pour remplir les octetsrendexxrepeat BULLE_HALF+1 : ldi : rendld bc,2*#800-BULLE_HALF-1 : add hl,bc : jr nc,.padovld bc,64-#4000 : add hl,bc : .padovld a,h : add 8 : ld d,a : ld e,lexxld a,-BULLE_HALF-1 : add e : ld l,a : ld a,d : add #10 : ld h,a : jr nc,.pas_doverflowld de,64-#4000 : add hl,de.pas_doverflowex hl,dedec xljp nz,affiche_boule |
BUILDSNA : BANKSET 0org #100 : run #100 textureMap equ #4000 BULLE_SIZE=64BULLE_HALF=BULLE_SIZE>>1ld sp,#100 ld bc,#7F00 : ld e,17 : ld hl,palettesetPal out (c),c : inc c : inc b : outi : dec e : jr nz,setPalld bc,#7F80+%1100 : out (c),c ; MODE 0ld bc,#BC01 : out (c),c : ld a,32 : inc b : out (c),a ; largeur visibleld bc,#BC02 : out (c),c : ld a,42 : inc b : out (c),a ; position Xld bc,#BC06 : out (c),c : ld a,32 : inc b : out (c),a ; hauteur visibleld bc,#BC07 : out (c),c : ld a,34 : inc b : out (c),a ; position Y; *** affiche_reference ***ld hl,texturemap+64ld de,#C000ld xl,128 ; parcourir 128 lignes de la texture.affiche_referenceld b,64 ; on va construire 64 octetspush de.dispr ld a,(hl) : add a : inc l : or (hl) : inc l : ld (de),a : inc e : djnz .dispr ; à partir de 128 pixels exx : pop de : ld a,e : ld hl,#800 : add hl,de : ex hl,de : ld bc,64 : ldir : exx ; duplication des lignesld e,aex hl,deld bc,2*#800 : add hl,bc : jr nc,.pas_doverflow ; sauter 2 lignesld bc,64-#4000 : add hl,bc.pas_doverflowex hl,deinc h : ld a,l : sub 128 : ld l,a ; sauter le blanc dans le spritedec xljr nz,.affiche_reference;************************************************************* LaBoucle;*************************************************************ld de,#C000 : exx : ld hl,#C000 : ld de,#C800 : exx ld sp,boule_carreeld xl,BULLE_SIZE+1ld bc,63 ; pixel de la texture correspondant au coin supérieur gauche de l'écranaffiche_boulerepeat BULLE_HALF+1 pop hl : add hl,bc : ld a,(hl) : add a : pop hl : add hl,bc : or (hl) : ld (de),a : inc e ; on traite les pixels 2 à 2 pour remplir les octetsrendexxrepeat BULLE_HALF+1 : ldi : rendld bc,2*#800-BULLE_HALF-1 : add hl,bc : jr nc,.padovld bc,64-#4000 : add hl,bc : .padovld a,h : add 8 : ld d,a : ld e,lexxld a,-BULLE_HALF-1 : add e : ld l,a : ld a,d : add #10 : ld h,a : jr nc,.pas_doverflowld de,64-#4000 : add hl,de.pas_doverflowex hl,dedec xljp nz,affiche_boulejr $ palette defb #54,#44,#5C,#58,#46,#5E,#40,#4C,#4E,#45,#47,#5F,#43,#5B,#4F,#4B,#4Bboule_carreerepeat BULLE_SIZE+2,yrepeat BULLE_SIZE+2,x cx=(x-BULLE_HALF-2)/BULLE_HALF cy=(y-BULLE_HALF-2)/BULLE_HALF no=sqrt(cx*cx+cy*cy) ; distance rapport au centre if no>1 || x<=2 || x>=BULLE_SIZE+1 || y==BULLE_SIZE+2; ça veut dire qu'on est hors du cercle, on met simplement la valeur normale lowbyte=x-BULLE_HALF-2 highbyte=hi(texturemap)+y-1 ;64+y-BULLE_HALF-2 else no*=sqrt(BULLE_HALF) noref=no no*=no no=(noref+no+no)/2.7 if no>BULLE_HALF : no=BULLE_HALF : endif lowbyte=cx*no highbyte=hi(texturemap)+cy*no+BULLE_HALF ;+64 endif ; inscrire la valeur 16 bits dans le tableau defb lowbyte+BULLE_HALF+2,highbyterendrendorg textureMap : incbin 'face.bin' |

BUILDSNA : BANKSET 0org #100 : run #100 textureMap equ #4000 BULLE_SIZE=64BULLE_HALF=BULLE_SIZE>>1ld sp,#100 ld bc,#7F00 : ld e,17 : ld hl,palettesetPal out (c),c : inc c : inc b : outi : dec e : jr nz,setPalld bc,#7F80+%1100 : out (c),c ; MODE 0ld bc,#BC01 : out (c),c : ld a,32 : inc b : out (c),a ; largeur visibleld bc,#BC02 : out (c),c : ld a,42 : inc b : out (c),a ; position Xld bc,#BC06 : out (c),c : ld a,32 : inc b : out (c),a ; hauteur visibleld bc,#BC07 : out (c),c : ld a,34 : inc b : out (c),a ; position Y; *** affiche_reference ***ld hl,texturemap+64ld de,#C000ld xl,128 ; parcourir 128 lignes de la texture.affiche_referenceld b,64 ; on va construire 64 octetspush de.dispr ld a,(hl) : add a : inc l : or (hl) : inc l : ld (de),a : inc e : djnz .dispr ; à partir de 128 pixels exx : pop de : ld a,e : ld hl,#800 : add hl,de : ex hl,de : ld bc,64 : ldir : exx ; duplication des lignesld e,aex hl,deld bc,2*#800 : add hl,bc : jr nc,.pas_doverflow ; sauter 2 lignesld bc,64-#4000 : add hl,bc.pas_doverflowex hl,deinc h : ld a,l : sub 128 : ld l,a ; sauter le blanc dans le spritedec xljr nz,.affiche_reference;************************************************************* LaBoucle;*************************************************************ld sp,#100 ; besoin d'une pile valide pour notre PUSH/POP ld de,#C000 : destinationEcran=$-2 : push de : exx : pop hl : ld e,l : ld a,h : add 8 : ld d,a : exx ld sp,boule_carreeld xl,BULLE_SIZE+2ld bc,0 : decalageTexture=$-2 ; pixel de la texture correspondant au coin supérieur gauche de l'écran;****************affiche_boule;****************repeat BULLE_HALF+1 pop hl : add hl,bc : ld a,(hl) : add a : pop hl : add hl,bc : or (hl) : ld (de),a : inc e ; on traite les pixels 2 à 2 pour remplir les octetsrendexxrepeat BULLE_HALF+1 : ldi : rendld bc,2*#800-BULLE_HALF-1 : add hl,bc : jr nc,.padovld bc,64-#4000 : add hl,bc : .padovld a,h : add 8 : ld d,a : ld e,lexxld a,-BULLE_HALF-1 : add e : ld l,a : ld a,d : add #10 : ld h,a : jr nc,.pas_doverflowld de,64-#4000 : add hl,de.pas_doverflowex hl,dedec xljp nz,affiche_boule;**************** deplacement;**************** ld bc,1 : incrementX=$-2 ld hl,(destinationEcran) : add hl,bc : ld (destinationEcran),hl ld hl,(decalageTexture) : add hl,bc : add hl,bc : ld (decalageTexture),hl ; double pour la texture car 1 pixel par octet! .compteurX ld a,28 : dec a : jr nz,.suite ld h,a : ld l,a : or a : sbc hl,bc : ld (incrementX),hl ; inverser l'incrément ld a,28 ; on repart pour une série de 28! .suite ld (.compteurX+1),a ld sp,#100 ; besoin d'une pile valide pour le CALLld a,1 : incrementY=$-1or a : jr z,remonte; descendld hl,(destinationEcran) : ld a,h : add 8 : ld h,a : call NextLineHL : ld (destinationEcran),hlld hl,(decalageTexture) : inc h : ld (decalageTexture),hljr compteurYremonteld hl,(destinationEcran) : call PreviousLineHL : res 3,h : ld (destinationEcran),hlld hl,(decalageTexture) : dec h : ld (decalageTexture),hlcompteurY ld a,61 : dec a : jr nz,.suiteYld a,(incrementY) : inc a : and 1 : ld (incrementY),a ; 1, 0, 1, 0, ...ld a,61 ; on repart pour une série de 41!.suiteYld (compteurY+1),a jp LaBoucle NextLineHL ld a,h : add 8 : ld h,a : ret nc ld a,64 : add l : ld l,a : ld a,#C0 : adc h : ld h,a : res 3,h : ret PreviousLineHL ld a,h : sub 8 : ld h,a : and #38 : cp #38 : ret nzld a,lo(16384-64) : add l : ld l,a : ld a,#3F : adc h : ld h,a : set 3,h : retpalette defb #54,#44,#5C,#58,#46,#5E,#40,#4C,#4E,#45,#47,#5F,#43,#5B,#4F,#4B,#4Bboule_carreerepeat BULLE_SIZE+2,yrepeat BULLE_SIZE+2,x cx=(x-BULLE_HALF-2)/BULLE_HALF cy=(y-BULLE_HALF-2)/BULLE_HALF no=sqrt(cx*cx+cy*cy) ; distance rapport au centre if no>1 || x<=2 || x>=BULLE_SIZE+1 || y==BULLE_SIZE+2; ça veut dire qu'on est hors du cercle, on met simplement la valeur normale lowbyte=x-BULLE_HALF-2 highbyte=hi(texturemap)+y-1 ;64+y-BULLE_HALF-2 else coef=1+no*no ; va nous donner une valeur entre 1 et 2 coef=coef*BULLE_HALF/2.3 ; Ici on peut jouer avec une valeur entre 2 et 5 if coef>BULLE_HALF : coef=BULLE_HALF : endif lowbyte=cx*coef highbyte=hi(texturemap)+cy*coef+BULLE_HALF ;+64 endif ; inscrire la valeur 16 bits dans le tableau defb lowbyte+33+64,highbyterendrendorg textureMap : incbin 'face.bin' |
