PJNnp N ON fo  @`!#@%`')-/1 3@5`79;=?AOEOQ S@U`WY[]_a c@e`gikmoq su`wy{} @` @ ` @ ` @ ` @ ` ǀ ɠ o  @` @`!Aa   !Aa!!#A%a'+-/1O5a;=?A!CAEaGIKMOQoWY[]_a!cAeagikmoqsAuawy{}/!Ao!Aa!Aa!Aaǁɡ!Aaׁ١!AaAa O b  !"!B!b!!!!"!""#B"o"'")""-"/1"#3B#o#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%UW%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()")B))))*"*B**o  @`!#@%`')-/1 3@5`79;=?AOEOQ S@U`WY[]_a c@e`gikmoq su`wy{} @` @ ` @ ` @ ` @ ` ǀ ɠ o  @` @`!Aa   !Aa!!#A%a'+-/1O5a;=?A!CAEaGIKMOQoWY[]_a!cAeagikmoqsAuawy{}/!Ao!Aa!Aa!Aaǁɡ!Aaׁ١!AaAa O b  !"!B!b!!!!"!""#B"o"'")""-"/1"#3B#o#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%UW%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()")B))))*"*B**lX_MAS93 BALL  `BUBBLE  `*DOCS  `BENDPART  `JGLENZ  `IMAGES  `INTRO  `2JELLY  $`SPOLYGONE  `SHELL  `X_MAS93  ` DP6RESETPRG `/README DOC l`)DESKTOP INF )!  "h.  `.. BALL LST `BALL XXX D!BALL S /`mKCLS_BALLS !SIN_COS XXX /ROT_3B S (!BALLPARTS `"' ** Creation de 128 valeurs pour la bobolle! ** a$=SPACE$(512) adr%=VARPTR(a$) FOR comp%=1 TO 128 y=(128-comp%)/128 x=SQR(1-y*y) x%=x*16384 PSET x%/64,INT(y*128),15 DPOKE adr%,x% adr%=adr%+2 NEXT comp% adr%=VARPTR(a$) BSAVE "a:\bobolle\bobolle.xxx",adr%,256  D ]E !"Y##$%O%&'P'()+)*T*+p+,---.y./g/0J01$112[233348445@5568667"7l778C889 9M99::A:{::;;T;;;<>7>U>s>>>>>? ?!?6?J?]?n?????????????????; *I ; ** Routine qui affiche une bobolle!... ** ; ** Dracula/Positivity. ** ; *I ; Appel: a0.l = adresse ramvideo. ; d0.w = x. ; d1.w = y. ; d2.w = etirement x. ; d3.w = etirement y. movem.l d0-a6,-(sp) move.w d2,a1 move.w d3,d2 add.w d1,d3 sub.w d2,d1 ; *I .ball_visibility: ; Boite a l' interieur de l' ecran? cmp.w #$0,d3 ; y2<0? blt .end cmp.w #$c7,d1 ; y1>199? bgt .end ; *I .ball_clipping: moveq.l #$0,d4 ; Calculer dans d4 nb_hlines. move.w d3,d4 sub.w d1,d4 ; d4=y2-y1. move.w d1,d5 ; Dans d5 first_hline. moveq.l #$0,d6 ; Dans d6 first_xmin. .top_clipping: ; La box sort de l' ecran en haut? cmp.w #$0,d1 ; y1<0? bge.s .bottom_clipping move.w d1,d6 ; Oui alors passer -y1 xmins. neg.w d6 moveq.l #$0,d5 ; Tracer a partir de 0. add.w d1,d4 ; nb_hlines=y2. .bottom_clipping: cmp.w #$c7,d3 ; y2>199? ble.s .end_clipping add.w #$c7,d4 ; Oui, alors nb_hline=nb_hline+199-y2. sub.w d3,d4 .end_clipping: move.w d4,.nb_hlines move.w d5,.first_hline move.w d6,.first_xmin  ; *+* .calculations: ; Calculer les xmins_xmaxs. move.l #.xmins,a2 move.l #.xmaxs,a3 move.l a2,a5 move.l a3,a6 move.l #.sin_table,a4 move.l #$10,d4 sub.w d1,d3 ; d3=y2-y1. move.w d3,.dy move.w d3,d6 ext.l d6 addq.l #$1,d6 add.l d6,d6 add.l d6,a5 ; a5 pointe apres le dernier xmin. add.l d6,a6 ; a6 pointe apres le dernier xmax. divu.w d3,d4 ; d4=nb de valeurs de sin a passer. ext.l d4 lsl.l #$8,d4 bclr.l #$0,d3 ; d3=2*int(dy/2). addq.w #$1,d3 lsr.w #$1,d3 ; d3=int((2*int(dy/2)+1)/2). move.w a1,d1 ; d1=coef de jelly. moveq.l #$0,d6 ; Compteur pour les increments des sins.  .one_calc: move.w (a4),d5 ; d5=valeur du sin actuelle. muls.w d1,d5 ; d5=sin*jelly_coef*16384. add.l d5,d5 add.l d5,d5 swap.w d5 ; d5=sin*jelly_coef. move.w d0,a1 sub.w d5,a1 ; a1=x1-sin*jelly. add.w d0,d5 ; d5=x2+sin*jelly. add.w a1,a1 ; Multiplier par 4. add.w a1,a1 add.w d5,d5 add.w d5,d5 move.w a1,(a2)+ ; Sauver xmin. move.w d5,(a3)+ ; Sauver xmax. move.w a1,-(a5) ; Sauver xmin. move.w d5,-(a6) ; Sauver xmax. add.l d4,d6 swap.w d6 move.w d6,a1 add.l a1,a4 ; Prochain sinus. add.l a1,a4 sub.w d6,d6 ; Ne garder que la partie reguliere. swap.w d6 dbra d3,.one_calc ; *I .draw_bobolle: move.w .first_hline,d4 ext.l d4 move.w d4,d0 add.w d0,d0 add.w d0,d0 add.w d0,d4 lsl.w #$5,d4 ; d4=first_hline*$a0. add.l a0,d4 ; d4 pointe sur la premier ligne. move.l #.xmins,a0 move.l #.xmaxs,a1 move.l #.xmin_table,a2 move.l #.xmax_table,a3 move.l #.adresses,a4  move.w .first_xmin,d0 add.w d0,d0 add.w d0,a0 ; Aligner a0,a1 sur les premiers add.w d0,a1 ; xmin-xmax a utiliser! move.w .nb_hlines,d0 ; Nombre de lignes a tracer. move.l #$f,d1 move.l #$a0,d5 ; Taille d' une ligne. .init_blitter: ; Chic, un Blitter. move.w d1,$f8a2a.w ; Masque du milieu plein. move.l #$80008,$f8a2e.w ; Increments destination. move.w #$20f,$f8a3a.w ; Remplir avec des 1. move.b #$c0,d6 ; Pour lancer le blitter. move.l #$a0001,d7 ; Taille horizontal et verticale. .one_line: move.w (a0)+,d2 ; d2=xmin*4. move.w (a1)+,d3 ; d3=xmax*4. move.l (a2,d2.w),d2 ; d2=motif/adresse de depart. move.l (a3,d3.w),d3 ; d3=motif/adresse d'arrivee. sub.w d2,d3 move.l (a4,d3.w),a5 ; Adresse de la routine. swap.w d3 ; d3.w=motif d' arrivee. jmp (a5) .step_0: move.l d4,a5 add.l d5,d4 ; Ligne suivante. add.w d2,a5 ; a5 pointe sur le premier mot. swap.w d2 and.w d2,d3 ; Motif. or.w d3,(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_1: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) or.w d3,$8(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_2: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) or.w d3,$10(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_3: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) or.w d3,$18(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_4: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) or.w d3,$20(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_5: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) or.w d3,$28(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_6: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) or.w d3,$30(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_7: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) or.w d3,$38(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_8: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) or.w d3,$40(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_9: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.l d7,(a6)+ ; Taille horizontale et verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_10: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #11,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_11: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #12,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_12: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #13,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_13: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #14,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_14: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #15,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_15: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #16,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_16: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #17,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_17: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #18,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_18: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #19,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_19: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #20,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .end: movem.l (sp)+,d0-a6 rts ;*M Section DATA .adresses: dc.l .step_0,.step_0,.step_1,.step_1 dc.l .step_2,.step_2,.step_3,.step_3 dc.l .step_4,.step_4,.step_5,.step_5 dc.l .step_6,.step_6,.step_7,.step_7 dc.l .step_8,.step_8,.step_9,.step_9 dc.l .step_10,.step_10,.step_11,.step_11 dc.l .step_12,.step_12,.step_13,.step_13 dc.l .step_14,.step_14,.step_15,.step_15 dc.l .step_16,.step_16,.step_17,.step_17 dc.l .step_18,.step_18,.step_19,.step_19 rept 256 dc.w $0000,$fff8 ; Clipping. endr .xmin_table: dc.w $ffff,$00,$7fff,$00,$3fff,$00,$1fff,$00 dc.w $0fff,$00,$07ff,$00,$03ff,$00,$01ff,$00 dc.w $00ff,$00,$007f,$00,$003f,$00,$001f,$00 dc.w $000f,$00,$0007,$00,$0003,$00,$0001,$00 dc.w $ffff,$08,$7fff,$08,$3fff,$08,$1fff,$08 dc.w $0fff,$08,$07ff,$08,$03ff,$08,$01ff,$08 dc.w $00ff,$08,$007f,$08,$003f,$08,$001f,$08 dc.w $000f,$08,$0007,$08,$0003,$08,$0001,$08 dc.w $ffff,$10,$7fff,$10,$3fff,$10,$1fff,$10 dc.w $0fff,$10,$07ff,$10,$03ff,$10,$01ff,$10 dc.w $00ff,$10,$007f,$10,$003f,$10,$001f,$10 dc.w $000f,$10,$0007,$10,$0003,$10,$0001,$10 dc.w $ffff,$18,$7fff,$18,$3fff,$18,$1fff,$18 dc.w $0fff,$18,$07ff,$18,$03ff,$18,$01ff,$18 dc.w $00ff,$18,$007f,$18,$003f,$18,$001f,$18 dc.w $000f,$18,$0007,$18,$0003,$18,$0001,$18 dc.w $ffff,$20,$7fff,$20,$3fff,$20,$1fff,$20 dc.w $0fff,$20,$07ff,$20,$03ff,$20,$01ff,$20 dc.w $00ff,$20,$007f,$20,$003f,$20,$001f,$20 dc.w $000f,$20,$0007,$20,$0003,$20,$0001,$20 dc.w $ffff,$28,$7fff,$28,$3fff,$28,$1fff,$28 dc.w $0fff,$28,$07ff,$28,$03ff,$28,$01ff,$28 dc.w $00ff,$28,$007f,$28,$003f,$28,$001f,$28 dc.w $000f,$28,$0007,$28,$0003,$28,$0001,$28 dc.w $ffff,$30,$7fff,$30,$3fff,$30,$1fff,$30 dc.w $0fff,$30,$07ff,$30,$03ff,$30,$01ff,$30 dc.w $00ff,$30,$007f,$30,$003f,$30,$001f,$30 dc.w $000f,$30,$0007,$30,$0003,$30,$0001,$30 dc.w $ffff,$38,$7fff,$38,$3fff,$38,$1fff,$38 dc.w $0fff,$38,$07ff,$38,$03ff,$38,$01ff,$38 dc.w $00ff,$38,$007f,$38,$003f,$38,$001f,$38 dc.w $000f,$38,$0007,$38,$0003,$38,$0001,$38 dc.w $ffff,$40,$7fff,$40,$3fff,$40,$1fff,$40 dc.w $0fff,$40,$07ff,$40,$03ff,$40,$01ff,$40 dc.w $00ff,$40,$007f,$40,$003f,$40,$001f,$40 dc.w $000f,$40,$0007,$40,$0003,$40,$0001,$40 dc.w $ffff,$48,$7fff,$48,$3fff,$48,$1fff,$48 dc.w $0fff,$48,$07ff,$48,$03ff,$48,$01ff,$48 dc.w $00ff,$48,$007f,$48,$003f,$48,$001f,$48 dc.w $000f,$48,$0007,$48,$0003,$48,$0001,$48 dc.w $ffff,$50,$7fff,$50,$3fff,$50,$1fff,$50 dc.w $0fff,$50,$07ff,$50,$03ff,$50,$01ff,$50 dc.w $00ff,$50,$007f,$50,$003f,$50,$001f,$50 dc.w $000f,$50,$0007,$50,$0003,$50,$0001,$50 dc.w $ffff,$58,$7fff,$58,$3fff,$58,$1fff,$58 dc.w $0fff,$58,$07ff,$58,$03ff,$58,$01ff,$58 dc.w $00ff,$58,$007f,$58,$003f,$58,$001f,$58 dc.w $000f,$58,$0007,$58,$0003,$58,$0001,$58 dc.w $ffff,$60,$7fff,$60,$3fff,$60,$1fff,$60 dc.w $0fff,$60,$07ff,$60,$03ff,$60,$01ff,$60 dc.w $00ff,$60,$007f,$60,$003f,$60,$001f,$60 dc.w $000f,$60,$0007,$60,$0003,$60,$0001,$60 dc.w $ffff,$68,$7fff,$68,$3fff,$68,$1fff,$68 dc.w $0fff,$68,$07ff,$68,$03ff,$68,$01ff,$68 dc.w $00ff,$68,$007f,$68,$003f,$68,$001f,$68 dc.w $000f,$68,$0007,$68,$0003,$68,$0001,$68 dc.w $ffff,$70,$7fff,$70,$3fff,$70,$1fff,$70 dc.w $0fff,$70,$07ff,$70,$03ff,$70,$01ff,$70 dc.w $00ff,$70,$007f,$70,$003f,$70,$001f,$70 dc.w $000f,$70,$0007,$70,$0003,$70,$0001,$70 dc.w $ffff,$78,$7fff,$78,$3fff,$78,$1fff,$78 dc.w $0fff,$78,$07ff,$78,$03ff,$78,$01ff,$78 dc.w $00ff,$78,$007f,$78,$003f,$78,$001f,$78 dc.w $000f,$78,$0007,$78,$0003,$78,$0001,$78 dc.w $ffff,$80,$7fff,$80,$3fff,$80,$1fff,$80 dc.w $0fff,$80,$07ff,$80,$03ff,$80,$01ff,$80 dc.w $00ff,$80,$007f,$80,$003f,$80,$001f,$80 dc.w $000f,$80,$0007,$80,$0003,$80,$0001,$80 dc.w $ffff,$88,$7fff,$88,$3fff,$88,$1fff,$88 dc.w $0fff,$88,$07ff,$88,$03ff,$88,$01ff,$88 dc.w $00ff,$88,$007f,$88,$003f,$88,$001f,$88 dc.w $000f,$88,$0007,$88,$0003,$88,$0001,$88 dc.w $ffff,$90,$7fff,$90,$3fff,$90,$1fff,$90 dc.w $0fff,$90,$07ff,$90,$03ff,$90,$01ff,$90 dc.w $00ff,$90,$007f,$90,$003f,$90,$001f,$90 dc.w $000f,$90,$0007,$90,$0003,$90,$0001,$90 dc.w $ffff,$98,$7fff,$98,$3fff,$98,$1fff,$98 dc.w $0fff,$98,$07ff,$98,$03ff,$98,$01ff,$98 dc.w $00ff,$98,$007f,$98,$003f,$98,$001f,$98 dc.w $000f,$98,$0007,$98,$0003,$98,$0001,$98 rept 256 dc.w $0000,$a0 ; Clipping. endr rept 256 dc.w $0000,$fff8 ; Clipping. endr .xmax_table: dc.w $8000,$00,$c000,$00,$e000,$00,$f000,$00 dc.w $f800,$00,$fc00,$00,$fe00,$00,$ff00,$00 dc.w $ff80,$00,$ffc0,$00,$ffe0,$00,$fff0,$00 dc.w $fff8,$00,$fffc,$00,$fffe,$00,$ffff,$00 dc.w $8000,$08,$c000,$08,$e000,$08,$f000,$08 dc.w $f800,$08,$fc00,$08,$fe00\,$08,$ff00,$08 dc.w $ff80,$08,$ffc0,$08,$ffe0,$08,$fff0,$08 dc.w $fff8,$08,$fffc,$08,$fffe,$08,$f,$08 dc.w $8000,$10,$c000,$10,$e000,$10,$f000,$10 dc.w $f800,$10,$fc00,$10,$fe00,$10,$ff00,$10 dc.w $ff80,$10,$ffc0,$10,$ffe0,$10,$fff0,$10 dc.w $fff8,$10,$fffc,$10,$fffe,$10,$f,$10 dc.w $8000,$18,$c000,$18,$e000,$18,$f000,$18 dc.w $f800,$18,$fc00,$18,$fe00,$18,$ff00,$18 dc.w $ff80,$18,$ffc0,$18,$ffe0,$18,$fff0,$18 dc.w $fff8,$18,$fffc,$18,$fffe,$18,$f,$18 dc.w $8000,$20,$c000,$20,$e000,$20,$f000,$20 dc.w $f800,$20,$fc00,$20,$fe00,$20,$ff00,$20 dc.w $ff80,$20,$ffc0,$20,$ffe0,$20,$fff0,$20 dc.w $fff8,$20,$fffc,$20,$fffe,$20,$f,$20 dc.w $8000,$28,$c000,$28,$e000,$28,$f000,$28 dc.w $f800,$28,$fc00,$28,$fe00,$28,$ff00,$28 dc.w $ff80,$28,$ffc0,$28,$ffe0,$28,$fff0,$28 dc.w $fff8,$28,$fffc,$28,$fffe,$28,$f,$28 dc.w $8000,$30,$c000,$30,$e000,$30,$f000,$30 dc.w $f800,$30,$fc00,$30,$fe00,$30,$ff00,$30 dc.w $ff80,$30,$ffc0,$30,$ffe0,$30,$fff0,$30 dc.w $fff8,$30,$fffc,$30,$fffe,$30,$f,$30 dc.w $8000,$38,$c000,$38,$e000,$38,$f000,$38 dc.w $f800,$38,$fc00,$38,$fe00,$38,$ff00,$38 dc.w $ff80,$38,$ffc0,$38,$ffe0,$38,$fff0,$38 dc.w $fff8,$38,$fffc,$38,$fffe,$38,$f,$38 dc.w $8000,$40,$c000,$40,$e000,$40,$f000,$40 dc.w $f800,$40,$fc00,$40,$fe00,$40,$ff00,$40 dc.w $ff80,$40,$ffc0,$40,$ffe0,$40,$fff0,$40 dc.w $fff8,$40,$fffc,$40,$fffe,$40,$f,$40 dc.w $8000,$48,$c000,$48,$e000,$48,$f000,$48 dc.w $f800,$48,$fc00,$48,$fe00,$48,$ff00,$48 dc.w $ff80,$48,$ffc0,$48,$ffe0,$48,$fff0,$48 dc.w $fff8,$48,$fffc,$48,$fffe,$48,$f,$48 dc.w $8000,$50,$c000,$50,$e000,$50,$f000,$50 dc.w $f800,$50,$fc00,$50,$fe00,$50,$ff00,$50 dc.w $ff80,$50,$ffc0,$50,$ffe0,$50,$fff0,$50 dc.w $fff8,$50,$fffc,$50,$fffe,$50,$f,$50 dc.w $8000,$58,$c000,$58,$e000,$58,$f000,$58 dc.w $f800,$58,$fc00,$58,$fe00,$58,$ff00,$58 dc.w $ff80,$58,$ffc0,$58,$ffe0,$58,$fff0,$58 dc.w $fff8,$58,$fffc,$58,$fffe,$58,$f,$58 dc.w $8000,$60,$c000,$60,$e000,$60,$f000,$60 dc.w $f800,$60,$fc00,$60,$fe00,$60,$ff00,$60 dc.w $ff80,$60,$ffc0,$60,$ffe0,$60,$fff0,$60 dc.w $fff8,$60,$fffc,$60,$fffe,$60,$f,$60 dc.w $8000,$68,$c000,$68,$e000,$68,$f000,$68 dc.w $f800,$68,$fc00,$68,$fe00,$68,$ff00,$68 dc.w $ff80,$68,$ffc0,$68,$ffe0,$68,$fff0,$68 dc.w $fff8,$68,$fffc,$68,$fffe,$68,$f,$68 dc.w $8000,$70,$c000,$70,$e000,$70,$f000,$70 dc.w $f800,$70,$fc00,$70,$fe00,$70,$ff00,$70 dc.w $ff80,$70,$ffc0,$70,$ffe0,$70,$fff0,$70 dc.w $fff8,$70,$fffc,$70,$fffe,$70,$f,$70 dc.w $8000,$78,$c000,$78,$e000,$78,$f000,$78 dc.w $f800,$78,$fc00,$78,$fe00,$78,$ff00,$78 dc.w $ff80,$78,$ffc0,$78,$ffe0,$78,$fff0,$78 dc.w $fff8,$78,$fffc,$78,$fffe,$78,$f,$78 dc.w $8000,$80,$c000,$80,$e000,$80,$f000,$80 dc.w $f800,$80,$fc00,$80,$fe00,$80,$ff00,$80 dc.w $ff80,$80,$ffc0,$80,$ffe0,$80,$fff0,$80 dc.w $fff8,$80,$fffc,$80,$fffe,$80,$f,$80 dc.w $8000,$88,$c000,$88,$e000,$88,$f000,$88 dc.w $f800,$88,$fc00,$88,$fe00,$88,$ff00,$88 dc.w $ff80,$88,$ffc0,$88,$ffe0,$88,$fff0,$88 dc.w $fff8,$88,$fffc,$88,$fffe,$88,$f,$88 dc.w $8000,$90,$c000,$90,$e000,$90,$f000,$90 dc.w $f800,$90,$fc00,$90,$fe00,$90,$ff00,$90 dc.w $ff80,$90,$ffc0,$90,$ffe0,$90,$fff0,$90 dc.w $fff8,$90,$fffc,$90,$fffe,$90,$f,$90 dc.w $8000,$98,$c000,$98,$e000,$98,$f000,$98 dc.w $f800,$98,$fc00,$98,$fe00,$98,$ff00,$98 dc.w $ff80,$98,$ffc0,$98,$ffe0,$98,$fff0,$98 dc.w $fff8,$98,$fffc,$98,$fffe,$98,$f,$98 rept 256 dc.w $0,$a0 ; Clipping. endr .sin_table: incbin 'a:\ball\ball.xxx' dc.w $3ffe  ; *I Section BSS .dy: ds.w 1 .nb_hlines: ds.w 1 .first_hline: ds.w 1 .first_xmin: ds.w 1 .xmins: ds.w 256 .xmaxs: ds.w 256 ; *I ; ** Routine qui efface une sphere!. ** ; ** Dracula/Positivity. ** ; *I ; a0.l = adresse ramvideo. ; d0.w = x. ; d1.w = y. ; d2.w = rayon x. ; d3.w = rayon y. movem.l d0-d4/a0-a1,-(sp) move.w d0,d4 sub.w d2,d0 ; d0=x1. add.w d4,d2 ; d2=x2. move.w d1 ,d4 sub.w d3,d1 ; d1=y1. add.w d4,d3 ; d3=y2. .circle_visibility: ; La boite est a l' exterieur de l' ecran? cmp.w #$0,d3 ; y2<0? blt .end cmp.w #$c7,d1 ; y1>199? bgt .end cmp.w #$0,d2 ; x2<0? blt .end cmp.w #$13f,d0 ; x1>319? bgt .end .clip_box: ; Clipper la boite. cmp.w #$0,d1 ; y1<0? bgt .not_y1_clipped moveq.l #$0,d1 ; Si oui y1=0. .not_y1_clipped: cmp.w #$c7,d3 ; y2>199? blt .not_y2_clipped move.l #$c7,d3 ; Si oui y2=199. .not_y2_clipped: cmp.w #$0,d0 ; x1<0? bgt .not_x1_clipped moveq.l #$0,d0 ; Si oui x1=0. .not_x1_clipped: cmp.w #$13f,d2 ; x2>319? blt .not_x2_clipped move.l #$13f,d2 ; Si oui x2=319. .not_x2_clipped: sub.w d1,d3 ; d3.w=y2-y1=dy. addq.w #$1,d3 ; d3=nombre de lignes. move.w d1,d4 add.w d1,d1 add.w d1,d1 add.w d4,d1 lsl.w #$5,d1 ; d1=y1*$a0. add.w d1,a0 ; a0 pointe sur la premiere ligne. and.w #$fff0,d0 ; d0=x1-x1 mod(16). and.w #$fff0,d2 ; d2=x2-x2 mod(16). sub.w d0,d2 lsr.w #$1,d0 add.w d0,a0 ; a0 pointe sur le premier mot. lsr.w #$1,d2 move.w d2,d4 ; d4 sera le nb d' octets a passer. lsr.w #$3,d2 add.w #$1,d2 ; d2=nombre de mots par ligne. .init_blitter: move.w #$8a28,a1 moveq.l #-$1,d0 move.l d0,(a1)+ ; Tous les masques pleins. move.w d0,(a1)+ move.w #$8,(a1)+ ; Increment x. neg.w d4 add.w #$a0,d4 ; d4=nb d' octets a passer. move.w d4,(a1)+ move.l a0,(a1)+ ; Adresse destination. move.w d2,(a1)+ ; Taille horizontale. move.w d3,(a1)+ ; Taille verticale. move.w #$200,(a1)+ ; Remplir avec des 0. move.b #$c0,(a1) ; Lancer le blitter. .end: movem.l (sp)+,d0-d4/a0-a1 rts  K[#}E  d * | AOTL}7]y+ 9 !"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;=w==>>D>q>>>??/?N?j??????????@???????????j?N?/?>>>>q>D>===w=>=<<E;@@:D7NF6XGm7F/;Cm@@D@C=#D @@>pA3={A=KB=A>@@@@?>A>A>AJ?@?|@@?w@i?-@?*@?^@|?@=@@@:?@S?@N?@5?@?@@?@ ?@ ?@ ?@@@ ;*J ;** Le programme principal! ** ;*J addy equ 89 rb equ 70 ; Rayon de la bubble. rr equ 12 ; Rayon du reflex. addr equ 35 ; Addition pour le reflex. ymin equ 90 dist equ 120 ; Rayon du cercle du parcours. supervisor_mode: ; INDISPENSABLE. move.l #$0,-(sp) move.w #$20,-(sp) trap #$1 addq.l #$6,sp dc.w $a00a ; Bye bye la souris. move.b #$12,$fc02.w bclr.b #$0,$484.w screens_adresses: ; Calcul des adresses des ecrans. move.l #screens,d0 and.l #$f00,d0 ; S' aligner sur un multiple de 256. add.l #$100,d0 move.l d0,screen1_ad ; Adresse de l' ecran 1. add.l #$7d00,d0 move.l d0,screen2_ad ; Ecran 2. save_old_features: move.w $f8260.w,old_res move.b $f820a.w,old_sync moveq.l #$0,d0 move.b $f8201.w,d0 ; Base haute. swap.w d0 move.b $f8203.w,d0 ; Moyenne. lsl.w #$8,d0 move.b $f820d.w,d0 ; Basse.( N' existe pas sur ST-STf) move.l d0,old_screen move.l #$7,d0 ; Sauver les couleurs qu'on va modifier. move.l #old_colors,a0 move.w #$8240,a1 .save_cols: move.l (a1)+,(a0)+ dbra d0,.save_cols screen_features: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.w #$0,$f8260.w ; Basse resolution. move.b #$2,$f820a.w ; Sync=50Hz. move.l screen2_ad,d0 ; Mettre l' adresse de l' ecran 2. lsr.w #$8,d0 move.b d0,$f8203.w swap.w d0 move.b d0,$f8201.w move.b #$0,$f820d.w moveq.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $334. move.l #colors,a1 .put_cols: move.l (a1)+,(a0)+ dbra d0,.put_cols ;*J init_timer_b: bclr.b #$0,$fa07.w ; Timer B disabled!.. bset.b #$0,$fa13.w ; Timer B demasked. bset.b #$3,$fa17.w ; Soft end of interrupt. move.l #timer_b,$120 move.b #$0,$fa1b.w ; Timer B stoppe. bset.b #$0,$fa07.w ; Timer B enabled. move.w #$0,alpha move.w #$0,script_pos move.l #script,a5 move.l #script+80,a3 move.l #sin_cos,a4 move.w #-96,addx move.w #$1,incx  vbl1: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp moveq.l #$7,d0 move.w #$8240,a0 ; Couleurs du haut. move.l #colors,a1 .put_cols: move.l (a1)+,(a0)+ dbra d0,.put_cols .timer_b: move.b #$0,$fa1b.w ; Stop the timer. move.b #addy+27,$fa21.w ; Wait y lignes. move.b #$8,$fa1b.w ; Event count mode. cmpi.b #$38,$fc02.w bne.s .no_test add.w #$111,$f8240.w .no_test: move.l screen1_ad,a6 .clear_everything: move.w xb1,d0 move.w yb1,d1 move.w rxb1,d2 move.w ryb1,d3 move.l a6,a0 jsr cls_ball ; Clear bubble. move.w xb1,d0 move.w ys1,d1 move.w rxb1,d2 move.w rys1,d3 move.l a6,a0 addq.l #$2,a0 jsr cls_ball ; Clear shadow. move.w xr1,d0 move.w yr1,d1 move.w rxr1,d2 move.w ryr1,d3 move.l a6,a0 addq.l #$4,a0 jsr cls_ball ; Clear reflex. .clear_everything_b: move.w xb1_b,d0 move.w yb1_b,d1 move.w rxb1_b,d2 move.w ryb1_b,d3 move.l a6,a0 addq.l #$6,a0 jsr cls_ball ; Clear bubble. move.w xb1_b,d0 move.w ys1_b,d1 move.w rxb1_b,d2 move.w rys1_b,d3 move.l a6,a0 addq.l #$2,a0 jsr cls_ball ; Clear shadow. move.w xr1_b,d0 move.w yr1_b,d1 move.w rxr1_b,d2 move.w ryr1_b,d3 move.l a6,a0 addq.l #$4,a0 jsr cls_ball ; Clear reflex. * Calculations and all the rest. .calculations: move.w alpha,d0 addq.w #$2,d0 ; Tournez maneges. cmp.w #$200,d0 ; Un tour complet? bne.s .angle_ok moveq.l #$0,d0 .angle_ok: move.w d0,alpha add.w d0,d0 ; 1 mot par sinus. move.w (a4,d0.w),d1 ; d1=sin(alpha). add.w #$100,d0 move.w (a4,d0.w),d0 ; d0=cos(alpha). muls.w #dist,d0 add.l d0,d0 add.l d0,d0 swap.w d0 ; d0=dist*cos. add.w #dist,d0 ; d0=dist*cos+dist. muls.w #dist,d1 add.l d1,d1 add.l d1,d1 swap.w d1 ; d1=dist*sin. add.w #$100,d0 ; d0=z+256. ext.l d1 lsl.l #$8,d1 ; d1=x*256. divs.w d0,d1 ; d1=x*256/(256+z). add.w addx,d1 move.w d1,xb1 ; xb1=addx+(x*256/(256+z)). .script: move.w (a5)+,d1 ; d1=y. move.w (a5)+,d6 ; d6=mulx. move.w (a5)+,d7 ; d7=muly. add.w #$1,script_pos move.w script_pos,d2 cmp.w script_length,d2 bne.s .script_ok move.l #script,a5 move.w #$0,script_pos .script_ok: ext.l d1 lsl.l #$8,d1 ; d1=y*256. move.w d0,d2 divs.w d2,d1 ; d1=y*256/(256+z). add.w #addy,d1 move.w d1,yb1 ; yb1=addy+(y*256/(256+z)).  move.w #rb,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxb1 mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryb1 move.w #ymin,d1 ext.l d1 lsl.w #$8,d1 divs.w d0,d1 add.w #addy,d1 ; d1=addy+(ymin*256/(256+z)). move.w d1,ys1 move.l #ymin,d2 lsl.w #$8,d2 move.l d2,d3 move.w d0,d1 add.w rxb1,d1 divs.w d0,d2 divs.w d1,d3 sub.w d3,d2 ; d2=ymin*256*(1/(256+z)-1/(256+z+rxb)). move.w d2,rys1 move.w #addr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 divs.w d0,d1 add.w xb1,d1 move.w d1,xr1 ; xr=xb+(addr*mulx*256/(256+z)). mulu.w d7,d2 lsr.l #$6,d2 divs.w d0,d2 sub.w yb1,d2 neg.w d2 move.w d2,yr1 ; yr=yb+(addr*muly*256/(256+z)). move.w #rr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxr1 mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryr1  .print_everything: move.w xb1,d0 move.w yb1,d1 move.w rxb1,d2 move.w ryb1,d3 move.l a6,a0 jsr ball ; Print bubble. move.w xb1,d0 move.w ys1,d1 move.w rxb1,d2 move.w rys1,d3 move.l a6,a0 addq.l #$2,a0 jsr ball ; Print shadow. move.w xr1,d0 move.w yr1,d1 move.w rxr1,d2 move.w ryr1,d3 move.l a6,a0 addq.l #$4,a0 jsr ball ; Print reflex. * * The same for the blue bubble. .calculations_b: move.w alpha,d0 add.w d0,d0 ; 1 mot par sinus. move.w (a4,d0.w),d1 ; d1=sin(alpha). neg.w d1 add.w #$100,d0 move.w (a4,d0.w),d0 ; d0=cos(alpha). neg.w d0 muls.w #dist,d0 add.l d0,d0 add.l d0,d0 swap.w d0 ; d0=dist*-cos. add.w #dist,d0 ; d0=dist*-cos+dist. muls.w #dist,d1 add.l d1,d1 add.l d1,d1 swap.w d1 ; d1=dist*-sin. add.w #$100,d0 ; d0=z+256. ext.l d1 lsl.l #$8,d1 ; d1=x*256. divs.w d0,d1 ; d1=x*256/(256+z). add.w addx,d1 move.w d1,xb1_b ; xb1_b=addx+(x*256/(256+z)). .script_b: move.w (a3)+,d1 ; d1=y. move.w (a3)+,d6 ; d6=mulx. move.w (a3)+,d7 ; d7=muly. add.w #$1,script_pos_b move.w script_pos_b,d2 cmp.w script_length,d2 bne.s .script_ok_b move.l #script,a3 move.w #$0,script_pos_b .script_ok_b: ext.l d1 lsl.l #$8,d1 ; d1=y*256. move.w d0,d2 divs.w d2,d1 ; d1=y*256/(256+z). add.w #addy,d1 move.w d1,yb1_b ; yb1=addy+(y*256/(256+z)).  move.w #rb,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxb1_b mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryb1_b move.w #ymin,d1 ext.l d1 lsl.w #$8,d1  divs.w d0,d1 add.w #addy,d1 ; d1=addy+(ymin*256/(256+z)). move.w d1,ys1_b move.l #ymin,d2 lsl.w #$8,d2 move.l d2,d3 move.w d0,d1 add.w rxb1_b,d1 divs.w d0,d2 divs.w d1,d3 sub.w d3,d2 ; d2=ymin*256*(1/(256+z)-1/(256+z+rxb)). move.w d2,rys1_b move.w #addr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 divs.w d0,d1 add.w xb1_b,d1 move.w d1,xr1_b ; xr=xb+(addr*mulx*256/(256+z)). mulu.w d7,d2 lsr.l #$6,d2 divs.w d0,d2 sub.w yb1_b,d2 neg.w d2 move.w d2,yr1_b ; yr=yb+(addr*muly*256/(256+z)). move.w #rr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxr1_b mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryr1_b  .print_everything_b: move.w xb1_b,d0 move.w yb1_b,d1 move.w rxb1_b,d2 move.w ryb1_b,d3 move.l a6,a0 addq.l #$6,a0 jsr ball ; Print bubble. move.w xb1_b,d0 move.w ys1_b,d1 move.w rxb1_b,d2 move.w rys1_b,d3 move.l a6,a0 addq.l #$2,a0 jsr ball ; Print shadow. move.w xr1_b,d0 move.w yr1_b,d1 move.w rxr1_b,d2 move.w ryr1_b,d3 move.l a6,a0 addq.l #$4,a0 jsr ball ; Print reflex. * cmpi.b #$38,$fc02.w bne.s .no_test2 sub.w #$111,$f8240.w .no_test2: move.l screen1_ad,d0 ; Ecran de travail. lsr.w #$8,d0 move.b d0,$f8203.w swap.w d0 move.b d0,$f8201.w vbl2: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp moveq.l #$7,d0 move.w #$8240,a0 ; Couleurs du haut. move.l #colors,a1 .put_cols: move.l (a1)+,(a0)+ dbra d0,.put_cols .timer_b: move.b #$0,$fa1b.w ; Stop the timer. move.b #addy+27,$fa21.w ; Wait y lignes. move.b #$8,$fa1b.w ; Event count mode. cmpi.b #$38,$fc02.w bne.s .no_test add.w #$111,$f8240.w .no_test: move.l screen2_ad,a6 .clear_everything: move.w xb2,d0 move.w yb2,d1 move.w rxb2,d2 move.w ryb2,d3 move.l a6,a0 jsr cls_ball ; Clear bubble. move.w xb2,d0 move.w ys2,d1 move.w rxb2,d2 move.w rys2,d3 move.l a6,a0 addq.l #$2,a0 jsr cls_ball ; Clear shadow. move.w xr2,d0 move.w yr2,d1 move.w rxr2,d2 move.w ryr2,d3 move.l a6,a0 addq.l #$4,a0 jsr cls_ball ; Clear reflex. .clear_everything_b: move.w xb2_b,d0 move.w yb2_b,d1 move.w rxb2_b,d2 move.w ryb2_b,d3 move.l a6,a0 addq.l #$6,a0 jsr cls_ball ; Clear blue bubble. move.w xb2_b,d0 move.w ys2_b,d1 move.w rxb2_b,d2 move.w rys2_b,d3 move.l a6,a0 addq.l #$2,a0 jsr cls_ball ; Clear shadow. move.w xr2_b,d0 move.w yr2_b,d1 move.w rxr2_b,d2 move.w ryr2_b,d3 move.l a6,a0 addq.l #$4,a0 jsr cls_ball ; Clear reflex. * Calculations and all the rest. .calculations: move.w alpha,d0 addq.w #$2,d0 ; Tournez maneges. cmp.w #$200,d0 ; Un tour complet? bne.s .angle_ok moveq.l #$0,d0 .angle_ok: move.w d0,alpha add.w d0,d0 ; 1 mot par sinus. move.w (a4,d0.w),d1 ; d1=sin(alpha). add.w #$100,d0 move.w (a4,d0.w),d0 ; d0=cos(alpha). muls.w #dist,d0 add.l d0,d0 add.l d0,d0 swap.w d0 ; d0=dist*cos. add.w #dist,d0 ; d0=dist*cos+dist. muls.w #dist,d1 add.l d1,d1 add.l d1,d1 swap.w d1 ; d1=dist*sin. add.w #$100,d0 ; d0=z+256. ext.l d1 lsl.l #$8,d1 ; d1=x*256. divs.w d0,d1 ; d1=x*256/(256+z). add.w addx,d1 move.w d1,xb2 ; xb2=addx+(x*256/(256+z)). .script: move.w (a5)+,d1 ; d1=y. move.w (a5)+,d6 ; d6=mulx. move.w (a5)+,d7 ; d7=muly. add.w #$1,script_pos move.w script_pos,d2 cmp.w script_length,d2 bne.s .script_ok move.l #script,a5 move.w #$0,script_pos .script_ok: ext.l d1 lsl.l #$8,d1 ; d1=y*256. move.w d0,d2 divs.w d2,d1 ; d1=y*256/(256+z). add.w #addy,d1 move.w d1,yb2 ; yb2=addy+(y*256/(256+z)).  move.w #rb,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxb2 mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryb2 move.w #ymin,d1 ext.l d1 lsl.w #$8,d1 divs.w d0,d1 add.w #addy,d1 ; d1=addy+(ymin*256/(256+z)). move.w d1,ys2 move.l #ymin,d2 lsl.w #$8,d2 move.l d2,d3 move.w d0,d1 add.w rxb1,d1 divs.w d0,d2 divs.w d1,d3 sub.w d3,d2 ; d2=ymin*256*(1/(256+z)-1/(256+z+rxb)). move.w d2,rys2 move.w #addr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 divs.w d0,d1 add.w xb2,d1 move.w d1,xr2 ; xr=xb+(addr*mulx*256/(256+z)). mulu.w d7,d2 lsr.l #$6,d2 divs.w d0,d2 sub.w yb2,d2 neg.w d2 move.w d2,yr2 ; yr=yb+(addr*muly*256/(256+z)). move.w #rr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxr2 mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryr2  .print_everything: move.w xb2,d0 move.w yb2,d1 move.w rxb2,d2 move.w ryb2,d3 move.l a6,a0 jsr ball ; Print bubble. move.w xb2,d0 move.w ys2,d1 move.w rxb2,d2 move.w rys2,d3 move.l a6,a0 addq.l #$2,a0 jsr ball ; Print shadow. move.w xr2,d0 move.w yr2,d1 move.w rxr2,d2 move.w ryr2,d3 move.l a6,a0 addq.l #$4,a0 jsr ball ; Print reflex. * * The same for the blue bubble. .calculations_b: move.w alpha,d0 add.w d0,d0 ; 1 mot par sinus. move.w (a4,d0.w),d1 ; d1=sin(alpha). neg.w d1 add.w #$100,d0 move.w (a4,d0.w),d0 ; d0=cos(alpha). neg.w d0 muls.w #dist,d0 add.l d0,d0 add.l d0,d0 swap.w d0 ; d0=dist*-cos. add.w #dist,d0 ; d0=dist*-cos+dist. muls.w #dist,d1 add.l d1,d1 add.l d1,d1 swap.w d1 ; d1=dist*-sin. add.w #$100,d0 ; d0=z+256. ext.l d1 lsl.l #$8,d1 ; d1=x*256. divs.w d0,d1 ; d1=x*256/(256+z). add.w addx,d1 move.w d1,xb2_b ; xb1_b=addx+(x*256/(256+z)). .script_b: move.w (a3)+,d1 ; d1=y. move.w (a3)+,d6 ; d6=mulx. move.w (a3)+,d7 ; d7=muly. add.w #$1,script_pos_b move.w script_pos_b,d2 cmp.w script_length,d2 bne.s .script_ok_b move.l #script,a3 move.w #$0,script_pos_b .script_ok_b: ext.l d1 lsl.l #$8,d1 ; d1=y*256. move.w d0,d2 divs.w d2,d1 ; d1=y*256/(256+z). add.w #addy,d1 move.w d1,yb2_b ; yb1=addy+(y*256/(256+z)).  move.w #rb,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxb2_b mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryb2_b move.w #ymin,d1 ext.l d1 lsl.w #$8,d1 divs.w d0,d1 add.w #addy,d1 ; d1=addy+(ymin*256/(256+z)). move.w d1,ys2_b move.l #ymin,d2 lsl.w #$8,d2 move.l d2,d3 move.w d0,d1 add.w rxb2_b,d1 divs.w d0,d2 divs.w d1,d3 sub.w d3,d2 ; d2=ymin*256*(1/(256+z)-1/(256+z+rxb)). move.w d2,rys2_b move.w #addr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 divs.w d0,d1 add.w xb2_b,d1 move.w d1,xr2_b ; xr=xb+(addr*mulx*256/(256+z)). mulu.w d7,d2 lsr.l #$6,d2 divs.w d0,d2 sub.w yb2_b,d2 neg.w d2 move.w d2,yr2_b ; yr=yb+(addr*muly*256/(256+z)). move.w #rr,d1 move.w d1,d2 mulu.w d6,d1 lsr.l #$6,d1 ; d1=rb*mulx*256. divs.w d0,d1 ; d1=(rb*mulx*256/(256+z)). move.w d1,rxr2_b mulu.w d7,d2 lsr.l #$6,d2 ; d2=rb*muly*256. divs.w d0,d2 ; d1=(rb*muly*256/(256+z)). move.w d2,ryr2_b  .print_everything_b: move.w xb2_b,d0 move.w yb2_b,d1 move.w rxb2_b,d2 move.w ryb2_b,d3 move.l a6,a0 addq.l #$6,a0 jsr ball ; Print bubble. move.w xb2_b,d0 move.w ys2_b,d1 move.w rxb2_b,d2 move.w rys2_b,d3 move.l a6,a0 addq.l #$2,a0 jsr ball ; Print shadow. move.w xr2_b,d0 move.w yr2_b,d1 move.w rxr2_b,d2 move.w ryr2_b,d3 move.l a6,a0 addq.l #$4,a0 jsr ball ; Print reflex. * cmpi.b #$38,$fc02.w bne.s .no_test2 sub.w #$111,$f8240.w .no_test2: move.l screen2_ad,d0 ; Ecran de travail. lsr.w #$8,d0 move.b d0,$f8203.w swap.w d0 move.b d0,$f8201.w move.w addx,d0 add.w incx,d0 move.w d0,addx cmp.w #416,addx bne.s .not_incx neg.w incx .not_incx: cmp.w #-98,addx beq.s sortie  cmpi.b #$39,$fc02.w beq.s sortie  bra vbl1 ;*J sortie: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.w old_res,$f8260.w move.b old_sync,$f820a.w move.l old_screen,d0 swap.w d0 move.b d0,$f8201.w ; Le pire c' est qu'il faut mettre swap.w d0 ; $ff820d en dernier. rol.w #$8,d0 move.b d0,$f8203.w rol.w #$8,d0 move.b d0,$f820d.w move.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $334. move.l #old_colors,a1 .restore_cols: move.l (a1)+,(a0)+ & dbra d0,.restore_cols bset.b #$0,$484.w move.b #$8,$fc02.w dc.w $a009 ; Le tank est de retour! clr.w -(sp) trap #$1 ;*J timer_b: move.b #$0,$fa1b.w ; Stop the timer. move.l a0,-(sp) move.l a1,-(sp) move.w #$8240,a0 ; Couleurs du bas. move.l #low_colors,a1 move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (sp)+,a1 move.l (sp)+,a0 bclr.b #$0,$fa0f.w ; Interruption finie. rte ;*J ball: include 'a:\ball\ball.s' Section TEXT cls_ball: include 'a:\ball\cls_ball.s' Section TEXT ;*J Section DATA colors: dc.w $0aa,$e0b,$000,$000 dc.w $000,$f8c,$000,$000 dc.w $b0e,$606,$000,$000 dc.w $c8f,$707,$000,$000 low_colors: dc.w $022,$603,$099,$d0a dc.w $000,$f8c,$000,$000 dc.w $306,$d0d,$a0d,$dad dc.w $c8f,$707,$000,$000 sin_cos: incbin 'a:\ball\sin_cos.xxx' script_length: ; Taille du script. dc.w 80 script: ; Le script: y,mulx,muly. incbin 'a:\bubble\bubble.xxx' script_pos: dc.w 0 script_pos_b: dc.w 40   ;*J Section BSS buffer: ds.w 16 alpha: ds.w 1 xb1: ; Toutes le coords calculees ds.w 1 ; lors de la vbl1. yb1: ds.w 1 rxb1: ds.w 1 ryb1: ds.w 1 ys1: ds.w 1 rys1: ds.w 1 xr1: ds.w 1 yr1: ds.w 1 rxr1: ds.w 1 ryr1: ds.w 1 xb1_b: ; Pour la bubble bleue. ds.w 1 yb1_b: ds.w 1 rxb1_b: ds.w 1 ryb1_b: ds.w 1 ys1_b: ds.w 1 rys1_b: ds.w 1 xr1_b: ds.w 1 yr1_b: ds.w 1 rxr1_b: ds.w 1 ryr1_b: ds.w 1 xb2: ; Toutes le coords calculees ds.w 1 ; lors de la vbl2. yb2: ds.w 1 rxb2: ds.w 1 ryb2: ds.w 1 ys2: ds.w 1 rys2: ds.w 1 xr2: ds.w 1 yr2: ds.w 1 rxr2: ds.w 1 ryr2: ds.w 1 xb2_b: ; Pour la bubble bleue. ds.w 1 yb2_b: ds.w 1 rxb2_b: ds.w 1 ryb2_b: ds.w 1 ys2_b: ds.w 1 rys2_b: ds.w 1 xr2_b: ds.w 1 yr2_b: ds.w 1 rxr2_b: ds.w 1 ryr2_b: ds.w 1 addx: ds.w 1 incx: ds.w 1  old_res: ds.w 1 old_sync: ds.w 1 old_screen: ds.l 1 old_colors: ds.l 8 screen1_ad: ds.l 1 screen2_ad: ds.l 1 screens: ds.l 16064 ' ** Creation de les yb,mulx,muly pour la bubble! ** DIM yb%(160),mulx%(160),muly%(160) rb%=70 ymin%=90 ampl1%=25 ampl2%=60 a$=SPACE$(1024) adr%=VARPTR(a$) ' FOR comp%=0 TO 19 yb%(comp%)=(ampl1%*SIN(comp%*PI/20))+ymin%-rb% muly%(comp%)=16384*(ymin%-yb%(comp%))/rb% mulx%(comp%)=-(muly%(comp%)-16384)*1.3+16384 PSET comp%,yb%(comp%)+50,1 PSET comp%,(rb%*(mulx%(comp%))/16384)+50,2 PSET comp%,(rb%*(muly%(comp%))/16384)+50,3 DPOKE adr%,yb%(comp%) adr%=adr%+2 DPOKE adr%,mulx%(comp%) adr%=adr%+2 DPOKE adr%,muly%(comp%) adr%=adr%+2 NEXT comp% FOR comp%=20 TO 79 yb%(comp%)=-(ampl2%*SIN((comp%-20)*PI/60))+ymin%-rb% muly%(comp%)=16384-(muly%(10)*2-16384)*((80-comp%)/80)^2*SIN((comp%-20)*PI/6) mulx%(comp%)=-(muly%(comp%)-16384)*1.3+16384 PSET comp%,yb%(comp%)+50,1 PSET comp%,(rb%*(mulx%(comp%))/16384)+50,2 PSET comp%,(rb%*(muly%(comp%))/16384)+50,3 DPOKE adr%,yb%(comp%) adr%=adr%+2 DPOKE adr%,mulx%(comp%) adr%=adr%+2 DPOKE adr%,muly%(comp%)  adr%=adr%+2 NEXT comp% ' adr%=VARPTR(a$) BSAVE "d:\bubble\bubble.xxx",adr%,480 .  `B.. POLYGONEDOC -`CUSE_POLYDOC `FBALL DOC W`GUSE_BALLDOC `I%B BROBECKER Alain rte de Dardagny 01630 CHALLEX FRANCE  This text explain how to use the poly_stx.s routines. -5   At first define the routine as an included routine: { Section TEXT {polygone: { include 'path\poly_stf.s' { { Section XXX Where XXX is the kind of stuff you want to have behind the routine. ( BSS,DATA or TEXT!) Then anywhere in the program, call the routine with the following parameters: a0.l = adress of the ramvideo. a1.l = adress of the coords of the brows. d0.l = nb of brows.  ( a0 should be a multiple of 2.)  BUT you should know that the polygone has to be convex! This mean that when you take 2 points in the poly, the segment defined by this 2 points is entirely in the poly. /\ This polygone /\ This one is not! / \ is convex ! / / ( concave! ) \ \ / \ \ / \/\/ \/ And also that the polygone has to be defined in trigonometrical way! This means that the second point is obtained by an anti-clockwise turn from the first point. ( around the center of the poly. ) 1 _ 4 A good 1 _ 2 And a bad one. | | definition | | | | for the brows. | | 2 - 3 4 - 3 So, here is an example for the definition of the brows coords. {brows: { dc.w $00,$00 { dc.w $00,$2a { dc.w $2a,$2a { dc.w $2a,$00 {brows_nb: { dc.l $4 The x clipping of the polygone bugs if the polygone is too big, due to the fact that the x clipping is a trick I added after the routine was finished! ( Thanks Spearhead! ) If you use the STe routine, the processor must be in supervisor mode, cos I access the registers of the blitter.  I think that giving an example is a good idea, so see the file "use_poly.doc" for more. Don't worry, be happy! Dracula/PoSiTiViTy   Section TEXT main_proggy: move.w #$0,-(sp) ; Change the screen features by using move.l #$78000,-(sp) ; the Xbios setscreen function. move.l #$78000,-(sp) ; New resolution=low ST, phys and logbase move.w #$5,-(sp) ; are set to $78000. trap #$e add.l #$12,sp move.l #$78000,a0 ; Parameters for the routine. move.l #brows,a1 move.l brows_nb,d0 jsr polygone ; Call the routine. move.w #$7,-(sp) ; Gemdos function to get a key. trap #$1 addq.l #$2,sp clr.w -(sp) ; Gemdos function to end the prog. trap #$1 Section TEXT polygone: include 'a:\polygone\poly_stf.s' Section DATA brows: dc.w -42,80 dc.w 42,164 dc.w 126,80 dc.w 42,-4 brows_nb: dc.l $4  BROBECKER Alain rte de Dardagny 01630 CHALLEX FRANCE  This text explain how to use the ball.s routine. -0   At first define the routine as an included routine: { Section TEXT {ball: { include 'path\ball.s' { { Section XXX Where XXX is the kind of stuff you want to have behind the routine. ( BSS,DATA or TEXT!) Then anywhere in the program, call the routine with the following parameters: a0.l = adress of the ramvideo. d0.w = x of the center. d1.w = y of the center. d2.w = horizontal size. d3.w = vertical size.  ( a0 should be a multiple of 2.)  The x clipping of the ball bugs if the ball is too big, for the same reason than for the poly routine. Note that you must be in supervisor mode, cos I use the blitter to draw the big horizontal lines. See "use_ball.doc" to have an exemple of the use of the routine. Don't worry, be happy! Dracula/PoSiTiViTy V Section TEXT main_proggy: move.l #$0,-(sp) move.w #$20,-(sp) ; Supervisor mode. trap #$1 addq.l #$6,sp move.w #$0,-(sp) ; Change the screen features by using move.l #$78000,-(sp) ; the Xbios setscreen function. move.l #$78000,-(sp) ; New resolution=low ST, phys and logbase move.w #$5,-(sp) ; are set to $78000. trap #$e add.l #$12,sp move.l #$78000,a0 ; Parameters for the routine. move.w #159,d0 ; Center the ball on the screen. move.w #99,d1 move.w #128,d2 ; Horizontal size. move.w #128,d3 ; Vertical size. jsr ball ; Call the routine. move.w #$7,-(sp) ; Gemdos function to get a key. trap #$1 addq.l #$2,sp clr.w -(sp) ; Gemdos function to end the prog. trap #$1 Section TEXT ball: include 'a:\ball\ball.s' .  `J.. FONTS XXX `K ENDPART S t`MSTM12 MOD ltN~axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|>~~{yxxxxx|~{yxx~x>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx88pxxxxy{~~|>xxxxxxxxxxxxxx>?|xxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxx{{{{{{xxxxxxxxxxxxxxxxxxxxxxxx ~p~??<xxxxxxxxx88p{{{{{{xxxxxxxxxx?f``xxxxxxxxxx8888ppppax<<<<x?xxxxxxy?xxxxxx>xxxxxxxxxxx xxxx;*J ;** Le programme principal! ** ;*J supervisor_mode: ; INDISPENSABLE. move.l #$0,-(sp) move.w #$20,-(sp) trap #$1 addq.l #$6,sp dc.w $a00a ; Bye bye la souris. move.b #$12,$fc02.w bclr.b #$0,$484.w save_old_features: move.w $f8260.w,old_res move.b $f820a.w,old_sync moveq.l #$0,d0 move.b $f8201.w,d0 ; Base haute. swap.w d0 move.b $f8203.w,d0 ; Moyenne. lsl.w #$8,d0 move.b $f820d.w,d0 ; Basse.( N' existe pas sur ST-STf) move.l d0,old_screen move.l #$7,d0 ; Sauver les couleurs qu'on va modifier. move.l #old_colors,a0 move.w #$8240,a1 .save_cols: move.l (a1)+,(a0)+ dbra d0,.save_cols move.l #screen,screen_ad ; Adresse de base. screen_features: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.b #$1,$f8260.w ; Moyenne resolution. move.b #$2,$f820a.w ; Sync=50Hz. move.l screen_ad,d0 ; Mettre l' adresse de l' ecran. move.b d0,$f8209.w ; Base basse de la ramvideo. lsr.w #$8,d0 move.b d0,$f8207.w ; Base moyenne de la ramvideo. swap.w d0 move.b d0,$f8205.w ; Base haute de la ramvideo. moveq.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $334. move.l #colors,a1 .put_cols: move.l (a1)+,(a0)+ dbra d0,.put_cols jsr muson ;*(*" vbl1: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp cmpi.b #$38,$fc02.w bne.s .no_test add.w #$111,$f8240.w .no_test: move.l screen_ad,d0 ; Ecran a afficher. move.b d0,$f8209.w ; Base basse de la ramvideo. lsr.w #$8,d0 move.b d0,$f8207.w ; Base moyenne de la ramvideo. swap.w d0 move.b d0,$f8205.w ; Base haute de la ramvideo. ;* move.w nb_vbls,d0 addq.w #$1,d0 cmp.w #216,d0 ; 204 lignes de scrollees deja. bne.s .scroll_one .up_again: ; Sinon on retourne en haut. move.l #screen,screen_ad moveq.l #$0,d0 bra.s .ok_ok_compris .scroll_one: add.l #$a0,screen_ad .ok_ok_compris: move.w d0,nb_vbls .print_text: ; Afficher du texte si besoin est. move.w nb_vbls_mod12,d0 subq.w #$1,d0 bne.s .no_print_text move.l screen_ad,a0 ; Si on ici il faut afficher du texte. move.l text_pos,a1 ; Position dans le texte. sub.w #1920,a0 ; Au dessus de l' ecran. jsr print_one_line adda.l #34560,a0 ; Et au dessous. jsr print_one_line add.l #40,a1 ; Prochaine ligne. move.l text_end,d1 cmp.l d1,a1 ; C' est la fin?  bne .not_text_end move.l #text,a1 ; On recommence. .not_text_end: move.l a1,text_pos ; Sinon on sauve. move.w #12,d0 .no_print_text: move.w d0,nb_vbls_mod12 ; Et on continue. ;* cmpi.b #$38,$fc02.w bne.s .no_test2 sub.w #$111,$f8240.w .no_test2: ;* ;* ;* vbl2: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.l screen_ad,d0 ; Ecran a afficher. move.b d0,$f8209.w ; Base basse de la ramvideo. lsr.w #$8,d0 move.b d0,$f8207.w ; Base moyenne de la ramvideo. swap.w d0 move.b d0,$f8205.w ; Base haute de la ramvideo. cmpi.b #$38,$fc02.w bne.s .no_test add.w #$111,$f8240.w .no_test: cmpi.b #$38,$fc02.w bne.s .no_test2 sub.w #$111,$f8240.w .no_test2: cmpi.b #$39,$fc02.w bne vbl1 ;*J sortie: jsr musoff move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.w old_res,$f8260.w move.b old_sync,$f820a.w move.l old_screen,d0 swap.w d0 move.b d0,$f8201.w ; Le pire c' est qu'il faut mettre swap.w d0 ; $ff820d en dernier. rol.w #$8,d0 move.b d0,$f8203.w rol.w #$8,d0 move.b d0,$f820d.w move.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $334. move.l #old_colors,a1 .restore_cols: move.l (a1)+,(a0)+ dbra d0,.restore_cols bset.b #$0,$484.w move.b #$8,$fc02.w dc.w $a009 ; Le tank est de retour! clr.w -(sp) trap #$1 ;*J print_one_line: movem.l d0-d2/a0-a4,-(sp) move.l #fonts,a2 ; Adresse des motifs. move.l #conv_table,a3 ; Pour conversion. move.w #39,d0 ; 40 chars par ligne. .one_char: moveq.l #$0,d1 move.b (a1)+,d1 ; Char a afficher. move.b (a3,d1.w),d1 ; Position dans les motifs. move.w d1,d2 ; Multiplication par 24. add.w d1,d1 add.w d2,d1 lsl.w #$3,d1 move.l a2,a4 add.w d1,a4 ; a4 pointe sur le char. move.w (a4),(a0) move.w (a4)+,$a2(a0) move.w (a4),$a0(a0) move.w (a4)+,$142(a0) move.w (a4),$140(a0) move.w (a4)+,$1e2(a0) move.w (a4),$1e0(a0) move.w (a4)+,$282(a0) move.w (a4),$280(a0) move.w (a4)+,$322(a0) move.w (a4),$320(a0) move.w (a4)+,$3c2(a0) move.w (a4),$3c0(a0) move.w (a4)+,$462(a0) move.w (a4),$460(a0) move.w (a4)+,$502(a0) move.w (a4),$500(a0) move.w (a4)+,$5a2(a0) move.w (a4),$5a0(a0) move.w (a4)+,$642(a0) move.w (a4),$640(a0) move.w (a4)+,$6e2(a0) move.w (a4),$6e0(a0) move.w (a4)+,$782(a0) addq.w #$4,a0 ; Prochain char. dbra d0,.one_char movem.l (sp)+,d0-d2/a0-a4 rts ;*J Section DATA colors: dc.w $0aa,$466,$099,$466 dc.w $000,$000,$000,$000 dc.w $000,$000,$000,$000 dc.w $000,$000,$000,$000 fonts: incbin 'a:\endpart\fonts.xxx' conv_table: dc.b 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75 dc.b 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75 dc.b 75,54,61,52,75,75,75,60,55,56,63,75,59,58,53,52 dc.b 73,64,65,66,67,68,69,70,71,72,74,75,75,75,75,57 dc.b 75,00,01,02,03,04,05,0 6,07,08,09,10,11,12,13,14 dc.b 15,16,17,18,19,20,21,22,23,24,25,75,75,75,75,75 dc.b 60,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40 dc.b 41,42,43,44,45,46,47,48,49,50,51,75,75,75,62,75 text: dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' * PoSiTiViTy * ' dc.b ' ~ ' dc.b ' (' dc.b ' * Whishes you a merry X-mas 1993 * ' dc.b ' And also a Happy New-Year. ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' I (Dracula) am not familiar with ' dc.b ' scrolltexts, so it''ll be boring, but ' dc.b ' the Wonderfull music by ST_MIXES ' dc.b ' will help you reading this! ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' First let''s go on with the ego trip! ' dc.b ' (' dc.b ' (' dc.b ' The Credits: ' dc.b ' ~ ' dc.b ' Soundtrack music#ST-Mixes ' dc.b ' First Picture# STelex ' dc.b ' Second Piccy#Exocet ' dc.b ' Chip music#Big Alec ' dc.b ' Soundtrack rout# Wizzcat ' dc.b ' Ugly logos#Dracula ' dc.b ' Crappy code#Dracula ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' I know you don''t mind the bollocks, ' dc.b ' but here''s the##. ' dc.b ' (' dc.b ' (' dc.b ' Positivity Memberlist: ' dc.b ' ~ ' dc.b ' Anneli# Swapper ' dc.b ' Dracula# Bugger ' dc.b ' Dump# Musician ' dc.b ' Exocet# Graphist ' dc.b ' Kasar#Coder ' dc.b ' Kelvin# Tourist ' dc.b ' Nikom# Musician ' dc.b ' Silver Eagle#Swapper ' dc.b ' Spearhead# Coder ' dc.b ' STelex# Graphist ' dc.b ' ST-Mixes# Musician ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b '~(' dc.b ' (' dc.b ' As X-mas is a major event,I would ' dc.b ' like to send my best regards to: ' dc.b ' (' dc.b ' Chris-Creeks-Survivor of Mafiamiga ' dc.b ' Daubeman ' dc.b ' Daniel ' dc.b ' Elf of Intense ' dc.b ' Flips of Dnt Crew ' dc.b ' Fred (STe is goood for you!) ' dc.b ' Jazz ' dc.b ' Kaya ' dc.b ' Onyx ' dc.b ' Philippe and his brother ' dc.b ' STC-Sam of Hmd ' dc.b ' Tomcat-Lector-Skillion of Steelers ' dc.b ' Wann ze flying koter of Hmd ' dc.b ' Zorgan of les Heretiques ' dc.b ' (' dc.b ' The anonymous who send the nice letter!' dc.b ' (' dc.b ' All members of Positivity# ' dc.b ' (' dc.b ' All the cool guys I forgot! ' dc.b ' &' dc.b ' (' dc.b ' Merry X-mas guys! ' dc.b ' (' dc.b ' (' dc.b '~(' dc.b ' (' dc.b ' (' dc.b ' Kasar send his greetings to: ' dc.b ' (' dc.b ' ABSTRACT,ST CONNEXION,HMD,THE MISFITS ' dc.b ' FMCC,OVR,DNT CREW,LEGACY,FUZION,FANTASY' dc.b 'ADRENALINE,SUPREMACY,MJJ PROD,SECTOR ONE' dc.b 'EQUINOX,DUNE,NEXT,OXYGENE,HOLOCAUST,ASOA' dc.b ' THE CYBERNETICS,THE AUTHENTIK,AURA,ICS ' dc.b ' BINARIS,THE REPLICANTS,KGB,VMAX,SYSTEM ' dc.b 'THE RESPECTABLES,LUNO,ODISSEY,ALEX,SMALT' dc.b ' NEIMAD,HALTERO,CREATEUR,NRTH,DANEE-TFH ' dc.b ' PHILST,NICKY-ACS,ARX-TDS,SAD-ETERNITY ' dc.b ' ZER,THE UNION,FALCON ' dc.b ' ALL THE GREAT DEMOMAKERS ' dc.b ' (' dc.b ' (' dc.b '~(' dc.b ' (' dc.b ' (' dc.b ' It''s X-mas, so I included *surprises* ' dc.b ' on the disk: ' dc.b ' (' dc.b ' (' dc.b ' You can found all my (lame) sources! ' dc.b ' (' dc.b ' There is also the reset I coded ' dc.b ' for the marvellous DNT Paper 6! ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b '*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~' dc.b ' (' dc.b ' (' dc.b ' Ok, now I''ll bore you with my life: ' dc.b ' (' dc.b ' I''m born on 27 of april 1973 ' dc.b ' and I was drunk the day after, ' dc.b 'cos my birth is a major event in my life' dc.b ' and# ' dc.b ' (' dc.b ' Sto p! ' dc.b ' (' dc.b ' (' dc.b ' I didn''t thought it was so hard to ' dc.b ' write a scrolltext! Tough shit! ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' Ok, a few words about the members of ' dc.b ' the megagroup (Arf,arf##) *PoSiTiViTy* ' dc.b ' (' dc.b ' (' dc.b ' The amazing thing is that the ' dc.b 'musicians are really good and efficient!' dc.b ' (' dc.b ' (' dc.b ' The music you are listening at now ' dc.b ' is a wonderfull piece of talent, ' dc.b ' and you should know that''s it''s not the' dc.b ' best one our musicians made! ' dc.b ' (' dc.b ' (' dc.b ' Of course, all members of Positivity ' dc.b ' are pure gods, except I(lamer no1) ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b '~(' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' Oh yeah, you may be interested ' dc.b ' in knowing I''m currently trying ' dc.b ' to code a game## ' dc.b ' (' dc.b ' (' dc.b ' Don''t wet your pants, it''ll not be ' dc.b ' as big as "Monkey Island", ' dc.b ' as funny as "Utopos", ' dc.b ' as mindblowing as "Dungeon Master"## ' dc.b ' + ' dc.b ' (' dc.b ' (' dc.b ' In fact, I would like to code a remake ' dc.b ' of centipede for up to three player. ' dc.b ' (' dc.b ' (' dc.b ' Of course, if I succeed in making it, ' dc.b ' it will be released as a freeware. ' dc.b ' (' dc.b ' (' dc.b ' The matter is that my exams are ' dc.b ' approching fastly, and that ' dc.b ' I have loads of projects in mind! ' dc.b ' (Enhanced polygone and sphere rout#) ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' So, don''t wait for this game to be ' dc.b ' coming soon, and well, when I see ' dc.b ' how lame I am, I feel like giving ' dc.b ' all my projects up and do nothing ' dc.b ' but slep! ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' While we are at it, it''s late in the ' dc.b 'night (early in the morning?) rigth now,' dc.b ' so don''t bother me if there are no ' dc.b ' hundreds of kilobytes left in the text!' %' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b '~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*' dc.b ' (' dc.b ' (' dc.b ' A funny thing happening is that ' dc.b ' loads of people are saying: ' dc.b ' (' dc.b ' "The Atari ST is dead!" ' dc.b ' (' dc.b ' (' dc.b ' Yep, it''s funny, cos I can''t believe ' dc.b ' people who really like the ST will ' dc.b ' forget such a fantastic machine, ' dc.b ' and for my point of view it''s the ' dc.b ' very best computer. ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' I coded on PC for some weeks. ' dc.b ' My washing machine is more exciting! ' dc.b ' (' dc.b ' (' dc.b ' My brothers owns an Amiga 1200. ' dc.b ' The hardware is fantastic! ' dc.b ' The demos are amazing. ' dc.b ' The workbench is crap. ' dc.b ' Amiga freaks are loving "Fucktros"! ' dc.b ' ( Demos only to piss on someone!) ' dc.b ' (' dc.b ' Definetily, atmosphere is better on ST!' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' So, do not be surprised if there are ' dc.b ' "Fanatics" who will stay on ST! ' dc.b ' (' dc.b ' (' dc.b 'And well,do you remind the Commodore 64?' '' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b '~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' Huum, would like to say that I am ' dc.b ' looking out for all 3.5 Kbytes demos, ' dc.b ' and for all "big" demos# ' dc.b ' (' dc.b ' (' dc.b 'So, if you want to get in touch with me,' dc.b ' for coding, or sending me 3.5K demos, ' dc.b ' here''s my adress: ' dc.b ' (' dc.b ' (' d Ic.b ' (Dracula of PoSiTiViTy) ' dc.b ' (' dc.b ' BROBECKER Alain ' dc.b ' rte de Dardagny ' dc.b ' 01630 CHALLEX ' dc.b ' FRANCE ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' If you want to write to PoSiTiVity: ' &' dc.b ' (' dc.b ' POSITIVITY ' dc.b ' 122 rue Bossuet ' dc.b ' 69006 LYON ' dc.b ' FRANCE ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b '~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' Last thing: If you use my routines ' dc.b ' in a freeware/shareware proggy, ' dc.b ' (Commercial use not allowed of course!)' dc.b 'it would be nice to send me your product' dc.b ' and to credit me! ' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b '~(' dc.b ' (' dc.b ' (' dc.b ' Dracula, on 10 december 1993. ' dc.b ' (' dc.b ' * ' dc.b ' * * ' dc.b ' * MERRY CHRISTMAS * ' dc.b ' * HAPPY NEW YEAR! * ' dc.b ' * * ' dc.b ' * ' dc.b ' (' dc.b ' (' dc.b '~(' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' dc.b ' (' text_end: dc.l *  nb_vbls: dc.w $0 nb_vbls_mod12: dc.w 1 text_pos: dc.l text module: data: INCBIN a:\endpart\stm12.MOD rien: Ds.B 32000 ; Workspace workspc DS.W 1 ;*J Section BSS buffer: ds.w 16 old_res: ds.w 1 old_sync: ds.w 1 old_screen: ds.l 1 old_colors: ds.l 8 screen_ad: ds.l 1 marge: ; Sert a preserver l' integrite du bidule. ds.l 800 screen: ds.l 20 ;*J Section TEXT ;-G; ; Replay STe ; ; by WizzCat the 21st of May 1991 ; ;-G; ; Uses no registers ; ; ; ; Replay is started by calling MUSON in supervisor mode. Returns with ; ; timer A running. Calling MUSOFF will stop music. ; ; ; ; This routine needs some workspace after the module to work properly. ; ; We've set it to 16k, some modules needs more, some need less. If the ; ; workspace is too small, initialization will hang on an ILLEGAL ; ; instruction. Adjust workspace size to fit the specific module. ; ; ; ; MVOL = Main volume (Unnecessary to adjust. $80 default) ; ; FREQ = replay frequency (See below) ; ;-G; MVOL EQU $80 FREQ EQU 2 ; 0=6.259, 1=12.517, 2=25.036 ; 3=50.072 (MegaSTe/TT) IFEQ FREQ PARTS EQU 5-1 # ; 6.259 LEN EQU 25 INC EQU $023BF313 ; 3579546/6125*65536 ELSEIF IFEQ FREQ-1 PARTS EQU 5-1 ; 12.517 LEN EQU 50 INC EQU $011DF989 ; 3579546/12517*65536 ELSEIF IFEQ FREQ-2 PARTS EQU 5-1 ; 25.035 LEN EQU 100 INC EQU $008EFB4E ; 3579546/25035*65536 ELSEIF IFEQ FREQ-3 PARTS EQU 5-1 ; 50.072 LEN EQU 200 INC EQU $00477CEC ; 3579546/50072*65536 ELSEIF FAIL END ENDC ENDC ENDC ENDC ;-4 Interrupts on/off -- muson bsr vol ; Calculate volume tables bsr incrcal ; Calculate tonetables jsr init ; Initialize music jsr prepare ; Prepare samples move #$2700,sr bset #5,$FA07.w bset #5,$FA13.w clr.b $FA19.w move.b #1,$FA1F.w move.b #8,$FA19.w move.l $0134.w,oldtima move.l #stereo,$0134.w move.b #FREQ,$F8921.w ; Frequency lea $F8907.w,a0 move.l #sample1,d0 move.b d0,(a0) lsr.w #8,d0 move.l d0,-5(a0) move.l #sample1+LEN*2,d0 move.b d0,12(a0) lsr.w #8,d0 move.l d0,7(a0) move.b #3,$F8901.w ; Start DMA move #$2300,sr rts musoff move #$2700,sr clr.b $FA19.w ; Stop timers move.l oldtima(pc),$0134.w ; Restore everything bclr #5,$FA07.w bclr #5,$FA13.w clr.b $F8901.w ; Stop DMA move #$2300,sr rts oldtima DC.L 0 ;-9 Volume table -- vol moveq #64,d0 lea vtabend(pc),a0 .ploop move.w #255,d1 .mloop move.w d1,d2 ext.w d2 muls d0,d2 divs #MVOL,d2 ; <- Master volume move.b d2,-(a0) dbra d1,.mloop dbra d0,.ploop rts vtab DS.B 65*256 vtabend ;-6 Increment-table -- incrcal lea stab(pc),a0 move.w #$30,d1 move.w #$039F-$30,d0 move.l #INC,d2 recalc swap d2 moveq #0,d3 move.w d2,d3 divu d1,d3 move.w d3,d4 swap d4 swap d2 move.w d2,d3 divu d1,d3 move.w d3,d4 move.l d4,(a0)+ addq.w #1,d1 dbra d0,recalc rts itab DS.L $30 stab DS.L $03A0-$30 ;-8 DMA interrupt -- stereo sasa move #$2500,sr bclr #5,$FA0F.w movem.l d0-a6,-(sp) move.l samp1(pc),d0 move.l samp2(pc),samp1 move.l d0,samp2 lea $F8907.w,a0 move.l samp1(pc),d0 move.b d0,(a0) lsr.w #8,d0 move.l d0,-5(a0) move.l samp1(pc),d0 add.l #LEN*2,d0 move.b d0,12(a0) lsr.w #8,d0 move.l d0,7(a0) subq.w #1,count bpl.s .nomus move.w #PARTS,count bsr music .nomus lea itab(pc),a5 lea vtab(pc),a3 moveq #0,d0 moveq #0,d4 v1 movea.l wiz2lc(pc),a0 move.w wiz2pos(pc),d0 move.w wiz2frc(pc),d1 move.w aud2per(pc),d7 add.w d7,d7 add.w d7,d7 move.w 0(a5,d7.w),d2 movea.w 2(a5,d7.w),a4 move.w aud2vol(pc),d7 asl.w #8,d7 lea 0(a3,d7.w),a2 movea.l wiz3lc(pc),a1 move.w wiz3pos(pc),d4 move.w wiz3frc(pc),d5 move.w aud3per(pc),d7 add.w d7,d7 add.w d7,d7 move.w 0(a5,d7.w),d6 movea.w 2(a5,d7.w),a5 move.w aud3vol(pc),d7 asl.w #8,d7 lea 0(a3,d7.w),a3 movea.l samp1(pc),a6 moveq #0,d3 REPT LEN add.w a4,d1 addx.w d2,d0 add.w a5,d5 addx.w d6,d4 move.b 0(a0,d0.l),d3 move.b 0(a2,d3.w),d7 move.b 0(a1,d4.l),d3 add.b 0(a3,d3.w),d7 move.w d7,(a6)+ ENDR cmp.l wiz2len(pc),d0 blt.s .ok2 sub.w wiz2rpt(pc),d0 .ok2 move.w d0,wiz2pos move.w d1,wiz2frc cmp.l wiz3len(pc),d4 blt.s .ok3 sub.w wiz3rpt(pc),d4 .ok3 move.w d4,wiz3pos move.w d5,wiz3frc lea itab(pc),a5 lea vtab(pc),a3 moveq #0,d0 moveq #0,d4 v2 movea.l wiz1lc(pc),a0 move.w wiz1pos(pc),d0 move.w wiz1frc(pc),d1 move.w aud1per(pc),d7 add.w d7,d7 add.w d7,d7 move.w 0(a5,d7.w),d2 movea.w 2(a5,d7.w),a4 move.w aud1vol(pc),d7 asl.w #8,d7 lea 0(a3,d7.w),a2 movea.l wiz4lc(pc),a1 move.w wiz4pos(pc),d4 move.w wiz4frc(pc),d5 move.w aud4per(pc),d7 add.w d7,d7 add.w d7,d7 move.w 0(a5,d7.w),d6 movea.w 2(a5,d7.w),a5 move.w aud4vol(pc),d7 asl.w #8,d7 lea 0(a3,d7.w),a3 movea.l samp1(pc),a6 moveq #0,d3 REPT LEN add.w a4,d1 addx.w d2,d0 add.w a5,d5 addx.w d6,d4 move.b 0(a0,d0.l),d3 move.b 0(a2,d3.w),d7 move.b 0(a1,d4.l),d3 add.b 0(a3,d3.w),d7 move.b d7,(a6) addq.w #2,a6 ENDR cmp.l wiz1len(pc),d0 blt.s .ok1 sub.w wiz1rpt(pc),d0 .ok1 move.w d0,wiz1pos move.w d1,wiz1frc cmp.l wiz4len(pc),d4 blt.s .ok4 sub.w wiz4rpt(pc),d4 .ok4 move.w d4,wiz4pos move.w d5,wiz4frc movem.l (sp)+,d0-a6 soso rte ;- ~- Hardware-registers & data -- count DC.W PARTS wiz1lc DC.L sample1 wiz1len DC.L 0 wiz1rpt DC.W 0 wiz1pos DC.W 0 wiz1frc DC.W 0 wiz2lc DC.L sample1 wiz2len DC.L 0 wiz2rpt DC.W 0 wiz2pos DC.W 0 wiz2frc DC.W 0 wiz3lc DC.L sample1 wiz3len DC.L 0 wiz3rpt DC.W 0 wiz3pos DC.W 0 wiz3frc DC.W 0 wiz4lc DC.L sample1 wiz4len DC.L 0 wiz4rpt DC.W 0 wiz4pos DC.W 0 wiz4frc DC.W 0 aud1lc DC.L dummy aud1len DC.W 0 aud1per DC.W 0 aud1vol DC.W 0 DS.W 3 aud2lc DC.L dummy aud2len DC.W 0 aud2per DC.W 0 aud2vol DC.W 0 DS.W 3 aud3lc DC.L dummy aud3len DC.W 0 aud3per DC.W 0 aud3vol DC.W 0 DS.W 3 aud4lc DC.L dummy aud4len DC.W 0 aud4per DC.W 0 aud4vol DC.W 0 dmactrl DC.W 0 dummy DC.L 0 samp1 DC.L sample1 samp2 DC.L sample2 sample1 DS.W LEN sample2 DS.W LEN ;=9 EMULATOR END == prepare lea workspc,a6 movea.l samplestarts(pc),a0 movea.l end_of_samples(pc),a1 tostack move.w -(a1),-(a6) cmpa.l a0,a1 ; Move all samples to stack bgt.s tostack lea samplestarts(pc),a2 lea data(pc),a1 ; Module movea.l (a2),a0 ; Start of samples movea.l a0,a5 ; Save samplestart in a5 moveq #30,d7 roop move.l a0,(a2)+ ; Sampleposition tst.w $2A(a1) beq.s samplok ; Len=0 -> no sample tst.w $2E(a1) ; Test repstrt bne.s repne ; Jump if not zero repeq move.w $2A(a1),d0 ; Length of sample move.w d0,d4 subq.w #1,d0 movea.l a0,a4 fromstk move.w (a6)+,(a0)+ ; Move all samples back from stack dbra d0,fromstk bra.s rep repne move.w $2E(a1),d0 move.w d0,d4 subq.w #1,d0 movea.l a6,a4 get1st move.w (a4)+,(a0)+ ; Fetch first part dbra d0,get1st adda.w $2A(a1),a6 ; Move a6 to next sample adda.w $2A(a1),a6 rep movea.l a0,a5 moveq #0,d1 toosmal movea.l a4,a3 move.w $30(a1),d0 subq.w #1,d0 moverep move.w (a3)+,(a0)+ ; Repeatsample addq.w #2,d1 dbra d0,moverep cmp.w #320,d1 ; Must be > 320 blt.s toosmal move.w #320/2-1,d2 last320 move.w (a5)+,(a0)+ ; Safety 320 bytes dbra d2,last320 done add.w d4,d4 move.w d4,$2A(a1) ; length move.w d1,$30(a1) ; Replen clr.w $2E(a1) samplok lea $1E(a1),a1 dbra d7,roop cmp.l #workspc,a0 bgt.s .nospac rts .nospac illegal end_of_samples DC.L 0 ;-6 Main replayrout -- init lea data(pc),a0 lea $03B8(a0),a1 moveq #$7F,d0 moveq #0,d1 loop move.l d1,d2 subq.w #1,d0 lop2 move.b (a1)+,d1 cmp.b d2,d1 bgt.s loop dbra d0,lop2 addq.b #1,d2 lea samplestarts(pc),a1 asl.l #8,d2 asl.l #2,d2 add.l #$043C,d2 add.l a0,d2 movea.l d2,a2 moveq #$1E,d0 lop3 clr.l (a2) move.l a2,(a1)+ moveq #0,d1 move.w 42(a0),d1 add.l d1,d1 adda.l d1,a2 adda.l #$1E,a0 dbra d0,lop3 move.l a2,end_of_samples ; rts music lea data(pc),a0 addq.w #$01,counter move.w counter(pc),d0 cmp.w speed(pc),d0 blt.s nonew clr.w counter bra getnew nonew lea voice1(pc),a4 lea aud1lc(pc),a3 bsr checkcom lea voice2(pc),a4 lea aud2lc(pc),a3 bsr checkcom lea voice3(pc),a4 lea aud3lc(pc),a3 bsr checkcom lea voice4(pc),a4 lea aud4lc(pc),a3 bsr checkcom bra endr arpeggio moveq #0,d0 move.w counter(pc),d0 divs #$03,d0 swap d0 tst.w d0 beq.s arp2 cmp.w #$02,d0 beq.s arp1 moveq #0,d0 move.b $03(a4),d0 lsr.b #4,d0 bra.s arp3 arp1 moveq #0,d0 move.b $03(a4),d0 and.b #$0F,d0 bra.s arp3 arp2 move.w $10(a4),d2 bra.s arp4 arp3 add.w d0,d0 moveq #0,d1 move.w $10(a4),d1 lea periods(pc),a0 moveq #$24,d4 arploop move.w 0(a0,d0.w),d2 cmp.w (a0),d1 bge.s arp4 addq.l #2,a0 dbra d4,arploop rts arp4 move.w d2,$06(a3) rts getnew lea data+$043C(pc),a0 lea -$043C+$0C(a0),a2 lea -$043C+$03B8(a0),a1 moveq #0,d0 move.l d0,d1 move.b songpos(pc),d0 move.b 0(a1,d0.w),d1 asl.l #8,d1 asl.l #2,d1 add.w pattpos(pc),d1 clr.w dmacon lea aud1lc(pc),a3 lea voice1(pc),a4 bsr.s playvoice lea aud2lc(pc),a3 lea voice2(pc),a4 bsr.s playvoice lea aud3lc(pc),a3 lea voice3(pc),a4 bsr.s playvoice lea aud4lc(pc),a3 lea voice4(pc),a4 bsr.s playvoice bra setdma playvoice move.l 0(a0,d1.l),(a4) addq.l #4,d1 moveq #0,d2 move.b $02(a4),d2 and.b #$F0,d2 lsr.b #4,d2 move.b (a4),d0 and.b #$F0,d0 or.b d0,d2 tst.b d2 beq.s setregs moveq #0,d3 lea samplestarts(pc),a1 move.l d2,d4 subq.l #$01,d2 asl.l #2,d2 mulu #$1E,d4 move.l 0(a1,d2.l),$04(a4)  move.w 0(a2,d4.l),$08(a4) move.w $02(a2,d4.l),$12(a4) move.w $04(a2,d4.l),d3 tst.w d3 beq.s noloop move.l $04(a4),d2 add.w d3,d3 add.l d3,d2 move.l d2,$0A(a4) move.w $04(a2,d4.l),d0 add.w $06(a2,d4.l),d0 move.w d0,8(a4) move.w $06(a2,d4.l),$0E(a4) move.w $12(a4),$08(a3) bra.s setregs noloop move.l $04(a4),d2 add.l d3,d2 move.l d2,$0A(a4) move.w $06(a2,d4.l),$0E(a4) move.w $12(a4),$08(a3) setregs move.w (a4),d0 and.w #$0FFF,d0 beq checkcom2 move.b $02(a4),d0 and.b #$0F,d0 cmp.b #$03,d0 bne.s setperiod bsr setmyport bra checkcom2 setperiod move.w (a4),$10(a4) andi.w #$0FFF,$10(a4) move.w $14(a4),d0 move.w d0,dmactrl clr.b $1B(a4) move.l $04(a4),(a3) move.w $08(a4),$04(a3) move.w $10(a4),d0 and.w #$0FFF,d0 move.w d0,$06(a3) move.w $14(a4),d0 or.w d0,dmacon bra checkcom2 setdma move.w dmacon(pc),d0 btst #0,d0 ;- beq.s wz_nch1 ; move.l aud1lc(pc),wiz1lc ; moveq #0,d1 ; moveq #0,d2 ; move.w aud1len(pc),d1 ; move.w voice1+$0E(pc),d2 ; add.l d2,d1 ; move.l d1,wiz1len ; move.w d2,wiz1rpt ; clr.w wiz1pos ; wz_nch1 btst #1,d0 ; beq.s wz_nch2 ; move.l aud2lc(pc),wiz2lc ; moveq #0,d1 ; moveq #0,d2 ; move.w aud2len(pc),d1 ; move.w voice2+$0E(pc),d2 ; add.l d2,d1 ; move.l d1,wiz2len ; move.w d2,wiz2rpt ; clr.w wiz2pos ; wz_nch2 btst #2,d0 ; beq.s wz_nch3 ; move.l aud3lc(pc),wiz3lc ; moveq #0,d1 ; moveq #0,d2 ; move.w aud3len(pc),d1 ; move.w voice3+$0E(pc),d2 ; add.l d2,d1 ; move.l d1,wiz3len ; move.w d2,wiz3rpt ; clr.w wiz3pos ; wz_nch3 btst #3,d0 ; beq.s wz_nch4 ; move.l aud4lc(pc),wiz4lc ; moveq #0,d1 ; moveq #0,d2 ; move.w aud4len(pc),d1 ; move.w voice4+$0E(pc),d2 ; add.l d2,d1 ; move.l d1,wiz4len ; move.w d2,wiz4rpt ; clr.w wiz4pos ;- wz_nch4 addi.w #$10,pattpos cmpi.w #$0400,pattpos bne.s endr nex clr.w pattpos clr.b break addq.b #1,songpos andi.b #$7F,songpos move.b songpos(pc),d1 cmp.b data+$03B6(pc),d1 bne.s endr move.b data+$03B7(pc),songpos endr: tst.b break bne.s nex rts setmyport move.w (a4),d2 and.w #$0FFF,d2 move.w d2,$18(a4) move.w $10(a4),d0 clr.b $16(a4) cmp.w d0,d2 beq.s clrport bge.s rt move.b #$01,$16(a4) rts clrport clr.w $18(a4) rt rts myport move.b $03(a4),d0 beq.s myslide move.b d0,$17(a4) clr.b $03(a4) myslide tst.w $18(a4) beq.s rt moveq #0,d0 move.b $17(a4),d0 tst.b $16(a4) bne.s mysub add.w d0,$10(a4) move.w $18(a4),d0 cmp.w $10(a4),d0 bgt.s myok move.w $18(a4),$10(a4) clr.w $18(a4) myok move.w $10(a4),$06(a3) rts mysub sub.w d0,$10(a4) move.w $18(a4),d0 cmp.w $10(a4),d0 blt.s myok move.w $18(a4),$10(a4) clr.w $18(a4) move.w $10(a4),$06(a3) rts vib move.b $03(a4),d0 beq.s vi move.b d0,$1A(a4) vi move.b $1B(a4),d0 lea sin(pc),a1 lsr.w #$02,d0 and.w #$1F,d0 moveq #0,d2 move.b 0(a1,d0.w),d2 move.b $1A(a4),d0 and.w #$0F,d0 mulu d0,d2 lsr.w #$06,d2 move.w $10(a4),d0 tst.b $1B(a4) bmi.s vibmin add.w d2,d0 bra.s vib2 vibmin sub.w d2,d0 vib2 move.w d0,$06(a3) move.b $1A(a4),d0 lsr.w #$02,d0 and.w #$3C,d0 add.b d0,$1B(a4) rts nop: move.w $10(a4),$06(a3) rts checkcom move.w $02(a4),d0 and.w #$0FFF,d0 beq.s nop move.b $02(a4),d0 and.b #$0F,d0 tst.b d0 beq arpeggio cmp.b #$01,d0 beq.s portup cmp.b #$02,d0 beq portdown cmp.b #$03,d0 beq myport cmp.b #$04,d0 beq vib cmp.b #$05,d0 beq port_toneslide cmp.b #$06,d0 beq vib_toneslide move.w $10(a4),$06(a3) cmp.b #$0A,d0 beq.s volslide rts volslide moveq #0,d0 move.b $03(a4),d0 lsr.b #4,d0 tst.b d0 beq.s voldown add.w d0,$12(a4) cmpi.w #$40,$12(a4) bmi.s vol2 move.w #$40,$12(a4) vol2 move.w $12(a4),$08(a3) rts voldown moveq #0,d0 move.b $03(a4),d0 and.b #$0F,d0 sub.w d0,$12(a4) bpl.s vol3 clr.w $12(a4) vol3 move.w $12(a4),$08(a3) rts portup moveq #0,d0 move.b $03(a4),d0 sub.w d0,$10(a4) move.w $10(a4),d0 and.w #$0FFF,d0 cmp.w #$71,d0 bpl.s por2 andi.w #$F000,$10(a4) ori.w #$71,$10(a4) por2 move.w $10(a4),d0 and.w #$0FFF,d0 move.w d0,$06(a3) rts port_toneslide bsr myslide bra.s volslide vib_toneslide bsr vi bra.s volslide portdown clr.w d0 move.b $03(a4),d0 add.w d0,$10(a4) move.w $10(a4),d0 and.w #$0FFF,d0 cmp.w #$0358,d0 bmi.s por3 andi.w #$F000,$10(a4) ori.w #$0358,$10(a4) por3 move.w $10(a4 ),d0 and.w #$0FFF,d0 move.w d0,$06(a3) rts checkcom2 move.b $02(a4),d0 and.b #$0F,d0 cmp.b #$0D,d0 beq.s pattbreak cmp.b #$0B,d0 beq.s posjmp cmp.b #$0C,d0 beq.s setvol cmp.b #$0F,d0 beq.s setspeed rts pattbreak st break rts posjmp move.b $03(a4),d0 subq.b #$01,d0 move.b d0,songpos st break rts setvol moveq #0,d0 move.b $03(a4),d0 cmp.w #$40,d0 ble.s vol4 move.b #$40,$03(a4) vol4 move.b $03(a4),$09(a3) move.b $03(a4),$13(a4) rts setspeed cmpi.b #$1F,$03(a4) ble.s sets move.b #$1F,$03(a4) sets move.b $03(a4),d0 beq.s rts2 move.w d0,speed clr.w counter rts2 rts sin DC.B $00,$18,$31,$4A,$61,$78,$8D,$A1,$B4,$C5,$D4,$E0,$EB,$F4,$FA,$FD DC.B $FF,$FD,$FA,$F4,$EB,$E0,$D4,$C5,$B4,$A1,$8D,$78,$61,$4A,$31,$18 periods DC.W $0358,$0328,$02FA,$02D0,$02A6,$0280,$025C,$023A,$021A,$01FC,$01E0 DC.W $01C5,$01AC,$0194,$017D,$0168,$0153,$0140,$012E,$011D,$010D,$FE DC.W $F0,$E2,$D6,$CA,$BE,$B4,$AA,$A0,$97,$8F,$87 DC.W $7F,$78,$71,$00,$00 speed DC.W $06 counter DC.W $00 songpos DC.B $00 break DC.B $00 pattpos DC.W $00 dmacon DC.W $00 samplestarts DS.L $1F voice1 DS.W 10 DC.W $01 DS.W 3 voice2 DS.W 10 DC.W $02 DS.W 3 voice3 DS.W 10 DC.W $04 DS.W 3 voice4 DS.W 10 DC.W $08 DS.W 3 stmixes12 ST-09:today_bd.spl @ST-09:today_sd.spl@ST-07:funkbass.splp@greatvibes 2lotine81z1 !@mlotine81z2 @ST-02:deepstrgingj@[ST-07:funkbas2.spl@ST-01:hooman 8ST-02:hihat h@$   \M.K.0@`0L 0@@0@` L0@ @ 0 0@ 0 0 @Px00 L 0@@0@P L00L  L L 0@ @0@` 0L 0@@0@` @0L @0.@ 0@`0L 0 @@0 @` L00 L0 L  L 0  L0 `0 0*0`0 h 0 0@ 0 0Px00 0!@0P0 .@0h@ .@0`.L0h@ 0hL%0`0 h0@ 0 0`0 0@0@` 00@   @ 0 0`0 0*0`0 @ 0 00@0Px00 0*0P0h@ .@0h@ 0.@` 0.L 0!@0`0 ֐ 0 0֐`0 0h@hL0.@` .L0h@ .@ 0 @0`0 0*0`0 h 0 0 0 0@Px00 0!h0@P0 @  @ 0.@ h@0.@` 0.L h@ 0hL0`0 h 0 0 0 @`0 0@0@` 0@  00`0 0*0`0 @ 0 00@0Px00 0!h0@P0 @@ 0 @ @0 @` 0 L  0 L@0`0   0 0@`0 0!h0@`0   0 0@`0L 0@@0@` L0@ @ 0 0@ 0 0 @Px00 L 0@@0@P L00L  L L 0@ @0@` 0L 0@@0@` @0L @0.@ 0 @`0 L 0.@h@0.@` hL00.L0 hL  .L  0 hL0`0 0*0`0  0 00@0Px00 0!@0P0 Y  00` 0 0*0`0   0`2h`2@`2P20`0 0*0`0  0 00@0Px00 0!@0P0   00` 0 0!@0`0 0 0@`0 0&0@`0 @  0 0@0 L 0@@0@ L0@ @ 0 0@ 0 0 @x00  L 0@@0@ 0L00 L  LL LL0@ @0@ 0 L 0@@0@@0 L @0.@ 0 @0  L 0.@h@0.@ 0hL00 0.L0 hL .L 0  hL0@p0L 0@@p0@L0@ @p0 0@ 0 0 @px00 L 0@@p0@L00L  Lp L 0@ @0@p 0L 0@@p0@@0L @p0.@ 0@p0L 0 @@p0 @L00 L0 L p  L 0  L 0pp0 0&p0*0 p0 00 0hppx00 0&p0*0 p0 0pp 0 0&p0*0 p0 0@pp0 0&p0*0 g p 0 @ppL @@p@L @ @p@  @}pp L @@p@L0 L  LpL @ @ @hppL @@p@@ L @p.@@ppL  @@p @@p L0  L0 L p  L   L `pp. *p` p/ P}pp. *pP p" `hpp. *p` p2`pp. *p`@p p  @`L @@@  `L  @@@ @P L @@@  PL0 0 L LL LL @@ @`L @@@  `@L  @.@@` L  @@  @  `L0 0 L0 0 L  L L   / @p`L @@@  `L  @@@ @}pP L @@@  PL0 0 L L L LL @@ @hp`L @@@  `@L  @.@@p` L  @@  @ @p`L0 0 L0 0,@L ,0 L ,@ ,0L 0p`0 0*0`0 0 0 0 0}pPx00 0*0P0 "0 0hp` 0 0*0`0 !0 0p`0 0*0@p`0  0 0pp0 0&p0*0 p0 00 0}ppx00 0&p0*0 p0 0hpp 0 0&p0*0 p0 0pp0 0&p0p0  0 0 0   0p`0 0*0`0 0 0 0 0}pPx00 0*0P0 "0 0hp` 0 0*0`0 !0 0p`0 0.0 @p`  @p`   0֐`0 0֐0`0 0 0 0֐0Px00֐ 0֐0P0 "0 0` 0 0֐0֐`0 !0`2֐`2֐`2eP20֐`0 0֐0`0 0 0 0֐0Px00֐ 0֐0P0 "0 0` 0 0֐0֐`0 !0 0֐`0 0֐0` 0  0 0:p`0 0*0`0 p 0 00 0pPx00 0!}p0P0 "0 0:p` 0 0*0`0 p0 0p`0 0}p&0p`0 p 0 :p`. .` 5  0 %   P    .P .  `. .` > `. .`   5 50 0% %     0`0 0*0`0 0 00 0Px00 0*0P0 !0 0` 0 0*0`0 !00 0`0 0*0`0   0        #  %, (/\׀MMףK9vPd';9;' vdn gP(9d'0%9Yb׬bP/0 CT;—%Y%ݸ€ Ṱɹ״ͨ #' /;/@5;'%9@C`Y@CXoijoU^UbltYbxlv|xrjnigonegxTgzYKX\UG=MFXR,C@%-͹1 #5./?C>HXSjklfgzu~Exz}mPXYI;311,  ׹ǵ<Ͽ %)%32>H8AZZZ\`efustu{~;z{`kieeP?QIA500* Ͽ¼0   ?, /@=;?@CKMS\[\[`lv{zou|4~smvtvmdPKRRI?HB2/?2'µ º  %'%/3529;?HURTZ[Zaefnnnttv}z|~3}{}~unrnrj^ieYPSTHKPIF@>351' () ¸     %1;63?@BFRPRWUW^`\gkmgnv}~;~|tv{v{lrribjejfbYR\`WWPLPC26I51/.'/'! ϼǸ2Ƚ *1319;;6CIFPUUSUabY```nkgrv{os|r|7|z~truknrnjki^\Zd[UPLS[TDABBB>>601/,**) ͼǾ¾  )'31/3?BB?@CMMLHSWPLXZaZW\^\bkf[bglrmsrmmr|}t{~~}-}~{v~|uvstxrmnjkkjea`[ZWXUSMTWRDBC?C@682,,/,#   ɼ !#%.2/2=;6=AFHIIISUQTZZX\bdiegovsnrxu||9~xssrmrrieaf^Z`YMSTPIMG=AC;/..,/.! úº         !%#*'!/.*-/-/.3>839>AFB@BGFHRTPHLQRU[ZX\\bfidbjsomjjt|zor|{v{~|{{uv}zxx~|zz{{xssurooomiijdaaa^YZ[TLSXTLFBACA?=500)(*' þ&  ),*,.1126>?;?AFHIHMTUQU[ZUWae^^abgkieglmnnmlrusonusmnv}xmnststusmmruolmonfksmdbjkkkd\bfd^\[Z\^WRWXSPMQKFHHDHLD88CF@;6339500/,,*,*' !!%'  !           ½¹¿þ    ''%'! #'%*-'!*1,'(--/00-,-.35//1200350/38512656962233;;528926>;8535===;955@@86>?98BB=9>=69>=62689=81253330/320///-..--)'(*,#!(' !!           !!%*)!%*...0211256999>?=>BDBBFFCIMGGLMLMPQQSSPQTTUSRSTUWUTTUUTXYWUUXYXWUX[YWWXYUTUXWTTUUUSRRSRQPSQKKPPKGHIGGFBBA@>@>;8536550--.--)#! !    !# #((%'((*-,*,./..11-/2102113226;5039;86556;988655889885358985522682250/252//0/120.*-0-(())*,)('' %)' #!!!        ! !#% ''#%%##%#!!! !!!                                                                                  '           ǀrn`ǀ3n3rn ^[n^B[>S^[QrZ3r3lBJԀǀۀ䀶͸'?3%^%DnS3j7Q>3Y`93nSQr87B`n7Լ䌥ǀ'Q^tQ,`nˣ쀥ش䜺׾Ԁ37%DBDJ37H^^r3Z|gnr%J!L7Z>Q3 nrPDl7S.Ԁϸ^UdlSFD>)B^^SǙQ7nnQ^>37n7]Y''#73SnrBS),\򀀥^r^DQSBrH]r%',73S^^rS'%S7 3DQ،g3%S7QwBr37f7'B3`3Dn73QrZS'3DQr?dQ[3>\7',%z7Q%737H7%ԀŒ7rBYBrBLr3Qj>^Y7rnS^'Ǡ%r'3D^`,wǀ%ԛ%[Z7(7; Sԏr^Se7(,8 H3rtB-nr'^7%n373DH?QH(3)73;\7Fǀ񚀉ӧǥԣ%J7 ,8B;S^?r^HDHl8Z^rZQ7'BG%7[%(䀠䫜񚉧]9nz>)1^Q7.nSH>Q7Q' nSQ[;D%B737Z7%'7ǀ-ǀ蚉߀ǀˢԏ%-P ,D%%P3S.-;YSBnDZr3w,DBP-J'SԤ)n[,LwHSԖ';DZ䌉%Qe1.BZ7^Br>^e %sYFQr\B|Hr37r۔%%7'9nr! .BӭB'3'3j[Q?3#%Lg3-SF39nrD1ng`73S%]DίH譁`θǗ3S-.g@-QsS((^r-B]>%'f>QYYvr[B%D,wf7^7 ǹԌ ^D( HrL`^[}Dv7,vSY-%7 ^ZFU7Br )3Sn7B  ,茀873r%,ZY- Υ[B7)ǰ,7 Q73'%UB>n[ ^7%9tn73' -۸ ^rH'!? %P?ر73e)!>3S7B>37)Bn'S7ζ3w9@?7%819B%7,¸3D?717[nSS.fJ!nSBz`Gnr`'Q`BS'򀀀Ӻ͹,YSQ> Lr@3\SQYrB7G?'B买 ,7Q73[,G3d@Gdž B8B>3|]733#%ԭǫؚ!3fY3`B8frD %n(1Ϲ3Y  Q737j7?,7'.')L@H>1))9,.Ǽ 3d`Bnt,e>n'BL%7˺,e7%t3[Q>nSB]7!ΰ΀Ǥ%,QS,e-^@fYnw}r}r)\>;Q7G71ԏǼΣۚº ?3nrZ73U7B|?G;8'Hrrn'QD%%3G>-谥,)8B7 3[ضǙؾ3J]S^`|D9'HFHZ%>;ZS,7%?(#θ, ,'`f77.nS,^w>nr@S'!B>.Q΀ԯ%^,,'Q!'773QBnSLg>^gLDL^S73H#?Y1%g.),G%>΁ǙԚ%Qr>%Lef7^7, 3?B@D%3F7!!d7,J1P73D9DFԸ!#?9!-(3}7 3?J'D' %D3-,j'-'7 3J>Ƕ-%^S%@Q>%)%'L7ǯ%.,HJ>@%DB'?QD丠%-,B@!# @n73J3J?%G  Qw7Lv>-.9.)7#3>QeY^]?;nr7,B,GS7 77ǖ%>'یԼ1Դ%%wZ9H`J'HGFGU3 93[>3,}|t7!B]-37(BY' B7ΰB'ۼ,f>L'7QD %?SHS%;3DQ`,>9?}[@-;97 H7 %JF 'ǯԼ踍ǧ)B7 %P)?nDQS%e|[^[][gnSH73L>%%>ζBJ.D,.731F91%#3D.>Ltww[DQ[>-Bn7)ǯ%- 3)'%%(;-3()Q7%}`)B83r?J@,D) QD,F37B'3δǴ ; 3`.131!%# 3Fn>,#,QD)FGF)%#.%F 'Q7',%9?>,J-)BD^[(81Pn`^SP7P73^r9#G'37##.)!#1]gLHBQDGHD(,,3-.?He`>.7 (>',jrD>%Q@;F-( 'S!%^7- B' F,FJ',]7%'(BJ' [9)B739.3%@7',Z7 @( H>('3\fF('!37%B@(#%> >D,.' 37F7BY@39.@.8  ?7%;. -BJBD'%B>F@;@?D?PL^dD>1 )H)%9!-#.-??,B[971,%31B7 ,93.)!,^'#,'B'%,%#,#!ۼ,;- '(7-'#-,%D' ;7BZ7!LG8)#-3-% Z7)!%@7#9'8.3P8 9BQ7J( P7!!'!' %  %'3;') !!3-!)) 37>'3' )  (-F#-(#''3'! .#% 3Z'# !%(G7 8'!-'37 ! ! 1731(7''.7%.@7BG!   %'!%';P7%?- %.7'.7,%%-37! !%-#    !.9'3),7BY# 1')3> %%!?F- ! ) Ҿ   %8#)!;-,3H>'(# !F% ,BS>#9',.% #!73D!#%) ,73- #3'1' (!%)-- .'   % ')%).H>#.;@@%;?(,H7!3!^J37%-#- )!(98H73';7%-#,88',H7!?(  -!!.' #  (! .%.' (1-'  ,)  )%(.( !,''(%#,(.?-! 1'!'!! #3'  #39)%)31!!1)   %(.!! # (-(!1# (# ,(!(-%!  !   ('!!,-   ,# ' '!    u#(%!(!##!         !%,7,-(           %#           !!               #                !%(!      !%#                                                                                                                                                                                                                                                                                                                                                                                                                                                  (' 7J[iv wrf]UJ?3(ϼ-! 2Ygij|jr|^U`ssZ]ttYFRe`LBLL23S[LBFPQG9;GJ@5) ˾°!!'!#,9HH?9;DQZO@?FP[S>5BJJGB1() #8?1)>LD99@JSQ?3;UjgYYljdgls}s|q]gqgZQS]^SHL[ed\`if[ZYQPZdfegngRJ^tlUJR[YOLSQD>95, #)  % ')!)H[SFFQSH>@LSY[^^]\\[RHDD@>;@@83;JOGGYfeUJJR\dglnjls|}|}w||wwwvqeYQQROB533- )98-%.>B?977>?2!)3. %%  ##%%)5?D@85>GJFBDHOPLJHFB?>7-((-.)! ¹ #5>>@L[^[U[elnqrne]]e`SHLY\SD3,))!  !!!   #'(,28;879?FHHHJPU[YOD@@?;88;92%,,)-7@HJHJS]`[PHJOOLHD@>997.   ###)3>B@@DLSSQOQU\^dgjljf^YUYZ[ZRJD@92)#Ǿ %-8BFD??BB;7557731331'  !#(-.,%  #'(,17;@GJOQRQOOR[fnnid`ee^ZY\d`YJB?>93.(! !)29@DGHJLOOGB@DHOPLB81-(!   #'((()(%  (599315>?>?JU\][SPOQUUUSQOJF?831-)# '-29DORRPLJLLHGJF>;@>3-.1-!   !!!'))'! %'',1.,)).5;@GLQSUUSUSPLJGB@>831,# #,28;>>;?@BDDB@@?@DFFD>5-%      #%'(),-27;?@DHJJLOOLLLOLJGD@@@?;72231,%  !%(,--..,)(()),,--..1221-)'#  !#!!!!!!###!!  !#'(('%''(),--,)(('%'()('%##!#!!                                                                                                                        $            ÊҘ0 (kyzwmoB(>6Sc<-𻴏ş Ubvq[N+'BB&&д 1IMiS?<%9.̲Ļ  7?MhI9. "@*ĻĽ6BX`>9) 9$Ƽ6;S[?7  )6ּ 8BYS9337ӻ >I]N:13.̹ɹ 7H`Q?2!6+ ɻŹ .>OZE8'!*9* ſ¸1>TY@8$+8%Ӿ0@US=6!19#ڿ2FXR,!*71$̷!6JVH9'$-80 ʹ (=ORB5$"(28-Ƶ (=NPB4"!&16*°-BRN>2#")56*2FSN>-#,75)ϻ4GTN<*$.;6$˸!7IRF8'&192" ƶ!;OPC5$"(38/ ƴ (>MN@2##,69-*?NL?2$$.;9,־-FRM<+&/96)м1FQH9( '1;7%̻5GNE7% *4:4# ȳ!;LM@3"#,7;2! ų $=LK>1#%.7:/į)>KK>, '1;:-վ-CMG:+!(2=:*м/DKD6(!+4<7&ʸ6FLC5&#-7=6# Ǵ 7HJ>1#$.8<4! IJ#;IJ>/#!'1<<0­%;+μ0CJC5'"-8>:(˵0@D>3&!$.8>:% ȳ5EF=/#!'2;0&$.64(ν +2/%%*' $'!   к")37;4 д?gp`0    /?E@1%'-("Ȱ/=>=, /?ORL0F@ 䲥#//-( /4& -=D4 ¼+/0,..$شEMD0 780   #  ?We`8'(д'GP@  )/, %-$Ȩ/70 "+?@( #3(Ⱥ+,Ĭ %,%?H8!  +C@ 丯#5?LSPB0¶.1(  # %/6 5E8Ĵ$ฦ-00*$$!$# ?@ #&'&'"!¶?J8/4(""  /?@ +?[aP4  ij75  &/55. 7D0 %&$ȸ36 '72   7GB(  78"'(% %( /S\Hศ #5:0 '*   ĺ'GD( 'GRJ4 !#%  /KUL4"%*'  '7EHF<$ %!%  ظ +GcbH İ3,  +FWR8 ;OP@+1$ȹ #3?OUH  'GJ0  &'/9><0 /4(  *, ';?8  %-, /6(   OgT ഩ+7?@8("'2(  ?_m`@!Ƚ '&   'KaZ@ /WdT0"  ##/K_aJ( '/  '50 #-0, 7GF0 ȸ!+3,    "  /CH8  ' /80  'Kb`@  '*+)" '-) ?SP8% '  7MJ8 7Wj`@%68(   7C<(';O[P0     ?ND$м ';O^T4 /70!  7>0  ?F0+11)+50 %9:(   20*12,   '?_dH ?OP:  -,  +KejX0  -:<,;Wmp`8    %(" /9?=0 *+$ &% '.".*  +" '/42,$)& %5;4$?HD6$ %/,    !$?SP@ ;@2 #.79, ?[jdP0    +350( +G_fP$  '3?@0   /-    #*,,+($  '40 ';E@(/0(#)(    %--"7:, /?B4  ;KPD2   #/-  '+-.-,+-5?FE:( )7GTQ@( # ',"   #&! "&)*(" +;@8  '--( !'-230(/?H@(#35,   .3,     *& " %-5?KSTH0 '?OYTB0 "'" ! )/1-"+?B2 ## "  '32$¾  +7??:0  +7=?=92(   /?@0"    %!       /?O_`R87GLH<,    '/31( &17:6-!'+(  '382"    " &3;?@<4) -5:<<:62.)%$$# #% +.& %(("   $'(&! &.( 3GQRH8$#/1,$ $+2550$ ;D<( '.10-+,164(/=B>4( "%  %,02210*" '-59;<<?>8,  $   /770$    /;EJKF=0  #  +:ED8"&"+;CB=60*%         ##    #-5:>BIOPH4    &.3640% #($'5?FKJF<0  #%    % /?LRRNE<0"ʺ   /;<4( $% /:>>=;:852,"  ,(     #)2;GNNH9(    "##"! # +7?GHD:0"   '7BGHD@81*" ̸     "*.258;<=<82*       ',(  +9?B>4)      ""'1794,$"''      %''#*14431.,($     )130% %)/48::72*     !%# '130& '031,&   Ƚ#)(    !%$ %%   !')*&   "##"  !"  %-22-$ $*/00,(  '-*" %)**($!$%$"! !!     #'&!          ""       !   !"   ""   "#%%%$"         #'*)$        !&(&"          "%''&$" ȸ      !%),-+'         %)**(%!             !$%%$#! !!         %+--,(#       "'*+*(&# ĸ       "#         !#$$        !'+-,*% ȼ         #)+,*(%          #"       !%')&       !&**)&#     #'+,+(#        "  !!!    !"   "'+-*       !#$#"! !#"    #%    #%  (*''"  '/0*  !$##    !'14668400( ÿ'0. #(  /93$   '/6?S]cd`D(ʸȮ+4;('50+, %5:8$!!  Ŀ+;8  ?JTWRMD2(Ȱ'- 9B4#/:4   "+1* "%&!!!$'-&   -50Ĩ   ?MPF:0*,01-  #(%  00 +?B@*  %3;=<=?ISP@ȸ %7=0--*$   #" +6ENQH8" "$   ).$ #%    #+59=>8* и  "$-( "&(&    #3=?=80"Ÿ '1(#/872$/1$ %,$   .32( /=8 ¿-63$   " Ⱥ?J@ 1=CD@80 %.*      +?O]XD0  '+ ## )+ %,10""#"! # +,& ! *$  "' '9<0   *670   '9<4$ ("'9CFB8$  &,$      &,(#*+( ?URD0     '?E8   $%" '/*        +K]XD(    %52" ';DB:2,$  +30 %+,!/70 '1, #"   ',*"-;<4(   />>4  #;C<*%3?MNH:)  #)   %   3;6(    37,  /?GD:0$;HD0 '?Wd`P47IPJ<(  /2*  ;C@(!  '=G@0;D@5( %7??6*!$#274(  +;@8$ ';JPND4$'/*  +9<0   '(   260$;MRH8 #/780 '-,$'3*'/43,$%296,  -3, &,1674* ($ '78,  %,( .54, 7GF4  /42,#  '9GOI8   %,-*   +9>;4( $"  %7CMOJ@,'/, #$!/GQRJ@*&  '?IF8 !$" +?GB8$ '+&  "%!   '7EJJD8( /O_aP8        /KYZRF8)  '.( !   ȼ+K_bP4 &-0-&   )+(!   392"     "" /OgndP0!&'" #(% 7OWTD0! '+,& #+1441,$ /?HH<*  +=A>2"'?_orhP8'350% +9?@8*  '3;8,%*+)$/?@6"'/22.(!   +780 7GMJ@4( #3;:2$  '13,Ƚ5CE:(2?EIGA8,   /=@8$ 5?F@5&   +41& 3?E@0   #$$!#.7>9, '3;90 ;GIB8(ƺ&)&"$   #%  '3:<92( ¼!" "" %3?GIB4 )/0*"#-/*   3?LOLD8,   "%&&"     %-0.*"#-.*!  +682(      '/5762*      %'% '-.*" %1650)"    !'(&   +7=90 %,.,%    ',+$ #&# %+/0,& "%&%" 3?>2"      %3<<6)  "   #+2562,$'10(    '*)$ /?GF@0    #(("  /770" !&()'"  !&((&$! $$    '*("     %'"  )*$  !##!   #!    !##   "&*,-+("#%#  !$  !$$#   %&               %-11.*$Ⱥ     %&"  "%$"  &-00-(# ĸ!!!    '.0,&  #)+*'$ '-/,(    &)'"   "&'&!'($      #$"ĺ  #%%"    !  #')'" "%'(()*+,-+(# ½$%#    #&%!              #"        #$    !&)*)'%"!        #),..,*($!                  !%())('&$#  »     #'('"        %''%"          Ž      ###"         #&((&#       #$$           BjocUC4)".4-"  CjkaS@0&&22+ Nkj]N>0$(42)Qjh\L;-"!+40(!QhfZI7+!$.4.$ !QfcVG7)!&24-" $QfcUE4(!!)44-" (QfaUB2(!$-54++QdaSB2&!&274)-Ud_P>0&")472).Uc]N<.&$-570& 2Vc\L;-&(2970$ 2VaZI9-&+4;7." 5XaXI7+(-7;7-! 5X_VE7+(09;4) 5V]SB4))2;;4(9." 7+ !<2&  !;LJ@4+-9@;."  !5JI>2+.;@7-!  5GE;0+2<>7) 5CC9.+4><2&   2B@7--7@;0$   0@>4-.9@9-!  .<;0+2<>5) +97.+4<;2&   (74--5<;."  (52+.9<7+ $2.+2;<4)  !  $.--4;;2$ !!-+-5;7-"" ))-5;5+ $" ().992( "& &)0970" )$" $)295+ +)! """(270& +.(!&!)47."(4." ($ !+44)(44+&)!!+40&$470& !+&!+2-"$4;7-++" +0)!$4><4( $.) !-0(&2BC;.".0& !-.+2BGB4) (2+! !-.2@LI>0" 20) $.4@NPE9+-4.$ Ŀ $2@NUN@2& $52) +0$ 4;2(Ϳ(QffXI9-+;9." ʺ5cmdSC7) !5>7+ Ƶ NmoaN>0"-<;4&Ͽ!]qjZI9-5>;0" ˼5fqfUC5) (;>7+ ȶCkoaP>2$2@<4&ó Jmk]L<.! $;@;0" ϿQkhZI9+ .@@7- ʺ!UjdUE4( 5C>4)Ⱥ+Xh_P@0" (@C;0$ ö.Xd\L>-4EB9-! ˿2XaVI9) $>G@5)Ƚ5V]SE7& .CG>2&Ľ 5UZQB2" 5GE;." ý5QVN>. !2&5NPE7& 5IG<0$5LNB2" "0 (BIC7+ 5II<- 4GIB7)5GE9+ 5IG>4&4EC7( $@JE<0$ 4C@4& (BIC;." 2B>2$ +BIC9- 4B>0" +CIB7- 2@<0" .CG@7)2>;- 0EG@7)0<9- 2EE>4&0;7+ 5GE>4& .;7) 5EE<0" .;5( !9GC;0" .94& !;EB9- .70" (@GB7+-50" 2CG@7)+5- 5GE>2& +2)$4&&)&@LI>0$  $&-CLE;-!   ""4ILC7)  !(@PLB4&   5JQJ>."   (CQQE9+ !5NUPB4&  )CUUL>0"  !5PZSG;-)CXZPC7)  5P_ZL>0$  !@\aVG;-!.NcaSE7)  !  <_f]N>0& "! QhfXI9-!!$._jcSB4) (" @fj]L<0"  )(NhdXG7++-&(VhaSB4& (0+" 4Xc\L<-! $22( 7-! 2IJ@2&!+@7+)5GI@4) (;<4.5GNG<0&  $5945CPNC7+! 279CQSJ>2&09CQXSE9." ! 0@Q]ZNB4)  !!5N_aVI<0(&B\faSE7-" "$ (Qhh]N@5) ("2]kfXI;0& $)! @fmdUE9.$ )( JjkaSB7+! "-&!Qjh\L>4)+-".XhdXI;0&!.+ 5XfaSE7-" +0( ;Xd]PC7+ 20$0$24(2JNG;."!42" 2ILE9+!  +50!!0GJC7) .5- $0GIB5)24) $& .CI>4(22& )& .CE<0&!20"&-& 0CE<0$!2-"(-$ .CC;0" "0-!+-$ .BC9." $0)!.-"2BB7-! $.)$.-!0B@7+ $.()2-2B@7+ &-&-2+2@@7)&+$!.4) 0@>4)&+"&24) 0><4&()"(42( 0>;2$ +)+50&.>;0"  $-($050".<9." (-$+57-.;7+++"$295) .94)-)"!+9;4( .94( $.)"&2<;0$-70$ (.($-;@9.".5." +.&(4@@7+-4-".-(+;C>4( +2) (0+(2BE<0& +0).0+-9EC;.!(-& $40+2@IB7)(+$ .4002&$("!4405ELG;." $&-755BLLE7) !$4954& 2@@GUZSG;.$  !>BCPZXPB5)!  2CCLX]VJ>0(0( ;JXfhaSG9-& (CVfmh\NB4)" 5NdqocVI<0&!@]qtj\PB7+"0QmyrfVJ>4) Ľ!BcyyoaSE9.$ .Qt}vjZL@5+!Ƚ!@f}}qdSG;2( ĺ.Qt~xk]NB7." $Cf}}rfXI>4+! ʿ5Qr~yoaSE;0( Ⱥ.Idx}vhZNB7-"ö (@XmxyoaUI<2) ˽2)  <\jhhmqh\PE90& ȼQkkffmodXJ@7+"ĺ5dqkdhmkaSI>4) Jmrjchmj]PE;2& ʿ]vqfchmfZNB9.$ȼ5kxocajkcVJ@7+!øCqvjaajjaSG<4( ˿ Xtrf_cjh]PE;0& Ƚ(_toa]djdXLB7-"ĺ5dqj_]dhaUJ>4)!  Cdof]_fh]SG;2( ʿGckc\ahd\PE9.&ȼ$Iah_]dhdZNC7-$ƺ+J_d]_fhcXL@4+" õ .G]a]_hhaUJ>2)! .G\_]cjh]SG;0& ʽ.CX\]djd\QE9-&Ⱥ".CU\_hkdZPC7-$Ķ$-@SZajkcXN@4)" ó"+>QZckjaVJ>2)! ˽"(2) ʿ$@]qvoaUI<2( Ƚ$@ctvoaSG;0& ƺ$Cfxxo]QE9.$ ĺ $Chxvj\NC7-"ø$JmyvjZLB7+!$NmythXJ>4) Ƚ  &PmyqcUI>2( ļ (QrxoaSE;0$  (Vtvm]PC7-" +Xtvj\NB7+! Ƚ!  2]trhZJ@4) ļ!  2_tqdVI>2& ú! 5ctoaSG;0$ " 5drk_SC7-"ȿ& 2) ÿ($CdkcVI;0&!)!CchaSE7-" () Gaf]SB5)! !-&!C_cZL>2)(+"!G]aXI;0&-+$C\_UG9-" (.( $C\\QC7+! 0.$&CZXN@4)+4-$CVUJ>0$  $54) $BSQE;.! 270" $@PLC7)(77+ $;.!5B<0"+>>5)2>9-  !9C<0$ 094)  .CC7+-50&  $2$)2-"  4CE;+ &.)  )@IB4& $+&!9IG<."  !) .GJC7)$  "&@LI>0$  &"5JLC7+ ()!+EPJ>4((-(!;PPE9." +4.$.GSLB5)+77-!5NSI<0&&5>7)(CSPE9-" .@@4&5NUNB7) ;E>0!(BSSJ>2&(CE;+4JVQG;."5IC7(&@UVNB7) @JB2$!.JXUJ@2(!GI>."(0&(0&5B;.&-CX\SG;0&5@7+(2L\ZPC7-" 5<4))9Q]ZNB5+! 292)+@V]VL>2)070)0G\]UI;0(.4-+5N]]SG7-$+2--2("&+BX_VJ>0&!&.G\]UI;.$ !(5N_]SE9-"   !+0&  "9VdaUI;." (C]f_SE9-!   +Jch]PB7)  2QffZL@4( 5ZjdVI<0$ BakcSG;."  NjkaSC7+ "(\mj\L@4( !$ 5dohZI<0& (" JkodUE9-" $)!QmoaQB7+ +)!\oj\L>4) (.( 2cohZI;0& ..$2((50$$JacVI;0" 05- +J_]SE7+ $52( -GZXLB4&07-" +CUSI>0" !54)(BQPE9++50" $0" !.0& 5GE9+$.+ 4C@4)&+& 2@;0& $)" ".;7-"z $&$" +74) !" (!(40& !(( &0-"   &+$ ".)    !-)!!+& " +0( &$& &2-"" &+$ 24)&.+! +70$ &22)  !57-&470$ +94)&5<7- 490& !4@@5)   (97-"+>G>2& 4<7+5GG;."  &;;4( $CLE9+ 2>9." .JNB4&   $;>7+ ;PL@0" 0@>4) CQJ<-  !9B;0$ $JPE9) -@B7-!.NNB4& 2B>5)5NJ@2" 5C>4( 9LI<0 &2$(2$ 5@;0"-BE<." 5>9- 2CC9+ 4;7+  !5CB7)294)  !9C@7(092&  $;C@4$ .72$  $;C>0$ .50" (B9+.4+  -@B7+.2)  -@@7)-0(   .@>4& -.&  0@>2$ +.$  5B;0"  +-"   &4( && !5B<0$ &"    &2&  (@E<."   2CC9-  !2"   !;IE;-"  -CJC7)""   !5JJ@2$  &!  +CLG<.&(  !5JLE7)!)&  (CNJ@4"  )+"  !5LPI>. $-) +CSPE7) -.&  $@FIGDFGC<:94+(,/) ¿ &8HNLKMNPYl~}jTGB?;85( 7CM^nwz|~}{|~}yw{}zywpdXJ7)'+Ա  ϻø %,*%$&$%*$023:CJNU][K::Ma\<-6.+8LQE517=;0$&:T]K2&&   #("  Ǹ (," &2$  ſ  ý#7@$/=/-@H5!"' *G1  )#!! $%!"+0&"%!))',31(!   :@" (:BF@2*/2&*7  $  ¸+ *52$'*          +,)53,/;=+-*!  &%! %))'$"!  Ͻ.. &,'(7IJ9))59* ("    ӹ  "%8:-$*2/        "'0227<5!      !" %(!!&/?LG/    ! $!  '3==3#!'"        $$                                                                  r                             !"  $ $  "#"@LP`O緝F^^VM9$ "(@F˪,1"̾(*Ӿ$Mb[aUӯFnZTUK"-?8ֽ&(¦!!(?PYU> ϧMtjX`^0G9&,Ȼ "K?᱌Nnwvn^/0WQ1 &&Ƴ;Eŗ MN`zwZ1 "5_T*(*Π& -M@1ص&gdCCG>1>X^1(ٰ5$-1  6KN?߼9mXBMNE5NYC*1ݼ"8>dF&Ϟ2lgTPOMLNIN:' ǥ(!ʾ /Fa? ʕBcm[GU[N[Z_C&'˵ !ں0[^+깛?^NCMgVYtsV9 0 ȳݽBbN"ٴ5M9,MiZeX(!"#©6`X9񻱷(/28-4PkbsEĬ*D&꼜"!ꬡ BmP#ڵ&?,&2Qel~O?Iϳ"ʹGpB Π"'4<Bb`[t>&޹ /I#湰,Ǭ-DL8ؼ'$(&-4dpbq:ھ*1溦Ǽ1D,! -* -`xq}l5  $#ᴨʳ#;*! 61/ 5gtxzz_1 ( «Ӭ21$ (D@*# ,avmqsX#&߹ -05!/VF4&WcpiiG(շѺ:>&½DTW?(KV_cX4*άо-:8+ջ$M^UB#8MZTC* # Ǵ(:;0$ŷ ,U[W;&&+ ,ݷ &8>2-ETI2'&2* ڽ ,$ӻ0:2+ -CF<-&# ؼ(* ȴ88(& '9;0/"  Ӽ !-(Ƴ 54&!!00++     ѽ'-$ȹ//'!"&! +/ *+#    ,,!'"  '* !     &"      #"    !"        "     !   ! !!  #!"!                                    --,+'&%'-+!&!6'-4 &&          ! + !!$'&4 3'  &'46$. ,6!06B,=,-'%'-!466.4'$=4 6<'4 &9669<6P6L'= I9!.-'4'3O9' 33&%&'&L!9 Q.0&&$&3-+&'-'$ ,  3 & + &!!         !   $  '$ ! !!!, %,' 6, 07 &$0!.-$ 3!$$ .,<+,,4%9&@'&9-, 199? bgt .end cmp.w #$0,d2 ; x2<0? blt .end cmp.w #$13f,d0 ; x1>319? bgt .end .clip_box: ; Clipper la boite. cmp.w #$0,d1 ; y1<0? bgt .not_y1_clipped moveq.l #$0,d1 ; Si oui y1=0. .not_y1_clipped: cmp.w #$c7,d3 ; y2>199? blt .not_y2_clipped move.l #$c7,d3 ; Si oui y2=199. .not_y2_clipped: cmp.w #$0,d0 ; x1<0? bgt .not_x1_clipped moveq.l #$0,d0 ; Si oui x1=0. .not_x1_clipped: cmp.w #$13f,d2 ; x2>319? blt .not_x2_clipped move.l #$13f,d2 ; Si oui x2=319. .not_x2_clipped: sub.w d1,d3 ; d3.w=y2-y1=dy. addq.w #$1,d3 ; d3=nombre de lignes. move.w d1,d4 add.w d1,d1 add.w d1,d1 add.w d4,d1 lsl.w #$5,d1 ; d1=y1*$a0. add.w d1,a0 ; a0 pointe sur la premiere ligne. and.w #$fff0,d0 ; d0=x1-x1 mod(16). and.w #$fff0,d2 ; d2=x2-x2 mod(16). sub.w d0,d2 lsr.w #$1,d0 add.w d0,a0 ; a0 pointe sur le premier mot. lsr.w #$1,d2 move.w d2,d4 ; d4 sera le nb d' octets a passer. lsr.w #$3,d2 add.w #$1,d2 ; d2=nombre de mots par ligne. .init_blitter: move.w #$8a28,a1 moveq.l #-$1,d0 move.l d0,(a1)+ ; Tous les masques pleins. move.w d0,(a1)+ move.w #$8,(a1)+ ; Increment x. neg.w d4 add.w #$a0,d4 ; d4=nb d' octets a passer. move.w d4,(a1)+ move.l a0,(a1)+ ; Adresse destination. move.w d2,(a1)+ ; Taille horizontale. move.w d3,(a1)+ ; Taille verticale. move.w #$200,(a1)+ ; Remplir avec des 0. move.b #$c0,(a1) ; Lancer le blitter. .end: movem.l (sp)+,d0-d4/a0-a1 rts  [#}E  d * | AOTL}7]y+ 9 !"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;=w==>>D>q>>>??/?N?j??????????@???????????j?N?/?>>>>q>D>===w=>=<<[Dc@*N0~[lݬC*^ rYr"1 3@'2`I8 "@`( `A ?ms 88 $@>>93F  @ <<H00L==̀>2f<0~ >>xxD6 ;30?@ ;?T !71 )`0?H@` 5 ?$P-$?*<?  =? PI )g :?@ PTp "!?@? :? PT! B<~@? -? @ h?!^??xG8p )?@` h!!`@p8x *?@ &Y f` ,?@ @90?#_`࿰r@ ~ )?@  F8@pp~ 2 > (?HP P @ ?1C<@9? (?HP  |3x?@ (?PX P=<10G@ (?PX  $<? @@?@0  (?$( P j v  #?@`@ (?( $ O  (?$( %P 'p1p(0 (?, 4 ? ßH0x@@? ">` (?, P4 ?1$<P`D8|0 (? (?3 ? 0?'p e (?P R+?c~#?O p O0O c (? L,|?'~gf~   @q (?P IR(C?G8?@@ ?@ ؠ8? (? J(!?N0 P` (?R I$(!?p?@(0(0 (? J(?P pp`2 > (?R (ThH0xf~/$<(8   (? +(k  78(8@H0x(8x (?T D;v wx  `(8< (? DDE;( P`@(8a@(? $D%;Q1? ` P pt (?4=cJ0?@P pzP `)?(E*??$ G86> @P p<? *@?/* p?@_  P p* ,*?غ`  @ @/ @ `VW*? /[_z ;<@ZX/Q;,wx`P`$<-_? PH0x@ H0xX?@@ a (8T P pU  J@pxC< l|_?Y% (/*; x|n ؕxW50$.} @ J)iֈ{ ??7wk@`@Ȋ??H7R@?@D2UOڙݦH _ wK{K oxx  Do88/%kI^_?``<<  "@``EDD @0000#)`9D@h%%@00 00F`toB?@    $ _?@ ``Q-T:??@ ``` 5% +,  @@@  {TX @@  DD @?@_ZP`>T+%?zn@  %|34  U5 ?@%s'i??VD$ _`?@'0 ??$  *    op@'@eBpn$ $/0``&@@N@p ``/_ )/d0(  7800-/ap`q4 ?'(00-(/iC<u ?8`6 U?a`Jʀ5@06(hP**NUz@ 6]/_@TT@ 6X}n/(/[\ 8X7 UU{^1ZΡ@6{t [\={ GwUUUUǻ@=Dj $n$Fہ_eWX?=;DZcFiUUUVT788=[$?}]f_BUT<<0 =$`ǀ8BBbJ;88 >`9+  @*??488P N1P9 0ww@qUU*R`R/?88  P9 @ɀ??7ҿ@-1@`2 pp0 =@ @??vZp[`G_ ^_pp@ =  _ ??]RR" h@PPP ~?Pa`@@= /Vj@+ 0 m=`= MS8SE-_/z@ = O%   O[4 Ul*CEܺ @@@ ! #h N l}S`! @l W Pg3cT@l'U&sss1zJM?3դl[Y H  ߷mkexxdL|  'K8?Gՠ`yO??ZJ Uz* a@׀(z@ ":Uj ?Ŭa^t J*u}UU UhB<<R Q`/c @wP?./<Rj(1?Др.&>ڹ?jjU*!Z2_ P@׀(Q 4  \Wo @ؼC@_  Q : E:?B5UU  tQ V?X5{#3K (RF(G@PQ -˥4TRp__Ћ0t?X` `QZW((8U@2>M ``Q'PXjRU-Jz @p?Ԁ``X n* (VPP5+/VW~h@@XB4 ^߀AQ@UPkZZ^JJPZz/?(/VV@\^5Rxx<| H VUZAs'?A"QyZ:?B]@@V X_W8 -  WWuZ@X~x En@T.E/x|B<<P PP8k?ACHV??J?[wRy~д@<O@Ӏ,%++hp8@IU``@UZA__B=??Iv /UTPZ,/@z8IwhP P@-_jUWCh?AI  *P*`ՀTTE*+// U kI~?(0E??JEE""@_I6_`ݪ"UUV@_-/J0z@WUU((T  W^_J ]jD)@@6@Q_+hp!Woo r +/&&Y@P AA>@@@Z%' `00ZY ,  WW` V P0?h0W '`7Hh~~t 7n? @#:4 [b A(`'# d8p q:@?#`` 0 qA #p vpA  :0 L;@8@A;T @ B a;4 G;Y!{||R;||R?Ѐ_;*||R%Hπ:||QTVH&>yGπ:H>>QB>Af~HO:>>A Y(@ s|Eǀ:$A  U${B<A@~@ ;G`_?@;@p ; 2,>@@D4x3 UC@ F0 |C @@B?|C@B|? J@"<hKP @<l!R=!" = ?  "  & 7 N !yy@s(h N9 Q{WWGGcc@jj@vas Qt{ L   90ɀlD: ??@H}Qk m``Ii)A>@>0//i6"b] ]WW@HK0i$I; `|p@[Hp88  EE)F}}0o0o$??__(`$=߇0@[\@nD%$ @-f fB44__ww}ނ}\@GI`_ _>>@22?/::Pwwssãwÿ "!"a@/p`_ _11ƾƾ ??C33탣}w}{]{]xGG@@gga@gg/,Z/,Z88@@t|__>>??xx90@__ii88DD]]x8'`'&| $0 pO0O@~~9[9[? U U__|p"ww?EUEUTT@@@@<<"_"_  x`<3 3x@|`| O O88@``EEppss ||  0 ??_ !?*(wwJRBRUUUUH0~0~``?@?U@T@@% U UBB~~*_*_UU( UUmmQQ"C C@ _@ _EEP-)UUA@@) 0// @@b`UUUUWWϐϐ@*U*U__**UUPT  PPB%CUURWRWUUUU(UU(!  ,((((ׁB]B]T{T{TTQjjU!!?PPuu _ _*w*w*@1@1}}__@@@@@EE1X1X1OOWW@@UU H@?@? w߈ w``TPPh`@@~~OO@_ ?II??WW@( & AAɀ@?@? HǠ @PU d{}}__@"@"0s0s>D D ``S$S@@"AA@@cc(0 0™™""}}P ,P(""݁~VV@@@8//@ AAPP@@ wOw@ ?TT(?(`ן    DD(  @ ]]ww__`B i# @  @pccA_=0oo'0)R=//`33 HgY f??$$u ` x~`~A**W 33 B !}?@@"Um oW |x}}x$4 DDH^ !!@< " <Â}aj|@| ?'#dDDo`b}W]PCM"<-XjGdd12I3 D$ !YOo( =h ` p_| !> ʠ5G @??1%P`B< S[D8@&#\ -GA.@8? 8u _jn0HH?((40oo"_"_ll>>wwA((G@""4l4{ 6:@?@@@@@@ ' 'AA__ ye@#@ @@IrBrG7WW(($$}}HH@(<@p@QRQRXXEENN` jUUUwUw ((KKNNUUTTEE@@PPAAϏϏ**UoUo**""JJ((~UXUXUoUo@@ ffHHWUWU((##܈ww&&$ۀ$ UUUUTETETTTTPUPU`PP""ݪUUUU v v ^^KK##WWU_U_@@@@UUUUkkFQFQJJUPUPUUUTUTWW]U]UU]U] ee__પUUUU UWUWuu Q QUU@@%%&&@@EEUUU@U@RURU uߊ u@u@u __ UWUWooRR@@@@TT TTPP@@@@PP__ TTpp  ______@@@@TT ~ `~2@@**PP@@ uu__ww{JUWUWTT W WPP 0UUUwUwTTUUUU xh ))QUQUJWJWUUUUZ @UUPZPZUU**;?ߟ@@ _ _PP,  @?@@ oo *~B*00zz@@@@? и++((c??**___(?*@*TwTwhUU@@``l`` UUUU??TT튀uu??p BBUUPP  @@@@7Zp. .@@))Cjj ߀TT__    ߸π  `((QQE@E@UWUWTTU@U@ܿ**A]]UUUUUUUUUU  | UUTT _U_UUZUZjj]]U~U~UU?UUWW@? @@BBZ(Z(T*T*բ]]`++TTƀ _` s]s]__@@**E@E@' 3PP z/0 )5)5@@Vw""7  $$@@z Ͽ@?@(@(רWW@̿""`߂@0U^U^PP0R?8 w{*RƠB8V}V}__ 1UU@@u  ))PP11 n"": r@?WW?? >UUxx`TTiiTD* *@1@1? U U*W*W2w2w__D  @H@H@@_@@@UUQQUUUUPPW]W]UwUw]] UUUU__, ̢ ]ߢ ] QUQU UUUUPP((׀TTTTPPRRﭪUuUu **00 "w"w@@(u׊(u׀-oҀ-@@G;;PUUUUUUTPDP__ W]W]*Uժ*Uա!Nޡ!^@@UUUUETETDD  >UWUWU]U]W]W]BB7`<UUUQUQUETETDMsUUUUUuUuUuUuuu@@ @@!}w3wx 0UUUUUTUTUUUUU@U@AAPQPQ""ݪsrUUUUUUUUWWWW*Uժ*U@@^ " "]3;]3;UUUUUUUUUUUUQUQUTT@@PqyCUUUUUUUUU]U]U]U]* * 0bϝ0bϝTPounp >`>UUUUUUUUUUUUUUQTQT__DD(ϸ@ǪUUUUUUUUUUUU]W]WUuUu@@@@ m m@8U8TUU"UU"UUUUUUUUUUUUEQEQ@@AA\||hUUUUUUUUUUUuUu*Uժ*Uՠ__  ?? AAUUUUUUUUUTUTUEUEU@U@EE|r|  UUUUUUUUUUUU]W]W(]ע(]??mm__>   qÈUUUUUUUUUUUUTUTUUTUT@@TT EE> >=I A UQUQUUUUUUUUUUUUUuUu %>% >?QQUAUAUUUUUUUUUUUUQQ! )~> %z>MYDUPUP*UU*UUUUUUUUUUUUUUwwPP PuPu?VTA:qG2!!TR @R (P@(P@T"T E EUUUUUUUU@@EEEEPunp?hD;P@;""U"(UU"(UUUU"*UU"*UUUU@@""ݢ]u]u`  θ΀ $B'=@'=(U(UʬSSPPTUTUU]U]__@UUUU T8U8 |DDppQA*Q*@U@UUUUU*W*W |l/PP*PP(U(UUWUWWW PjPjccN$((((@*@*UUUUTTuUuUw~ >@>TQ*TQ@U@UUUUU]]%Pگ%Pگ}}QU5U5UUUUU9(`yY@UU *U *UUUUUU_U_qPi*i"???>>*(U  UUUUTPTPc"oo@@??  @@+* UUUUUWUW<<JEJ@ @  (D  uUUUUUDUD8B8 $W$W@ @B   e eUUUUUUUUJ@H(( 5  UUUUQ*Q*==wwP@JH V$$@@??__1mW222ɨ ɨPP"2[:'__FB%B%A"A2@@XXQss={   '  BwZ}VR€n0L0PpP@??@@jjn հ'mup9 {ZG7Ȋ7Co7 ]n&mu @?@@@T!E+'D@*@o@/P5**@@%9m7x"xNtm@@o[8?{[LD+: [ vѶk:?@@q:WT'xww@@{X?;Ug"@"-H@-@Dh_]g  ڲi)RE p[ s@C@}6JAɓ§Z'q[*o ɫ"S?U M `DoU  /5߻(E(_@߁ 2M 2܀Nge[@2@  S V KJFN\O_TT ^60O0 @(5@c1:Qbqs@N@ C `ZP*yT[d @ e?{g;`IOPd?`j)M @ 8om@@;BA;UONfŢ: ۰ (((h~[M>-M)?mU wP۔HBHp?  @@@R@ # @h@*TktַnmBj@i}((6@@  ]G>WwOlH$H8 :::u/0k:  ~0|[:[Uk:8:8@h@(@7@www7ɶwUwuҧTtdNv/JwrXgH`O}VO/ / ?@}juU}qeu}|o_]}ԀՎɫ@ۯ@ECo-uɪ+Is>ɫզ@$@$Wv]pN?/W[*] 26wkt22O>0}9UBiI I @! @_@{~ W7*___ q?_ge [ ^ _l $H $HHsM-ުRmssN&*ss?TT js_s*@*?A A @@E73S@@@N@ "@/"@ o ^jQWՀ e oon/toH;@]?H[Q;[[Z{[$Y$mm _ G?zUo-ilm:mi@(@?`?myZ @@j@j@@j@@j@i w@j@BjB{J!J @@/g-N%tJ[{r[_vvi}*w": <j  2::` `׫ɐ`:gEwy\"_wwwwWwEww' w ԧoj??\zk` `T/ om}}n ]@@U}E}} } }}@T@OIɫ//tDt+ɩIɫ8I8@ɫ@UIɧBK__O& &ٓll8U?BCއ__@@22**2Wր222C3CрsӀ022Çǀ_ _ {EE$V/Y__^x{__\*]1?=ss_ ` "`"mq{rps |sssqCP?^@@ UkpZpp p=ڿ?oo?<1?pp -oo4 ||hN  ""//oo`c`c`[[[|}}[N^MkAAI@_y@=pp[|BC۰# # g 7mm?L++{ {<@m@m  mlU&~?8`>8`8:<<o0D_|`@j@BjB 33==@h@0U00@j@DJDW;;NjO $|?@@j%@@@{@tt y8$( k"rr""}" "  $m|?@@|to)A(@ @@ ?w373@@. { pwpaa&@&@ Tt_;m?::~:QAPAJ J @*99:_ R< _xx88 K9\@:table$=SPACE$(32000) adr%=VARPTR(table$) nb%=0 FOR comp%=0 TO 25 y%=200*SIN((comp%+25)*PI/50) DPOKE adr%,y% nb%=nb%+1 adr%=adr%+2 NEXT comp% FOR comp%=2 TO 5 ampl%=200/(comp%*comp%) FOR comp2%=0 TO INT(50/comp%) y%=ampl%*SIN(comp2%*PI/INT(50/comp%)) DPOKE adr%,y% nb%=nb%+1 adr%=adr%+2 NEXT comp2% NEXT comp% PRINT nb% adr%=VARPTR(table$) FOR comp%=0 TO nb% y%=DPEEK(adr%) adr%=adr%+2 PSET comp%,y%,15 NEXT comp% adr%=VARPTR(table$) BSAVE "a:\images\table.xxx",adr%,nb%*2 uk`UI=1%  "&*-/1111/-*&"    F;*J ;** Le programme principal! ** ;*J script_length equ 92 supervisor_mode: ; INDISPENSABLE. move.l #$0,-(sp) move.w #$20,-(sp) trap #$1 addq.l #$6,sp dc.w $a00a ; Bye bye la souris. move.b #$12,$fc02.w bclr.b #$0,$484.w save_old_features: move.w $f8260.w,old_res move.b $f820a.w,old_sync moveq.l #$0,d0 move.b $f8201.w,d0 ; Base haute. swap.w d0 move.b $f8203.w,d0 ; Moyenne. lsl.w #$8,d0 move.b $f820d.w,d0 ; Basse.( N' existe pas sur ST-STf) move.l d0,old_screen move.l #$7,d0 ; Sauver les couleurs qu'on va modifier. move.l #old_colors,a0 move.w #$8240,a1 .save_cols: move.l (a1)+,(a0)+ dbra d0,.save_cols screen_features: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.w #$0,$f8260.w ; Basse resolution. move.b #$2,]$f820a.w ; Sync=50Hz. move.l #screen,d0 ; Mettre l' adresse de l' ecran. lsr.w #$8,d0 move.b d0,$f8203.w swap.w d0 move.b d0,$f8201.w move.b #$0,$f820d.w moveq.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $0aa. move.l #$aa00aa,d1 .put_cols: move.l d1,(a0)+ dbra d0,.put_cols ;*J move.l #script,a6 moveq.l #$0,d7 ; Position dans le script. vbl1: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.l #image+34,d0 ; Ecran de travail. move.w (a6),d1 move.w d1,d2 add.w d1,d1 add.w d1,d1 add.w d2,d1 lsl.w #$5,d1 ext.l d1 add.l d1,d0 ; d0 points on the adress to put. move.b d0,$f8209.w ; Put the adress. lsr.w #$8,d0 move.b d0,$f8207.w swap.w d0 move.b d0,$f8205.w bclr.b #$0,$fa07.w ; Timer B disabled!.. bset.b #$0,$fa13.w ; Timer B demasked. bset.b #$3,$fa17.w ; Soft end of interrupt. move.l #timer_b1,$120 move.b #$0,$fa1b.w ; Timer B stoppe. bset.b #$0,$fa07.w ; Timer B enabled. move.b #$1,$fa21.w ; Wait 1 line. move.b #$8,$fa1b.w ; Event count mode. moveq.l #$0,d0 move.l d0,d1 move.l d0,d2 move.l d0,d3 move.l d0,a0 move.l d0,a1 move.l d0,a2 move.l d0,a3 move.w #$8240,a4 move.b #$0,timerb_flag .wait_last_timerb: move.b timerb_flag,d6 cmp.b #$1,d6 bne.s .wait_last_timerb addq.l #$2,a6 ; Next position. addq.l #$1,d7 cmp.l #script_length,d7 beq.s goto_vbl2 bra vbl1  goto_vbl2: move.l #$200,d7 vbl2: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.l #image+34,d0 ; Ecran de travail. move.w (a6),d1 move.w d1,d2 add.w d1,d1 add.w d1,d1 add.w d2,d1 lsl.w #$5,d1 ext.l d1 add.l d1,d0 ; d0 points on the adress to put. move.b d0,$f8209.w ; Put the adress. lsr.w #$8,d0 move.b d0,$f8207.w swap.w d0 move.b d0,$f8205.w bclr.b #$0,$fa07.w ; Timer B disabled!.. bset.b #$0,$fa13.w ; Timer B demasked. bset.b #$3,$fa17.w ; Soft end of interrupt. move.l #timer_b1,$120 move.b #$0,$fa1b.w ; Timer B stoppe. bset.b #$0,$fa07.w ; Timer B enabled. move.b #$1,$fa21.w ; Wait 1 line. move.b #$8,$fa1b.w ; Event count mode. moveq.l #$0,d0 move.l d0,d1 move.l d0,d2 move.l d0,d3 move.l d0,a0 move.l d0,a1 move.l d0,a2 move.l d0,a3 move.w #$8240,a4 move.b #$0,timerb_flag .wait_last_timerb: move.b timerb_flag,d6 cmp.b #$1,d6 bne.s .wait_last_timerb cmpi.b #$39,$fc02.w beq.s goto_vbl3 dbra d7,vbl2 goto_vbl3: moveq.l #$0,d7 vbl3: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.l #image+34,d0 ; Ecran de travail. move.w (a6),d1 move.w d1,d2 add.w d1,d1 add.w d1,d1 add.w d2,d1 lsl.w #$5,d1 ext.l d1 add.l d1,d0 ; d0 points on the adress to put. move.b d0,$f8209.w ; Put the adress. lsr.w #$8,d0 move.b d0,$f8207.w swap.w d0 move.b d0,$f8205.w bclr.b #$0,$fa07.w ; Timer B disabled!.. bset.b #$0,$fa13.w ; Timer B demasked. bset.b #$3,$fa17.w ; Soft end of interrupt. move.l #timer_b1,$120 move.b #$0,$fa1b.w ; Timer B stoppe. bset.b #$0,$fa07.w ; Timer B enabled. move.b #$1,$fa21.w ; Wait 1 line. move.b #$8,$fa1b.w ; Event count mode. moveq.l #$0,d0 move.l d0,d1 move.l d0,d2 move.l d0,d3 move.l d0,a0 move.l d0,a1 move.l d0,a2 move.l d0,a3 move.w #$8240,a4 move.b #$0,timerb_flag .wait_last_timerb: move.b timerb_flag,d6 cmp.b #$1,d6 bne.s .wait_last_timerb subq.l #$2,a6 ; Next position. addq.l #$1,d7 cmp.l #script_length,d7 beq.s sortie bra vbl3  ;*J sortie: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.w old_res,$f8260.w move.b old_sync,$f820a.w move.l old_screen,d0 swap.w d0 move.b d0,$f8201.w ; Le pire c' est qu'il faut mettre swap.w d0 ; $ff820d en dernier. rol.w #$8,d0 move.b d0,$f8203.w rol.w #$8,d0 move.b d0,$f820d.w move.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $334. move.l #old_colors,a1 .restore_cols: move.l (a1)+,(a0)+ dbra d0,.restore_cols bset.b #$0,$484.w move.b #$8,$fc02.w dc.w $a009 ; Le tank est de retour! clr.w -(sp) trap #$1 ;*J timer_b1: move.b #$0,$fa1b.w ; Stop the timer. movem.l d0-3/a0-3,(a4) ; Put the colors. move.l #image+2,a4 ; Prepare colors for the next hbl. movem.l (a4),d0-3/a0-3 move.w #$8240,a4 move.l #timer_b2,$120 ; Next rout. move.b #$1,$fa21.w ; Wait only one line. move.b #$8,$fa1b.w ; Event count mode. bclr.b #$0,$fa0f.w ; Interruption finie. rte timer_b2: move.b #$0,$fa1b.w ; Stop the timer. movem.l d0-3/a0-3,(a4) ; Put the colors. moveq.l #$0,d0 ; Prepare colors for the next vbl. move.l d0,d1 move.l d0,d2 move.l d0,d3 move.l d0,a0 move.l d0,a1 move.l d0,a2 move.l d0,a3 move.l #timer_b3,$120 ; Next rout. move.w #198,d4 sub.w (a6),d4 cmp.w #197,d4 ble.s .ok move.w #197,d4 .ok: cmp.w #1,d4 bge.s .ok2 move.w #1,d4 .ok2: move.b d4,$fa21.w ; Wait y-2 lines. move.b #$8,$fa1b.w ; Event count mode. bclr.b #$0,$fa0f.w ; Interruption finie. rte timer_b3: move.b #$0,$fa1b.w ; Stop the timer. movem.l d0-3/a0-3,(a4) ; Put the colors. move.l #$aa00aa,d0 ; Prepare colors for the next vbl. move.l d0,d1 move.l d0,d2 move.l d0,d3 move.l d0,a0 move.l d0,a1 move.l d0,a2 move.l d0,a3 move.l #timer_b4,$120 ; Next rout. move.b #$1,$fa21.w ; Wait y-2 lines. move.b #$8,$fa1b.w ; Event count mode. bclr.b #$0,$fa0f.w ; Interruption finie. rte timer_b4: move.b #$0,$fa1b.w ; Stop the timer. movem.l d0-3/a0-3,(a4) ; Put the colors. move.b #$1,timerb_flag ; Interrupts are finished. bclr.b #$0,$fa0f.w ; Interruption finie. rte ;*J Section DATA script: ; Le script. incbin 'a:\images\table.xxx' image: incbin 'a:\images\stelex.pi1' ;*J Section BSS screen: ds.l 8000 buffer: ds.w 16 timerb_flag: ds.w 1 old_res: ds.w 1 old_sync: ds.w 1 old_screen: ds.l 1 old_colors: ds.l 8 [.  `2.. LOGO XXX `3SIN_COS XXX /7CLS_BOX S `9INTRO S `<[,PATH XXX PHpPOSITIF XXX %!N NOTE XXX `RP:~&%#  ? ????????>> ?????? ? ??????????????????????????????<?<>?  ??   ? ? ?   ??%%%''<y`[#}E  d * | AOTL}7]y+ 9 !"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;=w==>>D>q>>>??/?N?j??????????@???????????j?N?/?>>>>q>D>===w=>=<< ??)@9@I@X@X@E@2?> >=<:9764y2g0V.E+4(#&#  zndYPF>6.'   zuqlg%b+^2Y9UAPILQHZDc@l<u8~40-)&#    $')+,,,,,,+++*)) ( ' &%$#"!  #&*-148<@DHLQU Z ^ c g lqv{   !#& (+-025 7#:&<)>+A.C0E2G4I6J8L9M:O<P=Q>R?S?S@T@T@T@T@T@T?S>S>R=Q<P:O9M7L6J4I2G0E.C+A(>&<#: 7520-+ (&#!   zu q l gb^YUPLHD@!<#8&4(0+--)0&2#5 7:<>ACEG I JLMOPQRSSTTTTTTTSSSRQQ P O NMLKJIHG F#D&C*B-A1?4>8=<<@:D9H8L7Q6U5Z4^3c2g1l0q/v/{..--,,,,,,,,,,,,,,,,,,--------- ---... .#.&.).+../0/2/4/6/8/9/:0<0=0>0?0?0@1@1@1@1@1@2?2>2>2=2<3:3937364442404.5+5(5&5#6 666777 78889999:::;;;<<<==>>>???@@@AABzBuBqClCgDbD^DYEUEPFLFHGDG@G<H8H4I0I-J)J&J#K KLLMMNNO O PPQQRRSSTTUUVVWWXYYZZ[ [ \ ]]^^__`a a#b&b*c-d1d4e8e<f@fDgHhLhQiUjZj^kclgllmqmvn{oopqqrsstuvvwxxyzz{|}}~  #&)+.024689:<=>??@@@@@@?>>=<:976420.+(&#  zuqlgb^YUPLHD@<840-)&#       # & * - 1 4 8<@DHLQUZ^cglqv{ !"#$%&'()*+,-./012346789:;<= >?@ABC D#E&F)G+H.I0J2K4L6M8N9O:P<Q=S>T?U?V@W@X@X ?_?6A@AA?E ? {y ??? ??T?8? ? ?| ??00{y?00 @/0?0>??     ?| ? ??T88?.88?xx>???@>?E??>>?  _?~> >~~? >~? @/99/AAA@_?6?  0| DA }TDx A4DA A| @A @@@@} @f8=93@`DE!_0@DEP @p=܈9N8@@@@G998(C8xsHE}`|B(EIHEAU(E4IG99pDB'x@@@< @ 81@ Q"H@O"H@ A< 9@ @@H@,.g9@LB"@H¨"@n(xhq Ȁ@@@0HG(@E9@}H"LDE"OUH"@HDEGDD@(J(/gfJ(RfS(R(m<b($(:jp@mJ(7g>J(Tf,J(Xg0(d@TS(X` f*h6UT]e]X]P!MFS(TJ(3gJ(Sf.J(Wg0(b@SS(W` f(h2TS\c\W8!LBS(SvJDk4CK0("J(*f((P@65D41@1Ch`VvCdK0("J(*f((P@65DDD41@1Ch`Kp0("J(*f((P@1uh6(h<(Ng$JhgSh`>(n1FN1ChJ(;g>J(Uf,J(Yg0(f@US(Y` f,h:VU^g^Y^!NJS(UShNuB9L4ARJ(kJ(kJ(fJ(Qg !`6(h ( g((m<c:<g"4(ZkhjB8ÈKÈ!`(4(ZkB8ÈKÈADJ(fJ(Qg ! `6(h ( g((m<c<<g$4(ZkhjÈKÈ! `* 4(ZkÈKÈABJ(fJ(Qg ! `6(h ( g((m<c<<g$4(ZkhjÈKÈ! `* 4(ZkÈKÈJg* ƈN ƈM&g  ňJk ĈC|JQgp#iSQNuB8Bk!@RNsRNs@F'A   9 9 C#>#FNu@F'A*#  FNu MJfK @f MNuRSNuMJfKJf MNuSSNuNqA.ߘ PfAXJgߐXJgߐXJgߐXJgߐXJgߐP PfA|r"X Qg QgߑC `QA@ Pg4XJgߐXJgߐXJgߐXJgߐXJgߐ PfA C`"A C"AC"!@A"C4"A#J#K#LBAv!R !R!j!j A!S !S!k!k Ar!T !T!l!l A0Nq1|Nq1|Nq f0` f1|` f1|`ABhBhBhV|Q||B(ABNu1| |QShJhrfBhNu||mLxvJ(gBJ(Rf0J(Vg0(`@RS(V` f&hSR[a[V[[[m!KvS(R(m<b(m(u:jp@mJ(g>J(Tf,J(Xg0(d@TS(X` f*hUT]e]X]P!M~S(TJ(gJ(Sf.J(Wg0(b@SS(W` f(hTS\c\W8!LzS(SvJDk,CKp(t(P@65D41@1Ch`FvCKp(t(P@65DDD41@1Ch`K0(tH(P@1uhJ(g>J(Uf,J(Yg0(f@US(Y` f,hVU^g^Y^!NS(UShrNuJfA`<fAb`AIC "qLHrHLHN|Jg@|J)gE|!%Y1Y\i 1i^NuE|!%Y1Y\1i^Nu1h L<.H<>NupM (1v 1vRL<.H<>Nu1h Y#RL<.H<>Nu1h Y$RL<.H<>Nu1h 0(f(HE $rL>H>*H<>NupM $(1v 1vY#L<.H<>NupM (1v 1vY$L<.H<>NupM (1v 1vp(f(HE $rL>H>*H<>Nu1h Y#Y$L<.H<>Nu1h Y#p(f(HE $rL>H>*H<>NuM @0(1v 1vY#Y$L<.H<>NupM (1v 1vY#0(f(HE P$rL>H>*H<>NupM(1v 1vY$p(f(HE $rL>H>*H<>Y# Yf$Eb02( 41BB@1rn1| NNuE02( 41BB@1rn1| NNu1h Y#Y$0(f(HE $rL>H>*H<>NupM(1v 1vY#Y$p(f(HE :$rL>H>*H<>Nu|QM0(1v 1vL<.H<>Nu0(f(HE &rJ(gpMr(1v 1vVNu1k\pMP(1v 1vgE|!@ %k1Y^NuE%k|!1Y^Nu % h  o LHa47c${IvS1vaM;) }voic]XSNJFB>;741.,)'%#! ~}{zyxwvtsrqpomlkjihfedcba`^]\[ZYWVUTSRPONMLKJHGFEDCA@?>=<:987654210/.-,*)('&%#"!     ~}|{zyxvutsrqpnmlkjihgfdcba`_^][ZYXWVUTRQPONMLKIHGFEDCBA?>=<;:9865                       ! " $ % & ' ( * + , - . / 1 2 3 4 5 7 8 9 : ; = > ? @ A C D E F G H J K L M N P Q R S T V W X Y Z \ ] ^ _ ` b c d e f h i j k l n o p q r t u v w x z { | } ~  !!!!!!!!! ! ! ! !!!!!!!!!!!!!!! !!!"!#!%!&!'!(!)!+!,!-!.!0!1!2!3!5!6!7!8!9!;!!@!A!B!C!D!F!G!H!I!K!L!M!N!P!Q!R!S!T!V!W!X!Y![!\!]!^!`!a!b!c!e!f!g!h!i!k!l!m!n!p!q!r!s!u!v!w!x!z!{!|!}!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  0@` $0H` @  0@` (<Px@l $0H` @SYNTHDREAM-II SOUNDPLAY-ROUTINE FOR ST/AMIGA CODED BY LOTUS OF HTL/SYNTHDREAM PLAYER+00=INIT: $0-$FE SONGNR ($FF=END) PLAYER+04=FX: D0=CHANNEL D1=WHICH FX PLAYER+08=FADEOUT: PLAYER+12=FADEIN: PLAYER+16=SPEED FADE (0-255) PLAYER+17=START POSITION FADE (0-15) PLAYER+18=TIMERC ON: PLAYER+22=TIMERC OFF: PLAYER+26=PLAY LOTUS/SYNTHDREAM: LAURENS TUMMERS, KERKSTRAAT 302, 6441 BM BRUNSSUM, HOLLAND. &Lr:Vr@t@@@@@H< @`>>>>>>>>> > > >`) + ) . + ) +`` ) + ) . + )` 1` 0` .` +` + 1 0 . 0 . + . + ) +`` ) + ) . + ) +``` ) + ) . + ) +``` 1 2 5 1 2 5 1 2 5` 1` 0` .` +` + 1 0 . 0 . + . + ) +`` ) + ) . + ) +`` >>>>> >>>>>>7>>`7>7>>`7`7 7 7` 7 7 7 5 7J      J        J      J        ""       (<((<(h            $ / * -       #    $        #   1                                                                                                        &,/246 8 9 : : : : 98642/,(%!         !%(' * Creation des sinus amortis! * DIM dats%(4000) dat$=SPACE$(7000) fin%=1023 FOR comp%=0 TO fin% sinus=SIN(comp%*PI*2/32) IF sinus>0 val%=(15*(fin%-comp%)/fin%)*sinus val2%=(12*(fin%-comp%)/fin%)*sinus ELSE val%=(11*(fin%-comp%)/fin%)*sinus val2%=(8*(fin%-comp%)/fin%)*sinus ENDIF dats%(comp%*3)=val%-50 dats%(comp%*3+1)=val2% dats%(comp%*3+2)=0 PSET comp%,val%+50,3 PSET comp%,val2%+100,2 NEXT comp% ' * Creation Mvt de la main!. * index%=1014 FOR comp%=0 TO 36 val%=59*SIN(comp%*PI/37) dats%(index%*3+2)=val% PSET index%,val%,1 index%=index%+1 IF index%=1024 index%=0 ENDIF NEXT comp% ' * Conversion du tableau!... * adr%=VARPTR(dat$) FOR comp%=0 TO 3071 DPOKE adr%,dats%(comp%) adr%=adr%+2 NEXT comp% adr%=VARPTR(dat$) BSAVE "a:\courbes.xxx",adr%,6144 l;*J ;** Le programme principal! ** ;*J x equ 159 y equ 138 supervisor_mode: ; INDISPENSABLE. move.l #$0,-(sp) move.w #$20,-(sp) trap #$1 addq.l #$6,sp dc.w $a00a ; Bye bye la souris. move.b #$12,$fc02.w bclr.b #$0,$484.w move.w #$0,$452 ; Verouiller la vbl.  screens_adresses: ; Calcul des adresses des ecrans. move.l #screens,d0 and.l #$f00,d0 ; S' aligner sur un multiple de 256. add.l #$100,d0 move.l d0,screen1_ad ; Adresse de l' ecran 1. add.l #$7d00,d0 move.l d0,screen2_ad ; Ecran 2. save_old_features: move.w $f8260.w,old_res move.b $f820a.w,old_sync moveq.l #$0,d0 move.b $f8201.w,d0 ; Base haute. swap.w d0 move.b $f8203.w,d0 ; Moyenne. lsl.w #$8,d0 move.b $f820d.w,d0 ; Basse.( N' existe pas sur ST-STf) move.l d0,old_screen move.l #$7,d0 ; Sauver les couleurs qu'on va modifier. move.l #old_colors,a0 move.w #$8240,a1 .save_cols: move.l (a1)+,(a0)+ dbra d0,.save_cols screen_features: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.w #$0,$f8260.w ; Basse resolution. move.b #$2,$f820a.w ; Sync=50Hz. move.l screen2_ad,d0 ; Mettre l' adresse de l' ecran 2. lsr.w #$8,d0 move.b d0,$f8203.w swap.w d0 move.b d0,$f8201.w move.b #$0,$f820d.w moveq.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $334. move.l #colors,a1 .put_cols: move.l (a1)+,(a0)+ dbra d0,.put_cols prepare_screens: ; Copier le "texte" dans les ecrans. move.l screen1_ad,a0 move.l #text,a1 move.l #919,d0 ; 3680 octets a copier. add.l #28320,a0 ; A mettre a la ligne 177. .copy1: move.l (a1)+,(a0)+ dbra d0,.copy1 ; Ca me dbeqt!. move.l screen2_ad,a0 move.l #text,a1 move.l #919,d0 add.l #28320,a0 .copy2: move.l (a1)+,(a0)+ dbra d0,.copy2 machine_test: move.l $5a0,a0 cmp.l #$0,a0 beq.s .st_stf_ste ; Pas de cookie_jar donc un vieux st. move.l $14(a0),d0 cmp.l #$0,d0 ; _MCH=0 alors c' est un ST-STf. beq.s .st_stf_ste cmp.l #$10,d0 ; _MCH=$10 alors c' est un STe. beq.s .st_stf_ste cmp.l #$10010,d0 ; _MCH=$10010 alors c' est un Mega STe. beq.s .st_stf_ste bra.s .other_compy .st_stf_ste: ; Si on a une de ces machines, on peut move.w #$1,music_flag ; rejouer la music. moveq.l #$0,d0 ; Mais d' abord il faut l' initialiser. bsr music bsr music+18 .other_compy: ; Sinon on laisse le music flag a 0. ;*J move.w #1000,script_pos init_timer_b: bclr.b #$0,$fa07.w ; Timer B disabled!.. bset.b #$0,$fa13.w ; Timer B demasked. bset.b #$3,$fa17.w ; Soft end of interrupt. move.l #timer_b,$120 move.b #$0,$fa1b.w ; Timer B stoppe. bset.b #$0,$fa07.w ; Timer B enabled.  vbl1: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp cmp.w #$0,music_flag ; Rejouer la music? beq.s .no_music bsr music+26 ; Oui. .no_music:  moveq.l #$7,d0 move.w #$8240,a0 ; Couleurs du haut. move.l #colors,a1 .put_cols: move.l (a1)+,(a0)+ dbra d0,.put_cols .timer_b: move.b #$0,$fa1b.w ; Stop the timer. move.b #y+7,$fa21.w ; Wait y lignes. move.b #$8,$fa1b.w ; Event count mode. cmpi.b #$38,$fc02.w bne.s .no_test add.w #$111,$f8240.w .no_test: move.l screen1_ad,a6 move.l #new_coords,a0 move.l #script,a5 move.w script_pos,d0 move.w d0,d1 ext.l d0 add.w d0,d0 add.w d1,d0 add.w d0,d0 ; d0=script_pos*3. add.l d0,a5 ; a5 pointe sur les 3 parametres. addq.w #$1,d1 ; Prochaine position. cmp.w script_length,d1; Script fini? ble.s .script_ok moveq.l #$0,d1 ; Oui, alors recommencer. .script_ok: move.w d1,script_pos .calc: move.w #$ffd1,(a0) ; -47. add.w #x,(a0)+ move.l #$fd100,d0 ; -47*256. divs.w #$14f,d0 ; d0=-47*256/(256+90). add.w #x,d0 move.w d0,(a0)+ move.w #$2f+x,(a0)+ ; 47. move.l #$2f00,d0 ; 47*256. divs.w #$14f,d0 ; d0=47*256/(256+90). add.w #x,d0 move.w d0,(a0)+ move.w (a5)+,d0 ; y. add.w #y,d0 move.w d0,(a0)+ sub.w #y,d0 ext.l d0 lsl.w #$8,d0 divs.w #$14f,d0 ; d0=y*256/(256+90). add.w #y,d0 move.w d0,(a0)+ move.w #$20+y,(a0)+ ; yend=32. move.l #$2000,d0 divs.w #$14f,d0 ; d0=yend*256/(256+90). add.w #y,d0 move.w d0,(a0)+ move.w (a5)+,d0 ; coef. move.w d0,(a0)+ ext.l d0 lsl.w #$8,d0 divs.w #$14f,d0 ; d0=coef*256/(256+90). move.w d0,(a0)+ .clear: move.l a6,a0 move.w old_main1,d0 jsr cls_main move.l a6,a0 move.w old_y1,d0 move.w old_yend1,d1 jsr cls128 move.w new_coords+$8,old_y1 move.w new_coords+$c,old_yend1 .print_jelly_cube: move.w new_coords+$2,d0 move.w new_coords+$a,d1 move.w new_coords+$6,d2 move.w new_coords+$e,d3 move.w new_coords+$12,a1 move.l a6,a0 add.l #$4,a0 ; Jelly du fond sur le plan 2. jsr jelly move.l #buffer,a0 move.w new_coords+$2,(a0)+ move.w new_coords+$e,(a0)+ move.w new_coords,(a0)+ move.w new_coords+$c,(a0)+ move.w new_coords+$4,(a0)+ move.w new_coords+$c,(a0)+ move.w new_coords+$6,(a0)+ move.w new_coords+$e,(a0)+ move.l a6,a0 add.l #$2,a0 ; Poly sur le plan 1. move.l #buffer,a1 move.w #$4,d0 jsr polygone move.l #buffer,a0 move.w new_coords,(a0)+ move.w new_coords+$8,(a0)+ move.w new_coords+$2,(a0)+ move.w new_coords+$a,(a0)+ move.w new_coords+$6,(a0)+ move.w new_coords+$a,(a0)+ move.w new_coords+$4,(a0)+ move.w new_coords+$8,(a0)+ move.l a6,a0 add.l #$2,a0 ; Poly sur le plan 1. move.l #buffer,a1 move.w #$4,d0 jsr polygone  move.w new_coords,d0 move.w new_coords+$8,d1 move.w new_coords+$4,d2 move.w new_coords+$c,d3 move.w new_coords+$10,a1 move.l a6,a0 jsr jelly  .print_la_main: move.w (a5)+,d0 move.w d0,old_main1 move.l a6,a0 jsr main cmpi.b #$38,$fc02.w bne.s .no_test2 sub.w #$111,$f8240.w .no_test2: move.l screen1_ad,d0 ; Ecran de travail. lsr.w #$8,d0 move.b d0,$f8203.w swap.w d0 move.b d0,$f8201.w vbl2: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp cmp.w #$0,music_flag ; Rejouer la music? beq.s .no_music bsr music+26 ; Oui. .no_music: moveq.l #$7,d0 move.w #$8240,a0 ; Couleurs du haut. move.l #colors,a1 .put_cols: move.l (a1)+,(a0)+ dbra d0,.put_cols .timer_b: move.b #$0,$fa1b.w ; Stop the timer. move.b #y+7,$fa21.w ; Wait y lignes. move.b #$8,$fa1b.w ; Event count mode. cmpi.b #$38,$fc02.w bne.s .no_test add.w #$111,$f8240.w .no_test: move.l screen2_ad,a6 move.l #new_coords,a0 move.l #script,a5 move.w script_pos,d0 move.w d0,d1 ext.l d0 add.w d0,d0 add.w d1,d0 add.w d0,d0 ; d0=script_pos*3. add.l d0,a5 ; a5 pointe sur les 3 parametres. addq.w #$1,d1 ; Prochaine position. cmp.w script_length,d1; Script fini? ble.s .script_ok moveq.l #$0,d1 ; Oui, alors recommencer. .script_ok: move.w d1,script_pos .calc: move.w #$ffd1,(a0) ; -47. add.w #x,(a0)+ move.l #$fd100,d0 ; -47*256. divs.w #$14f,d0 ; d0=-47*256/(256+90). add.w #x,d0 move.w d0,(a0)+ move.w #$2f+x,(a0)+ ; 47. move.l #$2f00,d0 ; 47*256. divs.w #$14f,d0 ; d0=47*256/(256+90). add.w #x,d0 move.w d0,(a0)+ move.w (a5)+,d0 ; y. add.w #y,d0 move.w d0,(a0)+ sub.w #y,d0 ext.l d0 lsl.w #$8,d0 divs.w #$14f,d0 ; d0=y*256/(256+90). add.w #y,d0 move.w d0,(a0)+ move.w #$20+y,(a0)+ ; yend=32. move.l #$2000,d0 divs.w #$14f,d0 ; d0=yend*256/(256+90). add.w #y,d0 move.w d0,(a0)+ move.w (a5)+,d0 ; coef. move.w d0,(a0)+ ext.l d0 lsl.w #$8,d0 divs.w #$14f,d0 ; d0=coef*256/(256+90). move.w d0,(a0)+ .clear: move.l a6,a0 move.w old_main2,d0 jsr cls_main move.l a6,a0 move.w old_y2,d0 move.w old_yend2,d1 jsr cls128 move.w new_coords+$8,old_y2 move.w new_coords+$c,old_yend2 .print_jelly_cube: move.w new_coords+$2,d0 move.w new_coords+$a,d1 move.w new_coords+$6,d2 move.w new_coords+$e,d3 move.w new_coords+$12,a1 move.l a6,a0 add.l #$4,a0 ; Jelly du fond sur le plan 2. jsr jelly move.l #buffer,a0 move.w new_coords+$2,(a0)+ move.w new_coords+$e,(a0)+ move.w new_coords ,(a0)+ move.w new_coords+$c,(a0)+ move.w new_coords+$4,(a0)+ move.w new_coords+$c,(a0)+ move.w new_coords+$6,(a0)+ move.w new_coords+$e,(a0)+ move.l a6,a0 add.l #$2,a0 ; Poly sur le plan 1. move.l #buffer,a1 move.w #$4,d0 jsr polygone move.l #buffer,a0 move.w new_coords,(a0)+ move.w new_coords+$8,(a0)+ move.w new_coords+$2,(a0)+ move.w new_coords+$a,(a0)+ move.w new_coords+$6,(a0)+ move.w new_coords+$a,(a0)+ move.w new_coords+$4,(a0)+ move.w new_coords+$8,(a0)+ move.l a6,a0 add.l #$2,a0 ; Poly sur le plan 1. move.l #buffer,a1 move.w #$4,d0 jsr polygone  move.w new_coords,d0 move.w new_coords+$8,d1 move.w new_coords+$4,d2 move.w new_coords+$c,d3 move.w new_coords+$10,a1 move.l a6,a0 jsr jelly  .print_la_main: move.w (a5)+,d0 move.w d0,old_main2 move.l a6,a0 jsr main cmpi.b #$38,$fc02.w bne.s .no_test2 sub.w #$111,$f8240.w .no_test2: move.l screen2_ad,d0 ; Ecran de travail. lsr.w #$8,d0 move.b d0,$f8203.w swap.w d0 move.b d0,$f8201.w cmpi.b #$39,$fc02.w bne vbl1 stop_music: cmp.w #$0,music_flag ; La music etait active? beq.s .music_not_played moveq.l #-$1,d0 bsr music bsr music+22 .music_not_played: ;*J sortie: move.w #$25,-(sp) ; Attendre la vbl. trap #$e addq.l #$2,sp move.w old_res,$f8260.w move.b old_sync,$f820a.w move.l old_screen,d0 swap.w d0 move.b d0,$f8201.w ; Le pire c' est qu'il faut mettre swap.w d0 ; $ff820d en dernier. rol.w #$8,d0 move.b d0,$f8203.w rol.w #$8,d0 move.b d0,$f820d.w move.l #$7,d0 move.w #$8240,a0 ; Mettre les couleurs a $334. move.l #old_colors,a1 .restore_cols: move.l (a1)+,(a0)+ dbra d0,.restore_cols move.w #$1,$452 ; Deverouiller la vbl. bset.b #$0,$484.w move.b #$8,$fc02.w dc.w $a009 ; Le tank est de retour! clr.w -(sp) trap #$1 ;*J timer_b: move.b #$0,$fa1b.w ; Stop the timer. move.l a0,-(sp) move.l a1,-(sp) move.w #$8240,a0 ; Couleurs du bas. move.l #low_colors,a1 move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (sp)+,a1 move.l (sp)+,a0 bclr.b #$0,$fa0f.w ; Interruption finie. rte ;*J main: include 'a:\jelly\main.s' Section TEXT cls_main: include 'a:\jelly\cls_main.s' Section TEXT cls128: include 'a:\jelly\cls128.s' Section TEXT jelly: include 'a:\jelly\jelly.s' Section TEXT polygone: include 'a:\jelly\polygone.s' ;*J Section DATA text: incbin 'a:\jelly\text.xxx' colors: dc.w $334,$253,$000,$142 dc.w $000,$132,$000,$132 dc.w $223,$122,$420,$130 dc.w $532,$130,$754,$351 low_colors: dc.w $aab,$95a,$000,$8b9 dc.w $000,$8a9,$000,$8a9 dc.w $99a,$223,$000,$000 dc.w $000,$000,$66f,$000 script_length: dc.w 1023 script: incbin 'a:\jelly\courbes.xxx' music_flag: dc.w 0 music: incbin 'a:\jelly\groovy.mus' ;*J Section BSS buffer: ds.w 16 old_main1: ds.w 1 old_y1: ds.w 1 old_yend1: ds.w 1 old_main2: ds.w 1 old_y2: ds.w 1 old_yend2: ds.w 1 script_pos: ds.w 1 new_coords: ds.w 10 old_res: ds.w 1 old_sync: ds.w 1 old_screen: ds.l 1 old_colors: ds.l 8 screen1_ad: ds.l 1 screen2_ad: ds.l 1 screens: ds.l 16064  .  `.. POLY_STFS z`2POLY_STES O`DRAW_STES -!?b; */ ; ** Routine de poly par Dracula/Positivity. ** ; ** 03-10-93. ** ; */ ; Appel: a0.l = adresse ramvideo. ; a1.l = adresse des coords des sommets. ; d0.w = nb de sommets. movem.l d0-d6/a0-a5,-(sp) ;*M .search_min_max: ; Rechercher ymin,ymax,pos de ymin. move.l a1,a3 addq.l #$2,a3 ; Se positionner sur les coords y. move.w (a3),d1 ; d1=ymax. move.l d1,d2 ; d2=ymin. sub.l a2,a2 ; a2=position de ymin. moveq.l #$1,d3 ; d3=position de y actuel. .search: addq.l #$4,a3 ; Prochain sommet. move.w (a3),d4 ; d4=y actuel. cmp.w d4,d2 ; y actuelymax? bge.s .not_ymax move.w d4,d1 ; Oui, alors c' est le nouveau ymax. .not_ymax: addq.l #$1,d3 ; Passer a la prochaine position. cmp.w d3,d0 ; Pos=nbre de sommets? bne.s .search ; Sinon ce n' est pas le dernier. ;*M .poly_visibility: ; Polygone a l' interieur de l' ecran? cmp.w #$0,d1 ; Est-ce que ymax<0? blt .end ; Si oui le poly n' est pas dans l' ecran. cmp.w #$c7,d2 ; ymin>199? bgt .end ; Meme remarque. ;*M .poly_clipping: moveq.l #$0,d3 ; On va calculer dans d3 le nombre de move.w d1,d3 ; h_lines a tracer reellement. sub.w d2,d3 ; d3=ymax-ymin. move.w d2,d4 ; Dans d4 la premier h_line ou tracer. moveq.l #$0,d5 ; d5=premier xmin_xmax a utiliser. .top_clipping: ; Le poly sort de l' ecran en haut? cmp.w #$0,d2 ; ymin<0? bge.s .bottom_clipping move.w d2,d5 ; Oui, alors le nombre de xmin_xmax a neg.w d5 ; passer est -ymin! moveq.l #$0,d4 ; Tracer a partir de la ligne 0. add.w d2,d3 ; nb_hlines a tracer=ymax. .bottom_clipping: ; Le poly sort de l' ecran en bas? cmp.w #$c7,d1 ; yamx>199? ble.s .end_clipping add.w #$c7,d3 ; Oui=>couper ce qui depasse. (ymax-199) sub.w d1,d3 ; d3=d3+199-ymax. .end_clipping: move.w d3,.nb_hlines ; Sauver les valeurs trouvees. move.w d4,.first_hline move.w d5,.first_xmin ;*M .xmins_calc: move.l #.xmins,a3 ; On y stockera les coords. move.l a2,a4 add.l a4,a4 add.l a4,a4 ; a4=ymin_pos*4. add.l a1,a4 ; a4 pointe sur sommet ymin. move.l a2,a5 ; a5=position du point actuel. .xmin_one_line: move.w (a4)+,d2 ; d2=x1. move.w (a4)+,d3 ; d3=y1. addq.l #$1,a5 ; Position du point d' apres. cmp.w a5,d0 ; En dehors du tableau? bne.s .xmin_pos_ok move.l a1,a4 ; Si oui on repars du debut du tableau, sub.l a5,a5 ; a la position 0. .xmin_pos_ok: move.w (a4),d4 ; d4=x2. move.w $2(a4),d5 ; d5=y2. sub.w d3,d5 ; d5=dy=y2-y1, toujours positif. beq.s .xmin_hline sub.w d2,d4 ; d4=x2-x1. bmi.s .xmin_dxneg bgt .xmin_dxpos ;* .xmin_vline: ; Droite verticale. add.w d2,d2 add.w d2,d2 ; d2=x1*4. .xmin_v_one: ; Il y a d5+1 xmins a sauver. move.w d2,(a3)+ dbra d5,.xmin_v_one .xmin_vh_next: ; La ligne est finie. subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmin. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne.s .xmin_one_line bra .xmin_end ;**** .xmin_hline: ; Ligne horizontal, xmin=min(x1,x2). cmp.w d2,d4 ; Lequel est le plus petit? bge.s .min_hline_ok exg.l d2,d4 .min_hline_ok: ; Ici d2 contient le plus petit. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; Sauver xmin. bra.s .xmin_vh_next ;* .xmin_dxneg: ; Sauver xmin juste avant le chgt de y. neg.w d4 ; d4=dx=abs(x2-x1). add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d5,d3 ; d3=nb de xmin a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .min_neg_big .min_neg_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur. ble.s .min_neg_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_neg_low_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .min_neg_low_epos .min_neg_low_eneg: ; Eneg, deplct horizontal puis diagonal. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_neg_low_epos bra.s .min_neg_low_eneg .min_neg_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_neg_vlow_eneg: ; Eneg, deplct horizontal. subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .min_neg_vlow_eneg .min_neg_vlow_epos: ; Epos, diagonale puis horizontale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_neg_vlow_epos bra.s .min_neg_vlow_eneg .xmin_neg_next: cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmin_one_line move.w (a4),d2 ; Si oui, mettre le dernier point. add.w d2,d2 add.w d2,d2 move.w d2,(a3)+ bra .xmin_end  .min_neg_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .min_neg_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_neg_big_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .min_neg_big_epos .min_neg_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. bmi.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_neg_big_epos bra.s .min_neg_big_eneg .min_neg_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_neg_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .min_neg_vbig_eneg .min_neg_vbig_epos: ; Epos, diagonale puis verticale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_neg_vbig_epos bra.s .min_neg_vbig_eneg ;* .xmin_dxpos: ; Sauver xmin juste apres le chgt de y. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; x1=premier xmin. move.w d5,d3 ; d3=nb de xmin a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .min_pos_big .min_pos_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur. ble.s .min_pos_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_pos_low_epos: ; Epos, deplacement sur la diagonale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .min_pos_low_epos .min_pos_low_eneg: ; Eneg, deplct horizontal puis diagonal. addq.w #$4,d2 ; x=x+sx. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_pos_low_epos bra.s .min_pos_low_eneg .min_pos_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_pos_vlow_eneg: ; Eneg, deplct horizontal. addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .min_pos_vlow_eneg .min_pos_vlow_epos: ; Epos, diagonale puis horizontale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_pos_vlow_epos bra.s .min_pos_vlow_eneg  .xmin_pos_next: subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmin. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmin_one_line bra.s .xmin_end .min_pos_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .min_pos_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_pos_big_epos: ; Epos, deplacement sur la diagonale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .min_pos_big_epos .min_pos_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_pos_big_epos bra.s .min_pos_big_eneg .min_pos_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_pos_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .min_pos_vbig_eneg .min_pos_vbig_epos: ; Epos, diagonale puis verticale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_pos_vbig_epos bra.s .min_pos_vbig_eneg  .xmin_end: ;*M .xmaxs_calc: move.l #.xmaxs,a3 ; On y stockera les coords. move.l a2,a4 add.l a4,a4 add.l a4,a4 ; a4=ymax_pos*4. add.l a1,a4 ; a4 pointe sur sommet ymax. move.l a2,a5 ; a5=position du point actuel. .xmax_one_line: move.w (a4)+,d2 ; d2=x1. move.w (a4)+,d3 ; d3=y1. subq.l #$8,a4 ; Point d' avant. subq.l #$1,a5 ; Position du point d' avant. cmp.w #$0,a5 ; En dehors du tableau? bpl.s .xmax_pos_ok ext.l d0 subq.l #$1,d0 move.l d0,a5 ; Si oui on repars de la fin du tableau. add.l d0,d0 add.l d0,d0 move.l a1,a4 add.l d0,a4 .xmax_pos_ok: move.w (a4),d4 ; d4=x2. move.w $2(a4),d5 ; d5=y2. sub.w d3,d5 ; d5=dy=y2-y1, toujours positif. beq.s .xmax_hline sub.w d2,d4 ; d4=x2-x1. bmi.s .xmax_dxneg bgt .xmax_dxpos ;* .xmax_vline: ; Droite verticale. add.w d2,d2 add.w d2,d2 ; d2=x1*4. .xmax_v_one: ; Il y a d5+1 xmaxs a sauver. move.w d2,(a3)+ dbra d5,.xmax_v_one .xmax_vh_next: ; La ligne est finie. subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmax. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne.s .xmax_one_line bra .xmax_end ;* .xmax_hline: ; Ligne horizontal, xmax=max(x1,x2). cmp.w d2,d4 ; Lequel est le plus grand? bmi.s .max_hline_ok exg.l d2,d4 .max_hline_ok: ; Ici d2 contient le plus grand. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; Sauver xmax. bra.s .xmax_vh_next ;* .xmax_dxneg: ; Sauver xmax juste apres le chgt de y. neg.w d4 ; d4=abs(x2-x1). add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; x1=premier xmax. move.w d5,d3 ; d3=nb de xmax a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .max_neg_big .max_neg_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur.  ble.s .max_neg_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_neg_low_epos: ; Epos, deplacement sur la diagonale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .max_neg_low_epos .max_neg_low_eneg: ; Eneg, deplct horizontal puis diagonal. subq.w #$4,d2 ; x=x+sx. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_neg_low_epos bra.s .max_neg_low_eneg .max_neg_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_neg_vlow_eneg: ; Eneg, deplct horizontal. subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .max_neg_vlow_eneg .max_neg_vlow_epos: ; Epos, diagonale puis horizontale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_neg_vlow_epos bra.s .max_neg_vlow_eneg  .xmax_neg_next: subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmax. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmax_one_line bra .xmax_end .max_neg_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .max_neg_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_neg_big_epos: ; Epos, deplacement sur la diagonale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .max_neg_big_epos .max_neg_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_neg_big_epos bra.s .max_neg_big_eneg .max_neg_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_neg_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .max_neg_vbig_eneg .max_neg_vbig_epos: ; Epos, diagonale puis verticale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_neg_vbig_epos bra.s .max_neg_vbig_eneg ;* .xmax_dxpos: ; Sauver xmax juste avant le chgt de y. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d5,d3 ; d3=nb de xmax a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .max_pos_big .max_pos_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur. ble.s .max_pos_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_pos_low_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .max_pos_low_epos .max_pos_low_eneg: ; Eneg, deplct horizontal puis diagonal. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_pos_low_epos bra.s .max_pos_low_eneg .max_pos_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_pos_vlow_eneg: ; Eneg, deplct horizontal. addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .max_pos_vlow_eneg .max_pos_vlow_epos: ; Epos, diagonale puis horizontale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_pos_vlow_epos bra.s .max_pos_vlow_eneg .xmax_pos_next: cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmax_one_line move.w (a4),d2 ; Si oui, mettre le dernier point. add.w d2,d2 add.w d2,d2 move.w d2,(a3)+ bra.s .xmax_end  .max_pos_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .max_pos_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_pos_big_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .max_pos_big_epos .max_pos_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. bmi.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_pos_big_epos bra.s .max_pos_big_eneg .max_pos_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_pos_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .max_pos_vbig_eneg .max_pos_vbig_epos: ; Epos, diagonale puis verticale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_pos_vbig_epos bra.s .max_pos_vbig_eneg  .xmax_end: ;*M .drawpoly: move.w .first_hline,d4 ext.l d4 move.w d4,d0 add.w d0,d0 add.w d0,d0 add.w d0,d4 lsl.w #$5,d4 ; d4=first_hline*$a0. add.l a0,d4 ; d4 pointe sur la premier ligne. move.l #.xmins,a0 move.l #.xmaxs,a1 move.l #.xmin_table,a2 move.l #.xmax_table,a3 move.l #.adresses,a4  move.w .first_xmin,d0 add.w d0,d0 add.w d0,a0 ; Aligner a0,a1 sur les premiers add.w d0,a1 ; xmin-xmax a utiliser! move.w .nb_hlines,d0 ; Nombre de lignes a tracer. move.l #$f,d1 move.l #$a0,d5 ; Taille d' une ligne. .one_line: move.w (a0)+,d2 ; d2=xmin*4. move.w (a1)+,d3 ; d3=xmax*4. move.l (a2,d2.w),d2 ; d2=motif/adresse de depart. move.l (a3,d3.w),d3 ; d3=motif/adresse d'arrivee. sub.w d2,d3 move.l (a4,d3.w),a5 ; Adresse de la routine. swap.w d3 ; d3.w=motif d' arrivee. jmp (a5) .step_0: move.l d4,a5 add.l d5,d4 ; Ligne suivante. add.w d2,a5 ; a5 pointe sur le premier mot. swap.w d2 and.w d2,d3 ; Motif. or.w d3,(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_1: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) or.w d3,$8(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_2: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) or.w d3,$10(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_3: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) or.w d3,$18(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_4: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) or.w d3,$20(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_5: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) or.w d3,$28(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_6: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) or.w d3,$30(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_7: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) or.w d3,$38(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_8: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) or.w d3,$40(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_9: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) or.w d3,$48(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_10: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) or.w d3,$50(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_11: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) or.w d3,$58(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_12: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) or.w d3,$60(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_13: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) move.w d1,$60(a5) or.w d3,$68(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_14: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) move.w d1,$60(a5) move.w d1,$68(a5) or.w d3,$70(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_15: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) move.w d1,$60(a5) move.w d1,$68(a5) move.w d1,$70(a5) or.w d3,$78(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_16: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) move.w d1,$60(a5) move.w d1,$68(a5) move.w d1,$70(a5) move.w d1,$78(a5) or.w d3,$80(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_17: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) move.w d1,$60(a5) move.w d1,$68(a5) move.w d1,$70(a5) move.w d1,$78(a5) move.w d1,$80(a5) or.w d3,$88(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_18: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) move.w d1,$60(a5) move.w d1,$68(a5) move.w d1,$70(a5) move.w d1,$78(a5) move.w d1,$80(a5) move.w d1,$88(a5) or.w d3,$90(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .step_19: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) move.w d1,$40(a5) move.w d1,$48(a5) move.w d1,$50(a5) move.w d1,$58(a5) move.w d1,$60(a5) move.w d1,$68(a5) move.w d1,$70(a5) move.w d1,$78(a5) move.w d1,$80(a5) move.w d1,$88(a5) move.w d1,$90(a5) or.w d3,$98(a5) dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts .end: movem.l (sp)+,d0-d6/a0-a5 rts .bad_step: ; Sometimes dx is negative. dbra d0,.one_line movem.l (sp)+,d0-d6/a0-a5 rts  ;*M Section DATA dc.l .bad_step,.bad_step .adresses: dc.l .step_0,.step_0,.step_1,.step_1 dc.l .step_2,.step_2,.step_3,.step_3 dc.l .step_4,.step_4,.step_5,.step_5 dc.l .step_6,.step_6,.step_7,.step_7 dc.l .step_8,.step_8,.step_9,.step_9 dc.l .step_10,.step_10,.step_11,.step_11 dc.l .step_12,.step_12,.step_13,.step_13 dc.l .step_14,.step_14,.step_15,.step_15 dc.l .step_16,.step_16,.step_17,.step_17 dc.l .step_18,.step_18,.step_19,.step_19 rept 256 dc.w $00,$fff8 endr .xmin_table: dc.w $f,$00,$7fff,$00,$3fff,$00,$1fff,$00 dc.w $0fff,$00,$07ff,$00,$03ff,$00,$01ff,$00 dc.w $00ff,$00,$007f,$00,$003f,$00,$001f,$00 dc.w $000f,$00,$0007,$00,$0003,$00,$0001,$00 dc.w $f,$08,$7fff,$08,$3fff,$08,$1fff,$08 dc.w $0fff,$08,$07ff,$08,$03ff,$08,$01ff,$08 dc.w $00ff,$08,$007f,$08,$003f,$08,$001f,$08 dc.w $000f,$08,$0007,$08,$0003,$08,$0001,$08 dc.w $f,$10,$7fff,$10,$3fff,$10,$1fff,$10 dc.w $0fff,$10,$07ff,$10,$03ff,$10,$01ff,$10 dc.w $00ff,$10,$007f,$10,$003f,$10,$001f,$10 dc.w $000f,$10,$0007,$10,$0003,$10,$0001,$10 dc.w $f,$18,$7fff,$18,$3fff,$18,$1fff,$18 dc.w $0fff,$18,$07ff,$18,$03ff,$18,$01ff,$18 dc.w $00ff,$18,$007f,$18,$003f,$18,$001f,$18 dc.w $000f,$18,$0007,$18,$0003,$18,$0001,$18 dc.w $f,$20,$7fff,$20,$3fff,$20,$1fff,$20 dc.w $0fff,$20,$07ff,$20,$03ff,$20,$01ff,$20 dc.w $00ff,$20,$007f,$20,$003f,$20,$001f,$20 dc.w $000f,$20,$0007,$20,$0003,$20,$0001,$20 dc.w $f,$28,$7fff,$28,$3fff,$28,$1fff,$28 dc.w $0fff,$28,$07ff,$28,$03ff,$28,$01ff,$28 dc.w $00ff,$28,$007f,$28,$003f,$28,$001f,$28 dc.w $000f,$28,$0007,$28,$0003,$28,$0001,$28 dc.w $f,$30,$7fff,$30,$3fff,$30,$1fff,$30 dc.w $0fff,$30,$07ff,$30,$03ff,$30,$01ff,$30 dc.w $00ff,$30,$007f,$30,$003f,$30,$001f,$30 dc.w $000f,$30,$0007,$30,$0003,$30,$0001,$30 dc.w $f,$38,$7fff,$38,$3fff,$38,$1fff,$38 dc.w $0fff,$38,$07ff,$38,$03ff,$38,$01ff,$38 dc.w $00ff,$38,$007f,$38,$003f,$38,$001f,$38 dc.w $000f,$38,$0007,$38,$0003,$38,$0001,$38 dc.w $f,$40,$7fff,$40,$3fff,$40,$1fff,$40 dc.w $0fff,$40,$07ff,$40,$03ff,$40,$01ff,$40 dc.w $00ff,$40,$007f,$40,$003f,$40,$001f,$40 dc.w $000f,$40,$0007,$40,$0003,$40,$0001,$40 dc.w $f,$48,$7fff,$48,$3fff,$48,$1fff,$48 dc.w $0fff,$48,$07ff,$48,$03ff,$48,$01ff,$48 dc.w $00ff,$48,$007f,$48,$003f,$48,$001f,$48 dc.w $000f,$48,$0007,$48,$0003,$48,$0001,$48 dc.w $f,$50,$7fff,$50,$3fff,$50,$1fff,$50 dc.w $0fff,$50,$07ff,$50,$03ff,$50,$01ff,$50 dc.w $00ff,$50,$007f,$50,$003f,$50,$001f,$50 dc.w $000f,$50,$0007,$50,$0003,$50,$0001,$50 dc.w $f,$58,$7fff,$58,$3fff,$58,$1fff,$58 dc.w $0fff,$58,$07ff,$58,$03ff,$58,$01ff,$58 dc.w $00ff,$58,$007f,$58,$003f,$58,$001f,$58 dc.w $000f,$58,$0007,$58,$0003,$58,$0001,$58 dc.w $f,$60,$7fff,$60,$3fff,$60,$1fff,$60 dc.w $0fff,$60,$07ff,$60,$03ff,$60,$01ff,$60 dc.w $00ff,$60,$007f,$60,$003f,$60,$001f,$60 dc.w $000f,$60,$0007,$60,$0003,$60,$0001,$60 dc.w $f,$68,$7fff,$68,$3fff,$68,$1fff,$68 dc.w $0fff,$68,$07ff,$68,$03ff,$68,$01ff,$68 dc.w $00ff,$68,$007f,$68,$003f,$68,$001f,$68 dc.w $000f,$68,$0007,$68,$0003,$68,$0001,$68 dc.w $f,$70,$7fff,$70,$3fff,$70,$1fff,$70 dc.w $0fff,$70,$07ff,$70,$03ff,$70,$01ff,$70 dc.w $00ff,$70,$007f,$70,$003f,$70,$001f,$70 dc.w $000f,$70,$0007,$70,$0003,$70,$0001,$70 dc.w $f,$78,$7fff,$78,$3fff,$78,$1fff,$78 dc.w $0fff,$78,$07ff,$78,$03ff,$78,$01ff,$78 dc.w $00ff,$78,$007f,$78,$003f,$78,$001f,$78 dc.w $000f,$78,$0007,$78,$0003,$78,$0001,$78 dc.w $f,$80,$7fff,$80,$3fff,$80,$1fff,$80 dc.w $0fff,$80,$07ff,$80,$03ff,$80,$01ff,$80 dc.w $00ff,$80,$007f,$80,$003f,$80,$001f,$80 dc.w $000f,$80,$0007,$80,$0003,$80,$0001,$80 dc.w $ffff,$88,$7fff,$88,$3fff,$88,$1fff,$88 dc.w $0fff,$88,$07ff,$88,$03ff,$88,$01ff,$88 dc.w $00ff,$88,$007f,$88,$003f,$88,$001f,$88 dc.w $000f,$88,$0007,$88,$0003,$88,$0001,$88 dc.w $ffff,$90,$7fff,$90,$3fff,$90,$1fff,$90 dc.w $0fff,$90,$07ff,$90,$03ff,$90,$01ff,$90 dc.w $00ff,$90,$007f,$90,$003f,$90,$001f,$90 dc.w $000f,$90,$0007,$90,$0003,$90,$0001,$90 dc.w $ffff,$98,$7fff,$98,$3fff,$98,$1fff,$98 dc.w $0fff,$98,$07ff,$98,$03ff,$98,$01ff,$98 dc.w $00ff,$98,$007f,$98,$003f,$98,$001f,$98 dc.w $000f,$98,$0007,$98,$0003,$98,$0001,$98 rept 256 dc.w $00,$a0 endr rept 256 dc.w $00,$fff8 endr .xmax_table: dc.w $8000,$00,$c000,$00,$e000,$00,$f000,$00 dc.w $f800,$00,$fc00,$00,$fe00,$00,$ff00,$00 dc.w $ff80,$00,$ffc0,$00,$ffe0,$00,$fff0,$00 dc.w $fff8,$00,$fffc,$00,$fffe,$00,$ffff,$00 dc.w $8000,$08,$c000,$08,$e000,$08,$f000,$08 dc.w $f800,$08,$fc00,$08,$fe00,$08,$ff00,$08 dc.w $ff80,$08,$ffc0,$08,$ffe0,$08,$fff0,$08 dc.w $fff8,$08,$fffc,$08,$fffe,$08,$ffff,$08 dc.w $8000,$10,$c000,$10,$e000,$10,$f000,$10 dc.w $f800,$10,$fc00,$10,$fe00,$10,$ff00,$10 dc.w $ff80,$10,$ffc0,$10,$ffe0,$10,$fff0,$10 dc.w $fff8,$10,$fffc,$10,$fffe,$10,$ffff,$10 dc.w $8000,$18,$c000,$18,$e000,$18,$f000,$18 dc.w $f800,$18,$fc00,$18,$fe00,$18,$ff00,$18 dc.w $ff80,$18,$ffc0,$18,$ffe0,$18,$fff0,$18 dc.w $fff8,$18,$fffc,$18,$fffe,$18,$ffff,$18 dc.w $8000,$20,$c000,$20,$e000,$20,$f000,$20 dc.w $f800,$20,$fc00,$20,$fe00,$20,$ff00,$20 dc.w $ff80,$20,$ffc0,$20,$ffe0,$20,$fff0,$20 dc.w $fff8,$20,$fffc,$20,$fffe,$20,$ffff,$20 dc.w $8000,$28,$c000,$28,$e000,$28,$f000,$28 dc.w $f800,$28,$fc00,$28,$fe00,$28,$ff00,$28 dc.w $ff80,$28,$ffc0,$28,$ffe0,$28,$fff0,$28 dc.w $fff8,$28,$fffc,$28,$fffe,$28,$ffff,$28 dc.w $8000,$30,$c000,$30,$e000,$30,$f000,$30 dc.w $f800,$30,$fc00,$30,$fe00,$30,$ff00,$30 dc.w $ff80,$30,$ffc0,$30,$ffe0,$30,$fff0,$30 dc.w $fff8,$30,$fffc,$30,$fffe,$30,$ffff,$30 dc.w $8000,$38,$c000,$38,$e000,$38,$f000,$38 dc.w $f800,$38,$fc00,$38,$fe00,$38,$ff00,$38 dc.w $ff80,$38,$ffc0,$38,$ffe0,$38,$fff0,$38 dc.w $fff8,$38,$fffc,$38,$fffe,$38,$ffff,$38 dc.w $8000,$40,$c000,$40,$e000,$40,$f000,$40 dc.w $f800,$40,$fc00,$40,$fe00,$40,$ff00,$40 dc.w $ff80,$40,$ffc0,$40,$ffe0,$40,$fff0,$40 dc.w $fff8,$40,$fffc,$40,$fffe,$40,$ffff,$40 dc.w $8000,$48,$c000,$48,$e000,$48,$f000,$48 dc.w $f800,$48,$fc00,$48,$fe00,$48,$ff00,$48 dc.w $ff80,$48,$ffc0,$48,$ffe0,$48,$fff0,$48 dc.w $fff8,$48,$fffc,$48,$fffe,$48,$ffff,$48 dc.w $8000,$50,$c000,$50,$e000,$50,$f000,$50 dc.w $f800,$50,$fc00,$50,$fe00,$50,$ff00,$50 dc.w $ff80,$50,$ffc0,$50,$ffe0,$50,$fff0,$50 dc.w $fff8,$50,$fffc,$50,$fffe,$50,$ffff,$50 dc.w $8000,$58,$c000,$58,$e000,$58,$f000,$58 dc.w $f800,$58,$fc00,$58,$fe00,$58,$ff00,$58 dc.w $ff80,$58,$ffc0,$58,$ffe0,$58,$fff0,$58 dc.w $fff8,$58,$fffc,$58,$fffe,$58,$ffff,$58 dc.w $8000,$60,$c000,$60,$e000,$60,$f000,$60 dc.w $f800,$60,$fc00,$60,$fe00,$60,$ff00,$60 dc.w $ff80,$60,$ffc0,$60,$ffe0,$60,$fff0,$60 dc.w $fff8,$60,$fffc,$60,$fffe,$60,$ffff,$60 dc.w $8000,$68,$c000,$68,$e000,$68,$f000,$68 dc.w $f800,$68,$fc00,$68,$fe00,$68,$ff00,$68 dc.w $ff80,$68,$ffc0,$68,$ffe0,$68,$fff0,$68 dc.w $fff8,$68,$fffc,$68,$fffe,$68,$ffff,$68 dc.w $8000,$70,$c000,$70,$e000,$70,$f000,$70 dc.w $f800,$70,$fc00,$70,$fe00,$70,$ff00,$70 dc.w $ff80,$70,$ffc0,$70,$ffe0,$70,$fff0,$70 dc.w $fff8,$70,$fffc,$70,$fffe,$70,$ffff,$70 dc.w $8000,$78,$c000,$78,$e000,$78,$f000,$78 dc.w $f800,$78,$fc00,$78,$fe00,$78,$ff00,$78 dc.w $ff80,$78,$ffc0,$78,$ffe0,$78,$fff0,$78 dc.w $fff8,$78,$fffc,$78,$fffe,$78,$ffff,$78 dc.w $8000,$80,$c000,$80,$e000,$80,$f000,$80 dc.w $f800,$80,$fc00,$80,$fe00,$80,$ff00,$80 dc.w $ff80,$80,$ffc0,$80,$ffe0,$80,$fff0,$80 dc.w $fff8,$80,$fffc,$80,$fffe,$80,$ffff,$80 dc.w $8000,$88,$c000,$88,$e000,$88,$f000,$88 dc.w $f800,$88,$fc00,$88,$fe00,$88,$ff00,$88 dc.w $ff80,$88,$ffc0,$88,$ffe0,$88,$fff0,$88 dc.w $fff8,$88,$fffc,$88,$fffe,$88,$ffff,$88 dc.w $8000,$90,$c000,$90,$e000,$90,$f000,$90 dc.w $f800,$90,$fc00,$90,$fe00,$90,$ff00,$90 dc.w $ff80,$90,$ffc0,$90,$ffe0,$90,$fff0,$90 dc.w $fff8,$90,$fffc,$90,$fffe,$90,$ffff,$90 dc.w $8000,$98,$c000,$98,$e000,$98,$f000,$98 dc.w $f800,$98,$fc00,$98,$fe00,$98,$ff00,$98 dc.w $ff80,$98,$ffc0,$98,$ffe0,$98,$fff0,$98 dc.w $fff8,$98,$fffc,$98,$fffe,$98,$ffff,$98 rept D256 dc.w $00,$a0 endr ;*M Section BSS .nb_hlines: ds.w 1 .first_hline: ds.w 1 .first_xmin: ds.w 1 .xmins: ; Si on a plus de 512 xmins=bleme. ds.w $400 .xmaxs: ; Meme remarque. ds.w $400  ; */ ; ** Routine de poly par Dracula/Positivity. ** ; ** 03-10-93. ** ; */ ; Appel: a0.l = adresse ramvideo. ; a1.l = adresse des coords des sommets. ; d0.w = nb de sommets. movem.l d0-a6,-(sp) ;*M .search_min_max: ; Rechercher ymin,ymax,pos de ymin. move.l a1,a3 addq.l #$2,a3 ; Se positionner sur les coords y. move.w (a3),d1 ; d1=ymax. move.l d1,d2 ; d2=ymin. sub.l a2,a2 ; a2=position de ymin. moveq.l #$1,d3 ; d3=position de y actuel. .search: addq.l #$4,a3 ; Prochain sommet. move.w (a3),d4 ; d4=y actuel. cmp.w d4,d2 ; y actuelymax? bge.s .not_ymax move.w d4,d1 ; Oui, alors c' est le nouveau ymax. .not_ymax: addq.l #$1,d3 ; Passer a la prochaine position. cmp.w d3,d0 ; Pos=nbre de sommets? bne.s .search ; Sinon ce n' est pas le dernier. ;*M .poly_visibility: ; Polygone a l' interieur de l' ecran? cmp.w #$0,d1 ; Est-ce que ymax<0? blt .end ; Si oui le poly n' est pas dans l' ecran. cmp.w #$c7,d2 ; ymin>199? bgt .end ; Meme remarque. ;*M .poly_clipping: moveq.l #$0,d3 ; On va calculer dans d3 le nombre de move.w d1,d3 ; h_lines a tracer reellement. sub.w d2,d3 ; d3=ymax-ymin. move.w d2,d4 ; Dans d4 la premier h_line ou tracer. moveq.l #$0,d5 ; d5=premier xmin_xmax a utiliser. .top_clipping: ; Le poly sort de l' ecran en haut? cmp.w #$0,d2 ; ymin<0? bge.s .bottom_clipping move.w d2,d5 ; Oui, alors le nombre de xmin_xmax a neg.w d5 ; passer est -ymin! moveq.l #$0,d4 ; Tracer a partir de la ligne 0. add.w d2,d3 ; nb_hlines a tracer=ymax. .bottom_clipping: ; Le poly sort de l' ecran en bas? cmp.w #$c7,d1 ; yamx>199? ble.s .end_clipping add.w #$c7,d3 ; Oui=>couper ce qui depasse. (ymax-199) sub.w d1,d3 ; d3=d3+199-ymax. .end_clipping: move.w d3,.nb_hlines ; Sauver les valeurs trouvees. move.w d4,.first_hline move.w d5,.first_xmin ;*M .xmins_calc: move.l #.xmins,a3 ; On y stockera les coords. move.l a2,a4 add.l a4,a4 add.l a4,a4 ; a4=ymin_pos*4. add.l a1,a4 ; a4 pointe sur sommet ymin. move.l a2,a5 ; a5=position du point actuel. .xmin_one_line: move.w (a4)+,d2 ; d2=x1. move.w (a4)+,d3 ; d3=y1. addq.l #$1,a5 ; Position du point d' apres. cmp.w a5,d0 ; En dehors du tableau? bne.s .xmin_pos_ok move.l a1,a4 ; Si oui on repars du debut du tableau, sub.l a5,a5 ; a la position 0. .xmin_pos_ok: move.w (a4),d4 ; d4=x2. move.w $2(a4),d5 ; d5=y2. sub.w d3,d5 ; d5=dy=y2-y1, toujours positif. beq.s .xmin_hline sub.w d2,d4 ; d4=x2-x1. bmi.s .xmin_dxneg bgt .xmin_dxpos ;* .xmin_vline: ; Droite verticale. add.w d2,d2 add.w d2,d2 ; d2=x1*4. .xmin_v_one: ; Il y a d5+1 xmins a sauver. move.w d2,(a3)+ dbra d5,.xmin_v_one .xmin_vh_next: ; La ligne est finie. subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmin. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne.s .xmin_one_line bra .xmin_end ;* * .xmin_hline: ; Ligne horizontal, xmin=min(x1,x2). cmp.w d2,d4 ; Lequel est le plus petit? bge.s .min_hline_ok exg.l d2,d4 .min_hline_ok: ; Ici d2 contient le plus petit. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; Sauver xmin. bra.s .xmin_vh_next ;* .xmin_dxneg: ; Sauver xmin juste avant le chgt de y. neg.w d4 ; d4=dx=abs(x2-x1). add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d5,d3 ; d3=nb de xmin a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .min_neg_big .min_neg_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur. ble.s .min_neg_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_neg_low_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .min_neg_low_epos .min_neg_low_eneg: ; Eneg, deplct horizontal puis diagonal. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_neg_low_epos bra.s .min_neg_low_eneg .min_neg_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_neg_vlow_eneg: ; Eneg, deplct horizontal. subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .min_neg_vlow_eneg .min_neg_vlow_epos: ; Epos, diagonale puis horizontale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_neg_vlow_epos bra.s .min_neg_vlow_eneg .xmin_neg_next: cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmin_one_line move.w (a4),d2 ; Si oui, mettre le dernier point. add.w d2,d2 add.w d2,d2 move.w d2,(a3)+ bra .xmin_end  .min_neg_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .min_neg_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_neg_big_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .min_neg_big_epos .min_neg_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. bmi.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_neg_big_epos bra.s .min_neg_big_eneg .min_neg_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_neg_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .min_neg_vbig_eneg .min_neg_vbig_epos: ; Epos, diagonale puis verticale. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_neg_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_neg_vbig_epos bra.s .min_neg_vbig_eneg ;* .xmin_dxpos: ; Sauver xmin juste apres le chgt de y. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; x1=premier xmin. move.w d5,d3 ; d3=nb de xmin a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .min_pos_big .min_pos_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur. ble.s .min_pos_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_pos_low_epos: ; Epos, deplacement sur la diagonale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .min_pos_low_epos .min_pos_low_eneg: ; Eneg, deplct horizontal puis diagonal. addq.w #$4,d2 ; x=x+sx. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_pos_low_epos bra.s .min_pos_low_eneg .min_pos_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .min_pos_vlow_eneg: ; Eneg, deplct horizontal. addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .min_pos_vlow_eneg .min_pos_vlow_epos: ; Epos, diagonale puis horizontale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .min_pos_vlow_epos bra.s .min_pos_vlow_eneg  .xmin_pos_next: subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmin. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmin_one_line bra.s .xmin_end .min_pos_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .min_pos_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_pos_big_epos: ; Epos, deplacement sur la diagonale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .min_pos_big_epos .min_pos_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_pos_big_epos bra.s .min_pos_big_eneg .min_pos_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .min_pos_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .min_pos_vbig_eneg .min_pos_vbig_epos: ; Epos, diagonale puis verticale. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next move.w d2,(a3)+ ; Sauver xmin. subq.w #$1,d3 ; Un xmin de sauve. beq.s .xmin_pos_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .min_pos_vbig_epos bra.s .min_pos_vbig_eneg  .xmin_end: ;*M .xmaxs_calc: move.l #.xmaxs,a3 ; On y stockera les coords. move.l a2,a4 add.l a4,a4 add.l a4,a4 ; a4=ymax_pos*4. add.l a1,a4 ; a4 pointe sur sommet ymax. move.l a2,a5 ; a5=position du point actuel. .xmax_one_line: move.w (a4)+,d2 ; d2=x1. move.w (a4)+,d3 ; d3=y1. subq.l #$8,a4 ; Point d' avant. subq.l #$1,a5 ; Position du point d' avant. cmp.w #$0,a5 ; En dehors du tableau? bpl.s .xmax_pos_ok ext.l d0 subq.l #$1,d0 move.l d0,a5 ; Si oui on repars de la fin du tableau. add.l d0,d0 add.l d0,d0 move.l a1,a4 add.l d0,a4 .xmax_pos_ok: move.w (a4),d4 ; d4=x2. move.w $2(a4),d5 ; d5=y2. sub.w d3,d5 ; d5=dy=y2-y1, toujours positif. beq.s .xmax_hline sub.w d2,d4 ; d4=x2-x1. bmi.s .xmax_dxneg bgt .xmax_dxpos ;* .xmax_vline: ; Droite verticale. add.w d2,d2 add.w d2,d2 ; d2=x1*4. .xmax_v_one: ; Il y a d5+1 xmaxs a sauver. move.w d2,(a3)+ dbra d5,.xmax_v_one .xmax_vh_next: ; La ligne est finie. subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmax. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne.s .xmax_one_line bra .xmax_end ;* .xmax_hline: ; Ligne horizontal, xmax=max(x1,x2). cmp.w d2,d4 ; Lequel est le plus grand? bmi.s .max_hline_ok exg.l d2,d4 .max_hline_ok: ; Ici d2 contient le plus grand. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; Sauver xmax. bra.s .xmax_vh_next ;* .xmax_dxneg: ; Sauver xmax juste apres le chgt de y. neg.w d4 ; d4=abs(x2-x1). add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d2,(a3)+ ; x1=premier xmax. move.w d5,d3 ; d3=nb de xmax a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .max_neg_big .max_neg_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur. ble.s .max_neg_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_neg_low_epos: ; Epos, deplacement sur la diagonale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .max_neg_low_epos .max_neg_low_eneg: ; Eneg, deplct horizontal puis diagonal. subq.w #$4,d2 ; x=x+sx. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_neg_low_epos bra.s .max_neg_low_eneg .max_neg_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_neg_vlow_eneg: ; Eneg, deplct horizontal. subq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .max_neg_vlow_eneg .max_neg_vlow_epos: ; Epos, diagonale puis horizontale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next subq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_neg_vlow_epos bra.s .max_neg_vlow_eneg  .xmax_neg_next: subq.w #$2,a3 ; Ne pas prendre en compte le dernier xmax. cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmax_one_line bra .xmax_end .max_neg_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .max_neg_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_neg_big_epos: ; Epos, deplacement sur la diagonale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .max_neg_big_epos .max_neg_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_neg_big_epos bra.s .max_neg_big_eneg .max_neg_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_neg_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .max_neg_vbig_eneg .max_neg_vbig_epos: ; Epos, diagonale puis verticale. subq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_neg_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_neg_vbig_epos bra.s .max_neg_vbig_eneg ;* .xmax_dxpos: ; Sauver xmax juste avant le chgt de y. add.w d2,d2 add.w d2,d2 ; d2=x1*4. move.w d5,d3 ; d3=nb de xmax a sauver -1. cmp.w d5,d4 ; Pente faible ou forte? bmi.s .max_pos_big .max_pos_low: ; Pente faible. add.w d5,d5 ; d5=2*dy. move.w d5,d6 sub.w d4,d6 ; d6=2*dy-dx=erreur. ble.s .max_pos_vlow ; si erreur<=0, la pente est tres faible. add.w d4,d4 ; d4=2*dx. sub.w d4,d5 ; d5=2*dy-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_pos_low_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy-2*dx. bpl.s .max_pos_low_epos .max_pos_low_eneg: ; Eneg, deplct horizontal puis diagonal. addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_pos_low_epos bra.s .max_pos_low_eneg .max_pos_vlow: ; Pente tres faible. add.w d4,d4 ; d4=2*dx. neg.w d4 ; d4=-2*dx. add.w d5,d4 add.w d5,d4 ; d4=4*dy-2*dx. .max_pos_vlow_eneg: ; Eneg, deplct horizontal. addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+2*dy. ble.s .max_pos_vlow_eneg .max_pos_vlow_epos: ; Epos, diagonale puis horizontale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+4*dy-2*dx. bpl.s .max_pos_vlow_epos bra.s .max_pos_vlow_eneg .xmax_pos_next: cmp.w $2(a4),d1 ; Le y2 etait egal a ymax? bne .xmax_one_line move.w (a4),d2 ; Si oui, mettre le dernier point. add.w d2,d2 add.w d2,d2 move.w d2,(a3)+ bra.s .xmax_end  .max_pos_big: ; Pente forte. add.w d4,d4 ; d4=2*dx. move.w d4,d6 sub.w d5,d6 ; d6=2*dx-dy=erreur. ble.s .max_pos_vbig ; si erreur<=0, la pente est tres forte. add.w d5,d5 ; d5=2*dy. sub.w d5,d4 ; d4=2*dx-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_pos_big_epos: ; Epos, deplacement sur la diagonale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d4,d6 ; erreur=erreur+2*dx-2*dy. bpl.s .max_pos_big_epos .max_pos_big_eneg: ; Eneg, deplct vertical puis diagonal. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. bmi.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_pos_big_epos bra.s .max_pos_big_eneg .max_pos_vbig: ; Pente tres forte. add.w d5,d5 ; d5=2*dy. neg.w d5 ; d5=-2*dy. add.w d4,d5 add.w d4,d5 ; d5=4*dx-2*dy. .max_pos_vbig_eneg: ; Eneg, deplct vertical. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next add.w d4,d6 ; erreur=erreur+2*dx. ble.s .max_pos_vbig_eneg .max_pos_vbig_epos: ; Epos, diagonale puis verticale. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next addq.w #$4,d2 ; x=x+sx. move.w d2,(a3)+ ; Sauver xmax. subq.w #$1,d3 ; Un xmax de sauve. beq.s .xmax_pos_next add.w d5,d6 ; erreur=erreur+4*dx-2*dy. bpl.s .max_pos_vbig_epos bra.s .max_pos_vbig_eneg  .xmax_end: ;*M .drawpoly: move.w .first_hline,d4 ext.l d4 move.w d4,d0 add.w d0,d0 add.w d0,d0 add.w d0,d4 lsl.w #$5,d4 ; d4=first_hline*$a0. add.l a0,d4 ; d4 pointe sur la premier ligne. move.l #.xmins,a0 move.l #.xmaxs,a1 move.l #.xmin_table,a2 move.l #.xmax_table,a3 move.l #.adresses,a4  move.w .first_xmin,d0 add.w d0,d0 add.w d0,a0 ; Aligner a0,a1 sur les premiers add.w d0,a1 ; xmin-xmax a utiliser! move.w .nb_hlines,d0 ; Nombre de lignes a tracer. move.l #$f,d1 move.l #$a0,d5 ; Taille d' une ligne. .init_blitter: ; Chic, un Blitter. move.w d1,$f8a2a.w ; Masque du milieu plein. move.l #$80008,$f8a2e.w ; Increments destination. move.w #$20f,$f8a3a.w ; Remplir avec des 1. move.b #$c0,d6 ; Pour lancer le blitter. move.l #$a0001,d7 ; Taille horizontal et verticale. .one_line: move.w (a0)+,d2 ; d2=xmin*4. move.w (a1)+,d3 ; d3=xmax*4. move.l (a2,d2.w),d2 ; d2=motif/adresse de depart. move.l (a3,d3.w),d3 ; d3=motif/adresse d'arrivee. sub.w d2,d3 move.l (a4,d3.w),a5 ; Adresse de la routine. swap.w d3 ; d3.w=motif d' arrivee. jmp (a5) .step_0: move.l d4,a5 add.l d5,d4 ; Ligne suivante. add.w d2,a5 ; a5 pointe sur le premier mot. swap.w d2 and.w d2,d3 ; Motif. or.w d3,(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_1: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) or.w d3,$8(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_2: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) or.w d3,$10(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_3: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) or.w d3,$18(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_4: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) or.w d3,$20(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_5: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) or.w d3,$28(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_6: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) or.w d3,$30(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_7: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) or.w d3,$38(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_8: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) or.w d3,$40(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_9: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.l d7,(a6)+ ; Taille horizontale et verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_10: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #11,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_11: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #12,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_12: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #13,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_13: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #14,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_14: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #15,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_15: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #16,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_16: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #17,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_17: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #18,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_18: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #19,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$ffff8a28.w ; Masque de depart. move.w d3,$ffff8a2c.w ; Masque de fin. move.b d6,$ffff8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_19: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #20,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .end: movem.l (sp)+,d0-a6 rts .bad_step: ; Si dx est negatif, on ne fait rien. dbra d0,.one_line movem.l (sp)+,d0-a6 rts  ;*M Section DATA dc.l .bad_step,.bad_step ; Parfois dx est negatif. .adresses: dc.l .step_0,.step_0,.step_1,.step_1 dc.l .step_2,.step_2,.step_3,.step_3 dc.l .step_4,.step_4,.step_5,.step_5 dc.l .step_6,.step_6,.step_7,.step_7 dc.l .step_8,.step_8,.step_9,.step_9 dc.l .step_10,.step_10,.step_11,.step_11 dc.l .step_12,.step_12,.step_13,.step_13 dc.l .step_14,.step_14,.step_15,.step_15 dc.l .step_16,.step_16,.step_17,.step_17 dc.l .step_18,.step_18,.step_19,.step_19 rept 256 ; Pour le clipping. dc.w $0,$fff8 endr .xmin_table: dc.w $f,$00,$7fff,$00,$3fff,$00,$1fff,$00 dc.w $0fff,$00,$07ff,$00,$03ff,$00,$01ff,$00 dc.w $00ff,$00,$007f,$00,$003f,$00,$001f,$00 dc.w $000f,$00,$0007,$00,$0003,$00,$0001,$00 dc.w $f,$08,$7fff,$08,$3fff,$08,$1fff,$08 dc.w $0fff,$08,$07ff,$08,$03ff,$08,$01ff,$08 dc.w $00ff,$08,$007f,$08,$003f,$08,$001f,$08 dc.w $000f,$08,$0007,$08,$0003,$08,$0001,$08 dc.w $f,$10,$7fff,$10,$3fff,$10,$1fff,$10 dc.w $0fff,$10,$07ff,$10,$03ff,$10,$01ff,$10 dc.w $00ff,$10,$007f,$10,$003f,$10,$001f,$10 dc.w $000f,$10,$0007,$10,$0003,$10,$0001,$10 dc.w $f,$18,$7fff,$18,$3fff,$18,$1fff,$18 dc.w $0fff,$18,$07ff,$18,$03ff,$18,$01ff,$18 dc.w $00ff,$18,$007f,$18,$003f,$18,$001f,$18 dc.w $000f,$18,$0007,$18,$0003,$18,$0001,$18 dc.w $f,$20,$7fff,$20,$3fff,$20,$1fff,$20 dc.w $0fff,$20,$07ff,$20,$03ff,$20,$01ff,$20 dc.w $00ff,$20,$007f,$20,$003f,$20,$001f,$20 dc.w $000f,$20,$0007,$20,$0003,$20,$0001,$20 dc.w $f,$28,$7fff,$28,$3fff,$28,$1fff,$28 dc.w $0fff,$28,$07ff,$28,$03ff,$28,$01ff,$28 dc.w $00ff,$28,$007f,$28,$003f,$28,$001f,$28 dc.w $000f,$28,$0007,$28,$0003,$28,$0001,$28 dc.w $f,$30,$7fff,$30,$3fff,$30,$1fff,$30 dc.w $0fff,$30,$07ff,$30,$03ff,$30,$01ff,$30 dc.w $00ff,$30,$007f,$30,$003f,$30,$001f,$30 dc.w $000f,$30,$0007,$30,$0003,$30,$0001,$30 dc.w $f,$38,$7fff,$38,$3fff,$38,$1fff,$38 dc.w $0fff,$38,$07ff,$38,$03ff,$38,$01ff,$38 dc.w $00ff,$38,$007f,$38,$003f,$38,$001f,$38 dc.w $000f,$38,$0007,$38,$0003,$38,$0001,$38 dc.w $f,$40,$7fff,$40,$3fff,$40,$1fff,$40 dc.w $0fff,$40,$07ff,$40,$03ff,$40,$01ff,$40 dc.w $00ff,$40,$007f,$40,$003f,$40,$001f,$40 dc.w $000f,$40,$0007,$40,$0003,$40,$0001,$40 dc.w $f,$48,$7fff,$48,$3fff,$48,$1fff,$48 dc.w $0fff,$48,$07ff,$48,$03ff,$48,$01ff,$48 dc.w $00ff,$48,$007f,$48,$003f,$48,$001f,$48 dc.w $000f,$48,$0007,$48,$0003,$48,$0001,$48 dc.w $f,$50,$7fff,$50,$3fff,$50,$1fff,$50 dc.w $0fff,$50,$07ff,$50,$03ff,$50,$01ff,$50 dc.w $00ff,$50,$007f,$50,$003f,$50,$001f,$50 dc.w $000f,$50,$0007,$50,$0003,$50,$0001,$50 dc.w $f,$58,$7fff,$58,$3fff,$58,$1fff,$58 dc.w $0fff,$58,$07ff,$58,$03ff,$58,$01ff,$58 dc.w $00ff,$58,$007f,$58,$003f,$58,$001f,$58 dc.w $000f,$58,$0007,$58,$0003,$58,$0001,$58 dc.w $f,$60,$7fff,$60,$3fff,$60,$1fff,$60 dc.w $0fff,$60,$07ff,$60,$03ff,$60,$01ff,$60 dc.w $00ff,$60,$007f,$60,$003f,$60,$001f,$60 dc.w $000f,$60,$0007,$60,$0003,$60,$0001,$60 dc.w $f,$68,$7fff,$68,$3fff,$68,$1fff,$68 dc.w $0fff,$68,$07ff,$68,$03ff,$68,$01ff,$68 dc.w $00ff,$68,$007f,$68,$003f,$68,$001f,$68 dc.w $000f,$68,$0007,$68,$0003,$68,$0001,$68 dc.w $f,$70,$7fff,$70,$3fff,$70,$1fff,$70 dc.w $0fff,$70,$07ff,$70,$03ff,$70,$01ff,$70 dc.w $00ff,$70,$007f,$70,$003f,$70,$001f,$70 dc.w $000f,$70,$0007,$70,$0003,$70,$0001,$70 dc.w $f,$78,$7fff,$78,$3fff,$78,$1fff,$78 dc.w $0fff,$78,$07ff,$78,$03ff,$78,$01ff,$78 dc.w $00ff,$78,$007f,$78,$003f,$78,$001f,$78 dc.w $000f,$78,$0007,$78,$0003,$78,$0001,$78 dc.w $f,$80,$7fff,$80,$3fff,$80,$1fff,$80 dc.w $0fff,$80,$07ff,$80,$03ff,$80,$01ff,$80 dc.w $00ff,$80,$007f,$80,$003f,$80,$001f,$80 dc.w $000f,$80,$0007,$80,$0003,$80,$0001,$80 dc.w $f,$88,$7fff,$88,$3fff,$88,$1fff,$88 dc.w $0fff,$88,$07ff,$88,$03ff,$88,$01ff,$88 dc.w $00ff,$88,$007f,$88,$003f,$88,$001f,$88 dc.w $000f,$88,$0007,$88,$0003,$88,$0001,$88 dc.w $f,$90,$7fff,$90,$3fff,$90,$1fff,$90 dc.w $0fff,$90,$07ff,$90,$03ff,$90,$01ff,$90 dc.w $00ff,$90,$007f,$90,$003f,$90,$001f,$90 dc.w $000f,$90,$0007,$90,$0003,$90,$0001,$90 dc.w $f,$98,$7fff,$98,$3fff,$98,$1fff,$98 dc.w $0fff,$98,$07ff,$98,$03ff,$98,$01ff,$98 dc.w $00ff,$98,$007f,$98,$003f,$98,$001f,$98 dc.w $000f,$98,$0007,$98,$0003,$98,$0001,$98 rept 256 ; Pour le clipping. dc.w $0,$a0 endr rept 256 ; Pour le clipping. dc.w $0,$fff8 endr .xmax_table: dc.w $8000,$00,$c000,$00,$e000,$00,$f000,$00 dc.w $f800,$00,$fc00,$00,$fe00,$00,$ff00,$00 dc.w $ff80,$00,$ffc0,$00,$ffe0,$00,$fff0,$00 dc.w $fff8,$00,$fffc,$00,$fffe,$00,$f,$00 dc.w $8000,$08,$c000,$08,$e000,$08,$f000,$08 dc.w $f800,$08,$fc00,$08,$fe00,$08,$ff00,$08 dc.w $ff80,$08,$ffc0,$08,$ffe0,$08,$fff0,$08 dc.w $fff8,$08,$fffc,$08,$fffe,$08,$f,$08 dc.w $8000,$10,$c000,$10,$e000,$10,$f000,$10 dc.w $f800,$10,$fc00,$10,$fe00,$10,$ff00,$10 dc.w $ff80,$10,$ffc0,$10,$ffe0,$10,$fff0,$10 dc.w $fff8,$10,$fffc,$10,$fffe,$10,$f,$10 dc.w $8000,$18,$c000,$18,$e000,$18,$f000,$18 dc.w $f800,$18,$fc00,$18,$fe00,$18,$ff00,$18 dc.w $ff80,$18,$ffc0,$18,$ffe0,$18,$fff0,$18 dc.w $fff8,$18,$fffc,$18,$fffe,$18,$f,$18 dc.w $8000,$20,$c000,$20,$e000,$20,$f000,$20 dc.w $f800,$20,$fc00,$20,$fe00,$20,$ff00,$20 dc.w $ff80,$20,$ffc0,$20,$ffe0,$20,$fff0,$20 dc.w $fff8,$20,$fffc,$20,$fffe,$20,$f,$20 dc.w $8000,$28,$c000,$28,$e000,$28,$f000,$28 dc.w $f800,$28,$fc00,$28,$fe00,$28,$ff00,$28 dc.w $ff80,$28,$ffc0,$28,$ffe0,$28,$fff0,$28 dc.w $fff8,$28,$fffc,$28,$fffe,$28,$f,$28 dc.w $8000,$30,$c000,$30,$e000,$30,$f000,$30 dc.w $f800,$30,$fc00,$30,$fe00,$30,$ff00,$30 dc.w $ff80,$30,$ffc0,$30,$ffe0,$30,$fff0,$30 dc.w $fff8,$30,$fffc,$30,$fffe,$30,$f,$30 dc.w $8000,$38,$c000,$38,$e000,$38,$f000,$38 dc.w $f800,$38,$fc00,$38,$fe00,$38,$ff00,$38 dc.w $ff80,$38,$ffc0,$38,$ffe0,$38,$fff0,$38 dc.w $fff8,$38,$fffc,$38,$fffe,$38,$f,$38 dc.w $8000,$40,$c000,$40,$e000,$40,$f000,$40 dc.w $f800,$40,$fc00,$40,$fe00,$40,$ff00,$40 dc.w $ff80,$40,$ffc0,$40,$ffe0,$40,$fff0,$40 dc.w $fff8,$40,$fffc,$40,$fffe,$40,$f,$40 dc.w $8000,$48,$c000,$48,$e000,$48,$f000,$48 dc.w $f800,$48,$fc00,$48,$fe00,$48,$ff00,$48 dc.w $ff80,$48,$ffc0,$48,$ffe0,$48,$fff0,$48 dc.w $fff8,$48,$fffc,$48,$fffe,$48,$f,$48 dc.w $8000,$50,$c000,$50,$e000,$50,$f000,$50 dc.w $f800,$50,$fc00,$50,$fe00,$50,$ff00,$50 dc.w $ff80,$50,$ffc0,$50,$ffe0,$50,$fff0,$50 dc.w $fff8,$50,$fffc,$50,$fffe,$50,$f,$50 dc.w $8000,$58,$c000,$58,$e000,$58,$f000,$58 dc.w $f800,$58,$fc00,$58,$fe00,$58,$ff00,$58 dc.w $ff80,$58,$ffc0,$58,$ffe0,$58,$fff0,$58 dc.w $fff8,$58,$fffc,$58,$fffe,$58,$f,$58 dc.w $8000,$60,$c000,$60,$e000,$60,$f000,$60 dc.w $f800,$60,$fc00,$60,$fe00,$60,$ff00,$60 dc.w $ff80,$60,$ffc0,$60,$ffe0,$60,$fff0,$60 dc.w $fff8,$60,$fffc,$60,$fffe,$60,$f,$60 dc.w $8000,$68,$c000,$68,$e000,$68,$f000,$68 dc.w $f800,$68,$fc00,$68,$fe00,$68,$ff00,$68 dc.w $ff80,$68,$ffc0,$68,$ffe0,$68,$fff0,$68 dc.w $fff8,$68,$fffc,$68,$fffe,$68,$f,$68 dc.w $8000,$70,$c000,$70,$e000,$70,$f000,$70 dc.w $f800,$70,$fc00,$70,$fe00,$70,$ff00,$70 dc.w $ff80,$70,$ffc0,$70,$ffe0,$70,$fff0,$70 dc.w $fff8,$70,$fffc,$70,$fffe,$70,$f,$70 dc.w $8000,$78,$c000,$78,$e000,$78,$f000,$78 dc.w $f800,$78,$fc00,$78,$fe00,$78,$ff00,$78 dc.w $ff80,$78,$ffc0,$78,$ffe0,$78,$fff0,$78 dc.w $fff8,$78,$fffc,$78,$fffe,$78,$f,$78 dc.w $8000,$80,$c000,$80,$e000,$80,$f000,$80 dc.w $f800,$80,$fc00,$80,$fe00,$80,$ff00,$80 dc.w $ff80,$80,$ffc0,$80,$ffe0,$80,$fff0,$80 dc.w $fff8,$80,$fffc,$80,$fffe,$80,$f,$80 dc.w $8000,$88,$c000,$88,$e000,$88,$f000,$88 dc.w $f800,$88,$fc00,$88,$fe00,$88,$ff00,$88 dc.w $ff80,$88,$ffc0,$88,$ffe0,$88,$fff0,$88 dc.w $fff8,$88,$fffc,$88,$fffe,$88,$f,$88 dc.w $8000,$90,$c000,$90,$e000,$90,$f000,$90 dc.w $f800,$90,$fc00,$90,$fe00,$90,$ff00,$90 dc.w $ff80,$90,$ffc0,$90,$ffe0,$90,$fff0,$90 dc.w $fff8,$90,$fffc,$90,$fffe,$90,$f,$90 dc.w $8000,$98,$c000,$98,$e000,$98,$f000,$98 dc.w $f800,$98,$fc00,$98,$fe00,$98,$ff00,$98 dc.w $ff80,$98,$ffc0,$98,$ffe0,$98,$fff0,$98 dc.w $fff8,$98,$fffc,$98,$fffe,$98,$f,$98 rept 256 ; Pour le clipping. dc.w $0,$a0 endr ;*M Section BSS .nb_hlines: ds.w 1 .first_hline: ds.w 1 .first_xmin: ds.w 1 .xmins: ; Si on a plus de 512 xmins=bleme. ds.w $400 .xmaxs: ; Meme remarque. ds.w $400  r.draw: move.w .first_hline,d4 ext.l d4 move.w d4,d0 add.w d0,d0 add.w d0,d0 add.w d0,d4 lsl.w #$5,d4 ; d4=first_hline*$a0. add.l a0,d4 ; d4 pointe sur la premier ligne. move.l #.xmins,a0 move.l #.xmaxs,a1 move.l #.xmin_table,a2 move.l #.xmax_table,a3 move.l #.adresses,a4  move.w .first_xmin,d0 add.w d0,d0 add.w d0,a0 ; Aligner a0,a1 sur les premiers add.w d0,a1 ; xmin-xmax a utiliser! move.w .nb_hlines,d0 ; Nombre de lignes a tracer. move.l #$f,d1 move.l #$a0,d5 ; Taille d' une ligne. .init_blitter: ; Chic, un Blitter. move.w d1,$f8a2a.w ; Masque du milieu plein. move.l #$80008,$f8a2e.w ; Increments destination. move.w #$20f,$f8a3a.w ; Remplir avec des 1. move.b #$c0,d6 ; Pour lancer le blitter. move.l #$a0001,d7 ; Taille horizontal et verticale. .one_line: move.w (a0)+,d2 ; d2=xmin*4. move.w (a1)+,d3 ; d3=xmax*4. move.l (a2,d2.w),d2 ; d2=motif/adresse de depart. move.l (a3,d3.w),d3 ; d3=motif/adresse d'arrivee. sub.w d2,d3 move.l (a4,d3.w),a5 ; Adresse de la routine. swap.w d3 ; d3.w=motif d' arrivee. jmp (a5) .step_0: move.l d4,a5 add.l d5,d4 ; Ligne suivante. add.w d2,a5 ; a5 pointe sur le premier mot. swap.w d2 and.w d2,d3 ; Motif. or.w d3,(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_1: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) or.w d3,$8(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_2: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) or.w d3,$10(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_3: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) or.w d3,$18(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_4: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) or.w d3,$20(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_5: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) or.w d3,$28(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_6: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) or.w d3,$30(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_7: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) or.w d3,$38(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_8: move.l d4,a5 add.l d5,d4 add.w d2,a5 swap.w d2 or.w d2,(a5) move.w d1,$8(a5) move.w d1,$10(a5) move.w d1,$18(a5) move.w d1,$20(a5) move.w d1,$28(a5) move.w d1,$30(a5) move.w d1,$38(a5) or.w d3,$40(a5) dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_9: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.l d7,(a6)+ ; Taille horizontale et verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_10:  move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #11,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_11: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #12,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_12: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #13,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_13: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #14,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_14: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #15,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_15: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #16,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_16: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #17,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_17: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #18,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_18: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #19,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .step_19: move.l d4,a5 add.l d5,d4 add.w d2,a5 move.w #$8a32,a6 move.l a5,(a6)+ ; Adresse dest. swap.w d2 move.w #20,(a6)+ ; Taille horizontale. move.w d7,(a6)+ ; Taille verticale. move.w d2,$f8a28.w ; Masque de depart. move.w d3,$f8a2c.w ; Masque de fin. move.b d6,$f8a3c.w ; Lancer le blitter. dbra d0,.one_line movem.l (sp)+,d0-a6 rts .end: movem.l (sp)+,d0-a6 rts ;*M Section DATA .adresses: dc.l .step_0,.step_0,.step_1,.step_1 dc.l .step_2,.step_2,.step_3,.step_3 dc.l .step_4,.step_4,.step_5,.step_5 dc.l .step_6,.step_6,.step_7,.step_7 dc.l .step_8,.step_8,.step_9,.step_9 dc.l .step_10,.step_10,.step_11,.step_11 dc.l .step_12,.step_12,.step_13,.step_13 dc.l .step_14,.step_14,.step_15,.step_15 dc.l .step_16,.step_16,.step_17,.step_17 dc.l .step_18,.step_18,.step_19,.step_19 .xmin_table: dc.w $f,$00,$7fff,$00,$3fff,$00,$1fff,$00 dc.w $0fff,$00,$07ff,$00,$03ff,$00,$01ff,$00 dc.w $00ff,$00,$007f,$00,$003f,$00,$001f,$00 dc.w $000f,$00,$0007,$00,$0003,$00,$0001,$00 dc.w $ffff,$08,$7fff,$08,$3fff,$08,$1fff,$08 dc.w $0fff,$08,$07ff,$08,$03ff,$08,$01ff,$08 dc.w $00ff,$08,$007f,$08,$003f,$08,$001f,$08 dc.w $000f,$08,$0007,$08,$0003,$08,$0001,$08 dc.w $ffff,$10,$7fff,$10,$3fff,$10,$1fff,$10 dc.w $0fff,$10,$07ff,$10,$03ff,$10,$01ff,$10 dc.w $00ff,$10,$007f,$10,$003f,$10,$001f,$10 dc.w $000f,$10,$0007,$10,$0003,$10,$0001,$10 dc.w $ffff,$18,$7fff,$18,$3fff,$18,$1fff,$18 dc.w $0fff,$18,$07ff,$18,$03ff,$18,$01ff,$18 dc.w $00ff,$18,$007f,$18,$003f,$18,$001f,$18 dc.w $000f,$18,$0007,$18,$0003,$18,$0001,$18 dc.w $ffff,$20,$7fff,$20,$3fff,$20,$1fff,$20 dc.w $0fff,$20,$07ff,$20,$03ff,$20,$01ff,$20 dc.w $00ff,$20,$007f,$20,$003f,$20,$001f,$20 dc.w $000f,$20,$0007,$20,$0003,$20,$0001,$20 dc.w $ffff,$28,$7fff,$28,$3fff,$28,$1fff,$28 dc.w $0fff,$28,$07ff,$28,$03ff,$28,$01ff,$28 dc.w $00ff,$28,$007f,$28,$003f,$28,$001f,$28 dc.w $000f,$28,$0007,$28,$0003,$28,$0001,$28 dc.w $ffff,$30,$7fff,$30,$3fff,$30,$1fff,$30 dc.w $0fff,$30,$07ff,$30,$03ff,$30,$01ff,$30 dc.w $00ff,$30,$007f,$30,$003f,$30,$001f,$30 dc.w $000f,$30,$0007,$30,$0003,$30,$0001,$30 dc.w $ffff,$38,$7fff,$38,$3fff,$38,$1fff,$38 dc.w $0fff,$38,$07ff,$38,$03ff,$38,$01ff,$38 dc.w $00ff,$38,$007f,$38,$003f,$38,$001f,$38 dc.w $000f,$38,$0007,$38,$0003,$38,$0001,$38 dc.w $ffff,$40,$7fff,$40,$3fff,$40,$1fff,$40 dc.w $0fff,$40,$07ff,$40,$03ff,$40,$01ff,$40 dc.w $00ff,$40,$007f,$40,$003f,$40,$001f,$40 dc.w $000f,$40,$0007,$40,$0003,$40,$0001,$40 dc.w $ffff,$48,$7fff,$48,$3fff,$48,$1fff,$48 dc.w $0fff,$48,$07ff,$48,$03ff,$48,$01ff,$48 dc.w $00ff,$48,$007f,$48,$003f,$48,$001f,$48 dc.w $000f,$48,$0007,$48,$0003,$48,$0001,$48 dc.w $ffff,$50,$7fff,$50,$3fff,$50,$1fff,$50 dc.w $0fff,$50,$07ff,$50,$03ff,$50,$01ff,$50 dc.w $00ff,$50,$007f,$50,$003f,$50,$001f,$50 dc.w $000f,$50,$0007,$50,$0003,$50,$0001,$50 dc.w $ffff,$58,$7fff,$58,$3fff,$58,$1fff,$58 dc.w $0fff,$58,$07ff,$58,$03ff,$58,$01ff,$58 dc.w $00ff,$58,$007f,$58,$003f,$58,$001f,$58 dc.w $000f,$58,$0007,$58,$0003,$58,$0001,$58 dc.w $ffff,$60,$7fff,$60,$3fff,$60,$1fff,$60 dc.w $0fff,$60,$07ff,$60,$03ff,$60,$01ff,$60 dc.w $00ff,$60,$007f,$60,$003f,$60,$001f,$60 dc.w $000f,$60,$0007,$60,$0003,$60,$0001,$60 dc.w $ffff,$68,$7fff,$68,$3fff,$68,$1fff,$68 dc.w $0fff,$68,$07ff,$68,$03ff,$68,$01ff,$68 dc.w $00ff,$68,$007f,$68,$003f,$68,$001f,$68 dc.w $000f,$68,$0007,$68,$0003,$68,$0001,$68 dc.w $ffff,$70,$7fff,$70,$3fff,$70,$1fff,$70 dc.w $0fff,$70,$07ff,$70,$03ff,$70,$01ff,$70 dc.w $00ff,$70,$007f,$70,$003f,$70,$001f,$70 dc.w $000f,$70,$0007,$70,$0003,$70,$0001,$70 dc.w $ffff,$78,$7fff,$78,$3fff,$78,$1fff,$78 dc.w $0fff,$78,$07ff,$78,$03ff,$78,$01ff,$78 dc.w $00ff,$78,$007f,$78,$003f,$78,$001f,$78 dc.w $000f,$78,$0007,$78,$0003,$78,$0001,$78 dc.w $ffff,$80,$7fff,$80,$3fff,$80,$1fff,$80 dc.w $0fff,$80,$07ff,$80,$03ff,$80,$01ff,$80 dc.w $00ff,$80,$007f,$80,$003f,$80,$001f,$80 dc.w $000f,$80,$0007,$80,$0003,$80,$0001,$80 dc.w $ffff,$88,$7fff,$88,$3fff,$88,$1fff,$88 dc.w $0fff,$88,$07ff,$88,$03ff,$88,$01ff,$88 dc.w $00ff,$88,$007f,$88,$003f,$88,$001f,$88 dc.w $000f,$88,$0007,$88,$0003,$88,$0001,$88 dc.w $ffff,$90,$7fff,$90,$3fff,$90,$1fff,$90 dc.w $0fff,$90,$07ff,$90,$03ff,$90,$01ff,$90 dc.w $00ff,$90,$007f,$90,$003f,$90,$001f,$90 dc.w $000f,$90,$0007,$90,$0003,$90,$0001,$90 dc.w $ffff,$98,$7fff,$98,$3fff,$98,$1fff,$98 dc.w $0fff,$98,$07ff,$98,$03ff,$98,$01ff,$98 dc.w $00ff,$98,$007f,$98,$003f,$98,$001f,$98 dc.w $000f,$98,$0007,$98,$0003,$98,$0001,$98 .xmax_table: dc.w $8000,$00,$c000,$00,$e000,$00,$f000,$00 dc.w $f800,$00,$fc00,$00,$fe00,$00,$ff00,$00 dc.w $ff80,$00,$ffc0,$00,$ffe0,$00,$fff0,$00 dc.w $fff8,$00,$fffc,$00,$fffe,$00,$ffff,$00 dc.w $8000,$08,$c000,$08,$e000,$08,$f000,$08 dc.w $f800,$08,$fc00,$08,$fe00,$08,$ff00,$08 dc.w $ff80,$08,$ffc0,$08,$ffe0,$08,$fff0,$08 dc.w $fff8,$08,$fffc,$08,$fffe,$08,$ffff,$08 dc.w $8000,$10,$c000,$10,$e000,$10,$f000,$10 dc.w $f800,$10,$fc00,$10,$fe00,$10,$ff00,$10 dc.w $ff80,$10,$ffc0,$10,$ffe0,$10,$fff0,$10 dc.w $fff8,$10,$fffc,$10,$fffe,$10,$ffff,$10 dc.w $8000,$18,$c000,$18,$e000,$18,$f000,$18 dc.w $f800,$18,$fc00,$18,$fe00,$18,$ff00,$18 dc.w $ff80,$18,$ffc0,$18,$ffe0,$18,$fff0,$18 dc.w $fff8,$18,$fffc,$18,$fffe,$18,$ffff,$18 dc.w $8000,$20,$c000,$20,$e000,$20,$f000,$2 0 dc.w $f800,$20,$fc00,$20,$fe00,$20,$ff00,$20 dc.w $ff80,$20,$ffc0,$20,$ffe0,$20,$fff0,$20 dc.w $fff8,$20,$fffc,$20,$fffe,$20,$f,$20 dc.w $8000,$28,$c000,$28,$e000,$28,$f000,$28 dc.w $f800,$28,$fc00,$28,$fe00,$28,$ff00,$28 dc.w $ff80,$28,$ffc0,$28,$ffe0,$28,$fff0,$28 dc.w $fff8,$28,$fffc,$28,$fffe,$28,$f,$28 dc.w $8000,$30,$c000,$30,$e000,$30,$f000,$30 dc.w $f800,$30,$fc00,$30,$fe00,$30,$ff00,$30 dc.w $ff80,$30,$ffc0,$30,$ffe0,$30,$fff0,$30 dc.w $fff8,$30,$fffc,$30,$fffe,$30,$f,$30 dc.w $8000,$38,$c000,$38,$e000,$38,$f000,$38 dc.w $f800,$38,$fc00,$38,$fe00,$38,$ff00,$38 dc.w $ff80,$38,$ffc0,$38,$ffe0,$38,$fff0,$38 dc.w $fff8,$38,$fffc,$38,$fffe,$38,$f,$38 dc.w $8000,$40,$c000,$40,$e000,$40,$f000,$40 dc.w $f800,$40,$fc00,$40,$fe00,$40,$ff00,$40 dc.w $ff80,$40,$ffc0,$40,$ffe0,$40,$fff0,$40 dc.w $fff8,$40,$fffc,$40,$fffe,$40,$f,$40 dc.w $8000,$48,$c000,$48,$e000,$48,$f000,$48 dc.w $f800,$48,$fc00,$48,$fe00,$48,$ff00,$48 dc.w $ff80,$48,$ffc0,$48,$ffe0,$48,$fff0,$48 dc.w $fff8,$48,$fffc,$48,$fffe,$48,$f,$48 dc.w $8000,$50,$c000,$50,$e000,$50,$f000,$50 dc.w $f800,$50,$fc00,$50,$fe00,$50,$ff00,$50 dc.w $ff80,$50,$ffc0,$50,$ffe0,$50,$fff0,$50 dc.w $fff8,$50,$fffc,$50,$fffe,$50,$f,$50 dc.w $8000,$58,$c000,$58,$e000,$58,$f000,$58 dc.w $f800,$58,$fc00,$58,$fe00,$58,$ff00,$58 dc.w $ff80,$58,$ffc0,$58,$ffe0,$58,$fff0,$58 dc.w $fff8,$58,$fffc,$58,$fffe,$58,$f,$58 dc.w $8000,$60,$c000,$60,$e000,$60,$f000,$60 dc.w $f800,$60,$fc00,$60,$fe00,$60,$ff00,$60 dc.w $ff80,$60,$ffc0,$60,$ffe0,$60,$fff0,$60 dc.w $fff8,$60,$fffc,$60,$fffe,$60,$f,$60 dc.w $8000,$68,$c000,$68,$e000,$68,$f000,$68 dc.w $f800,$68,$fc00,$68,$fe00,$68,$ff00,$68 dc.w $ff80,$68,$ffc0,$68,$ffe0,$68,$fff0,$68 dc.w $fff8,$68,$fffc,$68,$fffe,$68,$f,$68 dc.w $8000,$70,$c000,$70,$e000,$70,$f000,$70 dc.w $f800,$70,$fc00,$70,$fe00,$70,$ff00,$70 dc.w $ff80,$70,$ffc0,$70,$ffe0,$70,$fff0,$70 dc.w $fff8,$70,$fffc,$70,$fffe,$70,$f,$70 dc.w $8000,$78,$c000,$78,$e000,$78,$f000,$78 dc.w $f800,$78,$fc00,$78,$fe00,$78,$ff00,$78 dc.w $ff80,$78,$ffc0,$78,$ffe0,$78,$fff0,$78 dc.w $fff8,$78,$fffc,$78,$fffe,$78,$f,$78 dc.w $8000,$80,$c000,$80,$e000,$80,$f000,$80 dc.w $f800,$80,$fc00,$80,$fe00,$80,$ff00,$80 dc.w $ff80,$80,$ffc0,$80,$ffe0,$80,$fff0,$80 dc.w $fff8,$80,$fffc,$80,$fffe,$80,$f,$80 dc.w $8000,$88,$c000,$88,$e000,$88,$f000,$88 dc.w $f800,$88,$fc00,$88,$fe00,$88,$ff00,$88 dc.w $ff80,$88,$ffc0,$88,$ffe0,$88,$fff0,$88 dc.w $fff8,$88,$fffc,$88,$fffe,$88,$f,$88 dc.w $8000,$90,$c000,$90,$e000,$90,$f000,$90 dc.w $f800,$90,$fc00,$90,$fe00,$90,$ff00,$90 dc.w $ff80,$90,$ffc0,$90,$ffe0,$90,$fff0,$90 dc.w $fff8,$90,$fffc,$90,$fffe,$90,$f,$90 dc.w $8000,$98,$c000,$98,$e000,$98,$f000,$98 dc.w $f800,$98,$fc00,$98,$fe00,$98,$ff00,$98 dc.w $ff80,$98,$ffc0,$98,$ffe0,$98,$fff0,$98 dc.w $fff8,$98,$fffc,$98,$fffe,$98,$f,$98 ;*M Section BSS .nb_hlines: ds.w 1 .first_hline: ds.w 1 .first_xmin: ds.w 1 .xmins: ; Si on a plus de 512 xmins=bleme. ds.w $400 .xmaxs: ; Meme remarque. ds.w $400  .  `.. BIG_ALECMUS 4!SHELL S `  ```Music composed by BIG ALEC and ripped from the maggie 10by ZEEDYA from DIAMOND DESIGN of ELECTRICITYIf you use this music, don't forget the greeting.To contact me, write to : BERTHOU Yannick 87 route d'arbouville F-78120 RAMBOUILLET FRANCEJ@f&pA |0A@ @ @NuA|CvtA BprvaDA prv a8A prv a,K A Ca8A ^Ca.A C$a$A 0Nu"Hx Q0C7A@@ANup!Ig"gAE 45A@ @G03C!INuA JhgpK nMISPj0A naRA aJA aBA VadK :EUFA ~a>K :EU FA aK :EU FGINu@|Ap  % Cr! 87%FNu@|A! %FNu$/Nh ؈kN` _Ns8 _NsS(jp"h f\&P fR(< f &hB(<g gAE 45A@@ @@G 03CFB@@g`ngYCBhJfB(L f@ @@JjB()@E @02I@ (Af g fa` fa` fa` fa` fa4` fa` (ANq( g gX g g`@f6B(*B(>B(Fh:!h!h"!h0,h6&h8'h9(@4`@fB(>B(Fh:!h0,!h"(?g@? @ |YDYE`f6B(*B(>B(Fh:!h0,!h"!hh6&h8'h9(((?g @?G@? s |Y4`f:B(*B(>B(Fh:!h0,!h"!hh6&h8'h9(B(L@?f:B(*B(>B(Fh:!h0,!h"!hh6&h8'h9(B(L@?!INu@@G03G[B(*g)!K!KT&\6T'\8T(\9@@G @03G[+B(Fg)!K0!K,T\:B(>!L!L"Y4Nu@5 @@@E02EZ+B(Fg)!J,!J0T\:B(>!L!L"@? @ |YDYENu@5 @@@E02EZB(*g)!J!JT&\6T'\8T(\9@@E202EZ+B(Fg)!J,!J0T\:B(>!L!L"(@?E0@? r |Y4Nu\5|;@@E002EZB(*g)!J!JT&\6T'\8T(\9@@Et02EZ+B(Fg)!J,!J0T\:B(>!L!L"Y? |1|DNu\5|;@@E02EZB(*g)!J!JT&\6T'\8T(\9@@E02EZ+B(Fg)!J,!J0T\:B(>!L!L"Y? |1|DNu@@02ENu (fz|`(Bgz|`(@S(Fj4h+F"h,j()g"h0!I,g` @(HS(>jR"hkD fY&Y'Y(k. !fYk !I((<n|FH`FHh>(Ag`gf` (g (g (g`x(IS(*j"h*"hj()g "h!IDI(?(CnD?1@(L(((' (&g&n.()gd(h)` c`h)`d p`c`@L (Bg(C2(J1AJ E (fEEEE1EDJ(;g h5B(;:(D`x(IS(*j"h*"hj()g "h!IDI(4(CD:1@(L(((' (&g&n.()gd(h)` c`h)`d p`c`@LHHJB@(Bg(C2(JH@1AJANu K 0 i`x HGp0S#}Z8{eQ>- ~wpjd^YTOKGC?;852/,*'%#!@Ⱦ~xqjd_YTOKGC?<852/-*(&$"  &2>JV]bgpu         !+GdnM   !  !  !      !                  -h%1j &&)($&()(&"$()+.02.++.254040+70+<0+A0+@+<+>7)+,.,+, ,. 0)).0)+'),.03530.0.,.,),)'$"'")))))))))$'),)').,),.,.03 2 0.0,)+,0.,).,)').,.0.,)'))))))))      )0 )' )0,.)0 )' )0,.)0 )' )0,.)0 )' )0,.)))0.)))0.)))0.)))0.+++20+++20+++20+++20) ) )) ) )) ) )) ) )) )) )) ) )) ) )) ) )) ) )) )) )__cbegin lea stackend(pc),sp ; Reserve uniquement la memoire move.l sp,d0 ; necessaire! (Libere le reste.) subi.l #begin-$120,d0 move.l d0,-(sp) pea begin-$100(pc) clr.w -(sp) move.w #$4a,-(sp) trap #1 adda.l #$c,sp super: move.l #$0,-(sp) ; Supervisor mode. move.w #$20,-(sp) trap #$1 addq.l #$6,sp dc.w $a00a ; Stop the mouse. move.b $484.w,conterm ; Sauve ce bidule. clr.b $484.w ; No bip,no repeat. move.l $114.w,timer_c ; Enlever le timer C. move.l #null_rout,$114.w machine_test: move.l $5a0,a0 cmp.l #$0,a0 beq stf ; Pas de cookie_jar donc un vieux st. move.l $14(a0),d0 cmp.l #$0,d0 ; _MCH=0 alors c' est un ST-STf. beq stf cmp.l #$30,d0 ; _MCH=$30 alors c' est un Falcon. beq.s .falcon .ste: ; STe then play the music. moveq.l #$1,d0 ; Run the music. jsr music move.l #music+$8,$4d2.w .falcon: ; Chip music crashes on a Falcon. move.l #colors,a0 ; Save the colors. move.w #$8240,a1 ; And put every color to $0aa. move.l #$aa00aa,d0 rept 8 move.l (a1),(a0)+ move.l d0,(a1)+ endr moveq.l #$0,d0 ; Clear the screen. move.b $f8201.w,d0 swap.w d0 move.b $f8203.w,d0 lsl.w #$8,d0 move.l d0,a0 moveq.l #$0,d0 move.w #7999,d1 .clear: move.l d0,(a0)+ dbra d1,.clear pea file_data(pc) pea file_data(pc) pea part1 ; Lance la partie 1. clr.w -(sp) move.w #$4b,-(sp) trap #1 lea 16(sp),sp pea file_data(pc) pea file_data(pc) pea part2 ; Lance la partie 2. clr.w -(sp) move.w #$4b,-(sp) trap #1 lea 16(sp),sp pea file_data(pc) pea file_data(pc) pea part3 ; Lance la partie 3. clr.w -(sp) move.w #$4b,-(sp) trap #1 lea 16(sp),sp pea file_data(pc) pea file_data(pc) pea part4 ; Lance la partie 4. clr.w -(sp) move.w #$4b,-(sp) trap #1 lea 16(sp),sp pea file_data(pc) pea file_data(pc) pea part5 ; Lance la partie 5. clr.w -(sp) move.w #$4b,-(sp) trap #1 lea 16(sp),sp pea file_data(pc) pea file_data(pc) pea part6 ; Lance la partie 6. clr.w -(sp) move.w #$4b,-(sp) trap #1 lea 16(sp),sp stop_chip_music: clr.l $4d2.w ; Stop the music player. lea $f8800,a0 ; Stop the noise. move.l #$8080,(a0) move.l #$9090,(a0) move.l #$a0a0,(a0) pea file_data(pc) pea file_data(pc) pea part7 ; Lance la partie 7. clr.w -(sp) move.w #$4b,-(sp) trap #1 lea 16(sp),sp end_proggy: move.l #colors,a0 ; Restore the colors. move.w #$8240,a1 rept 8 move.l (a0)+,(a1)+ endr move.l timer_c,$114.w ; Remettre le timer c. move.b conterm,$484.w ; Remettre ce bidule. dc.w $a009 ; Restore mouse. clr.w -(sp) ; Stop. trap #1 stf: pea stf_text move.w #$09,-(sp) trap #$1 addq.l #$6,sp move.w #$7,-(sp) trap #$1 addq.l #$2,sp bra.s end_proggy null_rout: ; Routine nulle pou le bidule. addq.l #$1,$4ba ; Compteur d' interruptions. bclr.b #$5,$fa11 .w ; Interrupt no more in service. rte conterm: ds.w 1 timer_c: ds.l 1 file_data: dc.l 0 stf_text: dc.b 'Sorry, this demo does not work on a STf',0 part1: dc.b 'intro.xxx',0 part2: dc.b 'balls.xxx',0 part3: dc.b 'stelex.xxx',0 part4: dc.b 'glenz.xxx',0 part5: dc.b 'bubbles.xxx',0 part6: dc.b 'exocet.xxx',0 part7: dc.b 'endpart.xxx',0 even music: incbin 'a:\shell\big_alec.mus' even colors: ds.l 8 ds.b 128 stackend: ds.b 10 .  ` .. INTRO XXX `p/EXOCET XXX y`)BUBBLES XXX +`%GLENZ XXX `+BALLS XXX `0^STELEX XXX `5ENDPART XXX `VX_MAS93 PRG 5``/PC `Pack-IceI *L-9,Lha*oMGLA "grѓg f``GP$]t***Ԋ**EL ;H ;C&NN&&Sj&n".扑&&SjN%a*d"ra$dCv !a"H@@Vҩ%QnNuf%Nurf%AQNuCtaTxr1 Hka1 Ag"CvtaTr1 HaBq jD`rptadpt?aBC@!!Q`R   ICE!-h`Yg4 /<a6 NA\ Z\dwdx}03w^ 5p3Q赈H8#,wk\w,Yֻ-`kU:Uk [z̬m-ОWZ04Ѡ/h ѐO`. -|z10/Za(/ ,@0@+Pa><DCQ<= hfaI"0nB+02PPcYJ0<A2Y0*gJ0M{'g,LJeF~fE*Dg@g pV5Tx(lv`K6 *2 sA"2A=0-4!ueX4s0B!EX@|fx33FRZ@22os0]<>GO+.3o$/ h:ԂHB؄HD}փHC@څHEEFGoM N,pN)y0^x8fx H# 89Cg yG+Ho?1%NNT1}`y N3wH@X 0|@̧w _7R BgNAH&IT2$vX84$CD_2RCf mxpv6B8z~N[l:>xB-oCǖA3Y3(33,gf=RMfϛ漪o-l #:^_1IӅ㴍>ŸJ`<Ż/mʮ[Ğ Z 眲{V xV t Wg 9F1sjs%c2p6f(J*J46QSjHS*Ѐ(I8:,F;( QJBkű'`cRXȀ2X$s$%&UK 61621s)js%fYb+ h/tEk\4?<$#h4VI+&&W`DbEEo 6`lf4 `VD<Eo(؅Djvk`EDE~DDo'XB6SCgEj`8v|H03@@L؈ ?g"&o$D&!(hs 2~@09gz"4*~1*!.1:.< 46$2 &3 B*t0HCN?BUujҀU&x^jҁ'@hRg @ dh҂(@mA$<&?ARC8ADI@B@HJ8Jo2|(p"#DDD2"222WpH0<?~ QLNu2,BPLZA&v j 5 8ȄdB> 2rP& A6 A& @j j5ȄdB 2xYo_<PB(!Y~!~ԃzPA= A~ 1ǀ~ԃzPA=h.c?eԃzPAwyЀ~ 1ǀ=({ g=   ԃ z P˃c? A;((A=((((ԃ(z]4ǀ~ 1(G0Y00A=0000ԃ?c?0zP8z8P88A=8884@ 1ǀ~ 8уw@փ@z@P@@A=@@ =U(Xڴ97Py342P0*.T+ (U&B# P*T U3 *Gǖ)0>"f X2`wjuʀ09 UB̀06f@XCWVUxeR}(6HuC~`>8/.2:#Y>GP]!Ev4UTʼRXETw hR=z)JQ+ndJvGYBTlYǞA%zɀ,BP  9(Q"oLZ]oy` / "ZxZ+N #NBӣ֤-T1U4Wc8_=aϘϖOXKQjuX;ZRvgEc lLH,vH{A%%ˈ06f (ԂU V%Xc?VXE`Հٕ*ǫTSZ*M]F.}̤oeUYڔ9Al-ڙ!Eר٫xPZn%_OĆPA& kgR\35=2<:ekX 64."ֶOvX;A#< 5)^T^fMeLgKN>% !Y)E"%3"!A=ũA%uɈt06f@fΏU V\}p~H zX%`vqUlVg\a["fWMFM1e0Oh J XcUўLIZèU,%ʕ@u(T}BR\X%'? 2U E `S*T9ZSB$K +P 4 p-Ky+ϒzܳ#j*4-14 8+JǪ Q +cZz{^҅jIkndm*zj-ףV/LZ5RV[ (##$CңGVKZ=jOUTYT^JcSei*oLuiO&{G@VIH3&bTVdF*Q!CcU" TJP)r< rO}@|p %U?=8S 97)64uQ1ֶ.4+`(Wd5 j`U)֦4ͤ:ZhIXd~ڒYR`ERfDVgCFgB6gA* H ꘻(cF͆5 4ȦɬRee̲+ muֵڬf^b&q T6.~u'<:]9L"R̻x3d+kaldkji MLL(z y`"%bKr\2Y9APIa)]IYiUQu~xR07deJҶۉu2`fdТt9WkP26uAdR,A&k@*5 R- '5c%c$"5)Uk#&lXo-jXc48iGS"VXC2>i=7Q҉ ٝ c 2ٜv5{P#[?8sY0Y̼ ƫ ,f0ޫ+f)K±l,KƂ\, @1.D$byX)°,, K‚ #e`XdYY@ygR'V&Ȕƴ S:b_Rg^Zg]JKmi),%Į ԱJ)b,Ơؓs k2?c>[2>S=K2=C<;RvgE lL, H *Ahn͆5 4fd X+qu -  +oT! SlJLJ08neZ)jӜʚ|ʘLʖ ʔIG1ّ+EJ4$#r#"hA6 8;N؏qwcd1+8f Y X1ML KJIjHGFT&)*<-1*4 8+i)Qg ZewcŁ:2:u9v{&jndm̀05 54vf Xk 2`^j\,0-e ؕ2`UʀM0) 5-(c k2`Llɀ))P! #2 !2`Cdɀ/)Bv 1D P C^1YX$ɀ*P$Rd@ 32P0. +U(B&5[, B*]B Pycj8OXDh09=a (:5`u;N]X&gP?)k YA5zuB5`_CJbPqDkE5`XFjӀYG*iH0I)J4`LKр)LkMԢ3NROHPhQh 0RSYTl U5ȄVkWXtY5Zв [Z4\VX]k^b _Z`b aZ*&b*ck1dUb 8eFfS!gVXhQiǫZjhmkcjul mvn{9_ohp%a Xqr0s5stbuj0v3`w[xykzԀ{U|޶}~/O8Ձ4`U S]*K-JF9H 7c1Ef:taZ"TJP ZPLB}?V>d=:976PdV2.+ (UUxU*j|V|+#K\ӵkVǣͻc3`kxh3zul bY<ԎyqzS<0~P)|N&ow3)DuȫԀ UBP*T^"   =Ƣ*UAU xU * - 14 WXYDHLQUZ^cglqv{f !"#$%&'()*+,-./012346789.~:7;<= >?@ABC D#E&F)G+H.I0J2K4L6M8N9O:P<Q=S>T/U?VWj@Xyމ~7mZ<eu"n/3[3 e7|n\Y3 Z9'.g\]=LJf2iFY׬x>w0{Y.xNع H {c]L✈\#Cq.nnMK6=3Y1#dF"%cv±pCǤ <&' 78dqҭNLd3,w/8Z'Ey ȱmb1K"p\Ji s\ P Bєܨ`1krc=c ^ľx,YC8:  <=sWˀ[ƀ>/R 0P:C18X`\S?h@j xňEi5?dt;;!T^Ջ=eD>= ew3>߳=3=ϳ<3<47|\<ܼڜ|\<̼ʜ|\<˾˼˺˸|˶\˴<˲˰ʮʬʪʨ|ʦ\ʤ<ʢʠؓ;kr&c1GD&..-/;DGć6B> ȀxC^81Æ ,80 -=Od|;dR‰;|þJĔ.~&}1ǏQȵɄ[:˭"̙͌ ·ϊЕѦ2ҿNr՛3gء@ڃ&rnu$:Z=q/l-t7Jd+Kn78[#}E  d * | AO5TL}7]y+ 9l!"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;=w==>>D>q>>>??/?N?j?????????? ҔI}TDxy8A4DA||%Ax(L}K f f8=9i3v`DE!_0ߩDP p=܈9N8p/v:98(C80sK;}`|BHEAU(E4IG9pDB'x+3  819& Q"HoO"rϡ.A< 9Ѭ ^/W,L.g9#C{LB"gH¨"~fn3xhq 6uہH(JE9@8?LtY?Wͣu/I?8YCoՂ;{X~ZxI]fQ {y)[|6LSq*(5<ffVx" x0+p^07;|sx xf"x,Z,DŽ+pQ! @ƹɅu! F4,  1 qЃnAˏY | W ??lލq*rV3ǢEȒST88;A8.SB! R Pd[ 88Y*rq*r qNEAa*r걘xxE!xn9(vV7"KD @Ml9WLe $TFHEc??yg*r=-B^q`Z8BWE 7_?anaC 6B$f" x $)!>qiJŅ* `΢ ^4vnAA ` + 1;>3nf~x/h"H2B&Ag)@/3E9*/7D,eiPf 6 @j_?{ 8?+no-<xxA^PH ; $ Ot`|v   . , ., 6apƱ 0,KˍTy.^ 89{lQl~ 224ABIHЁ H6QZlKS1!JQ9 VUF`fUR%~\g6h?:%NNT1/`2o 9H@X }KB0` "j Q@Z BgNA(VdLX8|=Gpo.8RƘV6oR>Ÿ|r8G <9$ @"@$@&@#se ]!6SLuDHw<NsukUI=_%kHQ"D "4Hd1/-*>e"o; m0Z&TJN "8  "3DUf   !f dt9>(<0?yɒ@bcܿqxqRb5 %` *W9'I@x2Y3H|&9iD݈c!ҁNoX8/lݬCI=C^вRr@'^r"1>윙 22' )"  "ݼWV/x'08V+3dFmUssfZ|.8B-$@m <$_9uan+2F  8[h]ѷH7aAL=s=̀D f/z5`Ħ& L0~/NkR7ȺED6 ;3 /CL OpQ?e@; ;N:xH]جg!71 T(_Zޞ`TYbkfi xb?H@`o'535eš $xd$-w$&w+yzP1uC 8_G=o[ޘxKI dyeU XNy]ggjP3p/ i+oq^Dms?;C:7?.PT;oZ,_wBK~? - :ԒُS֗?D ^ez3-Ldƙ¨,oP4 z1$P`|8noVGGD|Z=`lʫj\9(ۃ;"ӐxnG@],op(0xҮJ(Wph5 2ބpyw;kXn2>>R)(Th{?:ybgl fo ~(C@+ C 83+(k {?7yB;szP `)?(E*??$pւ sMG L7<;<[ly߼Rs.ܯM? *@?/*ǝU֋ =E.n)@o4 $u* ,*?غ`  >8TrA >֚%< x!`9uVW*?ΰ[_z{g;<\?+!E&q7oN8<9Z;`/Qx;>,wx<:%9- 992?.~$iڞm-_Ҫˎ }P3bޓ(OY]hPHx恇OfޏX?@ aN$G88T|PV^PmgpEߎ!U : GJ@lpxC<>­1 l|)#_Wsk45?Yx%Xރ(E!xxv}NL/j*;wŢ x|!n5 ]ն<*C <]lxރؕxW50$.A} s;@ L>6zrNLJ;=)iґֈ,U,9fD83~ Hohxw|;0y{wpރk3!W޽€@F]@g'ȊH7|/RZz ЬA 8ǧ<j(?N7/'/2UOڙ#[zݦr v1 ۀH7^04 <=w`l'Ybw{K  N xdF;wl4D|сdƭy‚o m5ŷ3?z9wфs0/8y)00|ukI4^z8'?רONo<dˍ xG{fH" kLy#qCSs'N`.EDDv ;r| X>GAFh #)`9D@ޏh%%ڽ~C9/\(OF`to#/~z9sfQ3;י s7o/ ${E _[{S O eQ-T:>GNO|(i6>0OONB`pb*xRN7cO") /5% +,  =xKu- OekZq {TX  }٣jaE #[ ކY]4  %ޅDD @qo0n cS?sk,s<_fޏZP`/`:=قGG}>{\T+cNx<5sx ܃&s3/ߐ4z|n@ %XGxOO|3ޔy+с4 U5 ?' VЂssvwgs'fi?֗VDx?$_ZF0?vt${/I v?oK?$ _ֿ* ]  opпD2/ /b{NKe_B?n$ $'\@_C8Cwzrtk瀔oN@pX=d&wl`oG\n2) -QXșE7 UUc/^1ZΡq0Sc>tʹrW][\\G\x{_3;a D GwUNUU"gʣӑ 0Ykọc>j C$n$F~_JYle]WX넱D 7?Bj;Dև݃Z[cFiUWVT<7Z\`8c[$o??y5(}`]f_BkTy%pVa7*.8om2$|ǀqL}Bb;$JI?Rĩ;)۫8..@>amS#0+| ˵ qfc"k<.e?48s=8[N11Ć oa858ww@qV U*R`R/?ϣ;8(3qx:dg 3b oa858ɀo>7t-1GK%72/ 3[ytzXWH @ ߻@vp[m` `)GX ^_~Ppڹ#gjU*!g2_ ct@׀(>ԍó4  \7WdGo Ue+, ؼCXސ@|Y  ww: ޻E:wB؆e5UU {Ŋ^\ t~tPqN2 V񭦲X{5v{#P^V3K R.F(G@P# "Ⱥ-˥4ĻT҃p)2 +9:_mk_>Ћ0t?X` Qo"ZW((8=E2>?M xP_ D'PXgjsR֊s:x-Jwc/E@p;ԀB5x)6w =\nZ* (NPP5V"̰xyPZ:h?B]@@ږ8Vq^ 7X_cMA - ,H WǾWu8Kũsp_^'~Px]H En-pTs.E/px|BA6Kd P T8k?^AC_HV|J[2N>RIhy~}д@/*+/mxn/~ U ksb~?_(0E?JEE@"݀_ V@w6_s`vUꘪݪ"Y~KUV@_薤16-/dE00z$@`WUUK((T0> MX WE^_>Kak*W| W]j_D3)@6V_ʿ +h g-O!Wxoo Ar +/ȿو&'xr@PQF A T}A>@@@"x'ݿ Ϳ`؎0ZLt3/-0"֒kx=}o_wYf,  WWd(`';a ^>zd8ڭVq!-˖?-oe"`Yqo8Z| }epSvpP` Hx 0L;8@rۇTS@ 7,q waNc4xl!ox͜\~|xdM&Nc6>ЉW8Ѐ_,*U%pKdךnITVH&>yGn$!;xx`3 Y(A swEb$x8 Zp.f*U/|t vJ xuzxN^+8| >r~ZtZp.|-tk x rzv|R~ppH@20D@3Ѐ;`xҁHA@ ?ڦ<>^ b0:fob0<3nUXJ4WFU(Rx!ZHIAYZJ&2ff#-dp+DBqk27 4쉃슅3Œ?bxC\ z[omCT<2446[ NXN' HX8.xH#f J3A_fyJ yg 89V?Cg`Z?~%NNT1L_`dޠ [6rH@-X lQ*rV@6x,KJՠ BgNAG// 0|@+sPd "_ _'NsH2B4ABF8>xxA:l<DFzAo̚ǘC3|(3.3̉Xv$qؑ*J,K )$aA34 <HR܆ƈ RCK2 :څHE2@@8E46; =܄2FɜFHFQ8$H0<@@L؈ 2("m4($M& (X,#&@09;2""A*61*!{ZY .1:?.< 46$2 &3 B*t0HCN@SBUw& xZjRU&xT&%x Ԁd&-x (T<&5x0< 8*ArUXB P(*0;A8@t,56 j\x 2^j րgjޗ=ഥ6jx `^j65 *D؅<2,HB<<1?1Ê,Ɗ>7>U>s>>>>>? ?!?6?J?]?n?????U`??????  mOm qWlv" d č@?[,᫱ìj*/?>{ʜj)D>=w'gs.grgqgpfofnfmflfkfjfifh~fgnff^feNfd>fc.fbfaf`e_e^e]e\e[eZeYeX~eWneV^eUNeT>eS.eReQePɝH5911W"&GČ.Q;#Cr!Dd@~!A/VaÅ  -=Od|;dR‰;|þJĔ.~&}1ǏQȵɄ[:˭"̙͌ ·ϊЕѦ2ҿNr՛3gء@ڃ&rnu$:Z=q/l-t7Jd+Kn77[#}E  d * | AOV?TL}7]y+ 9 !"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;@==>>D>q>>>??/?/j????\??u??P|)# /n;-])$,\*+[W**Z'+W-%T40u"P33M5HR9C=AVFv;naJ7 LK^J8>E;.߇:D7NFw6XG 7F/;Cm\VD@9C=#D <^CK=w A>=>pA3{A=KB=A/>@@?>A>A>AJ?@?t?w@i?-@?*@?^@|?@=4l:?@S?@N?@5?@?m?@ ?@ ?@ ?@+@((p $>Pv ,L6o'/5:o/+  `s6+$,b V@ f 8`r& `Pack-IceI *L\,L/)a*oMGLA "grѓg f``GP$]t***Ԋ**EL ;H ;C&NN&&Sj&n".扑&&SjN%a*d"ra$dCv !a"H@@Vҩ%QnNuf%Nurf%AQNuCtaTxr1 Hka1 Ag"CvtaTr1 HaBq jD`rptadpt?aBC@!!Q`R   ICE!/)`WhXy 8/sA\ x-'z9?K64.}pp B3 $if[B,H8#T>#g>[qn`Z`U<Yfܾ2\0س 3Åx^D̼G",+^$mX,Φ |*s|! ;fpzx26ĭ5E^0E4Fo2Fl6SDf](AT' p4vZd rYGt  \\>*`>f2;044445:(4qBCBCgvoz`"3 4`G2.g2l? 04b~8-l #t@ N 0NhJQR: 8x!$G?H؟ z)rvLfD)x$Cv[/tR@g3t 89 i?V%NNT1E`捦 >H@X 60|@> aq BgNA%;(3O)z2ܜ)|)~@A4}6*3_238y(8yQ r =;G6D8:>؄HD>܆HFàڅHEއHGF< GJHHMNǍ22SL5EK{H&IT2$vX8 4$CDɿ2RCfGm=x*8pvB8z^i+l:çxBO6oCǖA3럖3ęe3].'\RMfcUW>έlqSa^'^+f1ibW X`gx2^CMu3!:UwA\V8wVתaN ºz:L1Ê,Ɗ<Qq/HɖZՎ1`C ~,r*&kǰ|nLp|m$$ ׶XE`Av@5H8ʩJ@a g@?wkYe5WV[jY]e/?>yOY-eD>=yCwYd<[NB;dl; :y+/9V*8m77K6Y_E55644S33g22t11y00v//k..Z--A,,!+**e))4(''_&&%}$$4#""=! 9+y]7}LTO AlL, lL, ٌ۬lL, ˬɌlL, ̿˽˻˹˷l˵L˳,˱ ˯ʭʫʩʧlʥLʣ,ʡ =I&g2&~1J&蒘.Ѣ"J;tD|hC.䃨Ё 7$Ŋ#>l0 -=Od|;dR‰ ;|þJĔ.~&}1ǏQȵɄ[:˭"̙͌ ·ϊЕѦ2ҿNr՛3gء@ڃ&rnu$:Z=q/l-t7Jd+Kn7~{[#}E  d * | AOS?TL}7]y+ 9 !"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;=w==>>D>q>>>??/?N?j?????????? o $<x,`&>*,o$"~( @n`>`Pack-IceI *L(,L-aa*oMGLA "grѓg f``GP$]t***Ԋ**EL ;H ;C&NN&&Sj&n".扑&&SjN%a*d"ra$dCv !a"H@@Vҩ%QnNuf%Nurf%AQNuCtaTxr1 Hka1 Ag"CvtaTr1 HaBq jD`rptadpt?aBC@!!Q`R   ICE!-a`8f ܬC+p/"QA\ sy1<`.I-4}..3`2spDA"H8#d(`02n @1`eZ$c p#,z;/8(84)<K4 X,n T"/X=Y,Ԯ\.V+ݰA)oDWi2!4)̮ N`1 N.=^ ^TT0@2yx4)'B6N>Q8~fx!186 89g y^o?c%NNT1"܂`Fނ ݜ0\H@h X 0|@60 v$XfmX BgNAg2B4ABF8>xxGA:l<DFzAo̚ǘC3.kkP3܅39Î$;*J,K&a$LuA3Ý<HRƈl RCK2 :32@@pE46; =܄2FɜFHFQ8H0y@@L؈ ',"D.9bxfx(d ٺ@09 ,"*hɠ1*!Z.1:P.< 46$&3\B*t0HCNՠBUU<j5W<*@< jd@<(<@<0I8 x9U,T U B(0;A8@N:U,R x\ ^2/ wk3W{KmRx^`/W{6Km \*Dlm%YI1?ARC8DI@ B@HJ8JB2|(p" DDD2"222LNuH@AB$O'z&|azE3u@N&E^ 8gT Sx XtEw 3%02 < 88:<>؄HD܆HF>څHEàއHGED88(I/ =rT6@N0HH2,HI$(B!CÃÅ889oL?Nu2PLA&  j <5ȄhdB 2PLFA&p j 5f 2BPllo_<PB(!Y~!~ԃzPA= A~ 1ǀ~ԃzPA=h.c?eԃzPAwyЀ~ 1ǀ=({ g=   ԃ z P˃c? A;((A=((((ԃ(z]4ǀ~ 1(G0Y00A=0000ԃ?c?0zP8z8P88A=8884@ 1ǀ~ 8уw@փ@z@P@@A=@@>7>U>s>>>>>? ?!?6?J?]?n?????u??????'z@?yYVcY}ejU/?>RD>=7wO<ŶdB;Ll; :Җ/9m%*877K6Ud55644S33g22t11y00v//k..Z--A,,!+**e))4(''_&&%}$$4#""=! 9+y]7}LTO A|\< 7z;:s:9s98s87{s7s6ks6c5[s5S4Ks4C3;s332+s2#1s10 s0/r/.r.-r-,r,+r+*r*)r)(r(`ODə19&$f.GF;ڐ  *t  zĈ.Lx -=Od|;dR‰;|þJĔ.~&}1ǏQȵɄ[:˭"̙͌ ·ϊЕѦ2ҿNr՛3gء@ڃ&rnu$:Z=q/l-t7Jd+Kn7[#}E  d * | AOTL}7]_y+ 9 !"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;=w==>>D>q>>>??/?N?j??????????Uz< MEVػ=P@  $"xa(o4 ( q$^_ Vd 2|<`}}J/<?< NA\ 3` p8H@8H8 # < |2|@ Q?<%NNT1` <HH@ p0|@"< Q,|~?<%NNT <24AABIHЁ HH@# !p"$& @"@$@&@8|@9<fTR\g`h.<?<%NNT <24AABIHЁ HH@# !p"$& @"@$@&@8|@9<f 89gQl~?<%NNT <24AABIHЁ HH@# !p"$& @"@$@&@8|@9<fUR\g`h?<%NNT1` 9H@H@XX <0|@"| Q BgNAH(|dL8|@# !NsHp"$& @"@$@&@#R 8<ƘV|o8<Ÿ|l8<!NsH <"$& @"@$@&@# !NsHNsuk`UI=1%  "&*-/1111/-*&"      & 7 N !yy@s(h N9 Q{WWGGcc@jj@vas Qt{ L   90ɀlD: ??@H}Qk m``Ii)A>@>0//i6"b] ]WW@HK0i$I; `|p@[Hp88  EE)F}}0o0o$??__(`$=߇0@[\@nD%$ @-f fB44__ww}ނ}\@GI`_ _>>@22?/::Pwwssãwÿ "!"a@/p`_ _11ƾƾ ??C33탣}w}{]{]xGG@@gga@gg/,Z/,Z88@@t|__>>??xx90@__ii88DD]]x8'`'&| $0 pO0O@~~9[9[? U U__|p"ww?EUEUTT@@@@<<"_"_  x`<3 3x@|`| O O88@``EEppss ||  0 ??_ !?*(wwJRBRUUUUH0~0~``?@?U@T@@% U UBB~~*_*_UU( UUmmQQ"C C@ _@ _EEP-)UUA@@) 0// @@b`UUUUWWϐϐ@*U*U__**UUPT  PPB%CUURWRWUUUU(UU(!  ,((((ׁB]B]T{T{TTQjjU!!?PPuu _ _*w*w*@1@1}}__@@@@@EE1X1X1OOWW@@UU H@?@? w߈ w``TPPh`@@~~OO@_ ?II??WW@( & AAɀ@?@? HǠ @PU d{}}__@"@"0s0s>D D ``S$S@@"AA@@cc(0 0™™""}}P ,P(""݁~VV@@@8//@ AAPP@@ wOw@ ?TT(?(`ן    DD(  @ ]]ww__`B i# @  @pccA_=0oo'0)R=//`33 HgY f??$$u ` x~`~A**W 33 B !}?@@"Um oW |x}}x$4 DDH^ !!@< " <Â}aj|@| ?'#dDDo`b}W]PCM"<-XjGdd12I3 D$ !YOo( =h ` p_| !> ʠ5G @??1%P`B< S[D8@&#\ -GA.@8? 8u _jn0HH?((40oo"_"_ll>>wwA((G@""4l4{ 6:@?@@@@@@ ' 'AA__ ye@#@ @@IrBrG7WW(($$}}HH@(<@p@QRQRXXEENN` jUUUwUw ((KKNNUUTTEE@@PPAAϏϏ**UoUo**""JJ((~UXUXUoUo@@ ffHHWUWU((##܈ww&&$ۀ$ UUUUTETETTTTPUPU`PP""ݪUUUU v v ^^KK##WWU_U_@@@@UUUUkkFQFQJJUPUPUUUTUTWW]U]UU]U] ee__પUUUU UWUWuu Q QUU@@%%&&@@EEUUU@U@RURU uߊ u@u@u __ UWUWooRR@@@@TT TTPP@@@@PP__ TTpp  ______@@@@TT ~ `~2@@**PP@@ uu__ww{JUWUWTT W WPP 0UUUwUwTTUUUU xh ))QUQUJWJWUUUUZ @UUPZPZUU**;?ߟ@@ _ _PP,  @?@@ oo *~B*00zz@@@@? и++((c??**___(?*@*TwTwhUU@@``l`` UUUU??TT튀uu??p BBUUPP  @@@@7Zp. .@@))Cjj ߀TT__    ߸π  `((QQE@E@UWUWTTU@U@ܿ**A]]UUUUUUUUUU  | UUTT _U_UUZUZjj]]U~U~UU?UUWW@? @@BBZ(Z(T*T*բ]]`++TTƀ _` s]s]__@@**E@E@' 3PP z/0 )5)5@@Vw""7  $$@@z Ͽ@?@(@(רWW@̿""`߂@0U^U^PP0R?8 w{*RƠB8V}V}__ 1UU@@u  ))PP11 n"": r@?WW?? >UUxx`TTiiTD* *@1@1? U U*W*W2w2w__D  @H@H@@_@@@UUQQUUUUPPW]W]UwUw]] UUUU__, ̢ ]ߢ ] QUQU UUUUPP((׀TTTTPPRRﭪUuUu **00 "w"w@@(u׊(u׀-oҀ-@@G;;PUUUUUUTPDP__ W]W]*Uժ*Uա!Nޡ!^@@UUUUETETDD  >UWUWU]U]W]W]BB7`<UUUQUQUETETDMsUUUUUuUuUuUuuu@@ @@!}w3wx 0UUUUUTUTUUUUU@U@AAPQPQ""ݪsrUUUUUUUUWWWW*Uժ*U@@ " "]3;]3;UUUUUUUUUUUUQUQUTT@@PqyCUUUUUUUUU]U]U]U]* * 0bϝ0bϝTPounp >`>UUUUUUUUUUUUUUQTQT__DD(ϸ@ǪUUUUUUUUUUUU]W]WUuUu@@@@ m m@8U8TUU"UU"UUUUUUUUUUUUEQEQ@@AA\||hUUUUUUUUUUUuUu*Uժ*Uՠ__  ?? AAUUUUUUUUUTUTUEUEU@U@EE|r|  UUUUUUUUUUUU]W]W(]ע(]??mm__>   qÈUUUUUUUUUUUUTUTUUTUT@@TT EE> >=I A UQUQUUUUUUUUUUUUUuUu %>% >?QQUAUAUUUUUUUUUUUUQQ! )~> %z>MYDUPUP*UU*UUUUUUUUUUUUUUwwPP PuPu?VTA:qG2!!TR @R (P@(P@T"T E EUUUUUUUU@@EEEEPunp?hD;P@;""U"(UU"(UUUU"*UU"*UUUU@@""ݢ]u]u`  θ΀ $B'=@'=(U(UʬSSPPTUTUU]U]__@UUUU T8U8 |DDppQA*Q*@U@UUUUU*W*W |l/PP*PP(U(UUWUWWW PjPjccN$((((@*@*UUUUTTuUuUw~ >@>TQ*TQ@U@UUUUU]]%Pگ%Pگ}}QU5U5UUUUU29(`yY@UU *U *UUUUUU_U_qPi*i"???>>*(U  UUUUTPTPc"oo@@??  @@+* UUUUUWUW<<JEJ@ @  (D  uUUUUUDUD8B8 $W$W@ @B   e eUUUUUUUUJ@H(( 5  UUUUQ*Q*==wwP@JH V$$@@??__1mW222ɨ ɨPP"2[:'__FB%B%A"A2@@XXQss={   '  BwZ}VR€n0L0PpP@??@@jjn հ'mup9 {ZG7Ȋ7Co7 ]n&mu @?@@@T!E+'D@*@o@/P5**@@%9m7x"xNtm@@o[8?{[LD+: [ vѶk:?@@q:WT'xww@@{X?;Ug"@"-H@-@Dh_]g  ڲi)RE p[ s@C@}6JAɓ§Z'q[*o ɫ"S?U M `DoU  /5߻(E(_@߁ 2M 2܀Nge[@2@  S V KJFN\O_TT ^60O0 @(5@c1:Qbqs@N@ C `ZP*yT[d @ e?{g;`IOPd?`j)M @ 8om@@;BA;UONfŢ: ۰ (((h~[M>-M)?mU wP۔HBHp?  @@@R@ # @h@*TktַnmBj@i}((6@@  ]G>WwOlH$H8 :::u/0k:  ~0|[:[Uk:8:8@h@(@7@www7ɶwUwuҧTtdNv/JwrXgH`O}VO/ / ?@}juU}qeu}|o_]}ԀՎɫ@ۯ@ECo-uɪ+Is>ɫզ@$@$Wv]pN?/W[*] 26wkt22O>0}9UBiI I @! @_@{~ W7*___ q?_ge [ ^ _l $H $HHsM-ުRmssN&*ss?TT js_s*@*?A A @@E73S@@@N@ "@/"@ o ^jQWՀ e oon/toH;@]?H[Q;[[Z{[$Y$mm _ G?zUo-ilm:mi@(@?`?myZ @@j@j@@j@@j@i w@j@BjB{J!J @@/g-N%tJ[{r[_vvi}*w": <j  2::` `׫ɐ`:gEwy\"_wwwwWwEww' w ԧoj??\zk` `T/ om}}n ]@@U}E}} } }}@T@OIɫ//tDt+ɩIɫ8I8@ɫ@UIɧBK__O& &ٓll8U?BCއ__@@22**2Wր222C3CрsӀ022Çǀ_ _ {EE$V/Y__^x{__\*]1?=ss_ ` "`"mq{rps |sssqCP?^@@ UkpZpp p=ڿ?oo?<1?pp -oo4 ||hN  ""//oo`c`c`[[[|}}[N^MkAAI@_y@=pp[|BC۰# # 7mm?L++{ {<@m@m  mlU&~?8`>8`8:<<o0D_|`@j@BjB 33==@h@0U00@j@DJDW;;NjO $|?@@j%@@@{@tt y8$( k"rr""}" "  $m|?@@|to)A(@ @@ ?w373@@. { pwpaa&@&@ Tt_;m?::~:QAPAJ J @*99:_ R< _xx88 K9\@:  $*88*88"88$$(8T*A` `Pack-IceI *Lw,La*oMGLA "grѓg f``GP$]t***Ԋ**EL ;H ;C&NN&&Sj&n".扑&&SjN%a*d"ra$dCv !a"H@@Vҩ%QnNuf%Nurf%AQNuCtaTxr1 Hka1 Ag"CvtaTr1 HaBq jD`rptadpt?aBC@!!Q`R   ICE!`5ELL/ \ s%ta3=`0f~8 QzH8Zw#<5 2umн p+nf88*$(tR@f#96,/p` G2t0vS@fD /"yC~Uxӱ a("FpDȟ R#T 3vD hG8]x 89Cfrk?1%NNT1}`y 9-`@X _}0|@" &; BgNAH$'sX&|Fzx0G'r3ABI(J0=ԃz"F =>b`6QBj@1T1\XHLodaAlFNkp&l-2 nѦ#xA2!ASt!AWv7 j H!@dW'!4B8F# p@AA2<4HQQNuG/ / / //A200<o$<N_v"HDHB68 RAQNu^? ? F%H#*O #YsjA{ i. H!@Syj 3/a:K&Gc40:28hœZ\8": R9DϋRy9| +/ 6<ǰ|Wx 3[骭ެ lVzKtG@x t0z2x:4%8pKE$"%x8<~:|:5G<5:up>: GGp,z v ڮ_жxA^PLBMF021H30TNп6 +4i3gJmH3Ŀ.3řgLNs0%xA  x]j:jM z"z=!nE0^yA R&~$q*gbJfC*H0`.87(N0\Aܶ**H#&L0)#0TA.|@m40QD3D3Ab@Bi.C6nJ5A4 p$S@ngR`7]`y<Ԉ$BpB"v? *ҁѬO3Q#~lB @Rq3 zm KT*HV2Rz'Bxanlki&H@J@ge ?Y`L`4o`@^22-`mx$4`PlTQc^ADxEC|p",TzJ[d"^a"mj"pamp"aGvIaO(XcXc JfvC(S)q(? -h6XJCg&C`02Hм9QcdS`$ԃ)AW?03:zaiF#w$9Tl1҄&`@LxZJ`$0:5gN*F\J WAeY0JA(.8EUЪ2P0ՙ0 &AVA1kK(#r2:4:҂#3M*iw21 yʼ2;f,`HBY@RFe::AfAaJ9uf4B;9B1@g l (pB!JPg,f b+9nn .gm9MeBG 77(C̕gt1|2yJ@>JkB`B.H<M%g#WӡgxQjhv6Qgr "A g_Jg "70k9wYjBu76!] j-(`A(`au``B@7Fdk lgl;N0l@7#V gM g g$<g>?MSYFP5Gp'`@ l8 Fo|k,g 3|$rBByYorDNu1JaxŴxaJ1X(\:@}hS@. m q0W`G"s2xpxY0/U.;E/N1yxO/.g"88 -R`>Us)f|~{yބ~x,+G`WC?bRK& xv 6a& 9I yQ1~~|>{Sb\S|<G15<8w7A ]]:F&na@0 $ L+(&b\h9q?0KsXVs#pA]qa;UY0^T뚺؂Io ÁU $~p~W=?ఱ6f$88}`/ {qa8\C6W4f/`@`xfa68T 8 K@"/@]mo lA8`dp3a w`<<+CdY?@$( Ky?}NOD> H0WeeA x .x@ /ЂK6=4w 78?K;:54I@ABCDEFGHJL9K  K< !"#$%&'()*+,-./0123K>KPoS=iViT7ZމWF&B̘n1993 <A a H+New-Y7Zjn(q) @no|fli-낀[scrGtYif-(,HBhWrerfuXǙ$ by=I_MIXEGlwl-1`xHU-Afcool+ago-YMerry<)Puy O!Kasar`_St-o[AcГy* EHM#D MF&ŏFMCCV!}eKfWPEG FUZ[ƹYd6$SUM*hMJJjLѓ8$OR QUA X#OXYG\E&OLOU\ASOACYB辤9`IKA,"pBIN6PLȆTKGB,V] YP DSPECTABƏL!o$ODISSEY'LEXPȁ =IlD,HRO,C EU3NRX@,DANEEFHPHILST,CKY-ACAR8^TDS,SAD-ET#\TYp5Z7,UNI,FlCONтLLϘHE GREADEMOMAKERSFIX-e4inclu*s,&XJselÉ7>k ,_Pˋn)~urclȉ,X0lkmJut:/rgGZhDNT P86Z^)$f>w٤q>5gRr) 277bapl 19730x6 drunkdafi1 g[birK׆majj+My,p X@&S{%@ o^XI didh+JVzV垹 wrgscTqTPghi8[kq+bm^4abfkqproduc4and to credit me/"bND,O^_s7ދi<~,'P ;`SEh;^,l+ex Y)x:֛ A<3xOR. Jp/h+%6uOCx,]x5xJ 0xvj%ש9 gxꔅujwa /Y6+XJH!d؁삾wH -xv]XxVX b+!3~P& s6aS庰n4^  1e <b: -<%H8AZ\`uyk^ +{`eeP?QIA۞* Ͽ¼xgN x1yr0  ?, /@=o@CKMS\[`lzouksmvvmdPKRRIoB2/?2'f붿-Sµbۏ`,'lx33׉ϱº  %'%/2?HURTZ[Zaefnt 0|R}{Purj^ieYPSTHKP@>3['' () g~ S3Q*Y  $_u%1j?@BFRPRWUW^`\gkmgnv} ʒa|tx(ribjejfR\`W°PC26I5.'/'! ϼ+צeO湃'< >60,**)S~hZͼǾ¾[𮫮ϔ.cZfH e*Ṽ̉.ǑZv S )'31/3?BB?@CMMLHSWPLXZa:\^kf[bgl h|}t{>~3u}p{vs|uXVtxn/;ej`[ZWXUSMTWRDBC?C@,[,# ը  hɼ3@kj_,."(tc,X)'. %J|0K#%.2/2=;6#IISUQTZ>bd,'ovsnrxuA|2)#rmrrieaf^Z`YMS3"H=;Ԯ,Y!3R䇩úº},Λᛉz2k  l/v3g8k!Hm[F"x$ <99 # #6!*-/.3>8>MjB@BGRTPdQRX\N6iumjjtor v{~|uv}zxx~|zz{{xssuromiijda^YZ[SXTLFBACA?=)(] GiC_!XOP ɵ )Z,R;?AIHMTUQU/UWae^^abgkiegnnml^sᅥnv}xmn}stu@/mruolmonfksmdbjkd\bfd^\[Z\^WRWXSPMQKFHHDHLD88CF@;6//,-*@m' ,MS @N zP-gN$ uM'X0:H|ԫ_vާ| ǐf¿þN׏y;MXr=*Q%Qv ] '%#> #'h-'!*1,&/"-,B@Ȗ0DI2;;525=;9@@86<98= =6;9=8X320 / '(*,('cY0c, E8^OHE0T\XV&,d2!:,Y_|XU #hQ Qja Us['~cI]Ff,ͱqLM0׮V0ۖ@u hfuL4WhJ@&%9)!%* K fh69>?=>BDFFCIM LMLQSSPQ#eS"XT@Y$[YWWXYUXWTTURSRQPSQKKPPKGHIGGFBBA@>&z -.--)1~c^cyb -&Ffg49r aBN)}=f8sl) Ң '0%bq##9莅@, ./q-X102113Y;:39;E6;f62`358985W2682252//0/120.*-0-(())*,)( %)'a !f`4feb y [,Z1CIXbqBk*`TBT 7ܸa;_C5a^0$VBI fFXL Aے@T TP.0qA ˘qKLJ[łeMV_p`jV68Yx膂JADA&`!%''=@#%# !@  dS-԰nz %Zj dye63Y`93oS8B`$Լ3䌥I3HP  PHDl7QF.+ϸ'g^UDsdljFD>)BKټwy`ߵQ^>$X]Y''#63 4rBSA),إ\2~–ӥ ^-LAH]%'$$,b^SRݺ'7 c̻،g[%S 27wr҉n nUH܅(73_cF#QflZS9s-+ㄽd,[Z>'sȫ,%3z7~Q]ROs%[7lrugYBr]L:(Qj&Y7ٟH ̦^'Ǡr'`,w䙉T&p[:ͻ7A; Srw^Se7(Dcxt=-w')1nL .SHY7Q' ncYQ[;DPB77l-蚉߀ǀˢNԏ%-P KP%PS=) .-;YSBnDZr3,DBP-J'!Ԥ/)?,Lw_|JɰO';DZ~Ͱ䌉%QeO1._Ir>^e %sYFr\B|rrr7br۔(rV%'9pdJ! $ӭBG3j/gQ? '#%Lgo[PF39ʧrD1n\g@`y^V%]DίH_i譁θǗz-q|-]e g@-QsS((-B]>%f>QYYvr1t"%D,wfcb0 ǹ5c)^D( ǓrL`^[}DvIa,vSUo B$3ZFU7Br )_}Nl S茀8᷿?3r%,ZY- S@d[6)ǰçrxI棭'%U>$n[ ]_%9|n73'>z-q۸ ^rH'!? %P? ,رӝe)!>f\@Su7b+m`{ua)'Q7ζ3w9@)%819Bf/¸3D?717[NS.fJ!zBuz`G`']`4LS Ӻ͹Y/S > Lr@3\~LYG?'B买# T͏8C[,Gъ@Gdž gB>3|sE 9#3#{&ԭǫؚc3k3`B8fVD %$2(1Ϲ63Yϗe Gna37j7?,7'P.'*_L@a>1)p9.G`d`2t>9'BL `˺9t՛%bm>vB]7xE!εǤ+觮7,{QS}e-^@fYnw}9#r}r)\>;Q7G71,ԏ=dǼΩ4ºX 13~Z2(U7B|?G;8'Hr3n$J "%^~GS }-谥lj L8m3[ضOؾ p]S^q|D9'HFHZ;ZS+&W n#tθ, `f.,^w>r@S'!B>.5ͦ΍/ԯ^Bk ,':!''73QBnSLg>^gLDL Ro3H#?Y1%g.)Sl΁UǙ?dԚQr>%Lef7^, Mc5P%~pK]3F7!nd7,J1P7)09DոͱƟ!#Oj!c(I3}7b^ɠ3?>VZ3-,j'='78ӗqs> 9kfǶ^%@iTQ>̳k'(7m%.,HJ>@% '?D丠(,B@y!# @n73J ?%G O3S QwLv>-O. 9.FX) I#3>QeY^]?;nr7,B,GSR77ǖ9>'\ی'qԴ%%wkZ9H̩J'HGFGUa 9>3[Wc,}|tdz!B]7YBY' ΰOө?#(Dcۼ,f>L'7 %?SHSY~;DQk,>}[@<97  %JF ĎkJԼ踍ǧ 75B7|%P?nS%e|[]7a[gnSH+3L>%O%>HȐ'{L1ZvBJ.31F91c -.>Ltww[DQ[>-SBn>)0. ?` X 3)},#,:RFGZF)%#x['%FVQ7H' ,Թ4%9?,JT- 1ODf^[(81Pn`^SP73^r9#wys$c'aPA#BrŨb#1]gLHBQD+$ G/H=N,,3-.?He`)?.7 x\c(ϡ|Sq>jrbb>%Q+F-(e}(d'S!)%^F b%s@F F+,]7%'?YY' }lԋ՗` .%3&%>'=,zl X@\(7OHy3\fF(gꋥ!VٍcY'z$B@(W%>0Qk>D,. AhFBY@39.@.8f1$. ?p0٬%;6u=ڴ b3-BJB;%B>F@;@?D?PL^dD>1 Un"gZH׌'1m)%98R<Ks A)'-#.-??,B[971,%?B7 ,93.)!,^,B'%,#,#!ۼ V1APN;- c|d?#-?ݟ[%D'W;BU!LG8)#Dqe53--F& Z75)eLijKeW%#28.P8 9BQOJVe'f9}9!.!%WҺ3;'β3&R3-)e) H'nߍg'/n:qP 7(%-F՟y(˥z#-G'w'8s kb.#-H7 a3Z'm# %(TG7 8'-'W =!ᘒ!|S"1h1( 'J@7BG!b: ԩ3wy6<6Jˡ8!%';P7%?_%% x.7,Q4 `/*qh!07@ C$eT ,k$e@0^-#s-.k3)BY!)3>%%F-7 ~J'I6`/^Ҿ%8&^!;-,3V'# !FJ% bBSX&JOX?19W.`#9!73D!#?I,73-䎱rz%`)/@,)U90(.4o ŭ)-X an>Y_ʬ $'7V).H>#.;@@;?(?!34^J37eX6R?;/t`#- )!(98^;7%-88',H7?,KN(`g0c A'i|5q!k #-c  (q33IS(ʃ%E'1Y;-b ,ehËL>*)%ȝb4:?y(O*!,''#,(.?- 1J!'k~䵤HHC(1 Àd3'!V#39),)31!)-! ec3\d8Yy &(.!fP ~cN6b̂(!1/#Q(# ,Vp4j,Yb)7>B#H/2XfW_QVJ#@(%a!(!##1PbQ)Jr'$1;nR b~XBqL,7,-(<4!,932SA ڐT$e*%ErƊKЩx`(o0E k%,Y9vÆ&=|,T $J*{!!n!WVlII6altn2`"4Aj҆ aXZ"g(nIJV i#P/,XN pBuCV6Ma,06kky$UFC~ʹjKʼn W},N"er#̌2A҃"@$ȯ, (!%(A,)11bDffdi\, X: f֘T\!%# #Twf'#jb5A"ZAfCUt;x VGʹ1=X9pܸX$!Kf2eOxC@gM1j 3 Ϛ KCZpc~9@,qu1ra8 C IZz 2,`FAy.= V.'f$^!֠f]sWX& :E@Yfak@g&Ky&73AlfV3 Yv%B#%VLGL-Nd0,HVں`]4>f8X(e3vjfb.1RBA@~E a@3# P_QY;)HXR6$2eeR?`+f2Ƃb d i : !>2őPfC" fc' bHH 3uf9psYxRۡLh2.zxnBc FɬAܠ Uĺ/y^]r :(OF9OfO)`cgח3x3ּq.Fs2Dó Yc9y:Hud!u¸ԝ2q`?uGr6$ ;0"6Ϸk9gbPqNZb8pMn]-\ jDj%h7Vp{usuxKXаϙ:i;X++WrKᆃR༰?GH6]q.@Nwpo-2ԽUĹ$G , ٮ˚Ɠo; K! D;!nNtoT0n Jk:[`-Nrpڃ2A8mlQmŬ$Kՠ5KuX :܀6SHIs E ![g<xESEݮs|]{'7.7qRgfo ('ο 7J[ivwrf]]^b(?y>1Yϼ-! 2Ygij-Dr?^U`sZ]ttYFRe`LL23S[LBsQG!~@5 Du˾°~!'!#,9HHA;DQZO@?FPo>5BFGB1()#8?1)>LD99@J@?UjgYYlj s}q]gqgZj]^lXd\`if[Z;PZdugngRJ^tlR&Ib)QD>95,uCyۥ,0PCKT1T-#)sV = %vci'L)H[SFFQʗSYX^]\\[RWO<;83;kGGYfeUJJR\dg\jlsdC}w||(wvqeYQQROB533-ZQ,5?g?V)98-%.?:7>?2!O.+iwU@Xl 56"YAcڙ%%)5?8)$MYF7-(8, )Cg¹  #5>>@L[^[şFelnqrne]]e`SHLUSD34!4bS  fhai3Cwg{tay #,X<879?F<PU[YO?;88;|%_Xŭk](R/(w,,)-7@S]`[P8H#97.N?a CG/Dex DIV83;##)3>'1DLS`%\^dgjljf^YUYZ[ZRJD@92?6Ǿ%( ﮺줟W%-8BFD??BB;75577 3h' -R /Xtbd(,}81Xx:s@*7iJ6RJH[fnniee^ZY\d`YJB_M.I4Fk?ZA!)( GN4, XONB8(!> eDFcFXCB`}:(%o 1'"i&(5(599|5>?JU\][>OQQO8B?brq?X '9DORR[HGJF(牋3!Rgfdl@R ց,'I'!uK-/ 8,&A,1,).5;@GLQ7PSUSP>8#]ᔒo ذu,28@;>>{BDDBDFFD>5-%IzTt"GR8er )a #Q027;?@DHJJQ~LLOLJGD>@?;731,%(fc@f%͘P%(ـU,y..1221-)'#aqC^ p[;[ ;W+n`iE8'H3"=O"k+f,([BeQ7d~gv4B0k6w)[,`"<,--,M%'()('%Ff#!!H! Vn1j'-X Ɔ{-ag {ccU @xh$Ɓy \*ƀjGRhbJqks4:b6+`a}bNm eBQ+Uup1T{% %c̉b4 @8>@1RmTۋZ0o&Jb ٪=Ʒ0'FUwN@Ws@)D\$\,6,aK[J1 x&f^˗s^kXZrprp\r).Ȟ1qm@(4@/);I; An+q݂\qS 2O:;qA$>̤b-\4dݝm0m-ru"aû:gevt ,$mڵixK+%u4ON%-.s896Sc<-𻴏Вa Ubvq[N+'BB&&д 1IMiS?<%d̲)|k 7?MhI9. "@*Ļ Ľg6BX`>9) 9$Ƽ6;S[?7  )6ּ 8BYS93/7ӻ! 'f>I]N:13.̹ɹ 7H`Q?2)+ ɻŹx .>OZE8'X99* ſ/*W+1>TY@8$%Ӿ$+0@US=6!YڿMgXRh`*71$̷d?F&!6JV'-Ii XʹORB-*E28-#mO$ (=NPB4"!*VRc`°ԢRTNJ-BR~M")56*51#2FSN>-75)ϻ4GTN<*~:6$ܛ˸7IRF8'&192" ƶOP5$"(38/ Mƴ `(>MN@2#~>69qn**>*?NL?2$?;9,_֙%FRM<+&/96)?W 1FQH9(s~:3̻/@aGNE7% *4:4/?X!;LM@3"#,7;2`ų$=L.%.7:/Iį)>KK>, ;'7?,~s-CMG:+K=:*Eм/DKD6(!+4<7&פ࿕ʸJ`C6FL瓉#-7=9ǴIQ1 7Hx1#Io<4! ْ@I#;IJ>@_1Kۗ­3W%3&!8>:% #%ȳ1N5EF=/#!'2;0&$.64(ν+2/%oF 2_p $'!"² 5X `,7U|kd\OW|")37;DCy8?gp`0 (1@eЙfT4 sO?E@1%'Բ=Ԋ=33/?ORL0XdF:`"#//9/Y ޚ& -=DE1&1i+/0,..ش˯]tEM~fF֑$U"Z NpϏG%dWe`SO'( дB'G37'+F l D-$:pn×(o N=|@ #3(Ⱥ_ +,Ĭ6 %,%ۈ oHV! ϙ +C8CJ]?LSPB0-' $IR(˃9q.1( #I# %/dKH5E8Ĵ$WϗXp֥-009$!$# _4~ږZн/S\Hศ #5t^S;;1Kj*:}H,] XǮ5ĺ>D(m fRJ4/]% !obTg/KUL4"%*'':T U}/W g7EHFkb%Ft@' ,TlJq7MJ8 ]n KK27Wj`@W-P_SP%68(%v ]ˤ/Cx3 gษV  aNDr,RW6';O^T4/'_V azz7u]Mi!X)ն'l-7>0-.ex؎F0$O11)Aε+5ֻ 2Ǎ6[%9s,k)$-]U20bxɁ1Y1;dJ HlZ=k@H '?_dH ] "+pOP: -|7쏆.G c W0 #mYKejX0]݇eO& 5  X-:<,,ǐZVuh ;Wmp`8< cDZuY}B/:%e V9?=憩۹ H^-r/*+Y$Y%2&:k'.hҪLJ꬯Mد.*Nj@~ L8ռ+*l乻s'/42,- :,Y%5;4*$a HD6$z%/?~otf 3 I!$[?SP@ _{x@l.lUe \d#.79,6KYȶ~?[jdP0??-`X. 6f=h .e5iɉ+35쪱f+G_fP$7LƯnMu '3Ykƴc/{! 6Fe7Oa]pÑuu,ܟNYZS@#*,Q '40'^@@y E;E:.$i!_[h/ut7 eXm%"<+~ʓ(_!j7:,J; 1T1BXnKp ε>, %;KPD2 |]<&@q%X}- Ӿ Kg7z'? .-,+FE:(׽ H7GTQ[ DO"ޕE=cQ*'fVZ'Ev'," ? ,~Z&!9$,&)*(}Ͳ%ڷv;@8C֑ݭ2vL`-O~~T?'-230(>cmH@YBdTG4`hL=6;$U9#35j{ ՟ruX .3 k8 X *&fP1i)/_ cyk]-5?KSTH02ك0lcO YTB0"'\@O1 jw?)/1-"%+?B2ɴ_W_^7Gk 杋zK j\׸32$b¾ƶY?:0 " &KڞrVJ+7=?=92(  !p@0jbyku O&&њ jY oO%!,;, -7  =53Y fE 'a=.Ҙ/?O_`R8!`MH${r7GLH<, :prJ3/YbSq" /31\Ǝ&17S-c'+[ܼλ '382"U ܦeZ'\w  /#Z2|W,&3;?@?>8, o9$6xm[fJf%6Y4q&'Kp>d6770$ /m  o3 O;EJKF=0 ]vv5ѭZ?(-SgsZ+:ED8"X&{a+;CB=60Z^%~ v{ BE !n 6j\6ORjou#-5SCBIOPH4 ̷_ߘ9moh̭ 5urO<3b &.3640%\[&i#($a=,'5?FKJFfF LY>rR` I@a;N8fe#Oe iV    ~?.%7ek/?LRRNE>=;:852,"o@k#  ,;V >D"+lp8]o1c #)2;GNNH9(Ӑ 4 S)ZEYCsYƌVujk [ǗB1F#wn;%+7?:0"WPZoN\]vFn\e),&7ZQZm'VF'7BGHD@81*"̸EWie٣>Υ밬EB_b2( +!l"*.258;<=<8+t`tZ+j m"q\歩> /ڕ(^c'v`  oVJky+9?B>4) U[j@}-S꒧Inޭt ke8 +#"*['*[ 1794,$"~ q:-W K μ m-0l[wǁ`V K''#_1t*144C.,[iZClL ز\__4{麰 KHMF )%DaqI֘P |/48::72*=7m۰ myYdmhHk v% ֚xݡ1ϨoܬM6ʎuo 031,&O6nƅp8sنXYȽ#' 0-\ IVgI픤20+ \!+%%]"{ k.9j0kVʬ\>&κ,EmKֳ"##" ~Ia1k ?rj+l@mSU>%-22-$?, 1$*/00,( M fqn})g18( *"3G 3.&5zym$ri#$N柆eʡ @Ry &!3S[ ?kȚ ߖ LZ%",(_4ծ-pdڥ'Br ٽdmZ [b$ 13t[ST 9*a ;Wl){7sQGNtJZ&6c[[ VK6&FF! <2j SXrſ`mYnZ@%˶mw_(u9_UC-v$qH "#<%n)vn"\mj\:1Z]xKQ‹kfN #'*)$ ֟p L>VqDuȼ#Z '}*FH0s `x ݀? lpe}[$ %Ƒ)5p*6Ԫ 8GSzG A`}ܶ] : m@X .a^dj#"D aֺxc hFzx 97 L}f繍τ :!%'~<ܢwkVĮb1xE *L6 3 d ̵/Aq!B%uLl!&**)&#qNe݉kIm ؎윱=-{]e"ʹFv )Ư,+(#*B=6 /d Z[@ ]R;l=u u HV*2qXF_rU)YU|#" XNE9+6M/:5(#'$W Y} H3(ФYŮV"5 V֊Bfm@' )3651~ 鱚J  =H  _T"|e eH!U{N !:!$!°u3IOH@>ENQH8"섔4n.G. 3CT !^).2a/Y['ҊC`p%[  ]#+59=>8֟иߖ} ."23+-q{"&(& m/;3/  m yg^V3=?<Τ~jŸ '1(+#/87/ o1$g/,$O#F6^9r ; W#/ ܞZ.3.+]t=t]O¿˗k}-63$&?G >Q♜z2^Ճ"NȺ?J@ p1=CD@~ -{ȁHKj%.* ]>AhIZƲ.eC1tcY ,oڢFQш+?OܠR E3{C 5T'+Ym##$)+"_ t,_H%,10֧٥"#"r!aeo#U mXi?!ks ˳S{ج._=*I[< ;,"'|=M+ fhYܶONf*6މ >.ey-9ۼ?#Y}l ڙi %52"q)m?H';DB: 8p +30>Tjz1u?%+,!/70m[#Y1fKi]%ߙ#,6toS',ml#W:ږIz)22:-;<4(-ֻڑ>4(#1m/>1{MNH:;FpM Y謶<) 7  % Si L'I3\E3;6(g^. ^p^C[33x7.rG +=r&R D:0s .[ڶ;H_]k•}剽}v)O?gw\e LWd`h9Zy]kmf8\J~n7IPJ<W!  X~CпW~/\ 29C@(VM!gvDiˮ-z Je'=G@0l:pھ嘫SֲD@5(xU %7??6*3} ]6#2n(  ';jChN+ k2׆ޱ`;JPND4$*HH|ʷ剕%,NXtUpyg޳~|#/yَV='-;k/3*7:\$ҿ296j]f&zU铀-3qWʦ&,16747F^KB:`f6>($B⓫u8,  1<meg]^.54R7GF4MƥDe.k_I142,#eFԱ¯_Wvk9GOIUl~%,-* xD0cɬK9>;4t-AXy"'f8eYOd%7CMO,0.N/,u-| ;!/GQRJ@6࿧ړf&/2u; '?IV) Ogy!kӖ-[+?GB8$~oa '+5Gu"^d4F"%ub  y ֪'7EJJD8( _aP8 nDU|t#'R CYP'?_orhP8[W_nm50%w598*V|\xZi%Tn{hdˬ{%*+s\/?@6ۿfͳlIT/22.(! 夢( pH+780u+V=D7GMJ@4Ffmj#?:2$kDXv(|nZ'13vȽ,[cXCE:(xϘyf2NIGA8, i2lO%EfQԳ K=@8$ mo&W+~n+j5?F@5&烐: eR +41&>Xq],߾EB=ϮPU݊3?V}GHu#$$!#.7>9,/k^? k;x\|];uK8(ƺ_Yd&)&^H;"Ƴ mlM*peճ$ '3:<9]cFyQ!<V,합"(ټs3q %FGIB4 y)/0ՈRʅmU]x/tXh %׶lwY~- pLOLD8, #kug,x+%&&"ZL|WS؊HC Z%-0Ɨ%#ٸ!ty)6$- +682( 7Y囷 ?ej3TXnE ox!|voW]/5762*}EvZ<L  %'%mIo1jz'-.*Or!%1650)")rj9v46X F'(& .#XY Ի9#+y=;3\+7=9_ Gܜ04%,.,%WA \e= [BVuY ^ W,+ pxzjk98k#&#~, *U@b%+/}V!Xpx3s]v "%&ke51p3?>2"?]j;5 4gص  X r6tjm%3<<6)V  "oJXC<qo,B8lVg#+2562,\DJ'10(vj? g#{ ?TE$Ua( `)$ s/?GF@0 ?Q),ʏޅ=#F:a&>Wޓ_|+ևm\-8ÙYm-/770"cn2ֺSuYFQ7j]Dfm4t$!*շV)dHy ձƖ \i-@'*L+-&VaĬWFݖckNkvk fC[.%'s?'ⷰ\Zo),6Hu%Y[Xh |8W ZوE?g4 #!Yg3[qK@o:jos3Xq!##]~DX"&*"Qd#%# p3fz9ku']1=& 5Y>u[Y !$z  [o% aPr  QaUe&m֟$: 3utdJ:עs*A #}q|#y$`Vd2 Y9 T~o Y!%-11.*kiȺ bZ rYov=\a"حX+'-/,(lf ~LiCsu}[$ & ͮG6/-Y ٶV"&'&!p:9$=l# j7f43Xcf#l/Zc #$"VH,ZĺW(ke妚fgY5MIVTfPYa#%%"FP`LNIwsYqdfb4m%QR!#'w";? ĊUׄW"%'((9+,-+(# e½beEg("$%# zE$qs"=k] % @w KHFenf4&j1Չ eZa x UY * h`j|υ~D)B L ;nRsxQHd rx~p lyLApn߾]`̝<0B糉#Y"%l E'm !&)*)?N!'# :{  VkXp$q.՚˳rYu`. /#),..,*($!=04Kry:H/Y0/z5* )N jQZXB 2v2X\&Xh_I($beϰ?d [7L 8  _*8#!%())2o&$# #r jX»|,>!8^YOxEzaմ %IqاU#'('">$n#Xs זe %g۵kQZT(U E|,M %''%"o[IWx3J=`q $8 % 2T Iu  #ύ9̆JŽr=CLF|5w!,Y訇1d $AD<ȭ##"G 0^i dg 4 |QȖ95P$){ƒ K #&((&#  N*dW`KJ_Cp _Q aq{F  #$$ '3 C}  #үB&3+    Á@   M |䖧BjoC"dɼq;~ C!@ggu2Q{gNkj$(4o6t+zf}hfʾBjk ,_H!+!C҅;v$-cf!4#nehaU(!~Y=]+Qd5wa&276ٗ[-Ud_&"KY8?T.Uc]N<.&$-5_%7pyXMk;(2Ə gh~rv2Va{h&g>-$?taXIhx&+V;5E+(09CɬuLTlOï೏?ߛ|_+օ9_aLhӬ f><-x QKV-7,ڹQČz>@ȱY6 ;/Xe@<>}&Ⱚt 406< 78(74=5<Ŀ0#-ag*y(5v<$ڿ/~?OXֹ!{4a`-u;RT!nia4:-+W^ .1m))-5; -"! fV*).999{ o'&Ȇ_?/ ٘50%G?n)rg%؛$)hf ˿nY+A""!*D +..>Ӭr&FK)QY5(WY(44._c&mz^4e !C-";s_QwÊo|!$4[Z+{-3ԗ0(&+,E.4ZQXt+2BG~io[{2mʅ !-.s4"{7)vʻ4zPx!P8z[{Ŀ$bV7$5-*f +ׇ.,mȶCkoaP:v.ó JmkQ.kZ $;@.o)ϿQkhZ.;‡ /!Uj\vߥzŏ+Xh_P@߆ (@5cVöd[n93f27˿2XŇ>9༽5Vg}"Wt=_3ĽUZQm a7ޞýVN>.}wÑYm5QULFl,EC7 -@J7(mҙ[>W4Cm U(앨a,2$vI<Nj}XBs4\CL>X5k?@yF2sleb[~2>x0 0Eϕ3uɋ  Io5E}(+7uJd+$& 6&@LI̼bTPU-CLEouEV$"l4IL  WJ?I !(@PL<-< -WJE6dkxM)I(CQ֕5 W1`ҜذӧCUp&͜yZ>o#f'| sRCX3u ,ט-]8s:g5fp!@\a[ez.Nc/f< }Onu_f]N>g "o6MQh}9!$g?._jc3("o@fj]0  )8NX+R+h) |(Vfi k"5&@44Xc\LR $2$UfkV efmݬj 2IJ@PO!+~)Y=IێCޞ (;<4.5GN1Sj-hBV5945CP=b[y0%uj7vS?נpz7g09C 0`'Lp$0@Q].vf`6` !V]^_aqbv#3ɫB\ַK;" 뮮(Qhh]N@?Cov^뛼Lh}2]k5-j^w$)!!Qjh\h g+ b}.XhdR_wu#!.+k]: 5XfNx+0;Xdol#YHNҞ^-u$0GIķrnB!p+$1G VB522&7 )5 RSyAlg=72k ,_ ?0C8&/]!<*/B CCp?,"0ށʽ .BCɘgz: N Zv-!n+lkX^B/6p&-2qty [Yrt!r@UY,27&K);l+ieu >C*Y̅y$qF<=Ìtg$+5v;W9++"$2m\\_^uRH-Y?!+f.9R^а $.)"&2<(ڭ>7f{.($-;@҅.5Mw֓+.&(4mFju-4.KJk.-ɖJ>I2N ((2BEKw}+0\]씞.-9EC(#\&J$~+I+oq(+$ݖ.f0{Y/q"/=54405ELlσbn$&yV-n-755BLLi%پLh495BCPZXHK/vQF2CC{]سi]=prb*5kxoc¯3#rۂøCqv?gV/\Y^˿ Xtrf_Cc(_fzeffb5dqLanlof<=}#޳۰G!c\oiލ>旗$Iah#dhb/ш= OCxdfh`/1ڸx`õ ]a]h]c7/]cjhsߢ#ʽX\]djd75a{".CU\_hkd%N@-@SZajkco- Yó"+>QZckjStr݇O|ՏQ\fmj7Fg09!(?]hoj}V#^۲x (?pk݉-K \&]q^L[$JK:'/17ĽX$NthXM6+|W  &Pmyqci ݺ QrxhHZ?; (Vlm]p7? +Xtvj\g 2ȽI 2]trhZ]_,.lkļ! 2_tqyoͬgk|$-W~cto$ B3Y>_Ȇ 5drk_you(;ȿ}&vd.( %\\QjLm0u3o&CZXZf`+z$CVUۇJ˯[]!]BSQnAeDfY27 O| $@Pǧݳ_R(L1!Rk*Y&+>tsϜ (mЕ>0mY.*.C%~-5ξ 9~$q=+X@*n4Q7&.  )@I;,{ $oeg[j|M !+ZK{Ʋ5s+V"LvtF=3? j:^gJLQ4jn~[)+EP>75-!;P)!N[p4pGSqt-y'ed+7{rSNЭNGn>2' %',uUt5ʚ;ռ!(BSSJ'o-(CE;+4JVQ0総5IA&@UV^e!g빋@JB2$!.JXUepŹIZ|s!Gy"Z>r+8G9+$.IZ!63f]4G}!&5Yl^0- 5E(Qy\dMf2.&-nw\,Y0ӇYQo5(2L\Z x5< ]c+~·+V29]V2,<:CJ070d&Cm>,|٨}+Gj? V--3#f "9VdaUyj/qYa`C]f_}wz!&4É cd҂ch]7F85Zjd.(Ӝ2cohZ#]|Im.H (2V Cdj_Pwe͐g0Idh\L>p b(.+$JacVI_of05.֫x +J_]SEHk,t$52}PyIGZX4201ߌq+CUS\օ (BQCu,ÌU$0n? !. L2FQ#R$| a4IA$șp [V 4$)2Ú.; f I1`$" XfE? #(y(4X<Y(*0Fj KxHj" ".ZA   -)!!+cf괚$T$+0N&F$&Y?2JNڀ"7Ƶ+6b2=D{ne&.++ w&2JnL!5{47:9W+rX&5w] Z%4900!4@@_' (9)2+>G 4+r 7m.im.Joi  7>g ;PL@۰|[fCQJ< f,Y]$JP#H'>.c.NN!Z|d5+?95 2[H0̸9LI(Kp;JE\^I9.s;d%D3)VΙ9E NXGjڈ%s!5V' EK{@ueCvbe,<ۖ׀>4Sc)Ţ C3V/x4;U|像\CS^y294) !<(%ݬH09V0ޅ@4MB7 y $;NȏC\CW;?V.5T*k|^ ? , :c (>B9+# z4}5]*.2оjuKÌh-0( ').}>kt. 0@KaK.AUxe;01HH ٖb+-  }B$ HJ+ +@%XDad.(;ݒ2B>4W>&a7B<0${jv&& &.G$-)= +CSPEs -.& KoH$@FIGDFGC<:94+O?/) ¿K0&8HNLKMNPYljTGB?;85( 7CM^nwz B{|~}{}zywpdXJ7`?+Ա r rZϻøh %,*%$p,%*$023:CJNU][K::Ma\<-6.+8LQE517=q&:T]K&ճv S )Sֻ#(" È,CǸH(," T&- e]ſ %n Z aGý?E#7@$/=/-@H5]'xV*G1  _)#~!$"+0&y"%!,31(! Xb:@" (:BF@2*/2&*7 /x o$xXN¸6;q+ *52$'* Ix11W ;$p cB  N{լ+,3,/;=+f-*!7Ϙ XSS&%F2`m%'$"!bM $ Ͻ.. O&,'(7IJ9))59* ("CKhq x`l  UDP=ӹ ( 2E%8:-$*2/ SJJk  % 0]  cN f U "'0227<5! fXKqzE0DC !"w  %(S!&/?LG/?s4_]9m#/ $!yz u>G'3==3# ,R/-Y LG-    )_$$qE ϧMtjX`^0G9&+G,}Ȼ "KZ~_᱌NNnwvn^/0WQ1V&&Ƴ;Eŗ H`zwZ1 "5_T*9(*>ϗ \-M@1+Uص&g}dCCG>1>X^(ٯ5$?-1  6KN?fU9mBMNE5NYC*1ݼN"8>dF&Ϟd2lgTPOMLNIN:' ǥ9Ԁʾ /Fa? ʕ Bcm[GU[N[Z_C&'˵=!ں0[^+깛?^NCMgVYtsV9 >0 ȳݽN"ٴՕU5M9,MiZe}X(xs"#{©6`X9 ?(/28-4PkbsEĬ*D&꼜 "!ꬡ BmP#ڵ&?,2Qel~#O?IϳG"빯GpB Π"'4<Bb`[t޹ /I##,Ǭ-DL8ؼ*'$(?-{4dpbq:ھ*1溦~~{Ǽ1D,! -* -`xq}l5  $#!ʳ#;f4 61/ _5gtxzz_1 VG «TӬ21$ (D@*# ن1,avmqsX##T߹05!/VF48&WcpiiG(շdѺ:>&½DTW?w(KV_cX4h*άhо-:8+ջQ$M^UB#G8MZTC* #]Ǵ(:G$ŷ ,U[W;&&+_ fݷ &8>2-ETI2'&2* fڽ ,$ӻ0:2I|-CF<-&#  ؼ(* K88(&G'9;0/W&< 3sӼ !-(Ƴ 54Zw!00++ u/?7ѽ'-$ȹ//'&!.]G ʍg+/ *+# CGq<fY6̄`>,,C!'"Y ]Ӌ޵7;?i'*>*º< MY  X'  &" יYV=O rGG19#0 d I|T/yL +j|!"}i$bM,9 x "Y:$~+"kfdg ' ,ۢڂ)!^Q !aT5\#-5 !!  Ge}LY8KE̖mV #!VGO͚–[XhF"!  ;HDLrUbe~+ oW yAj Ư+;,pJURخݯ0$j&OLNX4#)+Sha͌uf[L*!,7gTq3Z=ʫ- I V\3?Ê[ТE6)HLknc9c- x.hoaJ,g:3wGi_3 `4ƍ |bO{7<`$ RYf4arUtEVdiL[Vªl2P-Sɔ/ ! A lF +Pqovg3X>d\ \g33 WOP3̌hR%n9Bìu3 EV` 4kIfoc e8B [T 0 fO  C8R.s*Z_H3+a@a4iPJbhLj{8N[ (f5ⰡVzaVw7#y5X¾&Dn_6nFb*ln;"M4%1P,fn=>̋dƥ%̸Z:֕,awnTwY2lΡì3]f?7XG):ӸQ8#مp3x3nm`m\Nc,f7uY-X+f;jYY\bq]4YvX3s/X t1.^ִL_f;rdyVrGnqI簶 {"N#֍f0;`#7eAyJd}hf=qkK) f2%q 8,-X4Bbf`&1 4 -w :Y.}&n)pnJfli;@R"m V<,93I- S Xt}dX5̧f2spPaA5 %֟z,342u`Z,T,Km.m4a2#zynXր d5a[ V醏; FS`1E&3f"ܼ™ Ҫ]`Ϲ/٦Fd1y8eփ8yP̌kGXKn.rq0YUq2[~~H̘27 av]0bbH8fШkQfϲ~\2L҃pR 4auQ"{9 #bA8 0R؈p#]؉fpa4XrAXr]C\.V7瘙kG,KthkW iqap ̄d!>a;aix V Oq f+  'c , G3X7=̘A:,r8)v  .}83vH nچBt%{ I{C]&e;}uNlC[uʆ{q, <M> Kn-PXt FdT Ǖ 3/J0:0 XpӀم]iocQ Zv `V(4 `!5\ lKӀS,88$Ch0ԴYޡfdxEwgװz`mb` Dh/P2 agfV=3b  0[7*17M" kG -&ii[%[mz%!$! k% qH,%'nsB.D%%n! -'W% Y.6E,&1&,0,-00f+.py--20' &o+YX'A +%˟P,L hf :: Γ@Xev, yS4\ ;x | e 0r4 jKy ubb< 9LJgR2J.hɂ`P=! 륳XfQPbǬNS~3%a`uu=1XƂu> `P,wf(,ʄcjf& T ,6Qa̾E177Xj4[4,[=@O96 PIfBcU6B f>úY fZa5J`\K7X2`A:f((rƤ ,),XPֹ ܁51 [,LX Ti ' 45{ %"4X^C,(n65 fXR f?<` "  {!X UºXӔ 8fP+Zlf,x bnD&l*!ye,d},Y@I8 93X _b8 Ũ:^`J1k{9E2s$㮰 188s0@22S* l`Th`f2   ` v,7X! R7XTBscvURTS0 d2|v քܜDU@U J- 4q* 0-*0HeJ F +fk I b& 'Tp`LHJ*?|BN]Ё$+*2 ~ 4< uS_c @-`@ f05+4Ac(S0Ӏ pKvZF&ӄ[AˮaܕJJ`6f #̂\v `h`F`lf3hLBP EXS,O4"aIh adځPUM3 X Š2c96dF&,TF"VU [& KʊLM( Њ,YY/6+65hH0 p-ʩ ;d٘ɐr * % ,  ( 'h 0  ہ _______@  N  <$"( * M]t yX $/E<y` R`f V `Pack-IceI *L O,La*oMGLA "grѓg f``GP$]t***Ԋ**EL ;H ;C&NN&&Sj&n".扑&&SjN%a*d"ra$dCv !a"H@@Vҩ%QnNuf%Nurf%AQNuCtaTxr1 Hka1 Ag"CvtaTr1 HaBq jD`rptadpt?aBC@!!Q`R   ICE! `=O /eSJm߄ / <% m B8M# V& hlRv (6T,hZvEZpNRt!|CW o / "? H@8H @p2<? Q_,T((M+22 xj "!.2? Bg/Hy0ό z\?<NAT`R?NQ=9S7rygXdem noTwʷp STfxTt#Za\ns xgnzbubbs҈xoc e[p;t.xPyfM9 mpocȃB A! K ppedɯ8maggi10by ZEEDYAm#IOND DESIGN oECTRICITYIf y_C &his`usd'forg'hgreeting.TC?contact me, writo : BERTHY Yannick 87 r'td'arbouville-78120 gMBOUILLET F/NC.J@f&|0+0ͬ`ARSPkv~tS BrrvaDzprv prv a,g a8^a. |$a$10ZR"Hx Q0C@/rE= "p2 4p  3/ú'J@e nMSPj01nRF5JQBVd  ~>P-\ X K:FݼU& 6LeGI(zBdp ;P *T|or!;NVxkR8Q7@|p`ZP *T%Fxq /Nh >؈kN`# _Ns6;p҄U\&P4fRٸf &'<-AԄ 5 O 45A |^ s_CaΩB̂#nL!CBXJtf 3e JjL)zE I v#Hfcg0?:)[2Uق2Kf2uTfT֎a^ANqسgmgXmTK Z&gjXvWxvDf'A[x D@I&Nia U6f`İ,g ,aT%s xuxf܉*0: 0Q"@DrB6P8,hBLcXatK [,G @03~G[,\0!KK'ka\xMDEV<5j-7Xx23Ic?0K r49 0<tO5\%+;xI*(#,P6@z8@ (J9AgEBZ$FaB,!J;IT\:)LJ>U!L˙? #1Y@DA@02#~E?y tNuRJXI]Zzud@(Fj4+F,T[90 ,g` AbˢH>jR؂DT f[&B'e(*.S7g!fY?k b7 @<n|KFHP>FAJ]`gzfljʑ[bGgT ?o2n;?z ^Yn25 f:E1E~JS7 ;|B;:8D`=xXISO*j"x*j . "IDI4 CD:1L<(' @m&g&n.1gel( hvc)`x RN`c`@L3HJB@BgC2(}H@1AJANu8 K 0 i`x HGp0S#V?ϣ}Z8{eQ>-l~w1gjd^YTOKGC?;85U//,*'%#!Km' Ⱦ~xqjd_YTOKGC?<852/-*(&$" V:a$;qo&2>JV]bgpuJ  2` $3safz @@YFb d!Gdn M ̈ xB ioӀ(<9!ѲE / "<A  m r@$o@Q!&m   KV Κ {  l&` / Y  TxN@$ |'TDw@ AP}  -h%1j  hА$&_&1"$(j"$.xA02484 7[a{0AdGh@<+>7B+Z( =.Vt`0)+'N"D353카 ,"D"cwE$x F3 2 0.0,+,Q3T 0,)' P*)))XpWZJ3Ƅ 0q`3Xg O_NǶPi+R8O *4ՄmI`pGUaNX"  B2(#jBd$BA@@GǞA2I{A7˭p2HR ?ZЇЀp"$&(*,.NA_PxA^TxAH3 SX.V8A:E<DFA֣0DnؘCxf 3!F,K8.4(]s0d<HR܆ƈH~RCK2 g:څHE2@Bp$46; =܄?2FFHFQ ̏h\<3l<l3_*3/̏j=f=!;ckH&IT2$vX8>4$CDW2RCfom@>Ǫ%v6B8zl:@xBoCǖA3ñ?Z3f~3řse pRMfg͎U^UηlMx^دǤzq b\%b`]x 6 -n`耮W-ޤsY=Vv%iI3A~G% x[|6zc~$x `^b`PtӮ[#}E  d * | AO5TL}7]y+ 9 !"="#$4$%}&&'_'()4)*e*+,!,-A-.Z./k/0v01y12t23g34S456566|67K788q89*99:/::; ;l;;=w==>>D>q>>>??/?N?j?????????? y<PB(q?(1.~xlg3A=ԃzY4ǀ~ 1GʞYA=ԃ?c?zP z P A=  4@ 1ǀ~ уgփzPA=LLCLh&LeL0L~ЈB!d (*^|Z:o/@M.pOF^ /ΫY(`0'F3?t- D؅A7Y0y0@ ϛt7>3xH}X: 3<؏ݕ`3p{|l6Y nnh_XX/:`fԏf͆a9.q /@>,@>,cso>~ @ ~` g6LQ0iB\;Aݬ`wa6mCW6moۮ'gUf@g{p((^>,@ʹ LpI? &aٿāXm8 Їt/@>,@>,@ᴈDWCͮN0j7<پylRJs08!`@|fЏxXG)3/Y2Yzf&c5bU9S `X7aI/@>V/̺baÛu,uE}X}X aaQ Xh$[ϸ<;ܼ~$ᭉY*".{&3[7n+񖎨w-^\]ͳ~4LQ(6f f$nqxֈuq[0~0Y+@8 ~ L7p[q1,;,㻈, ;WBX |2qNy`!h3g!ep〇<_ 5 .sހq}6XMH";=S9*!+nڥpsP,\v\mNO2g99aʮL\ Ki<˜Y@a!48¬Ψ ᩫt M&vh4SzB2" 20TQ Z #AioX `%eH X4`5i0qXB:,9M8 64"2iy/0,Zo(%2!hV [H -Qo-bm-Xq!b^" g{IBȂw 4xO/ v YMEW&Yc7qA$Bl{x,x/|xpoۯ%#n^=%AOYw bc\ ^u; ja#ڮ,DۄĒ`^D ₸< c^wHTJ?n/t+${x{8x oS}ĺWJG*WI759c#^"C,{ux M7* 0J<9w7qA\D 4 &.b#^&]$ ^#xw; .^#‹kDkۂxx"b^&^%Kָxo VqA\$[xxA\Q"Fe"5CxxxxA\Wo 6=BU/  (#clK{xñDKx x2o* x 6*LGE, FmA&W HT87W# .K$;x1o 65K#߄x o/ooo o 9qC֘ *:mI .K &^ׇwkQ! |*! Ѯ { ̸fVxU0 1[x|BxA^"րqA\01>`TrwZ jUkWW>\Gq$P]q:yS<7W6FxU3\W\2^PB4a uY V8d*Kp""*Dڈ <N –gm`>/n1FNo:;:XxJ/NuB931L4RԝF5k!8=ꦀ:" <z(Zc9wB8vxD!M87 hxrzr9( g .];AAp$f涪 )g6,h 0qgW+^c<<-"D$VhjB+|:3` F4(ZkzKLmJg*p Nq *T#M&g ; ũJk =RĚ$VCXo|JQgopԹi=(SQfx@7W86Bk!}4xvՈRNs8 +0a + l˄9:#X#@su=>X#}@F'*#جs* l vFSwL@ (5@@R&JfKJf Mq SS\qV.򃘄ʖ Pn2Wd"k zXjc* ! 6! HEuj," BQBi#J#|#LB^vRC tj)B}k씀rg !<4!l $\aNq 0@N;R` sL U8$Br{JB#* $ J˦B眏2t6mLxyv$gBDRf0V `iRV` &S/aUVB[[{!Kv9R1b6#mu:jm[T˭Xd\TX&*{U eTX]]!M~"TFgCSf.mFWg6b S W@-i%(NTAc\W8!Lz~:SJDk,-_Fr&6ؠh65'DDD41=1C 7K.tHPujhSg>MUf,eYg0=f@7Y` D,VFOgY^!NSPqUS(r9J#N`2f&b`AIC "qV rJLNaJg@GJ)u*\3 tT|%N%!e\1i[5 A f"` <@#`^ m N P$b*БQiA LC.Hnr>[o0ڶfHzA &-JkgC{r(V?1\pMP(" 1lg-@ l"bE%kޔ|!1Y^Nu % h  o LHa47c${IvS1vaM;) }voic]XSNJFB>;741.,)'%#!5zږV ~}{zyxwvtsrqpomlkjihfedcba`^]\[ZYWVUTSRPONMLKJHGFEDCA@?>=<:987654210/.-,*)('&%#"!9    ~}|{zyxvutsrqpnmlkjihgfdcba`_^][ZYXWVUTRQPONMLKIHGFEDCBA?>=<;:986h                      JYd" $ % & ' ( * + , - . / 1 2 3 4 5 7 8 9 : ; = > ? @ A C D [$ G H J K L M N P Q KF T V W X Y Z \ ] ^ _ ` b c d e f h i j k l n o p q r t u v w x z { | } ~ !!!!!!!!! ! ! ! !!!!!!!!!!!!!!! !"!#!%!&!'!(!)!+!,!-!.!0!1!2!3!5!6!7!8!9!;!!@!A!B!C!D!F!G!H!I!K!L!M!N!P!Q!R!S!T!V!W!X!Y![!\!]!^!`!a!b!c!e!f!g!h!i!k!l!m!n!p!q!r!s!u!v!w!x!z!{!|!}!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ۠-##@rP"q "Pxfl ~}$0H` @Q$-IIDi-RDBFO\!/IGA CO|B$TL_O0 A$ASGNRR+($0=DV4XD0=vNELfD1=WHICHOX 01ROUTNdDIYw5SPEED25;Pw7=$ARPOSI\ FADE (0-15)18N&2=TIC OFF G+26=PoYdOfS/SYNTHDWAM:h kURE TKM,SKERKSTRAAT 3026441 M BRUNSSUM, HOLLAND. OLPrB*j:V*r+܆vtxޗY.CgdBݒ@H< @L &ødw0W˅q s9T8 ga n& .b)TbbcC'&ׅa%XPG92551\a0 p1uB0 @ sJU.ʶ+ԕ)+;1*W `"MCS]AGlZ8d>c^@C C` ,7 7(5Qm 7K`ok /+ Ldrw:eFJci'ƧBu U,*#D.#" =x>5̀'$E 6l,d|!lF j"{@F  ߲DY^B{[Z<(xhytl 4"/  R 8xf ( DӐ23 / =W m=3N/Dz< ^:|g fT)Z!ψOcxCvLxp$2I9sҚu2˕u88 suZ !C@ ,$>eȀ :LxbܕMG Į&QHp/r ܢ # ] π ~LF0UX&7/ ,&3[q 0DiP8#;b7w0 cN 3}: 0"IOۂuXi/ v 3 ZGT 8ҍ8"*O+ 2s,@Ӄ 7(+djA8nx֎Ė 6 $]`">V#69 9Es:0 aHewGc7@ zu"'Qe ց xNPW &  $ F W,6 p'   zY$4:@F9 VFy (BROBECKER Alain rte de dardagny 01630 CHALLEX Hello everybody! -   Here we are with a new demo disk, with plenty of stuff on it! Let's begin the day with a little trip into this disk: Folder X_mas93 The executable, ice packed demo. File dp6reset.prg The demo I coded for the DNT Paper 6. Folder docs Explanations on how to use my polygone and my ball routines. Other Folders All the sources/datas, related to the parts of the X_mas93 demo.  Some important notes: -  * If you want to install this demo on your harddisk, simply copy the whole X_mas93 folder in it! ( You can even rename the folder! ) * If you spread this demo (Thanx!), spread it with all the files, do not copy only the executable. ( Hi Flips! ) * Release date: Monday 13th of december,1993. * Commercial use of my routines is prohibited. * I'm not responsible for any damages this disk or one of its contents may cause. * This disk and all its contents are freeware, it may not be sold by anyone without a written agreement of the author. * Public Domain Libraries should write to me, Alain BROBECKER if they want this written agreement. ( Tell me the prices you practice, and send me your catalog. ) * I'm looking out for 3.5K demos, so if you have some, it would be nice to send them to me. ( Disks will be send back, with some demo stuff on it! ) Also looking for normal demos. * Most of the screens were finished one month ago, but the "polishing" of the demo ( Endpart, images, bugs removal... ) and the school are taking loads of time. Ok, that's it, now enjoy the demo, have a Merry Christmas, and a happy New Year. )Dracula. )#a0 #b0 #c7770007000600070055200505552220770557075055507703103 #d - #E 58 12 #W 07 00 0E 0D 15 09 08 A:\X_MAS93\*.*@ #W 03 01 0E 02 15 09 08 A:\*.*@ #W 00 00 0A 0F 34 09 00 @ #W 00 00 0E 01 34 09 00 @ #M 00 02 00 FF D RAM DISK@ @ #M 00 00 00 FF A FLOPPY DISK@ @ #M 00 01 00 FF B FLOPPY DISK@ @ #T 00 03 02 FF TRASH@ @ #F FF 04 @ *.*@ #D FF 01 @ *.*@ #G 03 FF *.APP@ @ #G 03 FF *.PRG@ @ #P 03 FF *.TTP@ @ #F 03 04 *.TOS@ @