Authentic World of Commodore colors by Loonies [web]
;; 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
[ back to the prod ]
