Curt Vendel Posted June 3, 2004 Share Posted June 3, 2004 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+ Quote Link to comment Share on other sites More sharing options...
+Mitch Posted June 3, 2004 Share Posted June 3, 2004 So is this the source code to an early version of Desert Falcon? Mitch Quote Link to comment Share on other sites More sharing options...
DEBRO Posted June 3, 2004 Share Posted June 3, 2004 Thanks Curt BTW...for your next postings use the "Code" tags to keep its original format. Quote Link to comment Share on other sites More sharing options...
+Mitch Posted June 3, 2004 Share Posted June 3, 2004 OK, 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. Mitch sphinx.zip Quote Link to comment Share on other sites More sharing options...
DEBRO Posted June 3, 2004 Share Posted June 3, 2004 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. Wouldn't this be great on the silent MARIA mailing list. Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 8, 2004 Share Posted June 8, 2004 FWIW, using a View Source and nuking the tags is the best way to clean it up. Is that what you did? Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 8, 2004 Share Posted June 8, 2004 preview, dammit. I meant the " " tags. Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 8, 2004 Share Posted June 8, 2004 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. Quote Link to comment Share on other sites More sharing options...
kenfused Posted June 9, 2004 Share Posted June 9, 2004 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 Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 9, 2004 Share Posted June 9, 2004 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. Quote Link to comment Share on other sites More sharing options...
Curt Vendel Posted June 9, 2004 Author Share Posted June 9, 2004 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 Quote Link to comment Share on other sites More sharing options...
DanBoris Posted June 9, 2004 Share Posted June 9, 2004 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 Quote Link to comment Share on other sites More sharing options...
birdie3 Posted June 9, 2004 Share Posted June 9, 2004 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. Quote Link to comment Share on other sites More sharing options...
FireTiger Posted June 12, 2004 Share Posted June 12, 2004 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. 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' ? Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 14, 2004 Share Posted June 14, 2004 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. Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 14, 2004 Share Posted June 14, 2004 I found a reference to the zip file in another thread when I did a search by author. http://archives.atarimuseum.com/archives/a...chdocs-7800.htm Quote Link to comment Share on other sites More sharing options...
Tempest Posted June 14, 2004 Share Posted June 14, 2004 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 Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 14, 2004 Share Posted June 14, 2004 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. Quote Link to comment Share on other sites More sharing options...
+Mitch Posted June 15, 2004 Share Posted June 15, 2004 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 Quote Link to comment Share on other sites More sharing options...
+Allan Posted June 15, 2004 Share Posted June 15, 2004 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] Quote Link to comment Share on other sites More sharing options...
+Allan Posted June 15, 2004 Share Posted June 15, 2004 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 Quote Link to comment Share on other sites More sharing options...
Curt Vendel Posted June 15, 2004 Author Share Posted June 15, 2004 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 Quote Link to comment Share on other sites More sharing options...
Bruce Tomlin Posted June 15, 2004 Share Posted June 15, 2004 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. Quote Link to comment Share on other sites More sharing options...
+Mitch Posted June 15, 2004 Share Posted June 15, 2004 Adding the authentication signature is usually pretty simple if you use the command line utility. If you want to test it on your CC2 without signing it, use the 78quick setting. Mitch Quote Link to comment Share on other sites More sharing options...
Alex Czarnowski Posted June 15, 2004 Share Posted June 15, 2004 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.