Jump to content
IGNORED

7800 Game Development... (Part 1 of 6)


Curt Vendel

Recommended Posts

I would really like to see more 7800 game development and hacks... what would be killer is to see hacks of Ms Pac Man into a perfect Pac Man, Centipede into Millipede and others.... Maybe having some code to pick apart will help:

 

Part 1 of 6

 

 

* SPHINX--SINIT.S

 

* CONSOLIDATE NUMBER INITIALIZATIONS

 

ZERODEF

 

RSEG CODE9

 

 

**********PREINIT***************************************************************

PREINIT ;SET UP POWER UP DEFAULTS

 

LDX #1 ;SETS DEFAULT MODES FOR STARTUP

STX NUMPLYRS

STX DIFCULTY ;STANDARD DIFFICULTY LEVEL

DEX ;PLAYER ONE ONLY

STX PLAYER

LDX #5 ;FIVE LIVES ONLY

STX PL1LIVES

STX PL2LIVES

 

JSR INITGAME

JSR MCPINIT

RTS

 

 

**********INITIT****************************************************************

 

INITIT ;INITIALIZE STATE TO TITLE PAGE + MENU

 

JSR ABSZERO ;ZERO OUT ABSOLUTE MEMORY

JSR BLANKMAP ;BLANK OUT CHARACTER MAP

JSR SCRAPALL ;KILL ALL TUNES

JSR IOINIT ;SET UP SOFTWARE IO REGISTERS

JSR DLYZFILL ;FILL UP DLY AND DLZ

 

LDA #$80 ;RESET EAST AND WEST JOYSTICK TIMERS

STA ETIMER

STA WTIMER

STA STIMER ;SELECT TIMER

 

LDA #35 ;DISABLE SELECTION FOR FIRST 35 FRAMES

STA OTIMER ;OF SELECT MODE

 

NODELAY

LDX #74 ;COPY TITLE PAGE DISPLAY LIST LIST

DTITLOOP LDA TITBL,X

STA DLLIST,X

DEX

BPL DTITLOOP

 

LDA #L(TITSTATE) ;SET UP STATE POINTER FOR INDIRECT JMP

STA STATEPTR ;TO TITSTATE

LDA #H(TITSTATE)

STA STATEPTR+1

 

LDA #$4C

STA HANDLER

LDA #L(DLITIT) ;SET UP DLI POINTER FOR THE DLI

STA DLIPTR ;OF TITLEPAGE

LDA #H(DLITIT)

STA DLIPTR+1

 

TITLOGO

LDA #H(TITCHR1) ;LOAD HIGH BYTE OF TITLE PAGE CHARS

STA CHARBASE ;INTO CHARBASE

 

LDA #L(DLLIST) ;SET UP DPPL AND DPPH FOR TITLE PAGE

STA DPPL

LDA #H(DLLIST)

STA DPPH

 

LDX #79

LDA #0

ZERODL STA DL0,X

STA DL1,X

STA DL2,X

STA DL3,X

STA DL4,X

STA DL5,X

DEX

BPL ZERODL

 

 

LDX #4 ;FILL DLISTS

TITZNLP LDA TITZN0TB,X ;WING HEADER FOR DL0

STA DL0,X

LDA TITZN1TB,X

STA DL1,X

LDA TITZN2TB,X ;WING HEADER FOR LEFT SIDE OF DL2

STA DL2,X

LDA TTZN2TB2,X ;WING HEADER FOR RIGHT SIDE OF DL2

STA DL2+5,X

LDA TITZN3TB,X

STA DL3,X

LDA TITZN4TB,X

STA DL4,X

LDA TITZN5TB,X

STA DL5,X

 

LDA CRTB1,X ;CREST HEADERS

STA DL1+5,X

LDA CRTB2,X

STA DL2+10,X

LDA CRTB3,X

STA DL3+5,X

LDA CRTB4,X

STA DL4+5,X

LDA CRTB5,X

STA DL5+5,X

 

LDA NOVHDTBL,X ;NOVICE HEADER MAP

STA DL6,X

LDA STDHDTBL,X ;STANDARD HEADER MAP

STA DL6+5,X

LDA ADVHDTBL,X ;ADVANCED HEADER MAP

STA DL6+10,X

LDA EXPHDTBL,X ;EXPERT HEADER MAP

STA DL6+15,X

LDA CRHDTBL,X ;CRIGHT MESSAGE MAP HEADER

STA DL7,X

 

DEX

BPL TITZNLP

 

LDX #3

PAULOOP LDA DSTOPSTP,X ;'DESERT FALCON' TEXT IS DONE IN DIRECT

STA DL1+10,X ;MODE

LDA FCTOPSTP,X

STA DL1+14,X

LDA DSSTPSTP,X

STA DL2+15,X

LDA FCSTPSTP,X

STA DL2+19,X

LDA DSBOTSTP,X

STA DL2+23,X

LDA FCBOTSTP,X

STA DL2+27,X

LDA DSSBTSTP,X

STA DL3+10,X

LDA FCSBTSTP,X

STA DL3+14,X

 

DEX

BPL PAULOOP

 

JSR PLAYTWID ;TURN ON CORRECT PLAYER

JSR DIFFTWID ;TURN ON CORRECT DIFFICULTY

 

LDX #10 ;FILLS TOPMSMAP WITH 'PLAYER TEXT'

MOON LDA PLUTOTBL,X ;TWO PLAYER ON TOP

STA TOPMSMAP+2,X

LDA MOONTBL,X ;ONE PLAYER ON BOTTOM

STA BOTMSMAP+2,X

DEX

BPL MOON

LDA #50 ;TWO PLAYER ON TOP

STA DLY+9

LDA #48 ;ONE PLAYER ON BOTTOM

STA DLZ+9

 

LDX #19 ;FILL CHAR MAPS WITH CHARS FOR WINGS

WINGSLP LDA WNGMPTB0,X ;FOR WING MAPS 0 THRU 2

STA WINGMAP0,X

LDA #L(WINGS1)

STA WINGMAP1,X

STA WINGMAP2,X

DEX

BPL WINGSLP

LDA #L(WINGS0) ;HACK FIRST AND LAST CHAR OF WINGMAP2

STA WINGMAP2 ;THIS IS TO SAVE BYTES YOU REALIZE

LDA #L(WINGS2)

STA WINGMAP2+19

 

LDX #17 ;FILL CHAR MAPS 3 AND 4

LDA #L(WINGS1)

WNGSLP34 STA WINGMAP3,X

STA WINGMAP4,X

DEX

BPL WNGSLP34

LDA #L(WINGS6) ;HACK IN END CHARACTERS AS USUAL

STA WINGMAP3

LDA #L(WINGS0)

STA WINGMAP4

LDA #L(WINGS9)

STA WINGMAP3+17

LDA #L(WINGS2)

STA WINGMAP4+17

 

LDX #9 ;FILL WINGMAP5

LDA #L(WINGS1)

WNGSLP5 STA WINGMAP5,X

DEX

BPL WNGSLP5

LDA #L(WINGS7) ;HACK ENDS OF CHARACTER MAP

STA WINGMAP5

LDA #L(WINGS8)

STA WINGMAP5+9

 

LDX #29 ;FILL CREST MAP

LDA #L(WINGS1)

CRSTLP STA CRSTMAP1,X

DEX

BPL CRSTLP

LDA #L(WINGS0)

STA CRSTMAP1

STA CRSTMAP1+12

STA CRSTMAP1+22

STA CRSTMAP1+28

LDA #L(WINGS2)

STA CRSTMAP1+11

STA CRSTMAP1+21

STA CRSTMAP1+25

STA CRSTMAP1+29

 

LDX #11 ;STUFF MESSAGE MAP WITH COPYRIGHT MSG

SLEEP LDA CRIGHTBL,X

STA CRMAP,X

DEX

BPL SLEEP

 

LDX #27 ;STUFF DIFFICULTY MAPS

DIFMAPLP LDA DIFTBL,X ;ALL DIFF MAPS ARE CONTIGUOUS IN MEM.

STA NOVMAP,X

DEX

BPL DIFMAPLP

 

LDX #2 ;STUFF PALETTES FOR TITLE PAGE

PALSTFLP LDA #$0F ;CONSTANT

STA P0C1,X

LDA PALWD1,X

STA P1C1,X

LDA PALWD2,X

STA P2C1,X

LDA PALWD3,X

STA P3C1,X

LDA PALWD4,X

STA P4C1,X

LDA #$04 ;CONSTANT

STA P5C1,X

DEX

BPL PALSTFLP

LDA #$00 ;LAST BUT NOT LEAST: BACKGRND

STA BACKGRND

 

RTS

 

INITLOGO

LDX #23

FILLLOGO LDA LOGOTBL,X

STA DLLIST,X

DEX

BPL FILLLOGO

 

 

LDA #$4C

STA HANDLER

LDA #L(DLIHSC0) ;SET UP DLI POINTER FOR THE DLI

STA DLIPTR ;OF TITLEPAGE

LDA #H(DLIHSC0)

STA DLIPTR+1

 

JMP TITLOGO ;COMMON TITLE PAGE AND LOGO INITS.

 

TITBL ;22 HEADERS = 66 BYTES LONG

; FIRST THE 25 BLANK LINES

DB $4F,H(NULHDR),L(NULHDR)

DB $48,H(NULHDR),L(NULHDR)

 

; VISIBLE SCREEN HAS 192 LINES

