; SKELETON CODE. PROBABLY DOESNT WORK. PROVIDED TO SHOW HOW IT IS DONE. ; ; This code shows an example to smoothly scroll a screen vertically ; ; This works by using register 5 which allows a line offset. ; So you use register 5 for smooth pixel shift, and when you have moved ; 8 lines, use the hardware scrolling to scroll the screen. ; ; When using splitting, you must set the register 5 before the block ; to scroll, and then set it again before the block ends (here a different ; value). ; If you dont do this, the block below the one scrolling will move ; too!!! ; ; before part to scroll: ; ; - top part &BC05 values 7,6,5,4,3,2,1,0 (shift values for section ; to scroll) ; during part to scroll: ; ; - bottom part &BC05 values 0,1,2,3,4,5,6,7 (shift values for block ; below section to scroll) ; ; during last section on screen: ; ; - before the last block ends &BC05 value 0 (so top block on screen ; doesnt move ; - you may also find, that if this is not present, the whole screen ; will jump up and down .screen_width equ 40 org start_address nolist .main_loop ld b,&f5 .vsync in a,(c) rra jr nc,vsync ;wait for vsync ld bc,&bc07 out (c),c ld bc,&bdff ;init vertical split out (c),c ;---------------------------------------------------------------------------- halt ; set vertical position for block to scroll ld a,(vertical_position+1) ld bc,&bc05 out (c),c inc b out (c),a ; set address of block .screen_address ld hl,&0000 ; holds screen scrolling offset ld bc,&bc0c out (c),c inc b ld a,h or %00110000 ; &C000-&FFFF screen range out (c),a ld bc,&bc0d out (c),c inc b ld a,l out (c).a halt halt halt ; set vertical position for next block inside block being scrolled ld a,7 .vertical_position sub 7 ld bc,&bc05 out (c),c inc b out (c),a halt halt ; set vertical position for top block on screen ld bc,&bc05 ; top block on screen doesnt have a shift out (c),c ld bc,&bd00 out (c),c ld bc,&bc07 ; part of vertical split out (c),c ld bc,&bd00 out (c),c call scroll_up jp main_loop .scroll_up ld a,(vertical_position+1) dec a and 7 ld (vertical_position+1),a ; change vertical position cp 7 ret nz ld hl,(screen_address+1) ; update screen address ld bc,screen_width add hl,bc ld a,h and 3 ld h,a ld (screen_address+1),hl ret .scroll_down ld a,(vertical_position+1) inc a and 7 ld (vertical_position+1),a ; change vertical position ret nz ld hl,(screen_address+1) ; change screen address ld bc,-screen_width add hl,bc ld a,h and 3 ld h,a ld (screen_address+1),hl ret