; 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