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 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