;***********************************************************************
;**                                                                   **
;**     Asymmetrical Playfield With Two Vertical Scrolling V1.01      **
;**                 Christian Bogey - April 17,2004                   **
;**                                                                   **
;***********************************************************************

; Speed of each Playfield Scrolling Can be ajusted playing with
; Vars : Scroll_Speed_Left & Scroll_Speed_Right 
; Lower Value = Faster Scrolling (1-n)


               processor 6502 
               include "vcs.h" 
               include "macro.h" 
                
;-----------------------------------------------------------------------
;-                          Define Variables                           -
;-----------------------------------------------------------------------
                       ; Right Playfield Pattern for current Frame 
PF0ADR = $80           ; 1st byte in RAM
PF1ADR = $81
PF2ADR = $82

PF0TMP = $83           ; Right Playfield Pattern of the 1st line
PF1TMP = $84           ; to draw for the current Frame
PF2TMP = $85

PF0Ghost = $86         ; Temp Var for Right Playfield
Scroll_Value_Right = $87

PF0Left = $88          ; Bytes for Left Playfield Pattern
PF1Left = $89
PF2Left = $8A

PF0LeftTMP = $8B       ; Left Playfield Pattern of the 1st line
PF1LeftTMP = $8C       ; to draw for the current Frame
PF2LeftTMP = $8D

Scroll_Value_Left = $8E

Scroll_Speed_Left = 1  ; Lower Value = Faster Scrolling (1-n)
Scroll_Speed_Right = 7 ; Lower Value = Faster Scrolling (1-n)

PF0DATA = #%00110011   ; Playfield Patterns (Init Values)	
PF1DATA = #%11001100
PF2DATA = #%00110011

Color_Left = #$48      ; Red
Color_Right = #$B8     ; Green

;-----------------------------------------------------------------------
;-                         Start of code here                          -
;-----------------------------------------------------------------------

               SEG 
               ORG $F000 

Reset 

;-----------------------------------------------------------------------
;-        Clear RAM, TIA registers and Set Stack Pointer to #$FF       -                               
;-----------------------------------------------------------------------
        
               SEI
               CLD	
               LDX #$FF
               TXS
               LDA #0
Clear_Mem
               STA 0,X
               DEX
               BNE Clear_Mem	

               LDA #PF0DATA     ; Init Playfield Pattern
               STA PF0LeftTMP
               STA PF0TMP
               LDA #PF1DATA
               STA PF1LeftTMP
               STA PF1TMP
               LDA #PF2DATA
               STA PF2LeftTMP
               STA PF2TMP
               LDA #Scroll_Speed_Right ; Init Scroll Vars
               STA Scroll_Value_Right
               LDA #Scroll_Speed_Left
               STA Scroll_Value_Left
               
               LDA #0
               STA COLUBK       ; Background = Black     
               LDA #%00000010   ; Active Score Bit = 2 Colors for Playfield
               STA CTRLPF
               LDA #Color_Left  ; Left Playfield Color
               STA COLUP0
               LDA #Color_Right ; Right Playfield Color
               STA COLUP1
		
;-----------------------------------------------------------------------
;-                         Start to Build Frame                        -
;-----------------------------------------------------------------------				

Start_Frame 

         
       ; Start of Vertical Blank 

               LDA #2 
               STA VSYNC 

               STA WSYNC 
               STA WSYNC 
               STA WSYNC         ; 3 scanlines of VSYNC

               LDA #0 
               STA VSYNC            
                
       
       ; Start of Vertival Blank
       ; Count 37 Scanlines

               LDA  #43          ; 2 cycles
               STA  TIM64T       ; 4 cycles

;>>>> Free space for code starts here 
               
               LDA PF0LeftTMP    ; Load Pattern (Left Side)
               STA PF0Left       ; for current Loop
               LDA PF1LeftTMP
               STA PF1Left
               LDA PF2LeftTMP
               STA PF2Left
            
               LDA PF0TMP        ; Load Pattern (Right Side)
               STA PF0ADR        ; for current loop
               LDA PF1TMP
               STA PF1ADR
               LDA PF2TMP
               STA PF2ADR

       ;>>>> Scroll Left Side <<<<
       
               DEC Scroll_Value_Left   ; Scroll Time for Left Side ?
               BNE No_Scroll_Left      ; No -> Continue
               LDA #Scroll_Speed_Left
               STA Scroll_Value_Left
               
        ; Build Pattern to Scroll for the Next Loop               
               DEC PF0LeftTMP
               DEC PF1LeftTMP
               DEC PF2LeftTMP
               
No_Scroll_Left

       ;>>>> Scroll Right Side <<<<
               
               DEC Scroll_Value_Right  ; Scroll Time for Right Side ?
               BNE No_Scroll_Right     ; No -> Continue
               LDA #Scroll_Speed_Right ; Init Scroll Vars
               STA Scroll_Value_Right 
               
       ; Build Pattern to Scroll for the Next Loop                
       ; Change Pattern PF0
               LDA PF0TMP        ; ////////// 80x86 ROL START
               ASL                               
               BCC ASL_00
               ORA #%000000001