; FIRST WE HAVE 24 BLANK LINES

DB $47,H(NULHDR),L(NULHDR)

DB $4F,H(NULHDR),L(NULHDR)

 

; THEN WE HAVE 6 ZONES OF EIGHT HIGH FOR TITLE AND LOGO

DB $C7,H(DL0),L(DL0) ;1ST ZONE TIT PG. WITH INTER.

DB $47,H(DL1),L(DL1) ;2ND ZONE OF TIT PG

DB $47,H(DL2),L(DL2) ;3RD ZONE OF TIT PG

DB $47,H(DL3),L(DL3) ;4TH ZONE OF TIT PG

DB $47,H(DL4),L(DL4) ;5TH ZONE OF TIT PG

DB $47,H(DL5),L(DL5) ;6TH ZONE OF TIT PG

 

; THEN THERE ARE 64 MORE BLANK LINES

DB $4F,H(NULHDR),L(NULHDR)

DB $4F,H(NULHDR),L(NULHDR)

DB $4F,H(NULHDR),L(NULHDR)

DB $4F,H(NULHDR),L(NULHDR)

 

; NOW WE HAVE ONE PLAYER MAP: 8 LINES

DB $C7,H(DLY),L(DLY)

 

; THEN TWO BLANK LINES

DB $41,H(NULHDR),L(NULHDR)

 

; DIFFICULTY LEVEL: 8 LINES

DB $47,H(DL6),L(DL6)

 

; TWO BLANK LINES

DB $41,H(NULHDR),L(NULHDR)

 

; TWO PLAYER MAP: 8 LINES

DB $47,H(DLZ),L(DLZ)

 

; 8 BLANK LINES

DB $47,H(NULHDR),L(NULHDR)

; COPYRIGHT MESSAGE: 8 LINES

DB $47,H(DL7),L(DL7)

; 16 BLANK LINES

DB $43,H(NULHDR),L(NULHDR)

; 16 MORE: 8 OF WHICH ARE ON THE SCREEN AND 8 WHICH ARE NOT

DB $4F,H(NULHDR),L(NULHDR)

; THE REMAING 32 ARE OFF THE SCREEN

DB $4F,H(NULHDR),L(NULHDR)

DB $CF,H(NULHDR),L(NULHDR) ;25 NEEDED, EXTRA FOR SAFETY

 

CRIGHTBL DB L(CRIGHT),L(BLANKCHR),L(A),L(T),L(A),L®,L(I),L(BLANKCHR)

DB 1,9,8,4 ;12 LONG EGGHEAD

 

LOGOTBL ;DLL FOR LOGO ON HSC

;8 HEADERS 24 BYTES LONG

; FIRST THE 24 BLANK LINES ---TRUST ME, MGF

DB $CF,H(NULHDR),L(NULHDR) ;DLI HERE TO SET COLORS AND STUFF

DB $47,H(NULHDR),L(NULHDR)

 

; THEN WE HAVE 6 ZONES OF EIGHT HIGH FOR TITLE AND LOGO

DB $47,H(DL0),L(DL0) ;1ST ZONE TIT PG.

DB $47,H(DL1),L(DL1) ;2ND ZONE OF TIT PG

DB $47,H(DL2),L(DL2) ;3RD ZONE OF TIT PG

DB $47,H(DL3),L(DL3) ;4TH ZONE OF TIT PG

DB $47,H(DL4),L(DL4) ;5TH ZONE OF TIT PG

DB $47,H(DL5),L(DL5) ;6TH ZONE OF TIT PG WITH INTER

 

* HEADERS FOR WINGS

TITZN0TB DB L(WINGMAP0),$60,H(WINGMAP0),$2C,0

TITZN1TB DB L(WINGMAP1),$60,H(WINGMAP1),$2C,0

 

TITZN2TB DB L(WINGMAP2),$60,H(WINGMAP2),$3A,0

TTZN2TB2 DB L(WINGMAP2+14),$60,H(WINGMAP2+14),$3A,112

 

TITZN3TB DB L(WINGMAP3),$60,H(WINGMAP3),$2E,8

TITZN4TB DB L(WINGMAP4),$60,H(WINGMAP4),$2E,8

TITZN5TB DB L(WINGMAP5),$60,H(WINGMAP5),$36,40

 

* HEADERS FOR CREST

CRTB1 DB L(CRSTMAP1),$60,H(CRSTMAP1),$54,32

CRTB2 DB L(CRSTMAP2),$60,H(CRSTMAP2),$56,40

CRTB3 DB L(CRSTMAP3),$60,H(CRSTMAP3),$5C,64

CRTB4 DB L(CRSTMAP4),$60,H(CRSTMAP4),$5E,72

CRTB5 DB L(CRSTMAP5),$60,H(CRSTMAP5),$5E,72

 

* HEADERS FOR ALL PARTS OF 'DESERT FALCON' TEXT

DSTOPSTP DB L(TITCHR1),$94,H(TITCHR1),28

FCTOPSTP DB L(TITCHR13),$94,H(TITCHR13),84

DSBOTSTP DB L(TITCHR7),$94,H(TITCHR7),28

FCBOTSTP DB L(TITCHR19),$94,H(TITCHR19),84

DSSTPSTP DB L(TITCHR1),$74,H(TITCHR1),32

FCSTPSTP DB L(TITCHR13),$74,H(TITCHR13),88

DSSBTSTP DB L(TITCHR7),$74,H(TITCHR7),32

FCSBTSTP DB L(TITCHR19),$74,H(TITCHR19),88

 

* HEADERS FOR DIFFICULTY MAPS

NOVHDTBL DB L(NOVMAP),$60,H(NOVMAP),$BA,12

STDHDTBL DB L(STDMAP),$60,H(STDMAP),$B8,44

ADVHDTBL DB L(ADVMAP),$60,H(ADVMAP),$B8,84

EXPHDTBL DB L(EXPMAP),$60,H(EXPMAP),$BA,124

 

* HEADER FOR CRIGHT MESSAGE

CRHDTBL DB L(CRMAP),$60,H(CRMAP),$14,56

 

* CHAR MAP TABLE FOR WINGS

WNGMPTB0 DB L(WINGS3),L(WINGS4),L(WINGS4),L(WINGS4),L(WINGS4),L(WINGS4)

DB L(WINGS4),L(WINGS4),L(WINGS4),L(WINGS5),L(WINGS3),L(WINGS4)

DB L(WINGS4),L(WINGS4),L(WINGS4),L(WINGS4),L(WINGS4),L(WINGS4)

DB L(WINGS4),L(WINGS5),L(WINGS3)

 

* CHAR MAP TABLE FOR DIFFICULTY MAP

DIFTBL DB L(N),L(O),L(V),L(I),L©,L(E),L(S),L(T),L(A),L(N),L(D),L(A)

DB L®,L(D),L(A),L(D),L(V),L(A),L(N),L©,L(E),L(D)

DB L(E),L(X),L(P),L(E),L®,L(T)

 

* PALETTES FOR TITLE PAGE

PALWD1 DB $31,$3A,$16 ;PALETTE 1 USED FOR WINGS

PALWD2 DB $00,$00,$31 ;CREST (NOT THE TOOTHPASTE!)

PALWD3 DB $11,$10,$10 ;SHADOWS

PALWD4 DB $1B,$37,$44 ;TITLE

 

* CHAR MAPS FOR ONE AND TWO PLAYER SHIT

MOONTBL DB L(BLANKCHR),L(O),L(N),L(E),L(BLANKCHR),L(P),L(L),L(A),L(Y)

DB L(E),L®

PLUTOTBL DB L(T),L(W),L(O),L(BLANKCHR),L(P),L(L),L(A),L(Y),L(E),L®,L(S)

 

* THIS TURNS ON THE BRIGHTNESS OF THE CURRENT DIFFICULTY LEVEL

DIFFTWID

LDX #3

DULLOUT LDY DLDEXTBL,X ;FIRST DULL THEM ALL OUT

LDA DFPWDLL,X

STA DL6,Y

DEX

BPL DULLOUT

 

LDX DIFCULTY ;THEN BRIGHTEN THE CORRECT ONE

LDY DLDEXTBL,X

LDA DFPWBRT,X

STA DL6,Y

RTS

 

* WRITES DIFF LEVEL AND NUM. PLAYERS INTO TIT PAGE DISPLAY

DLDEXTBL DB 3,8,13,18

DFPWBRT DB $1A,$18,$18,$1A ;BRIGHT

DFPWDLL DB $BA,$B8,$B8,$BA ;DULL

 

PLAYTWID ;TURN ON CORRECT PLAYER

LDA #$10 ;TURN ON: PALETTE 0, WIDTH 12

LDY #$B0 ;TURN OFF: PALETTE 3, WIDTH 12

 

LDX NUMPLYRS

DEX

BNE TWOTWO

 

STY DLY+8 ;TURN OFF TWO PLAYERS

STA DLZ+8 ;TURN ON ONE PLAYER

RTS

 

TWOTWO STA DLY+8 ;TURN ON TWO PLAYERS

STY DLZ+8 ;TURN OFF ONE PLAYER

RTS

 

**********RANDOM INITS**********************************************************

* ABSZERO: ZEROES OUT 7800 RAM

ABSZERO

LDA #$18 ;zero out absolute memory

STA PTR0+1 ;this does pages 18 - 20

LDA #0

STA NULHDR

