home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
520.lha
/
TurboMCP
/
turboMCP.asm
< prev
next >
Wrap
Assembly Source File
|
1991-06-09
|
54KB
|
1,505 lines
****************************************************************************
* Programme : turboMCP.asm *
* Usage : turboMCP *
* Version : V0.009
* Date : 09.-11.09.1990 and 08.12.1990 - 02.04.1991 *
* Author : Jörg Sixt *
* Purpose : TRON-implementation ; file under "games" *
* Language : A68K V2.41, Blink (all PD! Isn't it wonderful?) *
* NOTE : This listing isn't meant to be an example of good *
* programming. Shortness und speed of the code could only *
* be reached at the cost of clarity. Sorry! *
****************************************************************************
SECTION MAIN,CODE
* ntsc/pal
WIDTH: EQU 320
HGTNTSC: EQU 200
HGTPAL: EQU 256
JMPMAX: EQU 4 ; max. pixels that can be jumped
DELMAX: EQU 10 ; max. speed (25/50 secs betw.)
* exec
EXECBASE: EQU $4
ALLOCMEM: EQU -$C6
FREEMEM: EQU -$D2
OPENLIBRARY: EQU -$228
CLOSELIBRARY: EQU -$19E
WAITPORT: EQU -$180
GETMSG: EQU -$174
REPLYMSG: EQU -$17A
* dos
OPEN: EQU -$1E
CLOSE: EQU -$24
DELAY: EQU -$C6
MODE_OLD: EQU 1005
* graphics
CLEAREOL: EQU -$2A
CLEARSCREEN: EQU -$30
TEXT: EQU -$3C
SETSOFTSTYLE: EQU -$5A
DRAWELLIPSE: EQU -$B4
LOADRGB4: EQU -$C0
MOVE: EQU -$F0
DRAW: EQU -$F6
SETRGB4: EQU -$120
RECTFILL: EQU -$132
READPIXEL: EQU -$13E
WRITEPIXEL: EQU -$144
SETAPEN: EQU -$156
SETBPEN: EQU -$15C
SETDRMD: EQU -$162
CBUMP: EQU -$16E
CMOVE: EQU -$174
CWAIT: EQU -$17A
VBEAMPOS: EQU -$180
SCROLLRASTER: EQU -$18C
FREEVPORTCOPLISTS: EQU -$21C
SCROLLVPORT: EQU -$24C
UCOPPERLISTINIT: EQU -$252
* intuition
CLOSESCREEN: EQU -$42
DISPLAYBEEP: EQU -$60
DRAWIMAGE: EQU -$72
OPENSCREEN: EQU -$C6
RETHINKDISPLAY: EQU -$186
* key codes
DEL: EQU $73
HELP: EQU $41
ENTER: EQU $79
CTRL: EQU $39
ESC: EQU $75
N8: EQU $83
N2: EQU $C3
N6: EQU $A1
N4: EQU $A5
UP: EQU $67
DOWN: EQU $65
RIGHT: EQU $63
LEFT: EQU $61
E: EQU $DB
X: EQU $9B
D: EQU $BB
S: EQU $BD
SPACE: EQU $7F
* register
CIA_KEY: EQU $BFEC01
CIA_JFIRE: EQU $BFE001
CIA_JOY1D: EQU $DFF00A
CIA_JOY2D: EQU $DFF00C
* OPENLIB LibName,LibBase,Errorlabel
OPENLIB: MACRO
lea \1,a1
moveq #0,d0
jsr OPENLIBRARY(a6)
move.l d0,\2
beq \3
ENDM
* CLOSELIB LibBase
CLOSELIB: MACRO
move.l \1,a1
jsr CLOSELIBRARY(a6)
ENDM
* DELSEC 1/50 secs
DELSEC: MACRO
move.l Dosbase,a6
move.l \1,d1
jsr DELAY(a6)
ENDM
* ------------------------------------------------------------------
* -- Open Libraries --
* ------------------------------------------------------------------
move.l sp,SPbackup ; proper WB/CLI-start
move.l EXECBASE,a6
move.l $114(a6),a1 ; Execbase->thisTask = my task
tst.l $AC(a1) ; started from CLI ?
bne FromCLI
lea $5C(a1),a2 ; ptr to MsgPort
move.l a2,a0
jsr WAITPORT(a6) ; wait and...
move.l a2,a0
jsr GETMSG(a6) ; ...got the message
move.l d0,WBmsg ; let's save the ptr
FromCLI: OPENLIB Dosname,Dosbase,ClosePrg
OPENLIB Gfxname,Gfxbase,CloseDos
OPENLIB Intname,Intbase,CloseInt ; a couple of libs
move.l Dosbase,a6
move.l #Rawname,d1
move.l #MODE_OLD,d2
jsr OPEN(a6) ; where all the chars will go to
move.l d0,Rawhandle
beq CloseLibs
* ------------------------------------------------------------------
* -- The Menu Screen --
* ------------------------------------------------------------------
MainMenu: bsr OpenScreen
* --------------- Gadget Boxes ------------------
move.l Gfxbase,a6
move.l #47,d7
lea GBoxXYTab,a5 ; all the coordinates
GBLoop: move.l Rastport,a1
move.w (a5)+,d0
jsr SETAPEN(a6)
move.l Rastport,a1
move.w (a5)+,d0
move.w (a5)+,d1
move.w (a5)+,d2
move.w (a5)+,d3
jsr RECTFILL(a6)
dbf d7,GBLoop
* ---------------- Gadget Titles ----------------
lea GadTxtTab,a3
move.l #0,d4
move.l #3,d7
TLoop1: move.b #3,d0 ; titles for first row
sub.b d7,d0
move.b d0,Gadnr
move.b (a3)+,d4 ; get real colour
move.l #0,d0
move.l #19,d2
move.l #9,d3
bsr GTxt
sub.w #11,a3 ; need the same text=same ptr
move.w d4,d0 ; for shadow
move.l #18,d2
move.l #8,d3
bsr GTxt
dbf d7,TLoop1
move.l #8,d3 ; row 2-4
move.l #8,d7
TLoop2: move.b #12,d0
sub.b d7,d0
move.b d0,Gadnr
move.l #13,d0
bsr GTxt
dbf d7,TLoop2
move.l Rastport,a1
move.l #2,d0
move.l d0,d1
jsr SETSOFTSTYLE(a6) ; bold
move.l #35,d2 ; row 5
move.l #2,d7
TLoop3: move.b #15,d0
sub.b d7,d0
move.b d0,Gadnr
move.l #12,d0
bsr GTxt
dbf d7,TLoop3
* ------------------- Put Cursor --------------
move.l Intbase,a6
move.l Rastport,a0
lea ArrowIStr,a1
move.l #6,d0
move.l #69,d1
jsr DRAWIMAGE(a6)
* ------------ Put Prefs to Screen ------------
move.w #12,d7
PLoop: move.b d7,Gadnr
bsr PutVal2Scr
dbf d7,PLoop
* ------------ Write 'SCROLL' Text --------------
lea ScrollTxt,a5
move.b #0,Gadnr
TxtLoop: move.l Gfxbase,a6
move.l Rastport,a1 ; SetSoftStyle(BOLD)
move.l #2,d0
move.l d0,d1
jsr SETSOFTSTYLE(a6)
move.l Rastport,a1 ; SetAPen(1)
move.l #1,d0
jsr SETAPEN(a6)
move.l Rastport,a1 ; Move (80,95)
move.w #80,d0
move.w #95,d1
jsr MOVE(a6)
move.l Rastport,a1 ; Clear text line
jsr CLEAREOL(a6)
move.l Rastport,a1 ; Text(a5=Textptr,60)
move.l a5,a0
move.w #60,d0
jsr TEXT(a6)
add.l #60,a5 ; increase ptr to text
move.l #30,d7 ; 30x Waitloop
tst.b (a5) ; end of text?
bne WaitLoop ; no -> continue now
lea ScrollTxt,a5 ; yes-> go on with the beginning
* --------------- Boring, Boring,... -----------
WaitLoop: DELSEC #6 ; ATTENTION multitasking freaks !!
bsr Ask ; Don't look at this routine!
cmp.b #1,d0 ; (They gonna kill me..ughs..!)
bgt Action ; You want to move the Cursor ?
dbra d7,WaitLoop
bra TxtLoop ; next piece of message
* ---------- Newton: Action and Reaction -------
Action: tst.b d3 ; Fire ?
beq MoveCursor ; no -> MoveCursor
move.l #0,d0 ; yes -> you want to change the
move.b Gadnr,d0 ; prefs
lea PrefsTab,a0
cmp.b #3,d0 ; all "on/off"-Gadgets are
bgt 1$ ; handled with this
bchg.b d0,(a0)
bra 4$
1$ cmp.b #8,d0
bgt 2$
sub.b #4,d0
bchg.b d0,1(a0)
bra 4$
2$ cmp.b #12,d0 ; Here are the "Value-Gaddies"
bgt 5$ ; e.g. speed, boxes, etc.
lea LimitTab,a1 ; (Is "value" the right word ?
sub.b #7,d0 ; How can a dictonairy be so cruel?)
add.w d0,a0
sub.b #2,d0
lsl.b #1,d0
add.w d0,a1
move.b (a0),d0
add.b #1,d0
cmp.b (a1),d0 ; too big ?
ble 3$
move.b 1(a1),d0 ; begin at 0 respect. 1
3$ move.b d0,(a0)
4$ bsr PutVal2Scr
bra WaitLoop
5$ cmp.b #14,d0 ; last Row
bne 7$
lea Bonus,a0 ; CLEAR
move.l #20,d0
6$ move.b #0,(a0)+
dbf d0,6$
bra WaitLoop
7$: jsr CloseScr ; CloseScreen and...
cmp.b #14,Gadnr
blt Game ; ...play
bgt CloseRaw ; ...or quit (never tested)
MoveCursor: move.b d2,-(sp)
move.b d1,-(sp)
move.l Gfxbase,a6 ; SetAPen for a successful Rectfill
move.l Rastport,a1 ; to clear Cursor
move.b Gadnr,d1
move.l #10,d0
cmp.b #3,d1
ble 1$
move.l #7,d0
cmp.b #12,d1
ble 1$
move.l #4,d0
1$ jsr SETAPEN(a6)
bsr GetXY ; RectFill clears old cursor
move.w d0,d2
add.w #16,d2
move.w d1,d3
add.w #11,d3
move.l Rastport,a1
jsr RECTFILL(a6)
move.l #0,d0 ; Calculate new Gadnr
move.l #0,d1
move.b Gadnr,d0
lsl.b #2,d0 ; d0=(Gadnr)*4+
move.b (sp)+,d1
beq 2$
bpl Draw
add.b #1,d0
bra Draw
2$ add #2,d0
move.b (sp)+,d1
bpl Draw
add.b #1,d0
Draw: lea GadDirTab,a0
add.l d0,a0
move.b (a0),Gadnr ; Gadnr=(a0+d0)
bsr GetXY ; Fetch new X/Y
move.l Intbase,a6 ; DrawImage(Gadnr,Arrow)
move.l Rastport,a0
lea ArrowIStr,a1
jsr DRAWIMAGE(a6)
bra WaitLoop
*------------------------------------------------
*-- local sub-routines --
*------------------------------------------------
* ----------- Prefs-Werte -> Screen -----------
PutVal2Scr: bsr GetXY ; Gadnr -> (X/Y)
move.l Intbase,a6 ; And now we bring all the prefs
move.l Rastport,a0 ; to the screen
lea PrefsTab,a1 ; (don't ask me how this works,
move.l #0,d2 ; Thank God THAT it works)
move.b Gadnr,d2
cmp.b #3,d2 ; 0 - 3
bgt 1$
add.w #110,d0
btst.b d2,(a1)
bra 2$
1$ add.w #165,d0
cmp.b #8,d2 ; 4 - 8
bgt 5$
sub.b #4,d2
btst.b d2,1(a1)
2$ beq 3$
lea LEDonIStr,a1
bra 4$
3$ lea LEDoffIStr,a1
4$ jsr DRAWIMAGE(a6)
rts
5$ move.w d0,-(sp) ; 9 - 12 (save x-&y-offset)
move.w d1,-(sp)
lea BackgrIStr,a1
jsr DRAWIMAGE(a6) ; DrawImage(Backgr. for number-display)
move.l Gfxbase,a6
move.l Rastport,a1
move.w (sp)+,d1
add.w #8,d1
move.w (sp)+,d0
jsr MOVE(a6) ; Move(d0,d1)
move.l Rastport,a1
move.l #13,d0
jsr SETAPEN(a6) ; SetAPen(13)
move.l Rastport,a1
move.l #0,d0
jsr SETSOFTSTYLE(a6)
move.l #0,d0 ; get the decimal string
lea PrefsTab,a1
move.b -7(a1,d2.l),d0
lea DecTxt,a0
bsr ToDec
sub.w #2,a0
move.l Rastport,a1
move.l #2,d0
jsr TEXT(a6) ; Text(decstring,2)
rts
* ----------- Write Text on Gadgets -----------
; a3=Txtptr d3=delta-y d2=delta-x d0=colour
GTxt: move.l Rastport,a1
jsr SETAPEN(a6)
move.l Rastport,a1
bsr GetXY
add.w d2,d0
add.w d3,d1
jsr MOVE(a6)
move.l Rastport,a1
move.l #11,d0
move.l a3,a0
jsr TEXT(a6)
add.w #11,a3
rts
* ----------- Gadnr -> Cursor-(x/y) ------------
GetXY: move.l #0,d0
move.b Gadnr,d0
add.b d0,d0 ; (Gadnr)*2 +
lea GadXYTab,a0 ; GadXYTab
add.l d0,a0 ; =a0
move.b (a0),d0
add.w d0,d0 ; width = d0 = (a0)*2
move.w #0,d1
move.b 1(a0),d1 ; height = d0 = 1(a0)
rts
* ------------------------------------------------------------------
* -- The real Game --
* ------------------------------------------------------------------
Game: bsr OpenScreen
lea Score,a0
bsr Sort ; Sort the scores
move.l #0,d0 ; set round no.
move.b Round,d0
lea DecTxt,a0
bsr ToDec
move.b #32,-4(a0)
lea ScoreScr,a1
move.l -4(a0),90(a1)
move.l Gfxbase,a6
lea ScoreScr,a5
move.l #6,d7
1$: move.l Rastport,a1 ; The 3D-frames consits of
move.w (a5)+,d0 ; rectangles whose coordinates
jsr SETAPEN(a6) ; can be found under "ScoreScr:"
move.l Rastport,a1
move.w (a5)+,d0
move.w (a5)+,d1
move.w (a5)+,d2
move.w (a5)+,d3
jsr RECTFILL(a6)
dbf d7,1$
move.l #3,d7
2$: move.l Rastport,a1 ; some text
move.w (a5)+,d0
jsr SETAPEN(a6)
move.l Rastport,a1
move.w (a5)+,d0
move.w (a5)+,d1
jsr MOVE(a6)
move.l Rastport,a1
move.w (a5)+,d0
move.l a5,a0
add.w d0,a5
jsr TEXT(a6)
dbf d7,2$
lea SortNr,a2
lea GadTxtTab,a3 ; this loop writes the scores
move.l #88,d3
move.l #0,d2
move.l #3,d7
3$: move.w (a2)+,d2
move.l #0,d0
move.b d2,d0
add.b d2,d0
add.b d2,d0
add.b d0,d0
lea 0(a3,d0.w),a5
move.l Rastport,a1
move.b (a5)+,d0
jsr SETAPEN(a6) ; Set the accurate colour
move.l Rastport,a1
move.l #96,d0
add.l #9,d3
move.l d3,d1
jsr MOVE(a6) ; Everythging must be in rank & file
lea PlayerTxt,a4
move.b #'0'+4,(a4) ; the player's no. -> PlayerTxt
sub.b d7,(a4)
add.w #4,a4
move.l #10,d1
4$: move.b (a5)+,(a4)+ ; player's name=device -> PlayerTxt
dbf d1,4$
lea 13(a4),a0
lea Bonus,a5
move.l #0,d0
move.w 0(a5,d2.w),d0
bsr ToDec ; Bonus -> PlayerTxt
lea 23(a4),a0
lea Score,a5
move.l #0,d0
move.w 0(a5,d2.w),d0
bsr ToDec ; Score -> PlayerTxt
lsr.w #1,d2
lea 34(a4),a0
lea Victory,a5
move.l #0,d0
move.b 0(a5,d2.w),d0
bsr ToDec ; Victories -> PlayerTxt
move.l Rastport,a1
lea PlayerTxt,a0
move.l #54,d0
jsr TEXT(a6) ; Write PlayerTxt
dbf d7,3$
move.b PrefsTab,SavPMask ; initialize SavPMask
SWaitLoop: DELSEC #6 ; Wait
bsr Ask ; (I know this is bad style,
tst.b d3 ; but have YOU ever tried to
bne BuildScr ; programme devices?)
cmp.b #ESC,CIA_KEY
bne SWaitLoop
jsr CloseScr
bra MainMenu
BuildScr: jsr CloseScr ; Close prevous Screen
lea GameScrStr,a0 ; and open the game screen
lea PrefsTab,a5
move.w #0,12(a0)
move.w #WIDTH,4(a0) ; WIDTH
btst.b #3,1(a5) ; Hires ?
beq 1$
lsl.w 4(a0)
bset.b #7,12(a0) ; = bset.w #15,12(a0) = Viewmodes
1$: move.w #HGTNTSC,6(a0) ; HEIGHT
btst.b #1,1(a5) ; PAL/NTSC ?
beq 2$
move.w #HGTPAL,6(a0)
2$: btst.b #4,1(a5) ; Interlace ?
beq 3$
lsl.w 6(a0)
bset.b #2,13(a0) ; = bset.w #02,12(a0) = Viewmodes
3$: jsr OPENSCREEN(a6)
move.l d0,Screen
beq Game
add.l #44,d0
move.l d0,Viewport
add.l #40,d0
move.l d0,Rastport
move.l Gfxbase,a6
move.l Rastport,a1
jsr CLEARSCREEN(a6)
move.l Viewport,a0
lea GameColTab,a1
move.l #8,d0
jsr LOADRGB4(a6)
move.l Rastport,a1
move.w #5,d0
jsr SETAPEN(a6)
lea GameScrStr,a4
move.w 4(a4),d5
move.w 6(a4),d6 ; How many stars?
move.w d5,d7
mulu.w d6,d7
lsr.l #8,d7
lsr.l #6,d7
move.l #0,d0
move.b 4(a5),d0
mulu.w d0,d7
beq Boxes
StarsLoop: move.l Rastport,a1 ; draw them
move.w d6,d0
bsr Rnd
move.w d0,d1
move.w d5,d0
bsr Rnd
jsr WRITEPIXEL(a6)
dbf d7,StarsLoop
Boxes: move.l Intbase,a6
sub.w #8,d5
sub.w #8,d6
move.l #0,d7 ; How many boxes?
move.b 3(a5),d7
beq SavPod
BoxLoop: move.l Rastport,a0 ; draw them
lea BoxIStr,a1
move.w d6,d0
bsr Rnd
and.b #%11111000,d0 ; this prevents the boxes
move.w d0,d1 ; from overlaying
move.w d5,d0
bsr Rnd
and.b #%11111000,d0
jsr DRAWIMAGE(a6)
dbf d7,BoxLoop
SavPod: move.l #0,d7
move.b 5(a5),d7 ; Draw the Savety Pods
beq CyclSect
PodLoop: move.l Rastport,a0
lea PodIStr,a1
move.w d6,d0
bsr Rnd
and.b #%11111000,d0
move.w d0,d1
move.w d5,d0
bsr Rnd
and.b #%11111000,d0
jsr DRAWIMAGE(a6)
dbf d7,PodLoop
CyclSect: add.w #7,d5 ; every cycle gets some blank
add.w #7,d6 ; space around his starting
move.l Gfxbase,a6 ; point.
move.l Rastport,a1
move.l #0,d0
jsr SETAPEN(a6)
lea CyclSecTab,a4
move.w d5,d0
sub.w #8,d0
move.w d0,4(a4)
move.w d0,20(a4)
sub.w #24,d0
move.w d0,(a4)
move.w d0,16(a4)
move.w d6,d0
sub.w #8,d0
move.w d0,6(a4)
move.w d0,14(a4)
sub.w #24,d0
move.w d0,2(a4)
move.w d0,10(a4)
move.l #3,d7
1$: move.l Rastport,a1
move.w (a4)+,d0
move.w (a4)+,d1
move.w (a4)+,d2
move.w (a4)+,d3
btst.b d7,(a5)
beq 2$
jsr RECTFILL(a6)
2$: dbf d7,1$
add.w #1,d5
add.w #1,d6
PlayLoop: lea XY,a0 ; init. x,y,vx,vy of cycles
lea XYInit,a1
move.w d5,d0
sub.w #16,d0
move.w d0,(a1)
move.w d0,16(a1)
move.w d6,d0
sub.w #16,d0
move.w d0,2(a1)
move.w d0,10(a1)
move.l #7,d7
1$: move.l (a1)+,(a0)+
dbf d7,1$
DELSEC #50 ; Countdown
move.l Intbase,a6
sub.l a0,a0
jsr DISPLAYBEEP(a6)
lea Bonus,a3 ; delete Bonus (=points/round)
clr.l (a3)
clr.l 4(a3)
clr.b cAnz
move.b (a5),PlayerMask ; who's playing?
move.w #255*8+1,Points
GLoop1: sub.w #1,Points
bpl 1$
move.w #255*8,Points
1$: move.w #3,d7
move.l Gfxbase,a6
lea XY,a2
GLoop2: btst.b d7,PlayerMask ; Does No. d7 play ?
beq 1$
bsr Ask
btst.b d7,d0 ; input from no. d7
beq 2$
move.w d1,d0
add.w d2,d0
beq 204$ ; d1=d2=0? -> Firecheck
move.w d1,d0
add.w 4(a2),d0 ; this prevents the cycles from
beq 202$ ; having a "backwards crash"
move.w d1,4(a2)
202$: move.w d2,d0
add.w 6(a2),d0
beq 204$
move.w d2,6(a2)
204$: tst.b d3 ; Fire
beq 2$
move.l #JMPMAX,d0
bsr Rnd
add.w #1,d0
move.w d0,d3 ;d0=d3=random number
muls.w 4(a2),d3
add.w d3,(a2) ; X = X + dX*Rnd(JMPMAX)
muls.w 6(a2),d0
add.w d0,2(a2) ; Y = Y + dY*Rnd(JMPMAX)
2$: move.w 4(a2),d1
add.w d1,(a2)
move.w 6(a2),d2
add.w d2,2(a2)
cmp.w #0,(a2) ; cycle touches border ?
bge 13$ ; no -> next border check
btst.b #0,1(a5) ; yes -> crash ?
beq 11$ ; yes -> go to crash routine
add.w d5,(a2) ; no -> other side
13$: cmp.w #0,2(a2)
bge 14$
btst.b #0,1(a5)
beq 11$
add.w d6,2(a2)
14$: cmp.w (a2),d5
bgt 15$
btst.b #0,1(a5)
beq 11$
sub.w d5,(a2)
15$: cmp.w 2(a2),d6
bgt 16$
btst.b #0,1(a5)
beq 11$
sub.w d6,2(a2)
16$: move.l Rastport,a1
move.w d7,d0
add.w #1,d0
jsr SETAPEN(a6) ; SetAPen(d7+1)
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
jsr READPIXEL(a6) ; ReadPixel((a2),2(a2))
cmp.l #7,d0 ; Savety Pod-colour?
beq 10$
tst.l d0
bne 11$ ; colour <>0 -> Crash
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
jsr WRITEPIXEL(a6) ; write trace
1$: add.w #8,a2
dbf d7,GLoop2
cmp.b #ESC,CIA_KEY ; ESC ?
bne 5$
jsr CloseScr ; -> back to SCORE-Screen
bra Game
5$: cmp.b #CTRL,CIA_KEY ; CTRL ?
bne 6$ ; -> CLEARSCREEN
move.l Rastport,a1
move.l #0,d0
move.l #0,d1
jsr MOVE(a6)
move.l Rastport,a1
jsr CLEARSCREEN(a6)
6$: cmp.b #HELP,CIA_KEY ; HELP ?
bne 7$
bsr Wait ; -> Wait
7$: move.l #DELMAX,d1 ; speed means delay
sub.b 2(a5),d1
DELSEC d1
bra GLoop1
10$: btst.b d7,SavPMask ; Savety Pod
beq 11$
bclr.b d7,SavPMask
move.l d7,-(sp)
move.w d6,d7
sub.w #1,d7
103$: move.l Gfxbase,a6 ; animation
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
jsr MOVE(a6)
move.l Rastport,a1
move.w d5,d0
sub.w #1,d0
move.w d6,d1
sub.w #1,d1
sub.w d7,d1
jsr DRAW(a6)
dbf d7,103$
move.w d5,d7
sub.w #1,d7
102$: move.l Gfxbase,a6
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
jsr MOVE(a6)
move.l Rastport,a1
move.w d7,d0
move.w d6,d1
sub.w #1,d1
jsr DRAW(a6)
dbf d7,102$
move.w d6,d7
sub.w #1,d7
101$: move.l Gfxbase,a6
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
jsr MOVE(a6)
move.l Rastport,a1
clr.w d0
move.w d7,d1
jsr DRAW(a6)
dbf d7,101$
move.w d5,d7
sub.w #1,d7
104$: move.l Gfxbase,a6
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
jsr MOVE(a6)
move.l Rastport,a1
move.w d5,d0
sub.w #1,d0
sub.w d7,d0
clr.w d1
jsr DRAW(a6)
dbf d7,104$
move.l Gfxbase,a6 ; Write "Player x hit the s.pod"
move.l (sp)+,d7
move.l Rastport,a1
move.l #1,d0
add.w d7,d0
jsr SETBPEN(a6)
move.l Rastport,a1
move.l #3,d0
add.w d7,d0
jsr SETAPEN(a6)
move.l Rastport,a1
move.w d5,d0
lsr.w #1,d0
sub.w #29*8/2,d0
move.w d6,d1
lsr.w #1,d1
jsr MOVE(a6)
move.l Rastport,a1
lea SavPodTxt,a0
add.b d7,7(a0)
move.l #29,d0
jsr TEXT(a6)
bsr Wait
bra BuildScr
11$: btst.b #2,1(a5) ; Crash
beq 115$ ; Explosion ?
move.l #14,d3
111$ move.l Gfxbase,a6
move.l Rastport,a1
move.w d3,d0
add.w #1,d0
jsr SETAPEN(a6)
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
move.l #15,d2
sub.w d3,d2
move.w d3,-(sp)
move.w d2,d3
jsr DRAWELLIPSE(a6) ; Draw explosion
move.w (sp)+,d3
DELSEC #5
dbf d3,111$
move.l Gfxbase,a6
lea XY,a4
move.l #3,d7 ; check all cycles
112$ btst.b d7,PlayerMask
beq 113$
move.l Rastport,a1
move.w (a4),d0
add.w 4(a4),d0
move.w 2(a4),d1
add.w 6(a4),d1
jsr READPIXEL(a6)
tst.l d0
beq 113$
bclr.b d7,PlayerMask
add.b #1,cAnz
bsr TraceFlicker
113$ add.w #8,a4
dbf d7,112$
move.l Rastport,a1
move.l #0,d0
jsr SETAPEN(a6)
move.l #15,d3 ; fire's over
114$ move.l Gfxbase,a6
move.l Rastport,a1
move.w (a2),d0
move.w 2(a2),d1
move.w d3,d2
move.w d3,-(sp)
jsr DRAWELLIPSE(a6)
move.w (sp)+,d3
DELSEC #5
dbf d3,114$
bra 116$
115$ bclr.b d7,PlayerMask ; no explosion
bsr TraceFlicker
add.b #1,cAnz
116$ lea Bonus,a4
lea 6(a4),a4
clr.b d0
move.l #3,d3
117$ btst.b d3,PlayerMask
beq 118$
add.b #1,d0
move.w Points,d1 ; add Points
add.w d1,(a4)
118$ sub.w #2,a4
dbf d3,117$
move.w #255*8,Points ; initialize Points
cmp.b #2,d0 ; 2 cycles left?
blt EndOfRound ; no! fewer -> End of this Round
bra GLoop1 ; >=2 -> continue race
EndOfRound: lea Victory,a0
lea Bonus,a1
lea Score,a2
clr.w d0
move.b cAnz,d0
move.l #3,d7
1$: move.l #0,d1 ; calculate Bonus, Scores
move.w (a1),d1 ; Victories
lsr.w #3,d1
divs.w d0,d1
move.w d1,(a1)+
add.w d1,(a2)+
btst.b d7,PlayerMask
beq 2$
add.b #1,0(a0,d7.w)
2$: dbf d7,1$
bsr Wait
jsr CloseScr
add.b #1,Round
bra Game
*------------------------------------------------
*-- local sub-routines --
*------------------------------------------------
* --------------- wait for input ----------------
Wait: DELSEC #6 ; a wait routine
bsr Ask
cmp.b #1,d3
bne Wait
rts
* --------------- let trace flicker -------------
TraceFlicker: move.l d3,-(sp) ; cycle a cycle's colour (a pun!)
move.l #10,d4 ; after crashing
1$: DELSEC #3
move.l Gfxbase,a6
move.l Viewport,a0
move.w d7,d0
add.w #1,d0
move.l #7,d1
move.w d1,d2
move.w d1,d3
jsr SETRGB4(a6)
DELSEC #3
move.l Gfxbase,a6
move.l Viewport,a0
lea GameColTab,a1
move.l #5,d0
jsr LOADRGB4(a6)
dbf d4,1$
move.l (sp)+,d3
rts
* ------------------ sort scores ----------------
* a0->ptr to scores
Sort: move.l #0,d1 ; sort scores
move.l #0,d2
1$: lea SortNr,a1
move.l #2,d4
move.l #0,d0
2$: move.w (a1),d1
move.w 0(a0,d1.w),d2
move.w 2(a1),d1
move.w 0(a0,d1.w),d3
cmp.w d2,d3
ble 3$
move.l #1,d0
move.w (a1),2(a1)
move.w d1,(a1)
3$: add.w #2,a1
dbf d4,2$
tst.b d0
bne 1$
rts
* ----- compute random number [0 to d0-1] ------
* d0->Range
Rnd: add.w $DFF006,d3 ; I worked on that for about
lea EXECBASE,a3 ; 2 weeks !!
add.w $11e(a3),d3
add.w d3,d3
eor.w #$1D872B41,d3
mulu.w d3,d0
clr.w d0
swap.w d0
bclr.l #15,d0
rts
* ------------------------------------------------------------------
* -- Quit Routines --
* ------------------------------------------------------------------
CloseRaw: move.l Dosbase,a6
move.l Rawhandle,d1
jsr CLOSE(a6)
CloseLibs: move.l EXECBASE,a6
CloseGfx: CLOSELIB Gfxbase
CloseInt: CLOSELIB Intbase
CloseDos: CLOSELIB Dosbase
ClosePrg:
move.l SPbackup,sp
move.l WBmsg,d1
beq Exit ; WBmsg=0 -> started from CLI
move.l d1,a1
jsr REPLYMSG(a6)
Exit: move.l #0,d0
rts
* ------------------------------------------------------------------
* -- global sub-routrine --
* ------------------------------------------------------------------
* ------------- d0 -> decimal string ----------
* a0=ptr to txt d0.l=number
ToDec: move.l #4,d1
lea DecTab,a1
DLoop: divu (a1)+,d0
add.b #'0',d0
move.b d0,(a0)+
clr.w d0
swap d0
dbf d1,DLoop
rts
* --------------- Check the Input ---------------
Ask: move.l #0,d0 ; nix=0 Joy1=1 Joy2=2 Keyb=4 Nump=8
move.l #0,d1 ; <- ->
move.l #0,d2 ; /\ \/
move.l #0,d3 ; Fire
move.b CIA_KEY,d4
cmp.b #D,d4
bne Kleft
move.b #1,d1
move.b #4,d0
rts
Kleft: cmp.b #S,d4
bne Kdown
move.l #-1,d1
move.l #4,d0
rts
Kdown: cmp.b #X,d4
bne Kup
move.l #1,d2
move.l #4,d0
rts
Kup: cmp.b #E,d4
bne Kfire
move.l #-1,d2
move.l #4,d0
rts
Kfire: cmp.b #SPACE,d4
bne Nright
move.l #1,d3
move.l #4,d0
rts
Nright: cmp.b #N6,d4
bne Nleft
move.l #1,d1
move.l #8,d0
rts
Nleft: cmp.b #N4,d4
bne Ndown
move.l #-1,d1
move.l #8,d0
rts
Ndown: cmp.b #N2,d4
bne Nup
move.l #1,d2
move.l #8,d0
rts
Nup: cmp.b #N8,d4
bne Nfire
move.l #-1,d2
move.l #8,d0
rts
Nfire: cmp.b #ENTER,d4
bne Joy2Dir
move.l #1,d3
move.l #8,d0
rts
Joy2Dir: move.w CIA_JOY2D,d4
btst.l #1,d4
beq J2left
move.l #1,d1
move.l #2,d0
rts
J2left: btst.l #9,d4
beq J2down
move.l #-1,d1
move.l #2,d0
rts
J2down: move.w d4,d2
lsr.w #1,d2
eor.w d4,d2
btst.l #0,d2
beq J2up
move.l #1,d2
move.l #2,d0
rts
J2up: btst.l #8,d2
beq Joy1Dir
move.l #-1,d2
move.l #2,d0
rts
Joy1Dir: move.w CIA_JOY1D,d4
move.l #0,d2
btst.l #1,d4
beq J1left
move.l #1,d1
move.l #1,d0
rts
J1left: btst.l #9,d4
beq J1down
move.l #-1,d1
move.l #1,d0
rts
J1down: move.w d4,d2
lsr.w #1,d2
eor.w d4,d2
btst.l #0,d2
beq J1up
move.l #1,d2
move.l #1,d0
rts
J1up: btst.l #8,d2
beq J2Fire
move.l #-1,d2
move.l #1,d0
rts
J2Fire: move.b CIA_JFIRE,d4
move.l #0,d2
btst.l #7,d4
bne J1Fire
move.l #1,d3
move.l #2,d0
rts
J1Fire: btst.l #6,d4
bne Nomove
move.l #1,d3
move.l #1,d0
Nomove: rts
* ----------------- Close Screen ---------------
* closes a screen / removes coperlist
CloseScr: move.l Gfxbase,a6
move.l Viewport,a0
jsr FREEVPORTCOPLISTS(a6)
move.l Intbase,a6
move.l Screen,a0
jsr CLOSESCREEN(a6)
rts
* ----------------- Open Screen ---------------
* opens 640x200x4-screen
OpenScreen: move.l Intbase,a6
lea MenScrStr,a0
jsr OPENSCREEN(a6)
move.l d0,Screen
beq CloseRaw
add.l #44,d0
move.l d0,Viewport
add.l #40,d0
move.l d0,Rastport
* Set Copper -----------------
move.l EXECBASE,a6
move.l #16,d0
move.l #$10003,d1
jsr ALLOCMEM(a6)
move.l d0,CopMem
beq PutPic
move.l Gfxbase,a6 ; set colours 0 and 2-15 via gfx...
move.l Viewport,a0
lea ColourTab,a1
move.l #16,d0
jsr LOADRGB4(a6)
move.l Rastport,a1 ; (ok, this command doesn't belong to
move.l #0,d0 ; the whole copper thing, but it
jsr SETDRMD(a6) ; saves a Gfxbase-move!)
move.l CopMem,a0 ; ...and no. 1 becomes a rainbow
move.l #401,d0
jsr UCOPPERLISTINIT(a6)
lea.l CopperTab,a4
move.l #199,d3 ; Zeilen = 200 -> d3
CopLoop: move.l CopMem,a1
move.w #199,d0
sub.w d3,d0
move.l #0,d1
jsr CWAIT(a6)
move.l CopMem,a1
jsr CBUMP(a6) ; CWait(CopMem,199-d3,0)
move.l CopMem,a1
move.l #$182,d0
move.w (a4)+,d1
jsr CMOVE(a6)
move.l CopMem,a1
jsr CBUMP(a6) ; CMove(CopMem,Color00,(CopperTab)+)
tst.w (a4) ; No Entry in ColCopTable?
bne Jump
lea CopperTab,a4 ; from the beginning
Jump: dbra d3,CopLoop
move.l CopMem,a1
move.l #10000,d0
move.l #255,d1
jsr CWAIT(a6)
move.l CopMem,a1
jsr CBUMP(a6) ; CEND
move.l Intbase,a6
move.l Viewport,a5
move.l CopMem,20(a5) ; ViewPort.UCopIns=CoppLstPtr
jsr RETHINKDISPLAY(a6)
* Put Title Picture -----------
PutPic: move.l Intbase,a6
move.l Rastport,a0
lea TitleIStr,a1
clr.w d0
clr.w d1
jsr DRAWIMAGE(a6)
rts
SECTION VARS,BSS
even
Dosbase: ds.l 1 ; all the lib-bases
Gfxbase: ds.l 1
Intbase: ds.l 1
Rawhandle: ds.l 1 ; the RAW:-ptr
Screen: ds.l 1 ; the screenptr
Rastport: ds.l 1
Viewport: ds.l 1
WBmsg: ds.l 1 ; ptr -> WBmsg
BlackTab: ds.w 16 ; everything's dark
CopMem: ds.l 1 ; ptr to Ucopperlist
SPbackup: ds.l 1
Gadnr: ds.b 1 ; Menu: activated gadgetnr.(0-15)
DecTxt: ds.b 5 ; Decimal string for ToDec-routine
Points: ds.w 1 ; needed to calculate bonus
XY: ds.w 4*4 ; Nr. 4 - 1: X,Y,dX,dY
Bonus: ds.w 4
Score: ds.w 4
Victory: ds.b 4
Round: ds.b 1
PlayerMask: ds.b 1 ; who's still in the race ?
SavPMask: ds.b 1 ; who's allowed to drive into the pod?
cAnz: ds.b 1 ; number of crashes
SECTION CONST,DATA
even
XYInit: dc.w $FF,$AA,0,-1,16,$AA,0,-1
dc.w $FF,16,0,1,16,16,0,1
SortNr: dc.w 0,2,4,6
Num: dc.b ' ',10
even
CyclSecTab: dc.w 8,8,32,32,8,8,32,32
dc.w 8,8,32,32,8,8,32,32
ScoreScr: dc.w 8,60,75,580,130
dc.w 9,62,76,578,129
dc.w 10,64,77,576,128
dc.w 8,66,78,574,127
dc.w 2,60,155,580,199
dc.w 3,62,156,578,198
dc.w 4,64,157,576,197
dc.w 1,96,85,56
dc.b "Résumé after 000 Rounds: Bonus Score Victories"
dc.w 7,104,170,54
dc.b "PRESS FIRE TO CONTINUE - ESC FOR MAINMENU !!!"
dc.w 6,160,179,40
dc.b "During the game press: <HELP> for pause"
dc.w 5,144,188,44
dc.b "<CTRL for cleanning the screen <ESC> to stop"
PlayerTxt: dc.b " . ( ) "
Rawname: dc.b "RAW:20/10/200/60/turboMCP",0
LimitTab: dc.b DELMAX,0,99,0,99,0,9,0
PrefsTab: dc.b %1110,%00001,DELMAX-2,0,0,0
even
DecTab: dc.w 10000,1000,100,10,1 ; powers of 10
GBoxXYTab: dc.w 8,0,62,144,62+24
dc.w 8,165,62,309,62+24
dc.w 8,330,62,474,62+24
dc.w 8,495,62,639,62+24
dc.w 9,2,63,142,63+22
dc.w 9,167,63,307,63+22
dc.w 9,332,63,472,63+22
dc.w 9,497,63,637,63+22
dc.w 10,4,64,140,64+20
dc.w 10,169,64,305,64+20
dc.w 10,334,64,470,64+20
dc.w 10,499,64,635,64+20
dc.w 5,0,97,199,97+24
dc.w 5,220,97,419,97+24
dc.w 5,440,97,639,97+24
dc.w 6,2,98,197,98+22
dc.w 6,222,98,417,98+22
dc.w 6,442,98,637,98+22
dc.w 7,4,99,195,99+20
dc.w 7,224,99,415,99+20
dc.w 7,444,99,635,99+20
dc.w 5,0,123,199,123+24
dc.w 5,220,123,419,123+24
dc.w 5,440,123,639,123+24
dc.w 6,2,124,197,124+22
dc.w 6,222,124,417,124+22
dc.w 6,442,124,637,124+22
dc.w 7,4,125,195,125+20
dc.w 7,224,125,415,125+20
dc.w 7,444,125,635,125+20
dc.w 5,0,149,199,149+24
dc.w 5,220,149,419,149+24
dc.w 5,440,149,639,149+24
dc.w 6,2,150,197,150+22
dc.w 6,222,150,417,150+22
dc.w 6,442,150,637,150+22
dc.w 7,4,151,195,151+20
dc.w 7,224,151,415,151+20
dc.w 7,444,151,635,151+20
dc.w 2,0,175,199,175+24
dc.w 2,220,175,419,175+24
dc.w 2,440,175,639,175+24
dc.w 3,2,176,197,176+22
dc.w 3,222,176,417,176+22
dc.w 3,442,176,637,176+22
dc.w 4,4,177,195,177+20
dc.w 4,224,177,415,177+20
dc.w 4,444,177,635,177+20
GadDirTab: dc.b 1,3,4,13 ;0 >,<,\/,/\
dc.b 2,0,5,14 ;1
dc.b 3,1,5,14 ;2
dc.b 0,2,6,15 ;3
dc.b 5,6,7,0 ;4
dc.b 6,4,8,1 ;5
dc.b 4,5,9,3 ;6
dc.b 8,9,10,4 ;7
dc.b 9,7,11,5 ;8
dc.b 7,8,12,6 ;9
dc.b 11,12,13,7 ;10
dc.b 12,10,14,8 ;11
dc.b 10,11,15,9 ;12
dc.b 14,15,0,10 ;13
dc.b 15,13,2,11 ;14
dc.b 13,14,3,12 ;15
GadXYTab: dc.b 3,69 ;0 x/2,y
dc.b 85,69 ;1 coordinates of the cursor
dc.b 168,69 ;2
dc.b 250,69 ;3
dc.b 3,104 ;4
dc.b 113,104 ;5
dc.b 223,104 ;6
dc.b 3,130 ;7
dc.b 113,130 ;8
dc.b 223,130 ;9
dc.b 3,156 ;10
dc.b 113,156 ;11
dc.b 223,156 ;12
dc.b 16,182 ;13
dc.b 126,182 ;14
dc.b 236,182 ;15
ColourTab: dc.w $000,$000,$060,$0A0,$0F0,$036,$05A,$07F
dc.w $666,$AAA,$FFF,$FB0,$F00,$FFF,$800,$352
GameColTab: dc.w $000,$F00,$07F,$0F0,$FB0,$E09,$39D,$FF9
CopperTab: dc.w $DF0,$BF0,$9F0,$7F0,$5F0
dc.w $3F0,$1F0
dc.w $0F2,$0F4,$0F6,$0F8,$0FA
dc.w $0FC,$0FE
dc.w $0DF,$0BF,$09F,$07F,$05F
dc.w $03F,$01F
dc.w $20F,$40F,$60F,$80F,$A0F
dc.w $C0F,$E0F
dc.w $F0D,$F0B,$F09,$F07,$F05
dc.w $F03,$F01
dc.w $F20,$F40,$F60,$F80,$FA0
dc.w $FC0,$FE0,0,0
Topaz8: dc.l Topaz8name
dc.w 8
dc.b 0,1
MenScrStr: dc.w 0,0,640,200,4
dc.b 0,0
dc.w $8000,$F
dc.l Topaz8,0,0,0
GameScrStr: dc.w 0,0,0,0,3
dc.b 0,0
dc.w 0,$F
dc.l Topaz8,0,0,0
Topaz8name: dc.b 'topaz.font',0
Dosname: dc.b 'dos.library',0
Gfxname: dc.b 'graphics.library',0
Intname: dc.b 'intuition.library',0
GadTxtTab: dc.b 12,'Joystick 1 '
dc.b 7,'Joystick 2 '
dc.b 4,'Keyboard '
dc.b 11,'Number Pad '
dc.b 'No Border '
dc.b 'PAL Screen '
dc.b 'Explosion '
dc.b 'HighRes '
dc.b 'Interlace '
dc.b 'Speed '
dc.b 'Boxes '
dc.b 'Stars '
dc.b 'Savety Pods'
dc.b 'P L A Y '
dc.b ' CLEAR '
dc.b 'Q U I T '
SavPodTxt: dc.b 'Player 0 hit the savety pod!!'
ScrollTxt: dc.b ' sick amiga software unfortunetly presents: '
dc.b ' a new implementation of TRON '
dc.b ' t u r b o M C P V13.47 '
dc.b ' written by Jörg Sixt in 100% assembly language '
dc.b ' between December 1990 and April 1991 '
dc.b ' ....I know...I`m a lazy, lazy programmer... '
dc.b ' IMPORTANT - ATTENTION - IMPORTANAT - ATTENTION '
dc.b ' This programme is FREEWARE!!! '
dc.b ' Use and copy turbo MCP for free! '
dc.b ' But do not try to sell it nor to include it in any sort '
dc.b ' of commercial product without my explicit permisson!! '
dc.b ' However a small copy fee seems tolerable as far as it '
dc.b ' doesn`t exceed the 5$/6DM-limit. Any kind of distribution '
dc.b ' with higher output prices requires my agreement. '
dc.b ' (c) by Jörg Sixt. All Rights reserved. '
dc.b ' If you want such a permission or if you feel generous '
dc.b ' enough to send a small donation to the '
dc.b ' "a C-compiler for Jörg Sixt"-foundation, '
dc.b ' or if you just want to contact me for fun`s sake '
dc.b ' here`s my address: '
dc.b ' Jörg Sixt * Tulpenstr. 2 * W-8424 Saal * F.R.G. '
dc.b ' And now the obligatory greeting list: '
dc.b ' Thanks to Charlie Gibbs,the man behind the incredible a68k '
dc.b ' * Teijo Kinunnen (med) * Fred Fish * '
dc.b ' Alan Turing * Amiga Power Club Regensburg, etc. '
dc.b ' Special mega hyper thanks to the `Amiga Special`-Magazine! '
dc.b ' Ok, that`s all for now! Happy playin`! '
dc.b ' Don`t forget to write!! '
dc.b 0
SECTION GRAPHICS,DATA,CHIP
even
ArrowIDat: dc.w $ff9f,$ff0f,$ff07,$0003,$0001,$0000
dc.w $0001,$0003,$ff07,$ff0f,$ff9f
dc.w 0,0,0,0,0,0,0,0,0,0,0
dc.w 0,0,0,0,0,0,0,0,0,0,0
dc.w 0,0,0,0,0,0,0,0,0,0,0
ArrowIStr: dc.w 0,0,16,11,4
dc.l ArrowIDat
dc.b 15,0
dc.l 0
LEDonIDat: dc.w 0,0,0,$01c0,$00e0,$0020,$0020,0,0,0
dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,$0380,$0fe0
dc.w $1ff0,$3ff8,$3ff8,$3ff8,$1ff0,$0fe0
dc.w $0380,0,$ffff,$ffff,$ffff,$ffff,$ffff
dc.w $ffff,$ffff,$ffff,$ffff,$ffff,$ffff
LEDonIStr: dc.w 0,0,16,11,4
dc.l LEDonIDat
dc.b 15,0
dc.l 0
LEDoffIDat: dc.w 0,0,0,$0080,$0040,0,0,0,0,0,0,0,$0380
dc.w $0fe0,$1f70,$3fb8,$3ff8,$3ff8,$1ff0
dc.w $0fe0,$0380,0,0,$0380,$0fe0,$1ff0,$3ff8
dc.w $3ff8,$3ff8,$1ff0,$0fe0,$0380,0,$ffff
dc.w $ffff,$ffff,$ffff,$ffff,$ffff,$ffff
dc.w $ffff,$ffff,$ffff,$ffff
LEDoffIStr: dc.w 0,0,16,11,4
dc.l LEDoffIDat
dc.b 15,0
dc.l 0
BackgrIDat: dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dc.w $ffff,$ffff,$ffff,$ffff,$ffff
dc.w $ffff,$ffff,$ffff,$ffff,$ffff,$ffff
BackgrIStr: dc.w 0,0,16,11,4
dc.l BackgrIDat
dc.b 15,0
dc.l 0
PodIDat: dc.w $3c00,$6600,$cb00,$9f00,$8100,$fb00,$6600,$3c00
dc.w $3c00,$7e00,$ff00,$ff00,$ff00,$ff00,$7e00,$3c00
dc.w $3c00,$7e00,$ff00,$ff00,$ff00,$ff00,$7e00,$3c00
PodIStr: dc.w 0,0,8,8,3
dc.l PodIDat
dc.b 7,0
dc.l 0
BoxIDat: dc.w $cc00,$6600,$3300,$9900,$cc00,$6600,$3300,$9900
dc.w $3300,$9900,$cc00,$6600,$3300,$9900,$cc00,$6600
dc.w $ff00,$ff00,$ff00,$ff00,$ff00,$ff00,$ff00,$ff00
BoxIStr: dc.w 0,0,8,8,3
dc.l BoxIDat
dc.b 7,0
dc.l 0
TitleIStr: dc.w 0,0,640,60,4
dc.l TitleIDat
dc.b 15,0
dc.l 0
TitleIDat:
INCLUDE "MCP.im"
END