fx
ld hl,#d800
ld ix,buf
fx_loop
ld a,(ix-#1f)
add a,(ix-#21)
add a,(ix+0)
add a,(ix+#20)
srl a
dec a
srl a
ld (ix),a
inc ix
ld a,(ix+#1f)
ld l,a
ld h,#7d
ldi
ld a,hx
cp #7c
jr c,fx_loop
ld hl,#78c0
ld b,#20
fill
ld a,r
and 7
ld (hl),a
inc l
djnz fill
ret
color equ #7f
buf_init
ld hl,buf
ld bc,#300
buf_init_loop
ld a,r
ld (hl),a
inc hl
dec bc
ld a,b
or c
jp nz,buf_init_loop
ret
buf_draw
ld de,buf
ld hl,#d800
ld lx,3
ld c,color
buf_draw1
repeat 256
ld a,(de)
and a
jr nz,$+2+1
ld (hl),c
inc hl
inc de
rend
dec lx
jp nz,buf_draw1
ret
noise
ld hl,0
noise_count equ $-2
push hl
ld de,#c000
ld lx,192 / 2
noise_loop
push de
repeat 32
ldi
rend
pop de
ex de,hl
call down_hl
call down_hl
ex de,hl
dec lx
jr nz,noise_loop
pop bc
call rnd16
ld h,0
add hl,bc
ld a,h
cp #30
jr c,noise_end
ld hl,0
noise_end
ld (noise_count),hl
ret
cls_atr
ld hl,#db00
ld d,a
ld e,a
ld b,32
jr clear
cls_pix
ld hl,#d800
ld d,l
ld e,l
ld b,l
clear
ld (cls_pix_sp),sp
ld sp,hl
di
clear_loop
repeat 12
push de
rend
djnz clear_loop
ld sp,0
cls_pix_sp equ $-2
ei
ret
scr_swap
ld a,#1d
scr_swap_bank equ $-1
xor 10
ld (scr_swap_bank),a
set_bnk
push bc
ld bc,#7ffd
out (c),a
pop bc
ret
;----------------------------------------
; 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