STA NULHDR+1

STA PTR0

TAY

ABSZERLP STA (PTR0),Y

DEY

BNE ABSZERLP

INC PTR0+1

LDX PTR0+1

CPX #$20

BNE ABSZERLP

 

LDX #$22 ;THIS DOES PAGES 22 THRU 27

STX PTR0+1 ;A BETTER BE ZERO HERE OR ELSE

REST0LP STA (PTR0),Y

DEY

BNE REST0LP

INC PTR0+1

LDX PTR0+1

CPX #$28

BNE REST0LP

 

RTS

 

* DLYZFILL: FILLS CHAR MAP AT BOTTOM OF SCREEN

DLYZFILL

LDX #$E

YZFILL LDA YFILL,X

STA DLY,X

LDA ZFILL,X

STA DLZ,X

DEX

BPL YZFILL

RTS

 

 

* BLANKMAP: BLANKS OUT CHARACTER MAP ON BOTTOM OF SCREEN

BLANKMAP

LDX #39 ;BLANK OUT CHARACTER MAP ON BOTTOM

LDA #L(BLANKCHR)

LULUPE STA PL1MAP,X

STA PL1LVMAP,X

DEX

BPL LULUPE

RTS

 

* IOINIT: INITIALIZE SOFTWARE IO REGISTERS

IOINIT

LDA #$0B

STA SWCHBIO

STA OLDSWCHB

LDA #$FF

STA LEFTBUT+1

STA LEFTBUT

STA RIGHTBUT

STA RIGHTBUT+1

RTS

 

**********TOTINIT***************************************************************

TOTINIT

JSR ABSZERO ;ZERO OUT ABSOLUTE MEMORY

JSR BLANKMAP ;BLANK OUT CHARACTER MAP

JSR DLYZFILL ;FILL DLISTS FOR BOT OF SCREEN DISPLAY

JSR IOINIT ;INITIALIZE SOFTWARE IO REGISTERS

JSR SCRAPALL ;KILLS ALL TUNES

JSR COLINIT ;INITIALIZE PALETTES

 

LDX #59 ;COPY DISPLAY LIST LIST

DLLLOOP LDA DLTBL,X

STA DLLIST,X

DEX

BPL DLLLOOP

 

LDX #3

STFLIST

LDY ZREFTBL,X ;INIT LIST REF PNTS

LDA IDXTBL,X

STA DXTBL,Y

STA DFTBL,Y

LDA IRLTBL,X

STA RLTBL,Y

LDA ILLTBL,X

STA LLTBL,Y

DEX

BPL STFLIST

 

;THIS LOOP SETS UP SCROLLING OBJECT AREA TO BE EMPTY

 

LDA #SCRENBOT+1

LDX #79 ;FILL VPTBL WITH SCRENBOT+1'S

 

FILLVPLP STA VPTBL,X

DEX

BPL FILLVPLP

 

; THIS LOOP INITIALIZES THE SCROLLING OBJECT QUEUE

LDX #PYRSTOP-PYRSTART

LDY #PYRSTART

KILLJACK TYA

STA SLOTQ,X

INY

DEX

BPL KILLJACK

 

LDA #0

STA SLOTGPTR

STA SLOTRPTR

 

; THIS LOOP INITIALIZES THE SCROLLING OBJECT BUFFER

LDX #9

STX FRBUFPTR ;INIT STACK POINTER

ISOBLOOP LDA #-1

STA STAMPID,X

TXA

STA FRBUFSTK,X ;PUT ALL BUFFER LOCATIONS IN FREE STACK

DEX

BPL ISOBLOOP

 

; THIS LOOP INITIALIZES THE MINI SPHINX TABLE

LDX #MININUMB-1

LDA #$FF

MINITLP STA MINITBL,X

DEX

BPL MINITLP

 

; THIS LOOP INITIALIZES THE FIRE POT TABLE

LDX #FIRENUMB-1

LDA #$FF

FIRETLP STA FIRETIP,X

DEX

BPL FIRETLP

 

; OF COURSE, X IS NOW FF

STX HIEROSLT ;SLOT NUMBER FOR HIERO ANIMATION

STX IOSIM ;SIMULATED JOYSTICK INPUT OF FF

STX ZONEOFF

STX UWEOK ;OK TO START UWE

STX WAITCNT ;REST WAIT COUNTER

STX OSCRLCNT

DEX ;AND AN FE

STX JERKOFF

 

LDA #80 ;THIS IS DEFINED IN GAME AS ZBIRDZ

STA ZTBL+ZBIRD

 

LDA #H(CHARS) ;CHARBASES

STA CHARBASE

STA D11CBASE

 

;

; INITIALIZE DISPLAY LISTS

;

LDX #11

LDA #L(DL11)

STA PTR0

UPTOP LDA HIBYE,X

STA PTR0+1

LDY #6 ;Y=6

LDA #00

STA (PTR0),Y ;TO END DMA

DEY ;Y=5

STA (PTR0),Y ;TO END DMA

DEY ;Y=4

STA (PTR0),Y ;HPOS

DEY ;Y=3

LDA #ZPALWID

STA (PTR0),Y

DEY ;Y=2

LDA #H(ZBUFFB)

STA (PTR0),Y

DEY ;Y=1

LDA #$60 ;160X2 INDIRECT MODE

STA (PTR0),Y

DEY ;Y=0

LDA #L(ZBUFFB)

STA (PTR0),Y

DEX

BPL UPTOP

 

;MORE RANDOM INITIALIZATIONS

LDA #1 ;1

STA NEXFRAME

LDA #8 ;NUMBER OF FLEAS AVAILABLE

STA NUMFLEAS ;THE SCREEN

LDA #11

STA BUFDEX

 

LDA #2 ;2

STA FIRECNT

 

;

; CODE TO SET UP FOR LOADER

;

LDX #23

LDY #H(DL11)

INITLP9 STY ZNDLPOS,X

DEY

DEX

DEX

BPL INITLP9

 

LDA #H(DL8) ;MULTIMEGAHACK

STA ZNDLPOS+17

LDA #H(DL9)

STA ZNDLPOS+19

;INITIALIZE LISTS WITH REFERENCE

LDA #ZREF0 ;POINTS

STA LOWEST

LDA #ZREF3

STA HIGHEST

 

LDX #ZSHAD ;INSERT SHADOW AND BIRD INTO LIST

LDA #$FE

STA TEMP6

STA TEMP10

JSR OBJINS

LDX #ZBIRD

LDA #50

STA TEMP6

LDA #60

STA TEMP10

JSR OBJINS

 

;SET UP PW'S FOR THINGS THAT ARE CONSTANT

;PUT SHTBL IN ROM

TESTHERE LDA #$1C

STA PWTBL+ZBIRD

LDA #$3C

STA PWTBL+ZSHAD

 

;AND SOME HIGH BYTES

 

LDA #H(BIRDFMS) ;STORE SH'S AND SM'S

STA SHTBL+ZBIRD

STA SHTBL+ZSHAD

CLC

ADC #1

STA SMTBL+ZBIRD

STA SMTBL+ZSHAD

 

LDX #3

STFLP

LDA #$3E

STA PWTBL+SHOTSHAD,X

STA PWTBL+SPXSHTSH,X

 

LDA #$1E ; PALETTE 0, 8 WIDE

STA PWTBL+ZSHOT1,X

LDA #$9E

STA PWTBL+SPHXSHOT,X

 

LDA #H(SHOTAN0)

STA SHTBL+ZSHOT1,X

STA SHTBL+SHOTSHAD,X

CLC

ADC #1

STA SMTBL+ZSHOT1,X

STA SMTBL+SHOTSHAD,X

 

LDA #H(SPSHOTST) ;SPHINX SHOT

STA SHTBL+SPHXSHOT,X

STA SHTBL+SPXSHTSH,X

CLC

ADC #17-5

STA SMTBL+SPHXSHOT,X

STA SMTBL+SPXSHTSH,X

 

LDA #L(SPSHOTST) ;SPHINX SHOT

STA SLTBL+SPHXSHOT,X

STA SLTBL+SPXSHTSH,X

 

LDA IPTBLLO,X ;INIT CIRCULAR BUFFER FOR LOOKAHEAD

STA PTRTBLLO,X ;CHAR MAP POINTER TABLE TO DIRT ONLY

 

LDA IPTBLHI,X

STA PTRTBLHI,X

 

DEX

BPL STFLP

 

;THOSE TRICKY SM'S

 

LDA #2

STA SCRATE

 

LDA MASK9L+2 ;STUFF MASKS AS WELL

STA LEFTMASK

LDA MASK9L+1

STA LEFTMASK+1

LDA MASK9L

STA LEFTMASK+2

LDA MASK9L+3

STA LEFTMASK+3

 

LDA MASK9R+2 ;STUFF MASKS AS WELL

STA RIGTMASK

LDA MASK9R+1

STA RIGTMASK+1

LDA MASK9R

STA RIGTMASK+2

LDA MASK9R+3

STA RIGTMASK+3

 

LDX #2

STX STUFFDEX

INX

STX LOADFDEX

RTS

 

IDXTBL DB 2*NUMBER,200,140,80

ILLTBL DB $FF

ZREFTBL DB ZREF0

IRLTBL DB ZREF1,ZREF2,ZREF3,$FF

 

IPTBLLO DB L(BLOCK9+66),L(BLOCK9+33),L(BLOCK9),L(BLOCK9+99)

