sintab      equ #6000
buf         equ #7000


    org 0x8000

    ld ix,sintab

    call gen_sin
    call scr_swap
    ld a,#45
    call cls_atr
    call scr_swap
    ld a,#42
    call cls_atr
    
    call buf_init

    
loop
    ei
    halt
    call scr_swap
    call noise
    ; call fx

    ; call buf_init
    ; call buf_draw
    
    jr loop

fx
    ld hl,#d800
    ld ix,buf
fx_loop
    ld a,(ix-#1f)
    add a,(ix-#21)
    add a,(ix+0)
    add a,(ix+#20)
    srl a
    dec a
    srl a
    ld (ix),a
    inc ix
    ld a,(ix+#1f)
    ld l,a
    ld h,#7d
    ldi
    ld a,hx
    cp #7c
    jr c,fx_loop
    ld hl,#78c0
    ld b,#20
fill
    ld a,r
    and 7
    ld (hl),a
    inc l 
    djnz fill

    ret


color   equ #7f

buf_init
    ld hl,buf
    ld bc,#300
buf_init_loop
    ld a,r
    ld (hl),a
    inc hl
    dec bc
    ld a,b
    or c
    jp nz,buf_init_loop
    ret

buf_draw
    ld de,buf
    ld hl,#d800
    ld lx,3
    ld c,color
buf_draw1
    repeat 256
    ld a,(de)
    and a
    jr nz,$+2+1
    ld (hl),c
    inc hl
    inc de
    rend
    dec lx
    jp nz,buf_draw1
    ret

noise
    ld hl,0
noise_count equ $-2
    push hl
    ld de,#c000
    ld lx,192 / 2
noise_loop
    push de
    repeat 32
    ldi
    rend
    pop de
    ex de,hl
    call down_hl
    call down_hl
    ex de,hl
    dec lx
    jr nz,noise_loop
    pop bc
    call rnd16
    ld h,0
    add hl,bc
    ld a,h
    cp #30
    jr c,noise_end
    ld hl,0
noise_end
    ld (noise_count),hl
    ret
    

    
cls_atr
    ld hl,#db00
    ld d,a
    ld e,a
    ld b,32
    jr clear
cls_pix
    ld hl,#d800
    ld d,l
    ld e,l
    ld b,l
clear
    ld (cls_pix_sp),sp
    ld sp,hl
    di
clear_loop
    repeat 12
    push de
    rend
    djnz clear_loop
    ld sp,0
cls_pix_sp   equ $-2
    ei
    ret
    
scr_swap
    ld a,#1d
scr_swap_bank   equ $-1
    xor 10
    ld (scr_swap_bank),a
set_bnk
    push bc
    ld bc,#7ffd
    out (c),a
    pop bc
    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
