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