IPTBLHI DB H(BLOCK9+66),H(BLOCK9+33),H(BLOCK9),H(BLOCK9+99)

 

TOTINIT2

JSR MCPINIT2

 

LDA #$F1 ;DO SCROLLS TO FILL SCREEN

JSRAGAIN

PHA

JSR VSCRP

JSR RANDOM

JSR GRNDMCP

JSR SCRLOAD

JSR NEWBLOCK

LDA #0

STA GSCRFLAG

STA GCOARSE

JSR SCROLL

PLA

TAY

DEY

TYA

BNE JSRAGAIN

 

LDA #0

STA SCRATE ;TO STOP SCROLLING

STA SCROLLS ;TO KEEP FROM SCROLLING AGAIN

 

JSR CLRPFLGS

JSR PLACEMNT ;PUT THAT BIRD DOWN

; THIS DOES PROJECTION

LDA SHADANAD,Y

STA SLTBL+ZSHAD

 

LDA #L(DLLIST) ;SET UP DLIST LIST POINTER

STA DPPL

LDA #H(DLLIST)

STA DPPH

 

LDA #L(DLITOP) ;INTERRUPT SHIT

STA DLIPTR

LDA #H(DLITOP) ;ONLY TIME DLIPTR+1 IS STORED!!!!

STA DLIPTR+1

 

LDA #$80

STA RUNLOAD ;FLAG TO ENABLE LOADER

JSR LOADER ;once for good luck

 

RTS

 

INITGAME LDA #L(GAMSTATE)

STA STATEPTR

LDA #H(GAMSTATE)

STA STATEPTR+1

 

JSR INITNPLR

 

LDA #5

STA PL1LIVES

STA PL2LIVES

 

LDA #40 ;UNDO AUTO PLAY HACK

STA DLZ+9

 

LDA #$50 ;SET UP TREASURE BASE VALUE

STA TRVAL1+1

STA TRVAL2+1

 

LDA #1 ;INITIALIZE TREASURE MULTIPLIERS

STA JEWCNT

STA JEWCNT+1

STA BARCNT

STA BARCNT+1

STA EGGCNT

STA EGGCNT+1

 

BCKSTART ;STARTUP BACKGROUND TUNE

LDX #1

BCKINTLP LDA #$0

STA VBRUN,X

LDA #$1

STA DBK0,X

LDA #$FF

STA TBINDX0,X

STA CBINDX0,X

STA VBINDX0,X

DEX

BPL BCKINTLP

 

RTS

 

PLYONTBL DB L(BLANKCHR),L(BLANKCHR)

DB L(P),L(L),L(A),L(Y),L(E),L®,L(BLANKCHR),L(O),L(N),L(E)

DB L(BLANKCHR),L(BLANKCHR)

PLYTWTBL DB L(BLANKCHR),L(BLANKCHR)

DB L(P),L(L),L(A),L(Y),L(E),L®,L(BLANKCHR),L(T),L(W),L(O)

DB L(BLANKCHR),L(BLANKCHR)

 

INITNPLR LDX #13 ;THERE ARE BETTER WAYS BUT THIS IS MOST

GETCHA LDA PLAYER ;BYTE EFFICIENT I THINK AND WE'RE NOT

BEQ BLAH ;CONCERNED ABOUT TIME HERE

LDA PLYTWTBL,X

BNE BLAH2 ;THE ONLY ZERO CHARACTER IS ZERO

BLAH LDA PLYONTBL,X

BLAH2 STA BOTMSMAP+3,X

DEX

BPL GETCHA

 

JSR BCKSTART ;START BACKGROUND TUNE

 

LDA #$16 ;TURN ON PALETTE

LDY #$B6 ;TURN OFF PALETTE

LDX PLAYER

BNE TWOISUP

 

STA DLY+3 ;PLAYER ONE IS UP: TURN ON HIS SCORE

STA DLZ+3 ;AND LIVES

STY DLY+13 ;TURN OFF PLAYER TWO'S LIVES AND SCORE

STY DLZ+13

RTS

 

TWOISUP STA DLY+13 ;PLAYER TWO IS UP: TURN ON HIS SCORE

STA DLZ+13 ;AND LIVES

STY DLY+3 ;TURN OFF PLAYER ONE'S LIVES AND SCORE

STY DLZ+3

RTS

 

 

INITAUTO LDA #L(ATOSTATE)

STA STATEPTR

LDA #H(ATOSTATE)

STA STATEPTR+1

 

LDA #38 ;CENTER 'DESERT FALCON' IN BOTMSMAP

STA DLZ+9

 

LDX #12

GGJJ2 LDA SPHTBL,X

STA BOTMSMAP+4,X

DEX

BPL GGJJ2

RTS

 

 

YFILL DB L(PL1MAP),$60,H(PL1MAP),$16,0

DB L(TOPMSMAP),$60,H(TOPMSMAP),$2C,40

DB L(PL2MAP),$60,H(PL2MAP),$16,120

 

ZFILL DB L(PL1LVMAP),$60,H(PL1LVMAP),$16,0

DB L(BOTMSMAP),$60,H(BOTMSMAP),$4C,40

DB L(PL2LVMAP),$60,H(PL2LVMAP),$16,120

 

DLTBL DB $4F,H(NULHDR),L(NULHDR),$C8,H(NULHDR),L(NULHDR)

DB $4F,H(DL0),L(DL0),$4F,H(DL1),L(DL1)

DB $4F,H(DL2),L(DL2),$4F,H(DL3),L(DL3),$4F,H(DL4),L(DL4)

DB $4F,H(DL5),L(DL5),$4F,H(DL6),L(DL6),$4F,H(DL7),L(DL7)

DB $4F,H(DL8),L(DL8),$4F,H(DL9),L(DL9),$4F,H(DL10),L(DL10)

DB $CF,H(DL11),L(DL11),$C0,H(NULHDR),L(NULHDR)

;one blank line to clean up dma mess

DB $47,H(DLY),L(DLY),$47,H(DLZ),L(DLZ)

DB $CF,H(NULHDR),L(NULHDR),$46,H(NULHDR),L(NULHDR)

 

* FOR PAL HACKING

* DB $4F,H(NULHDR),L(NULHDR),$4F,H(NULHDR),L(NULHDR)

* DB $4F,H(NULHDR),L(NULHDR),$4B,H(NULHDR),L(NULHDR)

 

DB $CF,H(NULHDR),L(NULHDR)

 

 

SPHTBL DB L(D),L(E),L(S),L(E),L®,L(T),L(BLANKCHR),L(F),L(A),L(L),L©

DB L(O),L(N)

 

END

* SPHINX--SKERNEL.S

 

ZERODEF

 

RSEG CODE9

 

*************** ALL DLI'S MUST START ON SAME PAGE!!!!!! ***********

 

 

* DLITOP ;FIRST DLI TAKES PLACE AT TOP OF SCREEN

DLITOP ;SAVE REGISTERS

PHA ;A,X,Y USED

TXA

PHA

TYA

PHA

 

LDA #$50 ;RESTORE CTRL TO ITS OWN STATE

STA CTRL

 

LDA P0C2SHAD ;RESTUFF PALETTES FOR GAME SCREEN

STA P0C2 ;SHOULD PROBABLY BE DONE WITH SHADOWS

LDA P1C2SHAD

STA P1C2 ;5/25/84

LDA P2C2SHAD

STA P2C2

LDA P5C2SHAD ;TO UNDO OTHER HACK JEM: 5/14/84

STA P5C2

 

CLD ;RANDOM IS CALLED HERE, SO CLD

; BIT FUCKFLAG ;PUT THESE BACK TO SEE IF LOADER IS

; BPL FINE ;INTERRUPTED BY THIS DLI

; GOTCHA NOP

;REMEMBER THIS DLI HAPPENS EARLIER NOW!

FINE LDA DLZDEST ;CHANGE DLIPTR

STA DLIPTR

JSR RANDOM ;RANDOM NUMBER GENERATOR

STA WSYNC

LDA BACKCOL ;TURN ON BACKGROUND COLOR

STA BACKGRND

 

BIT FUCKFLAG

BPL DONTFUCK

 

JSR DOZEROS ;PUT ZEROS AT END OF DISPLAY LISTS

 

DONTFUCK PLA ;RESTORE REGISTERS

TAY

PLA

TAX

PLA

RTI

 

 

* DLIZ11 ;THIS MUST BE DONE AT END OF ZONE10 TO

* SET CHARBASE FOR ZONE11. POTENTIALLY A SHORT ZONE AND MAY BE FOLLOWED BY ONE

DLIZ11

PHA

LDA D11CBASE

STA WSYNC ;WAIT UNTIL END OF ZONE 10

STA CHARBASE

LDA #L(DLIBOT)

;DMA SHOULD KICK IN HERE

STA DLIPTR ;NEED TO HAVE TIME TO DO THIS STORE

PLA

RTI

 

 

* DLISNCTT SYNCING DLI FOR TITLE PAGE

DLISNCTT

PHA

LDA #L(DLITIT)

JMP SYNCSAME

 

* DLISYNC SYNCING DLI FOR REGULAR SCREEN

DLISYNC ;THIS IS THE SYNCIN' DLI

PHA ;ARE WE SURE THIS IS CORRECT??

LDA #L(DLITOP)

SYNCSAME STA WSYNC

STA WSYNC ;THIS SHOULD BE END OF KERNEL

 

