
 	opt 	c-,o+,l-		; No case sensitivity, Optimize on

 	section 	cu,code


;
; This code is mostly system-friendly. Disable ENFORCER when running
; if used, as it will moan most horribly at my copper setup routine.
;

_LVOForbid 	equ 	-132
_LVOPermit 	equ 	-138
_LVOOpenLibrary 	equ 	-$228
_LVOCloseLibrary 	equ 	-$19e








 	lea 	gfxlib,a1
 	moveq 	#0,d0
 	move.l  	4.w,a6
 	jsr 	_LVOOpenLibrary(a6) ; Open Graphics library
 	tst 	d0
 	beq 	error
 	move.l  	D0,gfxbase

	move.l	4.w,a6
	jsr	_LVOForbid(a6)	; Suspend multitasking

 	move.l  	#screen,d0	; Store screen address in
 	move.w  	d0,pl0l		; Copper list
 	swap    	d0
 	move.w  	d0,pl0h


 	move.l  	gfxbase,a6	; Set up copper list
 	move.w  	#$80,$dff096
 	move.l  	$32(a6),oldcpr
 	move.l  	#newcpr,$32(a6)
 	move.w  	#$8080,$dff096

;	interrupt set up
 	move.l  	$6c.w,old
 	move.l  	#new,$6c.w
 	move.w  	#$8010,$dff09a


	move.l	#0,0		; Wipe location 0 for sprite
				; (sorry Enforcer!)



WAIT:	btst	#6,$bfe001	; Test for left mousebutton
 	bne.s 	wait

	move.l	gfxbase,a6
 	move.l  	old,$6c.w		; Return to workbench
 	move.w	#$0080,$dff096
 	move.l  	oldcpr,$32(a6)
 	move.w  	#$8080,$dff096

	move.l    4.w,a6
	jsr	_LVOPermit(a6)

	move.l	gfxbase,a1	; Close graphics library
	move.l  	4.w,a6
	jsr 	_LVOCloseLibrary(a6)

error:
	clr.l  	d0		; exit routine
 	rts




new: 	movem.l 	d0-d7/a0-a6,-(sp)	; save all registers
 	and.w 	#$10,$dff01e        ; check if it is
 	beq.s 	out
 	move.w 	#$10,$dff09c

;	our interrupt code starts here

          bsr	scroll
	moveq	#0,d0
	move.w	scrlpos,d0
          sub.w	#1,scrlpos
	cmp.w	#0,d0
	bne.s     .noprt
	move.w	#3,scrlpos
	move.l	textpos,a0
	move.b	(a0)+,d0
	move.l	a0,textpos
	cmp.b	#0,d0
	bne.s	.print
          move.l	#text,textpos
          move.b	#32,d0
.print    bsr	printchar
.noprt
;	our interrupt code ends here...

out:	movem.l 	(sp)+,d0-d7/a0-a6

          move.l	old,-(sp)
	rts


printchar:
; this routine prints the character in d0


	sub.w	#32,d0		; convert from ASCII
				; to space = 0, ! = 1, etc

          lsl.w     #3,d0               ; multiply by 8

	lea       font,a0
	add.l     d0,a0
	lea	screen+40,a1
	moveq	#7,d1
.lp
	move.b	(a0)+,(a1)
	add.l	#42,a1
	dbra	d1,.lp
	rts

scroll:

	lea 	blitstart,a0
	lea 	2(a0),a1

buyFractalUniverse

	btst 	#6,$dff002          ;	wait until blitter ready
	bne.s 	buyFractalUniverse	;	:-)

	move.l 	a0,$dff054
	move.l 	a1,$dff050
	move.l	#-1,$dff044
	clr.l 	$dff064
	move.w 	#%1110100111110000,$dff040
	clr.w 	$dff042
	move.w 	#21+64*9,$dff058

	rts

          section 	fastdata,data


oldcpr	dc.l	0
gfxbase	dc.l 	0
old	dc.l      0
scrlpos	dc.w	0
textpos	dc.l	text
gfxlib 	dc.b 	"graphics.library",0


