PixelScroll
pixelScroll.bas
Does what it says on the tin! Scrolls the screen by the set number of pixels, leaving blank pixel rows beyond it. Attributes are untouched.
It's fast - it uses the screen tables method. You'll need the relevant screen tables files - https://dl.dropbox.com/u/4903664/ScreenTables.7z
SUB PixelScrollUp(numOfLines as uByte)
ASM
; BLPixelTable is where the table starts
AND A ; Flags off A
JP Z, BLPixelScrollUpEnd ; We were asked to scroll zero. Quit!
CP 192
JP NC, BLPixelScrollUpEnd ; We can't scroll more than 191 lines up. Quit!
LD C,A ; Current Line
LD B,A ; Jump
PUSH BC ; Save Line count.
BLPixelScrollUpMainLoop:
; screen address routine
LD H,BLPixelTable/256
LD L,C
LD D,(HL)
INC H
LD E,(HL) ; DE is source address
;LD H,BLPixelTable/256
DEC H ; get H back to pixeltable.
LD A,C
SUB B ; A is now destination line number
LD L,A
LD A,(HL)
INC H
LD L,(HL) ; HL: is destination line address
LD H,A ;
EX DE,HL ; Swap! ; HL=Source Address. DE=Dest address.
```; A small version has these two lines instead of the pile of LDI:
; ld bc,32 ; 32 bytes to transfer
; ldir
;(A very small version would calculate screen addresses, instead of use the table!)
; A fast version has these 32 LDIs instead: (About 27% faster) - but uses up 28 bytes more.
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI
POP BC
INC C
LD A,C
CP 192
PUSH BC ; Save count again.
JP C, BLPixelScrollUpMainLoop ; Not carry? then We hit the bottom of the screen. Need zeroes.
; blank remaining rows
POP BC ; Balance Stack
LD C,B ; Push diff into C
LD A,192
SUB C ; A now shows row num of the top row to clear.
CP 192 ; are we done
JP Z,BLPixelScrollUpEnd
LD D,0
BLPixelScrollUpClearBigLoop:
LD H,BLPixelTable/256
LD L,A
LD C,(HL)
INC H
LD L,(HL)
LD H,C ; HL is current row
LD B,32 ; 32 bytes
BLPixelScrollUpClearLoop:
LD (HL),D
INC L
DJNZ BLPixelScrollUpClearLoop
INC A
CP 192
JP C, BLPixelScrollUpClearBigLoop
JP BLPixelScrollUpEnd
END ASM
#include once "ScreenTables.bas"
ASM
BLPixelScrollUpEnd:
END ASM
END SUB
Usage
Example:
Will scroll the screen up by 2 pixels.