BIT MSTAT

BPL UNSYNC ;PUNT IF IN KERNEL

BIT MSTAT

BPL UNSYNC

 

STA DLIPTR

 

UNSYNC

PLA

RTI

 

 

* DLZ11A ;ALTRNTE. DLI HANDLER FOR 1 LINE ZONE11

DLZ11A

PHA

 

LDA D11CBASE

STA WSYNC ;WSYNC TO FINISH ZONE 10

STA CHARBASE ;NEW CHARBASE FOR ZONE 11

 

 

* THIS IS FUNCTIONALITY OF DLIBOT WHICH IS SKIPPED WHEN ZONE11 IS 1 HIGH

LDA #L(DLISYNC)

STA DLIPTR

STA WSYNC ;THIS SHOULD FINISH ZONE 11

 

LDA #H(CHARS)

STA CHARBASE ;THIS IS CHARBASE FOR SCORE

 

LDA #$43

STA WSYNC

 

STA CTRL ;CTROL VALUE FOR 320 MODE

 

LDA #0 ;BLACK BACKGROUND

STA BACKGRND

 

JMP NOWLOAD

 

* DLITIT TITLE PAGE DLI

DLITIT ;ALL THESE REGISTERS MAY NOT HAVE TO

PHA ;BE SAVED

TXA

PHA

TYA

PHA

 

LDA #H(TITCHR1)

STA CHARBASE

 

LDA #$50 ;COMMENT

STA CTRL

 

JSR DOALLIO

INC FRMCNT

BNE SHITT

INC STATIMER

 

SHITT

LDA #L(DLITIT2)

STA DLIPTR

LDA #H(DLITIT2)

STA DLIPTR+1

 

PLA

TAY

PLA

TAX

PLA

RTI

 

* DLITIT2 ;SETS CHARBASE FOR CHAR FONT AT BOTTOM

DLITIT2 ;SECOND TITLE PAGE DLI

PHA

 

LDA #H(CHARS)

STA CHARBASE

 

LDA #$43

STA CTRL

 

LDA #L(DLISNCTT)

STA DLIPTR

LDA #H(DLISNCTT)

STA DLIPTR+1

 

PLA

RTI

 

* DLIBOT ;THIS MUST BE DONE IN DLI AT END OF

DLIBOT ;REGULAR ZONES

PHA

;DLI TO CHANGE BACKGROUND COLOR

 

LDA #H(CHARS)

STA CHARBASE

STA WSYNC ;THIS SHOULD FINISH ZONE 11

 

LDA #L(DLISYNC)

STA DLIPTR

 

LDA #$43 ;CTRL FOR 320 MODE

STA WSYNC

 

STA CTRL

 

LDA #0 ;BLACKGROUND

STA BACKGRND

 

NOWLOAD

* COLOR CHANGES FOR BOTTOM OF SCREEN DISPLAY

LDA #$06 ;THESE ARE HARDWIRED NOT THE ONES AT

STA P5C2 ;TOP OF SCREEN

LDA P1C2SHDB ;SHADOW NEEDED HERE

STA P1C2 ;FOR TOPMSMAP

LDA #$3E

STA P2C2 ;FOR BOTMSMAP

LDA #$EF

STA P0C2 ;FOR SCORE AND XTRA LIVES

 

TXA

PHA

TYA

PHA

 

CLD ;ONLY NEEDED FOR DLI'S WHICH ADD OR SUB

 

* FREEZE FRAMER

FRZFRMR BIT FREEZEP

BPL DOTODO

 

LDA PERIOD

BEQ NOTHING

 

DEC NEXFRAME

BNE NOTHING

 

STA NEXFRAME

 

LDX HOWMANY

BEQ DOTODO

DEX

STX HOWMANY

BNE DOTODO

 

LDX #0

STX PERIOD

INX

STX NEXFRAME

 

DOTODO INC FRMCNT ;GO FOR FRMCNT

BNE BLAH

INC STATIMER ;IT IS TWO BYTES

 

BLAH DEC SECOND ;SECOND COUNTER

BPL NOTSECND

 

LDA #59 ;START NEXT SECOND

STA SECOND

 

LDA PHASE ;TIME THE BONUS RACK

CMP #-2

BNE NOTBONUS ;NOT IN BONUS RACK

 

SED

LDA BNSTIMER

SEC

SBC #1

STA BNSTIMER

CLD

BNE NOTBONUS ;NOT DONE WITH BONUS

 

JSR LDTREAS ;DISPLAY ZERO SECONDS

 

DEC PHASE ;GOTO FLASH PHASE

LDA #FLASHT0

JSR TUNIN

LDA #FLASHT1

JSR TUNIN

 

NOTBONUS LDA PTIMER ;POWER TIMER

BEQ NOTSECND

 

DEC PTIMER

BNE NOTSECND

 

JSR CLRPFLGS ;CLEAR TIMED POWER FLAGS

 

NOTSECND LDA FRMCNT ;DISPATCH ON ODD OR EVEN

LSR A

BCC DOTUNE

 

DOLOAD BIT RUNLOAD

BPL DOTUNE

JSR SCROLL ;ON ODD, SCROL CMAPS AND RUN LOADER

JSR LOADER

LDA #0

STA RUNLOAD

 

DOTUNE JSR TUNER ;TUNE DRIVER

JSR RUNBACK ;UPDATE BACKGROUND TUNE

JSR BACKON ;CHECK TO PUT ON BACKGOUND TUNE. IF

;SO, SWAP IT IN

 

NOTHING

JSR DOALLIO

 

INTEROUT

PLA ;RESTORE REGISTERS

TAY

PLA

TAX

PLA

RTI

 

ZERO EQU 0

 

DLIHSC0

PHA

TXA

PHA

TYA

PHA

;DO COLORS, CHARBASE, AND CONTROL

LDA #H(TITCHR1)

STA CHARBASE

 

LDA #$50

STA CTRL

 

LDA #L(DLIHSC1) ;SAME PAGE I HOPE

STA DLIPTR

 

LDA #$0F

STA P0C2

 

LDA #$3A

STA P1C2

 

LDA #$00

STA P2C2

 

LDA #$10

STA P3C2

 

LDA #$37

STA P4C2

 

JSR TUNER ;RUN THE TUNES

 

PLA

TAY

PLA

TAX

PLA

RTI

 

DLIHSC1

PHA

TXA

PHA

TYA

PHA

 

LDA #L(DLIHSC0)

STA DLIPTR

 

JSR HSCSETRS ;RESETS WAT'S REG'S

 

JMP INTEROUT

 

********************************************************************************

* *

* STARTUP *

* *

********************************************************************************

 

STARTUP SEI ;HARDWARE DEPENDENT INITS

CLD

; LDA #$07 ;LOCK ME IN MARIA MODE

LDA #$87 ;PUT THIS IN WHEN WE HAVE 2BUT HARDWARE

STA $1

LDA #0 ;FOR FUTURE EXPANSION AND IMPERIALISM

STA OFFSET

LDX #$FF ;STACK POINTER AT $1FF

 

TXS

 

LDX #$7F ;KEEP COLOR BURST ON

STX CTRL ;TURN OFF DMA

 

LDY #$FF ;zero out zero page

ZERLOOP

CPY #CTRL ;DON'T STORE TO CTRL AGAIN

BEQ NOSTOR ;TO AVOID TURNING ON DMA

STA ZERO,Y

NOSTOR DEY

BNE ZERLOOP

 

LDA #0 ;ENOUGH TIME HAS ELAPSED TO ALLOW CAPS

STA $1 ;TO DISCHARGE SO CONTINUE FUCKING WITH

LDA #$14 ;IO HARDWARE

STA CTLSWB

LDA #0 ;SELECT TWO BUTTON MODE

STA SWCHB

 

LDX #$40 ;POWER UP GETS THIS ONE

LDA #0

LEVEL1LP STA ZERO,X

INX

BNE LEVEL1LP

JSR PREINIT ;THIS SETS UP THE POWER UP DEFAULT

JSR INITIT

;MODES FOR THE GAME

JMP VBLNK

 

GAMEDO ;RESETS GO TO HERE

LDX #FUTEXP1

LDA #0

LEVEL2LP STA ZERO,X

INX

BNE LEVEL2LP

JSR TOTINIT

JSR MCPINIT ;TAKEN OUT OF TOTINIT

JSR TOTINIT2

BIT GAMEU

BPL SHINIT

JSR INITGAME

JMP SHINIT

 

NEWPLYDO ;AUTOPLAY GOES HERE

LDX #FUTEXP2

LDA #0

LEVEL3LP STA ZERO,X

INX

BNE LEVEL3LP

JSR TOTINIT

JSR TOTINIT2

BIT TITLMENU ;TITLMENU?

BMI CKPLR

JSR INITIT ;YES, JSR INITIT AND CONTINUE

JMP VBLNK

CKPLR BIT NEWPLYR

BPL ATOCK

JSR INITNPLR

JMP SHINIT

ATOCK BIT AUTOPLAY

BPL SHINIT

JSR INITAUTO

JMP SHINIT

 

SHINIT

VBLNK BIT MSTAT ;WAIT FOR V BLANK

BPL VBLNK

BIT MSTAT ;DO WE STILL NEED TWO OF THESE???

BPL VBLNK ;NO

 

LDA #$50 ;FINALLY TURN ON DMA

STA CTRL

 

