.TITLE MLIBU (18703) .ASECT .RADIX 16 .ENABL AMA ;*********************************************** ;* ;*DATE INITIATED: 13-DEC-78 ;* ;*PROJECT CHARGE #: 18703 ;* ;*DISK #: 105 & B46 ;* ;*HARDWARE REQUIREMENTS: VECTOR HARDWARE SPECIAL MULTIPLY AND ;* DIVIDE HARDWARE. ;* ;*MEMORY REQUIREMENTS: VECTOR RAM: 4000-4BFF (3K) ;* VECTOR ROM: 5000-5FFF (4K) ;* SCRATCH: PAGE 0 ;* ;*INTERRUPTS: NMI EVERY 4 MS ;* ;*ASSEMBLY COMMAND STRING: R MAC65 ;* MALIBU/A/C ;* ;*LINK COMMAND: OUTPUT(S)=DX1:MLVEC,MLIBU,MLSIN,MLMSG,MLU,MLNMI/C ;* ANVGUT,MLTST ;* ;*PROGRAM DESCRIPTION: GAME SHOWS A FIRST PERSON VIEW OF A SMALL ;* RACE CAR ON A FIXED TRACK. THE PLAYER CAN ;* DRIVE IN ANY DIRECTION, EVEN ACROSS THE ;* TRACK ;* ;*CONTROLS: STEERING WHEEL, GAS, BRAKE ;* ;******************************************************* .SBTTL ************************ .SBTTL * .SBTTL *PROGRAMMER: OWEN RUBIN .SBTTL * ED LOGG .SBTTL ************************ .PAGE .SBTTL GLOBLS ; ;ENTRY POINTS ; .GLOBL MAIN ; ;HARDWARE GLOBALS ; .GLOBL CCNTRS,DIAGSW,BRAKE .GLOBL GAS,GOADD,HALT,OPTSW1,OPTSW2 .GLOBL LSCRCH,HSCRCH,STSTSW,STRTSW .GLOBL STEERV,THRKHZ,TRCKSW .GLOBL VECRAM,WTCHDG,$LAM,$LMBIT ; ;EXTERNAL ENTRY POINTS ; .GLOBL VGHALT,VGVCTR,VGRTSL .GLOBL VGJMPL,VGJSRL,VGLABS .GLOBL VGADD,VGWAIT,VGADD2 .GLOBL VGHEX,VGHEXZ,VGSABS,VGDOT .GLOBL SIN,COS,COMP ;GAME INDEPENDENT ROUTINES .GLOBL TRKD ;TRACK TABLE .GLOBL VGMSG,VGMSGA ;MESSAGE ROUTINE .GLOBL PWRON,DIGIT2,LIGHT ; ;STATIC VECTORS ; .GLOBL MTNS,HORIZ,PERIOD .GLOBL BLOCK,BOX,ARROW,UNDERL ; ;ZERO PAGE GLOBALS ; .GLOBL TEMP1,TEMP2,TEMP3,TEMP4 .GLOBL VGSIZE,XCOMP,VGLIST,VGBRIT .GLOBL BUFRDY,FRAME,HEIGHT .GLOBL LSTEER,MODE,POLYL .GLOBL ROT,SCRCH .GLOBL TIME,TIMFLD,TIMFRM,TIMCNT .GLOBL UPDIND,UPDFLG,XPOS,YPOS .GLOBL $INTCT,$CCTIM,$$CRDT,$CNCT,$PSTSL .GLOBL $CNSTT,$LMTIM,$CMODE,$COINA .SBTTL PAGE 0 VGSIZE: .BLKB 1 ;SCALING SIZE (0,10,20,...,F0) VGBRIT: .BLKB 1 ;VECTOR BRIGHTNESS (0=OFF, F0=MAX, 10INC) VGLIST: .BLKB 2 ;VECTOR LIST POINTER XCOMP: .BLKB 4 ;X AND Y COMPONENT FOR VECTORS TEMP1: .BLKB 2 ;SCRATCH TEMP2: .BLKB 2 TEMP3: .BLKB 8 ;8 BYTES USED BY SELF-TEST TEMP4: .BLKB 2 TEMP5: .BLKB 2 FRAME: .BLKB 2 ;FRAME COUNT MODE: .BLKB 1 ;GAME MODE ;FF=ATTRACT ;0=PLAY ;1=AT START LINE ;2=DRIVE TO START ;3=LOSE HEIGHT ;4=TRACK SELECT GROUND: .BLKB 1 ;MINUS IF ON GROUND ELSE 0 HEIGHT: .BLKB 2 ;HEIGHT FOR POINT OF VIEW DRAW: .BLKB 1 ;NEGATIVE TO DRAW CURRENT VECTOR EDGES: .BLKB 2 ;RIGHT & LEFT COUNT FOR COLLISION CHECK CORNER: .BLKB 2 ;RIGHT AND LEFT COUNT FOR ATTRACT DRIVING TIMFLD: .BLKB 1 ;COUNT OF NMI'S FOR FIELD TIMFRM: .BLKB 1 ;COUNT OF NMI'S FOR FRAME TIMCNT: .BLKB 1 ;COUNT DOWN EVERY 5/2 NMI'S=1/100 SECOND TIME: .BLKB 2 ;HUNDREDTHS OF SECONDS,SECONDS BESTT: .BLKB 2 ;PLAYERS BEST TIME SO FAR TRKRCD: .BLKB 6 ;TRACK RECORD FOR EACH TRACK INTLS: .BLKB 9 ;TABLE OF INITIALS FOR HIGH SCORES UPDATE: .BLKB 3 ;NON-ZERO TO UPDATE THIS TRACK RECORD UPDFLG: .BLKB 1 ;MINUS IF WE ARE NOT UPDATING INITIALS ELSE INDEX INTO INTLS UPDIND: .BLKB 1 ;INDEX FOR CURRENT INITIAL BONUST: .BLKB 2 ;TIME NEEDED FOR BONUS LAP BONUSL: .BLKB 1 ;NON-ZERO IF BONUS LAP AWARDED TRACKN: .BLKB 1 ;TRACK NUMBER (0 OR 2) SW1: .BLKB 1 ;TRACK SWITCH DEBOUNCE SW2: .BLKB 1 ;START SWITCH DEBOUNCE MSGN: .BLKB 1 ;0 OR 1 TO GET RANDOM RATING MESSAGE CHEAT: .BLKB 1 ;NON-ZERO IF HE CHEATED CHKPTI: .BLKB 1 ;INDEX FOR CHECK POINT TABLE CHKPTT: .BLKB 2 ;CHECK POINT TABLE POINTER ROT: .BLKB 1 ;ROTATE VALUES LCRASH: .BLKB 1 ;LAST CRASH/MOTOR VALUES LSTEER: .BLKB 1 ;LAST STEERING READING ASTEER: .BLKB 1 ;AUTO STEERING VALUE ANGLE: .BLKB 2 ;ROTATION IN DEGREES 0-FF=0-360 DEG. VIEW: .BLKB 2 ;POINT OF VIEW=ANGLE IF GOING STRAIGHT XPOS: .BLKB 3 ;X POSITION IN MAP YPOS: .BLKB 3 ;Y POSITION IN MAP SPEED: .BLKB 2 ;SPEED OF CAR RPM: .BLKB 1 ;ENGINE RPM (0 TO 3F) SKID: .BLKB 1 ;NON-ZERO IF CAR IN SKID ELSE 0 SCRCH: .BLKB 1 ;NON-ZERO FOR HI SCREECH SOUND ELSE 0 NEXT: .BLKB 2 ;INDIRECT TABLE POINTER FOR TRACK LASTX: .BLKB 2 ;LAST (XCOMP,XCOMP+1) LASTY: .BLKB 2 ;LAST (XCOMP+2,XCOMP+3) LASTX1: .BLKB 2 ;LAST ROTATED X VALUES LASTY1: .BLKB 2 ;LAST ROTATED Y VALUES WNDFLG: .BLKB 2 ;=0 IF POINT NOT IN WINDOWN (LAST,CURRENT) X1: .BLKB 2 ;X1=ROTATED X POSITION Y1: .BLKB 2 ;Y1=ROTATED Y POSITION BUFRDY: .BLKB 1 ;NON ZERO IF BUFFER IS BEING USED (SEE NMI) POLYL: .BLKB 1 ;POLY COUNTER POLYH: .BLKB 1 SPOTXL: .BLKB 10. ;4 SPOTS ON ROAD SPOTXM: .BLKB 10. ;X LSB,X MSB SPOTYL: .BLKB 10. ;Y LSB,Y MSB SPOTYM: .BLKB 10. $CCTIM: .BLKB 3 ;COIN COUNTERS D7=1 FOR ON $$CRDT: .BLKB 1 ;CREDITS=LAPS $CNCT: .BLKB 1 $PSTSL: .BLKB 3 $CNSTT: .BLKB 3 $LMTIM: .BLKB 1 $CMODE: .BLKB 1 ;COIN MODE $INTCT: .BLKB 1 ;INTERRUPT COUNTER ; ;VECTOR ADDRESSES ; VECRAM =^H4000 ;VECTOR RAM HALT =^H0800 ;D6=1 FOR HALTED GOADD =^H1200 ;START VECTOR GENERATOR RESET =^H1600 ;RESET VECTOR GENERATOR ; ;MATRIX MULTIPLY ; ; [A B] [X-E] ; [C D] [Y-F] = [A(X-E)+C(Y-F),B(X-E)+D(Y-F)] ; ; DATA IS STORED A,B,C,D,E,F,X AND Y. EACH LETTER ; REPRESENTS A 16 BIT SIGNED 2'S COMPLIMENT NUMBER. ; EACH LETTER IS STORED LSB,MSB. WHEN Y MSB IS STORED, ; THE MULTIPLY BEGINS. THE ANSWER IS READ X LSB, X MSB. ; STAT =2007 ;D7=0 IF 2901'S ARE BUSY RESULT =2010 ;16 BIT RESULTS FOR OPERATIONS BELOW (+8 FOR HIGH BYTE) A =2060 ;A LSB,MSB (A=D IS ASSUMED) B =2062 ;B (B=-C IS ASSUMED) E =2064 ;E F =2066 ;F X =2068 ;X Y =206A ;Y [Y MSB STARTS X'=A(X-3)-B(Y-F)] N =206C ;N=NUMBER OF CYCLES FOR DIVIDE AND CLIPPING DDEND =206D ;4 BYTE QUOTIENT FOR DIVIDE FOR PROJECTION ;(Z/X')(LSB TO MSB) ;ALSO USED FOR CONSTANT IN CLIPPING ALGORITHM ;ALSO USED FOR DIVIDE SYM =2072 ;STARTS Y'=B(X-E)+A(Y-F) SYXD =2073 ;STARTS Y'/X' DIVIDE (ONLY AFTER Y' COMPUTATION) SZXD =2074 ;STARTS Z/X' DIVIDE XP =2075 ;WRITE X' - USED FOR DIVIDE (Z/X') ;ALSO USED FOR CLIPPING RXP =2077 ;READ X' - USED BY CLIPPING RYP =2079 ;READ Y' - USED BY CLIPPING YP =207A ;2 BYTES FOR Y' (LSB,MSB) SYHSC =207C ;STORE Y MSB AND STARTS CLIPPING ; ;SWITCH INPUTS ; $COINA =800 ;COIN SWITCH (D2,D1,D0=L,C,R)0=ON STSTSW =800 ;SELF TEST SWITCH D4=0=ON THRKHZ =800 ;3KHZ (D7) DIAGSW =800 ;DIAGNOSTIC STEP (D5=0=ON) $LAM =800 ;SLAM (D3=0=ON) $LMBIT =08 OPTSW1 =0A00 ;OPTION SWITCHES (D0=SW1)(1=OFF) ;SW1,2=LANGUAGE ;SW3,4=COIN MODE ;SW,5,6,7,8=TIME NEEDED FOR BONUS LAP OPTSW2 =0C00 ;OPTION SWITCHES CCNTRS =1000 ;COIN COUNTERS (D2,D1,D0=L,C,R)1=ON WTCHDG =1400 ;WATCHDOG RESET BRAKE =2003 ;BRAKE SWITCH (D7=1=ON) GAS =2004 ;GAS SWITCH (D7=1=ON) TRCKSW =2005 ;TRACK SELECT (D7=1=ON) STRTSW =2006 ;START SWITCH (D7=1=ON) STEERV =2008 ;4 BIT STEERING VALUE (D4-D7) HSCRCH =2020 ;D0=1 FOR HI SCREECH ENABLE MOTORE =2028 ;D0=1 FOR MOTOR ENABLE LSCRCH =2030 ;D0=1 FOR LOW SCREECH ENABLE TRCKLD =2038 ;TRACK BUTTON LED (D0=0=ON) STRTLD =203C ;START BUTTON LED (D0=0=ON) CRASH =2040 ;D4-D7=CRASH AMPLITUDE MOTORF =2040 ;D0-D3=MOTOR FREQ NOISER =2044 ;NOISE RESET TONE =2048 ;D4=1 TONE ENABLE D0-D3=TONE FREQ ; ;MACROS