diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index 949b1ddc4..7949f14eb 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
[bumpversion]
-current_version = 1.18.1
+current_version = 1.18.2
[bumpversion:file:src/zxbc/version.py]
search = VERSION: Final[str] = "{current_version}"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4d1bf6906..81e2d1a79 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+[v1.18.2](https://github.com/boriel-basic/zxbasic/tree/v1.18.1)
+===
++ ! Allows installation with `pip install` in python 3.11 environments
++ * Add `hmirror.bas` library
+
[v1.18.1](https://github.com/boriel-basic/zxbasic/tree/v1.18.1)
===
+ ! Fixes crash on simple cast from i32 to u32 and vice versa
diff --git a/docs/archive.md b/docs/archive.md
index 003b59e2f..429c6d6a3 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](http://www.boriel.com/forum) or in social media.
-The latest stable version is **1.18.1**.
+The latest stable version is **1.18.2**.
Click on the desired icon below to download the package suitable for your platform:
* [
- https://www.boriel.com/files/zxb/zxbasic-1.18.1-win32.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.1-win32.zip)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.2-win32.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.2-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.1-macos.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.1-macos.tar.gz)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.2-macos.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.2-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.1-linux64.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.1-linux64.tar.gz)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.2-linux64.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.2-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.1.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.1.zip)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.2.zip](https://www.boriel.com/files/zxb/zxbasic-1.18.2.zip)
Windows, Linux, Mac zip package, with python scripts. Requires python installed in your system.
* [
- https://www.boriel.com/files/zxb/zxbasic-1.18.1.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.1.tar.gz)
+ https://www.boriel.com/files/zxb/zxbasic-1.18.2.tar.gz](https://www.boriel.com/files/zxb/zxbasic-1.18.2.tar.gz)
Windows, Linux, Mac tar.gz package, with python scripts. Requires python installed in your system.
### What's new
diff --git a/docs/code.md b/docs/code.md
index 65b14ddf8..837213a6f 100644
--- a/docs/code.md
+++ b/docs/code.md
@@ -11,7 +11,7 @@ code()
Returns the ASCII code of the first character of the given string value.
If the string is empty, the returned value is 0.
-Returned value type is [UByte](types.md#UByte).
+Returned value type is [UByte](types.md#Integral).
## Examples
diff --git a/docs/const.md b/docs/const.md
index 5b1fc469c..538122d1f 100644
--- a/docs/const.md
+++ b/docs/const.md
@@ -13,7 +13,7 @@ CONST [AS ] =
**CONST** declares a non-modifable variable.
`` can be something like `Integer`, `Byte`, `Float`, etc.
-See the list of [available types](types.md#types.md). If type is not specified,
+See the list of [available types](types.md). If type is not specified,
`Float` will be used, unless you use a modifier like `$` or `%`.
## Examples
diff --git a/docs/dim.md b/docs/dim.md
index 24538d87a..5a65225bd 100644
--- a/docs/dim.md
+++ b/docs/dim.md
@@ -26,10 +26,10 @@ empty string, so you don't need to initialize them, though it's recommended.
ZX BASIC allows you to use undeclared variables. In Sinclair BASIC, using an unassigned variable triggered
the error _Variable not found_, but in ZX BASIC it will default to 0 value.
-You can enforce variable declaration using the `--explicit` [command line option](zxb.md#Command_Line_Options).
+You can enforce variable declaration using the `--explicit` [command line option](zxb.md#command-line-options).
When it's used, the compiler will require every variable to be declared with DIM before being used for the 1st time.
-You can also enforce explicit type declaration using the `--strict` [command line option](zxb.md#Command_Line_Options).
+You can also enforce explicit type declaration using the `--strict` [command line option](zxb.md#command-line-options).
This way, if you use `DIM` you will be required to declare also the type needed.
When you use an undeclared variable, ZX BASIC will try to guess its type by looking at the context in which
@@ -166,7 +166,7 @@ DIM a([ TO] [, ...]) AS
### Description
By default, array indexes starts from 0, not from 1 as in Sinclair BASIC. You can change this behavior setting
-a different array base index using either a [#pragma option](pragma.md) or a [command line option](zxb.md#Command Line Options).
+a different array base index using either a [#pragma option](pragma.md) or a [command line option](zxb.md#command-line-options).
### Examples
diff --git a/docs/for.md b/docs/for.md
index 4f89e8aa9..3ad506557 100644
--- a/docs/for.md
+++ b/docs/for.md
@@ -2,7 +2,7 @@
## Syntax
-```
+```basic
FOR iterator = startvalue TO endvalue [ STEP stepvalue ]
[ sentences ]
NEXT [ iterator ]
@@ -22,18 +22,18 @@ _stepvalue_ until it reaches or exceeds _endvalue_. If _stepvalue_ is not explic
## Examples
-```
+```basic
REM Counts from 1 to 10
FOR i = 1 TO 10: PRINT i: NEXT
```
### Counts downwards
-```
+```basic
FOR i = 10 TO 1 STEP -1: PRINT i: NEXT
```
### Loops using odd numbers
-```
+```basic
FOR i = 1 TO 10 STEP 2: PRINT i: NEXT
```
@@ -43,7 +43,7 @@ FOR i = 1 TO 10 STEP 2: PRINT i: NEXT
* Note that variable types can cause issues with ZX Basic For...Next Loops. If the upper limit of the iterator exceeds
the upper limit of the variable type, the loop may not complete.
For example:
-```
+```basic
DIM i as UByte
FOR i = 1 to 300
@@ -59,7 +59,7 @@ incremented by `` amounts.
For example, this loop will neved end
-```
+```basic
DIM i as UInteger
FOR i = 65000 TO 65500 STEP 100
diff --git a/docs/function.md b/docs/function.md
index 145fa5727..f622874ae 100644
--- a/docs/function.md
+++ b/docs/function.md
@@ -11,7 +11,7 @@ The user is now allowed to define his/her own functions.
## Syntax
Basic function declaration is:
-```
+```vbnet
FUNCTION [()] [AS ]
...
@@ -20,7 +20,7 @@ Basic function declaration is:
## Example
A simple function declaration:
-```
+```vbnet
REM This function receives and returns a byte
FUNCTION PlusOne(x AS Byte) AS Byte
RETURN x + 1
@@ -32,7 +32,7 @@ PRINT x; " plus one is "; PlusOne(x)
If `AS` _type_ is omitted, the function is supposed to return a `Float`.
-```
+```vbnet
REM This function returns a float number because its type has been omitted.
REM Also, the 'x' parameter will be converted to float,
REM because it's type has been omitted too
@@ -48,7 +48,7 @@ PRINT "Square of "; x; " is "; Square(x)
## Recursion
Recursion is a programming technique in which a function calls itself. A classical recursion example is the factorial function:
-```
+```vbnet
FUNCTION Factorial(x)
IF x < 2 THEN RETURN 1
RETURN Factorial(x - 1) * x
@@ -58,11 +58,11 @@ END FUNCTION
However, not using types explicitly might have a negative impact on performance.
Better redefine it using data types. Factorial is usually defined on unsigned integers and also returns an unsigned
integer. Also, keep in mind that factorial numbers tends to _grow up very quickly_ (e.g. Factorial of 10 is 3628800),
-so `ULong` [type](types.md) (32 bits unsigned) seems to be the most suitable for this function.
+so `ULong` [type](types.md#Integral) (32 bits unsigned) seems to be the most suitable for this function.
This version is faster (just the 1st line is changed):
-```
+```vbnet
FUNCTION Factorial(x AS Ulong) AS Ulong
IF x < 2 THEN RETURN x
RETURN Factorial(x - 1) * x
diff --git a/docs/identifier.md b/docs/identifier.md
index 11b319bd7..05cc3d0c7 100644
--- a/docs/identifier.md
+++ b/docs/identifier.md
@@ -20,10 +20,10 @@ Identifiers shown in bold are taken from the Sinclair BASIC (beware their meanin
* **[ASN](asn.md)** **(function)**
* **[AT](at.md)**
* **[ATN](atn.md)** **(function)**
-* **[bAND](bitwiselogic.md)** **(operator)**
-* **[bNOT](bitwiselogic.md)** **(operator)**
-* **[bOR](bitwiselogic.md)** **(operator)**
-* **[bXOR](bitwiselogic.md)** **(operator)**
+* **[bAND](bitwiselogic.md#bAND)** **(operator)**
+* **[bNOT](bitwiselogic.md#bNOT)** **(operator)**
+* **[bOR](bitwiselogic.md#bOR)** **(operator)**
+* **[bXOR](bitwiselogic.md#bXOR)** **(operator)**
* **[BEEP](beep.md)** **(statement)**
* [BOLD](bold.md)
* **[BORDER](border.md)** **(statement)**
@@ -44,7 +44,7 @@ Identifiers shown in bold are taken from the Sinclair BASIC (beware their meanin
* **[DATA](data.md)** **(statement)**
* **[DRAW](draw.md)** **(statement)**
* [ELSE](if.md)
-* [ELSEIF](if.md)
+* [ELSEIF](if.md#using-elseif)
* [END](end.md)
* [EXIT](exit.md) **(statement)**
* **[EXP](exp.md)** **(function)**
@@ -68,7 +68,7 @@ Identifiers shown in bold are taken from the Sinclair BASIC (beware their meanin
* **[LN](ln.md)** **(function)**
* **[LOAD](load.md)** **(statement)**
* [LOOP](do.md) **(statement)**
-* [MOD](operators.md#Arithmetic Operators) **(operator)**
+* [MOD](operators.md#Arithmetic-Operators) **(operator)**
* **[NEXT](for.md)** **(statement)**
* **[NOT](operators.md#NOT)** **(operator)**
* **[ON ... GOTO](on_goto.md)** **(statement)**
@@ -110,7 +110,7 @@ Identifiers shown in bold are taken from the Sinclair BASIC (beware their meanin
* **[VERIFY](load.md)** **(statement)**
* [WEND](while.md) **(statement)**
* [WHILE](while.md) **(statement)**
-* **[XOR](operators.md#logical_operators.md)** **(operator)**
+* **[XOR](operators.md#logical-operators)** **(operator)**
## Inbuilt library Functions
You should also avoid defining (with a SUB or FUNCTION command) routines with the following names, as they are available in the internal library for your use, though you are almost certainly going to need to use #include before using them. Note that some Sinclair Basic words are listed here. Some Freebasic commands are also available through #include options for compatibility with freebasic.
diff --git a/docs/in.md b/docs/in.md
index 6e4c94f76..c983f2253 100644
--- a/docs/in.md
+++ b/docs/in.md
@@ -11,7 +11,7 @@ IN
## Description
Returns the byte value read in the given port.
-Argument must be a numeric expression. Returned value type is [Ubyte](types.md#Ubyte).
+Argument must be a numeric expression. Returned value type is [Ubyte](types.md#Integral).
## Examples
diff --git a/docs/index.md b/docs/index.md
index aac26859b..3eb16e062 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -12,7 +12,7 @@
* [SDK tools](tools.md)
Tools available in the SDK.
-* [Command line options](zxb.md#Command_Line_Options)
+* [Command line options](zxb.md#Command-Line-Options)
Command line options table for the compiler (zxb)
## Download
@@ -63,7 +63,7 @@ Get the latest version of Boriel BASIC from the [archive](archive.md).
Library of functions and subroutines you can use in your programs. You might find them really useful.
## Inline assembler
-Embedding inline assembler in your code is pretty easy. There's a [tutorial](tutorials.md) on it.
+Embedding inline assembler in your code is pretty easy. There's a [tutorial](tutorials.md#how-to-use-inline-assembly) on it.
## Compiler internals
Only for true hackers: This explains how the compiler does its job, how to expand it, etc.
diff --git a/docs/inkey.md b/docs/inkey.md
index 1999e30a3..b00f3ed45 100644
--- a/docs/inkey.md
+++ b/docs/inkey.md
@@ -26,3 +26,7 @@ The above code will echo keys pressed to the screen. Note that the loop has to b
## Remarks
* This sentence is 100% Sinclair BASIC Compatible
+
+## See also
+
+* [INPUT](input.md)
diff --git a/docs/lbound.md b/docs/lbound.md
index 0ab869d85..727365246 100644
--- a/docs/lbound.md
+++ b/docs/lbound.md
@@ -35,7 +35,7 @@ PRINT LBound(a, 0): REM Prints 2, since 'a' has 2 dimensions
## Remarks
-* This function does not exists in Sinclair BASIC.
+* This function does not exist in Sinclair BASIC.
## See also
diff --git a/docs/library/stdlib.md b/docs/library/stdlib.md
index 14fbdf17e..db2de8012 100644
--- a/docs/library/stdlib.md
+++ b/docs/library/stdlib.md
@@ -5,8 +5,8 @@ Some libraries might be available only for some architectures. If so,
they will be signaled as such. If no notice is shown, they are available for
all.
-* [keys.bas](d)
+* [keys.bas](keys.bas.md)
Faster and efficient way to detect keys pressed.
-* [string.bas](.md)
+* [string.bas](string.bas.md)
Library for string manipulation.
diff --git a/docs/other_architectures.md b/docs/other_architectures.md
index 9ef947713..ad7ab8ca4 100644
--- a/docs/other_architectures.md
+++ b/docs/other_architectures.md
@@ -2,7 +2,7 @@
## home computers
-###[Z80](architectures/z80.md)
+### [Z80](architectures/z80.md)
* [ZX-Spectrum](architectures/zxspectrum.md)
* [MSX](architectures/msx.md) 1/2/2+
@@ -56,15 +56,15 @@
* Compucolor 8001/8051
* Triumph-Adler Alphatronic-PC P1/P2/P3/P4
-###Z84C15
+### Z84C15
* [Sprinter 2000](architectures/sp2000.md)
-###[R800](architectures/r800.md)
+### [R800](architectures/r800.md)
* MSX Turbo-R
-###[6502](architectures/6502.md)
+### [6502](architectures/6502.md)
* [BBC-Micro](architectures/bbc_micro.md)
* [Apple](architectures/apple_ii.md) I/[II](architectures/apple_ii.md)/III/IIe/IIc
@@ -78,40 +78,40 @@
* Commodore Plus4
* Commodore [C128](architectures/c128.md)
-###[6800](architectures/6800.md)
+### [6800](architectures/6800.md)
* Goupil-2
* APF [Imagination-Machine](architectures/imaginationmachine.md)
* Matsushita [JR-100](architectures/jr100.md)/[JR-200](architectures/jr200.md)
* Matra-Hachette Alice/Alice-90
-###[6809](architectures/6809.md)
+### [6809](architectures/6809.md)
* TRS 80 Color Computer (CoCo1/[CoCo2](architectures/coco2.md)/CoCo3/[Dragon32](architectures/coco2.md)/etc.)
* Thomson/Olivetti [MO5](architectures/mo5.md)/[Prodest](architectures/mo5.md)/TO7
* Fujitsu FM-7/FM-8
-###65816
+### 65816
* Apple IIGS
-###65SC12
+### 65SC12
* BBC-Master
-###K1801VM1
+### K1801VM1
* [Elektronika-BK](architectures/elektronika_bk.md)
-###Fairchild-F8
+### Fairchild-F8
* VideoBrain Family-Computer
-###TMS7020
+### TMS7020
* Exelvision
-###TMS9900
+### TMS9900
* TI-99-4A/Geneve/TIM
* Tomy Pyuuta/Tutor
@@ -120,7 +120,7 @@
* Xerox Alto
-###[68000](architectures/68000.md)
+### [68000](architectures/68000.md)
* [Sinclair QL](architectures/sinclair_ql.md)
* [Amiga](architectures/amiga_500.md) 1000/[500](architectures/amiga_500.md)/2000/1500/600
@@ -131,95 +131,95 @@
* Luxor ABC-1600
* Silicon Graphics Iris 1000
-###[68020](architectures/68020.md)
+### [68020](architectures/68020.md)
* Amiga 1200
-###[68030](architectures/68030.md)
+### [68030](architectures/68030.md)
* Atari Falcon
* Amiga 3000/4000-030
-###[68040](architectures/68040.md)
+### [68040](architectures/68040.md)
* Amiga 4000-040
-###8086
+### 8086
* NEC [PC-9801](architectures/pc98.md)
* Toshiba Pasopia1600
-###8088
+### 8088
* [IBM PC-XT](architectures/ibm_pc-xt.md)
* Toshiba Pasopia16
-###i386
+### i386
* Fujitsu FM-Towns
-###[ARM](architectures/arm.md)
+### [ARM](architectures/arm.md)
* Acorn Archimedes
## Game Consoles
-###6502
+### 6502
* [NES](architectures/nes.md)
* Atari 5200/7800/XEGS
* [PCEngine](architectures/pcengine.md)/[TurboGrafx](architectures/pcengine.md)
-###6809
+### 6809
* Vectrex
-###6800
+### 6800
* APF-M1000
-###CP1600
+### CP1600
* Intellivision
-###8048
+### 8048
* Odyssey/Videopac
Signetics-2650A
* Emerson Arcadia-2001
-###68000
+### 68000
* Sega Megadrive/Genesis
* SNK [NeoGeo](architectures/neogeo.md)
* Amiga [CDTV](architectures/amiga_500.md)
* Philips CD-i
-###68020
+### 68020
* Amiga CD32
-i286
+### i286
* Tandy Memorex VIS
-###i386
+### i386
* Fujitsu FM-Towns Marty
-###65816
+### 65816
* [SNES](architectures/snes.md)
-###ARM
+### ARM
* 3DO
* Ouya
-###PowerPC
+### PowerPC
* Apple/Bandai Pippin
-###MIPS
+### MIPS
* Atari Jaguar
* Nintendo64
@@ -227,54 +227,55 @@ i286
* PlayStation2
* Gamebox [GBX-1001](architectures/gbx1001.md)
-###SuperH
+### SuperH
* Casio Loopy
-###Atmega
+### Atmega
* [Uzebox](architectures/uzebox.md)
## handheld consoles:
-###8048
+
+### 8048
* Entex [Adventure Vision](architectures/adventurevision.md)
-###Z80
+### Z80
* Sega [GameGear](architectures/segamastersystem.md)
-###8080
+### 8080
* Nintendo [GameBoy](architectures/gameboy.md)
-###6502
+### 6502
* Watara Supervision
* NEC TurboExpress
-###65SC02
+### 65SC02
* Atari [Lynx](architectures/atarilynx.md)
-###TLCS900H
+### TLCS900H
* SNK [NeoGeo Pocket](architectures/neogeopocket.md)
-###80186
+### 80186
* Bandai [Wonderswan](architectures/wonderswan.md)
-###S1C33209
+### S1C33209
* Aquaplus [Piece](architectures/aquapluspiece.md)
-###ARM
+### ARM
* GP2X
* Pandora
-###MIPS
+### MIPS
* Dingoo
@@ -360,19 +361,19 @@ i286
* Sega [Model2](architectures/segamodel2.md)
-###Hitachi SuperH
+### Hitachi SuperH
* Sega Hikaru/Aurora/Naomi
* Kaneko SuperNova
-###PowerPC
+### PowerPC
* Sega [Model3](architectures/segamodel3.md)/Triforce
* Taito Type-Zero
* Namco 357
* Konami M2/Viper/Hornet
-###MIPS
+### MIPS
* SNK Hyper-NeoGeo64
* Taito FX-1B/G-Net
@@ -382,11 +383,11 @@ i286
* Atari Cojag/Flagstaff/Phoenix/Seattle/Vegas/Denver
* Konami Bemani 573/Twinkle/Karaoke
-###ARM
+### ARM
* DataEast MLC/Simple156
-###i586
+### i586
* Sega Chihiro/Lindbergh
* Taito Type-X/Type-X-Zero
@@ -395,12 +396,12 @@ i286
* Cave PC
* Midway Graphite
-###amd64
+### amd64
* Sega Europa-R/RingEdge/RingWide/Nu
* Taito Type-X2
* Konami Bemani PC Type 4
-###Konami Emotion-Engine (128bit)
+### Konami Emotion-Engine (128bit)
* Konami Bemani Python
diff --git a/docs/poke.md b/docs/poke.md
index 1172553e1..467d2c23a 100644
--- a/docs/poke.md
+++ b/docs/poke.md
@@ -11,7 +11,7 @@ poke ,
Stores the given (numeric) _value_ at the specified memory _address_. If _valueType_ is omitted, it is supposed to be _ubyte_ (8 bit unsigned integer).
-The _value_ is [converted](cast.md) to the given _[valueType](zx_basic:types.md)_ and stored at the given _Address_. _Type_ can be any numeric one (like _[float](zx_basic:types#float.md)_ or _[integer](zx_basic:types#integer.md)_).
+The _value_ is [converted](cast.md) to the given _[valueType](types.md)_ and stored at the given _Address_. _Type_ can be any numeric one (like _[float](types.md#float)_ or _[integer](types.md#integral)_).
## Examples
diff --git a/docs/released_programs.md b/docs/released_programs.md
index 0be3ff88e..a24282e87 100644
--- a/docs/released_programs.md
+++ b/docs/released_programs.md
@@ -111,7 +111,7 @@ Year: 2011
Source: Yes
-Link: [http://www.mojontwins.com/csscgc2011/nitrofurano-bacaball/](http://www.mojontwins.com/csscgc2011/nitrofurano-bacaball/)
+Link: [https://web.archive.org/web/20241102042243/http://www.mojontwins.com/csscgc2011/nitrofurano-bacaball/](https://web.archive.org/web/20241102042243/http://www.mojontwins.com/csscgc2011/nitrofurano-bacaball/)

@@ -126,7 +126,7 @@ Year: 2011
Source: Yes
-Link: [http://www.mojontwins.com/csscgc2011/nitrofurano-bacachase/](http://www.mojontwins.com/csscgc2011/nitrofurano-bacachase/)
+Link: [https://web.archive.org/web/20241010222443/http://www.mojontwins.com/csscgc2011/nitrofurano-bacachase/](https://web.archive.org/web/20241010222443/http://www.mojontwins.com/csscgc2011/nitrofurano-bacachase/)

@@ -383,7 +383,7 @@ Year: 2013
Source: Yes
-Link: [http://notimetoplay.org/our-games/escape-from-cnossus/](http://notimetoplay.org/our-games/escape-from-cnossus/)
+Link: [https://notimetoplay.org/games/roguelike/escape-from-cnossus/](https://notimetoplay.org/games/roguelike/escape-from-cnossus/)

@@ -503,7 +503,7 @@ Year: 2012
Source: Yes
-Link: [https://www.yoursinclair.co.uk/csscgc/csscgc.cgi?search=0301180542lookingforacsscgc2012theme_20120301145340.zip](https://www.yoursinclair.co.uk/csscgc/csscgc.cgi?search=0301180542lookingforacsscgc2012theme_20120301145340.zip)
+Link: [https://www.yoursinclair.co.uk/csscgc/csscgc.cgi?search=lookingforacsscgc2012theme](https://www.yoursinclair.co.uk/csscgc/csscgc.cgi?search=lookingforacsscgc2012theme)
Description: optimized for ULA-Plus palette
@@ -535,7 +535,7 @@ Year: 2011
Source: Yes
-Link: [http://www.mojontwins.com/csscgc2011/paulo-silva-memorama/](http://www.mojontwins.com/csscgc2011/paulo-silva-memorama/)
+Link: [https://web.archive.org/web/20240911054831/http://www.mojontwins.com/csscgc2011/paulo-silva-memorama/](https://web.archive.org/web/20240911054831/http://www.mojontwins.com/csscgc2011/paulo-silva-memorama/)

@@ -715,7 +715,7 @@ Year: 2011
Source: Yes
-Link: [http://www.mojontwins.com/csscgc2011/nitrofurano-solitario/](http://www.mojontwins.com/csscgc2011/nitrofurano-solitario/)
+Link: [https://web.archive.org/web/20200526010102/https://www.mojontwins.com/csscgc2011/nitrofurano-solitario/](https://web.archive.org/web/20200526010102/https://www.mojontwins.com/csscgc2011/nitrofurano-solitario/)

@@ -745,7 +745,7 @@ Year: 2013
Source: Yes
-Link: [https://www.boriel.com/forum/showthread.php?tid=410&highlight=speccywars](https://www.boriel.com/forum/showthread.php?tid=410&highlight=speccywars)
+Link: [https://www.boriel.com/forum/showthread.php?tid=410](https://www.boriel.com/forum/showthread.php?tid=410)

@@ -775,7 +775,7 @@ Year: 2012
Source: No
-Link: [http://cgc.zx.gen.tr/index.php?game=0628182038](http://cgc.zx.gen.tr/index.php?game=0628182038)
+Link: [https://zx.gen.tr/cgc/index.php?game=0628182038](https://zx.gen.tr/cgc/index.php?game=0628182038)

@@ -835,7 +835,7 @@ Year: 2011
Source: No
-Link: [http://www.mojontwins.com/csscgc2011/jbgv-uchi-danza/](http://www.mojontwins.com/csscgc2011/jbgv-uchi-danza/)
+Link: [https://web.archive.org/web/20111122000131/https://www.mojontwins.com/csscgc2011/jbgv-uchi-danza/](https://web.archive.org/web/20111122000131/https://www.mojontwins.com/csscgc2011/jbgv-uchi-danza/)

@@ -990,7 +990,7 @@ Year: 2016
Source: No
-Link: [http://www.boriel.com/forum/gallery/ems-christmas-card-demo-t1102.html](http://www.boriel.com/forum/gallery/ems-christmas-card-demo-t1102.html)
+Link: [https://www.boriel.com/forum/showthread.php?tid=764](https://www.boriel.com/forum/showthread.php?tid=764)

@@ -1005,7 +1005,7 @@ Year: 2016
Source: No
-Link: [http://www.boriel.com/forum/gallery/jrpg-test-and-tileeditor-t1082.html](http://www.boriel.com/forum/gallery/jrpg-test-and-tileeditor-t1082.html)
+Link: [https://www.boriel.com/forum/showthread.php?tid=747](https://www.boriel.com/forum/showthread.php?tid=747)

@@ -1020,7 +1020,7 @@ Year: 2016
Source: No
-Link: [http://www.boriel.com/forum/gallery/just-something-silly-t1095.html](http://www.boriel.com/forum/gallery/just-something-silly-t1095.html)
+Link: [https://www.boriel.com/forum/showthread.php?tid=757](https://www.boriel.com/forum/showthread.php?tid=757)
Description:
@@ -1137,7 +1137,7 @@ Year: 2013
Source: Yes
-Link: [https://www.boriel.com/forum/showthread.php?tid=529&pid=3334#pid3334](https://www.boriel.com/forum/showthread.php?tid=529&pid=3334#pid3334)
+Link: [https://www.boriel.com/forum/showthread.php?tid=529](https://www.boriel.com/forum/showthread.php?tid=529)

diff --git a/docs/sgn.md b/docs/sgn.md
index c314471c0..f4cc95247 100644
--- a/docs/sgn.md
+++ b/docs/sgn.md
@@ -12,7 +12,7 @@ Returns the sign of a numeric expression as follows:
* 0 if the number is zero
* 1 if the number is positive
-The returned value type is [byte](types.md#Byte).
+The returned value type is [byte](types.md#Integral).
## Examples
diff --git a/docs/stop.md b/docs/stop.md
index 8c65e9110..a79084429 100644
--- a/docs/stop.md
+++ b/docs/stop.md
@@ -15,4 +15,5 @@ STOP
```
## See Also
+
* [END](end.md)
diff --git a/docs/str.md b/docs/str.md
index 6009462ca..ca23138bf 100644
--- a/docs/str.md
+++ b/docs/str.md
@@ -10,7 +10,7 @@ STR()
## Description
Converts the given numeric value to a String. It's the opposite of [VAL](val.md)
-Returned value type is [String](types.md#UByte).
+Returned value type is [String](types.md#Integral).
## Examples
diff --git a/docs/types.md b/docs/types.md
index 734d24b0e..cee879016 100644
--- a/docs/types.md
+++ b/docs/types.md
@@ -20,7 +20,7 @@ to save memory and achieve higher speed.
There are 3 kinds of types: **integrals** (integer numbers), **decimals** and **strings**
### Integral
-Integrals are numerical types to store integer values.
+Integrals (or Integers) are numerical types to store integer values.
They can be _unsigned_ (their value is always 0 or positive) or _signed_ (can take negative values).
ZX Basic integer types sizes are 8, 16 and 32 bits. Unsigned types have the prefix _U_.
diff --git a/docs/zxb.md b/docs/zxb.md
index 27db3c27d..298e936d9 100644
--- a/docs/zxb.md
+++ b/docs/zxb.md
@@ -159,7 +159,7 @@ messages (for example, to call ZX BASIC compiler from within an
IDE).
* **--array-base**
-
Unlike original Sinclair BASIC, array indexes starts from 0, not from 1 (see [DIM](dim.md)).
+
Unlike original Sinclair BASIC, array indexes starts from 0, not from 1 (see [DIM](dim.md#Array-Declaration)).
You can change this behavior. For example setting `--array-base=1` will make array indexes start from 1
(like in Sinclair BASIC). This option (array-base=1) is active when `--sinclair` compatibility flag is specified.
@@ -211,8 +211,9 @@ This option is really useful and you should enable it for large programs.
* **--strict**
Requires all variables (and parameters and functions!) to have an explicit type declared
-(e.g. [Uinteger](types.md)). Otherwise, forgetting a type will cause an error and the program won't compile.
+(e.g. [Uinteger](types.md#Integral)). Otherwise, forgetting a type will cause an error and the program won't compile.
This is very useful to avoid forgetting type declarations. When the type is explicitly declared the compiler can make
better assumptions and further error checking and optimizations.
-This is all you need to know to use the compiler. Proceed to the [ZX BASIC](language.md) page for a language reference.
+This is all you need to know to use the compiler. Proceed to the [ZX BASIC](index.md#Language-Reference) page for a
+language reference.
diff --git a/poetry.lock b/poetry.lock
index 73fbec584..ffab4fdd8 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
[[package]]
name = "bump2version"
@@ -6,7 +6,6 @@ version = "1.0.1"
description = "Version-bump your software with a single command!"
optional = false
python-versions = ">=3.5"
-groups = ["dev"]
files = [
{file = "bump2version-1.0.1-py2.py3-none-any.whl", hash = "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410"},
{file = "bump2version-1.0.1.tar.gz", hash = "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6"},
@@ -18,7 +17,6 @@ version = "3.4.0"
description = "Validate configuration and produce human readable error messages."
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
{file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"},
{file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"},
@@ -26,14 +24,13 @@ files = [
[[package]]
name = "click"
-version = "8.1.8"
+version = "8.2.1"
description = "Composable command line interface toolkit"
optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
+python-versions = ">=3.10"
files = [
- {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
- {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
+ {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"},
+ {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"},
]
[package.dependencies]
@@ -45,8 +42,6 @@ version = "0.4.6"
description = "Cross-platform colored terminal text."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-groups = ["dev"]
-markers = "platform_system == \"Windows\" or sys_platform == \"win32\""
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
@@ -54,90 +49,92 @@ files = [
[[package]]
name = "coverage"
-version = "7.8.0"
+version = "7.9.2"
description = "Code coverage measurement for Python"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"},
- {file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"},
- {file = "coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3"},
- {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676"},
- {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d"},
- {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a"},
- {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c"},
- {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f"},
- {file = "coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f"},
- {file = "coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23"},
- {file = "coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27"},
- {file = "coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea"},
- {file = "coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7"},
- {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040"},
- {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543"},
- {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2"},
- {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318"},
- {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9"},
- {file = "coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c"},
- {file = "coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78"},
- {file = "coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc"},
- {file = "coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6"},
- {file = "coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d"},
- {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05"},
- {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a"},
- {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6"},
- {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47"},
- {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe"},
- {file = "coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545"},
- {file = "coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b"},
- {file = "coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd"},
- {file = "coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00"},
- {file = "coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64"},
- {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067"},
- {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008"},
- {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733"},
- {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323"},
- {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3"},
- {file = "coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d"},
- {file = "coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487"},
- {file = "coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25"},
- {file = "coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42"},
- {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502"},
- {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1"},
- {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4"},
- {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73"},
- {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a"},
- {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883"},
- {file = "coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada"},
- {file = "coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257"},
- {file = "coverage-7.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"},
- {file = "coverage-7.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96121edfa4c2dfdda409877ea8608dd01de816a4dc4a0523356067b305e4e17a"},
- {file = "coverage-7.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8af63b9afa1031c0ef05b217faa598f3069148eeee6bb24b79da9012423b82"},
- {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b1f4af0d4afe495cd4787a68e00f30f1d15939f550e869de90a86efa7e0814"},
- {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ec0be97723ae72d63d3aa41961a0b9a6f5a53ff599813c324548d18e3b9e8c"},
- {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a1d96e780bdb2d0cbb297325711701f7c0b6f89199a57f2049e90064c29f6bd"},
- {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f1d8a2a57b47142b10374902777e798784abf400a004b14f1b0b9eaf1e528ba4"},
- {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cf60dd2696b457b710dd40bf17ad269d5f5457b96442f7f85722bdb16fa6c899"},
- {file = "coverage-7.8.0-cp39-cp39-win32.whl", hash = "sha256:be945402e03de47ba1872cd5236395e0f4ad635526185a930735f66710e1bd3f"},
- {file = "coverage-7.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:90e7fbc6216ecaffa5a880cdc9c77b7418c1dcb166166b78dbc630d07f278cc3"},
- {file = "coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd"},
- {file = "coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7"},
- {file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"},
+files = [
+ {file = "coverage-7.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:66283a192a14a3854b2e7f3418d7db05cdf411012ab7ff5db98ff3b181e1f912"},
+ {file = "coverage-7.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e01d138540ef34fcf35c1aa24d06c3de2a4cffa349e29a10056544f35cca15f"},
+ {file = "coverage-7.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f22627c1fe2745ee98d3ab87679ca73a97e75ca75eb5faee48660d060875465f"},
+ {file = "coverage-7.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b1c2d8363247b46bd51f393f86c94096e64a1cf6906803fa8d5a9d03784bdbf"},
+ {file = "coverage-7.9.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c10c882b114faf82dbd33e876d0cbd5e1d1ebc0d2a74ceef642c6152f3f4d547"},
+ {file = "coverage-7.9.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:de3c0378bdf7066c3988d66cd5232d161e933b87103b014ab1b0b4676098fa45"},
+ {file = "coverage-7.9.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1e2f097eae0e5991e7623958a24ced3282676c93c013dde41399ff63e230fcf2"},
+ {file = "coverage-7.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28dc1f67e83a14e7079b6cea4d314bc8b24d1aed42d3582ff89c0295f09b181e"},
+ {file = "coverage-7.9.2-cp310-cp310-win32.whl", hash = "sha256:bf7d773da6af9e10dbddacbf4e5cab13d06d0ed93561d44dae0188a42c65be7e"},
+ {file = "coverage-7.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:0c0378ba787681ab1897f7c89b415bd56b0b2d9a47e5a3d8dc0ea55aac118d6c"},
+ {file = "coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7a56a2964a9687b6aba5b5ced6971af308ef6f79a91043c05dd4ee3ebc3e9ba"},
+ {file = "coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123d589f32c11d9be7fe2e66d823a236fe759b0096f5db3fb1b75b2fa414a4fa"},
+ {file = "coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:333b2e0ca576a7dbd66e85ab402e35c03b0b22f525eed82681c4b866e2e2653a"},
+ {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326802760da234baf9f2f85a39e4a4b5861b94f6c8d95251f699e4f73b1835dc"},
+ {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e7be4cfec248df38ce40968c95d3952fbffd57b400d4b9bb580f28179556d2"},
+ {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b4a4cb73b9f2b891c1788711408ef9707666501ba23684387277ededab1097c"},
+ {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2c8937fa16c8c9fbbd9f118588756e7bcdc7e16a470766a9aef912dd3f117dbd"},
+ {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42da2280c4d30c57a9b578bafd1d4494fa6c056d4c419d9689e66d775539be74"},
+ {file = "coverage-7.9.2-cp311-cp311-win32.whl", hash = "sha256:14fa8d3da147f5fdf9d298cacc18791818f3f1a9f542c8958b80c228320e90c6"},
+ {file = "coverage-7.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:549cab4892fc82004f9739963163fd3aac7a7b0df430669b75b86d293d2df2a7"},
+ {file = "coverage-7.9.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2667a2b913e307f06aa4e5677f01a9746cd08e4b35e14ebcde6420a9ebb4c62"},
+ {file = "coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae9eb07f1cfacd9cfe8eaee6f4ff4b8a289a668c39c165cd0c8548484920ffc0"},
+ {file = "coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ce85551f9a1119f02adc46d3014b5ee3f765deac166acf20dbb851ceb79b6f3"},
+ {file = "coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f6389ac977c5fb322e0e38885fbbf901743f79d47f50db706e7644dcdcb6e1"},
+ {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d9eae8cdfcd58fe7893b88993723583a6ce4dfbfd9f29e001922544f95615"},
+ {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae939811e14e53ed8a9818dad51d434a41ee09df9305663735f2e2d2d7d959b"},
+ {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31991156251ec202c798501e0a42bbdf2169dcb0f137b1f5c0f4267f3fc68ef9"},
+ {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d0d67963f9cbfc7c7f96d4ac74ed60ecbebd2ea6eeb51887af0f8dce205e545f"},
+ {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49b752a2858b10580969ec6af6f090a9a440a64a301ac1528d7ca5f7ed497f4d"},
+ {file = "coverage-7.9.2-cp312-cp312-win32.whl", hash = "sha256:88d7598b8ee130f32f8a43198ee02edd16d7f77692fa056cb779616bbea1b355"},
+ {file = "coverage-7.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:9dfb070f830739ee49d7c83e4941cc767e503e4394fdecb3b54bfdac1d7662c0"},
+ {file = "coverage-7.9.2-cp312-cp312-win_arm64.whl", hash = "sha256:4e2c058aef613e79df00e86b6d42a641c877211384ce5bd07585ed7ba71ab31b"},
+ {file = "coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038"},
+ {file = "coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d"},
+ {file = "coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3"},
+ {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14"},
+ {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6"},
+ {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b"},
+ {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d"},
+ {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868"},
+ {file = "coverage-7.9.2-cp313-cp313-win32.whl", hash = "sha256:0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a"},
+ {file = "coverage-7.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b"},
+ {file = "coverage-7.9.2-cp313-cp313-win_arm64.whl", hash = "sha256:48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694"},
+ {file = "coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5"},
+ {file = "coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b"},
+ {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3"},
+ {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8"},
+ {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46"},
+ {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584"},
+ {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e"},
+ {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac"},
+ {file = "coverage-7.9.2-cp313-cp313t-win32.whl", hash = "sha256:1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926"},
+ {file = "coverage-7.9.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd"},
+ {file = "coverage-7.9.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb"},
+ {file = "coverage-7.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddc39510ac922a5c4c27849b739f875d3e1d9e590d1e7b64c98dadf037a16cce"},
+ {file = "coverage-7.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a535c0c7364acd55229749c2b3e5eebf141865de3a8f697076a3291985f02d30"},
+ {file = "coverage-7.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df0f9ef28e0f20c767ccdccfc5ae5f83a6f4a2fbdfbcbcc8487a8a78771168c8"},
+ {file = "coverage-7.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f3da12e0ccbcb348969221d29441ac714bbddc4d74e13923d3d5a7a0bebef7a"},
+ {file = "coverage-7.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a17eaf46f56ae0f870f14a3cbc2e4632fe3771eab7f687eda1ee59b73d09fe4"},
+ {file = "coverage-7.9.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:669135a9d25df55d1ed56a11bf555f37c922cf08d80799d4f65d77d7d6123fcf"},
+ {file = "coverage-7.9.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9d3a700304d01a627df9db4322dc082a0ce1e8fc74ac238e2af39ced4c083193"},
+ {file = "coverage-7.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:71ae8b53855644a0b1579d4041304ddc9995c7b21c8a1f16753c4d8903b4dfed"},
+ {file = "coverage-7.9.2-cp39-cp39-win32.whl", hash = "sha256:dd7a57b33b5cf27acb491e890720af45db05589a80c1ffc798462a765be6d4d7"},
+ {file = "coverage-7.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f65bb452e579d5540c8b37ec105dd54d8b9307b07bcaa186818c104ffda22441"},
+ {file = "coverage-7.9.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:8a1166db2fb62473285bcb092f586e081e92656c7dfa8e9f62b4d39d7e6b5050"},
+ {file = "coverage-7.9.2-py3-none-any.whl", hash = "sha256:e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4"},
+ {file = "coverage-7.9.2.tar.gz", hash = "sha256:997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b"},
]
[package.extras]
-toml = ["tomli ; python_full_version <= \"3.11.0a6\""]
+toml = ["tomli"]
[[package]]
name = "distlib"
-version = "0.3.9"
+version = "0.4.0"
description = "Distribution utilities"
optional = false
python-versions = "*"
-groups = ["dev"]
files = [
- {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"},
- {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
+ {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"},
+ {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"},
]
[[package]]
@@ -146,7 +143,6 @@ version = "2.1.1"
description = "execnet: rapid multi-Python deployment"
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
{file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"},
{file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"},
@@ -161,7 +157,6 @@ version = "3.18.0"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
{file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"},
{file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"},
@@ -170,7 +165,7 @@ files = [
[package.extras]
docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"]
testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"]
-typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""]
+typing = ["typing-extensions (>=4.12.2)"]
[[package]]
name = "ghp-import"
@@ -178,7 +173,6 @@ version = "2.1.0"
description = "Copy your docs directly to the gh-pages branch."
optional = false
python-versions = "*"
-groups = ["dev"]
files = [
{file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
{file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
@@ -192,14 +186,13 @@ dev = ["flake8", "markdown", "twine", "wheel"]
[[package]]
name = "identify"
-version = "2.6.9"
+version = "2.6.12"
description = "File identification library for Python"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
- {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"},
- {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"},
+ {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"},
+ {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"},
]
[package.extras]
@@ -211,7 +204,6 @@ version = "2.1.0"
description = "brain-dead simple config-ini parsing"
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
{file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"},
{file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"},
@@ -223,7 +215,6 @@ version = "3.1.6"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
-groups = ["dev"]
files = [
{file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
{file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
@@ -237,18 +228,17 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "markdown"
-version = "3.7"
+version = "3.8.2"
description = "Python implementation of John Gruber's Markdown."
optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
+python-versions = ">=3.9"
files = [
- {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
- {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
+ {file = "markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24"},
+ {file = "markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45"},
]
[package.extras]
-docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
+docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
testing = ["coverage", "pyyaml"]
[[package]]
@@ -257,7 +247,6 @@ version = "3.0.2"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
@@ -328,7 +317,6 @@ version = "1.3.4"
description = "A deep merge function for 🐍."
optional = false
python-versions = ">=3.6"
-groups = ["dev"]
files = [
{file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
{file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
@@ -340,7 +328,6 @@ version = "1.6.1"
description = "Project documentation with Markdown."
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
{file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"},
{file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"},
@@ -363,7 +350,7 @@ watchdog = ">=2.0"
[package.extras]
i18n = ["babel (>=2.9.0)"]
-min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4) ; platform_system == \"Windows\"", "ghp-import (==1.0)", "importlib-metadata (==4.4) ; python_version < \"3.10\"", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"]
+min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"]
[[package]]
name = "mkdocs-get-deps"
@@ -371,7 +358,6 @@ version = "0.2.0"
description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file"
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
{file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"},
{file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"},
@@ -384,48 +370,48 @@ pyyaml = ">=5.1"
[[package]]
name = "mypy"
-version = "1.15.0"
+version = "1.17.0"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
- {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
- {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
- {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
- {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
- {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
- {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
- {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
- {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
- {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
- {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
- {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
- {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
- {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
+files = [
+ {file = "mypy-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8e08de6138043108b3b18f09d3f817a4783912e48828ab397ecf183135d84d6"},
+ {file = "mypy-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce4a17920ec144647d448fc43725b5873548b1aae6c603225626747ededf582d"},
+ {file = "mypy-1.17.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ff25d151cc057fdddb1cb1881ef36e9c41fa2a5e78d8dd71bee6e4dcd2bc05b"},
+ {file = "mypy-1.17.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93468cf29aa9a132bceb103bd8475f78cacde2b1b9a94fd978d50d4bdf616c9a"},
+ {file = "mypy-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:98189382b310f16343151f65dd7e6867386d3e35f7878c45cfa11383d175d91f"},
+ {file = "mypy-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:c004135a300ab06a045c1c0d8e3f10215e71d7b4f5bb9a42ab80236364429937"},
+ {file = "mypy-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d4fe5c72fd262d9c2c91c1117d16aac555e05f5beb2bae6a755274c6eec42be"},
+ {file = "mypy-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96b196e5c16f41b4f7736840e8455958e832871990c7ba26bf58175e357ed61"},
+ {file = "mypy-1.17.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73a0ff2dd10337ceb521c080d4147755ee302dcde6e1a913babd59473904615f"},
+ {file = "mypy-1.17.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cfcc1179c4447854e9e406d3af0f77736d631ec87d31c6281ecd5025df625d"},
+ {file = "mypy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56f180ff6430e6373db7a1d569317675b0a451caf5fef6ce4ab365f5f2f6c3"},
+ {file = "mypy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:eafaf8b9252734400f9b77df98b4eee3d2eecab16104680d51341c75702cad70"},
+ {file = "mypy-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f986f1cab8dbec39ba6e0eaa42d4d3ac6686516a5d3dccd64be095db05ebc6bb"},
+ {file = "mypy-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51e455a54d199dd6e931cd7ea987d061c2afbaf0960f7f66deef47c90d1b304d"},
+ {file = "mypy-1.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3204d773bab5ff4ebbd1f8efa11b498027cd57017c003ae970f310e5b96be8d8"},
+ {file = "mypy-1.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1051df7ec0886fa246a530ae917c473491e9a0ba6938cfd0ec2abc1076495c3e"},
+ {file = "mypy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f773c6d14dcc108a5b141b4456b0871df638eb411a89cd1c0c001fc4a9d08fc8"},
+ {file = "mypy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:1619a485fd0e9c959b943c7b519ed26b712de3002d7de43154a489a2d0fd817d"},
+ {file = "mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06"},
+ {file = "mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a"},
+ {file = "mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889"},
+ {file = "mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba"},
+ {file = "mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658"},
+ {file = "mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c"},
+ {file = "mypy-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63e751f1b5ab51d6f3d219fe3a2fe4523eaa387d854ad06906c63883fde5b1ab"},
+ {file = "mypy-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fb09d05e0f1c329a36dcd30e27564a3555717cde87301fae4fb542402ddfad"},
+ {file = "mypy-1.17.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b72c34ce05ac3a1361ae2ebb50757fb6e3624032d91488d93544e9f82db0ed6c"},
+ {file = "mypy-1.17.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434ad499ad8dde8b2f6391ddfa982f41cb07ccda8e3c67781b1bfd4e5f9450a8"},
+ {file = "mypy-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f105f61a5eff52e137fd73bee32958b2add9d9f0a856f17314018646af838e97"},
+ {file = "mypy-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:ba06254a5a22729853209550d80f94e28690d5530c661f9416a68ac097b13fc4"},
+ {file = "mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496"},
+ {file = "mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03"},
]
[package.dependencies]
mypy_extensions = ">=1.0.0"
+pathspec = ">=0.9.0"
typing_extensions = ">=4.6.0"
[package.extras]
@@ -437,14 +423,13 @@ reports = ["lxml"]
[[package]]
name = "mypy-extensions"
-version = "1.0.0"
+version = "1.1.0"
description = "Type system extensions for programs checked with the mypy type checker."
optional = false
-python-versions = ">=3.5"
-groups = ["dev"]
+python-versions = ">=3.8"
files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
+ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
]
[[package]]
@@ -453,7 +438,6 @@ version = "1.9.1"
description = "Node.js virtual environment builder"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-groups = ["dev"]
files = [
{file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"},
{file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"},
@@ -461,14 +445,13 @@ files = [
[[package]]
name = "packaging"
-version = "24.2"
+version = "25.0"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
+ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
+ {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
]
[[package]]
@@ -477,7 +460,6 @@ version = "0.2.1"
description = "Bring colors to your terminal."
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-groups = ["dev"]
files = [
{file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"},
{file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"},
@@ -489,7 +471,6 @@ version = "0.12.1"
description = "Utility library for gitignore style pattern matching of file paths."
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
@@ -497,14 +478,13 @@ files = [
[[package]]
name = "platformdirs"
-version = "4.3.7"
+version = "4.3.8"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
- {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"},
- {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"},
+ {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"},
+ {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"},
]
[package.extras]
@@ -514,30 +494,28 @@ type = ["mypy (>=1.14.1)"]
[[package]]
name = "pluggy"
-version = "1.5.0"
+version = "1.6.0"
description = "plugin and hook calling mechanisms for python"
optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
+python-versions = ">=3.9"
files = [
- {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
- {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"},
+ {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"},
]
[package.extras]
dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
+testing = ["coverage", "pytest", "pytest-benchmark"]
[[package]]
name = "poethepoet"
-version = "0.33.1"
-description = "A task runner that works well with poetry."
+version = "0.36.0"
+description = "A task runner that works well with poetry and uv."
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
- {file = "poethepoet-0.33.1-py3-none-any.whl", hash = "sha256:b86d80a81b2ca4e4ce8e8f716cc6004a1a1cdead027778bc07d1c26cb3664770"},
- {file = "poethepoet-0.33.1.tar.gz", hash = "sha256:8775e09b64f773278b5483659ff238a708723491efadeedd1c2cbf773558cb4c"},
+ {file = "poethepoet-0.36.0-py3-none-any.whl", hash = "sha256:693e3c1eae9f6731d3613c3c0c40f747d3c5c68a375beda42e590a63c5623308"},
+ {file = "poethepoet-0.36.0.tar.gz", hash = "sha256:2217b49cb4e4c64af0b42ff8c4814b17f02e107d38bc461542517348ede25663"},
]
[package.dependencies]
@@ -545,7 +523,7 @@ pastel = ">=0.2.1,<0.3.0"
pyyaml = ">=6.0.2,<7.0"
[package.extras]
-poetry-plugin = ["poetry (>=1.2.0,<3.0.0) ; python_version < \"4.0\""]
+poetry-plugin = ["poetry (>=1.2.0,<3.0.0)"]
[[package]]
name = "pre-commit"
@@ -553,7 +531,6 @@ version = "4.2.0"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
{file = "pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd"},
{file = "pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146"},
@@ -566,56 +543,69 @@ nodeenv = ">=0.11.1"
pyyaml = ">=5.1"
virtualenv = ">=20.10.0"
+[[package]]
+name = "pygments"
+version = "2.19.2"
+description = "Pygments is a syntax highlighting package written in Python."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"},
+ {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"},
+]
+
+[package.extras]
+windows-terminal = ["colorama (>=0.4.6)"]
+
[[package]]
name = "pytest"
-version = "8.3.5"
+version = "8.4.1"
description = "pytest: simple powerful testing with Python"
optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
+python-versions = ">=3.9"
files = [
- {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"},
- {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"},
+ {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"},
+ {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"},
]
[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-iniconfig = "*"
-packaging = "*"
+colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
+iniconfig = ">=1"
+packaging = ">=20"
pluggy = ">=1.5,<2"
+pygments = ">=2.7.2"
[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-cov"
-version = "6.1.0"
+version = "6.2.1"
description = "Pytest plugin for measuring coverage."
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
- {file = "pytest_cov-6.1.0-py3-none-any.whl", hash = "sha256:cd7e1d54981d5185ef2b8d64b50172ce97e6f357e6df5cb103e828c7f993e201"},
- {file = "pytest_cov-6.1.0.tar.gz", hash = "sha256:ec55e828c66755e5b74a21bd7cc03c303a9f928389c0563e50ba454a6dbe71db"},
+ {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"},
+ {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"},
]
[package.dependencies]
coverage = {version = ">=7.5", extras = ["toml"]}
-pytest = ">=4.6"
+pluggy = ">=1.2"
+pytest = ">=6.2.5"
[package.extras]
testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
[[package]]
name = "pytest-xdist"
-version = "3.6.1"
+version = "3.8.0"
description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs"
optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
+python-versions = ">=3.9"
files = [
- {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"},
- {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"},
+ {file = "pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88"},
+ {file = "pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"},
]
[package.dependencies]
@@ -633,7 +623,6 @@ version = "2.9.0.post0"
description = "Extensions to the standard Python datetime module"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-groups = ["dev"]
files = [
{file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
{file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
@@ -648,7 +637,6 @@ version = "6.0.2"
description = "YAML parser and emitter for Python"
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
{file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
{file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
@@ -707,14 +695,13 @@ files = [
[[package]]
name = "pyyaml-env-tag"
-version = "0.1"
-description = "A custom YAML tag for referencing environment variables in YAML files. "
+version = "1.1"
+description = "A custom YAML tag for referencing environment variables in YAML files."
optional = false
-python-versions = ">=3.6"
-groups = ["dev"]
+python-versions = ">=3.9"
files = [
- {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
- {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
+ {file = "pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04"},
+ {file = "pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff"},
]
[package.dependencies]
@@ -722,30 +709,29 @@ pyyaml = "*"
[[package]]
name = "ruff"
-version = "0.11.2"
+version = "0.12.4"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
-groups = ["dev"]
-files = [
- {file = "ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477"},
- {file = "ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272"},
- {file = "ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9"},
- {file = "ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb"},
- {file = "ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3"},
- {file = "ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74"},
- {file = "ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608"},
- {file = "ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f"},
- {file = "ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147"},
- {file = "ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b"},
- {file = "ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9"},
- {file = "ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab"},
- {file = "ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630"},
- {file = "ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f"},
- {file = "ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc"},
- {file = "ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080"},
- {file = "ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4"},
- {file = "ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94"},
+files = [
+ {file = "ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a"},
+ {file = "ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442"},
+ {file = "ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e"},
+ {file = "ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586"},
+ {file = "ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb"},
+ {file = "ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c"},
+ {file = "ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a"},
+ {file = "ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3"},
+ {file = "ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045"},
+ {file = "ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57"},
+ {file = "ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184"},
+ {file = "ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb"},
+ {file = "ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1"},
+ {file = "ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b"},
+ {file = "ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93"},
+ {file = "ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a"},
+ {file = "ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e"},
+ {file = "ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873"},
]
[[package]]
@@ -754,20 +740,19 @@ version = "78.1.1"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
{file = "setuptools-78.1.1-py3-none-any.whl", hash = "sha256:c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561"},
{file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"},
]
[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""]
-core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"]
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"]
+core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
enabler = ["pytest-enabler (>=2.2)"]
-test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
-type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"]
+test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
+type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"]
[[package]]
name = "six"
@@ -775,7 +760,6 @@ version = "1.17.0"
description = "Python 2 and 3 compatibility utilities"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-groups = ["dev"]
files = [
{file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
@@ -783,26 +767,24 @@ files = [
[[package]]
name = "typing-extensions"
-version = "4.13.0"
-description = "Backported and Experimental Type Hints for Python 3.8+"
+version = "4.14.1"
+description = "Backported and Experimental Type Hints for Python 3.9+"
optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
+python-versions = ">=3.9"
files = [
- {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"},
- {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"},
+ {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"},
+ {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"},
]
[[package]]
name = "virtualenv"
-version = "20.30.0"
+version = "20.31.2"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
files = [
- {file = "virtualenv-20.30.0-py3-none-any.whl", hash = "sha256:e34302959180fca3af42d1800df014b35019490b119eba981af27f2fa486e5d6"},
- {file = "virtualenv-20.30.0.tar.gz", hash = "sha256:800863162bcaa5450a6e4d721049730e7f2dae07720e0902b0e4040bd6f9ada8"},
+ {file = "virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11"},
+ {file = "virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af"},
]
[package.dependencies]
@@ -812,7 +794,7 @@ platformdirs = ">=3.9.1,<5"
[package.extras]
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
-test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""]
+test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
[[package]]
name = "watchdog"
@@ -820,7 +802,6 @@ version = "6.0.0"
description = "Filesystem events monitoring"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
{file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"},
{file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"},
@@ -858,6 +839,6 @@ files = [
watchmedo = ["PyYAML (>=3.10)"]
[metadata]
-lock-version = "2.1"
-python-versions = "^3.12"
-content-hash = "22059adff64a9b9a3cc6ce649b7669c852292263b27d9f366d369a679061eea6"
+lock-version = "2.0"
+python-versions = "^3.11"
+content-hash = "f58f04f170bd72f913d33992224112b9fc24a3bd06cd2dc2120e99d29e043955"
diff --git a/pyproject.toml b/pyproject.toml
index bfbfc2cd6..2a931a4e4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "zxbasic"
-version = "1.18.1"
+version = "1.18.2"
description = "Boriel's ZX BASIC Compiler"
authors = ["Jose Rodriguez "]
license = "AGPL-3.0-or-later"
@@ -14,7 +14,7 @@ classifiers = [
'Intended Audience :: Developers',
'Topic :: Software Development :: Build Tools',
'License :: OSI Approved :: GNU Affero General Public License v3',
- 'Programming Language :: Python :: 3.12',
+ 'Programming Language :: Python :: 3.11',
]
keywords = ['compiler', 'zxspectrum', 'BASIC', 'z80'] # arbitrary keywords
@@ -25,11 +25,11 @@ packages = [
[tool.poetry.scripts]
zxbc = 'src.zxbc:main'
-zxbasm = 'src.zxbasm.zxbasm:main'
-zxbpp = 'src.zxbpp.zxbpp:entry_point'
+zxbasm = 'src.zxbasm:main'
+zxbpp = 'src.zxbpp:entry_point'
[tool.poetry.dependencies]
-python = "^3.12"
+python = "^3.11"
[tool.poetry.group.dev.dependencies]
pytest = "*"
@@ -110,7 +110,7 @@ follow_imports = "skip"
[tool.ruff]
line-length = 120
-target-version = "py310"
+target-version = "py311"
exclude = [
"src/ply" # PLY, external 3rd party tool
]
@@ -139,6 +139,7 @@ ignore = [
"PLR0912",
"PLR0913",
"PLR0915",
+ "PLW1641",
"PLR1714",
"PLR1730",
"PLR2004",
diff --git a/src/__init__.py b/src/__init__.py
index b259a367a..e69de29bb 100644
--- a/src/__init__.py
+++ b/src/__init__.py
@@ -1,10 +0,0 @@
-import sys
-
-PYTHON_VERSION = 3, 10 # Minimum python version required
-
-if tuple(sys.version_info) < PYTHON_VERSION:
- sys.stderr.write(
- "%s Error: Python version %s or higher is required\n"
- % (sys.argv[0], (".".join(str(x) for x in PYTHON_VERSION)))
- )
- sys.exit(1)
diff --git a/src/api/python_version_check.py b/src/api/python_version_check.py
index d8af98634..c54154767 100644
--- a/src/api/python_version_check.py
+++ b/src/api/python_version_check.py
@@ -1,7 +1,7 @@
import sys
from typing import Final
-MINIMUM_REQUIRED_PYTHON_VERSION: Final[tuple[int, int]] = (3, 12)
+MINIMUM_REQUIRED_PYTHON_VERSION: Final[tuple[int, int]] = (3, 11)
def init():
diff --git a/src/api/utils.py b/src/api/utils.py
index 8fdedfc0a..0a9561cb8 100644
--- a/src/api/utils.py
+++ b/src/api/utils.py
@@ -22,6 +22,7 @@
__doc__ = """Utils module contains many helpers for several task,
like reading files or path management"""
+
SHELVE_PATH = os.path.join(constants.ZXBASIC_ROOT, "parsetab", "tabs.dbm")
SHELVE = shelve.open(SHELVE_PATH)
diff --git a/src/arch/z80/backend/_16bit.py b/src/arch/z80/backend/_16bit.py
index 77b1278c4..a9a5928c9 100644
--- a/src/arch/z80/backend/_16bit.py
+++ b/src/arch/z80/backend/_16bit.py
@@ -263,7 +263,7 @@ def mul16(cls, ins: Quad) -> list[str]:
output.append("push hl")
return output
- output.append("ld de, %i" % op2)
+ output.append(f"ld de, {op2}")
else:
if op2[0] == "_": # stack optimization
op1, op2 = op2, op1
diff --git a/src/arch/z80/backend/common.py b/src/arch/z80/backend/common.py
index a0af28828..b49f0e3f3 100644
--- a/src/arch/z80/backend/common.py
+++ b/src/arch/z80/backend/common.py
@@ -13,7 +13,7 @@
# List of modules (in alphabetical order) that, if included, should call MEM_INIT
MEMINITS = {
- "alloc.asm",
+ "mem/alloc.asm",
"loadstr.asm",
"storestr2.asm",
"storestr.asm",
diff --git a/src/arch/z80/backend/runtime/core.py b/src/arch/z80/backend/runtime/core.py
index 0477e0a92..3dbd2780d 100644
--- a/src/arch/z80/backend/runtime/core.py
+++ b/src/arch/z80/backend/runtime/core.py
@@ -195,7 +195,7 @@ class CoreLabels:
CoreLabels.LTI16: "cmp/lti16.asm",
CoreLabels.LTI8: "cmp/lti8.asm",
CoreLabels.LTI32: "cmp/lti32.asm",
- CoreLabels.MEM_FREE: "free.asm",
+ CoreLabels.MEM_FREE: "mem/free.asm",
CoreLabels.MODF: "arith/modf.asm",
CoreLabels.MODF16: "arith/modf16.asm",
CoreLabels.MODI16: "arith/div16.asm",
diff --git a/src/lib/arch/zx48k/runtime/array/arrayalloc.asm b/src/lib/arch/zx48k/runtime/array/arrayalloc.asm
index 04f593249..705efe67b 100644
--- a/src/lib/arch/zx48k/runtime/array/arrayalloc.asm
+++ b/src/lib/arch/zx48k/runtime/array/arrayalloc.asm
@@ -1,5 +1,5 @@
-#include once
+#include once
; ---------------------------------------------------------------------
diff --git a/src/lib/arch/zx48k/runtime/array/arraystrfree.asm b/src/lib/arch/zx48k/runtime/array/arraystrfree.asm
index bac81e816..c599ef6b7 100644
--- a/src/lib/arch/zx48k/runtime/array/arraystrfree.asm
+++ b/src/lib/arch/zx48k/runtime/array/arraystrfree.asm
@@ -2,7 +2,7 @@
; HL = Pointer to start of array in memory
; Top of the stack = Number of elements of the array
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zx48k/runtime/asc.asm b/src/lib/arch/zx48k/runtime/asc.asm
index e36962e9c..91f98fc2c 100644
--- a/src/lib/arch/zx48k/runtime/asc.asm
+++ b/src/lib/arch/zx48k/runtime/asc.asm
@@ -1,5 +1,5 @@
; Returns the ascii code for the given str
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zx48k/runtime/chr.asm b/src/lib/arch/zx48k/runtime/chr.asm
index b6709d146..494285dc8 100644
--- a/src/lib/arch/zx48k/runtime/chr.asm
+++ b/src/lib/arch/zx48k/runtime/chr.asm
@@ -1,7 +1,7 @@
; CHR$(x, y, x) returns the string CHR$(x) + CHR$(y) + CHR$(z)
;
-#include once
+#include once
push namespace core
@@ -76,4 +76,3 @@ __CHR_END:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/io/keyboard/inkey.asm b/src/lib/arch/zx48k/runtime/io/keyboard/inkey.asm
index 390be8ffe..8ab774f8b 100644
--- a/src/lib/arch/zx48k/runtime/io/keyboard/inkey.asm
+++ b/src/lib/arch/zx48k/runtime/io/keyboard/inkey.asm
@@ -3,7 +3,7 @@
; containing the string.
; An empty string otherwise.
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zx48k/runtime/letsubstr.asm b/src/lib/arch/zx48k/runtime/letsubstr.asm
index 6ce63a51f..4a0a3e7f6 100644
--- a/src/lib/arch/zx48k/runtime/letsubstr.asm
+++ b/src/lib/arch/zx48k/runtime/letsubstr.asm
@@ -7,7 +7,7 @@
; => Not 0 if HL must be freed from memory on exit
; TOP -3 B$ address
-#include once
+#include once
push namespace core
@@ -155,4 +155,3 @@ __FREE_STR:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/load.asm b/src/lib/arch/zx48k/runtime/load.asm
index 0da9db990..ce6e97733 100644
--- a/src/lib/arch/zx48k/runtime/load.asm
+++ b/src/lib/arch/zx48k/runtime/load.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
#ifndef HIDE_LOAD_MSG
# include once
diff --git a/src/lib/arch/zx48k/runtime/loadstr.asm b/src/lib/arch/zx48k/runtime/loadstr.asm
index 168bf72d8..ae597951f 100644
--- a/src/lib/arch/zx48k/runtime/loadstr.asm
+++ b/src/lib/arch/zx48k/runtime/loadstr.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
; Loads a string (ptr) from HL
; and duplicates it on dynamic memory again
diff --git a/src/lib/arch/zx48k/runtime/alloc.asm b/src/lib/arch/zx48k/runtime/mem/alloc.asm
similarity index 99%
rename from src/lib/arch/zx48k/runtime/alloc.asm
rename to src/lib/arch/zx48k/runtime/mem/alloc.asm
index fde6d1df4..2769745ab 100644
--- a/src/lib/arch/zx48k/runtime/alloc.asm
+++ b/src/lib/arch/zx48k/runtime/mem/alloc.asm
@@ -66,7 +66,7 @@
; They will be added automatically if needed.
#include once
-#include once
+#include once
; ---------------------------------------------------------------------
diff --git a/src/lib/arch/zxnext/runtime/calloc.asm b/src/lib/arch/zx48k/runtime/mem/calloc.asm
similarity index 97%
rename from src/lib/arch/zxnext/runtime/calloc.asm
rename to src/lib/arch/zx48k/runtime/mem/calloc.asm
index e069eecd2..fbda2cb17 100644
--- a/src/lib/arch/zxnext/runtime/calloc.asm
+++ b/src/lib/arch/zx48k/runtime/mem/calloc.asm
@@ -9,7 +9,7 @@
;
; Please read the MIT license on the internet
-#include once
+#include once
; ---------------------------------------------------------------------
diff --git a/src/lib/arch/zx48k/runtime/free.asm b/src/lib/arch/zx48k/runtime/mem/free.asm
similarity index 99%
rename from src/lib/arch/zx48k/runtime/free.asm
rename to src/lib/arch/zx48k/runtime/mem/free.asm
index 883e75b8d..171cbfa98 100644
--- a/src/lib/arch/zx48k/runtime/free.asm
+++ b/src/lib/arch/zx48k/runtime/mem/free.asm
@@ -65,7 +65,7 @@
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
-#include once
+#include once
; ---------------------------------------------------------------------
; MEM_FREE
diff --git a/src/lib/arch/zx48k/runtime/heapinit.asm b/src/lib/arch/zx48k/runtime/mem/heapinit.asm
similarity index 100%
rename from src/lib/arch/zx48k/runtime/heapinit.asm
rename to src/lib/arch/zx48k/runtime/mem/heapinit.asm
diff --git a/src/lib/arch/zx48k/runtime/memcopy.asm b/src/lib/arch/zx48k/runtime/mem/memcopy.asm
similarity index 100%
rename from src/lib/arch/zx48k/runtime/memcopy.asm
rename to src/lib/arch/zx48k/runtime/mem/memcopy.asm
diff --git a/src/lib/arch/zxnext/runtime/realloc.asm b/src/lib/arch/zx48k/runtime/mem/realloc.asm
similarity index 98%
rename from src/lib/arch/zxnext/runtime/realloc.asm
rename to src/lib/arch/zx48k/runtime/mem/realloc.asm
index e5c803d34..01e832fdb 100644
--- a/src/lib/arch/zxnext/runtime/realloc.asm
+++ b/src/lib/arch/zx48k/runtime/mem/realloc.asm
@@ -67,8 +67,8 @@
#include once
-#include once
-#include once
+#include once
+#include once
; ---------------------------------------------------------------------
@@ -158,4 +158,3 @@ __REALLOC_END:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/printstr.asm b/src/lib/arch/zx48k/runtime/printstr.asm
index d680e8646..808e31878 100644
--- a/src/lib/arch/zx48k/runtime/printstr.asm
+++ b/src/lib/arch/zx48k/runtime/printstr.asm
@@ -1,7 +1,7 @@
#include once
#include once
#include once
-#include once
+#include once
; PRINT command routine
; Prints string pointed by HL
@@ -57,4 +57,3 @@ __PRINT_STR:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/read_restore.asm b/src/lib/arch/zx48k/runtime/read_restore.asm
index 2876a97a6..f97bc97f0 100644
--- a/src/lib/arch/zx48k/runtime/read_restore.asm
+++ b/src/lib/arch/zx48k/runtime/read_restore.asm
@@ -25,7 +25,7 @@
#include once
#include once
#include once
-#include once
+#include once
#define _str 1
#define _i8 2
diff --git a/src/lib/arch/zx48k/runtime/save.asm b/src/lib/arch/zx48k/runtime/save.asm
index 98c6f4ce3..791088bab 100644
--- a/src/lib/arch/zx48k/runtime/save.asm
+++ b/src/lib/arch/zx48k/runtime/save.asm
@@ -4,7 +4,7 @@
; YYY and ZZZ are 16 bit on top of the stack.
#include once
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zx48k/runtime/storestr2.asm b/src/lib/arch/zx48k/runtime/storestr2.asm
index b652f3194..343d2c4a6 100644
--- a/src/lib/arch/zx48k/runtime/storestr2.asm
+++ b/src/lib/arch/zx48k/runtime/storestr2.asm
@@ -5,7 +5,7 @@
; DE = address of 2n string. It just copies DE into (HL)
; freeing (HL) previously.
-#include once
+#include once
push namespace core
@@ -40,4 +40,3 @@ __STORE_STR2:
ret
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/str.asm b/src/lib/arch/zx48k/runtime/str.asm
index 1e5e306b5..a3cc9b8d1 100644
--- a/src/lib/arch/zx48k/runtime/str.asm
+++ b/src/lib/arch/zx48k/runtime/str.asm
@@ -4,7 +4,7 @@
; Returns a pointer (in HL) to the memory heap
; containing the FP number string representation
-#include once
+#include once
#include once
#include once
@@ -78,4 +78,3 @@ STK_END EQU 5C65h
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/strcat.asm b/src/lib/arch/zx48k/runtime/strcat.asm
index 8a3a4c7de..1d1ed1829 100644
--- a/src/lib/arch/zx48k/runtime/strcat.asm
+++ b/src/lib/arch/zx48k/runtime/strcat.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
#include once
push namespace core
@@ -127,4 +127,3 @@ __STRCATEND:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/strcpy.asm b/src/lib/arch/zx48k/runtime/strcpy.asm
index 091e2e11c..d864623d2 100644
--- a/src/lib/arch/zx48k/runtime/strcpy.asm
+++ b/src/lib/arch/zx48k/runtime/strcpy.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
; String library
@@ -97,4 +97,3 @@ __NOTHING_TO_COPY:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/string.asm b/src/lib/arch/zx48k/runtime/string.asm
index 31321ea7b..97a51894d 100644
--- a/src/lib/arch/zx48k/runtime/string.asm
+++ b/src/lib/arch/zx48k/runtime/string.asm
@@ -1,6 +1,6 @@
; String library
-#include once
+#include once
#include once
push namespace core
diff --git a/src/lib/arch/zx48k/runtime/strslice.asm b/src/lib/arch/zx48k/runtime/strslice.asm
index ec1b12b95..c63ad4e47 100644
--- a/src/lib/arch/zx48k/runtime/strslice.asm
+++ b/src/lib/arch/zx48k/runtime/strslice.asm
@@ -15,8 +15,8 @@
;
#include once
-#include once
-#include once
+#include once
+#include once
push namespace core
@@ -107,4 +107,3 @@ __FREE_ON_EXIT:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/runtime/usr_str.asm b/src/lib/arch/zx48k/runtime/usr_str.asm
index a2b047b9e..2753397fa 100644
--- a/src/lib/arch/zx48k/runtime/usr_str.asm
+++ b/src/lib/arch/zx48k/runtime/usr_str.asm
@@ -7,7 +7,7 @@
#include once
#include once
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zx48k/runtime/val.asm b/src/lib/arch/zx48k/runtime/val.asm
index 22d9590a1..988b06907 100644
--- a/src/lib/arch/zx48k/runtime/val.asm
+++ b/src/lib/arch/zx48k/runtime/val.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
#include once
#include once
@@ -118,4 +118,3 @@ __RET_ZERO: ; Returns 0 Floating point on error
ENDP
pop namespace
-
diff --git a/src/lib/arch/zx48k/stdlib/alloc.bas b/src/lib/arch/zx48k/stdlib/alloc.bas
index afe27d50d..acb561163 100644
--- a/src/lib/arch/zx48k/stdlib/alloc.bas
+++ b/src/lib/arch/zx48k/stdlib/alloc.bas
@@ -230,9 +230,9 @@ end function
#pragma pop(case_insensitive)
-#require "alloc.asm"
-#require "free.asm"
-#require "realloc.asm"
-#require "calloc.asm"
+#require "mem/alloc.asm"
+#require "mem/free.asm"
+#require "mem/realloc.asm"
+#require "mem/calloc.asm"
-#endif
\ No newline at end of file
+#endif
diff --git a/src/lib/arch/zx48k/stdlib/hex.bas b/src/lib/arch/zx48k/stdlib/hex.bas
index 463a88676..be29fea23 100644
--- a/src/lib/arch/zx48k/stdlib/hex.bas
+++ b/src/lib/arch/zx48k/stdlib/hex.bas
@@ -112,6 +112,6 @@ end function
#pragma pop(case_insensitive)
' The following is required to allocate dynamic memory for strings
-#require "alloc.asm"
+#require "mem/alloc.asm"
#endif
diff --git a/src/lib/arch/zx48k/stdlib/hmirror.bas b/src/lib/arch/zx48k/stdlib/hmirror.bas
new file mode 100644
index 000000000..e4683f643
--- /dev/null
+++ b/src/lib/arch/zx48k/stdlib/hmirror.bas
@@ -0,0 +1,22 @@
+#pragma once
+
+Function fastcall hMirror(number as uByte) as uByte
+ Asm
+ ;17 bytes and 66 clock cycles
+ ld b,a ;b=ABCDEFGH
+ rrca ;a=HABCDEFG
+ rrca ;a=GHABCDEF
+ xor b
+ and %10101010
+ xor b ;a=GBADCFEH
+ ld b,a ;b=GBADCFEH
+ rrca ;a=HGBADCFE
+ rrca ;a=EHGBADCF
+ rrca ;a=FEHGBADC
+ rrca ;a=CFEHGBAD
+ xor b
+ and %01100110
+ xor b ;a=GFEDCBAH
+ rrca ;a=HGFEDCBA
+ End Asm
+End Function
diff --git a/src/lib/arch/zx48k/stdlib/memcopy.bas b/src/lib/arch/zx48k/stdlib/memcopy.bas
index 4ddb18941..5a7942318 100644
--- a/src/lib/arch/zx48k/stdlib/memcopy.bas
+++ b/src/lib/arch/zx48k/stdlib/memcopy.bas
@@ -122,7 +122,7 @@ sub fastcall MemSet(dest as uinteger, value as ubyte, length as uinteger)
end sub
-#require "memcopy.asm"
+#require "mem/memcopy.asm"
#pragma pop(case_insensitive)
diff --git a/src/lib/arch/zx48k/stdlib/screen.bas b/src/lib/arch/zx48k/stdlib/screen.bas
index f6e9424fa..686671c83 100644
--- a/src/lib/arch/zx48k/stdlib/screen.bas
+++ b/src/lib/arch/zx48k/stdlib/screen.bas
@@ -97,9 +97,9 @@ end function
' The following is required to allocate dynamic memory for strings
-#require "alloc.asm"
+#require "mem/alloc.asm"
' The following is required to manipulate the FP-CALC stack
#require "stackf.asm"
-#endif
\ No newline at end of file
+#endif
diff --git a/src/lib/arch/zx48k/stdlib/spectranet.bas b/src/lib/arch/zx48k/stdlib/spectranet.bas
index 563f20bcd..f8a67dab7 100644
--- a/src/lib/arch/zx48k/stdlib/spectranet.bas
+++ b/src/lib/arch/zx48k/stdlib/spectranet.bas
@@ -427,7 +427,7 @@ End Function
#undef ERR_NR
#require "spectranet.inc"
-#require "free.asm"
+#require "mem/free.asm"
#pragma pop(case_insensitive)
#endif
diff --git a/src/lib/arch/zxnext/runtime/array/arrayalloc.asm b/src/lib/arch/zxnext/runtime/array/arrayalloc.asm
index 04f593249..705efe67b 100644
--- a/src/lib/arch/zxnext/runtime/array/arrayalloc.asm
+++ b/src/lib/arch/zxnext/runtime/array/arrayalloc.asm
@@ -1,5 +1,5 @@
-#include once
+#include once
; ---------------------------------------------------------------------
diff --git a/src/lib/arch/zxnext/runtime/array/arraystrfree.asm b/src/lib/arch/zxnext/runtime/array/arraystrfree.asm
index bac81e816..c599ef6b7 100644
--- a/src/lib/arch/zxnext/runtime/array/arraystrfree.asm
+++ b/src/lib/arch/zxnext/runtime/array/arraystrfree.asm
@@ -2,7 +2,7 @@
; HL = Pointer to start of array in memory
; Top of the stack = Number of elements of the array
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zxnext/runtime/asc.asm b/src/lib/arch/zxnext/runtime/asc.asm
index e36962e9c..91f98fc2c 100644
--- a/src/lib/arch/zxnext/runtime/asc.asm
+++ b/src/lib/arch/zxnext/runtime/asc.asm
@@ -1,5 +1,5 @@
; Returns the ascii code for the given str
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zxnext/runtime/chr.asm b/src/lib/arch/zxnext/runtime/chr.asm
index b6709d146..494285dc8 100644
--- a/src/lib/arch/zxnext/runtime/chr.asm
+++ b/src/lib/arch/zxnext/runtime/chr.asm
@@ -1,7 +1,7 @@
; CHR$(x, y, x) returns the string CHR$(x) + CHR$(y) + CHR$(z)
;
-#include once
+#include once
push namespace core
@@ -76,4 +76,3 @@ __CHR_END:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/io/keyboard/inkey.asm b/src/lib/arch/zxnext/runtime/io/keyboard/inkey.asm
index 390be8ffe..8ab774f8b 100644
--- a/src/lib/arch/zxnext/runtime/io/keyboard/inkey.asm
+++ b/src/lib/arch/zxnext/runtime/io/keyboard/inkey.asm
@@ -3,7 +3,7 @@
; containing the string.
; An empty string otherwise.
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zxnext/runtime/letsubstr.asm b/src/lib/arch/zxnext/runtime/letsubstr.asm
index 6ce63a51f..4a0a3e7f6 100644
--- a/src/lib/arch/zxnext/runtime/letsubstr.asm
+++ b/src/lib/arch/zxnext/runtime/letsubstr.asm
@@ -7,7 +7,7 @@
; => Not 0 if HL must be freed from memory on exit
; TOP -3 B$ address
-#include once
+#include once
push namespace core
@@ -155,4 +155,3 @@ __FREE_STR:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/load.asm b/src/lib/arch/zxnext/runtime/load.asm
index 0da9db990..ce6e97733 100644
--- a/src/lib/arch/zxnext/runtime/load.asm
+++ b/src/lib/arch/zxnext/runtime/load.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
#ifndef HIDE_LOAD_MSG
# include once
diff --git a/src/lib/arch/zxnext/runtime/loadstr.asm b/src/lib/arch/zxnext/runtime/loadstr.asm
index 168bf72d8..ae597951f 100644
--- a/src/lib/arch/zxnext/runtime/loadstr.asm
+++ b/src/lib/arch/zxnext/runtime/loadstr.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
; Loads a string (ptr) from HL
; and duplicates it on dynamic memory again
diff --git a/src/lib/arch/zxnext/runtime/alloc.asm b/src/lib/arch/zxnext/runtime/mem/alloc.asm
similarity index 99%
rename from src/lib/arch/zxnext/runtime/alloc.asm
rename to src/lib/arch/zxnext/runtime/mem/alloc.asm
index fde6d1df4..2769745ab 100644
--- a/src/lib/arch/zxnext/runtime/alloc.asm
+++ b/src/lib/arch/zxnext/runtime/mem/alloc.asm
@@ -66,7 +66,7 @@
; They will be added automatically if needed.
#include once
-#include once
+#include once
; ---------------------------------------------------------------------
diff --git a/src/lib/arch/zx48k/runtime/calloc.asm b/src/lib/arch/zxnext/runtime/mem/calloc.asm
similarity index 97%
rename from src/lib/arch/zx48k/runtime/calloc.asm
rename to src/lib/arch/zxnext/runtime/mem/calloc.asm
index e069eecd2..fbda2cb17 100644
--- a/src/lib/arch/zx48k/runtime/calloc.asm
+++ b/src/lib/arch/zxnext/runtime/mem/calloc.asm
@@ -9,7 +9,7 @@
;
; Please read the MIT license on the internet
-#include once
+#include once
; ---------------------------------------------------------------------
diff --git a/src/lib/arch/zxnext/runtime/free.asm b/src/lib/arch/zxnext/runtime/mem/free.asm
similarity index 99%
rename from src/lib/arch/zxnext/runtime/free.asm
rename to src/lib/arch/zxnext/runtime/mem/free.asm
index 883e75b8d..171cbfa98 100644
--- a/src/lib/arch/zxnext/runtime/free.asm
+++ b/src/lib/arch/zxnext/runtime/mem/free.asm
@@ -65,7 +65,7 @@
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
-#include once
+#include once
; ---------------------------------------------------------------------
; MEM_FREE
diff --git a/src/lib/arch/zxnext/runtime/heapinit.asm b/src/lib/arch/zxnext/runtime/mem/heapinit.asm
similarity index 100%
rename from src/lib/arch/zxnext/runtime/heapinit.asm
rename to src/lib/arch/zxnext/runtime/mem/heapinit.asm
diff --git a/src/lib/arch/zxnext/runtime/memcopy.asm b/src/lib/arch/zxnext/runtime/mem/memcopy.asm
similarity index 100%
rename from src/lib/arch/zxnext/runtime/memcopy.asm
rename to src/lib/arch/zxnext/runtime/mem/memcopy.asm
diff --git a/src/lib/arch/zx48k/runtime/realloc.asm b/src/lib/arch/zxnext/runtime/mem/realloc.asm
similarity index 98%
rename from src/lib/arch/zx48k/runtime/realloc.asm
rename to src/lib/arch/zxnext/runtime/mem/realloc.asm
index e5c803d34..01e832fdb 100644
--- a/src/lib/arch/zx48k/runtime/realloc.asm
+++ b/src/lib/arch/zxnext/runtime/mem/realloc.asm
@@ -67,8 +67,8 @@
#include once
-#include once
-#include once
+#include once
+#include once
; ---------------------------------------------------------------------
@@ -158,4 +158,3 @@ __REALLOC_END:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/printstr.asm b/src/lib/arch/zxnext/runtime/printstr.asm
index d680e8646..808e31878 100644
--- a/src/lib/arch/zxnext/runtime/printstr.asm
+++ b/src/lib/arch/zxnext/runtime/printstr.asm
@@ -1,7 +1,7 @@
#include once
#include once
#include once
-#include once
+#include once
; PRINT command routine
; Prints string pointed by HL
@@ -57,4 +57,3 @@ __PRINT_STR:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/read_restore.asm b/src/lib/arch/zxnext/runtime/read_restore.asm
index 2876a97a6..f97bc97f0 100644
--- a/src/lib/arch/zxnext/runtime/read_restore.asm
+++ b/src/lib/arch/zxnext/runtime/read_restore.asm
@@ -25,7 +25,7 @@
#include once
#include once
#include once
-#include once
+#include once
#define _str 1
#define _i8 2
diff --git a/src/lib/arch/zxnext/runtime/save.asm b/src/lib/arch/zxnext/runtime/save.asm
index 98c6f4ce3..791088bab 100644
--- a/src/lib/arch/zxnext/runtime/save.asm
+++ b/src/lib/arch/zxnext/runtime/save.asm
@@ -4,7 +4,7 @@
; YYY and ZZZ are 16 bit on top of the stack.
#include once
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zxnext/runtime/storestr2.asm b/src/lib/arch/zxnext/runtime/storestr2.asm
index b652f3194..343d2c4a6 100644
--- a/src/lib/arch/zxnext/runtime/storestr2.asm
+++ b/src/lib/arch/zxnext/runtime/storestr2.asm
@@ -5,7 +5,7 @@
; DE = address of 2n string. It just copies DE into (HL)
; freeing (HL) previously.
-#include once
+#include once
push namespace core
@@ -40,4 +40,3 @@ __STORE_STR2:
ret
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/str.asm b/src/lib/arch/zxnext/runtime/str.asm
index 1e5e306b5..a3cc9b8d1 100644
--- a/src/lib/arch/zxnext/runtime/str.asm
+++ b/src/lib/arch/zxnext/runtime/str.asm
@@ -4,7 +4,7 @@
; Returns a pointer (in HL) to the memory heap
; containing the FP number string representation
-#include once
+#include once
#include once
#include once
@@ -78,4 +78,3 @@ STK_END EQU 5C65h
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/strcat.asm b/src/lib/arch/zxnext/runtime/strcat.asm
index 8a3a4c7de..1d1ed1829 100644
--- a/src/lib/arch/zxnext/runtime/strcat.asm
+++ b/src/lib/arch/zxnext/runtime/strcat.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
#include once
push namespace core
@@ -127,4 +127,3 @@ __STRCATEND:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/strcpy.asm b/src/lib/arch/zxnext/runtime/strcpy.asm
index 091e2e11c..d864623d2 100644
--- a/src/lib/arch/zxnext/runtime/strcpy.asm
+++ b/src/lib/arch/zxnext/runtime/strcpy.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
; String library
@@ -97,4 +97,3 @@ __NOTHING_TO_COPY:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/string.asm b/src/lib/arch/zxnext/runtime/string.asm
index 0631c2a85..0490ce185 100644
--- a/src/lib/arch/zxnext/runtime/string.asm
+++ b/src/lib/arch/zxnext/runtime/string.asm
@@ -1,6 +1,6 @@
; String library
-#include once
+#include once
#include once
push namespace core
diff --git a/src/lib/arch/zxnext/runtime/strslice.asm b/src/lib/arch/zxnext/runtime/strslice.asm
index ec1b12b95..c63ad4e47 100644
--- a/src/lib/arch/zxnext/runtime/strslice.asm
+++ b/src/lib/arch/zxnext/runtime/strslice.asm
@@ -15,8 +15,8 @@
;
#include once
-#include once
-#include once
+#include once
+#include once
push namespace core
@@ -107,4 +107,3 @@ __FREE_ON_EXIT:
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/runtime/usr_str.asm b/src/lib/arch/zxnext/runtime/usr_str.asm
index a2b047b9e..2753397fa 100644
--- a/src/lib/arch/zxnext/runtime/usr_str.asm
+++ b/src/lib/arch/zxnext/runtime/usr_str.asm
@@ -7,7 +7,7 @@
#include once
#include once
-#include once
+#include once
push namespace core
diff --git a/src/lib/arch/zxnext/runtime/val.asm b/src/lib/arch/zxnext/runtime/val.asm
index 22d9590a1..988b06907 100644
--- a/src/lib/arch/zxnext/runtime/val.asm
+++ b/src/lib/arch/zxnext/runtime/val.asm
@@ -1,4 +1,4 @@
-#include once
+#include once
#include once
#include once
@@ -118,4 +118,3 @@ __RET_ZERO: ; Returns 0 Floating point on error
ENDP
pop namespace
-
diff --git a/src/lib/arch/zxnext/stdlib/alloc.bas b/src/lib/arch/zxnext/stdlib/alloc.bas
index afe27d50d..acb561163 100644
--- a/src/lib/arch/zxnext/stdlib/alloc.bas
+++ b/src/lib/arch/zxnext/stdlib/alloc.bas
@@ -230,9 +230,9 @@ end function
#pragma pop(case_insensitive)
-#require "alloc.asm"
-#require "free.asm"
-#require "realloc.asm"
-#require "calloc.asm"
+#require "mem/alloc.asm"
+#require "mem/free.asm"
+#require "mem/realloc.asm"
+#require "mem/calloc.asm"
-#endif
\ No newline at end of file
+#endif
diff --git a/src/lib/arch/zxnext/stdlib/hex.bas b/src/lib/arch/zxnext/stdlib/hex.bas
index 463a88676..be29fea23 100644
--- a/src/lib/arch/zxnext/stdlib/hex.bas
+++ b/src/lib/arch/zxnext/stdlib/hex.bas
@@ -112,6 +112,6 @@ end function
#pragma pop(case_insensitive)
' The following is required to allocate dynamic memory for strings
-#require "alloc.asm"
+#require "mem/alloc.asm"
#endif
diff --git a/src/lib/arch/zxnext/stdlib/hmirror.bas b/src/lib/arch/zxnext/stdlib/hmirror.bas
new file mode 100644
index 000000000..6162a6846
--- /dev/null
+++ b/src/lib/arch/zxnext/stdlib/hmirror.bas
@@ -0,0 +1,6 @@
+#pragma once
+
+#define hMirror(x) \
+ Asm \
+ mirror a \
+ End Asm
diff --git a/src/lib/arch/zxnext/stdlib/memcopy.bas b/src/lib/arch/zxnext/stdlib/memcopy.bas
index 4ddb18941..5a7942318 100644
--- a/src/lib/arch/zxnext/stdlib/memcopy.bas
+++ b/src/lib/arch/zxnext/stdlib/memcopy.bas
@@ -122,7 +122,7 @@ sub fastcall MemSet(dest as uinteger, value as ubyte, length as uinteger)
end sub
-#require "memcopy.asm"
+#require "mem/memcopy.asm"
#pragma pop(case_insensitive)
diff --git a/src/lib/arch/zxnext/stdlib/screen.bas b/src/lib/arch/zxnext/stdlib/screen.bas
index f6e9424fa..686671c83 100644
--- a/src/lib/arch/zxnext/stdlib/screen.bas
+++ b/src/lib/arch/zxnext/stdlib/screen.bas
@@ -97,9 +97,9 @@ end function
' The following is required to allocate dynamic memory for strings
-#require "alloc.asm"
+#require "mem/alloc.asm"
' The following is required to manipulate the FP-CALC stack
#require "stackf.asm"
-#endif
\ No newline at end of file
+#endif
diff --git a/src/lib/arch/zxnext/stdlib/spectranet.bas b/src/lib/arch/zxnext/stdlib/spectranet.bas
index 563f20bcd..f8a67dab7 100644
--- a/src/lib/arch/zxnext/stdlib/spectranet.bas
+++ b/src/lib/arch/zxnext/stdlib/spectranet.bas
@@ -427,7 +427,7 @@ End Function
#undef ERR_NR
#require "spectranet.inc"
-#require "free.asm"
+#require "mem/free.asm"
#pragma pop(case_insensitive)
#endif
diff --git a/src/zxbasm/version.py b/src/zxbasm/version.py
index a56ae3a4d..cca3a688b 100644
--- a/src/zxbasm/version.py
+++ b/src/zxbasm/version.py
@@ -1 +1 @@
-VERSION = "1.18.1"
+VERSION = "1.18.2"
diff --git a/src/zxbc/version.py b/src/zxbc/version.py
index 4ceaf8d0a..2c0175d7b 100755
--- a/src/zxbc/version.py
+++ b/src/zxbc/version.py
@@ -1,3 +1,3 @@
from typing import Final
-VERSION: Final[str] = "1.18.1"
+VERSION: Final[str] = "1.18.2"
diff --git a/tests/functional/arch/zx48k/cast_f16_to_param.asm b/tests/functional/arch/zx48k/cast_f16_to_param.asm
index 46261cdee..8edfb1076 100644
--- a/tests/functional/arch/zx48k/cast_f16_to_param.asm
+++ b/tests/functional/arch/zx48k/cast_f16_to_param.asm
@@ -81,7 +81,7 @@ _gfxDrawLineClip.x.__LBOUND__:
DEFW 0001h
;; --- end of user code ---
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/array/arrayalloc.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/calloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/calloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -92,7 +92,7 @@ _gfxDrawLineClip.x.__LBOUND__:
; closed source programs).
;
; Please read the MIT license on the internet
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -186,7 +186,7 @@ __STOP:
ld (ERR_NR), a
ret
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
@@ -294,7 +294,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -325,9 +325,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -392,7 +392,7 @@ __MEM_SUBTRACT:
ret
ENDP
pop namespace
-#line 13 "/zxbasic/src/lib/arch/zx48k/runtime/calloc.asm"
+#line 13 "/zxbasic/src/lib/arch/zx48k/runtime/mem/calloc.asm"
; ---------------------------------------------------------------------
; MEM_CALLOC
; Allocates a block of memory in the heap, and clears it filling it
@@ -553,7 +553,26 @@ __ALLOC_INITIALIZED_LOCAL_ARRAY_WITH_BOUNDS:
#line 142 "/zxbasic/src/lib/arch/zx48k/runtime/array/arrayalloc.asm"
pop namespace
#line 59 "arch/zx48k/cast_f16_to_param.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/iload32.asm"
+ ; __FASTCALL__ routine which
+ ; loads a 32 bits integer into DE,HL
+ ; stored at position pointed by POINTER HL
+ ; DE,HL <-- (HL)
+ push namespace core
+__ILOAD32:
+ ld e, (hl)
+ inc hl
+ ld d, (hl)
+ inc hl
+ ld a, (hl)
+ inc hl
+ ld h, (hl)
+ ld l, a
+ ex de, hl
+ ret
+ pop namespace
+#line 60 "arch/zx48k/cast_f16_to_param.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -711,25 +730,6 @@ __MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed
ret
ENDP
pop namespace
-#line 60 "arch/zx48k/cast_f16_to_param.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/iload32.asm"
- ; __FASTCALL__ routine which
- ; loads a 32 bits integer into DE,HL
- ; stored at position pointed by POINTER HL
- ; DE,HL <-- (HL)
- push namespace core
-__ILOAD32:
- ld e, (hl)
- inc hl
- ld d, (hl)
- inc hl
- ld a, (hl)
- inc hl
- ld h, (hl)
- ld l, a
- ex de, hl
- ret
- pop namespace
#line 61 "arch/zx48k/cast_f16_to_param.bas"
.LABEL.__LABEL0:
DEFB 00h
diff --git a/tests/functional/arch/zx48k/emptystrparam.asm b/tests/functional/arch/zx48k/emptystrparam.asm
index 5172abf9c..7e377c252 100644
--- a/tests/functional/arch/zx48k/emptystrparam.asm
+++ b/tests/functional/arch/zx48k/emptystrparam.asm
@@ -63,17 +63,18 @@ _stringtest__leave:
.LABEL.__LABEL0:
DEFW 0000h
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -114,7 +115,7 @@ _stringtest__leave:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -123,6 +124,41 @@ _stringtest__leave:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
@@ -230,202 +266,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 42 "arch/zx48k/emptystrparam.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -456,9 +297,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -560,5 +401,164 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 42 "arch/zx48k/emptystrparam.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 43 "arch/zx48k/emptystrparam.bas"
END
diff --git a/tests/functional/arch/zx48k/lcd3.asm b/tests/functional/arch/zx48k/lcd3.asm
index 85ee705fb..749f52813 100644
--- a/tests/functional/arch/zx48k/lcd3.asm
+++ b/tests/functional/arch/zx48k/lcd3.asm
@@ -195,273 +195,6 @@ __ADDF: ; Addition
jp __FPSTACK_POP
pop namespace
#line 111 "arch/zx48k/lcd3.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the BSD license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the BSD license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the BSD license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the BSD license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
- ; ---------------------------------------------------------------------
- ; __MEM_INIT must be called to initalize this library with the
- ; standard parameters
- ; ---------------------------------------------------------------------
- push namespace core
-__MEM_INIT: ; Initializes the library using (RAMTOP) as start, and
- ld hl, ZXBASIC_MEM_HEAP ; Change this with other address of heap start
- ld de, ZXBASIC_HEAP_SIZE ; Change this with your size
- ; ---------------------------------------------------------------------
- ; __MEM_INIT2 initalizes this library
-; Parameters:
-; HL : Memory address of 1st byte of the memory heap
-; DE : Length in bytes of the Memory Heap
- ; ---------------------------------------------------------------------
-__MEM_INIT2:
- ; HL as TOP
- PROC
- dec de
- dec de
- dec de
- dec de ; DE = length - 4; HL = start
- ; This is done, because we require 4 bytes for the empty dummy-header block
- xor a
- ld (hl), a
- inc hl
- ld (hl), a ; First "free" block is a header: size=0, Pointer=&(Block) + 4
- inc hl
- ld b, h
- ld c, l
- inc bc
- inc bc ; BC = starts of next block
- ld (hl), c
- inc hl
- ld (hl), b
- inc hl ; Pointer to next block
- ld (hl), e
- inc hl
- ld (hl), d
- inc hl ; Block size (should be length - 4 at start); This block contains all the available memory
- ld (hl), a ; NULL (0000h) ; No more blocks (a list with a single block)
- inc hl
- ld (hl), a
- ld a, 201
- ld (__MEM_INIT), a; "Pokes" with a RET so ensure this routine is not called again
- ret
- ENDP
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 112 "arch/zx48k/lcd3.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/ftou32reg.asm"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/neg32.asm"
push namespace core
@@ -560,19 +293,114 @@ __FTOU8: ; Converts float in C ED LH to Unsigned byte in A
ld a, l
ret
pop namespace
-#line 113 "arch/zx48k/lcd3.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 112 "arch/zx48k/lcd3.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the MIT license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the MIT license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be freed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the MIT license
+ ; This ASM library is licensed under the BSD license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the MIT license on the internet
+ ; Please read the BSD license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -613,7 +441,7 @@ __FTOU8: ; Converts float in C ED LH to Unsigned byte in A
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
+ ; if we can defragment the heap. If the block to be breed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -622,41 +450,54 @@ __FTOU8: ; Converts float in C ED LH to Unsigned byte in A
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
+ ; ---------------------------------------------------------------------
+ ; __MEM_INIT must be called to initalize this library with the
+ ; standard parameters
+ ; ---------------------------------------------------------------------
push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
+__MEM_INIT: ; Initializes the library using (RAMTOP) as start, and
+ ld hl, ZXBASIC_MEM_HEAP ; Change this with other address of heap start
+ ld de, ZXBASIC_HEAP_SIZE ; Change this with your size
+ ; ---------------------------------------------------------------------
+ ; __MEM_INIT2 initalizes this library
+; Parameters:
+; HL : Memory address of 1st byte of the memory heap
+; DE : Length in bytes of the Memory Heap
+ ; ---------------------------------------------------------------------
+__MEM_INIT2:
+ ; HL as TOP
+ PROC
+ dec de
+ dec de
+ dec de
+ dec de ; DE = length - 4; HL = start
+ ; This is done, because we require 4 bytes for the empty dummy-header block
+ xor a
+ ld (hl), a
+ inc hl
+ ld (hl), a ; First "free" block is a header: size=0, Pointer=&(Block) + 4
+ inc hl
+ ld b, h
+ ld c, l
+ inc bc
+ inc bc ; BC = starts of next block
+ ld (hl), c
+ inc hl
+ ld (hl), b
+ inc hl ; Pointer to next block
+ ld (hl), e
+ inc hl
+ ld (hl), d
+ inc hl ; Block size (should be length - 4 at start); This block contains all the available memory
+ ld (hl), a ; NULL (0000h) ; No more blocks (a list with a single block)
+ inc hl
+ ld (hl), a
+ ld a, 201
+ ld (__MEM_INIT), a; "Pokes" with a RET so ensure this routine is not called again
ret
+ ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -687,9 +528,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -791,6 +632,165 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 113 "arch/zx48k/lcd3.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 114 "arch/zx48k/lcd3.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/pstorestr2.asm"
; vim:ts=4:et:sw=4
diff --git a/tests/functional/arch/zx48k/lcd7.asm b/tests/functional/arch/zx48k/lcd7.asm
index 44903fc6e..7f147793e 100644
--- a/tests/functional/arch/zx48k/lcd7.asm
+++ b/tests/functional/arch/zx48k/lcd7.asm
@@ -93,17 +93,18 @@ _Frame__leave:
DEFB 4Fh
DEFB 4Bh
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -144,7 +145,7 @@ _Frame__leave:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -153,6 +154,41 @@ _Frame__leave:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
@@ -260,202 +296,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 70 "arch/zx48k/lcd7.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -486,9 +327,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -590,6 +431,165 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 70 "arch/zx48k/lcd7.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 71 "arch/zx48k/lcd7.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/pstorestr.asm"
; vim:ts=4:et:sw=4
@@ -609,7 +609,7 @@ __LOADSTR: ; __FASTCALL__ entry
; This function will resize (REALLOC) the space pointed by HL
; before copying the content of b$ into a$
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/strcpy.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/realloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/realloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
diff --git a/tests/functional/arch/zx48k/lcd8.asm b/tests/functional/arch/zx48k/lcd8.asm
index 37eeed40e..7a87b34f5 100644
--- a/tests/functional/arch/zx48k/lcd8.asm
+++ b/tests/functional/arch/zx48k/lcd8.asm
@@ -95,17 +95,18 @@ _Frame__leave:
DEFB 4Fh
DEFB 4Bh
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -146,7 +147,7 @@ _Frame__leave:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -155,6 +156,41 @@ _Frame__leave:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
@@ -262,202 +298,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 72 "arch/zx48k/lcd8.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -488,9 +329,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -592,6 +433,165 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 72 "arch/zx48k/lcd8.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 73 "arch/zx48k/lcd8.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/strlen.asm"
; Returns len if a string
diff --git a/tests/functional/arch/zx48k/lcd9.asm b/tests/functional/arch/zx48k/lcd9.asm
index 620e27d29..599cf7f39 100644
--- a/tests/functional/arch/zx48k/lcd9.asm
+++ b/tests/functional/arch/zx48k/lcd9.asm
@@ -85,17 +85,18 @@ _Frame__leave:
DEFB 4Fh
DEFB 4Bh
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -136,7 +137,7 @@ _Frame__leave:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -145,6 +146,41 @@ _Frame__leave:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
@@ -252,202 +288,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 60 "arch/zx48k/lcd9.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -478,9 +319,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -582,6 +423,165 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 60 "arch/zx48k/lcd9.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 61 "arch/zx48k/lcd9.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/storestr.asm"
; vim:ts=4:et:sw=4
@@ -595,7 +595,7 @@ __LOADSTR: ; __FASTCALL__ entry
; This function will resize (REALLOC) the space pointed by HL
; before copying the content of b$ into a$
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/strcpy.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/realloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/realloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
diff --git a/tests/functional/arch/zx48k/local_float_array0.asm b/tests/functional/arch/zx48k/local_float_array0.asm
index 591a42d62..50aec5bf2 100644
--- a/tests/functional/arch/zx48k/local_float_array0.asm
+++ b/tests/functional/arch/zx48k/local_float_array0.asm
@@ -251,7 +251,7 @@ ARRAY_SIZE_LOOP:
pop namespace
#line 67 "arch/zx48k/local_float_array0.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/array/arrayalloc.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/calloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/calloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -262,7 +262,7 @@ ARRAY_SIZE_LOOP:
; closed source programs).
;
; Please read the MIT license on the internet
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -356,8 +356,8 @@ __STOP:
ld (ERR_NR), a
ret
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -464,7 +464,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -495,9 +495,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -562,7 +562,7 @@ __MEM_SUBTRACT:
ret
ENDP
pop namespace
-#line 13 "/zxbasic/src/lib/arch/zx48k/runtime/calloc.asm"
+#line 13 "/zxbasic/src/lib/arch/zx48k/runtime/mem/calloc.asm"
; ---------------------------------------------------------------------
; MEM_CALLOC
; Allocates a block of memory in the heap, and clears it filling it
@@ -663,7 +663,35 @@ __ALLOC_INITIALIZED_LOCAL_ARRAY:
#line 142 "/zxbasic/src/lib/arch/zx48k/runtime/array/arrayalloc.asm"
pop namespace
#line 68 "arch/zx48k/local_float_array0.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/iloadf.asm"
+ ; __FASTCALL__ routine which
+ ; loads a 40 bits floating point into A ED CB
+ ; stored at position pointed by POINTER HL
+ ;A DE, BC <-- ((HL))
+ push namespace core
+__ILOADF:
+ ld a, (hl)
+ inc hl
+ ld h, (hl)
+ ld l, a
+ ; __FASTCALL__ routine which
+ ; loads a 40 bits floating point into A ED CB
+ ; stored at position pointed by POINTER HL
+ ;A DE, BC <-- (HL)
+__LOADF: ; Loads a 40 bits FP number from address pointed by HL
+ ld a, (hl)
+ inc hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl)
+ inc hl
+ ld c, (hl)
+ inc hl
+ ld b, (hl)
+ ret
+ pop namespace
+#line 69 "arch/zx48k/local_float_array0.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -821,34 +849,6 @@ __MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed
ret
ENDP
pop namespace
-#line 69 "arch/zx48k/local_float_array0.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/iloadf.asm"
- ; __FASTCALL__ routine which
- ; loads a 40 bits floating point into A ED CB
- ; stored at position pointed by POINTER HL
- ;A DE, BC <-- ((HL))
- push namespace core
-__ILOADF:
- ld a, (hl)
- inc hl
- ld h, (hl)
- ld l, a
- ; __FASTCALL__ routine which
- ; loads a 40 bits floating point into A ED CB
- ; stored at position pointed by POINTER HL
- ;A DE, BC <-- (HL)
-__LOADF: ; Loads a 40 bits FP number from address pointed by HL
- ld a, (hl)
- inc hl
- ld e, (hl)
- inc hl
- ld d, (hl)
- inc hl
- ld c, (hl)
- inc hl
- ld b, (hl)
- ret
- pop namespace
#line 70 "arch/zx48k/local_float_array0.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/storef.asm"
push namespace core
diff --git a/tests/functional/arch/zx48k/local_float_array1.asm b/tests/functional/arch/zx48k/local_float_array1.asm
index 8c12cd16a..60219fdc1 100644
--- a/tests/functional/arch/zx48k/local_float_array1.asm
+++ b/tests/functional/arch/zx48k/local_float_array1.asm
@@ -74,7 +74,7 @@ _test__leave:
ret
;; --- end of user code ---
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/array/arrayalloc.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/calloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/calloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -85,7 +85,7 @@ _test__leave:
; closed source programs).
;
; Please read the MIT license on the internet
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -179,8 +179,8 @@ __STOP:
ld (ERR_NR), a
ret
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -287,7 +287,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -318,9 +318,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -385,7 +385,7 @@ __MEM_SUBTRACT:
ret
ENDP
pop namespace
-#line 13 "/zxbasic/src/lib/arch/zx48k/runtime/calloc.asm"
+#line 13 "/zxbasic/src/lib/arch/zx48k/runtime/mem/calloc.asm"
; ---------------------------------------------------------------------
; MEM_CALLOC
; Allocates a block of memory in the heap, and clears it filling it
@@ -486,7 +486,35 @@ __ALLOC_INITIALIZED_LOCAL_ARRAY:
#line 142 "/zxbasic/src/lib/arch/zx48k/runtime/array/arrayalloc.asm"
pop namespace
#line 50 "arch/zx48k/local_float_array1.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/iloadf.asm"
+ ; __FASTCALL__ routine which
+ ; loads a 40 bits floating point into A ED CB
+ ; stored at position pointed by POINTER HL
+ ;A DE, BC <-- ((HL))
+ push namespace core
+__ILOADF:
+ ld a, (hl)
+ inc hl
+ ld h, (hl)
+ ld l, a
+ ; __FASTCALL__ routine which
+ ; loads a 40 bits floating point into A ED CB
+ ; stored at position pointed by POINTER HL
+ ;A DE, BC <-- (HL)
+__LOADF: ; Loads a 40 bits FP number from address pointed by HL
+ ld a, (hl)
+ inc hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl)
+ inc hl
+ ld c, (hl)
+ inc hl
+ ld b, (hl)
+ ret
+ pop namespace
+#line 51 "arch/zx48k/local_float_array1.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -644,34 +672,6 @@ __MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed
ret
ENDP
pop namespace
-#line 51 "arch/zx48k/local_float_array1.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/iloadf.asm"
- ; __FASTCALL__ routine which
- ; loads a 40 bits floating point into A ED CB
- ; stored at position pointed by POINTER HL
- ;A DE, BC <-- ((HL))
- push namespace core
-__ILOADF:
- ld a, (hl)
- inc hl
- ld h, (hl)
- ld l, a
- ; __FASTCALL__ routine which
- ; loads a 40 bits floating point into A ED CB
- ; stored at position pointed by POINTER HL
- ;A DE, BC <-- (HL)
-__LOADF: ; Loads a 40 bits FP number from address pointed by HL
- ld a, (hl)
- inc hl
- ld e, (hl)
- inc hl
- ld d, (hl)
- inc hl
- ld c, (hl)
- inc hl
- ld b, (hl)
- ret
- pop namespace
#line 52 "arch/zx48k/local_float_array1.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/storef.asm"
push namespace core
diff --git a/tests/functional/arch/zx48k/ltee1.asm b/tests/functional/arch/zx48k/ltee1.asm
index 6ac2afc5a..d49e02c93 100644
--- a/tests/functional/arch/zx48k/ltee1.asm
+++ b/tests/functional/arch/zx48k/ltee1.asm
@@ -111,17 +111,18 @@ _addWibble__leave:
DEFB 6Ch
DEFB 65h
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -162,7 +163,7 @@ _addWibble__leave:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -171,7 +172,42 @@ _addWibble__leave:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -278,202 +314,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 88 "arch/zx48k/ltee1.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -504,9 +345,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -608,6 +449,165 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 88 "arch/zx48k/ltee1.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 89 "arch/zx48k/ltee1.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/pstorestr.asm"
; vim:ts=4:et:sw=4
@@ -627,7 +627,7 @@ __LOADSTR: ; __FASTCALL__ entry
; This function will resize (REALLOC) the space pointed by HL
; before copying the content of b$ into a$
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/strcpy.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/realloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/realloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
diff --git a/tests/functional/arch/zx48k/ltee3.asm b/tests/functional/arch/zx48k/ltee3.asm
index cc9993eeb..787e1e196 100644
--- a/tests/functional/arch/zx48k/ltee3.asm
+++ b/tests/functional/arch/zx48k/ltee3.asm
@@ -71,17 +71,18 @@ _test__leave:
DEFB 6Eh
DEFB 67h
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -122,7 +123,7 @@ _test__leave:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -131,7 +132,42 @@ _test__leave:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -238,202 +274,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 50 "arch/zx48k/ltee3.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -464,9 +305,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -568,5 +409,164 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 50 "arch/zx48k/ltee3.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 51 "arch/zx48k/ltee3.bas"
END
diff --git a/tests/functional/arch/zx48k/opt1_len.asm b/tests/functional/arch/zx48k/opt1_len.asm
index 8f15fcdeb..a6a140413 100644
--- a/tests/functional/arch/zx48k/opt1_len.asm
+++ b/tests/functional/arch/zx48k/opt1_len.asm
@@ -47,17 +47,22 @@ _c:
ei
ret
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/io/keyboard/inkey.asm"
+ ; INKEY Function
+ ; Returns a string allocated in dynamic memory
+ ; containing the string.
+ ; An empty string otherwise.
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -98,7 +103,7 @@ _c:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -107,7 +112,42 @@ _c:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -214,206 +254,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 24 "arch/zx48k/opt1_len.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/io/keyboard/inkey.asm"
- ; INKEY Function
- ; Returns a string allocated in dynamic memory
- ; containing the string.
- ; An empty string otherwise.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -444,9 +285,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -556,6 +397,165 @@ __EMPTY_INKEY:
KEY_CODE EQU 0333h
ENDP
pop namespace
+#line 24 "arch/zx48k/opt1_len.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ; | <-- This zone is in use (Already allocated)
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Next (2 bytes) |--> NULL => END OF LIST
+ ; | 0 = NULL |
+ ; +----------------+
+ ; | |
+ ; | (0 if Size = 4)|
+ ; +----------------+
+ ; When a block is FREED, the previous and next pointers are examined to see
+ ; if we can defragment the heap. If the block to be breed is just next to the
+ ; previous, or to the next (or both) they will be converted into a single
+ ; block (so defragmented).
+ ; MEMORY MANAGER
+ ;
+ ; This library must be initialized calling __MEM_INIT with
+ ; HL = BLOCK Start & DE = Length.
+ ; An init directive is useful for initialization routines.
+ ; They will be added automatically if needed.
+ ; ---------------------------------------------------------------------
+ ; MEM_FREE
+ ; Frees a block of memory
+ ;
+; Parameters:
+ ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
+ ; is done
+ ; ---------------------------------------------------------------------
+ push namespace core
+MEM_FREE:
+__MEM_FREE: ; Frees the block pointed by HL
+ ; HL DE BC & AF modified
+ PROC
+ LOCAL __MEM_LOOP2
+ LOCAL __MEM_LINK_PREV
+ LOCAL __MEM_JOIN_TEST
+ LOCAL __MEM_BLOCK_JOIN
+ ld a, h
+ or l
+ ret z ; Return if NULL pointer
+ dec hl
+ dec hl
+ ld b, h
+ ld c, l ; BC = Block pointer
+ ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
+__MEM_LOOP2:
+ inc hl
+ inc hl ; Next block ptr
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; Block next ptr
+ ex de, hl ; DE = &(block->next); HL = block->next
+ ld a, h ; HL == NULL?
+ or l
+ jp z, __MEM_LINK_PREV; if so, link with previous
+ or a ; Clear carry flag
+ sbc hl, bc ; Carry if BC > HL => This block if before
+ add hl, bc ; Restores HL, preserving Carry flag
+ jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
+ ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
+__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
+ ex de, hl
+ push hl
+ dec hl
+ ld (hl), c
+ inc hl
+ ld (hl), b ; (DE) <- BC
+ ld h, b ; HL <- BC (Free block ptr)
+ ld l, c
+ inc hl ; Skip block length (2 bytes)
+ inc hl
+ ld (hl), e ; Block->next = DE
+ inc hl
+ ld (hl), d
+ ; --- LINKED ; HL = &(BC->next) + 2
+ call __MEM_JOIN_TEST
+ pop hl
+__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
+ ; hl = Ptr to current block + 2
+ ld d, (hl)
+ dec hl
+ ld e, (hl)
+ dec hl
+ ld b, (hl) ; Loads block length into BC
+ dec hl
+ ld c, (hl) ;
+ push hl ; Saves it for later
+ add hl, bc ; Adds its length. If HL == DE now, it must be joined
+ or a
+ sbc hl, de ; If Z, then HL == DE => We must join
+ pop hl
+ ret nz
+__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
+ push hl ; Saves it for later
+ ex de, hl
+ ld e, (hl) ; DE -> block->next->length
+ inc hl
+ ld d, (hl)
+ inc hl
+ ex de, hl ; DE = &(block->next)
+ add hl, bc ; HL = Total Length
+ ld b, h
+ ld c, l ; BC = Total Length
+ ex de, hl
+ ld e, (hl)
+ inc hl
+ ld d, (hl) ; DE = block->next
+ pop hl ; Recovers Pointer to block
+ ld (hl), c
+ inc hl
+ ld (hl), b ; Length Saved
+ inc hl
+ ld (hl), e
+ inc hl
+ ld (hl), d ; Next saved
+ ret
+ ENDP
+ pop namespace
#line 25 "arch/zx48k/opt1_len.bas"
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/strlen.asm"
; Returns len if a string
diff --git a/tests/functional/arch/zx48k/opt2_pstr.asm b/tests/functional/arch/zx48k/opt2_pstr.asm
index 3d6bd5873..e21009402 100644
--- a/tests/functional/arch/zx48k/opt2_pstr.asm
+++ b/tests/functional/arch/zx48k/opt2_pstr.asm
@@ -68,17 +68,18 @@ _PRINT642__leave:
DEFB 61h
DEFB 32h
;; --- end of user code ---
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
; http://www.boriel.com
;
- ; This ASM library is licensed under the BSD license
+ ; This ASM library is licensed under the MIT license
; you can use it for any purpose (even for commercial
; closed source programs).
;
- ; Please read the BSD license on the internet
+ ; Please read the MIT license on the internet
; ----- IMPLEMENTATION NOTES ------
; The heap is implemented as a linked list of free blocks.
; Each free block contains this info:
@@ -119,7 +120,7 @@ _PRINT642__leave:
; | (0 if Size = 4)|
; +----------------+
; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be breed is just next to the
+ ; if we can defragment the heap. If the block to be freed is just next to the
; previous, or to the next (or both) they will be converted into a single
; block (so defragmented).
; MEMORY MANAGER
@@ -128,7 +129,42 @@ _PRINT642__leave:
; HL = BLOCK Start & DE = Length.
; An init directive is useful for initialization routines.
; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/heapinit.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
+ ; Simple error control routines
+; vim:ts=4:et:
+ push namespace core
+ ERR_NR EQU 23610 ; Error code system variable
+ ; Error code definitions (as in ZX spectrum manual)
+; Set error code with:
+ ; ld a, ERROR_CODE
+ ; ld (ERR_NR), a
+ ERROR_Ok EQU -1
+ ERROR_SubscriptWrong EQU 2
+ ERROR_OutOfMemory EQU 3
+ ERROR_OutOfScreen EQU 4
+ ERROR_NumberTooBig EQU 5
+ ERROR_InvalidArg EQU 9
+ ERROR_IntOutOfRange EQU 10
+ ERROR_NonsenseInBasic EQU 11
+ ERROR_InvalidFileName EQU 14
+ ERROR_InvalidColour EQU 19
+ ERROR_BreakIntoProgram EQU 20
+ ERROR_TapeLoadingErr EQU 26
+ ; Raises error using RST #8
+__ERROR:
+ ld (__ERROR_CODE), a
+ rst 8
+__ERROR_CODE:
+ nop
+ ret
+ ; Sets the error system variable, but keeps running.
+ ; Usually this instruction if followed by the END intermediate instruction.
+__STOP:
+ ld (ERR_NR), a
+ ret
+ pop namespace
+#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/heapinit.asm"
; vim: ts=4:et:sw=4:
; Copyleft (K) by Jose M. Rodriguez de la Rosa
; (a.k.a. Boriel)
@@ -235,202 +271,7 @@ __MEM_INIT2:
ret
ENDP
pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/free.asm"
- ; ---------------------------------------------------------------------
- ; MEM_FREE
- ; Frees a block of memory
- ;
-; Parameters:
- ; HL = Pointer to the block to be freed. If HL is NULL (0) nothing
- ; is done
- ; ---------------------------------------------------------------------
- push namespace core
-MEM_FREE:
-__MEM_FREE: ; Frees the block pointed by HL
- ; HL DE BC & AF modified
- PROC
- LOCAL __MEM_LOOP2
- LOCAL __MEM_LINK_PREV
- LOCAL __MEM_JOIN_TEST
- LOCAL __MEM_BLOCK_JOIN
- ld a, h
- or l
- ret z ; Return if NULL pointer
- dec hl
- dec hl
- ld b, h
- ld c, l ; BC = Block pointer
- ld hl, ZXBASIC_MEM_HEAP ; This label point to the heap start
-__MEM_LOOP2:
- inc hl
- inc hl ; Next block ptr
- ld e, (hl)
- inc hl
- ld d, (hl) ; Block next ptr
- ex de, hl ; DE = &(block->next); HL = block->next
- ld a, h ; HL == NULL?
- or l
- jp z, __MEM_LINK_PREV; if so, link with previous
- or a ; Clear carry flag
- sbc hl, bc ; Carry if BC > HL => This block if before
- add hl, bc ; Restores HL, preserving Carry flag
- jp c, __MEM_LOOP2 ; This block is before. Keep searching PASS the block
- ;------ At this point current HL is PAST BC, so we must link (DE) with BC, and HL in BC->next
-__MEM_LINK_PREV: ; Link (DE) with BC, and BC->next with HL
- ex de, hl
- push hl
- dec hl
- ld (hl), c
- inc hl
- ld (hl), b ; (DE) <- BC
- ld h, b ; HL <- BC (Free block ptr)
- ld l, c
- inc hl ; Skip block length (2 bytes)
- inc hl
- ld (hl), e ; Block->next = DE
- inc hl
- ld (hl), d
- ; --- LINKED ; HL = &(BC->next) + 2
- call __MEM_JOIN_TEST
- pop hl
-__MEM_JOIN_TEST: ; Checks for fragmented contiguous blocks and joins them
- ; hl = Ptr to current block + 2
- ld d, (hl)
- dec hl
- ld e, (hl)
- dec hl
- ld b, (hl) ; Loads block length into BC
- dec hl
- ld c, (hl) ;
- push hl ; Saves it for later
- add hl, bc ; Adds its length. If HL == DE now, it must be joined
- or a
- sbc hl, de ; If Z, then HL == DE => We must join
- pop hl
- ret nz
-__MEM_BLOCK_JOIN: ; Joins current block (pointed by HL) with next one (pointed by DE). HL->length already in BC
- push hl ; Saves it for later
- ex de, hl
- ld e, (hl) ; DE -> block->next->length
- inc hl
- ld d, (hl)
- inc hl
- ex de, hl ; DE = &(block->next)
- add hl, bc ; HL = Total Length
- ld b, h
- ld c, l ; BC = Total Length
- ex de, hl
- ld e, (hl)
- inc hl
- ld d, (hl) ; DE = block->next
- pop hl ; Recovers Pointer to block
- ld (hl), c
- inc hl
- ld (hl), b ; Length Saved
- inc hl
- ld (hl), e
- inc hl
- ld (hl), d ; Next saved
- ret
- ENDP
- pop namespace
-#line 47 "arch/zx48k/opt2_pstr.bas"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/loadstr.asm"
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
-; vim: ts=4:et:sw=4:
- ; Copyleft (K) by Jose M. Rodriguez de la Rosa
- ; (a.k.a. Boriel)
-; http://www.boriel.com
- ;
- ; This ASM library is licensed under the MIT license
- ; you can use it for any purpose (even for commercial
- ; closed source programs).
- ;
- ; Please read the MIT license on the internet
- ; ----- IMPLEMENTATION NOTES ------
- ; The heap is implemented as a linked list of free blocks.
-; Each free block contains this info:
- ;
- ; +----------------+ <-- HEAP START
- ; | Size (2 bytes) |
- ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | | <-- If Size > 4, then this contains (size - 4) bytes
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ |
- ; | <-- This zone is in use (Already allocated)
- ; +----------------+ <-+
- ; | Size (2 bytes) |
- ; +----------------+
- ; | Next (2 bytes) |---+
- ; +----------------+ |
- ; | | |
- ; | (0 if Size = 4)| |
- ; +----------------+ <-+
- ; | Next (2 bytes) |--> NULL => END OF LIST
- ; | 0 = NULL |
- ; +----------------+
- ; | |
- ; | (0 if Size = 4)|
- ; +----------------+
- ; When a block is FREED, the previous and next pointers are examined to see
- ; if we can defragment the heap. If the block to be freed is just next to the
- ; previous, or to the next (or both) they will be converted into a single
- ; block (so defragmented).
- ; MEMORY MANAGER
- ;
- ; This library must be initialized calling __MEM_INIT with
- ; HL = BLOCK Start & DE = Length.
- ; An init directive is useful for initialization routines.
- ; They will be added automatically if needed.
-#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/error.asm"
- ; Simple error control routines
-; vim:ts=4:et:
- push namespace core
- ERR_NR EQU 23610 ; Error code system variable
- ; Error code definitions (as in ZX spectrum manual)
-; Set error code with:
- ; ld a, ERROR_CODE
- ; ld (ERR_NR), a
- ERROR_Ok EQU -1
- ERROR_SubscriptWrong EQU 2
- ERROR_OutOfMemory EQU 3
- ERROR_OutOfScreen EQU 4
- ERROR_NumberTooBig EQU 5
- ERROR_InvalidArg EQU 9
- ERROR_IntOutOfRange EQU 10
- ERROR_NonsenseInBasic EQU 11
- ERROR_InvalidFileName EQU 14
- ERROR_InvalidColour EQU 19
- ERROR_BreakIntoProgram EQU 20
- ERROR_TapeLoadingErr EQU 26
- ; Raises error using RST #8
-__ERROR:
- ld (__ERROR_CODE), a
- rst 8
-__ERROR_CODE:
- nop
- ret
- ; Sets the error system variable, but keeps running.
- ; Usually this instruction if followed by the END intermediate instruction.
-__STOP:
- ld (ERR_NR), a
- ret
- pop namespace
-#line 69 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 70 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; ---------------------------------------------------------------------
; MEM_ALLOC
; Allocates a block of memory in the heap.
@@ -461,9 +302,9 @@ __MEM_START:
__MEM_LOOP: ; Loads lengh at (HL, HL+). If Lenght >= BC, jump to __MEM_DONE
ld a, h ; HL = NULL (No memory available?)
or l
-#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 113 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
ret z ; NULL
-#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/alloc.asm"
+#line 115 "/zxbasic/src/lib/arch/zx48k/runtime/mem/alloc.asm"
; HL = Pointer to Free block
ld e, (hl)
inc hl
@@ -565,5 +406,164 @@ __LOADSTR: ; __FASTCALL__ entry
pop hl ; Recovers destiny in hl as result
ret
pop namespace
+#line 47 "arch/zx48k/opt2_pstr.bas"
+#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mem/free.asm"
+; vim: ts=4:et:sw=4:
+ ; Copyleft (K) by Jose M. Rodriguez de la Rosa
+ ; (a.k.a. Boriel)
+; http://www.boriel.com
+ ;
+ ; This ASM library is licensed under the BSD license
+ ; you can use it for any purpose (even for commercial
+ ; closed source programs).
+ ;
+ ; Please read the BSD license on the internet
+ ; ----- IMPLEMENTATION NOTES ------
+ ; The heap is implemented as a linked list of free blocks.
+; Each free block contains this info:
+ ;
+ ; +----------------+ <-- HEAP START
+ ; | Size (2 bytes) |
+ ; | 0 | <-- Size = 0 => DUMMY HEADER BLOCK
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | | <-- If Size > 4, then this contains (size - 4) bytes
+ ; | (0 if Size = 4)| |
+ ; +----------------+ <-+
+ ; | Size (2 bytes) |
+ ; +----------------+
+ ; | Next (2 bytes) |---+
+ ; +----------------+ |
+ ; | | |
+ ; | (0 if Size = 4)| |
+ ; +----------------+ |
+ ;