    org 0x8000
    ULA EQU 254

    ATTR    EQU #5800

    ; SET All Pixels 
    LD  HL, #4000
    LD  DE, #4001
    LD  BC, 32*192 -1
    LD  A, #FF
    LD  (HL), A
    LDIR
    
    LD DE, ATTR
    LD HL, 32*24
    LD BC, #0000
    LD  A, 0

band_fill

    ;LD  A, R
    
    INC A
    ADD A, E

    AND #07
    OR  #40

    LD (DE), A
    INC DE
    
    SCF
    SBC HL, BC    
    JP NZ, band_fill
    
    ;DJNZ band_fill


    LD HL, ATTR +5*32
        CALL attrLineRight

    LD HL, ATTR +6*32
        CALL attrLineRight
    LD HL, ATTR +6*32
        CALL attrLineRight

    LD HL, ATTR +7*32
        CALL attrLineRight
    LD HL, ATTR +7*32
        CALL attrLineRight
    LD HL, ATTR +7*32
        CALL attrLineRight

    LD HL, ATTR +8*32
        CALL attrLineRight
    LD HL, ATTR +8*32
        CALL attrLineRight
    LD HL, ATTR +8*32
        CALL attrLineRight
    LD HL, ATTR +8*32
        CALL attrLineRight

    LD HL, ATTR +9*32
        CALL attrLineRight
    LD HL, ATTR +9*32
        CALL attrLineRight
    LD HL, ATTR +9*32
        CALL attrLineRight
    LD HL, ATTR +9*32
        CALL attrLineRight
    LD HL, ATTR +9*32
        CALL attrLineRight


    LD HL, ATTR +15*32
        CALL attrLineLeft

    LD HL, ATTR +16*32
        CALL attrLineLeft
    LD HL, ATTR +16*32
        CALL attrLineLeft

    LD HL, ATTR +17*32
        CALL attrLineLeft
    LD HL, ATTR +17*32
        CALL attrLineLeft
    LD HL, ATTR +17*32
        CALL attrLineLeft

    LD HL, ATTR +18*32
        CALL attrLineLeft
    LD HL, ATTR +18*32
        CALL attrLineLeft
    LD HL, ATTR +18*32
        CALL attrLineLeft
    LD HL, ATTR +18*32
        CALL attrLineLeft

    LD HL, ATTR +19*32
        CALL attrLineLeft
    LD HL, ATTR +19*32
        CALL attrLineLeft
    LD HL, ATTR +19*32
        CALL attrLineLeft
    LD HL, ATTR +19*32
        CALL attrLineLeft
    LD HL, ATTR +19*32
        CALL attrLineLeft


loop

    HALT

    LD  A, R
    LD  B, 0
    LD  C, A
    LD  HL, ATTR
    ADD HL,BC
    CALL attrLineLeft
    
    CALL    scrollTopBand

    LD  A, R
    LD  B, 0
    LD  C, A
    LD  HL, ATTR + 10*32
    ADD HL,BC
    CALL attrLineRight
    
    CALL    scrollBottomBand

    LD  A, R
    LD  B, 0
    LD  C, A
    LD  HL, ATTR + 20*32    
    ADD HL, BC
    CALL attrLineLeft

    CALL borderCycle
    
    jr loop


TopBand     DW  ATTR +  9*32 ; 4*32
BottomBand  DW  ATTR + 19*32 ;14*32


scrollBottomBand
    LD HL, (BottomBand)

    LD  DE, ATTR +19*32 + 32
    LD  BC, 32
    ADD HL, BC
    
    LD  A, H
    CP  D
    JP  NZ, scrollBottomBand_skip
    
    LD  A, L
    CP  E
    JP  NZ, scrollBottomBand_skip
        LD  HL, ATTR + 14*32
scrollBottomBand_skip

    LD  (BottomBand), HL
    ;JP attrLineLeft


attrLineLeft
; INPUT: HL Line pointer

    LD  A, L
    AND %11100000
    LD  L, A
    
    LD  D, H
    LD  E, L
    
    LD  B, 31
    INC HL
    LD  C, (HL)
    
attrLineLeft_loop

    LD  A,(HL)
    LD  (DE), A
    INC HL
    INC DE
    
    DJNZ attrLineLeft_loop

    LD  A, C
    LD  (DE), A
    
    RET
    
    

