    processor 6502
    include vcs.h

HEIGHT = 72

RED     = $42
GREEN   = $d6;$c6
BLUE    = $86



;===============================================================================
; Z P - V A R I A B L E S
;===============================================================================

    SEG.U   variables
    ORG     $80

tmpVar      .byte
tmpVar2     .byte

frameCnt    .byte

ptr         ds 6*2
colPtr      ds 2

;===============================================================================
; M A C R O S
;===============================================================================

  MAC BIT_B
    .byte   $24
  ENDM

  MAC BIT_W
    .byte   $2c
  ENDM

  MAC SLEEP
    IF {1} = 1
      ECHO "ERROR: SLEEP 1 not allowed !"
      END
    ENDIF
    IF {1} & 1
      nop $00
      REPEAT ({1}-3)/2
        nop
      REPEND
    ELSE
      REPEAT ({1})/2
        nop
      REPEND
    ENDIF
  ENDM


;===============================================================================
; R O M - C O D E
;===============================================================================
    SEG     Bank0
    ORG     $f000

Start SUBROUTINE
    sei                         ;           Disable interrupts, if there are any.
    cld                         ;           Clear BCD math bit.
    ldx     #0
    txs
    pha                         ;           Set stack to beginning.
    txa
.clearLoop:
    pha
    dex
    bne     .clearLoop

    jsr     GameInit

.mainLoop:
    jsr     VerticalBlank
    jsr     GameCalc
    jsr     DrawScreen
    jsr     OverScan
    jmp     .mainLoop


GameInit SUBROUTINE
    lda     #$00
    sta     COLUP0
    lda     #$00
    sta     COLUP1
    lda     #$06
    sta     COLUPF

    lda     #1
    sta     CTRLPF

    lda     #%011
    sta     NUSIZ0
    sta     NUSIZ1
    sta     VDELP0
    sta     VDELP1

    lda     #>ColTbl
    sta     colPtr+1

    sta     WSYNC
    SLEEP   37
    sta     RESP0
    sta     RESP1

    lda     #$10
    sta     HMP0

    lda     #$20
    sta     HMP1

    sta     WSYNC
    sta     HMOVE


    rts


VerticalBlank SUBROUTINE
    lda     #2
    sta     WSYNC
    sta     VSYNC
    sta     WSYNC
    sta     WSYNC
    lsr
    ldx     #44
    sta     WSYNC
    sta     VSYNC
    stx     TIM64T
    rts


GameCalc SUBROUTINE
    ldx     frameCnt
    dex
    bpl     .skipReset
    ldx     #2
.skipReset:
    stx     frameCnt
    txa
    clc
    adc     #<ColTbl
    sta     colPtr

    lda     ClownTbl_Lo,x
    sta     ptr
    adc     #HEIGHT
    sta     ptr+2
    adc     #HEIGHT
    sta     ptr+4

    lda     ClownTbl_Lo+3,x
    sta     ptr+6
    adc     #HEIGHT
    sta     ptr+8
    adc     #HEIGHT
    sta     ptr+10

    lda     ClownTbl_Hi,x
    sta     ptr+1
    sta     ptr+3
    sta     ptr+5
    lda     ClownTbl_Hi+3,x
    sta     ptr+7
    sta     ptr+9
    sta     ptr+11

    rts


    align 256

DrawScreen SUBROUTINE
    ldx     #227
.waitTim:
    lda     INTIM
    bne     .waitTim
    sta     WSYNC
;---------------------------------------
    sta     VBLANK              ; 3
    stx     TIM64T              ; 4

    ldx     #30
.wait:
    dex
    sta     WSYNC
    bne     .wait

    SLEEP   53
    lda     #%11111100          ; 2
    sta     PF2                 ; 3
    ldy     #HEIGHT-1           ; 2
