-
Notifications
You must be signed in to change notification settings - Fork 0
/
XANADU.EL
878 lines (752 loc) · 21.2 KB
/
XANADU.EL
1
#OUTPUT "XANADU-BASIC65"'============.DECLARATIONS'============ ' MUSIC RELATED VARS ' ------------------ #DECLARE MUSIC¯CHUNK¯INDEX ' OLD T #DECLARE BAR¯INDEX ' OLD TT #DECLARE MAP¯BAR¯TO¯CHUNK(10) ' OLD M() #DECLARE V1$(4), V2$(4), V3$(4), V4$(4) ' PALETTE ' ------- #DECLARE DEFAULT¯RED(32) #DECLARE DEFAULT¯GREEN(32) #DECLARE DEFAULT¯BLUE(32) #DECLARE CURR¯RED(32) #DECLARE CURR¯GREEN(32) #DECLARE CURR¯BLUE(32) #DECLARE FADEVAL, TEMPVAL ' É/Ï ' --- #DEFINE ÈÏÔÒÅǯ7 = $D05D #DEFINE ÓÃÒÎÐÔÒÌÓ = $D060 #DEFINE ÓÃÒÎÐÔÒÂÎË = $D062 ' MISC ' ---- #DECLARE K,M,N #DECLARE RAINBOWSTR$ #DECLARE RAINBOW¯X, RAINBOW¯Y #DECLARE PLEN=0 #DECLARE SUBTEXT$(2) #DECLARE SUBTEXT¯IDX = 0 SUBTEXT$(0) = "PRESENTS..." SUBTEXT$(1) = "A TRIBUTE TO THE LATE OLIVIA NEWTON JOHN..." #DECLARE PAN¯IDX = 0 #DECLARE PAN¯SRC¯IDX #DECLARE PAN¯DEST¯IDX #DECLARE PAN¯Y, PAN¯LEN ' PETSCII ' ------- #DECLARE DATA¯ADDR = $4270C #DECLARE MAX¯FRAMES #DECLARE FRAME¯ADDR(64) #DECLARE FRM¯IDX = 0 #DECLARE FRMW, FRMH#DECLARE ANIMS(4,100) ' ANIM¯IDX, ANIM¯DATA#DECLARE AVAL,MARK(3),GMARKNUM,GCOUNT,BAIL,FOUND,FRAMEIDX,FRAMEDUR=0#DECLARE FRMX, FRMY, FRMX1, FRMY1, CDATA¯ADDR#DEFINE ÆÒͯÓÔÁÎÄ = 0#DEFINE ÆÒͯÁÒͯÕÐ1 = 1#DEFINE ÆÒͯÁÒͯÕÐ2 = 2#DEFINE ÆÒͯÁÒͯÕÐ3 = 3#DEFINE ÆÒͯÁÒͯÕÐ4 = 4#DEFINE ÆÒͯÁÒͯÌÅÆÔ1 = 5#DEFINE ÆÒͯÁÒͯÌÅÆÔ2 = 6#DEFINE ÆÒͯÁÒͯÌÅÆÔ3 = 7#DEFINE ÆÒͯÁÒͯÌÅÆÔ4 = 8#DEFINE ÆÒͯÃÌÏÓůÅÙÅÓ = 9#DEFINE ÆÒͯÏÐÅίÍÏÕÔÈ = 10#DEFINE ÆÒͯÃÌÏÓůÍÏÕÔÈ = 11#DEFINE ÆÒͯÁÒͯÒÉÇÈÔ1 = 12#DEFINE ÆÒͯÁÒͯÒÉÇÈÔ2 = 13#DEFINE ÆÒͯÁÒͯÒÉÇÈÔ3 = 14#DEFINE ÆÒͯÁÒͯÒÉÇÈÔ4 = 15#DEFINE ÆÒͯÒÅÔÕÒίÐÁÉÎÔÂÒÕÓÈ = 16#DEFINE ÆÒͯÁÒͯÒÉÇÈÔ5 = 17#DEFINE ÆÒͯÁÒͯÒÉÇÈÔ6 = 18#DEFINE ÆÒͯÌÉÆÔ¯ÐÁÐÅÒ1 = 19#DEFINE ÆÒͯÌÉÆÔ¯ÐÁÐÅÒ2 = 20#DEFINE ÆÒͯÓÈÏÃ˯ÆÁÃÅ = 21#DEFINE ÆÒͯÃÒÉÎÇůÆÁÃÅ = 22#DEFINE ÆÒͯÃÒÏÓÓ¯ÆÁÃÅ = 23#DEFINE ÆÒͯÈÏÒÒÏÒ¯ÆÁÃÅ = 24#DEFINE ÆÒͯÓÁįÆÁÃÅ = 25#DEFINE ÆÒͯÎÏÒͯÆÁÃÅ = 26#DEFINE ÆÒͯÒÉÐ1 = 27#DEFINE ÆÒͯÒÉÐ2 = 28#DEFINE ÆÒͯÒÉÐ3 = 29#DEFINE ÆÒͯÒÉÐ4 = 30#DEFINE ÆÒͯÒÉÐ5 = 31#DEFINE ÆÒͯÒÉÐ6 = 32#DEFINE ÆÒͯÒÉÐ7 = 33#DEFINE ÆÒͯÒÉÐ8 = 34#DEFINE ÆÒͯÒÉÐ9 = 35#DEFINE ÆÒͯÒÉÐ10 = 36#DEFINE ÆÒͯÒÉÐ11 = 37#DEFINE ÆÒͯÐÁÐÅÒ = 38#DEFINE ÆÒͯÐÁÉÎÔÉÎÇ1 = 39#DEFINE ÆÒͯÐÁÉÎÔÉÎÇ2 = 40#DEFINE ÆÒͯÐÁÉÎÔÉÎÇ3 = 41#DEFINE ÆÒͯÍÕÒÁÌ = 42'====.MAIN'==== GOSUB INIT GOSUB BAS¯LOGO GOSUB XANADU¯TITLE GOSUB PETSCII¯STORY GOSUB ENDER ' BACKUP PALETTE TO $48000 EDMA 0, $300, $FFD3100, $48000 ' SET ALL COLOURS TO BLACK EDMA 3, $300, 0, $FFD3100 'ÔÏÄÏ: DELETE IF PEEK($D020)<>0 THEN BORDER 2:GOSUB INIT¯PETSCII¯FRAMES FRAMEIDX=ÆÒͯÍÕÒÁÌ GOSUB DRAW¯PETSCII¯FRAME CLR DLOAD "BIGSPRITE" END' ACTION NAMES#DEFINE ÔØÔÇÒÅÙ=0#DEFINE ÔØÔÃÌÅÁÒ=1#DEFINE ÔØÔÔÁÌË=2#DEFINE ÁÎÉÍ=3#DEFINE ÐÁÉÎÔÉÎÇ=4#DEFINE ÒÅÁÃÔÉÏÎ=5#DEFINE ÃÌÓ=6#DEFINE ÄÒÁ×ÆÒÍ=7#DEFINE ÅÎÄÅÒ=8' ANIMATIONS#DEFINE ÁÎͯÐÏÎÄÅÒ=0#DEFINE ÁÎͯÐÁÉÎÔ=1#DEFINE ÁÎͯÌÉÆÔ=2#DEFINE ÁÎͯÒÉÐ=3.INIT¯PETSCII¯FRAMES'------------------- MAX¯FRAMES = PEEK(DATA¯ADDR) DATA¯ADDR = DATA¯ADDR + 1 DO WHILE FRM¯IDX < MAX¯FRAMES FRAME¯ADDR(FRM¯IDX) = DATA¯ADDR DATA¯ADDR = DATA¯ADDR + 2 FRMW = PEEK(DATA¯ADDR) DATA¯ADDR = DATA¯ADDR + 1 FRMH = PEEK(DATA¯ADDR) DATA¯ADDR = DATA¯ADDR + 1 DATA¯ADDR = DATA¯ADDR + FRMW * FRMH * 2 ':PRINT CHR$(147);"FRM¯IDX=";FRM¯IDX 'FRAMEIDX=FRM¯IDX 'GOSUB DRAW¯PETSCII¯FRAME 'GETKEY TEST2$ FRM¯IDX = FRM¯IDX + 1 LOOP RETURN#DECLARE ANIMIDX, ANIMREPEATCOUNT'=============.PETSCII¯STORY'============= GOSUB SWITCH¯TO¯80X25¯MODE GOSUB RESTORE¯SCREEN¯POINTER PALETTE RESTORE BACKGROUND 0:BORDER 0 PRINT CHR$(147); GOSUB INIT¯PETSCII¯FRAMES GOSUB INIT¯ANIMS #DECLARE TSTART, TIME, ACTION, ACTANIM=-1, ACTPAINTING #DECLARE ACTSTR$, ACTX, ACTY, ACTDUR, ACTREACTION #DECLARE ACTTIMER TSTART = TI READ TIME ACTION = -1 DO WHILE ACTION <> ÅÎÄÅÒ ' TIME TO SWITCH TO NEXT ACTION? IF (TI-TSTART) >= TIME THEN BEGIN IF ACTION = ÔØÔÔÁÌË THEN GOSUB CLEAR¯TXT¯TALK READ ACTION ACTTIMER=0 IF ACTION = ÔØÔÇÒÅÙ THEN READ ACTSTR$, ACTX, ACTY IF ACTION = ÔØÔÔÁÌË THEN READ ACTSTR$, ACTDUR IF ACTION = ÔØÔÃÌÅÁÒ THEN GOSUB CLEAR¯TEXT IF ACTION = ÁÎÉÍ THEN READ ACTANIM:ANIMIDX=0:ANIMREPEATCOUNT=0 IF ACTION = ÐÁÉÎÔÉÎÇ THEN READ ACTPAINTING:GOSUB DRAW¯PAINTING IF ACTION = ÒÅÁÃÔÉÏÎ THEN READ ACTSTR$, ACTREACTION, ACTDUR:GOSUB INIT¯REACTION IF ACTION = ÃÌÓ THEN PRINT "“"; IF ACTION = ÄÒÁ×ÆÒÍ THEN READ FRAMEIDX:GOSUB DRAW¯PETSCII¯FRAME IF ACTION = ÅÎÄÅÒ THEN EXIT TSTART = TI READ TIME ' TIME FOR NEXT ACTION BEND IF ACTION = ÔØÔÇÒÅÙ THEN GOSUB DRAW¯TXT¯GREY IF ACTION = ÔØÔÔÁÌË THEN GOSUB DRAW¯TXT¯TALK IF ACTION = ÒÅÁÃÔÉÏÎ THEN GOSUB DRAW¯REACTION GOSUB POLL¯PLAY GOSUB POLL¯ANIM LOOP RETURN#DEFINE ÍÁÒË1 = -1#DEFINE ÍÁÒË2 = -2#DEFINE ÍÁÒË3 = -3#DEFINE ÒÅÐÅÁÔ = -10#DEFINE ÉÎÆÉÎÉÔÅÌÙ = -1#DEFINE ÅÎįÁÎÉÍ = -999#DEFINE ÁÌ̯ÁÎÉÍÓ¯ÆÉÎÉÓÈÅÄ = -1000#DECLARE FRAME¯START.POLL¯ANIM'--------- IF ACTANIM = -1 THEN RETURN IF FRAMEDUR > 0 AND (TI - FRAME¯START) < FRAMEDUR THEN RETURN FRAMEDUR = 0 'CURSOR 0,1:PRINT "POLL¯ANIM"; 'CURSOR 0,2:PRINT "ACTANIM=";ACTANIM; 'CURSOR 0,3:PRINT "ANIMIDX=";ANIMIDX; AVAL = ANIMS(ACTANIM,ANIMIDX) ANIMIDX = ANIMIDX + 1'PRINT " ANIMIDX=";ANIMIDX; FOUND = 0 IF AVAL = ÍÁÒË1 THEN FOUND=1:MARK(1)=ANIMIDX IF AVAL = ÍÁÒË2 THEN FOUND=1:MARK(2)=ANIMIDX IF AVAL = ÍÁÒË3 THEN FOUND=1:MARK(3)=ANIMIDX IF AVAL = ÒÅÐÅÁÔ THEN BEGIN FOUND=1 ' GET MARK NUMBER (IN AVAL) GMARKNUM = ABS(ANIMS(ACTANIM,ANIMIDX)) ANIMIDX = ANIMIDX + 1 GCOUNT = ANIMS(ACTANIM,ANIMIDX) ANIMIDX = ANIMIDX + 1 BAIL=0 IF ANIMREPEATCOUNT = 0 THEN BEGIN IF GCOUNT <> -1 THEN ANIMREPEATCOUNT = GCOUNT ANIMIDX = MARK(GMARKNUM) BAIL=1 BEND IF BAIL=0 AND ANIMREPEATCOUNT > 0 THEN BEGIN ANIMREPEATCOUNT = ANIMREPEATCOUNT -1 IF ANIMREPEATCOUNT = 0 THEN BAIL=1 IF BAIL=0 THEN ANIMIDX=MARK(GMARKNUM) BAIL=1 BEND 'IF BAIL=0 AND ANIMREPEATCOUNT = ÉÎÆÉÎÉÔÅÌÙ THEN BEGIN ' ANIMIDX=MARK(GMARKNUM) ' BAIL=1 'BEND BEND IF AVAL = ÅÎįÁÎÉÍ THEN BEGIN FOUND = 1 ACTANIM = -1 BEND 'CURSOR 0,8:PRINT "FOUND = ";FOUND; IF FOUND = 0 THEN BEGIN ' WE'RE DRAWING A PETSCII FRAME NOW? FRAMEIDX = AVAL 'CURSOR 0,5:PRINT "DRAW FRAMEIDX=";FRAMEIDX; 'INPUT AVAL GOSUB DRAW¯PETSCII¯FRAME FRAMEDUR = ANIMS(ACTANIM,ANIMIDX) ANIMIDX = ANIMIDX + 1 FRAME¯START = TI BEND RETURN.CLEAR¯TEXT'----------- EDMA 3,80,32,$800 RETURN.DRAW¯TXT¯GREY'------------- IF ACTTIMER = -1 THEN RETURN SLEEP .05 CURSOR ACTX + ACTTIMER, ACTY PRINT "˜";MID$(ACTSTR$,1+ACTTIMER,1); ACTTIMER = ACTTIMER + 1 IF ACTTIMER >= LEN(ACTSTR$) THEN ACTTIMER = -1 RETURN.DRAW¯TXT¯TALK'------------- IF ACTTIMER = -1 THEN RETURN SLEEP .05 ACTX=(80-LEN(ACTSTR$))/2+7 ACTY=1 CURSOR ACTX + ACTTIMER, ACTY PRINT "";MID$(ACTSTR$,1+ACTTIMER,1); ACTTIMER = ACTTIMER + 1 IF ACTTIMER >= LEN(ACTSTR$) THEN ACTTIMER = -1 IF MOD(ACTTIMER,2) = 0 THEN FRAMEIDX=ÆÒͯÏÐÅίÍÏÕÔÈ:ELSE FRAMEIDX=ÆÒͯÃÌÏÓůÍÏÕÔÈ GOSUB DRAW¯PETSCII¯FRAME RETURN.CLEAR¯TXT¯TALK'-------------- CURSOR 0,1:PRINT CHR$(27);"Q"; RETURN.DRAW¯PETSCII¯FRAME'------------------ DATA¯ADDR = FRAME¯ADDR(FRAMEIDX) FRMX = PEEK(DATA¯ADDR) DATA¯ADDR = DATA¯ADDR + 1 FRMY = PEEK(DATA¯ADDR) DATA¯ADDR = DATA¯ADDR + 1 FRMW = PEEK(DATA¯ADDR) DATA¯ADDR = DATA¯ADDR + 1 FRMH = PEEK(DATA¯ADDR) DATA¯ADDR = DATA¯ADDR + 1 FRMX1=FRMX+FRMW-1 FRMY1=FRMY+FRMH-1 #DECLARE YY, SCRADDR,CLRADDR SCRADDR = $800 + FRMX + FRMY * 80 CLRADDR = $1F800 + FRMX + FRMY * 80 CDATA¯ADDR = DATA¯ADDR + FRMW * FRMH FOR YY=FRMY TO FRMY1 EDMA 0, FRMW, DATA¯ADDR, SCRADDR EDMA 0, FRMW, CDATA¯ADDR, CLRADDR DATA¯ADDR = DATA¯ADDR + FRMW CDATA¯ADDR = CDATA¯ADDR + FRMW SCRADDR = SCRADDR + 80 CLRADDR = CLRADDR + 80 NEXT YY RETURN.INIT¯REACTION'------------- PRINT "“"; FRAMEIDX = ÆÒͯÓÔÁÎÄ:GOSUB DRAW¯PETSCII¯FRAME FRAMEIDX = ÆÒͯÌÉÆÔ¯ÐÁÐÅÒ1:GOSUB DRAW¯PETSCII¯FRAME FRAMEIDX = ÆÒͯÌÉÆÔ¯ÐÁÐÅÒ2:GOSUB DRAW¯PETSCII¯FRAME RETURN.DRAW¯REACTION'------------- ACTTIMER = ACTTIMER + 1 SLEEP .1 IF MOD(ACTTIMER,2) = 0 THEN FRAMEIDX=ÆÒͯÓÈÏÃ˯ÆÁÃÅ:ELSE FRAMEIDX=ÆÒͯÈÏÒÒÏÒ¯ÆÁÃÅ GOSUB DRAW¯PETSCII¯FRAME IF ACTTIMER > 10 THEN ACTION = ÔØÔÔÁÌË:ACTTIMER = 0 RETURN.DRAW¯PAINTING'------------- PRINT "“"; FRAMEIDX = ÆÒͯÐÁÐÅÒ GOSUB DRAW¯PETSCII¯FRAME FRAMEIDX = ÆÒͯÐÁÉÎÔÉÎÇ1 + ACTPAINTING - 1 GOSUB DRAW¯PETSCII¯FRAME RETURN#DECLARE RVAL, AIDX, VIDX#DECLARE TEST$.INIT¯ANIMS'---------- AIDX = 0 VIDX = 0 DO READ RVAL ' PRINT RVAL;", "; IF RVAL = ÁÌ̯ÁÎÉÍÓ¯ÆÉÎÉÓÈÅÄ THEN EXIT ANIMS(AIDX,VIDX) = RVAL VIDX = VIDX + 1 IF RVAL = ÅÎįÁÎÉÍ THEN AIDX=AIDX+1:VIDX=0 LOOP RETURN.ANIMS'----- ' ÁÎͯÐÏÎÄÅÒ DATA ÆÒͯÓÔÁÎÄ, .3, _ ÆÒͯÁÒͯÕÐ1, .3, _ ÆÒͯÁÒͯÕÐ2, .3, _ ÆÒͯÁÒͯÕÐ3, .3 ' RAISE ARM TO CHIN DATA ÍÁÒË1 DATA ÆÒͯÁÒͯÕÐ4, .5, _ ÆÒͯÁÒͯÕÐ3, .5, _ ÆÒͯÁÒͯÕÐ4, .5, _ ÆÒͯÁÒͯÕÐ3, .5 ' SCRATCH CHIN DATA ÆÒͯÃÌÏÓůÅÙÅÓ, 0 , _ ÆÒͯÁÒͯÕÐ4, .5, _ ÆÒͯÁÒͯÕÐ3, .5, _ ÆÒͯÁÒͯÕÐ4, .5, _ ÆÒͯÁÒͯÕÐ3, .5 ' CLOSE EYES & SCRATCH CHIN DATA ÆÒͯÃÌÏÓůÍÏÕÔÈ, .2 ' NORMAL FACE DATA ÒÅÐÅÁÔ, ÍÁÒË1, ÉÎÆÉÎÉÔÅÌÙ DATA ÅÎįÁÎÉÍ ' ÁÎͯÐÁÉÎÔ DATA ÆÒͯÏÐÅίÍÏÕÔÈ, 0 , _ ÆÒͯÁÒͯÌÅÆÔ1, 1 ' GAPING MOUTH AND FINGER POINT UP DATA ÆÒͯÃÌÏÓůÍÏÕÔÈ,.2, _ ÆÒͯÁÒͯÌÅÆÔ2, .2, _ ÆÒͯÁÒͯÌÅÆÔ3, .2, _ ÆÒͯÁÒͯÌÅÆÔ4, .2, _ ÆÒͯÁÒͯÒÉÇÈÔ1, .2, _ ÆÒͯÁÒͯÒÉÇÈÔ2, .2 ' GET BRUSH DATA ÍÁÒË1 DATA ÆÒͯÃÌÏÓůÍÏÕÔÈ, .1 DATA ÍÁÒË2 DATA ÆÒͯÁÒͯÒÉÇÈÔ3, .1, _ ÆÒͯÁÒͯÒÉÇÈÔ4, .1 DATA ÒÅÐÅÁÔ, ÍÁÒË2, 5 DATA ÆÒͯÃÌÏÓůÅÙÅÓ, .5 DATA ÍÁÒË3 DATA ÆÒͯÁÒͯÒÉÇÈÔ3, .1, _ ÆÒͯÁÒͯÒÉÇÈÔ4, .1 DATA ÒÅÐÅÁÔ, ÍÁÒË3, 5 DATA ÒÅÐÅÁÔ, ÍÁÒË1, ÉÎÆÉÎÉÔÅÌÙ DATA ÅÎįÁÎÉÍ ' ÁÎͯÌÉÆÔ DATA ÆÒͯÁÒͯÒÉÇÈÔ2, .25, _ ÆÒͯÁÒͯÒÉÇÈÔ1, .25, _ ÆÒͯÒÅÔÕÒίÐÁÉÎÔÂÒÕÓÈ, .5, _ ÆÒͯÁÒͯÒÉÇÈÔ5, .25, _ ÆÒͯÁÒͯÒÉÇÈÔ6, .25, _ ÆÒͯÌÉÆÔ¯ÐÁÐÅÒ1, .25, _ ÆÒͯÌÉÆÔ¯ÐÁÐÅÒ2, .25 DATA ÍÁÒË1 DATA ÆÒͯÃÒÉÎÇůÆÁÃÅ, .1, _ ÆÒͯÃÒÏÓÓ¯ÆÁÃÅ, .1, _ ÒÅÐÅÁÔ, ÍÁÒË1, 5 DATA ÅÎįÁÎÉÍ ' ÁÎͯÒÉÐ DATA ÆÒͯÎÏÒͯÆÁÃÅ, .2, _ ÆÒͯÒÉÐ1, .1, _ ÆÒͯÒÉÐ2, .1, _ ÆÒͯÒÉÐ3, .1, _ ÆÒͯÒÉÐ4, .1, _ ÆÒͯÒÉÐ5, .1, _ ÆÒͯÒÉÐ6, .1, _ ÆÒͯÒÉÐ7, .1, _ ÆÒͯÒÉÐ8, .1, _ ÆÒͯÒÉÐ9, .1, _ ÆÒͯÒÉÐ10, .1, _ ÆÒͯÒÉÐ11, .1 DATA ÅÎįÁÎÉÍ DATA ÁÌ̯ÁÎÉÍÓ¯ÆÉÎÉÓÈÅÄ.STORY¯DATA'---------- ' TIMEDELTA ACTION TEXT X Y DUR(SEC) ' ÓONNY: ATTEMPT #1 DATA 0, ÁÎÉÍ, ÁÎͯÐÏÎÄÅÒ DATA 2, ÔØÔÇÒÅÙ, "HERE'S SONNY...", 4, 0 DATA 1.5, ÔØÔÇÒÅÙ, "A STRUGGLING ARTIST...", 22, 0 DATA 1.7, ÔØÔÇÒÅÙ, "SEARCHING FOR INSPIRATION...", 47, 0 DATA 2, ÔØÔÃÌÅÁÒ DATA .5, ÔØÔÔÁÌË, "HMM... WHAT TO DRAW TODAY...", 3 DATA 2, ÁÎÉÍ, ÁÎͯÐÁÉÎÔ DATA 1.5, ÔØÔÔÁÌË, "I KNOW!", 2 DATA 1, ÔØÔÃÌÅÁÒ DATA 3, ÁÎÉÍ, ÁÎͯÌÉÆÔ DATA 4, ÐÁÉÎÔÉÎÇ, 1 DATA 2, ÒÅÁÃÔÉÏÎ, "BLECH!", 1, 2 DATA 2, ÁÎÉÍ, ÁÎͯÒÉÐ DATA 1.5, ÃÌÓ DATA ., ÔØÔÇÒÅÙ, "TRY AGAIN SONNY...", 34, 12 DATA 2, ÃÌÓ ' ÓONNY: ATTEMPT #2 DATA ., ÁÎÉÍ, ÁÎͯÐÏÎÄÅÒ DATA 2, ÁÎÉÍ, ÁÎͯÐÁÉÎÔ DATA 1.5, ÔØÔÔÁÌË, "AHA!", 2 DATA 1, ÔØÔÃÌÅÁÒ DATA 3, ÁÎÉÍ, ÁÎͯÌÉÆÔ DATA 4, ÐÁÉÎÔÉÎÇ, 2 DATA 2, ÒÅÁÃÔÉÏÎ, "YUCK!", 1, 2 DATA 2, ÁÎÉÍ, ÁÎͯÒÉÐ DATA 1.5, ÃÌÓ DATA ., ÔØÔÇÒÅÙ, "DON'T GIVE UP SONNY!", 32, 12 DATA 2, ÃÌÓ ' ÓONNY: ATTEMPT #3 DATA ., ÁÎÉÍ, ÁÎͯÐÏÎÄÅÒ DATA 2, ÁÎÉÍ, ÁÎͯÐÁÉÎÔ DATA 1.5, ÔØÔÔÁÌË, "I GOT IT!", 2 DATA 1, ÔØÔÃÌÅÁÒ DATA 3, ÁÎÉÍ, ÁÎͯÌÉÆÔ DATA 4, ÐÁÉÎÔÉÎÇ, 3 DATA 2, ÒÅÁÃÔÉÏÎ, "EWW!", 1, 2 DATA 2, ÁÎÉÍ, ÁÎͯÒÉÐ DATA 1.5, ÄÒÁ×ÆÒÍ, ÆÒͯÓÁįÆÁÃÅ DATA ., ÔØÔÇÒÅÙ, "AWW... POOR SONNY...", 32, 0 DATA 2, ÔØÔÃÌÅÁÒ DATA .1, ÔØÔÔÁÌË, "GUYS LIKE ME SHOULDN'T DREAM ANYWAY...", 3.5 DATA 3.5, ÄÒÁ×ÆÒÍ, ÆÒͯÓÁįÆÁÃÅ DATA 1, ÃÌÓ DATA .5, ÔØÔÇÒÅÙ, "...AND WITH THAT, SONNY'S DREAMS BLEW AWAY WITH THE WIND...", 10, 12 DATA 3.5, ÃÌÓ DATA 1, ÅÎÄÅÒ'=====.ENDER'===== GOSUB SWITCH¯TO¯80X25¯MODE GOSUB RESTORE¯SCREEN¯POINTER PALETTE RESTORE RETURN'============.XANADU¯TITLE'============ PRINT CHR$(147); BACKGROUND 0 BORDER 0 ' FILL SCREEN WITH BLACK INVERTED SPACES EDMA 3,4000,0,$FF80000 EDMA 3,4000,160,$48000 GOSUB LOAD¯PALETTE GOSUB SWITCH¯TO¯80X50¯MODE GOSUB SET¯SCREEN¯POINTER GOSUB PAN¯TITLE RETURN.SWITCH¯TO¯80X50¯MODE'-------------------- BANK 128 SETBIT ÈÏÔÒÅǯ7, 7 POKE $D031, $E8 ' È640, ÆÁÓÔ, ÁÔÔÒ, Ö400 RETURN.SWITCH¯TO¯80X25¯MODE'-------------------- BANK 128 POKE $D031, $E0 ' È640, ÆÁÓÔ, ÁÔÔÒ RETURN.RESTORE¯SCREEN¯POINTER'---------------------- ' TO BANK 0 - $0800 BANK 128 WPOKE ÓÃÒÎÐÔÒÌÓÂ, $0800 POKE ÓÃÒÎÐÔÒÂÎË, 0 RETURN.SET¯SCREEN¯POINTER'------------------ ' MOVE TO BANK4 - $8000 BANK 128 SETBIT ÈÏÔÒÅǯ7, 7 WPOKE ÓÃÒÎÐÔÒÌÓÂ, $8000 POKE ÓÃÒÎÐÔÒÂÎË, $04 RETURN.PAN¯TITLE'--------- FOR PAN¯IDX = 0 TO 196 IF PAN¯IDX > 79 THEN BEGIN PAN¯SRC¯IDX = PAN¯IDX - 79 PAN¯DEST¯IDX = 0 IF PAN¯IDX > 117 THEN BEGIN PAN¯LEN = 80 - (PAN¯IDX - 117) IF PAN¯LEN < 1 THEN PAN¯LEN = 0 BEND:ELSE BEGIN PAN¯LEN = 80 BEND BEND:ELSE BEGIN PAN¯SRC¯IDX = 0 PAN¯DEST¯IDX = 79 - PAN¯IDX PAN¯LEN=PAN¯IDX + 1 BEND FOR PAN¯Y = 0 TO 49 EDMA 0,PAN¯LEN,$41000+PAN¯Y*118+PAN¯SRC¯IDX,$FF80000+PAN¯Y*80+PAN¯DEST¯IDX NEXT PAN¯Y SLEEP .02 GOSUB POLL¯PLAY NEXT PAN¯IDX RETURN.LOAD¯PALETTE'------------ #DECLARE LOC=$40FA0 FOR K = 0 TO 31 POKE $D100+K,PEEK(LOC):LOC=LOC+1 POKE $D200+K,PEEK(LOC):LOC=LOC+1 POKE $D300+K,PEEK(LOC):LOC=LOC+1 NEXT K RETURN'========.BAS¯LOGO'======== GOSUB POLL¯PLAY GOSUB FADE¯TO¯WHITE GOSUB DRAW¯LOGO GOSUB FADE¯TO¯DEFAULTS GOSUB CYCLE¯ALT¯PALETTE¯LOOP GOSUB FADE¯TO¯BLACK RETURN.CYCLE¯ALT¯PALETTE¯LOOP'---------------------- FOR M = 0 TO 32*4 GOSUB CYCLE¯ALT¯PALETTE GOSUB POLL¯PLAY GOSUB ANIM¯DRAW¯SUBTEXT SLEEP .04 NEXT M RETURN.ANIM¯DRAW¯SUBTEXT'----------------- IF M = 40 THEN BEGIN SUBTEXT¯IDX = 1 PLEN = 0 EDMA 3,80,32,$800+80*24 BEND IF PLEN < LEN(SUBTEXT$(SUBTEXT¯IDX)) THEN BEGIN PLEN = PLEN + 1 RAINBOWSTR$=LEFT$(SUBTEXT$(SUBTEXT¯IDX),PLEN) IF SUBTEXT¯IDX = 0 THEN RAINBOW¯X = 36:ELSE RAINBOW¯X = 21 RAINBOW¯Y = 24 GOSUB PRINT¯RAINBOW¯STR BEND RETURN.PRINT¯RAINBOW¯STR #DECLARE RAIN¯IDX CURSOR RAINBOW¯X, RAINBOW¯Y FOR RAIN¯IDX=1 TO LEN(RAINBOWSTR$) FOREGROUND MOD(RAIN¯IDX-1,16)+16 PRINT MID$(RAINBOWSTR$,RAIN¯IDX,1); NEXT RAIN¯IDX RETURN.CYCLE¯ALT¯PALETTE'----------------- #DECLARE TEMPR, TEMPG, TEMPB TEMPR = PEEK($D100+16) TEMPG = PEEK($D200+16) TEMPB = PEEK($D300+16) FOR K = 16 TO 30 POKE $D100+K, PEEK($D100+K+1) POKE $D200+K, PEEK($D200+K+1) POKE $D300+K, PEEK($D300+K+1) NEXT K POKE $D100+31, TEMPR POKE $D200+31, TEMPG POKE $D300+31, TEMPB RETURN.DRAW¯LOGO'--------- BACKGROUND 1 BORDER 1 EDMA 0, 2000, $40000, $800 EDMA 0, 2000, $407D0, $FF80000 RETURN.FADE¯TO¯WHITE'------------- FOR FADEVAL=0 TO 16 GOSUB FADE¯COLOURS¯TO¯WHITE SLEEP .05 NEXT FADEVAL RETURN.FADE¯TO¯BLACK'------------- GOSUB STORE¯CURR¯COLOURS FOR FADEVAL=0 TO 16 GOSUB FADE¯COLOURS¯TO¯BLACK SLEEP .05 NEXT FADEVAL RETURN.FADE¯TO¯DEFAULTS'---------------- GOSUB STORE¯CURR¯COLOURS FOR FADEVAL=0 TO 16 GOSUB FADE¯COLOURS¯TO¯DEFAULTS SLEEP .05 NEXT FADEVAL RETURN'====.INIT'==== ' SWITCH BACK TO UPPER-CASE POKE $D018, PEEK($D018) AND $FD ^^BLOAD "INTRO.DAT",P($40000),R ' $4,0000 +------------------+ ÉÎÔÒÏ.ÄÁÔ ' ! ÂÁÓ LOGO CHARS ! ' $4,07Ä0 +..................+ ' ! ÂÁÓ LOGO COLORS ! ' $4,0ÆÁ0 +..................+ ' ! 32 X ÒÇ ÐÁÌÅÔÔÅ ! ' $4,1000 +..................+ ' ! ÔÉÔÌÅ COLORS ! ' $4,270à +..................+ ' ! ÐÅÔÓÃÉÉ FRAMES ! ' $4,54Æà +------------------+ GOSUB INIT¯MUSIC GOSUB STORE¯DEFAULT¯COLOURS RETURN.STORE¯DEFAULT¯COLOURS'--------------------- FOR K = 0 TO 31 DEFAULT¯RED(K)=PEEK($D100+K) DEFAULT¯GREEN(K)=PEEK($D200+K) DEFAULT¯BLUE(K)=PEEK($D300+K) NEXT K RETURN.STORE¯CURR¯COLOURS'------------------ FOR K = 0 TO 31 CURR¯RED(K)=PEEK($D100+K) CURR¯GREEN(K)=PEEK($D200+K) CURR¯BLUE(K)=PEEK($D300+K) NEXT K RETURN.FADE¯COLOURS¯TO¯WHITE'--------------------- 'ÉÎÐÕÔ: FADEVAL=0 TO 16 TEMPVAL = FADEVAL / 16 FOR K = 0 TO 31 POKE $D100+K, DEFAULT¯RED(K) + (15 - DEFAULT¯RED(K)) * TEMPVAL POKE $D200+K, DEFAULT¯GREEN(K) + (15 - DEFAULT¯GREEN(K)) * TEMPVAL POKE $D300+K, DEFAULT¯BLUE(K) + (15 - DEFAULT¯BLUE(K)) * TEMPVAL NEXT K RETURN.FADE¯COLOURS¯TO¯DEFAULTS'------------------------ 'ÉÎÐÕÔ: FADEVAL=0 TO 16 TEMPVAL = FADEVAL / 16 FOR K = 0 TO 31 POKE $D100+K, CURR¯RED(K) + (DEFAULT¯RED(K)-CURR¯RED(K)) * TEMPVAL POKE $D200+K, CURR¯GREEN(K) + (DEFAULT¯GREEN(K)-CURR¯GREEN(K)) * TEMPVAL POKE $D300+K, CURR¯BLUE(K) + (DEFAULT¯BLUE(K)-CURR¯BLUE(K)) * TEMPVAL NEXT K RETURN.FADE¯COLOURS¯TO¯BLACK'--------------------- TEMPVAL = (16-FADEVAL) / 16 FOR K = 0 TO 31 POKE $D100+K, CURR¯RED(K) * TEMPVAL POKE $D200+K, CURR¯GREEN(K) * TEMPVAL POKE $D300+K, CURR¯BLUE(K) * TEMPVAL NEXT K RETURN'==========.INIT¯MUSIC'========== PLAY BAR¯INDEX=0 MAP¯BAR¯TO¯CHUNK(0)=0 MAP¯BAR¯TO¯CHUNK(1)=1 MAP¯BAR¯TO¯CHUNK(2)=1 MAP¯BAR¯TO¯CHUNK(3)=2 MAP¯BAR¯TO¯CHUNK(4)=3 FILTER 1,100,1 FILTER 2,100,1 ENVELOPE 2,3,3,3,10,0 ENVELOPE 4,9,4,9,8 ENVELOPE 7,0,9,9,0,2,1100 ENVELOPE 8,0,12,3,5,2,1100 ENVELOPE 9,0,10,3,5,2,1100 ' *** VOICE1 - GUITAR1 *** ' ------------------------ V1$(0)="T2O6M2 QDIR QC.R QDIR QC.R QDIR QC.R QDIR QC.R" V1$(1)="T2O6M2 QDIR QC.R QDIR QC.R P9A IR QAIR P0IDP9O5A O5IAO6DA Q.G IDO5A IBO6DG Q.A IGD O5BO6EG Q.A IGE O5IBO6DG Q.A IGD O5BO6EGQA IG#FE " V1$(2)="T2O6M2 QDIR QC.R QDIR QC.R IDDFQ.DIFD O5Q.#AHO6CIR O5#AQ#AO6HCIR IDDFHDIR DDFQ.DIFD O5Q.#AHO6CIR O5#AQ#AO6HCIR O5Q.A O6HE IR V1$(3)="T2O6M2 IGG#GHGIR O5Q.G O6HD IR AA#AHA IR A O6D #F QE I#F QD Q.#F.EDO6.G.#FE O5G I#A O6 QE O5I#A O6QE QDIR QC.R QDIR QC.R V1$(3)=V1$(3)+"O6Q.G.#FE O5G I#A O6QE O5I#A O6QE QDIR QC.R QDIR QC.R QDIR QC.R QDIR QC.R" ' *** VOICE2 - GUITAR2 *** ' ------------------------ V2$(0)="T2O5M4 QAIR Q#G.R QAIR Q#G.R QAIR Q#G.R QAIR Q#G.R" V2$(1)="T2O5M4 QAIR Q#G.R QAIR Q#G.R O5 Q.#C .D O6I#FD O5D#FAO6Q.D IO5A#F EGBO6Q.E O5IBG EAO6#CQ.E I#CO5A EGBO6Q.E O5IBG EAO6#CQE ID#CD" V2$(2)="T2O5M4 QAIR Q#G.R QAIR Q#G.R IAAO6CO5Q.AIGA Q.FHG IR IFQF HG IR IAAO6CO5HA IR AAO6CO5Q.AIGA Q.FHG IRFQF HG IR Q.E .A O6E " V2$(3)="T2O5M4 IGG#G HG IR Q.D HG IR DDGHD IR DDAQGIAQD Q.A.G#F .#A .A G O5QEIGQ#AIG#AO6C QAIR Q#G.R QAIR Q#G.R Q.#A .A G O5QEIGQ#AIG#AO6C" V2$(3)=V2$(3)+"QAIR Q#G.R QAIR Q#G.R QAIR Q#G.R QAIR Q#G.R" ' *** VOICE3 - BASS *** ' --------------------- V3$(0)="X1T7O2M1 ID QR P1 ICD QR ICD SF#F QD IR O1AO2CO1A O2ID QR P1 ICD QR ICD SF#F QD IR O1AO2CO1A" V3$(1)="X1T7O2M1 ID QR P1 ICD QR ICD SF#F QD QR IR O1A T8 O2Q.#CQD IDE#F Q.#F O1A IA O2Q#C O1Q.E E IEBG Q.A A IA O2QC Q.E E IE O1 QB Q.A A O2IE QA" V3$(2)="X1T7O2M1 ID QR P1 ICD QR ICD SF#F QD IR O1AO2CO1A" V3$(2)=V3$(2)+"T9O2IDDDDDDDD O1#A#A#A#A#A#A#A#A #A#A#A#A#A#A#A#A O2DDFQDIDDDDDDDDDDD O1#A#A#A#A#A#A#A#A #A#A#A T8O2QCICCC O1Q.AAIAAA" V3$(3)="O2Q.DDIDDD O1Q.GGI#AA#A Q.#A#AI#AQ#A Q.AAIAQA O2Q.DDIO1GO2QD Q.EEIEQE O1Q.AAIAQA T7O2 ID QR P1 ICD QR ICD SF#F QD IR O1AO2CO1A" V3$(3)=V3$(3)+"O2Q.EEIEQE O1Q.AAIAQA T7O2 ID QR P1 ICD QR ICD SF#F QD IR O1AO2CO1A T7O2 ID QR P1 ICD QR ICD SF#F QD IR O1AO2CO1A" ' *** VOICE4 - MELODY *** ' ----------------------- V4$(0)="" V4$(1)="T4O5P0 QR M2ID M4QD P5 M1O4#G H.A IAQA O5Q.E H#F IR #F#FA QG IG#F W M5 .G P9M2O4IA O5I.B.A SG#F AGABAB QG O4IAB O5H#F SG#F Q.E.D" V4$(2)="O5T4P7WDHRQ.RICP5O5IDDFQ.GIFDQ.FSEDHCIFFAQGIFDSCP2H.DP5I.RICDDFQ.GIFD Q.F SED HC IFFAQGIFD IGP1H.A P7IRA" V4$(3)="T4 IO6DD#DQDICO5#AH.#AQ.R IAA#AQAIAGP1WAP7IR" V4$(3)=V4$(3)+"HRI#FGAQ.GI#FG#FHERIR DHDRR IR#FGAQ.GI#FG#FHERIR DHD" RETURN'---------.POLL¯PLAY'--------- IF RPLAY(1) THEN RETURN MUSIC¯CHUNK¯INDEX=MAP¯BAR¯TO¯CHUNK(BAR¯INDEX) PLAY V1$(MUSIC¯CHUNK¯INDEX),V3$(MUSIC¯CHUNK¯INDEX),V4$(MUSIC¯CHUNK¯INDEX) SLEEP .05 PLAY ,,,V2$(MUSIC¯CHUNK¯INDEX),V3$(MUSIC¯CHUNK¯INDEX),V4$(MUSIC¯CHUNK¯INDEX) BAR¯INDEX=BAR¯INDEX+1 IF BAR¯INDEX=5 THEN BAR¯INDEX=1 RETURN