text      dc.b	"Welcome to CU Amiga!.. This is a test..... "
	dc.b	"And hello from Jolyon. As you can see this "
	dc.b	"is a rather silly example of how you can use "
	dc.b	"the Amiga copper co-processor from machine code "
	dc.b	"to do strange and disgusting things to a rather "
	dc.b 	"innocent scrolly text message. "
          dc.b	" So.. ermm.  Nice weather, isn't it? "
	dc.b	"Well, at least it was. It's not actually now, it's "
	dc.b	"been raining all day. And I went to the Dentist "
	dc.b	"this morning and my mouth hurts. "
          dc.b      "And poor old Green at the CU Office has nearly died "
	dc.b	"from worry because this article isn't ready yet. "
	dc.b	" Oh, and the internal drive on my Amiga 3000 died.. "
	dc.b	"and the replacement power supply for our hard drive "
	dc.b	"doesn't work either. "
	dc.b	"and (shameless plug time: Buy Fractal Universe, £29.95"
	dc.b	" for CDTV!) that's all for today...  Be Excellent to "
	dc.b	"each other...                            "



	dc.b	0

font	dc.w	$0000,$0000,$0000,$0000,$1818,$1818,$1800,$1800
	dc.w	$6c6c,$6c00,$0000,$0000,$6c6c,$fe6c,$fe6c,$6c00
	dc.w	$0c3e,$583c,$1a7c,$3000,$00c6,$cc18,$3066,$c600
	dc.w	$386c,$3876,$dccc,$7600,$1818,$3000,$0000,$0000
	dc.w	$0c18,$3030,$3018,$0c00,$3018,$0c0c,$0c18,$3000
	dc.w	$006c,$38fe,$386c,$0000,$0018,$187e,$1818,$0000
	dc.w	$0000,$0000,$0018,$1830,$0000,$007e,$0000,$0000
	dc.w	$0000,$0000,$0018,$1800,$060c,$1830,$60c0,$8000
	dc.w	$7cc6,$ced6,$e6c6,$7c00,$1838,$1818,$1818,$7e00
	dc.w	$3c66,$063c,$6066,$7e00,$3c66,$061c,$0666,$3c00
	dc.w	$1838,$5898,$fe18,$3c00,$7e62,$603c,$0666,$3c00
	dc.w	$3c66,$607c,$6666,$3c00,$7e46,$060c,$1818,$1800
	dc.w	$3c66,$663c,$6666,$3c00,$3c66,$663e,$0666,$3c00
	dc.w	$0000,$1818,$0018,$1800,$0000,$1818,$0018,$1830
	dc.w	$0c18,$3060,$3018,$0c00,$0000,$7e00,$7e00,$0000
	dc.w	$6030,$180c,$1830,$6000,$3c66,$060c,$1800,$1800
	dc.w	$7cc6,$ded6,$dec0,$7e00,$183c,$6666,$7e66,$6600
	dc.w	$fc66,$667c,$6666,$fc00,$3c66,$c0c0,$c066,$3c00
	dc.w	$f86c,$6666,$666c,$f800,$fe62,$6878,$6862,$fe00
	dc.w	$fe62,$6878,$6860,$f000,$3c66,$c0c0,$ce66,$3e00
	dc.w	$6666,$667e,$6666,$6600,$7e18,$1818,$1818,$7e00
	dc.w	$1e0c,$0c0c,$cccc,$7800,$e666,$6c78,$6c66,$e600
	dc.w	$f060,$6060,$6266,$fe00,$c6ee,$fefe,$d6c6,$c600
	dc.w	$c6e6,$f6de,$cec6,$c600,$386c,$c6c6,$c66c,$3800
	dc.w	$fc66,$667c,$6060,$f000,$386c,$c6c6,$dacc,$7600
	dc.w	$fc66,$667c,$6c66,$e600,$3c66,$603c,$0666,$3c00
	dc.w	$7e5a,$1818,$1818,$3c00,$6666,$6666,$6666,$3c00
	dc.w	$6666,$6666,$663c,$1800,$c6c6,$c6d6,$feee,$c600
	dc.w	$c66c,$3838,$6cc6,$c600,$6666,$663c,$1818,$3c00
	dc.w	$fec6,$8c18,$3266,$fe00,$3c30,$3030,$3030,$3c00
	dc.w	$c060,$3018,$0c06,$0200,$3c0c,$0c0c,$0c0c,$3c00
	dc.w	$183c,$7e18,$1818,$1800,$0000,$0000,$0000,$00ff
	dc.w	$1818,$0c00,$0000,$0000,$0000,$780c,$7ccc,$7600
	dc.w	$e060,$7c66,$6666,$fc00,$0000,$3c66,$6066,$3c00
	dc.w	$1c0c,$7ccc,$cccc,$7600,$0000,$3c66,$7e60,$3c00
	dc.w	$1c36,$3078,$3030,$7800,$0000,$3e66,$663e,$067c
	dc.w	$e060,$6c76,$6666,$e600,$1800,$3818,$1818,$3c00
	dc.w	$0600,$0606,$0666,$663c,$e060,$666c,$786c,$e600
	dc.w	$3818,$1818,$1818,$3c00,$0000,$6cfe,$d6d6,$c600
	dc.w	$0000,$dc66,$6666,$6600,$0000,$3c66,$6666,$3c00
	dc.w	$0000,$dc66,$667c,$60f0,$0000,$76cc,$cc7c,$0c1e
	dc.w	$0000,$6c36,$3030,$7800,$0000,$3c60,$3c06,$7c00
	dc.w	$3030,$7c30,$3036,$1c00,$0000,$6666,$6666,$3e00
	dc.w	$0000,$6666,$663c,$1800,$0000,$c6d6,$d6fe,$6c00
	dc.w	$0000,$c66c,$386c,$c600,$0000,$6666,$663e,$067c
	dc.w	$0000,$7e4c,$1832,$7e00,$0e18,$1870,$1818,$0e00
	dc.w	$1818,$1818,$1818,$1800,$7018,$180e,$1818,$7000
	dc.w	$62d6,$8c00,$0000,$0000,$3844,$baa2,$ba44,$3800
	dc.w	$c038,$fb4f,$00fe,$01f0,$1422,$a008,$8037,$8e10


	section 	chipdata,data_c

