Subject: [stella] Marble Craze control problem From: Paul Slocum <paul-stella@xxxxxxxxxxxxxx> Date: Sun, 02 Jun 2002 17:58:31 -0500 |
; Get paddle value from table (0-15) lda paddleDecode,x sta DISPLAY
ldy p2yVel ldx p2y jsr calcSpeed stx p2yVel
;--------------------------------------------------------------------------- ; ; Marble Craze by Paul Slocum ; ;--------------------------------------------------------------------------- processor 6502 include vcs.h ;TODO ; ; Generalize acceleration routine ; Add horizontal ball control ; ; Add left player ball routine ; Horizontal Paddle position indicator ; Add friction ; ; Design level data types ; Write level loader ; Write screen to screen handling ; ; Write start/finish handling ;--------------------------------------------------------------------------- ; Constants ;--------------------------------------------------------------------------- SETUPDELAY equ #255 ;--------------------------------------------------------------------------- ; RAM Variables ;--------------------------------------------------------------------------- textColor equ $80 playField equ textColor + 1 ; 84 bytes (12 lines * 5) + 24 color bytes pfBuffer equ playField + 84 ; 7 bytes pMarble equ pfBuffer + 8; 2 bytes pMarble2 equ pMarble + 2; 2 bytes pfColor equ pMarble2 + 2 frame equ pfColor + 1 p1x equ frame + 1 p1y equ p1x + 1 p2x equ p1y + 1 p2y equ p2x + 1 DISPLAY equ p2y + 1 p1xVel equ DISPLAY + 1 p1yVel equ p1xVel + 1 p2xVel equ p1yVel + 1 p2yVel equ p2xVel + 1 pwr1x equ p2yVel + 1 pwr1y equ pwr1x + 1 pwr2x equ pwr1y + 1 pwr2y equ pwr2x + 1 padVal1 equ pwr2y + 1 padVal2 equ padVal1 + 1 padVal3 equ padVal2 + 1 padVal4 equ padVal3 + 1 speed equ padVal4 + 1 ;--------------------------------------------------------------------------- ; Song player variables temp equ speed + 1 ; 16 bit temp temp16L equ temp + 1 temp16H equ temp16L + 1 ;note1 equ temp16H + 1 ;note2 equ note1 + 1 ;vol1 equ note2 + 1 ;vol2 equ vol1 + 1 ;sound1 equ vol2 + 1 ;sound2 equ sound1 + 1 ; Metrenome stuff ;beat equ sound2 + 1 ;tempoCount equ beat + 1 ;measure equ tempoCount + 1 ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- org $F000 ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- marbleData2 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 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 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 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 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 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 byte 0,0,0,0,0,0,0 byte #%00111100 byte #%01111110 byte #%01111110 byte #%11111111 byte #%11111111 byte #%11111111 byte #%11111111 byte #%11111111 byte #%11111111 byte #%01111110 byte #%01111110 byte #%00111100 align 256 marbleData3 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 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 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 byte 0,0,0,0,0,0,0,0 byte 0,0,0,0,0,0,0 byte #%00111100 byte #%01111110 byte #%01111110 byte #%11111111 byte #%11111111 byte #%11111111 byte #%11111111 byte #%11111111 byte #%11111111 byte #%01111110 byte #%01111110 byte #%00111100 align 256 movement byte #%01110001, #%01100001, #%01010001, #%01000001, #%00110001, #%00100001, #%00010001, #%00000001 byte #%11110001, #%11100001, #%11010001, #%11000001, #%10110001, #%10100001, #%10010001;, #%10000001 byte #%01110010, #%01100010, #%01010010, #%01000010, #%00110010, #%00100010, #%00010010, #%00000010 byte #%11110010, #%11100010, #%11010010, #%11000010, #%10110010, #%10100010, #%10010010;, #%10000010 byte #%01110011, #%01100011, #%01010011, #%01000011, #%00110011, #%00100011, #%00010011, #%00000011 byte #%11110011, #%11100011, #%11010011, #%11000011, #%10110011, #%10100011, #%10010011;, #%10000011 byte #%01110100, #%01100100, #%01010100, #%01000100, #%00110100, #%00100100, #%00010100, #%00000100 byte #%11110100, #%11100100, #%11010100, #%11000100, #%10110100, #%10100100, #%10010100;, #%10000100 byte #%01110101, #%01100101, #%01010101, #%01000101, #%00110101, #%00100101, #%00010101, #%00000101 byte #%11110101, #%11100101, #%11010101, #%11000101, #%10110101, #%10100101, #%10010101;, #%10000101 byte #%01110110, #%01100110, #%01010110, #%01000110, #%00110110, #%00100110, #%00010110, #%00000110 byte #%11110110, #%11100110, #%11010110, #%11000110, #%10110110, #%10100110, #%10010110;, #%10000110 byte #%01110111, #%01100111, #%01010111, #%01000111, #%00110111, #%00100111, #%00010111, #%00000111 byte #%11110111, #%11100111, #%11010111, #%11000111, #%10110111, #%10100111, #%10010111;, #%10000111 byte #%01111000, #%01101000, #%01011000, #%01001000, #%00111000, #%00101000, #%00011000, #%00001000 byte #%11111000, #%11101000, #%11011000, #%11001000, #%10111000, #%10101000, #%10011000;, #%10001000 byte #%01111001, #%01101001, #%01011001, #%01001001, #%00111001, #%00101001, #%00011001, #%00001001 byte #%11111001, #%11101001, #%11011001, #%11001001, #%10111001, #%10101001, #%10011001;, #%10001001 byte #%01111010, #%01101010, #%01011010, #%01001010, #%00111010, #%00101010, #%00011010, #%00001010 byte #%11111010, #%11101010, #%11011010, #%11001010, #%10111010, #%10101010, #%10011010;, #%10001010 paddleDecode byte 0,0,0,0,0,0,1,1,1,1,1,1,1 byte 2,2,2,2,2,2,3,3,3,3,3,3,3 byte 4,4,4,4,4,4,5,5,5,5,5,5,5 byte 5,5,5,5,5,5,6,6,6,6,6,6,6 byte 6,6,6,6,6,6,7,7,7,7,7,7,7 byte 7,7,7,7,7,7,8,8,8,8,8,8,8 byte 8,8,8,8,8,8,8,8,8,8,8,8,8 byte 9,9,9,9,9,9,9,9,9,9,9,9,9 byte 10,10,10,10,10,10,10,10,10,10,10,10,10 byte 11,11,11,11,11,11,11,11,11,11,11,11,11 byte 12,12,12,12,12,12,12,12,12,12,12,12,12 byte 13,13,13,13,13,13,14,14,14,14,14,14,14 byte 15,15,15,15,15,15 paddleDecode2 ; byte 0,0,0,0,0,0,1,1,1,1,1,1,1 ; byte 2,2,2,2,2,2,3,3,3,3,3,3,3 ; byte 4,4,4,4,4,4,5,5,5,5,5,5,5 ; byte 6,6,6,6,6,6,7,7,7,7,7,7,7 ; byte 8,8,8,8,8,8,9,9,9,9,9,9,9 ; byte 10,10,10,10,10,10,11,11,11,11,11,11,11 ; byte 12,12,12,12,12,12,13,13,13,13,13,13,13 ; byte 14,14,14,14,14,14,15,15,15,15,15,15,15 ; byte 16,16,16,16,16,16,17,17,17,17,17,17,17 ; byte 18,18,18,18,18,18,19,19,19,19,19,19,19 ; byte 20,20,20,20,20,20,21,21,21,21,21,21,21 ; byte 22,22,22,22,22,22,23,23,23,23,23,23,23 ; byte 24,24,24,24,24,24,25,25,25,25,25,25,25 ;--------------------------------------------------------------------------- ; Start of Program ;--------------------------------------------------------------------------- ; Clear memory, locate character graphics positions and such, ; initialize key memory values, start GameLoop. ;------------------------------------------------------------- Start sei cld ldx #$FF txs lda #0 clear sta 0,x dex bne clear ;--------------------------------------------------------------------------- ; Initialize variables ;--------------------------------------------------------------------------- ; Set initialization flag. ; This stays set until the first frame is drawn. lda #$0f ;set text color to white sta COLUP0 sta COLUP1 lda #50 sta p2y sta p1y lda #10 sta pwr1y lda #40 sta pwr1x lda #10 sta p2x sta p1x lda #7 sta pwr2y lda #85 sta pwr2x lda #32 sta p1xVel ;-------------------------------------------------------------------------- ; GameLoop ;-------------------------------------------------------------------------- GameLoop inc frame jsr VSync ;start vertical retrace jsr VBlank ; spare time during screen blank jsr drawScreen ; draw one screen jsr overscan ; do overscan jmp GameLoop ;back to top ;-------------------------------------------------------------------------- ; VSync ;-------------------------------------------------------------------------- VSync lda #2 ;bit 1 needs to be 1 to start retrace sta VSYNC ;start retrace sta WSYNC ;wait a few lines sta WSYNC lda #44 ;prepare timer to exit blank period (44) sta TIM64T ;turn it on sta WSYNC ;wait one more sta VSYNC ;done with retrace, write 0 to bit 1 rts ; VSync accArray byte 252,0,252,0,252,0,252,0 byte 252,0,252,0,252,0,252,0 byte 252,0,0,252,0,252,0,252 byte 0,0,252,0,252,0,252,0 byte 252,0,0,252,0,0,252,0 byte 252,0,0,252,0,0,252,0 byte 252,0,0,252,0,0,252,0 byte 0,252,0,0,252,0,0,0 byte 252,0,0,0,252,0,0,0 byte 252,0,0,0,252,0,0,0 byte 252,0,0,0,0,252,0,0 byte 0,0,252,0,0,0,0,0 byte 252,0,0,0,0,0,0,0 byte 252,0,0,0,0,0,0,0 byte 252,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 byte 0,0,0,0,0,0,0,0 byte 4,0,0,0,0,0,0,0 byte 0,0,0,0,0,0,0,0 byte 4,0,0,0,0,0,0,0 byte 4,0,0,0,0,0,0,0 byte 4,0,0,0,0,4,0,0 byte 0,0,4,0,0,0,0,0 byte 4,0,0,0,4,0,0,0 byte 4,0,0,0,4,0,0,0 byte 4,0,0,4,0,0,4,0 byte 0,4,0,0,4,0,0,0 byte 4,0,0,4,0,0,4,0 byte 4,0,0,4,0,0,4,0 byte 4,0,0,4,0,4,0,4 byte 0,0,4,0,4,0,4,0 speedArray byte 0,0,0,0,0,0,0,0 ;1 byte 0,0,0,0,0,0,0,0 ;1 byte 1,0,0,0,0,0,0,0 ;2 byte 1,0,0,0,1,0,0,0 ;3 byte 1,0,0,1,0,0,1,0 ;4 byte 1,0,1,0,1,0,1,0 ;5 byte 1,1,0,1,0,1,0,1 ;6 byte 1,1,1,0,1,1,1,0 ;7 byte 1,1,1,1,1,1,1,0 ;8 byte 1,1,1,1,1,1,1,1 ;9 byte 2,1,1,1,1,1,1,1 ;10 byte 2,1,1,1,2,1,1,1 ;11 byte 2,1,1,2,1,1,2,1 ;12 byte 2,1,2,1,2,1,1,2 ;13 byte 2,1,2,2,1,2,2,1 ;14 byte 2,2,2,1,2,2,2,1 ;15 byte 2,2,2,2,2,2,2,1 ;16 byte 2,2,2,2,2,2,2,2 ;17 byte 3,2,2,2,2,2,2,2 ;18 byte 3,2,2,2,3,2,2,2 ;19 byte 3,2,2,3,2,2,3,2 ;20 byte 3,2,3,2,3,2,3,2 ;21 byte 3,3,2,3,3,2,3,2 ;22 byte 3,3,3,2,3,3,3,2 ;23 byte 3,3,3,3,3,3,3,2 ;24 byte 3,3,3,3,3,3,3,3 ;25 byte 4,3,3,3,3,3,3,3 ;26 byte 4,3,3,3,4,3,3,3 ;27 byte 4,3,3,4,3,3,4,3 ;28 byte 4,3,4,3,4,3,4,3 ;29 byte 4,4,3,4,4,3,4,3 ;30 byte 4,4,4,3,4,4,4,3 ;31 byte 4,4,4,4,4,4,4,3 ;32 byte 4,4,4,4,4,4,4,4 ;33 byte 4,4,4,4,4,4,4,4 ;34 byte 4,4,4,4,4,4,4,4 ;35 byte 4,4,4,4,4,4,4,4 ;36 negConvert byte 0,255,254,253,252 ;-------------------------------------------------------------------------- ; calcSpeed ;-------------------------------------------------------------------------- ; Takes a paddle position, position, and speed, and calculates the ; new speed and position. ; ; Preload: ; X: paddle position ; Y: speed ; A: position ; ; Returns: ; X: speed ; A: position ;-------------------------------------------------------------------------- calcSpeed stx temp16L sty temp16H ; The acceleration speed is determined by ; the 4 high bits asl asl asl asl sta temp ; Set the current step of acceleration lda frame and #%00001111 clc adc temp ; Determine the amount of acceleration ; for this frame tax lda accArray,x ; Add it to the current speed clc adc temp16H ; Check for max speeds beq noSetVal cmp #248 beq noSetVal ; Set the speed sta temp16H noSetVal ; Get the new speed lda temp16H ; If it's positive speed, go to ; the positive speed handler bmi posVel ; Negative speed handler ; Invert the speed asl sta temp lda #0 sbc temp ; Set up the current frame sta temp lda frame and #%00000111 adc temp ; Get the current speed increment tax lda speedArray,x ; Subtract the increment from ; the current position sta temp lda temp16L sec sbc temp jmp endVel posVel asl ; Set up the frame counter sta temp lda frame and #%00000111 adc temp ; Get the current speed increment tax lda speedArray,x ; Add it to the position clc adc temp16L endVel ldx temp16H rts ;-------------------------------------------------------------------------- ; checkYPosition ;-------------------------------------------------------------------------- ; Takes current X position and new proposed Y position and checks ; for falling off, edge of screen, or walls. ; ; (Currently just loops) ; ; Preload: ; A: Y position ; ; Returns: ; A: updated Y position ; ;-------------------------------------------------------------------------- checkYPosition cmp #0 beq topResetY cmp #1 beq topResetY cmp #2 beq topResetY cmp #3 beq topResetY cmp #163 beq resetY cmp #162 beq resetY cmp #161 beq resetY cmp #160 beq resetY jmp noResetY topResetY lda #160 jmp noResetY resetY lda #5 noResetY rts ;-------------------------------------------------------------------------- ; checkXPosition ;-------------------------------------------------------------------------- ; Takes current Y position and new proposed X position and checks ; for falling off, edge of screen, or walls. ; ; (Currently just loops) ; ; Preload: ; A: X position ; ; Returns: ; A: updated X position ; ;-------------------------------------------------------------------------- checkXPosition cmp #0 beq topResetX cmp #1 beq topResetX cmp #2 beq topResetX cmp #3 beq topResetX cmp #69 beq resetX cmp #70 beq resetX cmp #71 beq resetX cmp #72 beq resetX jmp noResetX topResetX lda #68 jmp noResetX resetX lda #5 noResetX rts ;-------------------------------------------------------------------------- ; VBlank ;-------------------------------------------------------------------------- ; Handle user input and display setup during the VBLANK period ;-------------------------------------------------------------------------- VBlank ; jsr songPlayer ; jsr notePlayer ldx padVal3 ; Get paddle value from table (0-15) lda paddleDecode,x sta DISPLAY ldy p2yVel ldx p2y jsr calcSpeed stx p2yVel jsr checkYPosition sta p2y ; ldx padVal4 ; Get paddle value from table (0-15) ; lda paddleDecode,x ; sta DISPLAY ; ldy p1xVel ; ldx p1x ; jsr calcSpeed ; stx p1xVel ; jsr checkXPosition ; sta p1x ; ldx padVal1 ; ldy p2yVel ; lda p2y ; jsr calcSpeed ; stx p2yVel ; jsr checkYPosition ; sta p2y ; ldx padVal4 ; ldy p2xVel ; lda p2x ; jsr calcSpeed ; stx p2xVel ; jsr checkXPosition ; sta p2x ; Set up temporarly playfield data ldy #84 pfCopy lda level1-1,y sta playField-1,y dey bne pfCopy rts ; VBlank ;-------------------------------------------------------------------------- ; Overscan ;-------------------------------------------------------------------------- overscan sta WSYNC lda #33 ; Use the timer to make sure overscan takes (34) sta TIM64T ; 30 scan lines. 29 scan lines * 76 = 2204 / 64 = 34.4 endOS lda INTIM ; We finished, but wait for timer bne endOS ; by looping till zero sta WSYNC ; End last scanline lda #$82 sta VBLANK rts ; overscan ;-------------------------------------------------------------------------- ; Draw Screen ;-------------------------------------------------------------------------- drawScreen ;******************* Position P0/P1 for Score *********************** sta HMCLR ; Set horizontal player positions for score sta WSYNC lda (temp),x lda (temp),x lda (temp),x lda (temp),x lda temp sta RESP0 lda (temp),x lda (temp),x lda temp sta RESBL nop lda temp sta RESP1 lda #%00100000 sta HMP0 lda #%00010000 sta HMBL sta WSYNC sta HMOVE ; ***************** Wait for Timer ****************** ldx #$80 ; Wait for timer timer LDA INTIM BNE timer ;Loops until the timer is done - that means we're ;somewhere in the last line of vertical blank. STA WSYNC ;End the current scanline - the last line of VBLANK. STA VBLANK ;End the VBLANK period. The TIA will display stuff ;starting with the next scanline. We do have 23 cycles ;of horizontal blank before it displays anything. lda #%10010010 sta GRP0 lda #%00000111 sta NUSIZ0 sta NUSIZ1 lda #0 sta GRP0 sta GRP1 sta COLUP0 sta COLUP1 sta CTRLPF lda #255 sta ENABL sta WSYNC lda #$0F STA COLUPF ; ************** Score Draw Loop ******************** LDY #6 ;We're going to use Y to count lines. scoreLoop lda scoreData1,y sta PF1 lda scoreP0,y sta GRP0 lda scoreData2,y sta PF2 lda scoreP1,y sta GRP1 STA WSYNC ;Wait for end of scanline DEY BNE scoreLoop ;Count scanlines. lda #0 sta PF1 sta PF2 ; ************** Future Status and Timer (22 lines) **************** sta WSYNC sta WSYNC sta WSYNC sta WSYNC lda #%00001111 sta PF2 sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC lda DISPLAY sta PF2 sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC sta WSYNC ; ***************** Position Game Objects ********************* lda #$54 sta pfColor ; Set sizes lda #32 ;2 sta NUSIZ1 ;3 lda #0 sta NUSIZ0 ;3 sta PF1 ;3 sta PF2 ;3 ; Load playfield color buffer lda playField+71,x ;4 66 sta pfBuffer+7 ; ***************** Position M0 (Divider Line) ********************* nop nop nop nop nop nop nop sta HMCLR sta RESM0 lda #%00010000 sta HMM0 sta WSYNC ; ***************** Set Up Marble Shape Pointers ******************* ; Set up P0 (Left Player) lda #>marbleData2 sta pMarble+1 lda p1y sta pMarble ; For vertical values >100 a different page of image data is used cmp #100 bmi noOffset sbc #64 sta pMarble ;3 lda #>marbleData3 sta pMarble+1 noOffset ; Set up P1 (Right Player) lda #>marbleData2 sta pMarble2+1 lda p2y sta pMarble2 ; For vertical values >100 a different page of image data is used cmp #100 bmi noOffset2 sbc #64 sta pMarble2 ;3 lda #>marbleData3 sta pMarble2+1 noOffset2 ; Set player colors to white lda #$0F ;2 sta COLUP0 ;3 sta COLUP1 ;3 ;**************** Position P0 (Left Marble) *************** ldx p1x STA WSYNC ; Uses a lookup table to get the fine and course movement lda movement,x STA HMP0 AND #$0F TAY pPos1 DEY BPL pPos1 STA RESP0 STA WSYNC STA HMOVE ;**************** Position P1 (Right Marble) *************** nop nop nop nop nop nop ldx p2x ; Uses a lookup table to get the fine and course movement lda movement,x STA HMP1 ldx #0 stx HMP0 stx HMM0 AND #$0F TAY pPos2 DEY BPL pPos2 STA RESP1 ; **************** Position M1 (Power Ups) ********************* STA WSYNC STA HMOVE ; Power up flickers between player 1 and 2 ; power up. ldx pwr1x lda frame and #%00000001 beq powerUp1 ldx pwr2x powerUp1 ; Uses a lookup table to get the fine and course movement lda movement,x ldy #$0F sta WSYNC sta HMCLR STA HMM1 AND #$0F TAY pPos3 DEY BPL pPos3 STA RESM1 sta WSYNC sta HMOVE ; The Ball is used to show the center divider in the score ; area, but M0 is used in the game area. Turn on M0 here. lda #$FF sta ENAM0 ;******* Calculate line position of Vertical Paddle bar (Ball) ******* ; temp16L stores the position ; of the vertical paddle indicator ldx padVal1 lda frame and #1 bne vertPad1 ldx padVal3 vertPad1 lda paddleDecode,x sta temp lda #14 sec sbc temp bcc padZero clc adc #1 jmp notPadZero padZero lda #1 notPadZero sta temp16L ldx #$0 cmp #13 bmi ballOff ldx #$FF ballOff stx ENABL lda #%00010000 sta CTRLPF sta WSYNC ; Draw top white line lda #$0F sta COLUBK sta COLUBK ;*********** Position Ball (shows vertical Paddle position) *********** ; The ball graphics flickers between the left side and right side ; to indicate both player's vertical paddle positions lda frame and #1 beq right ldx #4 ballL dex bne ballL lda #%11010000 sta HMBL nop sta RESBL jmp endBallPos right ldx #9 ballR dex bne ballR lda #%11000000 sta HMBL nop sta RESBL endBallPos sta WSYNC sta HMOVE lda #0 sta COLUBK lda #$FF sta ENAM0 nop nop nop nop nop nop nop nop nop nop ;***************** General Setup for Screen Drawing ******************* ; Use Y to track the actual line ldy #156 ;2 20 ; number of blocks ldx #12 ;2 = 18 ; Alternate the two kernals every frame lda frame and #%00000001 beq gotoScanLoop2 jmp gotoScanLoop3 gotoScanLoop2 ; Set starting Paddle counter values lda #161 sta padVal1 sta padVal2 ; Playfield Reference ; ; pfBuffer ; 0 = PF0.1 ; 1 = PF1.1 ; 2 = PF2.1 ; 3 = PF0.2 ; 4 = PF1.2 ; 5 = PF2.2 ; 6 = PFCOLOR1 ; 7 = PFCOLOR2 ; ; 0 Hblank 22 PF0 28 PF1 38 PF2 48 PF0 56 PF1 66 PF2 76 ; |----22----||--6--||---10----||---10----||--6--||---10----||---10----|| ; 4---7 7-------0 0-------7 4---7 7-------0 0-------7 ;****************** Start of Kernal A ********************** scanLoop2 lda pfColor sta COLUPF lda playField-1,x ;4 76 ; 1A) setup ;--------------------------------------- sta PF0 ;3 sta pfBuffer ;3 lda (pMarble),y ;5* sta GRP0 ;3 lda playField+11,x ;4 sta PF1 ;3 lda playField+23,x ;4 sta PF2 ;3 lda (pMarble2),y ;5* sta GRP1 ;3 lda pfBuffer ;3 asl ;2 asl ;2 asl ;2 asl ;2 sta PF0 ;3 48 sta pfBuffer+3 ;3 lda playField+35,x ;4 sta PF1 ;3 55 lda playField+47,x ;4 sta PF2 ;3 sta pfBuffer+5 ;3 dey ;2 lda (pMarble),y ;5* ; 2A) colors ;--------------------------------------- sta GRP0 ;3 lda playField+59,x ;4 66 sta COLUPF ;3 sta pfBuffer+6 ;3 lda pfBuffer ;3 sta PF0 ;3 lda playField+11,x ;4 sta PF1 ;3 lda playField+23,x ;4 sta PF2 ;3 34 lda (pMarble2),y ;4 sta GRP1 ;3 lda pfBuffer+3 ;3 sta PF0 ;3 52 lda playField+35,x ;4 sta PF1 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 ; 3A) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 lda playField+11,x ;4 sta PF1 ;3 sta pfBuffer+1 ;3 lda playField+23,x ;4 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 39 nop lda pfBuffer+3 ;3 sta PF0 ;3 52 lda playField+35,x ;4 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 68 lda INPT0 ;3 bmi paddles1 ;2 or 3 sty padVal1 ;3 paddles1 ; lda (temp),x ; 6 simulate max paddle read cycles ; nop ; 2 lda pfBuffer ;3 sta PF0 ;3 sta WSYNC ; 4A) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 lda pfBuffer+1 ;4 sta PF1 ;3 lda playField+23,x ;4 sta PF2 ;3 29 sta pfBuffer+2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 lda pfBuffer+3 ;3 sta PF0 ;3 52 lda playField+35,x ;4 sta PF1 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; 5A) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 lda pfBuffer+1 ;3 sta PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 29 lda (pMarble2),y ;4 sta GRP1 ;3 lda pfBuffer+3 ;3 sta PF0 ;3 52 lda playField+35,x ;4 sta PF1 ;3 sta pfBuffer+4 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 lda INPT1 ;3 bmi paddles2 ;2 or 3 sty padVal2 ;3 paddles2 ; lda (temp),x ; 6 simulate max paddle-read cycles ; nop ; 2 sta WSYNC ; 6A) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 txs ldx pfBuffer+1 ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 dey ;2 lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; 7A) more setup ;--------------------------------------- ; lda pfBuffer ;3 ; sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 ; Draw the power up (using missile 1) tsx ;2 txa ;2 ldx #ENABL ;2 txs ;2 cmp temp16L php cmp pwr1y ;2 php ;3 tax lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 txs nop lda pfBuffer ;3 sta WSYNC sta PF0 ;3 ldx pfBuffer+1 ;3 ; 8A) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 dey ;2 lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; 9A) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 nop ;8 nop nop nop ; lda #0 ; sta ENABL lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 lda INPT0 ;3 bmi paddles3 ;2 or 3 sty padVal1 ;3 paddles3 ; lda (temp),x ; 6 simulate max paddle-read cycles ; nop ; 2 sta WSYNC ; 10A) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 lda #0 sta ENAM1 ;nop lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 dey ;2 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; 11A) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 nop nop nop nop lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 lda INPT1 ;3 bmi paddles4 ;2 or 3 sty padVal2 ;3 paddles4 ; lda (temp),x ; 6 simulate max paddle-read cycles ; nop ; 2 sta WSYNC ; 12A) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 nop nop nop dey ;2 lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; 13A) setup for loop ;--------------------------------------- lda pfColor ;3 sta COLUPF ;3 stx PF1 ;3 tsx ;2 ;nop ; Load the next right-playfield color lda playField+71-1,x ;4 66 sta pfBuffer+7 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y sta GRP1 nop dey lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;4 sta PF1 ;3 lda pfBuffer+5 ;3 sta PF2 ;3 dex ;2 beq quitScanLoop2 ;2 jmp scanLoop2 ;3 must be 70 ;******************* End Of Kernal A *********************** ;******************* Kernal Clean Up ********************** quitScanLoop2 sta WSYNC ; Draw the white line at the bottom lda #$0F sta COLUPF lda #255 sta PF0 sta PF1 sta PF2 endOfScreen ; One more scanline sta WSYNC lda #0 sta PF0 sta ENABL sta ENAM0 sta PF1 sta PF2 sta COLUP0 sta COLUP1 ; restore stack ldx #253 txs RTS ; ***************** Start of Kernal B ****************** gotoScanLoop3 ; Set starting paddle counter values lda #161 sta padVal3 sta padVal4 scanLoop3 lda pfColor sta COLUPF lda playField-1,x ;4 76 ; 1B) setup ;--------------------------------------- sta PF0 ;3 sta pfBuffer ;3 lda (pMarble),y ;5* sta GRP0 ;3 lda playField+11,x ;4 sta PF1 ;3 lda playField+23,x ;4 sta PF2 ;3 lda (pMarble2),y ;5* sta GRP1 ;3 lda pfBuffer ;3 asl ;2 asl ;2 asl ;2 asl ;2 sta PF0 ;3 48 sta pfBuffer+3 ;3 lda playField+35,x ;4 sta PF1 ;3 55 lda playField+47,x ;4 sta PF2 ;3 sta pfBuffer+5 ;3 dey ;2 ; 2B) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 ; lda pfColor ;3 ; sta COLUPF ;3 lda playField+11,x ;4 sta PF1 ;3 sta pfBuffer+1 ;3 lda playField+23,x ;4 sta PF2 ;3 sta pfBuffer+2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 39 nop nop nop dey ;2 lda pfBuffer+3 ;3 sta PF0 ;3 52 lda playField+35,x ;4 sta PF1 ;3 sta pfBuffer+4 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 68 lda INPT2 ;3 bmi paddles5 ;2 or 3 sty padVal3 ;3 paddles5 ; lda (temp),x ; 6 simulate max paddle read cycles ; nop ; 2 lda pfBuffer ;3 sta PF0 ;3 ; lda (pMarble),y ;5* ; sta GRP0 ;3 sta WSYNC ; 3B) colors ;--------------------------------------- lda playField+59,x ;4 66 sta COLUPF ;3 sta pfBuffer+6 ;3 lda pfBuffer+1 ;3 sta PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 34 lda (pMarble2),y ;4 sta GRP1 ;3 nop nop nop lda pfBuffer+3 ;3 sta PF0 ;3 52 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 ; 4B) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 lda pfBuffer+1 ;3 sta PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 29 lda (pMarble2),y ;4 sta GRP1 ;3 dey ;2 nop nop lda pfBuffer+3 ;3 sta PF0 ;3 52 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 lda INPT3 ;3 bmi paddles6 ;2 or 3 sty padVal4 ;3 paddles6 ; lda (temp),x ; 6 simulate max paddle-read cycles ; nop ; 2 sta WSYNC ; 5B) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 lda pfBuffer+1 ;4 sta PF1 ;3 lda playField+23,x ;4 sta PF2 ;3 29 sta pfBuffer+2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 lda pfBuffer+3 ;3 sta PF0 ;3 52 lda playField+35,x ;4 sta PF1 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; 6B) more setup ;--------------------------------------- lda pfColor ;3 sta COLUPF ;3 lda pfBuffer+1 ;3 sta PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 ; Draw the power up (using missile 1) txa ;2 ldx #ENABL ;2 txs ;2 cmp temp16L php cmp pwr2y ;2 php ;3 tax lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; sta WSYNC ; nop nop ; 7B) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 txs ldx pfBuffer+1 ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 dey ;2 ; nop ; nop nop lda temp lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 ; 8B) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 nop ;8 nop ; lda #0 ; sta ENABL nop nop lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 dey ;2 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 lda INPT2 ;3 bmi paddles7 ;2 or 3 sty padVal3 ;3 paddles7 ; lda (temp),x ; 6 simulate max paddle-read cycles ; nop ; 2 sta WSYNC ; 9B) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 dey ;2 nop nop nop lda #0 ;2 sta ENAM1 ;3 lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 ; 10B) paddles ;--------------------------------------- lda pfBuffer ;3 sta PF0 ;3 lda pfColor ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 lda temp nop nop nop dey ;2 lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 lda INPT3 ;3 bmi paddles8 ;2 or 3 sty padVal4 ;3 paddles8 ; lda (temp),x ; 6 simulate max paddle-read cycles ; nop ; 2 sta WSYNC ; 11B) colors ;--------------------------------------- lda pfBuffer+6 ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 lda temp nop nop nop nop dey ;2 lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+7 ;3 sta COLUPF ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 lda pfBuffer ;3 sta PF0 ;3 ; 12B) nothing ;--------------------------------------- lda pfColor ;3 sta COLUPF ;3 stx PF1 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y ;4 sta GRP1 ;3 nop nop nop nop nop nop nop nop dey ;2 lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;3 sta PF1 ;3 lda pfBuffer+5 ;4 sta PF2 ;3 lda (pMarble),y ;4* sta GRP0 ;3 nop nop lda pfBuffer ;3 sta PF0 ;3 ; 13B) setup for loop ;--------------------------------------- stx PF1 ;3 tsx ;2 ;nop ; Load the next right-playfield color lda playField+71-1,x ;4 66 sta pfBuffer+7 ;3 lda pfBuffer+2 ;3 sta PF2 ;3 lda (pMarble2),y sta GRP1 nop dey lda pfBuffer+3 ;3 sta PF0 ;3 lda pfBuffer+4 ;4 sta PF1 ;3 lda pfBuffer+5 ;3 sta PF2 ;3 dex ;2 beq quitScanLoop3 ;2 jmp scanLoop3 ;3 must be 70 quitScanLoop3 sta WSYNC lda #$0F sta COLUPF lda #255 sta PF0 sta PF1 sta PF2 jmp endOfScreen ; ******************* End of Kernal B ****************** timeData1 scoreP1 scoreP0 byte #%00000000 byte #%00000000 byte #%10000010 byte #%00000000 byte #%00000000 byte #%10010000 byte #%00000000 byte #%00000000 scoreData1 byte #%00000000 byte #%10110010 byte #%10110010 byte #%10110010 byte #%10110110 byte #%10110110 byte #%10110110 byte #%10110110 scoreData2 byte #%00000000 byte #%00010011 byte #%00010011 byte #%00010011 byte #%00010011 byte #%00010001 byte #%00011011 byte #%00011011 level1 ;PF1/2 byte %01100000 byte %11100000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00001111 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 ;PF1.1 byte %00000000 byte %11111111 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00111111 byte %00110000 byte %00110000 ;PF1.2 byte %00000000 byte %00111111 byte %00110000 byte %00110000 byte %00110000 byte %00111111 byte %00000011 byte %01111111 byte %01100000 byte %01111111 byte %00000000 byte %00000000 ;PF2.1 byte %01100000 byte %01100000 byte %01111000 byte %00011000 byte %00011110 byte %00000110 byte %11111111 byte %00000001 byte %00000001 byte %00000000 byte %00000000 byte %00000000 ;PF2.2 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000001 byte %00000001 byte %00000111 byte %00000110 byte %00011110 byte %00011000 ; colors byte $52 byte $54 byte $52 byte $52 byte $52 byte $54 byte $56 byte $54 byte $52 byte $54 byte $54 byte $54 ; colors byte $52 byte $52 byte $54 byte $52 byte $54 byte $52 byte $54 byte $52 byte $54 byte $52 byte $54 byte $54 ; include mtitle.h ; include songplay.h ;--------------------------------------------------------------------------- ; Program Startup ;--------------------------------------------------------------------------- org $FFFC .word Start .word Start
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[stella] homebrew 2600 programers w, Dan Iacovelli | Thread | Re: [stella] Marble Craze control p, Paul Slocum |
[stella] homebrew 2600 programers w, Dan Iacovelli | Date | Re: [stella] Marble Craze control p, Paul Slocum |
Month |