.loop:
    sty     tmpVar              ; 3
    lda     (colPtr),y          ; 5
    sta     COLUPF              ; 3 = 11

    lda     (ptr+$0),y          ; 5
    sta     GRP0                ; 3
    lda     (ptr+$2),y          ; 5
    sta     GRP1                ; 3
    lda     (ptr+$4),y          ; 5
    sta     GRP0                ; 3
    lda     (ptr+$6),y          ; 5
    sta     tmpVar2             ; 3 = 32

    lax     (ptr+$a),y          ; 5
    lda     (ptr+$8),y          ; 5
    ldy     tmpVar2             ; 3
    sty     GRP1                ; 3         @43
    sta     GRP0                ; 3
    stx     GRP1                ; 3
    sta     GRP0                ; 3 = 25

    ldy     tmpVar              ; 3
    dey                         ; 2
    bpl     .loop               ; 2³=  7/8

;---------------------------------------------------------------
    iny
    sty     PF2
    sty     GRP0
    sty     GRP1
    sty     GRP0

    ldx     #2
.waitScreen:
    lda     INTIM
    bne     .waitScreen
    sta     WSYNC
    stx     VBLANK

    rts


OverScan SUBROUTINE
    lda     #36
    sta     TIM64T

.waitTim:
    lda     INTIM
    bne     .waitTim
    rts


;===============================================================================
; R O M - T A B L E S (Bank 0)
;===============================================================================

ColTbl:
  REPEAT HEIGHT/3
    .byte   BLUE
    .byte   GREEN
    .byte   RED
  REPEND
    .byte   BLUE
    .byte   GREEN

    .byte " Clown Demo - Copyright 2003, Thomas Jentzsch "

    org     $f200


;RGB:
Clown0_0:
    .byte   255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
    .byte   255, 254, 254, 254, 255, 255, 255, 255, 251, 255, 255, 242
    .byte   255, 255, 224, 255, 253, 224, 253, 248, 240, 252, 254, 240
    .byte   255, 255, 228, 254, 236, 192, 254, 210, 128, 255, 148, 128
    .byte   255, 210, 128, 255, 201,   0, 255, 169,   0, 254,  73,   0
    .byte   255,  73,   0, 255,  73,   0, 255,  17,   0, 255,   1,   0
Clown0_1:
    .byte    15,  15,  11,  63, 127,  19, 255, 126,  18, 119,  71,   3
    .byte    15,   7,  15, 127, 255, 255, 255, 255, 127, 255, 255, 223
    .byte   255, 255, 159, 255, 255,  43, 255, 127,   9, 255, 255,   3
    .byte   255, 255,   7, 207,  71,   1,  71,  65,   0,  67,  65,   0
    .byte   145, 128,   0, 166,  74,  12, 142,  14,   4, 205,  73,  80
    .byte   227, 145,  16, 193,  65,   0, 193,   1,   0, 129,   1,   0
Clown0_2:
    .byte   255, 255, 255, 255, 255, 255, 255, 223, 223, 255, 251, 237
    .byte   255, 254, 248, 253, 249, 243, 255, 254, 252, 254, 250, 240
    .byte   250, 242, 240, 255, 246, 100, 252, 252, 248, 248, 240, 224
    .byte   232, 208, 128, 208, 192, 128, 224, 208, 200, 251, 184, 168
    .byte   188, 188,  57, 159,  91,  69, 206,  69,  64, 192,  32,   0
    .byte    96,  32,   0, 160,  32,  16,  80,  40,   4, 254,  43,   0

    align 256
Clown0_3:
    .byte   239, 239, 174, 239, 223, 223, 255, 191,  95, 223, 191,  63
    .byte   127, 127, 223, 255, 255,  21, 111, 182,   2, 255,  95,   1
    .byte    95,  11,   0, 149, 214, 255, 127,  39,  11,  31,  63,  11
    .byte   127,  39,  15,  79,  31,  31, 159, 135,  14, 143, 221,  77
    .byte     7, 142,  88, 253,  92,  28, 204,  28, 142, 222,  14,  14
    .byte    13,   0,   0,  21,   0,   0,   9,   0,   1,  23,  91, 136
Clown0_4:
    .byte   255, 255, 254, 255, 127, 127, 255, 255, 127, 255, 255, 127
    .byte   255, 255, 255, 255, 255, 247, 255, 255, 191, 255, 255, 127
    .byte   255, 127,  47, 255, 254, 250, 255, 219,  83, 247, 183,  75
    .byte   223,  91, 109, 255, 253, 221, 255, 254, 182, 127, 125, 116
    .byte   255, 221, 169, 255, 182,  16, 111,  83,   2, 255,  86,   4
    .byte   127, 150,   4, 255,  53,  48, 255, 245,  32, 255, 106,   0
