THIS SOURCE FILE HAS BEEN PACKED USING POWERPACKER 2. TO USE IT YOU WILL
			   NEED TO DEPACK IT!

; 'core.s' source , see accompaning text in the May 1994 issue
; of Amiga computing . Written by Mark Jackson using Devpac 3.02

; what this basically does is take over the system and set up our
; own screen . When the 'ESC' key is pressed the system will be restored
; this can be used as the core of any program


	section	core,code_c		; put in CHIP memory
	opt	c-,o+			; not case-sensitive
					; optimisation on


	move.l	4.w,a6			; execbase
	jsr	forbid(a6)		; turn off multitasking!

	lea	$dff000,a5		; a5 always points to
					; register's base address

	move.l	#40*256*5,d0		; number of bytes we require =
					; 40 bytes * 256 lines * 5 bitplanes
	moveq.l	#2,d1			; chip memory please
	move.l	4.w,a6			; execbase
	jsr	allocmem(a6)		; allocate us some memory , please
	tst.l	d0			; is there enough spare memory?
	beq	error			; no - exit program!
	move.l	d0,screen		; save address of our memory

	move.l	screen,a0		; address to start clearing
	move.w	#40*256*5,d0		; number of bytes to clear
	bsr	clear_memory		; clear memory


	lea	gfxlib,a1		; name of library to open
	moveq	#0,d0			; version number unimportant
	move.l	4.w,a6			; execbase
	jsr	openlib(a6)		; open graphics-library
	move.l	d0,gfxbase		; save base address


	move.l	screen,d0		; address of first bitplane
	move.l	d0,d1
	move.w	d1,pl1l			; set pointer low word
	swap	d1
	move.w	d1,pl1h			; and high word

	add.l	#40*256,d0		; point to next bitplane
	move.l	d0,d1
	move.w	d1,pl2l
	swap	d1
	move.w	d1,pl2h

	add.l	#40*256,d0
	move.l	d0,d1
	move.w	d1,pl3l
	swap	d1
	move.w	d1,pl3h

	add.l	#40*256,d0
	move.l	d0,d1
	move.w	d1,pl4l
	swap	d1
	move.w	d1,pl4h

	add.l	#40*256,d0
	move.l	d0,d1
	move.w	d1,pl5l
	swap	d1
	move.w	d1,pl5h


	move.l	gfxbase,a6		; graphics-library base address
	move.w	#$80,dmacon(a5)		; turn copper dma off
	move.l	$32(a6),oldcpr		; save address of old copper-list
	move.l	#newcpr,$32(a6)		; insert our new copper-list
	move.w	#$8080,dmacon(a5)	; and turn copper dma back on!


main_loop:
	move.b	vhposr(a5),d0		; get scanline
	cmp.b	#$ff,d0			; reached line $ff?
	bne.s	main_loop		; not yet


					; this is where our routines
					; are called from


	move.b	$bfec01,d0		; read keyboard (raw keycode)
	eor.b	#$ff,d0			; decode byte
	ror.b	#1,d0

	cmp.b	#$45,d0			; escape key pressed?
	bne.s	main_loop		; nope! - loop back until it is


	move.l	gfxbase,a6		; graphics-library base address
	move.w	#$80,dmacon(a5)		; copper dma off
	move.l	oldcpr,$32(a6)		; restore system copper-list
	move.w	#$8080,dmacon(a5)	; copper dma on

	move.l	4.w,a6			; execbase
	move.l	screen,a1		; address of screen memory
	move.l	#40*256*5,d0		; number of bytes we took
	jsr	freemem(a6)		; free the memory

	move.l	gfxbase,a1		; graphics-library base address
	move.l	4.w,a6			; execbase
	jsr	closelib(a6)		; close library
error:
	move.l	4.w,a6			; execbase
	jsr	permit(a6)		; multitasking on

	moveq	#0,d0			; no errors , please!
	rts				; and return to CLI


oldcpr:					; space to store address of
	dc.l	0			; system copper-list

newcpr:					; our new copper-list
	dc.w	bplcon0,$5200		; 5 bitplane (32 colour) screen
	dc.w	bpl1mod,0		; bitplane modulo (odd bitplanes)
	dc.w	bpl2mod,0		; bitplane modulo (even bitplanes)
	dc.w	ddfstrt,$38		; left edge of screen
	dc.w	ddfstop,$d0		; right edge of screen
	dc.w	diwstrt,$2c81		; top left corner of screen
	dc.w	diwstop,$2cc1		; bottom right corner of screen


	dc.w	bpl1pth			; bitplane pointers
pl1h:	dc.w	0,bpl1ptl
pl1l:	dc.w	0,bpl2pth
pl2h:	dc.w	0,bpl2ptl
pl2l:	dc.w	0,bpl3pth
pl3h:	dc.w	0,bpl3ptl
pl3l:	dc.w	0,bpl4pth
pl4h:	dc.w	0,bpl4ptl
pl4l:	dc.w	0,bpl5pth
pl5h:	dc.w	0,bpl5ptl
pl5l:	dc.w	0

	dc.w	spr0pth			; sprite pointers
