;; Authentic World of Commodore colors ;; A 256-byte tribute to a classic Amiga demo ;; by Blueberry / Loonies ;; ;; Copper overlay trick inspired by ;; 64-byte intros by Photon / Scoopex ;; ;; Requires an Amiga 500 with kickstart 1.3 ;; ;; Released at Riverwash 2011 ;; Copyright 2011 Aske Simon Christensen ;; Redistributable according to CC-BY-NC ; 0 to test ; 1 to write executable ; then change $37 into $5e at offset $17 EXPORT = 0 section intro,code_c ifeq EXPORT Test: move.w $dff002,d0 move.w $dff01c,d1 move.l 4.w,a6 ; exec move.l (a6),a6 ; expansion move.l (a6),a6 ; graphics move.l 38(a6),d2 movem.l d0-d2,-(a7) lea.l Intro-4,a3 moveq.l #1,d0 jmp 4(a3) TestExit: movem.l (a7)+,d0-d2 move.l d2,$dff080 or.w #$8200,d0 or.w #$c000,d1 move.w #$7fff,$dff096 move.w #$c000,$dff09a move.w d0,$dff096 move.w d1,$dff09a rts ds.b 25000 dc.l $180 ; section size dc.l 0 endc TEXTHEIGHT = 112 CENTER = 136 Intro: dc.w $0182 bra.b .entry ; WoC blue dc.l $00960020 dc.l $01001200 dc.w $00e0 .entry: move.l a3,a2 ; $244B moveq.l #$e2-256,d6 moveq.l #40,d7 ; $7E28 moveq.l #$9a-256,d1 lea.l $dff040,a6 move.w -(a2),(a3) move.l a3,$080-$040(a6) .textbase: lea.l $fc0034,a0 ; Scrolltext .tloop: moveq.l #8-1,d4 .bloop: lea.l $fc9134-32,a5 ; Topaz add.w d0,a5 .lloop: cmp.b d7,d0 blt.b .skip btst.b d4,(a5) sne.b d3 lsl.w #1,d3 .skip: lea.l 192(a5),a5 ror.w #2,d1 bmi.b .lloop lsr.w #8,d3 move.b d3,-(a3) subq.l #1,d4 bge.b .bloop move.b (a0)+,d0 bne.b .tloop subq.b #4,d6 bmi.b .textbase move.w #$4E75,d5 ; rts move.w d5,-(a3) moveq.l #-67,d3 .frame: lea.l $37E28-320*TEXTHEIGHT/8,a5 .frame_loop: moveq.l #56,d6 bset.l d6,d0 ; Bit 24 = D enable movem.l d0/d4/d5/a0/a4/a5,(a6) ; move.l d0,$040-$040(a6); Blitter control ; move.l d4,$044-$040(a6); First/last word mask ; move.l d5,$048-$040(a6); Dummy ; move.l a0,$04c-$040(a6); B Ptr ; move.l a4,$050-$040(a6); A Ptr ; move.l a5,$054-$040(a6); D Ptr movem.l d0/d1,$060-$040(a6) ; move.l d0,$060-$040(a6); Dummy / B Modulo ; move.l d1,$064-$040(a6); A Modulo / D Modulo move.w #((CENTER+TEXTHEIGHT/2+1)<<6)+20,$058-$040(a6) moveq.l #(40-1)*2,D4 .wait: btst.b d4,$002-$040(a6) ; Bit 6 = Blitter Busy bne.b .wait eor.l #$0d3c0000,d0 beq.b .frame ; move.w #$050,$dff180 move.l a3,a4 moveq.l #9,d1 .pos: move.l d1,d2 subq.w #4,d2 swap.w d2 divs.w d5,d2 add.w d6,d2 muls.w d7,d2 move.w d2,-(a4) move.w #$8D2D,-(a4) ;or.b d6,x(a5) move.l #$D2416804,-(a4);add.w d1,d1 ;bvc.b *+4 subq.l #1,d1 bgt.b .pos .byte: moveq.l #-$80,d6 .bit: swap.w d2 move.b (a2,d2.w),d1 swap.w d2 sub.l d5,d2 lsl.w #7,d1 jsr (a4) ; add.w d1,d1 ; bvc.b .nop ; or.b d6,0(a5) ;.nop: lsr.b #1,d6 bne.b .bit addq.l #1,a5 subq.l #2,d4 bge.b .byte add.w d3,d5 tst.b d5 bne.b .notflip neg.w d3 .notflip: subq.l #1,a2 ; move.w #$010,$dff180 .vsync: tst.b $006-$040(a6) bne.b .vsync move.l a5,a0 lea.l 320*(CENTER+TEXTHEIGHT/2)/8(a5),a5 lea.l -40(a5),a4 ifeq EXPORT btst.b #6,$bfe001 bne.w .frame_loop jmp TestExit else bra.b .frame_loop endc IntroEnd: if EXPORT printv IntroEnd-Intro else printv IntroEnd-Intro-16 endc