diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index b3dd59937..fe66c9068 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
[bumpversion]
-current_version = 1.18.3
+current_version = 1.18.4
[bumpversion:file:src/zxbc/version.py]
search = VERSION: Final[str] = "{current_version}"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5e1bcc47a..27fd73b39 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+[v1.18.4](https://github.com/boriel-basic/zxbasic/tree/v1.18.4)
+===
++ ! Fixed a bug with arrays and strings
++ Updated documentation
++ Added Scroll-Aligned (aligned to column) functions
+
[v1.18.3](https://github.com/boriel-basic/zxbasic/tree/v1.18.3)
===
+ ! Fix `ByRef` with an array element
diff --git a/docs/archive.md b/docs/archive.md
index 785a4eb0e..60ba54ed3 100644
--- a/docs/archive.md
+++ b/docs/archive.md
@@ -10,28 +10,28 @@ repository (git).
You can contribute to ZX BASIC by reporting possible bugs or improvement suggestions at the
[forum](https://forum.boriel.com/) or in social media.
-The latest stable version is **1.18.3**.
+The latest stable version is **1.18.4**.
Click on the desired icon below to download the package suitable for your platform:
* [
- https://www.boriel.com/files/zxb/zxbasic-1.18.3-win32.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.3-win32.zip)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.4-win32.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.4-win32.zip)
Windows .exe zip package. No install needed, just uncompress it in a directory of your choice.
* [
- https://www.boriel.com/files/zxb/zxbasic-1.18.3-macos.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.3-macos.tar.gz)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.4-macos.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.4-macos.tar.gz)
Mac OS x64 package. No install needed, just uncompress it in a directory of your choice (needs Python installed
in your system).
* [
- https://www.boriel.com/files/zxb/zxbasic-1.18.3-linux64.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.3-linux64.tar.gz)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.4-linux64.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.4-linux64.tar.gz)
Linux x64 binary package. No install needed, just uncompress it in a directory of your choice.
* [
- https://www.boriel.com/files/zxb/zxbasic-1.18.3.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.3.zip)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.4.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.4.zip)
Windows, Linux, Mac zip package, with python scripts. Requires python installed in your system.
* [
- https://www.boriel.com/files/zxb/zxbasic-1.18.3.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.3.tar.gz)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.4.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.4.tar.gz)
Windows, Linux, Mac tar.gz package, with python scripts. Requires python installed in your system.
### What's new
diff --git a/pyproject.toml b/pyproject.toml
index 1f9b0d729..c9cd61bc6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "zxbasic"
-version = "1.18.3"
+version = "1.18.4"
description = "Boriel's ZX BASIC Compiler"
authors = ["Jose Rodriguez "]
license = "AGPL-3.0-or-later"
diff --git a/src/lib/arch/zx48k/stdlib/scroll.bas b/src/lib/arch/zx48k/stdlib/scroll.bas
index deec71f2d..06661eb6f 100644
--- a/src/lib/arch/zx48k/stdlib/scroll.bas
+++ b/src/lib/arch/zx48k/stdlib/scroll.bas
@@ -717,6 +717,322 @@ EMPTYLINE:
end asm
end sub
+
+' ----------------------------------------------------------------
+' sub ScrollRightAligned
+' pixel by pixel right scroll.
+' scrolls 1 pixel right the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollRightAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+ LOCAL LOOP2
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld b, h ; BC = y2x1
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+LOOP1:
+ push hl
+ ld b, e ; C cols
+ or a ; clear carry flag
+LOOP2:
+ rr (hl)
+ inc hl
+ djnz LOOP2
+ pop hl
+
+ dec d
+ ret z
+ call SP.PixelDown
+ jp LOOP1
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
+' ----------------------------------------------------------------
+' sub ScrolLeftAligned
+' pixel by pixel left scroll
+' scrolls 1 pixel left the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollLeftAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+ LOCAL LOOP2
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ ld c, d
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld b, h ; BC = y2x1
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+LOOP1:
+ push hl
+ ld b, e ; C cols
+ or a ; clear carry flag
+LOOP2:
+ rl (hl)
+ dec hl
+ djnz LOOP2
+ pop hl
+
+ dec d
+ ret z
+ call SP.PixelDown
+ jp LOOP1
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
+' ----------------------------------------------------------------
+' sub ScrolUpAligned
+' pixel by pixel up scroll
+' scrolls 1 pixel up the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollUpAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+ ex af, af' ; save it for later
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld b, h ; BC = y2x1
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+ ld a, d ; Num. of scan lines
+ ld b, 0
+ exx
+ ld b, a ; Scan lines counter
+ ex af, af' ; Recovers cols
+ ld c, a
+ jp LOOP_START
+
+LOOP1:
+ exx
+ ld d, h
+ ld e, l
+ ld c, a ; C cols
+ call SP.PixelDown
+ push hl
+ ldir
+ pop hl
+ exx
+ ld a, c ; Recovers C Cols
+ LOCAL LOOP_START
+LOOP_START:
+ djnz LOOP1
+
+ ; Clears bottom line
+ exx
+ ld (hl), 0
+ ld d, h
+ ld e, l
+ inc de
+ ld c, a
+ dec c
+ ret z
+ ldir
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
+' ----------------------------------------------------------------
+' sub ScrolDownAligned
+' pixel by pixel down scroll
+' scrolls 1 pixel down the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollDownAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+ ex af, af' ; save it for later
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+ ld a, d ; Num. of scan lines
+ ld b, 0
+ exx
+ ld b, a ; Scan lines counter
+ ex af, af' ; Recovers cols
+ ld c, a
+ jp LOOP_START
+
+LOOP1:
+ exx
+ ld d, h
+ ld e, l
+ ld c, a ; C cols
+ call SP.PixelUp
+ push hl
+ ldir
+ pop hl
+ exx
+ ld a, c ; Recovers C Cols
+ LOCAL LOOP_START
+LOOP_START:
+ djnz LOOP1
+
+ ; Clears top line
+ exx
+ ld (hl), 0
+ ld d, h
+ ld e, l
+ inc de
+ ld c, a
+ dec c
+ ret z
+ ldir
+
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
#pragma pop(case_insensitive)
REM the following is required, because it defines SCREEN_ADDR and SCREEN_ATTR_ADDR
diff --git a/src/lib/arch/zxnext/stdlib/scroll.bas b/src/lib/arch/zxnext/stdlib/scroll.bas
index deec71f2d..06661eb6f 100644
--- a/src/lib/arch/zxnext/stdlib/scroll.bas
+++ b/src/lib/arch/zxnext/stdlib/scroll.bas
@@ -717,6 +717,322 @@ EMPTYLINE:
end asm
end sub
+
+' ----------------------------------------------------------------
+' sub ScrollRightAligned
+' pixel by pixel right scroll.
+' scrolls 1 pixel right the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollRightAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+ LOCAL LOOP2
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld b, h ; BC = y2x1
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+LOOP1:
+ push hl
+ ld b, e ; C cols
+ or a ; clear carry flag
+LOOP2:
+ rr (hl)
+ inc hl
+ djnz LOOP2
+ pop hl
+
+ dec d
+ ret z
+ call SP.PixelDown
+ jp LOOP1
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
+' ----------------------------------------------------------------
+' sub ScrolLeftAligned
+' pixel by pixel left scroll
+' scrolls 1 pixel left the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollLeftAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+ LOCAL LOOP2
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ ld c, d
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld b, h ; BC = y2x1
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+LOOP1:
+ push hl
+ ld b, e ; C cols
+ or a ; clear carry flag
+LOOP2:
+ rl (hl)
+ dec hl
+ djnz LOOP2
+ pop hl
+
+ dec d
+ ret z
+ call SP.PixelDown
+ jp LOOP1
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
+' ----------------------------------------------------------------
+' sub ScrolUpAligned
+' pixel by pixel up scroll
+' scrolls 1 pixel up the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollUpAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+ ex af, af' ; save it for later
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld b, h ; BC = y2x1
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+ ld a, d ; Num. of scan lines
+ ld b, 0
+ exx
+ ld b, a ; Scan lines counter
+ ex af, af' ; Recovers cols
+ ld c, a
+ jp LOOP_START
+
+LOOP1:
+ exx
+ ld d, h
+ ld e, l
+ ld c, a ; C cols
+ call SP.PixelDown
+ push hl
+ ldir
+ pop hl
+ exx
+ ld a, c ; Recovers C Cols
+ LOCAL LOOP_START
+LOOP_START:
+ djnz LOOP1
+
+ ; Clears bottom line
+ exx
+ ld (hl), 0
+ ld d, h
+ ld e, l
+ inc de
+ ld c, a
+ dec c
+ ret z
+ ldir
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
+' ----------------------------------------------------------------
+' sub ScrolDownAligned
+' pixel by pixel down scroll
+' scrolls 1 pixel down the window defined by (x1, y1, x2, y2)
+' This scroll is aligned to columns.
+' x1 and x2 are divided by 8 and rounded down (floor) to get the column number (0..31)
+' ----------------------------------------------------------------
+sub fastcall ScrollDownAligned(x1 as uByte, y1 as uByte, x2 as Ubyte, y2 as Ubyte)
+ asm
+ push namespace core
+
+ PROC
+ LOCAL LOOP1
+
+ ; a = x1
+ pop hl ; RET address
+ pop bc ; b = y1
+ pop de ; d = x2
+ ex (sp), hl ; h = y2, (sp) = RET address. Stack ok now
+
+ ld c, a ; BC = y1x1
+ ld a, d
+ sub c
+ ret c ; x1 > x2
+
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a ; e = (x2 - x1) / 8 + 1
+ ex af, af' ; save it for later
+
+ ld a, h
+ sub b
+ ret c ; y1 > y2
+
+ inc a
+ ld d, a ; d = y2 - y1 + 1
+
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+__PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h ; Starts from 0
+ ld bc, (SCREEN_ADDR)
+ add hl, bc ; Now current offset
+
+ ld a, d ; Num. of scan lines
+ ld b, 0
+ exx
+ ld b, a ; Scan lines counter
+ ex af, af' ; Recovers cols
+ ld c, a
+ jp LOOP_START
+
+LOOP1:
+ exx
+ ld d, h
+ ld e, l
+ ld c, a ; C cols
+ call SP.PixelUp
+ push hl
+ ldir
+ pop hl
+ exx
+ ld a, c ; Recovers C Cols
+ LOCAL LOOP_START
+LOOP_START:
+ djnz LOOP1
+
+ ; Clears top line
+ exx
+ ld (hl), 0
+ ld d, h
+ ld e, l
+ inc de
+ ld c, a
+ dec c
+ ret z
+ ldir
+
+ ENDP
+
+ pop namespace
+ end asm
+end sub
+
+
#pragma pop(case_insensitive)
REM the following is required, because it defines SCREEN_ADDR and SCREEN_ATTR_ADDR
diff --git a/src/zxbasm/version.py b/src/zxbasm/version.py
index 9e545196a..9ec4d800b 100644
--- a/src/zxbasm/version.py
+++ b/src/zxbasm/version.py
@@ -5,4 +5,4 @@
# See https://www.gnu.org/licenses/agpl-3.0.html for details.
# --------------------------------------------------------------------
-VERSION = "1.18.3"
+VERSION = "1.18.4"
diff --git a/src/zxbc/version.py b/src/zxbc/version.py
index 1e2e7eef3..ca885bb90 100755
--- a/src/zxbc/version.py
+++ b/src/zxbc/version.py
@@ -7,4 +7,4 @@
from typing import Final
-VERSION: Final[str] = "1.18.3"
+VERSION: Final[str] = "1.18.4"
diff --git a/tests/functional/arch/zx48k/stdlib_scroll.asm b/tests/functional/arch/zx48k/stdlib_scroll.asm
index 9258d112f..7ee1d7a83 100644
--- a/tests/functional/arch/zx48k/stdlib_scroll.asm
+++ b/tests/functional/arch/zx48k/stdlib_scroll.asm
@@ -606,6 +606,240 @@ EMPTYLINE:
#line 718 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
_ScrollDown__leave:
ret
+_ScrollRightAligned:
+#line 729 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+ push namespace core
+ PROC
+ LOCAL LOOP1
+ LOCAL LOOP2
+ pop hl
+ pop bc
+ pop de
+ ex (sp), hl
+ ld c, a
+ ld a, d
+ sub c
+ ret c
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a
+ ld a, h
+ sub b
+ ret c
+ inc a
+ ld d, a
+ ld b, h
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+ __PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h
+ ld bc, (SCREEN_ADDR)
+ add hl, bc
+LOOP1:
+ push hl
+ ld b, e
+ or a
+LOOP2:
+ rr (hl)
+ inc hl
+ djnz LOOP2
+ pop hl
+ dec d
+ ret z
+ call SP.PixelDown
+ jp LOOP1
+ ENDP
+ pop namespace
+#line 787 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+_ScrollRightAligned__leave:
+ ret
+_ScrollLeftAligned:
+#line 798 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+ push namespace core
+ PROC
+ LOCAL LOOP1
+ LOCAL LOOP2
+ pop hl
+ pop bc
+ pop de
+ ex (sp), hl
+ ld c, a
+ ld a, d
+ sub c
+ ret c
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a
+ ld a, h
+ sub b
+ ret c
+ ld c, d
+ inc a
+ ld d, a
+ ld b, h
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+ __PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h
+ ld bc, (SCREEN_ADDR)
+ add hl, bc
+LOOP1:
+ push hl
+ ld b, e
+ or a
+LOOP2:
+ rl (hl)
+ dec hl
+ djnz LOOP2
+ pop hl
+ dec d
+ ret z
+ call SP.PixelDown
+ jp LOOP1
+ ENDP
+ pop namespace
+#line 857 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+_ScrollLeftAligned__leave:
+ ret
+_ScrollUpAligned:
+#line 868 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+ push namespace core
+ PROC
+ LOCAL LOOP1
+ pop hl
+ pop bc
+ pop de
+ ex (sp), hl
+ ld c, a
+ ld a, d
+ sub c
+ ret c
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a
+ ex af, af'
+ ld a, h
+ sub b
+ ret c
+ inc a
+ ld d, a
+ ld b, h
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+ __PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h
+ ld bc, (SCREEN_ADDR)
+ add hl, bc
+ ld a, d
+ ld b, 0
+ exx
+ ld b, a
+ ex af, af'
+ ld c, a
+ jp LOOP_START
+LOOP1:
+ exx
+ ld d, h
+ ld e, l
+ ld c, a
+ call SP.PixelDown
+ push hl
+ ldir
+ pop hl
+ exx
+ ld a, c
+ LOCAL LOOP_START
+LOOP_START:
+ djnz LOOP1
+ exx
+ ld (hl), 0
+ ld d, h
+ ld e, l
+ inc de
+ ld c, a
+ dec c
+ ret z
+ ldir
+ ENDP
+ pop namespace
+#line 945 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+_ScrollUpAligned__leave:
+ ret
+_ScrollDownAligned:
+#line 956 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+ push namespace core
+ PROC
+ LOCAL LOOP1
+ pop hl
+ pop bc
+ pop de
+ ex (sp), hl
+ ld c, a
+ ld a, d
+ sub c
+ ret c
+ srl a
+ srl a
+ srl a
+ inc a
+ ld e, a
+ ex af, af'
+ ld a, h
+ sub b
+ ret c
+ inc a
+ ld d, a
+ ld a, 191
+ LOCAL __PIXEL_ADDR
+ __PIXEL_ADDR EQU 22ACh
+ call __PIXEL_ADDR
+ res 6, h
+ ld bc, (SCREEN_ADDR)
+ add hl, bc
+ ld a, d
+ ld b, 0
+ exx
+ ld b, a
+ ex af, af'
+ ld c, a
+ jp LOOP_START
+LOOP1:
+ exx
+ ld d, h
+ ld e, l
+ ld c, a
+ call SP.PixelUp
+ push hl
+ ldir
+ pop hl
+ exx
+ ld a, c
+ LOCAL LOOP_START
+LOOP_START:
+ djnz LOOP1
+ exx
+ ld (hl), 0
+ ld d, h
+ ld e, l
+ inc de
+ ld c, a
+ dec c
+ ret z
+ ldir
+ ENDP
+ pop namespace
+#line 1033 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+_ScrollDownAligned__leave:
+ ret
;; --- end of user code ---
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/SP/PixelDown.asm"
;
@@ -684,7 +918,7 @@ SCREEN_ATTR_ADDR: DW 22528 ; Screen attribute address (ditto.)
SCR_SIZE EQU (SCR_ROWS << 8) + SCR_COLS
pop namespace
#line 58 "/zxbasic/src/lib/arch/zx48k/runtime/SP/PixelDown.asm"
-#line 723 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+#line 1038 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/SP/PixelUp.asm"
;
; PixelUp
@@ -731,5 +965,5 @@ leave:
ret
ENDP
pop namespace
-#line 724 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
+#line 1039 "/zxbasic/src/lib/arch/zx48k/stdlib/scroll.bas"
END