; The 16x16, 3 colour text routine (well, 1 colour has to be background!)

do1616text	tst.w	_1616flagcntdn		; if not counting down (delay)
		beq	_1616letter		;   display next letter
		sub.w	#1,_1616flagcntdn	; else, decrement counter
		beq	_1616setupdraw		; if zero, set-up next draw
		rts
_1616setupdraw	move.b	#220,_1616charcount	; setup char countdown
		move.b	#0,_1616charpos		; set char pos to 0
		move.l	_1616msgpointer,a0	; check for message restart
		tst.w	(a0)
		beq	_1616restart
_clrtext	move.l	#TextBitmap,a0		; clear text area
		move.l	#219,d0			; 220 set of 16 long words
_clrtextloop	clr.l	(a0)+			;  (14080 bytes)
		clr.l	(a0)+			;
		clr.l	(a0)+			;
		clr.l	(a0)+			; This has been done for
		clr.l	(a0)+			; raw speed
		clr.l	(a0)+			;
		clr.l	(a0)+			;
		clr.l	(a0)+			;
		clr.l	(a0)+			; It's an old trick I learnt
		clr.l	(a0)+			; when I wrote a ZX Spectrum
		clr.l	(a0)+			; Z80 routine to do a scroll
		clr.l	(a0)+			; 56 pixels high.
		clr.l	(a0)+			; (87.5K per second on a Z80!)
		clr.l	(a0)+			;
		clr.l	(a0)+			; (P.S. The Z80 run at 3.5Mhz!)
		clr.l	(a0)+			;
		dbf	d0,_clrtextloop		;
		rts
_1616restart	move.l	#_1616text,_1616msgpointer	; pretty obvious!
		bra	_clrtext

_1616letter	tst.b	_1616charcount		; dump a letter on screen
		beq	_1616setupcntdn		; if no more chars, start wait
		move.l	_1616msgpointer,a0	; get message pointer
		move.b	(a0)+,d0		; increment
		move.l	a0,_1616msgpointer	; re-store
		sub.b	#1,_1616charcount	; one less char (in 'page')
		sub.b	#32,d0			; char code less 32
		and.l	#$ff,d0			; mask unused bits of long word
		divu	#20,d0			; divide by 20
		move.w	d0,d1			; result in d1
		swap	d0			; remainder in d0
		mulu	#640,d1			; mult by 640
		add.w	d0,d1			; add remainder...
		add.w	d0,d1			; ...twice
						; We now have the character
						; definition in our bitmap.
		move.l	#_1616chrpl1,a0		; get both bitmap addresses
		move.l	#_1616chrpl2,a1
		add.l	d1,a0
		add.l	d1,a1
		move.b	_1616charpos,d0		; get screen pos
		and.l	#$ff,d0			; see above
		divu	#20,d0
		move.w	d0,d1
		swap	d0
		mulu	#640,d1
		add.w	d0,d1
		add.w	d0,d1
		move.l	#TextBitmap,a2		; add to screen bitmap address
		add.l	d1,a2
		move.l	a2,a3			; add 7040 for 2nd screen bmap
		add.l	#7040,a3
		move.l	#15,d0			; 15 lines
		move.l	#40,d1			; 40 bytes each screen row
_1616PutChrLoop	move.w	(a0),(a2)		; copy row (bitmap 0)
		move.w	(a1),(a3)		; copy row (bitmap 1)
		add.l	d1,a0			; next screen row (bmap 0)
		add.l	d1,a1			; next screen row (bmap 1)
		add.l	d1,a2			; next char row (bmap 0)
		add.l	d1,a3			; next char row (bmap 1)
		dbf	d0,_1616PutChrLoop	; do next row
		add.b	#1,_1616charpos		; next char pos on screen
		rts

_1616setupcntdn	move.l	_1616msgpointer,a0	; Setup the countdown before
		move.w	(a0)+,_1616flagcntdn	; next page.
		move.l	a0,_1616msgpointer
		rts

; The data section of the routine:

_1616flagcntdn	dc.w	0
_1616charcount	dc.b	220
_1616charpos	dc.b	0
_1616msgpointer	dc.l	_1616text

; The character definition bitmap(s)

_1616chrpl1	incbin	"charset.chrpl1"
_1616chrpl2	incbin	"charset.chrpl2"

; The text 'pages'
; Each page has 11 line of text, each 20 chars wide. This is followed by
; a word containing the delay (in frames) before the next page is started.

