************************** * * * SPEEDSKI * * * * By Bill Richardson * * * * Copyright (c) 1985 * * ANALOG Computing * * * ************************** ; ;OS EQUATES ;---------- ; HPOSP0 = $D000 ;Plr0 horiz pos HPOSP1 = $D001 ;Plr1 horiz pos P0PF = $D004 ;Plr0 collision GRACTL = $D01D ;Graphics ctrl HITCLR = $D01E ;Collision reg CONSOL = $D01F ;Consol keys AUDF1 = $D200 ;Audio Freq 1 AUDC1 = $D201 ;Audio Ctrl 1 AUDF2 = $D202 ;Audio Freq 2 AUDC2 = $D203 ;Audio Ctrl 2 AUDCTL = $D208 ;Main audio ctrl SKCTL = $D20F ;Serial ctrl VSCROL = $D405 ;Vert Scroll reg PMBASE = $D407 ;P/M base addr SETVBV = $E45C ;Set VBLANK SYSVBV = $E45F ;Exit VBLANK ; ;PAGE ZERO ;--------- ; Org $80 ; CLOCK DB 1,1,1,1,1,1,1 ;Special clock SCROLLED DB 1 ;# lines scrolled SCROLFLG DB 1 ;Scroll done flag SPEED DB 1 ;Scrolling speed XPOS DB 1 ;Skier's horz pos YPOS DB 1 ;Skier's vert pos IMAGEPTR DB 1,1 ;Image pntr TIMES DB 1 ;Course scrl cnt TIMESFLG DB 1 ;End course flg VOLUME DB 1 ;Volume of sounds ; ;SHADOW REGISTERS, ETC. ;---------------------- ; ATRACT = 77 ;Attract mode flg SAVMSC = 88 ;Scrn memory pntr SDMCTL = $022F ;DMA enable SDLSTL = $0230 ;Disp List pntr GPRIOR = $026F ;Priority reg STICK0 = $0278 ;Joystick 0 STRIG0 = $0284 ;Stick trigger 0 PCOLR0 = $02C0 ;Player 0 color PCOLR1 = $02C1 ;Player 1 color COLOR0 = $02C4 ;Playfld Color 0 CHBAS = $02F4 ;CH Base addr CH = $02FC ;Last Key pressed ; Org $3000 ; SCRN1 Org *+480 ;1st screen SCRN2 Org *+480 ;2nd screen SCRN3 Org *+480 ;3rd screen SCRN4 Org *+480 ;4th screen SCRN5 Org *+480 ;5th screen SCRN6 Org *+240 ;6th screen SCRLFIN Org *+240 ;End scrl adr ; Org $0400 ; PMSTART Org *+$0200 ;P/M area PLR0 Org *+$80 ;Player0 PLR1 Org *+$80 ;Player1 ; ;CHARACTER SET ;------------- ; Org $2000 ; CHSET .BYTE 0,0,0,0,0,0,0,0,128,128 .BYTE 128,170,130,170,0,170 .BYTE 0,0,0,8,8,10,0,170 .BYTE 0,0,0,32,32,160,32,160 .BYTE 21,16,16,21,16,16,21,0 .BYTE 65,17,17,80,16,16,64,0 .BYTE 80,16,80,0,64,64,64,0 .BYTE 64,64,64,64,64,64,64,0 .BYTE 64,64,64,64,64,64,64,0 .BYTE 0,84,65,65,85,68,65,65 .BYTE 0,16,0,17,17,17,17,17 .BYTE 0,0,0,81,17,81,17,81 .BYTE 0,1,1,81,1,1,1,81 .BYTE 0,0,0,81,16,17,17,17 .BYTE 0,0,24,24,0,24,24,0,0,0 .BYTE 0,0,0,24,24,0,126,103 .BYTE 103,103,103,103,127,63 .BYTE 28,60,124,28,28,28,127 .BYTE 127,126,103,7,127,112 .BYTE 115,115,127,126,103,7 .BYTE 63,7,103,127,63,6,15,27 .BYTE 51,127,127,7,15,126,96 .BYTE 126,103,7,103,127,63 .BYTE 126,103,96,126,103,103 .BYTE 127,63,126,103,7,14,28 .BYTE 28,28,28,126,103,103 .BYTE 127,103,103,127,63,126 .BYTE 103,103,127,7,103,127 .BYTE 63,0,0,0,0,0,0,0,1 .BYTE 1,1,5,21,21,85,85,85 .BYTE 0,64,64,80,64,80,84,84 .BYTE 0,0,0,1,5,1,0,0 .BYTE 5,21,21,85,85,85,0,0 .BYTE 85,85,85,85,85,85,63,63 .BYTE 85,85,85,85,85,85,0,0 .BYTE 0,0,64,80,84,85,0,0 .BYTE 0,0,15,60,0,252,15,0 .BYTE 192,192,192,252,204,207 .BYTE 192,207,0,0,0,0,0,192,0 .BYTE 192,0,0,15,60,48,0,0,0 .BYTE 252,207,195,192,192,192 .BYTE 192,192,0,0,192,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0,2,0,0,2 .BYTE 2,10,42,170,170,32,168 .BYTE 168,170,170,170,170,170 .BYTE 0,0,0,0,0,128,160,160 .BYTE 0,0,0,0,0,2,0,0,2,10,10 .BYTE 42,170,170,0,0,170,170 .BYTE 170,170,170,170,3,3,170 .BYTE 170,170,170,170,170,252 .BYTE 252,168,170,170,170,170 .BYTE 170,0,0,0,0,128,160,168 .BYTE 170,0,0,0,0,0,0,0,0,1,5 .BYTE 0,0,1,5,21,85,85,85 .BYTE 20,85,85,85,85,85,85,85 .BYTE 0,0,80,84,85,85,85,85 .BYTE 0,0,0,0,0,80,84,85 .BYTE 0,0,1,5,0,0,0,0 .BYTE 21,85,85,85,0,0,0,0,85 .BYTE 85,85,85,0,0,0,0,85,85 .BYTE 85,85,255,255,255,255 .BYTE 85,85,85,85,192,192,192 .BYTE 192,85,85,85,85,0,0,0,0 .BYTE 64,80,84,85,0,0,0,0 .BYTE 0,0,0,64,0,0,0,0,2,10 .BYTE 10,10,42,42,42,42,0,128 .BYTE 160,160,160,168,168,168 .BYTE 0,2,2,2,0,0,0,0,170,170 .BYTE 170,170,170,3,3,3,168 .BYTE 170,170,170,170,192,192 .BYTE 192,0,0,0,0,128,0,0,0 .BYTE 1,5,5,5,21,21,21,21 .BYTE 0,64,80,80,80,84,84,84 .BYTE 0,1,1,1,0,0,0,0,85,85 .BYTE 85,85,85,3,3,3,84,85,85 .BYTE 85,85,192,192,192 .BYTE 0,0,0,0,64,0,0,0 .BYTE 0,0,0,252,15,0,63,0,48 .BYTE 48,60,60,255,63,252,63 .BYTE 0,0,0,240,0,252,0,240 .BYTE 240,60,15,0,0,0,0,0,60 .BYTE 60,255,60,63,60,60,60 .BYTE 12,192,192,0,0,0,0,0 .BYTE 0,0,0,0,192,240,255,255 .BYTE 0,0,0,0,0,0,0,192 .BYTE 0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,3,0,0,0 .BYTE 0,3,15,255,255,192,192 .BYTE 192,192,192,192,192,192 .BYTE 3,3,3,3,3,3,3,3,42,37 .BYTE 38,38,38,38,37,42,170 .BYTE 85,170,0,0,170,85,170 .BYTE 160,96,160,0,0,160,96 .BYTE 96,0,0,0,0,0,170,149 .BYTE 154,0,0,0,0,0,168,88 .BYTE 152,0,0,0,0,0,170,149 .BYTE 154,0,0,0,0,0,138,137 .BYTE 137,0,0,0,0,0,168,88 .BYTE 168,0,0,0,0,0,42,37,42 .BYTE 2,2,2,2,2,170,85,170,96 .BYTE 96,96,96,96,96,96,160 .BYTE 152,154,149,154,152,152 .BYTE 152,168,152,152,88,168 .BYTE 0,0,0,0,152,154,150,154 .BYTE 152,154,149,170,9,9,9,9 .BYTE 9,137,137,138,128,160 .BYTE 96,160,128,168,88,168 .BYTE 0,0,0,0,0,170,149,154 .BYTE 0,0,0,0,0,128,160,104 .BYTE 42,37,38,38,38,38,37,42 .BYTE 170,85,170,0,0,170,85 .BYTE 170,160,96,160,0,0,162 .BYTE 98,98,0,0,0,0,0,162,98 .BYTE 98,0,0,0,0,0,162,98,98 .BYTE 0,0,0,0,0,170,86,154 .BYTE 154,152,152,152,154,154 .BYTE 149,170,152,152,152,152 .BYTE 152,104,160,128,0,0,0,0 .BYTE 0,42,37,42,2,2,2,2,2 .BYTE 170,85,170,98,98,98,98 .BYTE 98,98,98,162,105,102,90 .BYTE 102,105,106,98,162,160 .BYTE 128,0,128,160,98,98,162 .BYTE 152,152,152,152,152,154 .BYTE 86,170,0,0,0,17,65,1,1 .BYTE 1,0,16,16,81,17,17,16 .BYTE 81,0,0,0,84,0,84,4,84 .BYTE 0,0,0,84,68,68,68,84 .BYTE 0,0,0,64,84,68,68,68 .BYTE 0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0 ; ;MESSAGES ;-------- ; GAMELOGO .BYTE 88,89,90,91,92,93,94,95 .BYTE 104,105,106,107,108,109 .BYTE 110,111,96,97,98,99,100 .BYTE 101,102,103,112,113,114 .BYTE 115,116,117,118,119 MYNAME .BYTE 1,2,3,0,4,5,6,7,8,0,9 .BYTE 10,12,13,11,120,121,122 .BYTE 123,124 ; ;DISPLAY LIST ;------------ ; DLIST .BYTE $70,$70,$44 .WORD $00 .BYTE $04,$00,$04,$65 .WORD $4000 .BYTE $25,$25,$25,$25 .BYTE $25,$25,$25,$25 .BYTE $25,$25,$05,$41 .WORD DLIST ; ;P/M SHAPES ;---------- ; IM1 .BYTE 12,0,24,0,24,24 .BYTE 60,0,124,0,48,136 .BYTE 56,68,36,2,72,0 .BYTE 72,34,0,68,0,136 IM2 .BYTE 0,0,12,0,24,0 .BYTE 24,24,60,0,24,36 .BYTE 60,66,60,0,36,0 .BYTE 36,0,0,36,0,36 IM3 .BYTE 48,0,24,0,24,24 .BYTE 60,0,62,0,12,17 .BYTE 28,34,36,64,18,0 .BYTE 18,68,0,34,0,17 IM4 .BYTE 4,0,25,2,25,28 .BYTE 254,0,185,0,120,128 .BYTE 56,128,40,0,64,20 .BYTE 76,34,65,0,0,0 IM5 .BYTE 16,0,24,0,128,96 .BYTE 88,24,58,4,45,2 .BYTE 28,0,26,0,34,0 .BYTE 66,129,0,66,0,4 ; ;Initial screen colors ;--------------------- ; COLTBL .BYTE 184,180,20,52,14 ; ;Copy screens ;------------ ; PRGSTART LDX #0 COPY1 LDA SCRNBASE,X STA SCRN1,X STA SCRN4,X LDA SCRNBASE+480,X STA SCRN2,X STA SCRN5,X LDA SCRNBASE+960,X STA SCRN3,X STA SCRN6,X INX BNE COPY1 COPY2 LDA SCRNBASE+256,X STA SCRN1+256,X STA SCRN4+256,X LDA SCRNBASE+736,X STA SCRN2+256,X STA SCRN5+256,X LDA SCRNBASE+1216,X STA SCRN3+256,X STA SCRN6+256,X INX CPX #224 BNE COPY2 LDA #0 TAX CLEAR1 STA SCRN6+480,X ;Clr bottom INX ;of scrolling BNE CLEAR1 ;screen memory LDA SAVMSC STA DLIST+3 ;Set DLIST LDA SAVMSC+1 ;pointer to STA DLIST+4 ;screen memory LDA #0 ;Clear LDY #120 ;top CLEARSCR STA (SAVMSC),Y ;of DEY ;screen BPL CLEARSCR LDX #4 COLORSCR LDA COLTBL,X ;color tbl STA COLOR0,X DEX BPL COLORSCR LDA # DLIST ;find custom STA SDLSTL+1 ;Display List LDY #27 ;This routine LDX #15 ;puts the top 16 I1 LDA GAMELOGO,X ;characters of STA (SAVMSC),Y ;"SPEEDSKI" DEY ;logo on the DEX ;screen BPL I1 LDY #67 ;Puts LDX #31 ;the last I2 LDA GAMELOGO,X STA (SAVMSC),Y ;16 characters DEY ;of logo on DEX ;the screen CPX #15 BNE I2 LDA # >CHSET ;Give computer STA CHBAS ;adr of new CHSET LDA #0 ;Initialize STA AUDCTL ;POKEY LDA #3 ;sound STA SKCTL ;chip LDA #2 ;Enable STA GRACTL ;P/M graphics LDA # >PMSTART ;Tell where PM STA PMBASE ;graphics are JSR ERASE ;Clear P/M memory LDA #40 ;Multi-color plrs STA GPRIOR ;Set P/M priority LDA #152 ;light blue STA PCOLR0 LDA #118 ;blue STA PCOLR1 LDA #46 ;Double line STA SDMCTL ;resolution plrs LDY #110 LDX #19 ;This routine I3 LDA MYNAME,X ;puts the STA (SAVMSC),Y ;author's name DEY ;on the 3rd line DEX ;of the screen BPL I3 ; ;EVERY TIME INITIALIZATION ;------------------------- ; INIT LDA # SCRN1 ;screen STA DLIST+10 LDA #0 ;Reset # scan STA SCROLLED ;lines scrolled STA TIMESFLG ;and TIMESFLG STA TIMES ;+ course scroll STA SCROLFLG ;Do scrolling LDA #1 ;Set scroll speed STA SPEED ;to slow LDA #0 ;Set LDX #6 ;clock I4 STA CLOCK,X ;to DEX ;0:00.00 BPL I4 STX CLOCK+2 ;"." character STX CH ;Reset last key DEX STX CLOCK+5 ;":" character LDA #120 ;Set horizontal STA XPOS ;pos of skier LDA #36 ;Set vertical STA YPOS ;pos of skier ; ;BEGIN GAME ;---------- ; WAITLOOP LDA CONSOL ROR A ;START Pressed? BCC LETSGO ;Yes! start game LDA STRIG0 ;Trigger pressed? BNE WAITLOOP ;No, wait LETSGO JSR CLEAR3RD ;Clr 3rd line LDA #6 ;Chg ANTIC 4 line STA DLIST+7 ;to GR.1 line STA ATRACT ;Reset Attract JSR SCROLLIT ;Start VBLANK ; ;INTRODUCTION ;------------ ; LDA XPOS ;Position the STA HPOSP0 ;skier STA HPOSP1 ;horizontally INTRO JSR ERASE ;Erase skier LDA # IM2 ;to STA IMAGEPTR+1 ;draw JSR DRAW ;Go draw skiers INC YPOS ;Move down screen LDA YPOS ;See if skier has CMP #72 ;reached middle BEQ MAINLOOP ;of screen? Yes. LDA YPOS ;Vert position LSR A ;/2 LSR A ;/4 LSR A ;/8 STA AUDF1 ;Set frequency, STA AUDC1 ;vol, distortion LDX #10 ;HI byte and LO LDY #0 ;byte of delay JSR DELAY ;Slow down action JMP INTRO ;Do it again ; ;THE MAIN LOOP ;------------- ; MAINLOOP STA HITCLR ;Clr Collision LDA STICK0 ;Read joystick CMP #5 ;Down and right? BEQ MP2A ;Go draw skier CMP #6 ;Up and right? BEQ MP2 CMP #7 BNE MP3 MP2 DEC SPEED MP2A JMP RIGHT ; MP3 CMP #9 ;Down and left? BEQ MP5A CMP #10 ;Up and left? BEQ MP5 CMP #11 ;Left? BNE MP6 MP5 DEC SPEED MP5A JMP LEFT ; MP6 CMP #13 ;Down? BNE MP7 INC SPEED JMP STRAIGHT ; MP7 CMP #14 ;Up? BNE MP8 DEC SPEED JSR TESTSPD DEC SPEED MP8 JMP STRAIGHT ; CONTINUE LDA XPOS ;Horizontal pos STA HPOSP0 ;Position Plr0 STA HPOSP1 ;Position Plr1 LDA CH ;Last key pressed CMP #255 BEQ MP9 ;No key pressed JSR PAUSE ;Activate pause MP9 LDA CONSOL CMP #6 ;START pressed? BNE MP10 ;No. JMP INIT ;Start over ; MP10 LDA P0PF ;Check collision BEQ MP11 ;Nobody crashed JSR CRASH ;Crash occured MP11 LDX #12 LDY #0 JSR DELAY ;Slow the action LDA SCROLFLG ;scrolling? BEQ MP12 ;Yes. continue JMP ENDGAME ; MP12 JSR TESTX ;Skier's X coord JMP MAINLOOP ;Loop back ; ;Delay subroutine ;---------------- ; DELAY DEY BNE DELAY DEX BNE DELAY RTS ; ;Erase players 0 & 1 ;------------------- ; ERASE LDA #0 TAX MP13 STA PLR0,X ;Erase Plr0 STA PLR1,X ;Erase Plr1 DEX BNE MP13 RTS ; ;Start scrolling & clock ;----------------------- ; SCROLLIT LDX # >VBI LDY # SYSVBV LDY # IM3 ;skier STA IMAGEPTR+1 LDA #6 BNE LEFT1 ; ;Set skier to left ;----------------- ; LEFT JSR TESTSPD DEC XPOS LDA # IM1 ;skier STA IMAGEPTR+1 LDA #4 LEFT1 STA AUDF1 LDA #12 LEFT2 STA AUDC1 JSR DRAW JMP CONTINUE ; ;Set skier to straight ;--------------------- ; STRAIGHT JSR TESTSPD LDA # IM2 ;skier STA IMAGEPTR+1 LDA #2 STA AUDF1 LDA #8 BNE LEFT2 ; ;Test scrolling speed ;-------------------- ; TESTSPD LDA SPEED CMP #65 ;Is it > maximum? BNE MP14 ;No DEC SPEED ;Make maximum RTS MP14 LDA SPEED ;Speed < minimum? BNE MP15 ;No. INC SPEED ;Make minimum MP15 RTS ; ;Pause subroutine ;---------------- ; PAUSE JSR HALT ;Stop scrolling LDA #255 ;Reset last STA CH ;key pressed MP16 LDA CONSOL ;Wait for OPTION CMP #3 ;to be BNE MP16 ;pressed JMP SCROLLIT ; ;Gameover ;-------- ; ENDGAME JSR HALT ;Stop scrolling LDA #121 ;note C STA AUDF1 LDA #166 ;with pure tone STA AUDC1 ;and some volume LDX #0 ;hold the tone LDY #0 ;for a while JSR DELAY LDA #96 ;note E STA AUDF1 LDA #121 ;note C STA AUDF2 LDA #170 ;with pure tone STA AUDC1 ;and more volume STA AUDC2 LDX #128 ;Hold tone half JSR DELAY ;as long LDA #81 ;note G STA AUDF1 LDA #96 ;note E STA AUDF2 LDA #172 ;more volume STA AUDC1 STA AUDC2 LDX #192 ;Hold tone JSR DELAY LDA #60 ;note C STA AUDF1 LDA #81 ;note G STA AUDF2 LDA #174 ;more volume STA AUDC1 STA AUDC2 JSR DELAY ;Hold note twice JSR DELAY ;as long as 1st LDA #0 STA AUDC1 ;Turn off STA AUDC2 ;sound MP17 LDA CONSOL ;See if START ROR A ;pressed BCC MP18 LDA STRIG0 ;If trig pressed BNE MP17 ;start game over MP18 JMP INIT ; ;Crash! ;------ ; CRASH LDA #1 ;Stop STA SCROLFLG ;scrolling LDA #15 ;Set volume STA VOLUME ;to loud MP19 LDA #255 STA AUDF1 SBC VOLUME ;255-VOLUME STA AUDF2 ;for Freq 2 LDA VOLUME ;dist 0+VOLUME STA AUDC1 ;for Ctrl 1 ADC #192 ;Dist 12+VOLUME STA AUDC2 ;for Ctrl 2 DEC VOLUME ;Reduce volumn LDX #20 JSR DELAY LDA VOLUME ;See if VOLUME=0 BNE MP19 LDA # IM4 ;skier STA IMAGEPTR+1 ;image JSR DRAW LDX #30 JSR DELAY LDA # IM5 ;skier STA IMAGEPTR+1 ;image JSR DRAW JSR DELAY JSR DELAY JSR DELAY LDA #0 ;Enable STA SCROLFLG ;scroll again LDA # IM2 ;up STA IMAGEPTR+1 ;again LDA #1 ;Reset speed STA SPEED ;to slow JMP DRAW ; ;Clear screen's 3rd line ;----------------------- ; CLEAR3RD LDA #0 LDY #120 MP20 STA (SAVMSC),Y DEY CPY #79 BNE MP20 RTS ; ;Test skier's X position ;----------------------- ; TESTX LDA XPOS CMP #47 BNE MP21 INC XPOS RTS ; MP21 CMP #196 BNE MP22 DEC XPOS MP22 RTS ; ;VERTICAL BLANK INTERRUPT ;------------------------ ; VBI LDA SCROLFLG ;If not 0 do BNE VBICLOCK ;not scroll ; ;Calculate scroll speed ;---------------------- ; LDA SPEED ;Current speed LSR A ;/2 LSR A ;/4 LSR A ;/8 LSR A ;/16 If not zero BNE VB1 ;do fine scroll LDX #1 ;If 0 make it 1 BNE SCROLLON ; VB1 TAX ; ;Perform fine scroll ;------------------- ; SCROLLON INC SCROLLED ;lines scrolled LDA SCROLLED STA VSCROL ;put in vscrol CMP #16 ;reached limit? BEQ COARSE ;coarse scroll DEX ;No. Scroll until BNE SCROLLON ;X=0 BEQ VBICLOCK ;Handle clock ; ;Do a coarse scroll ;------------------ ; COARSE LDA #0 ;Reset the fine STA VSCROL ;scroll reg and # STA SCROLLED ;lines scrolled LDA DLIST+9 ;DLIST's LO byte CLC ADC #40 ;Add 40 (1 line) STA DLIST+9 ;New LO byte BCC COMPEND ;Over 256? No. INC DLIST+10 ;Inc HI byte ; ;Check on scrolling limit ;------------------------ ; COMPEND LDA TIMESFLG BNE COMPDONE ;check scrolling LDA DLIST+10 ;DLIST HI byte CMP # >SCRN4 ;Reached end? BNE VBICLOCK ;No, skip this LDA DLIST+9 ;Examine LO byte CMP # SCRN1 ;Yes! STA DLIST+10 ;Flip back to LDA # SCRLFIN ;Reached? BNE VBICLOCK ;No LDA DLIST+9 ;DLIST LO byte CMP #