    org 0x8000
    jp  main

WAIT    equ 355
START   equ 140

    org 0x8181
irq:
    push    af
    push    bc
    push    de
    push    hl
    call    effect
    pop     hl
    pop     de
    pop     bc
    pop     af
    ei 
    ret

main:
    di
    ld      hl,0x8000
    ld      a,0x81
    ld      b,0
imloop:
    ld      (hl),a
    inc     hl
    djnz    imloop
    ld      (hl),a

    dec     a
    ld      i,a
    im      2
    ei
    
    ld      hl,START
    ld      (w1time),hl
    
;
    ld      hl,0x5800+0x10a
    ld      de,text
    ld      c,7
text1:
    ld      b,12
text2:
    ld      a,(de)
    ld      (hl),a
    inc     hl
    inc     de
    djnz    text2
    push    bc
    ld      bc, 20
    add     hl,bc
    pop     bc
    dec     c
    jr nz,  text1
    
    
    
    
looping:
    halt
    
    jr  looping
    
w1time:
    dw      0
w2time:
    db      0
w1dir:
    db      0

effect:
    ld      bc,(w1time)
    ld      a,(w1dir)
    and     a
    jr z,   down  
up:
    dec     bc
    ccf
    ld      hl,START
    sbc     hl,bc
    jr c,   no_ovl
    ld      bc,START
    xor     a
    ld      (w1dir),a
    jr      no_ovl


down: 
    inc     bc
    inc     bc
    ccf
    ld      hl,START+WAIT
    sbc     hl,bc
    jr nc,  no_ovl
    ld      bc,START+WAIT
    ld      a,1
    ld      (w1dir),a
no_ovl:
    ld      (w1time),bc
w1:
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    dec     bc
    ld      a,b
    or      c
    jr nz,w1

;;

    ld      d,16
    ld      hl,bar
    ld      a,(barpos)
    ld      b,a
    add     a,l
    ld      l,a
    ld      a,b
    inc     a
    and     15
    ld      (barpos),a
    
lineloop:
    ld      a,(hl)
    inc     hl
    out     (254),a
    ld      bc,18
w2:
    nop
    dec     bc
    ld      a,b
    or      c  
    jr nz,w2

    dec     d
    jr nz,  lineloop

    xor     a
    out     (254),a


    

    ret


    ld a,3
    out (254),a
loop
    jr loop

bar:
    db      0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0
    db      0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0
barpos:
    db      0

text:
    db      0,9,0,0,0,9,0,0,9,0,9,0
    db      9,0,9,0,9,0,9,0,9,0,9,0
    db      9,0,0,0,9,0,0,0,9,0,9,0
    db      0,9,0,0,9,0,0,0,0,9,0,0
    db      0,0,9,0,9,0,0,0,9,0,9,0
    db      9,0,9,0,9,0,9,0,9,0,9,0
    db      0,9,0,0,0,9,0,0,9,0,9,0


    
;----------------------------------------
; 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
