; Plasmaminus, a 256-bytes intro by Grim/Arkos^Semilanceata
; 20121108
org &1000
;;write direct "a:plasmaminus.",_exec
run _exec
; 2x8 Dithering levels
_data_dithering
db %01000000 ; Dark
db %01000100
db %01010100
db %01010101
db %01110101
db %01110111
db %01111111
db %11111111 ; Bright
db %01111111
db %01110111
db %01011101
db %01010101
db %00010101
db %00100010
db %00001000
db %00000000 ; Dark
; 256 bytes periodic sin-like wave
_data_wave equ &1100
_exec
di
;*** Setup screen mode & colors ***
exx
ld de,&0158 ;46
out (c),d
out (c),e
ld a,&8E
out (c),a
;*** Setup CRTC for wide horizontal display ***
ld de,&0306 ; Type 2 Fullscreen fix
call setCrtcReg
ld de,&0100+50
call setCrtcReg
inc d
call setCrtcReg
;*** Precalc 256 bytes exp-based sin-like wave ***
ld hl,_data_wave
ld de,_data_wave + 127
ld b,64
_sinGen
ld a,b
exx
ld hl,0
ld d,h
ld e,a
_exp add hl,de
dec a
jr nz,_exp
add hl,hl
ld a,h
exx
ld (hl),a
ld (de),a
neg
add 64
set 7,l
set 7,e
ld (hl),a
ld (de),a
res 7,l
res 7,e
dec e
inc l
djnz _sinGen
;*** Generate wobbler pattern ***
ld iy,_data_wave+64
ld de,_data_wave
ld hl,0
ld b,_data_dithering / 256
_gfxGen
ld a,(de) ; wave X
add a,(iy+0) ; +wave Y
; lookup dithering value
and %1111
ld c,a
ld a,(bc) ; Lookup dithering byte
ld (hl),a ; plot lineAddr.even
set 3,h
rrca
rrca
rrca
ld (hl),a ; plot lineAddr.odd
res 3,h
inc hl
; innerloop (X)
inc e ; next wave X
inc e
jr nz,_gfxGen
inc iyl ; next wave Y
inc iyl
; outerloop (Y)
bit 3,h
jr z,_gfxGen
ld a,%00111000
add a,h
ld h,a
jr nc,_gfxGen
push de
ld e,c
push de
push de
;*** Wobbler clean CRTC transition ***
call riseVSync
; R9=1
ld de,&0901
call setCrtcReg
; R4=30
ld de,&0400+30
call setCrtcReg
;*** Wobbler display ***
frame
; wait 128us
ld b,32 -7-1
djnz $
pop bc
pop de
pop hl
inc l
inc e
inc e
dec c
push hl
push de
push bc
exx
; R4=0
;ld de,&0400 ;3
;call setCrtcReg ;3
ld b,&BD ;2
dw &71ED ;2 out (c),0
; R7=1
ld de,&0701
call setCrtcReg
ld c,154
wobbler
; Sum some sinewaves
exx
ld a,(bc)
add a,(hl)
ex de,hl
add a,(hl)
inc e
inc c
inc c
exx
; A = Wobbler 6-bit line number to display (0-63)
; Ping-pong pattern (0,127) -> (0,63,0)
bit 6,a
jr nz,$+2+1
cpl
; Convert wobbler line number into screen offset
; A = %??aa.bbcc
ld h,a
rrca
rrca
; A = %cc??.aabb
ld l,a
and %11000000
; A = %cc00.0000 = R13
ld d,13
ld e,a
call setCrtcReg
ld a,h
and %00110000
; A = %00aa.0000
ld h,a
ld a,l
and %00000011
; A = %0000.00bb
or h
; A = %aaxx.xxbb = R12
dec d
ld e,a
call setCrtcReg
; Sync to 128us / Waste cycles
ld b,12
djnz $
nop
; Wobbler display loop
dec c
jr nz,wobbler
; End display, prep. VSync
ld de,&0400+1 ; R4=1
call setCrtcReg
; Wait for VSync, 50Hz loop
call riseVSync
; Loop forever
jr frame
riseVSync:
ld b,&F5
;removed to fit in 256b, CRTC transition might fail
;in a,(c)
;rra
;jr c,riseVSync+2 ; anti-vsync
_waitVSync in a,(c)
rra
jr nc,_waitVSync ; wait-vsync
ret
setCrtcReg:
ld b,&BC
out (c),d
inc b
out (c),e
ret