; 256 bytes Alcatraz Bars by Grim/Arkos^Semilanceata (June 2011)
;
; The effect picks pseudo random parameters. If it looks like crap, run the
; intro again and cross your fingers =)
;
; Should work on any CRTC except type 2. Hmm... might fit into 128 bytes...
org &1001
run _exec
; AY3 register values
_data_ay3 db 8, 2,4, 5,8, 0, %00111000, 16+12,16+12,16+12, &00,&20, &A
_exec
xor a
call &BC0E
; Init AY3 (with Firmware)
ld hl,_data_ay3 + 13
_init_AY3 ld a,l
ld c,(hl)
call &BD34
dec l
jr nz,_init_AY3
di
; SinGen - Parabolic approximation, bitch
_slut EQU &8000 AND &FC00
LET _slut_h = _slut/256
LET _slut_q3 = _slut_h+2
LET _slut_q4 = _slut_h+3
xor a
ld bc, _slut_q3*256 + _slut_q4
ld l,a
ld e,l
exx
ld b,a ; 256
ld d,b
_slut_loop
ld c,b
dec b
ld e,b
ld h,d
ld l,d
_slut_square add hl,de
djnz _slut_square
ld a,h
exx
rra
ld d,b
ld h,c
dec l
ld (de),a ; 3rd Quad
ld (hl),a ; 4th Quad
cpl
res 1,d
res 1,h
ld (de),a ; 1st Quad
ld (hl),a ; 2nd Quad
inc e
exx
ld b,c
djnz _slut_loop
; Init intro constants
ld h,&C0
ld bc,170*256+65 ; masks odd
ld de, 85*256+40 ; masks even
exx
ld h,_slut / 256
ld d,h
; Wait for an active VSync
call _wait_vsync
; Make sure the VSync goes off
djnz $
; Pick random sinus steps
ld a,l
and &F
ld b,a
ld a,r
xor l
and &F
ld c,a
ld (_var_sin1_step_display),bc
; Init CRTC & Set the next VSync at VCC=1
ld bc,&BC01
ld a,50
call _setRx
dec b
inc c
call _setRx
; Wait, again, for a VSync
call _wait_vsync
; Set VSync position
ld bc,&BC07
out (c),c
ld bc,&BD01
out (c),c
;*** Main 50Hz loop (19968us) ***
_50Hz_loop ; Start line splitting (VCC=VLC=0)
xor a ; R4=R9=0
call _setR4R9
; Update the sinus wave pointers
_var_sin1_step_frame equ $+1
_var_sin2_step_frame equ $+2
ld bc,&0910
call _nextStep
; Save the pointers
push hl
push de
; Bars display loop
ld bc,274
_bar_loop ; Update the sinus wave pointers
push bc
_var_sin1_step_display equ $+1
_var_sin2_step_display equ $+2
ld bc,&0B12
call _nextStep
pop bc
; Sum the two sinus values
ld a,(de)
add a,(hl)
; and get the vram address
rra
srl a
exx
ld l,a
; Display one bar
jr c,_plot_odd
_plot_even
ld (hl),147:inc l ; 2 pixels
ld (hl),36:inc l ; 2 pixels
ld a,(hl) ; 1 pixel (masked)
and d
or e
ld (hl),a
jr _bar_continue
_plot_odd
ld a,(hl) ; 1 pixel (masked)
and b
or c
ld (hl),a
inc hl:ld (hl),50 ; 2 pixels + 1us malus
inc hl:ld (hl),28 ; 2 pixels + 1us malus
_bar_continue
exx
dec bc
ld a,b
or c
jr nz,_bar_loop
; Restore the sinus wave pointers
pop de
pop hl
; Clear all the mess we've just plotted
; BC=0
; 405us / ~6.25 rasterlines
ld sp,&C000+100
ld a,51
_clear push bc
dec a
jr nz,_clear
; Change the CRTC settings to produce a VSync
; R4=R9=1
inc a
call _setR4R9
; Waste some cycles
ld b,16*4 -3
djnz $
pop af
; Allo?
jr _50Hz_loop
_setR4R9
ld bc,&BC04
call _setRx
ld bc,&BC09
_setRx out (c),c
inc b
out (c),a
ret
_nextStep
ld a,b
ld b,0
add hl,bc
ld c,a
ex de,hl
add hl,bc
ex de,hl
res 2,h
res 2,d
ret
_wait_vsync ld b,&F5
inc l
in a,(c)
rra
jr nc,_wait_vsync + 2
ret