; 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