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: * [win32zip - 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.
  * [macostargz - 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).
  * [macostargz - 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.
  * [zip - 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.
  * [tar.gz - 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