; 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
