Conversion d'images PNG vers écran, sprites soft, sprites hardJe vous présente ici mon outil de conversion d'image. Attention à ne pas confondre traitement et conversion. Cet outil ne s'occupe que de conversion. Ce n'est pas un outil de traitement d'image comme peuvent être Martine, ConvIMGCPC ou UniPixelViewer. Ainsi, les images ne sont pas transformées ou dégradées. Selon ce que vous voulez faire, ce n'est peut-être pas l'outil qu'il vous faut. Néanmoins, Martine est capable de convertir sans les altérer des images dont le nombre de couleurs est déjà réduit! Et comme Sid a eu la gentillesse de me fournir les commandes équivalentes, je vous les mets enn rab ;)
Téléchargement des outils :Ça se passe [ici pour ConvGeneric] Et [Là pour Martine]
Exemple de conversion d'un écran : image mode 0 160x200
convgeneric.exe -m 0 ironMan.png -scr martine -in ironMan.png -out ./ironman-test -mode 0En sortie, vous avez besoin de la palette Gate Array générée et du fichier binaire ironMan.bin. Ensuite vous pouvez afficher votre écran comme avec le programme de l'article sur le changement de couleurs [ici].
Exemple de conversion d'un écran FullScreen pour CPC (plein écran, sans les bords) : image mode 0 192x272
convgeneric.exe -m 0 ironManFS.png -scr -old -flat -w 96 martine -in ironMan.png -out ./ironman-test -mode 0 -fullscreenEn sortie, vous avez besoin de la palette Gate Array générée et du fichier binaire ironMan.bin qui fait pas loin de 32k (31936 octets pour être précis). Voici le source avec les réglages nécessaires à passer en plein écran avec l'overscan sur la lecture d'adresse. buildsna bankset 0 org #100 run #100ld bc,#7F80+%1100 : out (c),c ; MODE 0 ld bc,#BC00+3 : out (c),c : ld bc,#BD00+#8C : out (c),c ; compatibilité Motorola pour le registre 2 ld bc,#BC00+1 : out (c),c : ld bc,#BD00+48 : out (c),c ; élargir l'écran ld bc,#BC00+2 : out (c),c : ld bc,#BD00+50 : out (c),c ; déplacer l'écran à droite ld bc,#BC00+6 : out (c),c : ld bc,#BD00+34 : out (c),c ; agrandir l'écran en hauteur ld bc,#BC00+7 : out (c),c : ld bc,#BD00+35 : out (c),c ; déplacer l'écran vers le haut ld bc,#BC00+12 : out (c),c : ld bc,#BD00+#2C : out (c),c ; début de la mémoire écran en #8000 + overscan ld hl,palette : ld bc,#7F00 setPalette out (c),c : inc b : outi : inc c : ld a,c : cp 16 : jr nz,setPalette jr $ palette defb #54,#47,#5C,#4C,#43,#4B,#4E,#5E,#40,#45,#58,#5B,#44,#46,#5F,#4F org #8000 : incbin 'ironManFS.bin'
Exemple de conversion d'un écran FullScreen pour Plus avec rupture Plus :La ligne de commande change, pas de -old par contre on va demander à couper l'écran à partir de la ligne 136 (la moitié de 272). Il est techniquement possible de monter jusqu'à 168. En fait vous coupez un peuoù vous voulez tant que chaque page reste dans l'espace des 16k. convgeneric.exe -m 0 ironManFS.png -scr -ls 136 -flat -w 96 martine -in ironMan.png -out ./ironman-test -mode 0 -fullscreen -plusEn sortie, vous avez besoin de la palette Gate Array OU Plus générée et du fichier binaire ironMan.bin qui fait pas loin de 32k (32352 octets pour être précis). Voici le source avec les réglages nécessaires à passer en plein écran. buildsna SNASET CPC_TYPE,4 ; 6128+ bankset 0 org #100 run #100;*** RMR2 tags *** ASICOFF equ 0 ROM0000 equ 0 ROM4000 equ %01000 ROM8000 equ %10000 ASICON equ %11000 ROM0 equ 0 : ROM1 equ 1 : ROM2 equ 2 : ROM3 equ 3 : ROM4 equ 4 : ROM5 equ 5 : ROM6 equ 6 : ROM7 equ 7 macro RMR2 tags ld a,{tags}+%10100000 ld b,#7F out (c),a mend ld bc,#7F80+%1100 : out (c),c ; MODE 0 ld bc,#BC00+1 : out (c),c : ld bc,#BD00+48 : out (c),c ; élargir l'écran ld bc,#BC00+2 : out (c),c : ld bc,#BD00+50 : out (c),c ; déplacer l'écran à droite ld bc,#BC00+6 : out (c),c : ld bc,#BD00+34 : out (c),c ; agrandir l'écran en hauteur ld bc,#BC00+7 : out (c),c : ld bc,#BD00+35 : out (c),c ; déplacer l'écran vers le haut ld bc,#BC00+12 : out (c),c : ld bc,#BD00+#20 : out (c),c ; début de la mémoire écran en #8000 call UnlockAsic RMR2 ASICON ld a,135 : ld (#6801),a ; rupture Plus à la ligne 136 ld hl,#0030 : ld (#6802),hl; adresse de l'écran pour la rupture Plus ld hl,palette : ld bc,#7F00 setPalette out (c),c : inc b : outi : inc c : ld a,c : cp 16 : jr nz,setPalette jr $ palette defb #54,#47,#5C,#4C,#43,#4B,#4E,#5E,#40,#45,#58,#5B,#44,#46,#5F,#4F UnlockAsic ld bc,#BCFF out (c),c out (c),0 ld hl,%1001000011101010 .loop out (c),c ld a,h:rlca:ld h,l:ld l,a srl c:res 3,c and #88 or c ld c,a cp #4D jr nz,.loop ld a,#CD out (c),a : out (c),a ret org #8000 : incbin 'ironManFS.bin'
Exemple de conversion d'une planche de sprites :
convgeneric.exe -m 0 -size 26x74 -c 4 -flat sheetBaron.png martine -in sheetBaron.png -split -mode 0 -spritesrow 4 -spritescolumn 1 -height 74 -width 26 -out ./testLes paramètres : - Le mode - La taille en pixels des sprites à extraire (si c'est une taille qui ne tombe pas juste avec le nombre de pixels par octet, le dernier octet de la ligne sera complété avec zéro) - Le nombre maximum de sprites à extraire (par défaut : 1) - L'option flat pour éviter que l'outil découpe en morceaux de 16K (ça n'était pas indispensable ici) - L'image en PNG Ici la largeur de 26 pixels en mode 0 va résulter des données de sprite d'une largeur de 13 octets. Vous pouvez charger le fichier dans ACE avec l'explorateur mémoire et utiliser l'explorateur graphique pour valider que la conversion s'est bien passée. 
Allez, on va se l'animer le baron! buildsna bankset 0 org #38 ei : ret org #100 run #100 ei ld sp,#100 ld bc,#7F80+%1100 : out (c),c ; MODE 0 ld hl,palette : ld bc,#7F00 setPalette out (c),c : inc b : outi : inc c : ld a,c : cp 15 : jr nz,setPalettedebut ld hl,baron : call affiche_sprite call affiche_sprite call affiche_sprite call affiche_sprite jr debut affiche_sprite ld b,30 ; grosse pause, nous avons peu d'étapes d'animation .pause halt djnz .pause ld de,#C000+80*5+34 ; pour être à peu près centré ld a,74 .copyLines push de ldi 13 pop de ex hl,de ld bc,#800 : add hl,bc : jr nc,.novf ld bc,80-#4000 : add hl,bc .novf ex hl,de dec a jr nz,.copyLines ret ; moins de 16 couleurs, attention à ne jamais envoyer un octet de plus! Ou alors ajoutez une couleur bidon pour compléter palette defb #5B,#4C,#5C,#47,#54,#4B,#40,#46,#56,#4E,#52,#5E,#43,#44 baron incbin 'sheetBaron.bin'
Exemple de conversion d'une planche de sprites hard :ConvGeneric est capable de convertir simplement des planches de sprites sans qu'il soit nécessaire de tout éclater en sprites unitaires. Par exemple la planche ci-dessous compose chaque personnage avec 9 sprites organisés en carré de 3x3. L'image doit contenir la transparence là où le sprite hard sera transparent.  Et voici le 'vrai' fichier planche
 Vous pourrez aussi avoir besoin de ça pour jouer avec ;)

