org 0x8000

; greetings from gasman!
; have a good jam y'alls :-)

   ld hl,0x4000
   ld de,0x4001
   ld bc,0x00ff
   ld (hl),0x55
   ldir
   ld hl,0x4000
   ld de,0x4200
   ld bc,0x0600
   ldir
   ld hl,0x4000
   ld de,0x4800
   ld bc,0x1000
   ldir

   ld ix,0x9000
   call gen_sin

   ld hl,0x9200
   ld de,0x9201
   ld (hl),0x03
   ld bc,0x02ff
   ldir

   ld hl,0xa000
   ld de,0xa001
   ld (hl),0x00
   ld bc,8*0x0300
   dec bc
   ldir

loop
   ld hl,0x5800
   ld b,0

ysin    ld hl,0x9000
   inc l
   inc l
   ld (ysin+1),hl
   ld a,(hl)
   and 0xf0
   srl a
   ld l,a
   ld h,0
   add hl,hl
   add hl,hl
bob2
   ld de,0xa000
   add hl,de
   ex de,hl

xsin    ld hl,0x9000
   inc l
   ld a,l
   and 0x07
   jr nz,noskipsin
   inc l
noskipsin
   ld (xsin+1),hl
   ld a,(hl)
   srl a
   srl a
   srl a
   ld l,a
   ld h,0
   add hl,de

   call bock

colorsin
   ld hl,0x9000
   inc l
   inc l
   inc l
   ld (colorsin+1),hl
   ld a,(hl)
   srl a
   srl a

   ld hl,0x94e0
   ld b,0x20
colorlp
   and 0x07
   ld (hl),a
   inc l
   inc a
   djnz colorlp

   ld hl,0x9220
   ld de,0x9200
   ld bc,0x2e0
   ldir

   halt
bob1
   ld hl,0xa000
   ld ix,0x9200
   ld de,0x5800
   ld bc,0x0300
complp
   ld a,(hl)
   or a
   jr nz,nobg
   ld a,(ix)
nobg
   ld (de),a
   inc hl
   inc ix
   inc de
   dec bc
   ld a,b
   or c
   jr nz,complp

bobframe
   ld a,0
   inc a
   and 0x07
   ld (bobframe+1),a
   ld b,a
   add a,a
   add a,b
   add a,0xa0
   ld h,a
   ld l,0
   ld (bob1+1),hl
   ld (bob2+1),hl

   jp loop

bock
   ld bc,32
   add hl,bc
   add hl,bc
bockcount
   ld a,0
   inc a
   ld (bockcount+1),a
bockcol
   ld a,0x50
   jr nz,noincbock
   add a,8
   and 0x38
   ld (bockcol+1),a
noincbock
   ld (hl),0x24
   add hl,bc
   ld (hl),a
   dec c
   add hl,bc
   ld (hl),a
   inc l
   ld (hl),a
   inc l
   ld (hl),a
   dec c
   add hl,bc
   ld (hl),a
   inc l
   ld (hl),0x17
   inc l
   ld (hl),a
   add hl,bc
   ld (hl),a
   inc l
   ld (hl),a
   inc l
   ld (hl),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