ASL_00                  
               STA PF0TMP        ; ////////// 80x86 ROL END
                
       ; Change Pattern PF1                
               LDA PF1TMP        ; ////////// 80x86 ROL START
               LSR                               
               BCC ASL_01
               ORA #%10000000
ASL_01                  
               STA PF1TMP        ; ////////// 80x86 ROL END
               
       ; Change Pattern PF2               
               LDA PF2TMP        ; ////////// 80x86 ROL START
               ASL               
               BCC ASL_02
               ORA #%000000001
ASL_02                  
               STA PF2TMP        ; ////////// 80x86 ROL END               

No_Scroll_Right               

       
;>>>> Free space for code ends here

Wait_VBLANK_End
               LDA INTIM                 ; 4 cycles
               BPL Wait_VBLANK_End       ; 3 cycles
               STA WSYNC         ; 3 cycles  Total Amount = 21 cycles
                                 ; 2812-21 = 2791; 2791/64 = 43.60 (TIM64T)

               LDA #0 
               STA VBLANK       ; Enable TIA Output
                                
      
       ; Display 192 Scanlines of Asymmetrical Playfield with
       ; one Scrolling for each Side of the Playfield
		
               LDY #48           ; Build 48 * (2+1+1) = 192 Scanlines
               LDX #2            ; Build 2 Scanlines
Picture                          ; (+ 2 more later = 4)
               LDA PF0Left       ; Build Left Playfield
               STA PF0
               LDA PF1Left
               STA PF1
               LDA PF2Left
               STA PF2
		
               SLEEP 4           ; Build Right Playfield
               LDA PF0ADR
               STA PF0
               SLEEP 4
               LDA PF1ADR
               STA PF1
               SLEEP 4
               LDA PF2ADR                
               STA PF2
               STA WSYNC        
               DEX               ; 2 Scanlines build ?
               BNE Picture       ; No = Continue
                
       ;---------------- Build Scanline 3
               LDA PF0Left       ; Build Left Playfield
               STA PF0
               LDA PF1Left
               STA PF1
                
               LDA PF0ADR        ; ////////// 80x86 ROL START
               ASL               ; Change Pattern PF0 and store it                 
               BCC ASL_0         ; into Temp Address for Right PF
               ORA #%000000001
ASL_0                  
               STA PF0Ghost      ; ////////// 80x86 ROL END
              
               LDA PF2Left
               STA PF2
               
               LDA PF0ADR        ; Build Right Playfield
               STA PF0
               INC PF0Left       ; New PF0 Pattern for incoming
                                 ; Left Side
               LDA PF1ADR
               STA PF1
               INC PF1Left       ; New PF1 Pattern for incoming
                                 ; Left Side
               LDA PF2ADR
               STA PF2
               LDA PF0Ghost     
               STA PF0ADR        ; Update PF0 Data with New Pattern
               STA WSYNC         ; 3 Scanlines
               
       ;---------------- Build Scanline 4
                                 ; Build Left Playfield
               INC PF2Left       ; New PF2 Pattern for Left Side
               LDA PF0Left
               STA PF0           
               LDA PF1Left
               STA PF1
               
               LDA PF1ADR        ; ////////// 80x86 ROL START
               LSR               ; Change Pattern PF1 for                 
               BCC ASL_1         ; Right Playfield
               ORA #%10000000
ASL_1                
               STA PF1ADR        ; ////////// 80x86 ROL END
           
               LDA PF2Left
               STA PF2
              
               LDA PF0ADR        ; Build Right Playfield
               STA PF0
               LDA PF1ADR
               STA PF1
               LDA PF2ADR        ; ////////// 80x86 ROL START
               ASL               ; Change Pattern PF2
               BCC ASL_2
               ORA #%00000001
ASL_2           
               STA PF2ADR        ; ////////// 80x86 ROL END                
               STA PF2
               LDX #2		 ; 2 Scanlines To Draw for Next loop
               STA WSYNC	 ; 4 Scanlines
               DEY               ; * 48 = 192 Scanlines
               BEQ Picture_End   ; Lenght to Branch Overflow
               JMP Picture       ; so use JMP
Picture_End

;-----------------------------------------------------------------------
;-                            Frame Ends Here                          -
;-----------------------------------------------------------------------
    		
               LDA #%01000010 
               STA VBLANK        ; Disable TIA Output 


       ; 30 Scanlines of Overscan
        
               LDX #30 
Overscan        
               STA WSYNC 
               DEX 
               BNE Overscan 

               JMP Start_Frame   ; Build Next Frame 


;-----------------------------------------------------------------------
;-                          Set Interrup Vectors                       -
;-----------------------------------------------------------------------


               ORG $FFFA 

Interrupt_Vectors 

               .word Reset       ; NMI 
               .word Reset       ; RESET 
               .word Reset       ; IRQ 

       END 