BIT NEWPLYR

BMI JFK

 

LDA #ALADIN1 ;START TUNE THIS IS BULLSHIT

JSR TUNIN ;COMMENTED OUT CAUSE I CANT STAND IT

LDA #ALADIN0

JSR TUNIN

 

JFK LDA #0 ;FLAGS JOB IS DONE SO RESET

STA NEWPLYR

 

 

MAINLOOP

LDA SWCHBIO ;GET CURRENT STATE OF IO

TAY ;TUCK SWCHBIO AWAY FOR NOW

EOR OLDSWCHB

BEQ CONTGAME ;NO CHANGE IN IO SO BRANCH

 

* CHANGE! IS IT A RESET?

LSR A ;CHECK FOR CHANGE IN RESET

BCC PCHKSLCT ;NO CHANGE SO CHECK SELECT

LSR OLDSWCHB ;CHECK OLD RESET BIT IF ZERO

;THEN WE'VE GOT A RESET

BCS CHEKSLCT ;OTHERWISE CHECK FOR SELECT

;CARRY CLEAR SO CHANGE IN RESET BIT

;& OLD VALUE OF ZERO INDICATES A RESET

GOTOGAME LDX #$7F ;DONT'T TURN OFF COLOR BURST

STX CTRL ;BUT DONT TURN OFF DMA

LDX #$FF

STX TITLMENU ;TURN OFF TITLMENU FLAG

STX GAMEU ;TURN ON GAME FLAG

INX

STX NEWPLYR ;MAKE SURE NEWPLYR IS OFF

STX PAUSE ;TURN OFF ALL OTHER STATE FLAGS

STX HSC ;FOR SECURITY

STX AUTOPLAY

STX DMA

STX GAMEOVR

STX PLAYER ;PLAYER 1 IS FIRST

JMP GAMEDO

 

* IS IT A SELECT?

PCHKSLCT LSR OLDSWCHB ;ACCUM. HAS EOR OF SWCHB AND OLDSWCHB

CHEKSLCT LSR A ;CHECK FOR SELECT BIT

BCC PPAWS ;NO SELECT CHECK FOR PAUSE NEXT

 

LSR OLDSWCHB ;POSSIBLE SELECT CHECK FOR 0 TO 1 TRANS

BCC MENOPAWS ;1 TO 0 TRANSITION SO IGNORE

;LOOKS LIKE A SELECT TO ME

BIT TITLMENU ;BUT ARE WE ALREADY IN TIT PGE. IF SO

BPL MENOPAWS ;PUNT

 

GOTOTIT LDX #0

STX STATIMER ;RESET STATIMER

STX GAMEU ;TURN OFF GAME IF ON

STX NEWPLYR ;TURN OFF NEWPLYR

STX TITLMENU ;TURN ON TITLMENU

STX AUTOPLAY ;TURN OFF AUTOPLAY

STX DMA ;TURN OFF DMA FLAG

STX GAMEOVR ;TURN OFF GAME OVER FLAG IF SET

 

NEWPLR LDX #$7F ;SWITCH PLAYERS BUT

STX CTRL

LDX #$FF

TXS ;THIS IS PROBABLY NOT NECESSARY

JMP NEWPLYDO ;GO TO TITLE PAGE

 

PPAWS LSR OLDSWCHB

MENOPAWS LSR A ;THIS JUST SETS A FLAG WHICH GAME LOOKS

LSR A ;AT. SHIFT TO CHECK PAUSE BIT

BCC CONTGAME

 

LSR OLDSWCHB ;CHECK TO SEE IF OLD VALUE IS LOW

LSR OLDSWCHB

BCS CONTGAME ;NOT LOW SO PUNT

 

LDA #$FF ;PAUSE BUTTON HAS BEEN PRESSED

STA PAWSTWID

 

CONTGAME STY OLDSWCHB

JMP (STATEPTR) ;JUMP TO APPROPRIATE STATE

 

 

* GAME STATE

GAMSTATE BIT GAMEOVR ;IF OVER BOOGIE ON TO TITLE PAGE

BPL NOGOTIT

 

LDX #$7F ;WHO THE FUCK KNOWS ANYWAY

STX CTRL

JSR HSPOWNIT

JSR HSGAMOVR

JMP GOTOTIT

 

NOGOTIT BIT NEWPLYR ;IF NOT OVER BUT NEW PLAYER RESET

BMI NEWPLR

 

BIT PAWSTWID

BPL JPDOGAME

;SET UP PAUSE STATE

LDX #$FF

STX FREEZEP ;TURN ON FREEZE FRAME

LDA #L(PSESTATE) ;INITIALIZE POINTER TO PAUSE

STA STATEPTR

LDA #H(PSESTATE)

STA STATEPTR+1

INX

STX GAMEU ;TURN OFF GAME FLAG

STX PAWSTWID ;TURN OFF PAUSE TWIDDLE

STX AUDV0 ;KILL SOUNDS

STX AUDV1 ;TUNER NEVER CALLED WHEN IN FREEZE MODE

JMP MAINLOOP

 

JPDOGAME JMP DOGAME

 

 

* PAUSE STATE

PSESTATE

BIT PAWSTWID

BPL JMNLP ;PAUSE TWIDDLE NOT SET SO JMP MAINLOOP

 

LDX #$FF ;GO BACK TO GAME STATE

STX GAMEU

 

INX

STX PAWSTWID

STX FREEZEP ;TURN OFF FREEZE FRAMER

STX PAUSE ;TURN OFF PAUSE

LDA #L(GAMSTATE) ;INITIALIZE POINTER FOR GAME STATE

STA STATEPTR

LDA #H(GAMSTATE)

STA STATEPTR+1

JMNLP JMP MAINLOOP

 

 

* TIT STATE

TITSTATE ;ONLY DO IT ONCE A FRAME???

LDA FRMCNT

CMP TITCNT

BEQ JMNLP

 

LDA FRMCNT

STA TITCNT

 

DEC OTIMER ;HAVE WE WAITED AFTER INITIAL START

BNE JMNLP ;OF TITLE PAGE

 

LDA #1 ;HACK TO DEACTIVATE OTIMER

STA OTIMER

 

BIT LEFTBUT ;CHECK FOR TRIGGER RESET

BMI SLDKFJ

 

JMP GOTOGAME ;BUTTON PRESSED, SO RESET TO GAME MODE

 

SLDKFJ LDA SWCHA ;ANY PLAYER ONE JOYSTICK INPUT RESET

AND #$F0 ;TIMER

CMP #$F0

BEQ NOTIMRST

LDA #0

STA STATIMER

 

NOTIMRST LDA SWCHB ;IS SELECT DEPRESSED?

AND #$02

BEQ CHKSTIM ;YES, BRANCH

 

LDA #$80 ;NO MAKE SURE TIMER ISN'T STARTED

STA STIMER

BMI DIFFCHK ;AND CONTINUE TO OTHER CODE

 

CHKSTIM LDA #0 ;IO HAS OCCURRED SO RESET TIT. PGE TIMR

STA STATIMER

 

LDA #$80 ;BLOW OTHER TIMERS OUT OF THE WATER

STA ETIMER ;SELECT SWITCH HAS PRIORITY OVER

STA WTIMER ;JOYSTICK

 

BIT STIMER ;HAS TIMER BEEN SET?

BMI CHGSETNG ;NO SO GO AHEAD AND CHANGE SETTING

 

DEC STIMER ;TIMER IS SET SO DECREMENT IT

BNE JMNLP ;PUNT IF NOT AT ZERO

 

CHGSETNG INC DIFCULTY ;CYCLE THROUGH DIFFICULTIES

LDA DIFCULTY

AND #$03

STA DIFCULTY

BNE TWIDIL

LDA NUMPLYRS

EOR #$03

STA NUMPLYRS

JSR PLAYTWID

TWIDIL JSR DIFFTWID

LDA #35

STA STIMER

JMP MAINLOOP

 

DIFFCHK LDA SWCHA

AND #$80 ;CHECK EAST BIT

BEQ CHKETIM ;YES

 

LDA #$80 ;NO, SO ENABLE EAST MOVEMENT

STA ETIMER

BMI CHKWEST

 

CHKETIM BIT ETIMER ;IS EAST MOVEMENT ENABLED?

BMI INCDIFF ;YES SO INC DIFFICULTY

 

DEC ETIMER ;NOT ENABLED SO WE MUST COUNT DOWN

BNE CHKWEST ;AND THEN GO AWAY

 

INCDIFF INC DIFCULTY ;INCREMENT DIFFICULTY LEVEL

LDA DIFCULTY

AND #$03

STA DIFCULTY ;WRAPAROUND

JSR DIFFTWID

LDA #35

STA ETIMER ;DISABLE EAST MOVEMENT AND SET TIMRE

 

CHKWEST LDA SWCHA

AND #$40

BEQ CHKWTIM

 

LDA #$80

STA WTIMER

BMI SELCHK

 

CHKWTIM BIT WTIMER

BMI DECDIFF

 

DEC WTIMER

BNE SELCHK

 

DECDIFF DEC DIFCULTY

LDA DIFCULTY

AND #$03

STA DIFCULTY

JSR DIFFTWID

LDA #35

STA WTIMER

 

SELCHK LDA SWCHA ;CHECK NORTH BIT FOR NUMBER OF PLAYERS

AND #$F0

CMP #$E0 ;SELECT

BNE CHKSOUTH

 

