Re: [stella] Rubik Cube 3d

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