; Shabok 256 bytes
; Shadebob effect 100% firmware based (slooooww)
; Done with WinAPE assembler (Maxam compatible)
;
; Grim/Arkos^Semilanceata

org &4000

_GRA_SET_PEN EQU &BBDE
_GRA_PLOT_ABSOLUTE EQU &BBEA
_GRA_TEST_ABSOLUTE  EQU &BBF0
_SET_ANGLE_MODE EQU &BD97
_REAL_SINE EQU &BDAC
_REAL_ADDITION EQU &BD7C
_REAL_MOVE EQU &BD61
_REAL_INT EQU &BD73
_REAL_MULTIPLICATION EQU &BD85
_SCR_SET_INK EQU &BC32
_SCR_SET_BORDER  EQU &BC38

; Set the colors
ld bc,0
call _SCR_SET_BORDER

ld hl,shadebob_data_palette
ld a,15
shadebob_setpalette
ld b,(hl)
inc hl
ld c,b
push af
push hl
call _SCR_SET_INK
pop hl
pop af
dec a
jp p,shadebob_setpalette

; Switch to MODE 0 (160x200x16)
ld a,0
call &BC0E

; DEG
; tell the math firmware to deal with angle in degres
ld a,1
call _SET_ANGLE_MODE

; main loop
shadebob_main ; compute X coordinate

; sinus1=INT(amplitude1*SIN(angle1))+320
; angle1=angle1+step1

ld hl,math_var_sinus1
push hl
ld de,math_var_angle1
call _REAL_MOVE
call _REAL_SINE
pop hl
ld de,math_var_amplitude1
call _REAL_MULTIPLICATION
call _REAL_INT

ld hl,320
ld de,(math_var_sinus1)
call shadebob_coordinify
push hl

; angle+=step
ld hl,math_var_angle1
ld de,math_var_angle1_step
call _REAL_ADDITION

; compute Y coordinate

; sinus2=INT(amplitude2*SIN(angle2))+200
; angle2=angle2+step2

ld hl,math_var_sinus2
push hl
ld de,math_var_angle2
call _REAL_MOVE
call _REAL_SINE
pop hl
ld de,math_var_amplitude2
call _REAL_MULTIPLICATION
call _REAL_INT

ld hl,200
ld de,(math_var_sinus2)
call shadebob_coordinify
push hl

; angle+=step
ld hl,math_var_angle2
ld de,math_var_angle2_step
call _REAL_ADDITION

; plot the shadebob
pop hl
pop de

ld ix,shadebob_data_sprite
ld b,9
shadebob_plot_bob_mainloop
push de

ld c,(ix+0)
inc ix
shadebob_plot_bob_pixelloop
sla c
jr z,shadebob_plot_bob_nextline
call c,shadebob_plot_pixel
inc de
inc de
inc de
inc de
jr shadebob_plot_bob_pixelloop
shadebob_plot_bob_nextline call c,shadebob_plot_pixel

pop de
inc hl
inc hl
djnz shadebob_plot_bob_mainloop

jp shadebob_main

math_var_angle1 db 0,0,0,0,0
math_var_angle1_step db 154,153,153,9,132
math_var_amplitude1 db 0,0,0,122,136
math_var_sinus1 db 0,0,0,0,0

math_var_angle2 db 0,0,0,0,0
math_var_angle2_step db 133,235,81,8,131
math_var_amplitude2 db 0,0,0,72,136
math_var_sinus2 db 0,0,0,0,0


shadebob_coordinify:
bit 7,b
jr z,shadebob_coordpos
sbc hl,de
ret
shadebob_coordpos add hl,de
ret

shadebob_plot_pixel:
push bc
push de
push hl
push de
push hl
call _GRA_TEST_ABSOLUTE
inc a
call _GRA_SET_PEN
pop hl
pop de
call _GRA_PLOT_ABSOLUTE
pop hl
pop de
pop bc
ret
shadebob_data_sprite
db %01110000
db %01110000
db %11111000
db %11111000
db %11111000
db %11111000
db %11111000
db %01110000
db %01110000
shadebob_data_palette
db 1,2,5,11,14,20,23,26
db 25,24,16,15,6,4,3,0