Clown0_5:
    .byte   255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
    .byte   255, 251, 247, 247, 255, 245, 255, 247, 233, 255, 251, 237
    .byte   255, 253, 233, 255, 237, 210, 255, 237, 228, 255, 247, 228
    .byte   255, 246, 228, 127, 237, 160, 255, 218, 128, 255, 235, 193
    .byte   223, 181,   0, 255, 214, 128, 255,  85,   0, 255, 182,  32
    .byte   255, 182,   0, 255,  85,   0, 255, 107,   0, 255, 182,   0

    align 256

;GBR
Clown1_0:
    .byte   255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
    .byte   255, 255, 254, 254, 255, 255, 253, 255, 255, 249, 255, 255
    .byte   241, 255, 255, 224, 255, 249, 224, 252, 252, 240, 254, 255
    .byte   240, 255, 255, 208, 254, 244, 128, 254, 202, 128, 255, 201
    .byte   128, 255, 210, 128, 255, 169, 128, 255, 169,   0, 253,  82
    .byte     0, 255, 165,   0, 255,  73,   0, 255,  36,   0, 255,   1
Clown1_1:
    .byte     5,  31,  31,   9, 127, 127,  15, 255, 123,   2, 103,  71
    .byte     7,  15,  15,  15, 255, 255, 254, 255, 255, 191, 255, 255
    .byte    95, 255, 255,  47, 255, 255,  18, 255, 127,   1, 255, 255
    .byte     7, 255, 231,   3, 207,  71,   1,  69,  65,   0,  65,   0
    .byte     0, 129, 160,   0, 142, 142,  14, 142,   5,   0, 205, 233
    .byte   192, 209,  81,   0, 193,  65,   0, 129, 129,   0, 129,   0
Clown1_2:
    .byte   178, 255, 255, 255, 255, 255, 255, 255, 255, 219, 255, 255
    .byte   245, 255, 252, 241, 249, 251, 246, 255, 254, 248, 254, 249
    .byte   240, 250, 250,  98, 255, 252, 236, 252, 248, 240, 248, 232
    .byte   192, 232, 208, 128, 208, 192, 128, 233, 233, 161, 249, 184
    .byte   180, 189, 189,  26,  95,  91,  68, 205,  65,   0, 160,  64
    .byte     0, 160,  32,   0, 160,  48,   0, 104,  76,   4, 255,  74

    align 256

Clown1_3:
    .byte   159, 239, 239, 206, 239, 223, 158, 255, 191,  63, 223, 127
    .byte    63, 127, 255, 173, 255, 127,   5, 127, 187,   1, 223,  47
    .byte     1,  43,   5,   0, 223, 255, 127,  55,  15,  14,  63,  55
    .byte     2, 111,  15,  15,  31,  31,  15, 135, 143,  13, 253, 107
    .byte     6,  14, 125,  88, 189, 156,  12,  44, 142,  30,  78,  14
    .byte     4,  19,   0,   0,  19,   0,   0,   5,   3,   2, 255, 250
Clown1_4:
    .byte   127, 255, 127, 126, 255, 255, 255, 255, 255, 127, 255, 255
    .byte   223, 255, 255, 255, 255, 255, 183, 255, 255, 127, 255, 255
    .byte    47, 255, 127,  62, 255, 253, 229, 255, 183, 201, 219, 215
    .byte   151, 255, 189, 122, 255, 251, 186, 255, 255, 109, 255, 126
    .byte   180, 223, 109,  72, 255, 109,   1, 187,  83,   2, 255,  92
    .byte     4, 127, 154,  16, 127, 117,  64, 255, 250,   0, 255, 170
Clown1_5:
    .byte   255, 255, 255, 255, 255, 255, 247, 255, 255, 255, 255, 255
    .byte   239, 255, 255, 245, 255, 247, 234, 255, 255, 234, 255, 247
    .byte   236, 255, 251, 209, 239, 237, 201, 255, 251, 228, 255, 247
    .byte   226, 255, 251, 201, 255, 107, 160, 255, 237,  64, 255, 235
    .byte   128, 255, 173, 128, 255, 219,   0, 255,  43,   0, 255, 246
    .byte     0, 255, 155,   0, 255, 106,   0, 255, 235,   0, 255, 171


    align 256