_1616text	dc.b	"                    "
		dc.b	"                    "
		dc.b	"     WELCOME TO     "
		dc.b	"                    "
		dc.b	"  THE EXTRA BIT OF  "
		dc.b	"                    "
		dc.b	"   THE 81ST TRACK   "
		dc.b	"                    "
		dc.b	"   MUSIC DISK ONE   "
		dc.b	"                    "
		dc.b	"                    "
		dc.w	200

		dc.b	"T H E  C R E D I T S"
		dc.b	"( E X T R A  B I T )"
		dc.b	"                    "
		dc.b	"CODED BY:           "
		dc.b	"            AARDVARK"
		dc.b	"DRAWN BY:           "
		dc.b	"            AARDVARK"
		dc.b	"          POWERSLAVE"
		dc.b	"MUSICATED BY:       "
		dc.b	"            AARDVARK"
		dc.b	"                    "
		dc.w	250

		dc.b	"T H E  C R E D I T S"
		dc.b	" ( M A I N  B I T ) "
		dc.b	"                    "
		dc.b	"CODED BY:           "
		dc.b	"            AARDVARK"
		dc.b	"DRAWN BY:           "
                dc.b	"            AARDVARK"
		dc.b	"          POWERSLAVE"
		dc.b	"MUSICATED BY:       "
		dc.b	"            AARDVARK"
		dc.b	"          POWERSLAVE"
		dc.w	250

		dc.b	"                    "
		dc.b	"                    "
		dc.b	"THE NEXT  ITEM TO BE"
		dc.b	"TAKEN CARE OF IS THE"
		dc.b	"INDIVIDUAL GREETINGS"
		dc.b	"  FROM THE VARIOUS  "
		dc.b	"     MEMBERS OF     "
		dc.b	"                    "
		dc.b	" THE   81ST   TRACK "
		dc.b	"                    "
		dc.b	"                    "
		dc.w	150

		dc.b	"                    "
		dc.b	"AARDVARK SAYS HI TO:"
		dc.b	"--------------------"
		dc.b	"                    "
		dc.b	"4-MAT        ANARCHY"
		dc.b	"JESPER KYD   SILENTS"
		dc.b	"DR.AWESOME CRUSADERS"
		dc.b	"STATIC        REBELS"
		dc.b	"THE JUDGE     S.A.E."
		dc.b	"                    "
		dc.b	"                    "
		dc.w	250

		dc.b	"AARDVARK'S  INTERNAL"
		dc.b	"      MESSAGES      "
		dc.b	"--------------------"
		dc.b	"POWERSLAVE:         "
		dc.b	"  LOOK! PROPER BOBS,"
		dc.b	"  PROPORTINAL FONTS,"
		dc.b	"  AND COLOUR TEXT!  "
		dc.b	"                    "
		dc.b	"THE MAD ONE:        "
		dc.b	"  YOU OWE ME `50 AND"
		dc.b	"  MY PRINTER...     "
		dc.w	200

		dc.b	"POWERSLAVE'S  GREETS"
		dc.b	"--------------------"
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.w	250

		dc.b	"SOFTWARE USED IN THE"
		dc.b	"MAKING OF THIS DISK:"
		dc.b	"--------------------"
		dc.b	"      DEVPAC 2      "
		dc.b	"      DPAINT 3      "
		dc.b	"   MICROEMACS 1.3   "
		dc.b	" CYGNUS-ED PRO 2.12 "
		dc.b    "AMIGABASIC (4 SINES)"
		dc.b	" TIME CRUNCHER V1.7 "
		dc.b	"  AN IFF CONVERTER  "
		dc.b	"A FEW FILE UTILITIES"
		dc.w	250

		dc.b	"   THE 81ST TRACK   "
		dc.b	"    MEMBER  LIST    "
		dc.b	"                    "
		dc.b	"AARDVARK: CODE,MUSIC"
		dc.b	"        AND GRAPHICS"
		dc.b	"                    "
		dc.b	"POWERSLAVE: GRAPHICS"
		dc.b	"           AND MUSIC"
		dc.b	"                    "
		dc.b	"THE MAD ONE:   MUSIC"
		dc.b	"        AND GRAPHICS"
		dc.w	500

		dc.b	"   THE 81ST TRACK   "
		dc.b	"                    "
		dc.b	"  WILL RETURN WITH  "
		dc.b	"                    "
		dc.b	"  MORE PRODUCTIONS  "
		dc.b	"                    "
		dc.b	"ON AN AMIGA NEAR YOU"
		dc.b	"                    "
		dc.b	"     SOON......     "
		dc.b	"                    "
		dc.b	"           (WE HOPE)"
		dc.w	250

		dc.b	"+------------------+"
		dc.b	"|BY NOW, YOU'RE    |"
		dc.b	"|PROBABLY THINKING |"
		dc.b	"|ABOUT WHY THIS    |"
		dc.b	"|DISK WAS MADE.    |"
		dc.b	"|                  |"
		dc.b	"|                  |"
		dc.b	"|  THE REASON IS:  |"
		dc.b	"|                  |"
                dc.b	"|  WELL, WHY NOT!  |"
		dc.b	"+------------------+"
		dc.w	100

		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"       MESSAGE      "
		dc.b	"                    "
		dc.b	"     RESTARTING!    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.b	"                    "
		dc.w	50,0		; the zero indicates message restart