Subject: Re: [stella] Rubik Cube 3d From: Christopher Tumber <christophertumber@xxxxxxxxxx> Date: Mon, 23 Dec 2002 19:05:59 -0500 |
I'm not going to examine the top of the cube at this time as it's not as complex as the side of the cube (at least not until the side of the cube becomes a factor and I think that once we solve the side of the cube we can apply the principal to the top) Looking at it more carefully, it's actually has to be capable of displaying up to 8 different "sections" (because of the diagonals) though there are only 6 different colours. The minimum width of a section of the side is 4 pixels. The maximum width is 16 pixels Diagraming out the rows which need to be displayed: 000011111111111122222222222222223333333333333333444444444444444455555555555555556666666666667777 000000001111111122222222222222223333333333333333444444444444444455555555555555556666666677777777 000000000000111122222222222222223333333333333333444444444444444455555555555555556666777777777777 000000000000000022222222222222223333333333333333444444444444444455555555555555557777777777777777 000000000000000088882222222222223333333333333333444444444444444455555555555599997777777777777777 000000000000000088888888222222223333333333333333444444444444444455555555999999977777777777777777 000000000000000088888888888822223333333333333333444444444444444455559999999999977777777777777777 000000000000000088888888888888883333333333333333444444444444444499999999999999977777777777777777 00000000000000008888888888888888AAAA333333333333444444444444BBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAA3333333344444444BBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAA33334444BBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 00000000000000008888888888888888AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB99999999999999977777777777777777 Then the pattern is drawn again, with colours changed (and again). The diagonal line is actually much easier to achieve than the demo I previously posted. It's just a double-sized P0 or P1 sprite (one for either side). You then just set the bits P0=#128+64 is scanline 1, P0=#128+64+32+16 is scanline 2, P0=#128+64+32+16+8+4 is scanline 3 and #128+64+32+16+8+2+1 is scanline 4 (or 0 and change what's put into COLUPF). So, on the scanlines with a diagonal, the ONLY registers/RAM which needs to be manipulated is GRP0 and GRP1 and they need to be moved every fourth scanline. Thereafter, the COLUP0, COLUP1 and 6 RAM locations which correspond to the RAM routine to change COLUPF need to be changed for the next set of blocks (I'm still thinking a double-buffering technique so they can be changed will still drawing the current colours.) 5x8=40 cycles. But again, this can be done during any of the four scanlines. So there's lots of time. I'm pretty confident that's how they did it. My demo isn't generalised, doesn't load into RAM and could stand to be optimised but I think it'll show this is the likely soloution. Chris....
Attachment:
2blocks.bin
Description: Binary data
;BEWARE! NO STACK!! processor 6502 include vcs.h org $F000 Start ; SEI ; Disable interrupts, if there are any. ; CLD ; Clear BCD math bit. ; LDX #$FF ; TXS ; Set stack to beginning. ; LDA #0 ;B1 STA 0,X ; DEX ; BNE B1 lda #255 sta PF0 sta PF1 sta PF2 lda #1 sta CTRLPF lda #00 STA COLUBK lda #0 STA COLUPF sta GRP0 sta GRP1 sta HMCLR lda #14 sta COLUP1 sta COLUP0 DrawLogo LDX #0 LDA #2 STA VSYNC ;Begin vertical sync. STA WSYNC ; First line of VSYNC STA WSYNC ; Second line of VSYNC. LDA #41 STA TIM64T LDA #0 STA CXCLR STA WSYNC ; Third line of VSYNC. STA VSYNC ; (0) DrawScreen LDA INTIM BNE DrawScreen ; Whew! STA WSYNC STA VBLANK ;End the VBLANK period with a zero. lda #0 sta GRP0 sta GRP1 lda #5 sta NUSIZ0 ;3 Cycles sta NUSIZ1 ;3 Cycles sta WSYNC nop nop nop nop nop nop nop nop nop nop nop sta RESP0 nop nop nop nop nop nop nop nop nop nop nop sta RESP1 lda #$76 sta COLUP0 lda #$76+4 sta COLUP1 lda #0 sta HMP0 lda #16 sta HMP1 sta WSYNC sta HMOVE sta WSYNC lda #128+64 sta GRP0 lda #2+1 sta GRP1 nop nop nop nop nop nop lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16 sta GRP0 lda #8+4+2+1 sta GRP1 nop nop nop nop nop nop lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16+8+4 sta GRP0 lda #32+16+8+4+2+1 sta GRP1 lda #128+16 sta HMP0 lda #64+32+16 sta HMP1 nop lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #0 STA COLUPF ;;;; sta WSYNC sta HMOVE sta HMOVE lda #0 sta GRP0 lda #0 sta.w GRP1 ; nop lda #32+16 sta HMP1 lda #$76 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF lda #$36 sta COLUP0 lda #$12 sta COLUP1 lda #128+64+32+16 sta HMP0 sta WSYNC sta HMOVE lda #128+64 sta GRP0 lda #2+1 sta.w GRP1 nop nop nop nop lda #$76 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16 sta GRP0 lda #1+2+4+8 sta GRP1 nop nop nop nop nop nop lda #$76 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16+8+4 sta GRP0 lda #1+2+4+8+16+32 sta GRP1 nop nop nop nop nop nop lda #$76 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #0 sta GRP0 lda #0 sta GRP1 lda #128+16 sta HMP0 lda #64+32+16 sta HMP1 nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF ;;;; sta WSYNC sta HMOVE sta HMOVE lda #0 sta GRP0 lda #0 sta.w GRP1 lda #32+16 sta HMP1 lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF lda #$1c sta COLUP0 lda #$b6 sta COLUP1 lda #128+64+32+16 sta HMP0 sta WSYNC sta HMOVE lda #128+64 sta GRP0 lda #2+1 sta.w GRP1 nop nop nop nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16 sta GRP0 lda #1+2+4+8 sta GRP1 nop nop nop nop nop nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16+8+4 sta GRP0 lda #1+2+4+8+16+32 sta GRP1 nop nop nop nop nop nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$00 STA COLUPF lda #$00 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #0 sta GRP0 lda #0 sta GRP1 lda #64+32+16 sta HMP0 lda #128 sta HMP1 ; nop ; nop ; nop ; nop ; nop nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF ldy #4 next: sta WSYNC sta HMOVE lda #0 sta GRP0 lda #0 sta.w GRP1 nop nop nop nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF dey bne next lda #32 sta HMP0 sta HMP1 ; Row 2 lda #128+64 sta WSYNC sta HMOVE sta GRP0 lda #2+1 sta GRP1 lda #$36 sta COLUP0 lda #$36+4 sta.w COLUP1 ; nop ; nop ; nop ; nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16 sta GRP0 lda #8+4+2+1 sta GRP1 nop nop nop nop nop nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16+8+4 sta GRP0 lda #32+16+8+4+2+1 sta GRP1 lda #128+16 sta HMP0 lda #64+32+16 sta HMP1 nop lda #$76 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #0 STA COLUPF ;;;; sta WSYNC sta HMOVE sta HMOVE lda #0 sta GRP0 lda #0 sta.w GRP1 ; nop lda #32+16 sta HMP1 lda #$36 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF lda #$1c sta COLUP0 lda #$76+4 sta COLUP1 lda #128+64+32+16 sta HMP0 sta WSYNC sta HMOVE lda #128+64 sta GRP0 lda #2+1 sta.w GRP1 nop nop nop nop lda #$36 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16 sta GRP0 lda #1+2+4+8 sta GRP1 nop nop nop nop nop nop lda #$36 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16+8+4 sta GRP0 lda #1+2+4+8+16+32 sta GRP1 nop nop nop nop nop nop lda #$36 STA COLUPF lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #0 sta GRP0 lda #0 sta GRP1 lda #128+16 sta HMP0 lda #64+32+16 sta HMP1 nop lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$76+4 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF ;;;; sta WSYNC sta HMOVE sta HMOVE lda #0 sta GRP0 lda #0 sta.w GRP1 lda #32+16 sta HMP1 lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$76+4 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF lda #$b6 sta COLUP0 lda #$12 sta COLUP1 lda #128+64+32+16 sta HMP0 sta WSYNC sta HMOVE lda #128+64 sta GRP0 lda #2+1 sta.w GRP1 nop nop nop nop lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$76+4 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16 sta GRP0 lda #1+2+4+8 sta GRP1 nop nop nop nop nop nop lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$76+4 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #128+64+32+16+8+4 sta GRP0 lda #1+2+4+8+16+32 sta GRP1 nop nop nop nop nop nop lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$76+4 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF sta WSYNC lda #0 sta GRP0 lda #0 sta GRP1 lda #64+32+16 sta HMP0 lda #128 sta HMP1 ; nop ; nop ; nop ; nop ; nop nop lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF ldy #4 next2: sta WSYNC sta HMOVE lda #0 sta GRP0 lda #0 sta.w GRP1 ; nop ; nop nop nop nop nop lda #$36 STA COLUPF lda #$1c STA COLUPF lda #$b6 STA COLUPF lda #$12 STA COLUPF lda #$76+4 STA COLUPF lda #$36+4 STA COLUPF lda #0 STA COLUPF dey bne next2 lda #$00 sta GRP0 sta GRP1 sta WSYNC ldy #100 nextblankline: sta WSYNC dey bne nextblankline STA VBLANK ; Make TIA output invisible, lda #35 sta TIM64T OverscanWait: lda INTIM bne OverscanWait JMP DrawLogo ;Continue forever. org $FFFC .word Start .word Start
Attachment:
2blocks.gif
Description: GIF image
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [stella] Seeking ROM dumper inf, Eric Ball | Thread | Re: [stella] Rubik Cube 3d, Christopher Tumber |
Re: [stella] Rubik Cube 3d, Eckhard Stolberg | Date | Re: [stella] Seeking ROM dumper inf, Eric Ball |
Month |