LDX #2

STX NUMPLYRS ;TWO PLAYERS

JSR PLAYTWID

 

JMP TIMCHK

 

CHKSOUTH ;A STILL HAD SWCHA AND F0

CMP #$D0 ;CHECK SOUTH BIT

BNE TIMCHK ;ACCUMULATOR STILL SET FROM LDA ABOVE

 

LDX #1

STX NUMPLYRS ;SET NUMBER OF PLAYERS TO ONE

JSR PLAYTWID

 

TIMCHK LDA STATIMER ;CHECK FOR TIMEOUT

CMP #4

BNE MJMP

 

LDX #$7F ;DONT' TURN OFF COLOR BURST

STX CTRL ;BUT TURN OFF DMA

 

JSR HSPOWNIT

JSR HSDISP ;DO HIGH SCORE CART DISPLAY

 

LDX #$7F ;WHEN IN DOUBT TURN OFF CTRL

STX CTRL

 

LDX #$FF

TXS

STX TITLMENU ;TURN OFF TITLEMENU

STX AUTOPLAY ;TURN ON AUTOPLAY

INX

STX STATIMER ;CLEAR TIMING FLAG

JMP NEWPLYDO

 

MJMP JMP MAINLOOP

 

 

* AUTOPLAY STATE

ATOSTATE BIT LEFTBUT ;CHECK FOR TRIGGER RESTART

BMI TIMCHKA

 

JMP GOTOGAME ;GO TO GAME STATE TRIGGER PRESSED

 

TIMCHKA LDA STATIMER ;MORE TIMEOUT CHECKS

CMP #5

BNE CHKSTK

 

GOTOSEL JMP GOTOTIT ;DON'T TURN OFF COLOR

 

CHKSTK LDA SWCHA ;CHECK FOR SELECT

AND #$F0

CMP #$F0

BNE GOTOSEL

 

 

* HSC STATE

HSCSTATE ;NOT IMPLEMENTED YET

 

DOGAME LDA FRMCNT ;MAIN LOOP

SEC

SBC OLDFRM

CMP #2 ;ONLY EXECUTE EVERY OTHER FRAME

BCS DOALL

JSR RANDOM ;DO RANDOM IF NOTHING LEFT TO DO

JMP MAINLOOP

DOALL LDA FRMCNT ;THIS IS THE MAMA LOOP

STA OLDFRM

 

INC MAINCNT

BNE DOALL1

LDX PLAYER

; INC GAMETIME,X

DOALL1

BIT RUNLOAD

BMI DOALL1

 

LDA PHASE

BPL NOFLASH

CMP #-2

BCC FLASH ;FLASH STARTS AT -3

 

NOFLASH JSR VSCRP

LDA #$80

STA RUNLOAD

JSR ENEMYMCP ;MCP FOR NON-SCROLL RELATED ENEMIES

JSR GRNDMCP ;CALL MCP FOR SCROLLING COUPLED ENEMIES

JSR GAME ;BIRD AND SHOT DRIVER AND OTHER THINGS

JSR ANIMFLEA ;FLEA DRIVER

JSR UWEANIM ;UWE DRIVER

JSR SCRLOAD

JSR DOMINIS

JSR DOSPHINX

JSR DOSXSHTS

JSR DOFIRE

JSR DOHIEROS

JSR NEWBLOCK

JSR LDSCORE ;LOAD SCORE DISPLAY

JSR LDLIVES ;LOAD LIVES DISPLAY

JSR LDTREAS ;LOADS TREASURE DISPLAY

 

JSR LDHIEROS ;LOAD HEIROGLYPH DISPLAY

* JSR LDPOWER ;LOAD POWER DISPLAY

*****

LDA #0

STA GSCRFLAG

STA GCOARSE

JMP MAINLOOP ;AND AGAIN AND AGAIN

 

** FLASH COLORS ON THE SCREEN **

FLASH DEC PHASE

LDA PHASE

CMP #-60 ;TIME THE FLASH

BNE CCFL0

 

LDX PLAYER

INC RACK,X

 

LDA #0

STA SVDIST,X

STA SVDIST+2,X

STA SVHDIST,X

STA SVHDIST+2,X

 

LDA #$FF

STA NEWPLYR

 

JSR ENDBONUS

 

LDA #0

STA PHASE

 

JMP MAINLOOP

 

* SET RANDOM COLORS INTO ALL PALLETTES *

CCFL0 LDX #$1F

CCFL1

JSR RANDOM

STA BACKGRND,X

CCFL2 DEX

BMI FNOMORE

TXA

AND #3

BNE CCFL1

BEQ CCFL2

FNOMORE

JSR RANDOM

STA BACKCOL

 

JMP MAINLOOP

 

 

RANDOM ADC FRMCNT ;RANDOM NUMBER GENERATOR

ADC RNDOM

ADC RNDOM1

PHA

LDA RNDOM

STA RNDOM1

PLA

STA RNDOM

RTS

 

* DOALLIO MAPS HARDWARE FIREBUTTON INTO SOFTWARE REGS. SAME FOR

* SWCHB. COMPLEMENTS OF ETHAN

DOALLIO

LDA SWCHA ;FOR TRIGGERING BREAKPOINTS. WILL BE

;MADE INTO MECHANISM TO STUFF SOFTWARE

;REGISTERS

LDA SWCHB ;GET SWCHB FOR RESETS AND SUCH

AND #$0B

STA SWCHBIO

 

CKJOY LDX #1 ;DO PLAYERS 1 AND 0

ZNXTRJ JSR READJOY ;READ HIS JOYSTICK

DEX

BPL ZNXTRJ

RTS

 

* READJOY: READ JOYSTICK/BUTTONS. ON ENTRY X = PLAYER. Y GETS TRASHED

READJOY LDY INPT4,X

BPL GOTONE ;IF BIT 7 IS LO, OLD-STYLE BUTTON HIT

 

LDA ONEBUT ;ARE WE ALREADY IN OLD-STYLE MODE?

AND RJBITS,X

BNE GOTONE2 ;YES. GO RIGHT TO ONE-BUTTON HANDLER.

 

TXA ;OTHERWISE, COMPUTE INDEX INTO

ASL A ; PADDLE PORTS, FOR PLAYER X,

TAY ; IN Y (X * 2)

 

LDA INPT4L,Y ;READ LEFT BUTTON

EOR #$FF ;INVERT SENSE

STA LEFTBUT,X

LDA INPT4R,Y ; RIGHT BUTTON

EOR #$FF ;INVERT SENSE

RJSTORE STA RIGHTBUT,X

 

RJRTS RTS

 

;HERE ON OLD-STYLE SINGLE BUTTON JOYSTICK PRESS.

GOTONE LDA ONEBUT ;SET ONE-BUTTON MODE IMMEDIATELY

ORA RJBITS,X ; TO AVOID DESTROYING HARDWARE!

STA SWCHB

STA ONEBUT ;UPDATE ONE BUTTON FLAG BYTE

 

;HERE ON ANY OLD-STYLE JOYSTICK, WHETHER PRESSED OR NOT

GOTONE2 TYA

STA LEFTBUT,X ; (Y CONTAINS CURRENT VALUE OF INPT4)

STA RIGHTBUT,X ;CLEAR RIGHT BUTTON COPY

 

RTS

 

RJBITS DB $04,$10 ;MASK OF "ONE-BUTTON" BITS PER PLAYER

RTS

 

 

* PUT ZEROS AT THE END OF EACH DISPLAY LIST

 

DOZEROS TXA

PHA

TYA

PHA

 

LDA #0 ;STORE ZEROES AT END OF DLISTS

TAX ;TRADE ROM FOR TIME

LDY #1 ;TWO ZEROS EACH

STA (ZNDLPOS,X)

STA (ZNDLPOS),Y

STA (ZNDLPOS+2,X)

STA (ZNDLPOS+2),Y

STA (ZNDLPOS+4,X)

STA (ZNDLPOS+4),Y

STA (ZNDLPOS+6,X)

STA (ZNDLPOS+6),Y

STA (ZNDLPOS+8,X)

STA (ZNDLPOS+

Link to comment
Share on other sites

OK' date=' I tried to clean up the code a little bit but it seems like there may be some data missing. I'm posting a zip with my cleaned up code, but Curt, if you can post the original in a zip file that would be great. :)[/quote']

Thanks Mitch.

:idea: Wouldn't this be great on the silent MARIA mailing list.

Link to comment
Share on other sites

GOTHIERO

         JSR     GLOHIERO

         JSR     PLAHIERO              ;WILL BE MADE INTO A JUMP LATER WHEN

         RTS                           ;DEBUGGING IS COMPLETE

 

I'm rapidly trying to reconcile this code with a disassembly, and this is the first change I've found so far. It's a JSR/JMP instead of a JSR/JSR/RTS in the cartridge version.

 

FWIW, the file which declares RAM addresses isn't among these six parts. So I'm going to have a real fun time once I start trying to assemble.

Link to comment
Share on other sites