Clown2_0:
    .byte   255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
    .byte   255, 254, 255, 254, 254, 255, 255, 253, 255, 255, 242, 255
    .byte   255, 224, 255, 255, 224, 253, 248, 224, 252, 252, 240, 255
    .byte   255, 232, 255, 253, 192, 254, 212, 128, 255, 202, 128, 255
    .byte   210, 128, 255, 201, 128, 255, 201, 128, 255, 146,   0, 255
    .byte    82,   0, 255,  37,   0, 255,  36,   0, 255,  17,   0, 255
Clown2_1:
    .byte    15,   3,  63,  63,  19, 127, 255,  21, 255, 103,   3,  79
    .byte     7,   7,  31,  63, 183, 255, 255, 254, 255, 255, 255, 255
    .byte   255, 175, 255, 255,  45, 255, 255,   9, 255, 127,   1, 255
    .byte   255,   7, 239, 135,   3,  79,  67,   1,  69,  65,   0, 146
    .byte     0,   0, 160, 134,  10, 142,  14,   4, 198,  73,   0, 121
    .byte   225,   0, 209,  65,   0, 193, 129,   0, 129,   1,   0, 129
Clown2_2:
    .byte   251, 253, 255, 255, 255, 255, 255, 111, 255, 255, 181, 255
    .byte   251, 250, 253, 253, 241, 255, 251, 246, 255, 252, 248, 253
    .byte   249, 240, 254, 243,  98, 254, 252, 236, 252, 248, 224, 240
    .byte   224, 192, 216, 160, 128, 224, 192, 128, 245, 233, 168, 252
    .byte   188,  56, 221,  94,  18, 223,  76,  65, 203,  64,   0, 192
    .byte    32,   0, 160,  32,   0, 176,  48,   8, 172,  46,   1, 255

    align 256

Clown2_3:
    .byte   223, 174, 255, 239, 206, 255, 223, 159, 223,  95,  62, 127
    .byte   127, 127, 255, 223, 149, 255, 127,   2, 119, 173,   1, 127
    .byte    47,   0,  79,   5, 128, 255, 127,  23,  47,  31,  23, 111
    .byte    42,   5,  95,  15,  15, 159, 159,   7, 143, 143,  93, 107
    .byte     6, 140, 253, 252,  76, 188, 140,  12, 174,  94,  14,  14
    .byte    12,   0,  21,   0,   0,  19,   0,   0,  11,   7,   0, 255
Clown2_4:
    .byte   255, 255, 255, 255, 127, 255, 127, 127, 255, 255, 221, 255
    .byte   255, 255, 255, 255, 255, 255, 255, 183, 255, 255, 127, 255
    .byte   255, 175, 255, 127, 189, 255, 237, 165, 251, 237,  83, 239
    .byte   151,  43, 253, 255, 117, 255, 250, 189, 255, 127, 105, 255
    .byte   251, 146, 255, 221,   8, 255,  83,   1, 255,  86,   4, 223
    .byte    86,   0, 255, 154,  16, 127, 117, 192, 255, 186,   0, 255
Clown2_5:
    .byte   255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 255
    .byte   255, 251, 255, 247, 214, 255, 253, 229, 255, 246, 237, 255
    .byte   255, 228, 255, 237, 201, 255, 237, 201, 255, 247, 226, 255
    .byte   245, 228, 255, 247, 161, 239, 211,  64, 255, 237,  64, 255
    .byte   107,   0, 255, 173, 128, 255, 107,   0, 255, 171,   0, 255
    .byte   182,   0, 255, 155,   0, 255, 106,   0, 255, 214,   0, 255


ClownTbl_Lo:
    .byte   <Clown0_0, <Clown2_0, <Clown1_0
    .byte   <Clown0_3, <Clown2_3, <Clown1_3
ClownTbl_Hi:
    .byte   >Clown0_0, >Clown2_0, >Clown1_0
    .byte   >Clown0_3, >Clown2_3, >Clown1_3

    org $f7fc
    .word   Start
    .word   Start


