Files
Pacman-Source-Code/PACMAN.ASM
Dillon Depeel 5a1cdadc64 added files
2023-05-15 12:46:46 -07:00

626 lines
12 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;************************************
;* *
;* PAC-MAN *
;* *
;* Developed for Atari Inc. by *
;* Roklan Corp. This Information *
;* is confidential and is not for *
;* sale or distribution. *
;* *
;* *
;* *
;* 10/03/82 *
;* *
;* DISK VERSION *
;* *
;* REVISION 3.0 *
;* *
;************************************
;
INCLUDE D2:SYSTEXT.ASM
;
LIST I
;
;******* ZERO PAGE VARIABLES ******
;
ORG $0018
;
DLICNT DS 1 ;DISPLAY LIST INT. COUNT
OPTION DS 1 ;OPTION MODE FLAG
NUMPLY DS 1 ;NUMBER OF PLAYERS
DIFOPT DS 1 ;DIFFICULTY OPTION
RSTRTF DS 1 ;RESTART FLAG
ATCLOK DS 1 ;ATTRACT COUNTDOWN CLOCK
ATTIMR DS 1 ;ATTRACT MODE TIMER
ATSEQU DS 1 ;ATTRACT MODE SEQUENCE #
;
GMOVRF DS 1 ;GAME OVER FLAG
READYF DS 1 ;READY FLAG
INTROF DS 1 ;INTRO FLAG
SWAPPF DS 1 ;SWAP PLAYER FLAG
RESETF DS 1 ;RESET FLAG
RESETT DS 1 ;RESET TIMER
RRFLAG DS 1 ;RERACK FLAG
RRSEQU DS 1 ;RERACK SEQUENCE #
RRTIMR DS 1 ;RERACK TIMER
RRFLCT DS 1 ;RERACK FLASH COUNT
TEMLOC DS 1 ;TEMPORARY STORAGE
PLYNUM DS 1 ;PLAYER # 0=1 1=2
XPACP1 DS 1 ;EXTRA PACMAN PLAYER 1
XPACP2 DS 1 ;EXTRA PACMAN PLAYER 2
BPACP1 DS 1 ;BONUS PACMAN PLAYER 1
BPACP2 DS 1 ;BONUS PACMAN PLAYER 2
MAZCT1 DS 1 ;MAZE COUNT PLAYER 1
MAZCT2 DS 1 ;MAZE COUNT PLAYER 2
BIGDT1 DS 1 ;BIG DOT STATUS #1
BIGDT2 DS 1 ;BIG DOT STATUS #2
DTCTL1 DS 1 ;DOTS EATEN CTR LSB #1
DTCTL2 DS 1 ;DOTS EATEN CTR LSB #2
DTCTM1 DS 1 ;DOTS EATEN CTR MSB #1
DTCTM2 DS 1 ;DOTS EATEN CTR MSB #2
SCNSC1 DS 2 ;SCREEN SCORE 1 ADDRESS
SCNSC2 DS 2 ;SCREEN SCORE 2 ADDRESS
PIXGET DS 2 ;P/M PIX GET ADDRESS
PIXPUT DS 2 ;P/M PIX PUT ADDRESS
PACCLR DS 1 ;ATTRACT PACMAN COLOR
;
ORG $0043
;
FRUTP1 DS 1 ;FRUIT COUNTER #1
FRUTP2 DS 1 ;FRUIT COUNTER #2
BCOUNT DS 1 ;BOUNCE TIMER COUNT
SAVCNS DS 1 ;SAVE CONSOL DATA
TUNLOC DS 2 ;USED FOR TUNNEL LOGIC
;
ORG $005A
M1DELY DS 1 ;MONSTER 1 DELAY
M2DELY DS 1 ;MONSTER 2 DELAY
M3DELY DS 1 ;MONSTER 3 DELAY
M4DELY DS 1 ;MONSTER 4 DELAY
ACOLR1 DS 1 ;ATTRACT COLOR 1 - $3A
ACOLR2 DS 1 ;ATTRACT COLOR 2 - $44
ACOLR3 DS 1 ;ATTRACT COLOR 3 - $2A
ACOLR4 DS 1 ;ATTRACT COLOR 4 - $DA
INTCNT DS 1 ;INTERMISSION COUNTER
INTCLK DS 1 ;INTERMISSION CLOCK
ORG $0080
;
PACSCN DS 2 ;PACMAN SCREEN MEM ADDR
PACBYT DS 1 ;PACMAN BYTE COUNTER
PVSAVE DS 1 ;PACMAN VPOS SAVE
PHSAVE DS 1 ;PACMAN HPOS SAVE
M1VPOS DS 1 ;MONSTER 1 VERTICAL POSIT
M2VPOS DS 1 ;MONSTER 2 VERTICAL POSIT
M3VPOS DS 1 ;MONSTER 3 VERTICAL POSIT
M4VPOS DS 1 ;MONSTER 4 VERTICAL POSIT
PMVPOS DS 1 ;PACMAN VERTICAL POSITION
M1HPOS DS 1 ;MONSTER 1 HORIZ POSITION
M2HPOS DS 1 ;MONSTER 2 HORIZ POSITION
M3HPOS DS 1 ;MONSTER 3 HORIZ POSITION
M4HPOS DS 1 ;MONSTER 4 HORIZ POSITION
PMHPOS DS 1 ;PACMAN HORIZONTAL POSIT
M1DIRT DS 1 ;MONSTER 1 DIRECTION
M2DIRT DS 1 ;MONSTER 2 DIRECTION
M3DIRT DS 1 ;MONSTER 3 DIRECTION
M4DIRT DS 1 ;MONSTER 4 DIRECTION
PMODIR DS 1 ;PACMAN OLD DIRECTION
SCOREX DS 6 ;PLAYER SCORE FOR TEXT
CARRYB DS 1 ;CARRY BIT FOR ABOVE
PAUSEF DS 1 ;PAUSE FLAG
WHINEY DS 1 ;CHASE WHINE DELTA
FRUTMR DS 2 ;FRUIT TIMER (10 SECS)
FRUFLG DS 1 ;FRUIT DISPLAY FLAG
FRUCLR DS 1 ;FRUIT COLOR
FRSCRF DS 1 ;FRUIT SCORE FLAG
FRSCRT DS 1 ;FRUIT SCORE TIMER
NOTCNT DS 1 ;NOTE COUNT FOR TUNES
VSAVER DS 1 ;VERTICAL POSIT SAVE
HSAVER DS 1 ;HORIZONTAL POSIT SAVE
PACMAP DS 1 ;PACMAN VERT MAP COUNTER
PACCNT DS 1 ;PACMAN MOTION COUNT
PACADV DS 1 ;PACMAN ADVANCE-TURNING
PACDLY DS 1 ;PACMAN DELAY-EATING DOTS
PMSTAT DS 1 ;PACMAN STATUS
PMSEQU DS 1 ;PACMAN SEQUENCE (MOUTH)
PMNDIR DS 1 ;PACMAN NEW DIRECTION
CHASET DS 1 ;CHASE TIMER
MSTILL DS 1 ;MONSTERS STILL FLAG
MSKIRT DS 1 ;MONSTER SKIRT FLAG
M1SPSQ DS 1 ;MONSTER 1 SPEED SEQUENCE
M2SPSQ DS 1 ;MONSTER 2 SPEED SEQUENCE
M3SPSQ DS 1 ;MONSTER 3 SPEED SEQUENCE
M4SPSQ DS 1 ;MONSTER 4 SPEED SEQUENCE
PMSPSQ DS 1 ;PACMAN SPEED SEQUENCE
M1SPCT DS 1 ;MONSTER 1 SPEED COUNT
M2SPCT DS 1 ;MONSTER 2 SPEED COUNT
M3SPCT DS 1 ;MONSTER 3 SPEED COUNT
M4SPCT DS 1 ;MONSTER 4 SPEED COUNT
PMSPCT DS 1 ;PACMAN SPEED COUNT
M1PIDX DS 1 ;MONSTER 1 PATTERN INDEX
M2PIDX DS 1 ;MONSTER 2 PATTERN INDEX
M3PIDX DS 1 ;MONSTER 3 PATTERN INDEX
M4PIDX DS 1 ;MONSTER 4 PATTERN INDEX
M1PCNT DS 1 ;MONSTER 1 PATTERN COUNT
M2PCNT DS 1 ;MONSTER 2 PATTERN COUNT
M3PCNT DS 1 ;MONSTER 3 PATTERN COUNT
M4PCNT DS 1 ;MONSTER 4 PATTERN COUNT
M1THPS DS 1 ;MONSTER 1 TARGET HPOS
M2THPS DS 1 ;MONSTER 2 TARGET HPOS
M3THPS DS 1 ;MONSTER 3 TARGET HPOS
M4THPS DS 1 ;MONSTER 4 TARGET HPOS
M1TVPS DS 1 ;MONSTER 1 TARGET VPOS
M2TVPS DS 1 ;MONSTER 2 TARGET VPOS
M3TVPS DS 1 ;MONSTER 3 TARGET VPOS
M4TVPS DS 1 ;MONSTER 4 TARGET VPOS
M1TIMR DS 1 ;MONSTER 1 TIMER
M2TIMR DS 1 ;MONSTER 2 TIMER
M3TIMR DS 1 ;MONSTER 3 TIMER
M4TIMR DS 1 ;MONSTER 4 TIMER
M1STAT DS 1 ;MONSTER 1 STATUS
M2STAT DS 1 ;MONSTER 2 STATUS
M3STAT DS 1 ;MONSTER 3 STATUS
M4STAT DS 1 ;MONSTER 4 STATUS
M1SSEQ DS 1 ;MONSTER 1 START SEQUENCE
M2SSEQ DS 1 ;MONSTER 2 START SEQUENCE
M3SSEQ DS 1 ;MONSTER 3 START SEQUENCE
M4SSEQ DS 1 ;MONSTER 4 START SEQUENCE
M1VDIR DS 1 ;MONSTER 1 VERT CHOICE
M2VDIR DS 1 ;MONSTER 2 VERT CHOICE
M3VDIR DS 1 ;MONSTER 3 VERT CHOICE
M4VDIR DS 1 ;MONSTER 4 VERT CHOICE
M1HDIR DS 1 ;MONSTER 1 HORZ CHOICE
M2HDIR DS 1 ;MONSTER 2 HORZ CHOICE
M3HDIR DS 1 ;MONSTER 3 HORZ CHOICE
M4HDIR DS 1 ;MONSTER 4 HORZ CHOICE
VCHASF DS 1 ;CHASE FREQ
VCHASD DS 1 ;DIRECTION 1=INC 2=DEC
VCHASS DS 1 ;CHASE SOUND START
VFLITF DS 1 ;FLIGHT FREQ
VFLITD DS 1 ;DIRECTION SAME
VFLITV DS 1 ;FLIGHT VOLUME
VFLITS DS 1 ;FLIGHT SOUND START
VFREEZ DS 1 ;FREEZE FLAG
VGLPC1 DS 1 ;GULP COUNT1
VGLPC2 DS 1 ;GULP COUNT2
GULPED DS 1 ;LAST MONSTER EATEN
GLPCNT DS 1 ;GULP COUNT
FIZZLE DS 1 ;FIZZLE FLAG 1=FIZL
FIZPTR DS 1 ;FIZZLE ADDR POINTER
FIZTIM DS 1 ;FIZZLE TIMER
VFIZST DS 1 ;FIZZLE STATUS
VFIZSQ DS 1 ;FIZZLE SEQUENCE #
VFIZBS DS 1 ;FIZZLE FREQ BASE
VFIZFQ DS 1 ;FIZZLE CURRENT FREQ
VFIZCT DS 1 ;FIZZLE COUNTER
TWEETR DS 1 ;TWEET SOUND FLAG
TWEETF DS 1 ;TWEET SOUND FREQ
EATERF DS 1 ;EAT DOT SOUND FLAG
EATERC DS 1 ;EAT DOT SOUND COUNT
EATERT DS 1 ;EAT DOT TOGGLE
GOBBLD DS 1 ;GOBBLE DIRCTN (FRUITS)
GOBBLF DS 1 ;GOBBLE FREQUENCY
BLINKT DS 1 ;BLINK TIMER
FLSHUP DS 1 ;FLASH 1UP 2UP TIMER
FLASHT DS 1 ;FLASH TIMER
FLASHC DS 1 ;FLASH COUNT
FLITMR DS 1 ;FLIGHT TIMER
TUNMSK DS 1 ;TUNNEL BIT MASK
TUNCNT DS 1 ;TUNNEL ITERATION COUNT
;
EJECT
;
ORG $0600
;
PACBUF DS 16 ; PACMAN IMAGE BUFFER
MONBUF DS 16 ; MONSTER IMAGE BUFFER
;
INTRDL EQU $0680;INTERMISSION DL
INTMOD EQU $06C0;INTERMISSION MODE
INTSEQ EQU $06C1;INTERMISSION SEQ
;
;
;**** SYSTEM VARIABLES ****
;
BDELAY EQU 1 ;BOUNCE DELAY
FDELAY EQU $FF;FRUIT TIMER VALUE
ADELAY EQU $30;ATTRACT TIMER DELAY
;
GAMMEM EQU $0800; GAME MEMORY
;
PACMAZ EQU GAMMEM+$0C00
P1SAVE EQU GAMMEM+$1000
P2SAVE EQU GAMMEM+$1400
OPTCHR EQU GAMMEM+$1800
OPTSCN EQU GAMMEM+$1C00
PMADDR EQU GAMMEM+$2000
TEXT EQU GAMMEM+$2000
PATSCN EQU GAMMEM+$2800
AMCSET EQU GAMMEM+$2C00
;
EJECT
;
ORG $3FFD
;
JMP INIT
;
INCLUDE D2:PACDAT1.ASM
;
EJECT
;
INIT LDX #9
INITL1 LDA HISCTX,X
STA TEXT+$0F,X
DEX
BPL INITL1
LDA #0
LDX #$27
INITL2 STA DLICNT,X
DEX
BPL INITL2
LDX #$7F
INIPZL STA $80,X
DEX
BPL INIPZL
;
INC OPTION
LDX RTCLOK+2
DEX
STX ATCLOK
;
; RELOCATE OPTION CHAR SET
;
LDX #0
OCLOOP LDA PACTTL,X
STA OPTCHR+8,X
INX
BNE OCLOOP
;
; BUILD ATTRACT MODE CHAR SET
;
ANCHRL LDA CHRORG,X
STA AMCSET,X
LDA CHRORG+$100,X
STA AMCSET+$100,X
INX
BNE ANCHRL
LDX #$1F
ANCDTL LDA ATCHRS,X
STA AMCSET+$18,X
DEX
BPL ANCDTL
;
; ENABLE KEYSCAN & SET VBI VECTOR
;
PACINI SEI
LDA POKMSK
ORA #$40
STA POKMSK
STA IRQEN
CLI
LDY #LOW VBLANK
LDX #HIGH VBLANK
LDA #7
STA SKCTL
JSR SETVBV;GO SET VBLANK VECTOR
LDA #$C0;ENABLE DLI AND VBI
STA NMIEN
LDA #$3E
STA SDMCTL;ENABLE P/M GRAPHICS
LDA #$3
STA GRACTL
LDA #HIGH PMADDR
STA PMBASE
LDA #LOW INIT
STA DOSVEC
LDA #HIGH INIT
STA DOSVEC+1
LDA #LOW INITAD
STA DOSINI
LDA #HIGH INITAD
STA DOSINI+1
;
REINIT LDA #0;NEW GAME VECTOR
LDX #$1F
REINLP STA GMOVRF,X
DEX
BPL REINLP
TXS
JSR CLRAUD
;
; NOW INITIALIZE PLAYER SCREENS
;
JSR P1INIT
JSR SAVEP1
JSR SAVEP2
;
LDA OPTION
BNE LOOP
;
PACGAM LDA RTCLOK+2
PACGML CMP RTCLOK+2
BEQ PACGML
LDA #LOW DLIST
STA SDLSTL
STA DLISTL
LDA #HIGH DLIST
STA SDLSTH
STA DLISTH
LDA #LOW DLIV; DLI VECTOR
STA VDSLST
LDA #HIGH DLIV
STA VDSLST+1
LDA #$11
STA GPRIOR;LET MISSILES USE COLPF3
SETPAC JSR SETUP
JSR NEWGAM
LDA NUMPLY
BEQ P1SCIN
JSR SET2PL
JMP GODOIT
P1SCIN JSR SET1PL
GODOIT LDA #2
STA RSTRTF
;
LOOP LDA RRSEQU
CMP #3
BNE GOLOOP
JSR INTMIS
JSR SETUP
INC RRSEQU
GOLOOP LDX #3
LOOPLP LDA ACOLOR,X
EOR COLRSH;ATTRACT COLORS THAT ARE
AND DRKMSK;SWITCHED WITH DLI'S
STA ACOLR1,X
DEX
BPL LOOPLP
LDA OPTION
BNE PCTRIG
LDA KEYDEL
BNE IGNORK
LDA CH; TEST FOR SPACE BAR PAUSE
CMP #$21
BNE IGNORK
LDA PAUSEF
BEQ FLIPON
LDA #0
BEQ STFLIP
FLIPON LDA #1
STFLIP STA PAUSEF
NOFLIP LDA #$FF
STA CH
IGNORK LDA GMOVRF
BEQ GAMCNS
LDA ATTIMR;IF GAME OVER, TIME OUT
BNE PCTRIG;AND GO TO OPTION SCREEN
LDA #4
BNE PCEXT1
PCTRIG LDA #$FF
STA CH
LDA STRIG0
BEQ CSTART
LDA STRIG1;TEST TRIGGER START
BEQ CSTART
GAMCNS LDA CONSOL
CMP #7; NO BUTTONS PRESSED
BEQ LOOP
CNSSWT STA SAVCNS
LDX #BDELAY
STX BCOUNT
CLOOP1 ORA CONSOL
LDX BCOUNT;DEBOUNCE LOGIC
BNE CLOOP1
CMP SAVCNS
BNE GAMCNS
CLOOP2 CMP CONSOL
BEQ CLOOP2
LDA SAVCNS
CMP #6
BEQ CSTART
LDX ATSEQU
BEQ CPROPT
LDA #0
STA ATSEQU
LDA #4
BNE PCEXT1
CPROPT LDX OPTION;IF OPTION SCREEN
CPX #3; THEN CHANGE PARAMS
BCC PCEXIT
PRESSW CMP #3
BEQ COPTON
CMP #5
BEQ CSELEC
JMP LOOP
CSTART LDA #0
STA GMOVRF;START FUNCTION-NEW GAME
STA OPTION
STA ATSEQU
LDA #1
STA RSTRTF
JMP REINIT
CSELEC LDA NUMPLY
BNE PCNSE1;PROCESS SELECT CHANGES
LDA #1
BNE PCNSE2
PCNSE1 LDA #0
PCNSE2 STA NUMPLY
PCEXIT LDA #3
PCEXT1 STA OPTION
STA ATRACT
LDA #7
STA ATCLOK
JMP LOOP
COPTON LDA DIFOPT
CMP #2
BCS PCNOP1;PROCESS OPTION CHANGES
INC DIFOPT
BNE PCEXIT
PCNOP1 CMP #$0C
BEQ PCNOP2
INC DIFOPT
INC DIFOPT
BNE PCEXIT
PCNOP2 LDA #0
STA DIFOPT
BEQ PCEXIT
;
; DISPLAY LIST INTERRUPT VECTOR
;
DLIV PHA
TXA
PHA
LDX DLICNT;DLI COUNT
BNE DLI2ND
LDA #HIGH PACCHR
STA WSYNC
STA CHBASE
BNE DLIXIT
DLI2ND CPX #1
BNE DLI3RD
LDA ACOLR4;-$DA PLAYER 1-2 MSG
LDX ACOLR1;-$3A LT ORANGE COLOR
STA WSYNC
STA COLPF1
STX COLPF2
BNE DLIXIT
DLI3RD CPX #2
BNE DLI4TH
LDA FRUCLR; FRUIT COLOR
EOR COLRSH
AND DRKMSK
STA WSYNC
STA COLPF1
BNE DLIXIT
DLI4TH CPX #3
BNE DLI5TH
LDA ACOLR2
STA WSYNC
STA COLPF1
BNE DLIXIT
DLI5TH CPX #4
BNE LSTDLI
LDA ACOLR3;YELLOW COLOR
LDX ACOLR4
STA WSYNC
STX COLPF0
STA COLPF3
BNE DLIXIT
LSTDLI LDX #3
LDA #0
DLICLP STA COLPM0,X
DEX
BPL DLICLP
STA COLPF3
DLIXIT INC DLICNT
PLA
TAX
PLA
RTI
;
; DLI VECTOR FOR OPT & TITLE SCREENS
;
OPDLIV PHA
TXA
PHA
TYA
PHA
LDX DLICNT
BNE OPDLI1
LDY ACOLR2
LDA ACOLR1
LDX #HIGH OPTCHR
STA WSYNC
STX CHBASE
STA COLPF2
STY COLPF1
JMP OPDLIX
OPDLI1 LDA OCINDX,X
STA WSYNC
STA CHBASE
OPDLIX INC DLICNT
PLA
TAY
PLA
TAX
PLA
RTI
;
; VERTICAL BLANK INTERRUPT VECTOR
;
VBLANK LDA #0
STA DLICNT
DEC BCOUNT
JSR VBSUBS
LDA ATSEQU
BNE VBEXIT
LDA VFREEZ
BNE VBEXIT
JSR TUNNEL
VBEXIT JMP XITVBV; EXIT VECTOR
;
OPTTTL LDA #0
LDX #7
CHRDWR STA HPOSP0,X
STA AUDF1,X
DEX
BPL CHRDWR
LDA #LOW ODLIST
STA SDLSTL
STA DLISTL
LDA #HIGH ODLIST
STA SDLSTH
STA DLISTH
LDA #LOW OPDLIV
STA VDSLST
LDA #HIGH OPDLIV
STA VDSLST+1
OCOLRS LDY #3
OCLRLP LDA OCOLOR,Y
STA COLOR0,Y
DEY
BPL OCLRLP
INITAD RTS
;
SET1PL LDX #6
LDA #0
S1PLL1 STA TEXT+$20,X
STA TEXT+$47,X
STA TEXT+$2A,X
DEX
BPL S1PLL1
SETXPL JSR FLS1ON
LDA #$10
STA TEXT+$2E
STA TEXT+$2F
RTS
;
SET2PL LDX #6
LDA #0
S2PLL1 STA TEXT+$2A,X
STA TEXT+$47,X
DEX
BPL S2PLL1
JSR FLS2ON
LDA #$10
STA TEXT+$4B
STA TEXT+$4C
BNE SETXPL
;
EJECT
INCLUDE D1:PAC1.ASM
EJECT
INCLUDE D1:PAC2.ASM
EJECT
INCLUDE D1:PAC3.ASM
EJECT
INCLUDE D1:PAC4.ASM
EJECT
INCLUDE D2:PACDAT2.ASM
EJECT
;
ORG $7400
;
INCLUDE D2:PACDAT3.ASM
;
END INIT
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