;rockyone for MI-3 and MI-9 31/01/2025 ; ; ; Save PP1-3 et MBK ; ***************** ; ;The resolution of the image "PP1-3" is equal to the number of the file ;extention. ; ; Source: Buf_Ecr Buffer 32066 bytes Image Degas PI1-3 ; But : Buf_Pic Buffer 41020 bytes equal $00 ; : Buf_pic+33000 Buffer temporaire cmd0 4010 bytes ; : buf pic+37010 Buffer temporaire cmd1 4010 byte ;Format% 0 : Sauvegarde format Pic_pac "PP?" ; 1 : Sauvegarde format Stos "BNK" ; ; A0 A1 ; call( L buf_pic, L buf_ecr, W dummy, W Format%, W dummy%) ; 60 64 68 70 72 ;.......................................................................... ; ; The image planes, are compressed one after the other. ; Each planes is divided into blocks of five lines that are compressed ; vertically bytes after bytes. ; ; Lecture des premiers octets par plan en basse résolution ; ________________________________________________ ; | plan1 | plan2 | plan3 | plan4 | plan1 | ... ; line 1 | 1 6 | | | | 11 16 | ; line 2 | 2 7 | | | | 12 17 | ; line 3 | 3 8 | | | | 13 ...| ; line 4 | 4 9 | | | | 14 | ; line 5 | 5 10 | | | | 15 | ; line 6 ; line 7 ; ... ;.......................................................................... ;Format des fichiers ."pp1-3" de "Pic-Pac.prg" ; ; +0 L $06071963 Id stos ; +4 W 0 1 2 BNK résolution image ; PP1-3 résolution compression ; +6 W 0 ? ; +8 W 0 ? ; +10 W 20 40 40 Number word for a plan line (lsl 4 = width pic) ; +12 W 40 40 80 Number of groups of five lines per plan ; +14 w ? ? ; +16 w 5 Number of lines in a blok - aLways 5 pour PP1-3 ; +18 w 3 *Compression mode always 3 pour PP1-3 ; +20 L P0 offset Cmd0 ; +24 L P1 offset Cmd1 ; +28 B ? 5 words ? ; +38 W 16 word always 16 colors ; +70 B Literal ; +P0 B cmd0 ; +P1 B cmd1 ; ;-------------------------------------------; ; taille d'un fichier compress‚ ;-------------------------------------------; ; frame cmd0 cmd1 taille; ; mini 1 1 500 502 + entete ; maxi 32000 4000 500 36502 + entete ; ;.......................................................................... * compression mode * PP1-3 Toujours 3 * MBK Toujours 2 ? ;.......................................................................... ;.......................................................................... movem.l d1-d7/a0-a6,-(sp) movem.l 60(sp),a0-a1 exg.l a0,a1 ; exg Destination/Source ; ______________________________ ; | A0 buffer ".PI?" Degas | ; | A1 buffer ".PP?" Pic_Pac | ; ------------------------------ ; ;Source : ; a0 incrémentation des plans d'image ; a3 incrémentations des blocks de cinque lignes ; a3 incrémentation des colonnes dans un block de ligne ; a4 incrémentation des lignes dans un block de ligne ; a4 adresse de lecture des bytes à compresser ; ;Destination: ; a1+70 adresse de sauvegarde litéral ; a5 adresse de sauvegarde temporaire des masques "cmd0" ; a6 adresse de sauvegarde temporaire des masques "cmd1" ; ;param: A2 ; ; d0 cmd0 ; d1 cmd1 ; d2 Offset line ; d3 Offset Word ; nb_plane nombre de plan dans l'image ; nb_bloc nonbre de bloc de cinq lignes dans un plan d'image ; nb_word nombre de words dans une ligne d'un plan d'image ; nb_line nombre de ligne dans un bloc de ligne ; d4 comptage des bits de cmd1 ; d5 comptage des bits de cmd0 ; nb_line nonbre de lignes dans un bloc de ligne ; d6 nombre de byte dans un Word ; d7 valeur dans un octet ;-------------------------------------------------------------------------- movem.l (a1),d0-d7 ; clear registers move.w (a0),d0 ; resolution image D‚gas bsr init_param tst.w 70(sp) ; compression MBK ? beq.s type_picpac bsr param_mbk move.l #$4c696f6e,(a1)+ ;ID MBK move.l #$706f7562,(a1)+ ; move.w #$6e6b,(a1)+ ; clr.l (a1)+ move.w #$8100,(a1)+ ; bank_type clr.w (a1)+ ; poids de l'image compress‚ move.w #2,18(a1) ; mode de compression bra.s format_picpac type_picpac: move.w #3,18(a1) ; mode de compression format_picpac: move.l #$06071963,(a1) ; ID STOS/PICPACK move.w (a0),4(a1) ; résol image, inutilisé‚ par PIC_PAC.PRG * clr.l 6(a1) move.w 4(a2),10(a1) ; nb_word move.w 2(a2),12(a1) ; nb_bloc * clr.w 14(a1) move.w 6(a2),16(a1) ; 5 lignes par bloc * move.w #3,18(a1) ; Mode de compression movea.l a1,a5 adda.l #33000,a5 ; Cmd0 buffer temporaire 4000+10 bytes movea.l a1,a6 adda.l #37010,a6 ; Cmd1 buffer temporaire 4000+10 bytes move.l a5,20(a1) ; Sauve adresse pour calcul taille buffer move.l a6,24(a1) ; Sauve adresse pour calcul taille buffer ;........................................... ; Copie de la palette ;........................................... lea.l 2(a0),a0 ; a0 pointe sur la palette Degas lea.l 38(a1),a1 ; A1 pointe sut la palette Stos moveq.l #7,d1 ; Palette de 16 couleurs copy_palette: move.l (a0)+,(a1)+ dbra.w d1,copy_palette ;-------------------------------------------; ; A0 pointe sur data imaga Degas ; A1 pointe sur data literaux compr‚ss‚ ;-------------------------------------------; move.l #$0,d0 ; initialisation de CMD0 move.l #$0,d1 ; initialisation de CMD1 moveq.l #7,d4 ; pour les bits de cmd1 moveq.l #7,d5 ; pour les bits de cmd0 move.b (a0),(a1)+ ;-------------------------------------------; ; incrémentation des plans d'image ;-------------------------------------------; all_plane: subq.w #1,nb_plane bmi.s fin_pic movea.l a0,a3 ; Début d'un plan d'image move.w 2(a2),nb_bloc ; nombre de bloc de lines * move.w bloc_nb,nb_bloc ;-------------------------------------------; ; incrémentation des bloks de cinq lignes ;-------------------------------------------; all_blocks_lines: subq.w #1,nb_bloc bmi.s next_plane move.w 4(a2),nb_word ; nb_word by line plane * move.w word_nb,nb_word ;-------------------------------------------; ; compression des cinq lignes ;-------------------------------------------; colonnes: subq.w #1,nb_word ; colonnes-1 bmi.s next_bloc_line moveq.l #2,d6 ; 2 bytes by word deux_bytes: subq.w #1,d6 bmi.s next_word move.w 6(a2),nb_line ; nombre de ligne dans un bloc_de_lignes movea.l a3,a4 ; (a4) pour lire les octets lines_block: subq.w #1,nb_line bmi.s second_byte move.b (a4),d7 ; Lire un byte * move.b #$00,(a4) ; pour verifier la lecture cmp.b -1(a1),d7 ; Comparer avec le dernier octet sauvegardé beq.s skip_save ; Si identique, sauter la sauvegarde move.b d7,(a1)+ ; Sauvegarder l'octet dans le buffer bset.b d5,d0 ; Activer un bit dans Cmd0 skip_save: subq.b #1,d5 bpl.s skip_save_cmd0 cmp.b (a5),d0 ; Comparer Cmd0 avec la dernière sauvegarde beq.s init_cmd0 ; Idendiques, sauter la sauvegarde addq.l #1,a5 ; Incrémenter le pointeur du buffer Cmd0 move.b d0,(a5) ; Sauvegarder Cmd0 dans le buffer bset.b d4,d1 ; Activer un bit dans Cmd1 init_cmd0: clr.b d0 ; réinitialisr D0 moveq.l #7,d5 ; Réinitialise D5 pour un nouveau cycle de Cmd0 subq.b #1,d4 bpl.s skip_save_cmd1 * addq.l #1,a6 move.b d1,(a6)+ init_cmd1: clr.b d1 moveq.l #7,d4 skip_save_cmd1: skip_save_cmd0: ;------------------------------------------------------------------- next_line: adda.w d2,a4 ; prochaine ligne bra.s lines_block ; répéter pour toutes les lignes second_byte: addq.l #1,a3 ; A3 points to the second byte of a word bra.s deux_bytes ; deuxième octets d'une colonne next_word: adda.l d3,a3 ; +offset_word bra.s colonnes ;-------------------------------------------; next_bloc_line: suba.w d2,a4 ; -offset_line lea.l 1(a4,d3.w),a3 ; prochain bloc de lignes bra.s all_blocks_lines ; >0 next five lines next_plane: addq.l #2,a0 ; next plane bra all_plane ;-------------------------------------------; ; recopy des commandes cmd0 et cmd1 ;-------------------------------------------; fin_pic: move.l 60(sp),a0 move.w 70(sp),d1 ; compréssion pp1-3 ou bnk ? beq.s suite bsr.s param_mbk ; restituer les parametres suite: mulu.w #18,d1 ;............................... move.l 20(a0,d1.w),a3 ; adresse buffer temporaire cmd0 suba.l a3,a5 move.l a5,d0 ; nombre d'octets à recopier bsr.s recopy_cmd move.l a2,20(a0,d1.w) ; offset cmd0 ;............................... move.l 24(a0,d1.w),a3 ; adresse buffer temporaiore cmd1 suba.l a3,a6 subq.l #1,a6 * ************* move.l a6,d0 ; nombre d'octets à recopier bsr.s recopy_cmd move.l a2,24(a0,d1.w) ; offset cmd1 ;............................... suba.l a0,a1 move.l a1,d0 ; taille du fichier tst.w d1 ; compréssion pp1-3 ou bnk ? beq.s fin_pp move.w d0,16(a0) ;-------------------------------------------; ;-------------------------------------------; fin_pp: movem.l (sp)+,d1-d7/a0-a6 ; Restaurer les registres rts ; Retour ;-------------------------------------------; ; recopy cmd0 et cmd1 ;-------------------------------------------; recopy_cmd: movea.l a1,a2 suba.l a0,a2 suba.w d1,a2 ; pour MBK ; ************* recopy_cmds: move.b (a3)+,(a1)+ dbra.w d0,recopy_cmds rts ;---------------------------------------------------- ; initialisation celon la résolution de l'image degas ;---------------------------------------------------- init_param: mulu.w #12,d0 ; offset param celon la résolution image lea.l param(pc,d0.w),a2 move.w (a2),nb_plane ; nombre de plan dans l'image * move.w 2(a2),bloc_nb * move.w 4(a2),word_nb * move.w 6(a2),nb_line ; nombre de ligne dans un bloc move.w 8(a2),d3 ; offset_word move.w 10(a2),d2 ; offset_line rts param_mbk: move.w 2(a2),d4 move.w 6(a2),d5 move.w d5,2(a2) move.w d4,6(a2) rts ;---------------------------------------------------------------- ; nb_plane,nb_bloc,nb_word,nb_line,offset_word,offset_line param: dc.w 4,40,20,5,6,160 dc.w 2,40,40,5,2,160 dc.w 1,80,40,5,0,80 nb_plane: dc.w 0 nb_bloc: dc.w 0 nb_word: dc.w 0 nb_line dc.w 0 *bloc_nb dc.w 0 *word_nb dc.w 0 end ;******************************************************************