;---------------------------------------------------------------------------

;   * Subject: Re: [stella] New trick?
;   * From: Eckhard_Stolberg@public.uni-hamburg.de (Eckhard Stolberg)
;   * Date: Tue, 26 Aug 1997 16:13:57 +0200

;---------------------------------------------------------------------------

        processor 6502
        include vcs.h

;
; 6532 (RIOT) registers
;
SWACNT          =     $0281
SWBCNT          =     $0283

;
; ROM definitions
;
RomStart        =     $F000
RomEnd          =     $FFFF
IntVectors      =     $FFFA

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Program initialization
;
                ORG     RomStart

Cart_Init:
                SEI                             ; Disable interrupts.:
                CLD                             ; Clear "decimal" mode.

                LDX     #$FF
                TXS                             ; Clear the stack

Common_Init:
                LDX     #$28            ; Clear the TIA registers ($04-$2C)
                LDA     #$00
TIAClear:
                STA     $04,X
                DEX
                BPL     TIAClear        ; loop exits with X=$FF

                LDX     #$FF
RAMClear:
                STA     $00,X           ; Clear the RAM ($FF-$80)
                DEX
                BMI     RAMClear        ; loop exits with X=$7F

                LDX     #$FF
                TXS                             ; Reset the stack

IOClear:
                STA     SWBCNT          ; console I/O always set to INPUT
                STA     SWACNT          ; set controller I/O to INPUT

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Main program loop
;
NewScreen:
                LDA     #$02
                STA     WSYNC           ; Wait for horizontal sync
                STA     VBLANK          ; Turn on VBLANK
                STA     VSYNC           ; Turn on VSYNC
                STA     WSYNC           ; Leave VSYNC on for 3 lines
                STA     WSYNC
                STA     WSYNC
                LDA     #$00
                STA     VSYNC           ; Turn VSYNC off

                LDA     #43             ; VBLANK for 37 lines
                STA     TIM64T          ; 43*64intvls=2752=8256colclks=36.2lines

                LDA     #0
                STA     GRP0
                STA     GRP1
                STA     $80
                LDA     #$10
                STA     $82
                LDA     #$F3
                STA     $81
                LDA     #$F3
                STA     $83
                LDA     #$06
                STA     COLUP0
                LDA     #$0a
                STA     COLUP1
VBLANKLoop:
                LDA     INTIM
                BNE     VBLANKLoop      ; wait for VBLANK timer
                STA     WSYNC           ; finish waiting for the current line
                STA     VBLANK          ; Turn off VBLANK

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ScreenStart:
       LDY      #0
       LDX      #192
       LDA      #1
       STA      NUSIZ0
       STA      NUSIZ1
B1:    STA      WSYNC   ;3
       LDA      ($80),Y ;5
       STA      GRP0    ;3
       LDA      ($82),Y ;5
       STA      GRP1    ;3
       LDA      $86     ;3
       STA      RESP0   ;3
       STA      RESP1   ;3

       STA      RESP0   ;3
       STA      RESP1   ;3
       STA      RESP0   ;3
       STA      RESP1   ;3
       STA      RESP0   ;3
       STA      RESP1   ;3
       STA      RESP0   ;3
       STA      RESP1   ;3
       STA      RESP0   ;3
       STA      RESP1   ;3
       STA      RESP0   ;3
       STA      RESP1   ;3
       STA      RESP0   ;3
       INY              ;2
       DEX              ;2
       BNE      B1
       LDA      #2
       STA      VBLANK
       STA      WSYNC
       STA      WSYNC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OverscanStart:  LDA     #35             ;skip 30 lines (overscan)
                STA     TIM64T

OverscanLoop:
                LDA     INTIM
                BNE     OverscanLoop    ; wait for Overscan timer
                STA     WSYNC           ; finish waiting for the current line

                JMP     NewScreen

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ORG     $F300
GRAPHICS        .byte     $81,$7e,$7e,$60,$60,$60,$60,$78
                .byte     $78,$60,$60,$60,$60,$7e,$7e,$81
                .byte     $81,$3c,$3c,$66,$66,$60,$60,$3c
                .byte     $3c,$06,$06,$66,$66,$3c,$3c,$81
                .byte     $81,$7e,$7e,$60,$60,$60,$60,$78
                .byte     $78,$60,$60,$60,$60,$7e,$7e,$81
                .byte     $81,$3c,$3c,$66,$66,$60,$60,$3c
                .byte     $3c,$06,$06,$66,$66,$3c,$3c,$81
                .byte     $81,$7e,$7e,$60,$60,$60,$60,$78
                .byte     $78,$60,$60,$60,$60,$7e,$7e,$81
                .byte     $81,$3c,$3c,$66,$66,$60,$60,$3c
                .byte     $3c,$06,$06,$66,$66,$3c,$3c,$81
                .byte     $81,$7e,$7e,$60,$60,$60,$60,$78
                .byte     $78,$60,$60,$60,$60,$7e,$7e,$81
                .byte     $81,$3c,$3c,$66,$66,$60,$60,$3c
                .byte     $3c,$06,$06,$66,$66,$3c,$3c,$81
                .byte     $81,$7e,$7e,$60,$60,$60,$60,$78
                .byte     $78,$60,$60,$60,$60,$7e,$7e,$81
                .byte     $81,$3c,$3c,$66,$66,$60,$60,$3c
                .byte     $3c,$06,$06,$66,$66,$3c,$3c,$81
                .byte     $81,$7e,$7e,$60,$60,$60,$60,$78
                .byte     $78,$60,$60,$60,$60,$7e,$7e,$81
                .byte     $81,$3c,$3c,$66,$66,$60,$60,$3c
                .byte     $3c,$06,$06,$66,$66,$3c,$3c,$81
                .byte     $81,$7e,$7e,$60,$60,$60,$60,$78
                .byte     $78,$60,$60,$60,$60,$7e,$7e,$81
                .byte     $81,$3c,$3c,$66,$66,$60,$60,$3c
                .byte     $3c,$06,$06,$66,$66,$3c,$3c,$81
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Set up the 6502 interrupt vector table
;
                ORG     IntVectors
NMI             .word      Cart_Init
Reset           .word      Cart_Init
IRQ             .word      Cart_Init

;                END