sp0h:	dc.w	0,spr0ptl
sp0l:	dc.w	0,spr1pth
sp1h:	dc.w	0,spr1ptl
sp1l:	dc.w	0,spr2pth
sp2h:	dc.w	0,spr2ptl
sp2l:	dc.w	0,spr3pth
sp3h:	dc.w	0,spr3ptl
sp3l:	dc.w	0,spr4pth
sp4h:	dc.w	0,spr4ptl
sp4l:	dc.w	0,spr5pth
sp5h:	dc.w	0,spr5ptl
sp5l:	dc.w	0,spr6pth
sp6h:	dc.w	0,spr6ptl
sp6l:	dc.w	0,spr7pth
sp7h:	dc.w	0,spr7ptl
sp7l:	dc.w	0

	dc.w	colour0,$000		; colours (red $0-$f , green $0-$f
	dc.w	colour1,$fff		; blue $0-$f) e.g. $f00 = bright red
	dc.w	colour2,$fff		; $ff0 = yellow , etc.
	dc.w	colour3,$fff
	dc.w	colour4,$fff
	dc.w	colour5,$fff
	dc.w	colour6,$fff
	dc.w	colour7,$fff
	dc.w	colour8,$fff
	dc.w	colour9,$fff
	dc.w	colour10,$fff
	dc.w	colour11,$fff
	dc.w	colour12,$fff
	dc.w	colour13,$fff
	dc.w	colour14,$fff
	dc.w	colour15,$fff
	dc.w	colour16,$fff
	dc.w	colour17,$fff
	dc.w	colour18,$fff
	dc.w	colour19,$fff
	dc.w	colour20,$fff
	dc.w	colour21,$fff
	dc.w	colour22,$fff
	dc.w	colour23,$fff
	dc.w	colour24,$fff
	dc.w	colour25,$fff
	dc.w	colour26,$fff
	dc.w	colour27,$fff
	dc.w	colour28,$fff
	dc.w	colour29,$fff
	dc.w	colour30,$fff
	dc.w	colour31,$fff

	dc.w	$ffff,$fffe		; end of copper-list



************  clear memory  ************


clear_memory:
	subq.w	#1,d0			; subtract one for dbra
	moveq.b	#0,d1			; value to fill memory with (zero)
clear_loop:
	move.b	d1,(a0)+		; clear first byte , point to next
	dbra	d0,clear_loop		; do this for every byte
	rts				; and that's it folks!



************  data  ************


gfxlib:		dc.b	'graphics.library',0
		even
gfxbase:	dc.l	0

screen:	dc.l	0		; longword to store address of screen



************  equates  ************


** exec library offsets

forbid		equ	-132
permit		equ	-138
openlib		equ	-552
closelib	equ	-414
allocmem	equ	-198
freemem		equ	-210


** register offsets

bplcon0		equ	$100
bpl1mod		equ	$108
bpl2mod		equ	$10a
bpl1pth		equ	$e0
bpl1ptl		equ	$e2
bpl2pth		equ	$e4
bpl2ptl		equ	$e6
bpl3pth		equ	$e8
bpl3ptl		equ	$ea
bpl4pth		equ	$ec
bpl4ptl		equ	$ee
bpl5pth		equ	$f0
bpl5ptl		equ	$f2
diwstrt		equ	$8e
diwstop		equ	$90
ddfstrt		equ	$92
ddfstop		equ	$94

dmacon		equ	$96
vhposr		equ	$6
spr0pth		equ	$120
spr0ptl		equ	$122
spr1pth		equ	$124
spr1ptl		equ	$126
spr2pth		equ	$128
spr2ptl		equ	$12a
spr3pth		equ	$12c
spr3ptl		equ	$12e
spr4pth		equ	$130
spr4ptl		equ	$132
spr5pth		equ	$134
spr5ptl		equ	$136
spr6pth		equ	$138
spr6ptl		equ	$13a
spr7pth		equ	$13c
spr7ptl		equ	$13e

colour0		equ	$180
colour1		equ	$182
colour2		equ	$184
colour3		equ	$186
colour4		equ	$188
colour5		equ	$18a
colour6		equ	$18c
colour7		equ	$18e
colour8		equ	$190
colour9		equ	$192
colour10	equ	$194
colour11	equ	$196
colour12	equ	$198
colour13	equ	$19a
colour14	equ	$19c
colour15	equ	$19e
colour16	equ	$1a0
colour17	equ	$1a2
colour18	equ	$1a4
colour19	equ	$1a6
colour20	equ	$1a8
colour21	equ	$1aa
colour22	equ	$1ac
colour23	equ	$1ae
colour24	equ	$1b0
colour25	equ	$1b2
colour26	equ	$1b4
colour27	equ	$1b6
colour28	equ	$1b8
colour29	equ	$1ba
colour30	equ	$1bc
colour31	equ	$1be

	end
