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