; some defines for copper commands

COL0	equ	$180
COL1	equ	$182
BPL1MOD	equ	$108
BPLCON0	equ	$100
BPLCON1	equ	$102
BPLCON2	equ	$104
BPL0PTH	equ	$e0
BPL0PTL	equ	$e2
SPR0PTH	equ	$120
SPR0PTL	equ	$122

cw	equ	$FFFE     ; copper wait mask



newcpr	dc.w 	BPLCON0,$1200
	dc.w	BPLCON1,$0
	dc.w	BPLCON2,$a
	dc.w	BPL1MOD,2
 	dc.w 	$92,$38
	dc.w	$94,$d0
	dc.w	$8e,$2c81
	dc.w	$90,$2cc1
	dc.w      BPL0PTH
pl0h 	dc.w	0,BPL0PTL
pl0l 	dc.w	0,SPR0PTH,0,SPR0PTL,0
	dc.w	COL0,0,COL1,$ff0

	dc.w	$2d07,cw,COL1,$ff1
	dc.w	$2e07,cw,COL1,$ff3
	dc.w	$2f07,cw,COL1,$ff5
	dc.w	$3007,cw,COL1,$ff7
	dc.w	$3107,cw,COL1,$ff9
	dc.w	$3207,cw,COL1,$ffb
	dc.w	$3307,cw,COL1,$ffd
	dc.w	$3407,cw,COL1,$fff
	dc.w	BPL1MOD,-82

	dc.w	$3507,cw,COL1,$ff
	dc.w	$3607,cw,COL1,$df
	dc.w	$3707,cw,COL1,$bf
	dc.w	$3807,cw,COL1,$9f
	dc.w	$3907,cw,COL1,$7f
	dc.w	$3a07,cw,COL1,$5f
	dc.w	$3b07,cw,COL1,$3f
	dc.w	$3c07,cw,COL1,$1f

	dc.w	$3d07,cw
	dc.w	BPL1MOD,2

	dc.w	$3e07,cw,COL1,$f01
	dc.w	$3f07,cw,COL1,$f03
	dc.w	$4007,cw,COL1,$f05
	dc.w	$4107,cw,COL1,$f07
	dc.w	$4207,cw,COL1,$f09
	dc.w	$4307,cw,COL1,$f0b
	dc.w	$4407,cw,COL1,$f0d
	dc.w	$4507,cw,COL1,$f0f

	dc.w      $4607,cw
	dc.w	BPL1MOD,-82

	dc.w	$4707,cw,COL1,$ff0
	dc.w	$4807,cw,COL1,$df0
	dc.w	$4907,cw,COL1,$bf0
	dc.w	$4a07,cw,COL1,$9f0
	dc.w	$4b07,cw,COL1,$7f0
	dc.w	$4c07,cw,COL1,$5f0
	dc.w	$4d07,cw,COL1,$3f0
	dc.w	$4e07,cw,COL1,$1f0

	dc.w	$4f07,cw
	dc.w	BPL1MOD,2,COL1,$f0f

	dc.w	$5007,cw
	dc.w	BPL1MOD,-40,COL1,$f1f
          dc.w	$5107,cw
	dc.w	BPL1MOD,2,COL1,$f2f
	dc.w	$5207,cw
	dc.w	BPL1MOD,-40,COL1,$f3f
	dc.w	$5307,cw
	dc.w	BPL1MOD,2,COL1,$f4f
	dc.w	$5407,cw
	dc.w	BPL1MOD,-40,COL1,$f5f
	dc.w	$5507,cw
	dc.w	BPL1MOD,2,COL1,$f6f
	dc.w	$5607,cw
	dc.w	BPL1MOD,-40,COL1,$f7f
	dc.w	$5707,cw
	dc.w	BPL1MOD,2,COL1,$f8f
	dc.w	$5807,cw
	dc.w	BPL1MOD,-40,COL1,$f9f
	dc.w	$5907,cw
	dc.w	BPL1MOD,2,COL1,$faf
	dc.w	$5a07,cw
	dc.w	BPL1MOD,-40,COL1,$fbf
	dc.w	$5b07,cw
	dc.w	BPL1MOD,2,COL1,$fcf
	dc.w	$5c07,cw
	dc.w	BPL1MOD,-40,COL1,$fdf
	dc.w	$5d07,cw
	dc.w	BPL1MOD,2,COL1,$fef
	dc.w	$5e07,cw
	dc.w	BPL1MOD,-40,COL1,$fff
	dc.w	$5f07,cw
	dc.w	BPL1MOD,2
	dc.w	$6007,cw
	dc.w	BPL1MOD,-40
        	dc.w	$6107,cw

	dc.w	BPL1MOD,-124,COL1,$242

	dc.w      $6607,cw

	dc.w 	BPLCON0,$9200
	dc.w	BPL1MOD,2
 	dc.w 	$92,$58
	dc.w	$94,$a0
	dc.w	COL1,$cc0

	dc.w	$6f07,cw
	dc.w	BPL1MOD,-334
	dc.w	COL0,$1

