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