macro KILL_SYSTEM di ld hl, $c9fb ld ($38), hl ld sp, $4000 ei endm macro WAIT_VSYNC ld b, $f5 @loop in a, (c) rra jr nc, @loop endm macro WAIT_VSYNC_STRICT ld b, $f5 @loop1 in a, (c) rra jr c, @loop1 WAIT_VSYNC (void) endm macro SET_CRTC reg, value ld bc, $bc00 + {reg} : out (c), c ld bc, $bd00 + {value} : out (c), c endm BACKGROUND equ $54 struct RASTER_BAR ink1 db BACKGROUND ; space for ink1 of raster ink2 db BACKGROUND ink3 db BACKGROUND ink4 db BACKGROUND ink5 db BACKGROUND ; space for ink5 of raster endstruct RASTER_HEIGHT equ RASTER_BAR org 0x4000 KILL_SYSTEM (void) SET_CRTC 6, 0 di WAIT_VSYNC_STRICT (void) call frame_loop jr $ frame_loop WAIT_VSYNC (void) ld b, 30 .loop nop 64 - (duration(djnz .loop) + 1) ; duration of djnz is the one with no jump djnz .loop call show_raster jp frame_loop show_raster ; manage the sine wave for the vertical position nop 15 ld hl, sine_curve .curve_position equ $-2 ld b, (hl) inc l ld (.curve_position), hl .loop nop 64 - (duration(djnz .loop) + 1) ; duration of djnz is the one with no jump djnz .loop ; really display the raster bar ld bc, $7f10 ld hl, raster_table.bar1 out (c), c repeat RASTER_HEIGHT, loop ticker start @raster_line_duration ld a, (hl) out (c), a if {loop} != RASTER_HEIGHT inc hl endif ticker stop nop 64-@raster_line_duration endr ld a, BACKGROUND out (c), a ret raster_table .bar1 RASTER_BAR $44, $55, $5C, $55, $44 function curve_value idx, height return height/2*cos(idx*360/256) + height/2 + 1 endf align 256 sine_curve .height equ min(255, 312 - 30 - 8) repeat 256, i val set curve_value({i}, .height) print {hex}$, "=", val db val endr