sintab equ #6000 buf equ #7000 org 0x8000 ld ix,sintab call gen_sin call scr_swap ld a,#45 call cls_atr call scr_swap ld a,#42 call cls_atr call buf_init loop ei halt call scr_swap call noise ; call fx ; call buf_init ; call buf_draw jr loop 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 ;---------------------------------------- ; 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