scrollTopBand
    LD HL, (TopBand)

    LD  DE, ATTR +9*32 + 32
    LD  BC, 32
    ADD HL, BC
    
    LD  A, H
    CP  D
    JP  NZ, scrollTopBand_skip
    
    LD  A, L
    CP  E
    JP  NZ, scrollTopBand_skip
        LD  HL, ATTR + 4*32

scrollTopBand_skip

    LD  (TopBand), HL
    ;JP attrLineRight
    
attrLineRight
; INPUT: HL Line pointer

    LD  A, L
    OR  %00011111
    LD  L, A
    
    LD  D, H
    LD  E, L
    
    LD  B, 31
    DEC HL
    LD  C, (HL)
    
attrLineRight_1
    LD  A,(HL)
    LD  (DE), A
    DEC HL
    DEC DE
    
    DJNZ attrLineRight_1

    LD  A, C
    LD  (DE), A
    
    RET
    
Border DB 00

borderCycle
    LD  HL, Border
    INC (HL)
    LD  A, (HL)
    CP  8
    JP  NZ, borderCycle_skip
        XOR A
        LD  (HL), A

borderCycle_skip
    
    OUT (ULA), A

    RET

    
;----------------------------------------
; Snippets: 
;  down_hl
;  up_hl
;  hl_to_scr
;  scr_to_attrs
;  set_point
;  rnd16
;  gen_sin
;----------------------------------------

;----------------------------------------
; Next screen line address in HL
;----------------------------------------
down_hl	
    inc h 
    ld a, h 
    and #07 
    ret nz 
    ld a, l 
    sub #e0 
    ld l, a 
    sbc a, a 
    and #f8 
    add a, h 
    ld h, a 
    ret

;----------------------------------------
; Previous screen line address in HL
;----------------------------------------
up_hl	
    dec h 
    ld a, h 
    cpl 
    and #07 
    ret nz 
    ld a, l 
    sub #20 
    ld l, a 
    ret c 
    ld a, h 
    add a, #08 
    ld h, a 
    ret

;----------------------------------------
; in:  L = x [0..255]
;      H = y [0..191]
; out: HL = addr in screen [4000..57FF]
;      C = pixel number [0..7]
;----------------------------------------
hl_to_scr
    ld   c, l
    ld   a, l
    rlca : rlca : rlca
    xor  h
    and  #c7
    xor  h
    rlca : rlca
    ld   l, a
    ld   a, h
    and  #c0
    inc  a
    rra : rra : rra
    xor  h
    and  #f8
    xor  h
    ld   h, a
    ld   a, c
    and 7
    ret

;----------------------------------------
; in:  HL = addr in screen [4000..57FF]
; out: HL = addr in attrs [5800..5AFF]
;----------------------------------------
scr_to_attrs
    ld   a, h
    rrca : rrca : rrca
    and  #03
    or   #58
    ld   h, a
    ret

;----------------------------------------
; in:  L = x [0..255]
;      H = y [0..191]
;----------------------------------------
set_point
    call hl_to_scr
    ld   de, pixel_tbl
    add  a, e
    ld   e, a
    ld   a, (de)
    ld   (hl), a
    ret

    align 8
pixel_tbl 
    db   #80,#40,#20,#10,#08,#04,#02,#01

;----------------------------------------
; in:  none
; out: HL = random 16bit value
;----------------------------------------
rnd16
.sd equ  $+1
    ld   de, 0
    ld   a, d
    ld   h, e
    ld   l, 253
    or   a
    sbc  hl, de
    sbc  a, 0
    sbc  hl, de
    ld   d, 0
    sbc  a, d
    ld   e, a
    sbc  hl, de
    jr   nc, .st
    inc  hl
.st ld  (.sd), hl
    ret
    
;----------------------------------------
; in:  IX = addr of 256b buffer
; out: generated sin table
;----------------------------------------
gen_sin
    ld   de, #7fbc
    ld   hl, #ff7f
.g0 ld   a, d
    xor  #80 ; uncomment for unsigned
    ld   (ix), a
    xor  #80 ; uncomment for unsigned
    rla
    sbc  a, a
    ld   b, a
    ld   c, d
    adc  hl, bc
    rr   c
    rrca
    rr   c
    add  hl, bc
    ld   b, h
    ld   a, l
    ex   de, hl
    sra b : rra
    sra b : rra
    sra b : rra
    ld   c, a
    ;or   a
    sbc  hl, bc
    ex   de, hl
    inc  ixl
    jr   nz, .g0
    ret 