Subject: Re: [stella] Demo #1 of my 4 colour playfield game "PUSH" From: emooney@xxxxxxxxxxxxxxxx (Erik Mooney) Date: Sun, 10 May 1998 17:06:22 GMT |
>I'm concerned at my draw code - am I generating an acceptable frame? >Does the TV synch OK? No. >I'd really like some feedback. If you think its interesting, say so. If >you think it sucks, tell me why. Positive response will encourage me to >continue sharing source - otherwise I'll go native. It might be interesting, but all it does is roll the picture on my TV. >OBJPATTERN EQU OBJPOS + OBJSIZE >OBJPATTERNB EQU OBJPATTERN + OBJSIZE > ; WHOO BOY THERE'S GONNA BE SOME PROBLEMS WITH BIT SHIFTING > ; TO MOVE THE OBJECT PATTERNS. PROBABLY BETTER TO THINK ABOUT > ; ROM TABLES FOR THIS STUFF Do you always program in all caps? Hard on the eyes :) > ; TYPICAL FRAME CONSISTS OF 3 VERTICAL SYNC (VSYNC) LINES, > ; 37 VERTICAL BLANK (VBLANK) LINES, > ; 192 TV PICTURE LINES > ; 30 OVERSCAN LINES Correct. > ; WE HAVE JUST 37 LINES (@2812 CYCLES) OF VBLANK, SO WE HAVE TO MAKE > ; SURE THE SCREEN DRAW DOESN'T GET STOMPED ON. THE TIMER WILL TELL > ; US IF WE'VE SCREWED UP. TIMER DONE JUST BEFORE THE LAST WSYNC TO > ; GIVE MAXIMUM POSSIBLE CYCLE COUNT AVAILABILITY/ACCURACY > > LDA #43 ; WELLL... 43.89.. > STA TIM64T ; WE HAVE 37 LINES (= 2812 CYCLES) > ; UH... LESS THE 3 FOR THE LINE BELOW The cycle/line counts here need not be exact... an extra line one way or the other won't stop the TV from syncing. > ; THE KERNEL > ; WE HAVE TO DRAW THE SCREEN TOO? SHEESH, WHAT IS THIS... A 2600? > ; YEAH, THATS RIGHT... LINE BY LINE WE HAVE TO HOLD HANDS WITH THE > ; TIA, PASSING IT DATA SO THAT IT DRAWS THE SCREEN FOR US. NICE. > ; NOT! GOOD FOR NOSTALGIA, THOUGH. WHY, BACK IN MY DAY... Enough editorializing... will you write the damn code already? :) >DRAWSCREEN > > ; WAIT FOR VERTICAL BLANK PERIOD TO END > ; TIMER COUNTS DOWN 1 EVERY 64 CYCLES, SO JUST WAIT FOR IT > ; IF ITS OVER-TIME ALREADY, WE COULD BE IN TROUBLE, AS THE TIMER > ; COUNTS UP WHEN IT REACHES 0. DON'T GO OVER-TIME!! > >ENDVB LDA INTIM > BNE ENDVB If you change that BNE to a BMI, and store a 42 to the timer in the first place instead of a 43, you're in a little better shape if you do overflow. The timer actually counts down to zero from whatever you write to it, then continues past zero, so a BMI will pick it up even if you've gone a few extra cycles. > LDX #32 >PREDRAW STA WSYNC > DEX > BNE PREDRAW ; WELLL.... YEAH > ; PUTS BLANK AREA AT TOP OF SCREEN > ; NO DOCUMENTATION ON THIS ONE - ARBRITRARY? Huh? You just drew 32 blank lines at the top of the visible screen. Was that what you wanted? > ;---- > ; CYCLE THRU DRAWING LINE BY LINE... > ; TIME IS PRECIOUS HERE... THERE ARE JUST 228/3 CYCLES PER LINE > ; AND THAT'S NOT COUNTING THE WSYNCH, SHOULD YOU BE WRITING THAT > ; THERE ARE 68 CYCLES IN THE HBLANK PERIOD, WHICH STARTS AT THE > ; CONCEPTUAL BEGINNING OF A LINE ON THIS MACHINE No. There are 68 *pixels* in the Hblank period, which is 22.667 cycles. > LDY #0 > LDX #0 > >NEXLIN0 LDA #4 > STA Temp0 > >NxtLine > > STA WSYNC ; WAIT FOR START OF HBLANK > > ; THERE ARE 68 CYCLES IN THE HBLANK PERIOD. > ; WE NEED TO HAVE EACH PF BYTE WRITTEN BEFORE THE SCAN REQUIRES IT > > LDA PLAYFIELD,X > STA PF0 > LDA PLAYFIELD+1,X > STA PF1 > LDA PLAYFIELD+2,X > STA PF2 > > NOP > NOP > NOP > NOP > NOP > > ; RIGHT PF > > LDA PLAYFIELD+3,X > STA PF0 > LDA PLAYFIELD+4,X > STA PF1 > LDA PLAYFIELD+5,X > STA PF2 > > NOP > NOP > NOP > NOP > NOP > NOP > > > ; LINE 2 > > NOP > NOP > NOP > > ; LEFT PF > > LDA PLAYFIELD,X > STA PF0 > LDA PLAYFIELD+1,X > STA PF1 > LDA PLAYFIELD+2,X > STA PF2 > > NOP > NOP > NOP > NOP > NOP > > ; RIGHT PF > > LDA PLAYFIELD+3,X > STA PF0 > LDA PLAYFIELD+4,X > STA PF1 > LDA PLAYFIELD+5,X > STA PF2 > > INY > > DEC Temp0 > BNE NxtLine > > CLC > TXA > ADC #6 > TAX > > CMP #96 > BCC NEXLIN0 > > > ; MAKE SURE WE HAVE A 192 LINE DISPLAY > ; PAL MUST HAVE AN EVEN # OR THE COLOURS SCREW UP?! > > >FIN LDA #0 > STA WSYNC > INY > CPY #192 > BCC FIN > > > LDA #D1 > STA VBLANK ; END OF SCREEN - ENTER BLANKING > > ; DISABLE ALL THINGS THAT COULD APPEAR ONSCREEN > > LDA #0 > STA PF0 > STA PF1 > STA PF1 > STA GRP0 > STA GRP1 > STA ENAM0 > STA ENAM1 > STA ENABL > > RTS > >;-------- >OVERSCAN > > ; AFTER THE SCREEN IS DRAWN, WE HAVE 30 LINES OF OVERSCAN > ; THIS TIME SHOULD BE USED FOR GAME LOGIC > > LDX #30 >OVERLIN STA WSYNC > DEX > BNE OVERLIN > > RTS > >; In PF0 and PF2, the most significant bit (bit 7) is on the RIGHT >; side. In PF1, the most significant bit is on the LEFT side. This >; means that relative to PF0 and PF2, PF1 has a reversed bit order. >; It's just really weird. >; >; PF0 | PF1 | PF2 >; 4 5 6 7|7 6 5 4 3 2 1 0|0 1 2 3 4 5 6 7 > > >;--------- >; DRAWOBJECTS > >DRAWOBJECTS > > ; PASS > ; TOGGLE = FRAME NUMBER (1 OR 2) > > ; ROUTINE EITHER DRAWS OR UNDRAWS OBJECTS, DEPENDING ON REQUIRED > ; PRESENCE IN FRAME BUFFER. OBJECTS USUALLY REMAIN DRAWN. > ; OBJECT FLAG CAN OVERRIDE AND FORCE DRAW > > ; NOW WE NEED TO ADD THOSE "JUST-THIS-FRAME" COLOURS > ; FRAME ACTION > ; 0 ONLY SHOW COLOUR 1 AND COLOUR 3 OBJECTS > ; IE: (UN)DRAW COLOUR 1 > ; 1 ONLY SHOW COLOUR 2 AND COLOUR 3 OBJECTS > ; IE: (UN)DRAW COLOUR 2 > > ; LOOP THROUGH OBJECTS, (UN)DRAWING ONLY TRANSIENT COLOURS > ; OBJECT (UN)DRAW CAN BE FORCED (D7 OF OBJFLAGS) > > LDX #OBJSIZE-1 > >FOROBJ LDY OBJPOS,X ; POSITION IN VIRTUAL SCREEN > BMI NEXTOBJ ; NOT PRESENT > > ; COLOUR 0 IS "ON" ALL THE TIME > ; COLOUR 1 IS ON DURING FRAME 1 ONLY > ; COLOUR 2 IS ON DURING FRAME 2 ONLY > ; COLOUR 3 IS ON DURING FRAME 1 AND 2 > > LDA OBJFLAGS,X > BMI FORCED > EOR TOGGLE ; FRAME 1 OR 2 > AND #3 > > ; NOW, F0 C0 -> 1 > ; F0 C1 -> 0 > ; F0 C2 -> 3 > ; F0 C3 -> 2 > ; AND, F1 C0 -> 2 > ; F1 C1 -> 3 > ; F1 C2 -> 0 > ; F1 C3 -> 1 > > BNE NEXTOBJ ; NEAT!! > >FORCED > > ; HAVE DETERMINED THAT DRAW/ERASE IS REQUIRED > > LDA OBJPATTERN,X > EOR PLAYFIELD,Y > STA PLAYFIELD,Y > > LDA OBJPATTERN,X > EOR PLAYFIELD+6,Y > STA PLAYFIELD+6,Y > > LDA OBJPATTERNB,X > EOR PLAYFIELD+1,Y > STA PLAYFIELD+1,Y > > LDA OBJPATTERNB,X > EOR PLAYFIELD+7,Y > STA PLAYFIELD+7,Y > >NEXTOBJ DEX > BPL FOROBJ > > RTS > > >; -------- >; INIT1CE > > ; ONE-TIME INITIALIZATION > ; HAPPENS AT SYSTEM RESET, NO OTHER TIME > >INIT1CE > > LDA #D1 > STA VBLANK ; START WITH TIA DISABLED > > LDA #D1 > STA CTRLPF ; SCORE (COLOUR SEP) > > > ; COPY THE PLAYFIELD FROM THE TABLE > > LDX #93 > >PLAYFILLED > > LDA BITMAP,X > STA PLAYFIELD,X > LDA BITMAP+1,X > STA PLAYFIELD+1,X > LDA BITMAP+2,X > STA PLAYFIELD+2,X > > TXA > SEC > SBC #3 > TAX > BCS PLAYFILLED > > > > ; INIT OBJECTS TO NONE > > LDX #OBJSIZE-1 > LDA #$80 ; D7 = INACTIVE >INITOBJ STA OBJPOS,X > DEX > BPL INITOBJ > > > ; ADD A COUPLE OF TEST OBJECTS > > LDA #31 > STA OBJPOS > LDA #1 > STA OBJFLAGS > LDA #%11111111 > STA OBJPATTERN > LDA #0 > STA OBJPATTERNB > > LDA #19 > STA OBJPOS+1 > LDA #2 > STA OBJFLAGS+1 > LDA #%11111111 > STA OBJPATTERN+1 > LDA #0 > STA OBJPATTERNB+1 > > > LDA #1 > STA TOGGLE ; CYCLES 1/2/1/2... > > > ; JSR DRAWOBJECTS > > ; AT THIS STAGE WE HAVEN'T DRAWN COLOUR 3 OBJECTS > ; THAT COMES LATER - GIVE IT TIME :) > > RTS > > >BITMAP > > ; JUST TREAT THIS AS A 40X24 BITMAP > ; THIS IS D0 OF 4 COLOUR PLAYFIELD > > ; PF0 <-- PF1 --> PF2 <-- PF0 <-- PF1 --> PF2 <-- > ; FLIP XXXX OK FLIP FLIP XXXX OK FLIP > .BYTE %11110000,%11111111,%11111111,%11110000,%11111111,%11111111 > .BYTE %00010000,%10000000,%10000000,%00000000,%00000000,%10000000 > .BYTE %00010000,%10000000,%10000000,%10010000,%11001110,%10001110 > .BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110 > .BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110 > .BYTE %00010000,%11100000,%10000000,%10010000,%11001110,%10001110 > .BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000 > .BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000 > .BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000 > .BYTE %00010000,%00000000,%10000000,%00000000,%00000001,%10100010 > .BYTE %00010000,%00000000,%10000000,%00000000,%00000011,%10110111 > .BYTE %00010000,%00000000,%10000000,%00000000,%00000001,%10100010 > .BYTE %11010000,%00000000,%10000000,%00000000,%00000011,%10100111 > .BYTE %11010000,%00000000,%10000000,%00000000,%00000001,%10100010 > .BYTE %00010000,%00000000,%10000000,%00000000,%00000000,%10000000 > .BYTE %11110000,%11111111,%11111111,%11110000,%11111111,%11111111 > ; ^^^^ ^^^^ > ; UNUSED UNUSED > > > ; COLOURS FOR 4-COLOUR SCREEN > ; THESE COLOURS CORRESPOND TO EACH OF 2 FRAMES OF THE MULTIPLEXED > ; DISPLAY. THERE ARE TWO BKCOLS AVAILABLE, AND TWO SIDES OF THE SCREEN > ; THE 4 COLOURS ARE FROM COMBINATION OF THE TWO FRAME MULTIPLEX, AND > ; THE COMBINATION DISPLAY ON THESE FRAMES. COLOURS ARE COMBINIATIONS > ; HOPEFULLY THIS WON'T FLICKER TO BUGGERY ON THE REAL THING, LIKE IT > ; DOES ON MY EMULATOR! > > ; FR.1 FR.2 >BKCOL .BYTE 100, 100 >PFCOL1 .BYTE 16, 196 >PFCOL2 .BYTE 22, 45 > > >;-------- >; SYSTEM VECTORS > > org $FFFC > .WORD START ; NMI? > .WORD START ; RESET VECTOR > -- Archives (includes files) at http://www.biglist.com/lists/stella/archives/ Unsub & more at http://www.biglist.com/lists/stella/stella.html
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[stella] Demo #1 of my 4 colour pla, Andrew Davie | Thread | Re: [stella] Demo #1 of my 4 colour, Erik Mooney |
[stella] Optimize THIS! :), Retroware | Date | Re: [stella] Demo #1 of my 4 colour, Erik Mooney |
Month |