.ooOOOOOOOoo. oOOOo oOOo oo .ooOoo. oOOo oo oOo o ooOOo oOOo. oo .oo O oo oOo oOo. oo .O oOo Oo .oOo oOOOo. oo oo o o. ooo oo oOo oOOo. oOo O oOo oo. oOOo.o oo o. o oo. o oOo o o. oo oOo oOo. oOo o. oOo oOOOo o ...................................................... : : : smfxboot : : : : Released at Outline 2024, May 11 : : : :....................................................: : : : System: Atari ST(e), 1 MB RAM : : : :....................................................: : : : Credits: : : : : exocet : : - palette : : : : tom : : - Music (driver inspired by gwEm/PHF) : : : : spkr : : - Code (inspired by superogue) : : : : Additional credits: : : : : Grazey/PHF : : - makeboot code : : : :....................................................: eof ; smfxboot.s - source ; ;.init ; moveq #32,d4 ; move.w d4,-(sp) ; trap #1 ; ;.setpalette ; lea $ffff8240,a0 ; moveq #15-1,d6 ; one black for dezignkameel ; move.w #$8a,d5 ; index by exocet :) ;.setcol ; move.w d5,(a0)+ ; add.w #$ff80,d5 ; index by exocet ;) ; dbra d6,.setcol ; ;.genc2ptab ; lea end+c2psource,a0 ; move.l a0,a5 ; move.w #$c0,d0 ; moveq #0,d1 ; moveq #2-1,d7 ; move.l #%00001000010011000010101001101110,d2 ; this is bit encoded c2p tab ;.dopart ; moveq #32-1,d6 ;.lx ; asl.l #1,d2 ; bcc.s .fill ; move.b d0,(a0)+ ; jmp .x ;.fill ; move.b d1,(a0)+ ;.x ; dbra d6,.lx ; move.l #%00011001010111010011101101111111,d2 ;this is 2nd part of c2p encoded tab ; dbra d7,.dopart ; ;.gentexture_c2ptabs ; lea end+text1,a1 ; move.l #128*256*4,a6 ; lea (a1,a6.l),a2 ; lea (a2,a6.l),a3 ; lea (a3,a6.l),a4 ; moveq #128-1,d7 ; moveq #%1111,d0 ;.lyy ; move.w #256-1,d6 ;.lxx ; move.w d6,d5 ; use counter for texture generation ; or.w d7,d5 ; use counter for texture generation ; and.w d0,d5 ; normalize texture value ; asl.w #2,d5 ; move.l (a5,d5.w),d1 ; c2p tab val ; move.l d1,(a1)+ ; tab1 ; lsr.l #2,d1 ; move.l d1,(a2)+ ; tab2 ; lsr.l #2,d1 ; move.l d1,(a3)+ ; tab3 ; lsr.l #2,d1 ; move.l d1,(a4)+ ; tab4 ; dbra d6,.lxx ; dbra d7,.lyy ; ;.genOffsetmap ; lea end+offsmap,a4 ; move.l a4,a5 ; moveq #%1111111,d0 ; moveq #100-1,d7 ; 100 height ;.ol ; move.l d7,d5 ; sub.w #50,d5 ; dy ; move.l d5,a2 ; save for hole ; move.l d5,d2 ; swap d2 ; asr.l #5,d2 ; muls d5,d5 ; dy^2 ; move.w #160-1,d6 ; 160 width ;.il ; move.l d6,d4 ; sub.w #80,d4 ; dx ;.d4pos ; move.l d4,d3 ; muls d4,d4 ; dx^2 ; add.l d5,d4 ; dx^2 + dy^2 ; cmp.w #340,d4 ; bge.s .nohole ;.hole ; move.l a2,d1 ;dy ; muls d4,d1 ;dy*r ; asr.l #8,d1 ; muls d4,d3 ; asr.l #8,d3 ; and.w d0,d3 ; bra.s .go ;.nohole ; swap d3 ; asr.l #6,d3 ; divs d4,d3 ; ; and.w d0,d3 ; % 128 ; move.l d2,d1 ; ; divs d4,d1 ;.go ; and.w d0,d1 ; asl.w #7,d1 ; add.w d1,d3 ; lsl.w #2,d3 ; move.w d3,(a4)+ ; dbra d6,.il ; dbra d7,.ol ; ;.genc2pEffectCode ; movem.l code,d0-d4 ; code size: 5*4 = 20 ; move.l d4,d5 ; 160 off ; move.w d4,a2 ; 160 plain ; sub.w d4,d4 ; d4 is off 0 ; move.w d0,d7 ; d0 contains 100-1 ;.yy ; moveq #20-1,d6 ;.xx ; move.w (a5)+,d0 ; move.w (a5)+,d1 ; move.w (a5)+,d2 ; move.w (a5)+,d3 ; movem.l d0-d5,(a0) ; addq.w #1,d4 ; addq.w #1,d5 ; move.w (a5)+,d0 ; move.w (a5)+,d1 ; move.w (a5)+,d2 ; move.w (a5)+,d3 ; movem.l d0-d5,6*4(a0) ; addq.w #7,d4 ; addq.w #7,d5 ; lea 6*4*2(a0),a0 ; dbra d6,.xx ; add.w a2,d4 ; add.w a2,d5 ; dbra d7,.yy ; move.w #$4EF9,(a0)+ ; jmp.l ; lea frame(pc),a5 ; move.l a5,(a0) ; move.l $44e,a0 ; we do this to keep screen ; addq.w #2,a5 ; ;.ymbits ; move.w #%0101000100010001,d1 ;frame ; move.w #0,d0 ; for smc ;nx add.w #256*2+4,(a5) ; and.w #%11111111111100,d0 ;.spacecheck ; cmp.b #57,$fffffc02.w ; break key to drop to desktop, required for bootsector rules ; bne .nospace ; rts ;.nospace ; ;.ymdriver ; lea msx(pc),a3 ; YM data structure ; lea $ffff8800.w,a1 ; YM base address ; moveq #3,d3 ; ; andi.w #15,d4 ; bne.s .fiftyhz ; not time for new pattern position yet ; addq.w #1,d6 ; move.w d6,d2 ; lsr.w #2,d2 ; andi.w #15,d2 ; move.b 10(a3,d2.w),1(a3) ; grab from note table (.notes) ; move.w #%0000011111111111,d4 ; reset d4 mixer - so writes to YM #7. initially everything off ; ror.w d1 ; bcc.s .nokick ; eor.w d3,d4 ; enable all squarewaves ;.nokick: ;.fiftyhz: ; addq.b #1,d4 ; increment speed counter ; move.b d4,3(a3) ; set kick drum frequency ;.setuploop: ; move.w (a3)+,d3 ; get new YM register value ; movep.w d3,(a1) ; put new register onto YM ; bne.s .setuploop ; movep.w d4,(a1) ; ;.runEffect ; lea end+text1+256*128,a1 ;6 ; add.w d0,a1 ; lea (a1,a6.l),a2 ; lea (a2,a6.l),a3 ; lea (a3,a6.l),a4 ; jmp end+theEffect ;msx ;.commands ; dc.w $0400 ; channel C freq ; dc.w $0300 ; channel B freq ; dc.w $0201 ; channel B freq ; dc.w $0A0F ; channel C volume ; dc.w $090E ; channel B volume ; dc.w $0000 ; gross null terminate ;.notes ; dc.b 253 ; dc.b 159 ; dc.b 80 ; dc.b 169 ; dc.b 134 ; dc.b 142 ; dc.b 190 ; dc.b 213 ;ymdataend: ;code ; dc.l $20290000+100-1 ;move.l 1234(a1),d0 ;d0 ;4 ; dc.l $80AA0000 ;move.l 1234(a2),d0 ;d1 ;4 ; dc.l $80AB0000 ;move.l 1234(a3),d0 ;d1 ;4 ; dc.l $80AC0000 ;move.l 1234(a4),d0 ;d1 ;4 ; dc.l $01C80000+160 ;movep.l d0,1234(a0) ;d4 ;4 ;end ; rsreset ; rs.b $10000 ;c2psource rs.b 64 ;theEffect rs.b 100*20*48+10 ;96010 ;offsmap rs.b 100*160*2 ;text1 rs.b 128*256*4 ;text2 rs.b 128*256*4 ;text3 rs.b 128*256*4 ;text4 rs.b 128*256*4