convgeneric.exe -hsp -meta 3x3 -k -flat metalSheet15.png -c 36 -p 2 convgeneric.exe -scr -m 0 metalBackground.png martine -in metalSheetZoom.png -split -mode 0 -spritesrow 12 -spritescolumn 3 -height 16 -width 16 -plus -spritehard -out ./metal martine -in metalBackground.png -plus -mode 0 -out ./metalLes paramètres : - pas besoin de spécifier le mode, il n'y a que du 15 couleurs + transparence - l'option meta permet de définir la forme de notre sprite, c'est optionnel - l'option k permet de produire des sprites vides si il y en a, ça peut être pratique pour évité d'être décalé sur une série (ici non) - l'option flat pour tout sortir d'un coup et ne pas multiplier les fichiers - le limiteur de nombre de sprite (ça compte en sprites tout court et pas en meta, enfin je crois ^_^) - enfin, l'option -p 2 pour grouper les pixels par 2 (4bits+4bits, on va voir comment les traiter) Il n'est pas obligatoire de grouper les pixels par 2, c'est un exemple pour montrer comment gagner facilement de la place. Et le petit source de démonstration (avec les fichiers à préparer) buildsna SNASET CPC_TYPE,4 ; 6128+ bankset 0 org #38 ei : ret org #100 run #100;*** RMR2 tags *** ASICOFF equ 0 ROM0000 equ 0 ROM4000 equ %01000 ROM8000 equ %10000 ASICON equ %11000 ROM0 equ 0 : ROM1 equ 1 : ROM2 equ 2 : ROM3 equ 3 : ROM4 equ 4 : ROM5 equ 5 : ROM6 equ 6 : ROM7 equ 7 macro RMR2 tags ld a,{tags}+%10100000 ld b,#7F out (c),a mend ld sp,#100 ; la pile avant le code ld bc,#7F80+%1100 : out (c),c ; MODE 0 call UnlockAsic RMR2 ASICON ld hl,palette ld de,#6400 ld bc,64 ldir ; on envoie toutes les couleurs d'un coup, fond, border, sprites ei ; activer 9 sprites en ratio mode 1 ld a,%1001 ld hl,#6004 : ld b,9 : ld de,8 .setHsp ld (hl),a : add hl,de : djnz .setHsp ; il faut positionner nos sprites ld hl,200 : ld (#6000+8*0),hl : ld (#6000+8*3),hl : ld (#6000+8*6),hl ld hl,232 : ld (#6000+8*1),hl : ld (#6000+8*4),hl : ld (#6000+8*7),hl ld hl,264 : ld (#6000+8*2),hl : ld (#6000+8*5),hl : ld (#6000+8*8),hl ld hl,132 : ld (#6002+8*0),hl : ld (#6002+8*1),hl : ld (#6002+8*2),hl ld hl,148 : ld (#6002+8*3),hl : ld (#6002+8*4),hl : ld (#6002+8*5),hl ld hl,164 : ld (#6002+8*6),hl : ld (#6002+8*7),hl : ld (#6002+8*8),hl ;================= animation ;================= ld hl,hspack : call spriteUnpack push hl : call spriteUnpack push hl : call spriteUnpack call spriteUnpack pop hl : call spriteUnpack pop hl : call spriteUnpack jr animation ;------------------- spriteUnpack ld b,30 .attend halt : djnz .attend ld de,#4000 ; adresse des données des sprites dans l'ASIC ld b,9 ; on veut décompresser 9 sprites .loop ld a,(hl) : ld (de),a : inc e ; copier le premier octet (les 4 bits du haut seront ignorés) rrca : rrca : rrca : rrca : ld (de),a : inc e ; copier le deuxième octet inc hl ; données crunchée suivante jr nz,.loop inc d ; sprite suivant, ils font 256 octets djnz .loop ret UnlockAsic ld bc,#BCFF out (c),c out (c),0 ld hl,%1001000011101010 .loop out (c),c ld a,h:rlca:ld h,l:ld l,a srl c:res 3,c and #88 or c ld c,a cp #4D jr nz,.loop ld a,#CD out (c),a : out (c),a ret palette defw #332,#7B3,#794,#8A6,#212,#341,#110,#673,#AD3,#462,#443,#5A0,#CDA,#380,#4C0,#7E0 border defw #000 hsp defw #110,#330,#240,#342,#547,#673,#675,#692,#859,#8B0,#9D4,#AB8,#CF8,#D9E,#FFE org #8000 : hspack incbin 'metalSheet15.bin' org #C000 : incbin 'metalBackground.bin'
Exemple de conversion d'une carte en Atlas et tileMap :On précise la taille souhaitée des tuiles, le nom de la map, l'option tiles et le logiciel s'occupe de calculer les tuiles et produire un fichier tileMap à inclure en ascii (une suite de DEFB ou DEFW dépendant du nombre de tuiles dans l'atlas) Bien sûr, il y a aussi un export de la palette et aussi une preview de l'Atlas pour valider que tout semble OK. convgeneric.exe -m 0 -g -tiles -size 8x16 Map16.png martine -in tileSheetVertical.png -plus -width 8 -height 16 -mode 0 -reducer -1 -tilemap -out ./tilemapPreview de l'atlas produit par la commande Pour voir un exemple d'utilisation de cette tileMap, vous pouvez lire [l'article sur les scrollings verticaux avec l'ASIC]
Roudoudou CPCrulez[Content Management System] v8.732-desktop/c Page créée en 012 millisecondes et consultée 54 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|