;	dc.w	$6f07,cw
;	dc.w	BPL1MOD,2
	dc.w	COL0,$1
	dc.w	$7007,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$2
          dc.w	$7107,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$1
	dc.w	$7207,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$2
	dc.w	$7307,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$2
	dc.w	$7407,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$3
	dc.w	$7507,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$2,COL1,$ff1
	dc.w	$7607,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$3,COL1,$ff2
	dc.w	$7707,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$3,COL1,$ff3
	dc.w	$7807,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$4,COL1,$ff4
	dc.w	$7907,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$3,COL1,$ff5
	dc.w	$7a07,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$4,COL1,$ff6
	dc.w	$7b07,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$4,COL1,$ff7
	dc.w	$7c07,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$5,COL1,$ff8
	dc.w	$7d07,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$4,COL1,$ff9
	dc.w	$7e07,cw
	dc.w	BPL1MOD,-40
	dc.w	COL0,$5,COL1,$ffa
	dc.w	$7f07,cw
	dc.w	BPL1MOD,2
	dc.w	COL0,$5,COL1,$ffb
	dc.w	$8007,cw
	dc.w	BPL1MOD,-376

	dc.w	$8107,cw
  	dc.w 	BPLCON0,$1200
	dc.w	BPL1MOD,-40
 	dc.w 	$92,$38
	dc.w	$94,$d0,COL1,$c55

	dc.w      $8407,cw
	dc.w 	BPL1MOD,2
	dc.w 	$8507,cw
	dc.w	BPL1MOD,-40

	dc.w      $8807,cw
	dc.w 	BPL1MOD,2
	dc.w 	$8907,cw
	dc.w	BPL1MOD,-40

          dc.w      $8c07,cw
	dc.w 	BPL1MOD,2,COL1,$c66
	dc.w 	$8d07,cw
	dc.w	BPL1MOD,-40

	dc.w      $9007,cw
	dc.w 	BPL1MOD,2
	dc.w 	$9107,cw
	dc.w	BPL1MOD,-40

	dc.w      $9407,cw
	dc.w 	BPL1MOD,2
	dc.w 	$9507,cw
	dc.w	BPL1MOD,-40

	dc.w      $9807,cw
	dc.w 	BPL1MOD,2,COL1,$c77
	dc.w 	$9907,cw
	dc.w	BPL1MOD,-40

          dc.w      $9c07,cw
	dc.w 	BPL1MOD,2
	dc.w 	$9d07,cw
	dc.w	BPL1MOD,-40

	dc.w      $a007,cw
	dc.w 	BPL1MOD,2
	dc.w 	$a107,cw
	dc.w	BPL1MOD,-40

	dc.w 	$a307,cw
	dc.w	BPL1MOD,-82,COL1,$55

	dc.w	$a607,cw,COL1,$66

	dc.w	$ac07,cw
	dc.w	BPL1MOD,2,COL1,$1c5
	dc.w	$ad07,cw
	dc.w	BPL1MOD,-40

	dc.w	$b307,cw
	dc.w	BPL1MOD,2,COL1,$2c5
	dc.w	$b407,cw
	dc.w	BPL1MOD,-40

	dc.w	$ba07,cw
	dc.w	BPL1MOD,2,COL1,$4c5
	dc.w	$bb07,cw
	dc.w	BPL1MOD,-40

	dc.w	$c107,cw
	dc.w	BPL1MOD,2,COL1,$6c5
	dc.w	$c207,cw
	dc.w	BPL1MOD,-40

	dc.w	$c807,cw
	dc.w	BPL1MOD,2,COL1,$8c5
	dc.w	$c907,cw
	dc.w	BPL1MOD,-40

	dc.w	$cf07,cw
	dc.w	BPL1MOD,2,COL1,$9c5
	dc.w	$d007,cw
	dc.w	BPL1MOD,-40

	dc.w	$d607,cw
	dc.w	BPL1MOD,2
	dc.w	$d707,cw
	dc.w	BPL1MOD,-40

	dc.w	$dd07,cw
	dc.w	BPL1MOD,2
	dc.w	$de07,cw
	dc.w	BPL1MOD,-40

	dc.w	$e407,cw
	dc.w	BPL1MOD,2
	dc.w	$e507,cw
	dc.w	BPL1MOD,-40

	dc.w 	$ffdf,cw
	dc.w	$9c,$8010
  	dc.w	$ffff,cw 	; End copper

blankline	dcb.b	100,0
blitstart	dc.w	0
screen	dcb.b	400,$0		; graphics memory



