; TmK^deMarche
   org 0x8000

   ld hl,#c000: ld de,#c001: ld bc,16384-1: ld (hl),l: ldir
   ld hl,buff4: ld d,#c0+22
   ld c,20
L8 ld b,20: ld e,256-10
L7 ld a,(hl): ld (de),a: inc hl: inc e: djnz,L7
   inc d:dec c: jr nz,L8



   ld hl,#4000
   ld a,%01010101
   ld b,24
L1  ld (hl),a
   inc l
   jr nz,L1
   xor #ff
   dec l
   inc hl
   djnz L1
loop
   ld ix,buff
   ld bc,768
L2   call rnd16
   ld a,l
   and 63
   ld (ix),a
   inc ix
   dec bc
   ld a,b
   or c
   jr nz,L2

   ld ly,4
L4 ld ix,buff: ld de,buff2: ld bc,768
L3 ld a,(ix): add a,(ix+1): add a,(ix+32): add a,(ix-1)
   srl a: srl a: ld (de),a: inc de: inc ix
   dec bc: ld a,b:or c: jr nz,L3
   ld hl,buff2: ld de,buff: ld bc,768: ldir
   dec ly: jr nz,L4

   ld ix,buff: ld hl,buff3: ld bc,768
L5 ld a,(ix): sub (ix+1): ld (hl),a: inc hl
   ld a,(ix): sub (ix+32): ld (hl),a: inc hl: inc ix
   dec bc: ld a,b: or c: jr nz,L5

   ld ix,stbl: call gen_sin
loop2
   ei
   halt

   exx
   ld b,pall/256
   ld de,buff3
   ld lx,256-16
ddx equ $-1
   ld hx,0
ddy equ $-1

   ld ly,3
   exx
   ld c,24
   ld b,32
   ld hl,#5800
LL1 exx
   ld a,(de): inc de
   add a,lx: inc lx
   ld l,a
   ld a,(de): inc de
   add a,hx
   or #c0
   ld h,a
   ld c,(hl)
   ld b,pall/256
   ld a,(bc)
   exx
   ld (hl),a: inc hl: djnz LL1
   ld b,32
   ld a,(ddx): ld lx,a
   inc hx
   dec c
   jr nz,LL1



   ld a,(ddy): inc a: and 63: ld (ddy),a



   jr loop2
   align 256
stbl ds 256,0
pall
   db 0,1,65,8*1+1+64,3*8+1+64,3*8+3+64,6*8+3+64,6*8+6+64,6*8+7+64,7*8+7+64,7*8+7+64,7*8+7+64



buff ds 768,0
buff2 ds 768,0
buff3 ds 1536,0
buff4
   db 00,00,00,00,00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,00
   db 00,00,00,00,01,01,01,02,02,02,02,02,02,01,01,01,00,00,00,00
   db 00,00,00,01,02,02,02,03,03,03,03,03,03,02,02,02,01,00,00,00
   db 00,00,01,02,03,03,03,04,04,04,04,04,04,03,03,03,02,01,00,00
   db 00,01,02,03,03,04,04,05,05,05,05,05,05,04,04,03,03,02,01,00
   db 00,01,02,03,04,04,05,06,06,06,06,06,05,05,04,04,03,02,01,00
   db 00,01,02,03,04,05,06,07,07,07,07,07,06,05,05,04,03,02,01,00
   db 01,02,03,04,05,06,07,07,08,08,08,08,07,07,06,04,04,03,02,01
   db 01,02,03,04,05,06,07,08,09,09,09,09,08,07,06,05,04,03,02,01
   db 01,02,03,04,05,06,07,08,09,10,10,09,08,07,06,05,04,03,02,01
   db 01,02,03,04,05,06,07,08,09,10,10,09,08,07,06,05,04,03,02,01
   db 01,02,03,04,05,06,07,08,09,09,09,09,08,07,06,05,04,03,02,01
   db 01,02,03,04,05,06,07,07,08,08,08,08,07,07,06,04,04,03,02,01
   db 00,01,02,03,04,05,06,07,07,07,07,07,06,05,05,04,03,02,01,00
   db 00,01,02,03,04,04,05,06,06,06,06,06,05,05,04,04,03,02,01,00
   db 00,01,02,03,03,04,04,05,05,05,05,05,05,04,04,03,03,02,01,00
   db 00,00,01,02,03,03,03,04,04,04,04,04,04,03,03,03,02,01,00,00
   db 00,00,00,01,02,02,02,03,03,03,03,03,03,02,02,02,01,00,00,00
   db 00,00,00,00,01,01,01,02,02,02,02,02,02,01,01,01,00,00,00,00
   db 00,00,00,00,00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,00
;----------------------------------------
; 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