Are there any good estimates/calculations of how many objects can be displayed on a 7800 per line? I am attaching a couple of progs I worked on a while ago and would like to work on a 7800 project after completing my current 5200/atari 8bit project. The first program aaqb displays a board familiar to some. It is a little more complicated than it looks, because each box area is a separate object, which requires a fair number for the bottom row, not even counting moving objects. The reason I needed multiple objects was to get enough colors in a given area. At the time I could not boot it up a real 7800 to check it, and never got around to throwing on additional objects. The next file kdemo.zip is just a mod of the sprite demo that was out there when I was expermenting with 7800 coding, where I figured out how to do vertical movement and holey dma. Not very interesting but it was the first thing I did. Both are in a78 format used by MESS, and in who knows what memory size I picked at the time so I don't know how hard they would be to boot up on a CCII. Hmmm, thats a lot of rambling for a single question.

aaqb.zip

kdemo.zip

Link to comment
Share on other sites

The 7800 is only limited by how many DMA cycles are available to the Maria chip on each scanline. The Maria chip has two line buffers. It displays one while fetching data for the next scan line. It will keep doing DMA fetches for the next scanline until either the current display list line is finished, or until it's time to display the line.

 

This is the same effect you see in Gauntlet when there are a lot of ghosts on the screen and the ones on the right vanish, but the background is still there.

Link to comment
Share on other sites

Are there any good estimates/calculations of how many objects can be displayed on a 7800 per line? I am attaching a couple of progs I worked on a while ago and would like to work on a 7800 project after completing my current 5200/atari 8bit project. The first program aaqb displays a board familiar to some. It is a little more complicated than it looks' date=' because each box area is a separate object, which requires a fair number for the bottom row, not even counting moving objects. The reason I needed multiple objects was to get enough colors in a given area. At the time I could not boot it up a real 7800 to check it, and never got around to throwing on additional objects. The next file kdemo.zip is just a mod of the sprite demo that was out there when I was expermenting with 7800 coding, where I figured out how to do vertical movement and holey dma. Not very interesting but it was the first thing I did. Both are in a78 format used by MESS, and in who knows what memory size I picked at the time so I don't know how hard they would be to boot up on a CCII. Hmmm, thats a lot of rambling for a single question.[/quote']

 

Ken,

 

I have some additional util's (atari ST based) I will be posting shortly for 7800 Game development that I located, they appear to be a heck of a lot better then the 7800 Dev stuff Atari originally supplied, these were actually done by a programmer hired to do some games for Atari and he made his own dev tools instead.

 

You've been doing a lot of great 8bit/5200 stuff, it would be cool to see what you could possibly do on the 7800 platform.

 

 

 

Curt

Link to comment
Share on other sites

Are there any good estimates/calculations of how many objects can be displayed on a 7800 per line? .

 

Here is my calculation based on information in the 7800 programming guide:

 

456 Maria cycles per line

-7 Start of DMA

-9 DMA Startup (worst case)

-13 DMA shutdown (worst case)

----

427 Total left

 

Lets assume 8 pixel wide, 4 color sprites:

 

8 Header

6 2 direct graphic reads

---

14 Cycles per sprite

 

427/14 = ~30 sprites per line

 

If you did an 8 pixel, 2 color sprite:

 

8 Header

3 1 direct graphics read

----

11

 

427/11 = ~38 sprites per line

 

This is my interpretation of what is in the 7800 Software Guide and are highly open to debate!

 

Dan

Link to comment
Share on other sites

I don`t ususally respond to stuff like this because I have no idea what it means but I thought I would raise a point regarding 7800 programming. There are a bunch of people who programmed this machine and I am sure they would all be a good source for more detailed information about this machine. Is anyone attempting to contact any of the 7800 programmers so to acquire more programming knowledge and perhaps give us all a homebrew or two. I hope so.

Link to comment
Share on other sites

If this is going to be a hacked version of Desert Falcon please address the 2nd player has 1st player evil enemies problem... I address this by putting the weaker player first. :sad:

 

If I get to level 3 without trouble then 2nd player is stuck with level 3 enemies at the first level.

 

I was scanning the code and it seems that someone could extract/translate the method for the powers.

 

Would split screen Desert Falcon be too complicated for the hardware?

 

Could you increase max number of lives that can be 'held' ?

Link to comment
Share on other sites

I have finished making this code assemble (after including missing code from a disassembly) to the identical binary for Desert Falcon. I marked lines in the code as I changed them (both additions and deletions), and a quick grep|wc says 129 lines were changed. There were also a few new global variables not referenced in the posted source code.

 

So it is indeed clearly a pre-release version of Desert Falcon, minus a few bug fixes.

 

Now all we need is for Curt to come back and repost the damn thing as a zip file so we can see the rest of it.

Link to comment
Share on other sites

I have finished making this code assemble (after including missing code from a disassembly) to the identical binary for Desert Falcon. I marked lines in the code as I changed them (both additions and deletions), and a quick grep|wc says 129 lines were changed. There were also a few new global variables not referenced in the posted source code.

 

So it is indeed clearly a pre-release version of Desert Falcon, minus a few bug fixes.

 

I'd be interested in hearing what was changed.

 

Tempest

Link to comment
Share on other sites

I've got the new code assembling without errors. In the process I updated my assembler to be more compatible with vintage 7800 source code, so there were only very minor changes needed to get it to compile. Now I can try reconciling the code again.

 

But here's something really interesting... it seems that High Score Cartridge support was removed before final release! So it looks like it should be possible to create a version of Desert Falcon which supports the HSC.

Link to comment
Share on other sites

I've got the new code assembling without errors.  In the process I updated my assembler to be more compatible with vintage 7800 source code, so there were only very minor changes needed to get it to compile.  Now I can try reconciling the code again.

 

But here's something really interesting... it seems that High Score Cartridge support was removed before final release!  So it looks like it should be possible to create a version of Desert Falcon which supports the HSC.

 

Yeah, it's been long rumored that the pre-release version of Desert Falcon had the High Score code in it.

Can you post a compiled BIN so others can try it out?

 

Mitch

Link to comment
Share on other sites

Wow, he's right. Here's a sample of it.

 


*         DETERMINE IF THE HSC IS PRESENT

HSPOWNIT

         LDA     $3900                 ;IF (MAGIC MEMORY LOCATIONS 3900

         CMP     #$C6                  ;    AND 3904 DONT MATCH THE

         BNE     HSCNOTPT              ;    DEFINED VALUES)

         LDA     $3904

         CMP     #$FE

         BEQ     HSCHERE               ;  THEN

HSCNOTPT  LDA     #0                    ;    SET HSCIN FLAG TO ZERO,

         STA     HSCIN                 ;    INDICATING HSC IS NOT IN

HSTUNE    RTS                           ;  END PROC



HSCHERE                                 ;  ELSE

         LDA     #$FF                  ;    SET HSCIN FLAG TO NONZERO,

         STA     HSCIN                 ;    INDICATING HSC IS PRESENT

*                                           ENDIF



         JSR     SETUPARG              ;SET UP ARGUMENTS FOR HSC

         JSR     SETHSLST              ;SET UP LIST OF WHAT DIFFICULTY

*                                         LEVELS HAVE HS TABLES



         RTS                           ;END HSPOWNIT

[/code]

Link to comment
Share on other sites

I just found this code snipit in Curt's High_Score_cart file that's been up on his site for about a month. Nobody noticed it.

 


          JSR      SETUPARG               ;SET UP ARGUMENT TABLE FOR HSC 



          LDA      #4                     ;CONVERT DESERT FALCONS 

FRONTWARDS 



          SEC                            ;DIFF LEVEL CODE TO MY BACKWARDS 



          SBC      DIFCULTY               ;ENCODING. 0=EXPERT, 3=NOVICE 



 



          JSR      SETDFNAM               ;SET UP DIFFICULTY NAME 

 

Allan

Link to comment
Share on other sites

It will be curious to see if I can locate the original source to Pole Position II for the 7800 and see if it too has HSC support...

 

However my feeling here is, this was most likely coded earlier then the HSC so this may be why it didn't have HSC support, even though it was the pack-in, its just a theory and I am trying to track down more information.

 

I'm going through quite a lot of early memo's and notes both from Atari and GCC sides so I am hoping to find some better clue's and details.

 

Let me know if you get this earlier version of DF working with the HSC, that would be great to add another game to the list, also it would be really cool to see if the HSC code be spliced into other existing games to make them HSC compatible.... I've been meaning to make a newer run of the HSC's with nvRAM and smaller components and having more games added to the list would be a great incentive... I gave Chad Schell needed info and he added HSC support into his CC2, so if anyone has one and can test the compiled HSC-DF on it, please let everyone know the results...

 

 

Curt

Link to comment
Share on other sites

Okay, I got it to assemble to an identical binary, with a conditional to turn on HSC. But the bin will have to wait because it's way past bedtime. I need to figure out how to sign it tomorrow. Or at least figure out how to load it into a CC2.

 

Looks like 196 changed lines (not counting a couple of moved code blocks), and about 150 more lines of completely new code at 65B8.

Link to comment
Share on other sites

Could you increase max number of lives that can be 'held' ?

 

Actually adding just more lives at the beginning seems to be trivial (keep in mind that I just took brief look at code). Just modify at preinit procedure this line:

 

LDX #5 ;FIVE LIVES ONLY <- load to X register number of lives

STX PL1LIVES <- store no of lives for player one

STX PL2LIVES <- store no of lives for player two

 

You could probably load up to 255 lives (this is theoretical as I haven't identified how lives are decremented - I assumed it's DEX or something similar - and I am not sure how this would be handled by display routine). It would also be possible to load different lives number for every player:

 

LDX #5

STX PL1LIVES

LDX #6

STX PL2LIVES

 

Just my 2 cents,

Cheers

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...