diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 46c4514c3..d0decb5e0 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,4 +1,4 @@ [bumpversion] -current_version = 1.8.7 +current_version = 1.8.8 files = version.py diff --git a/library-asm/swap32.asm b/library-asm/swap32.asm index 56acde3f9..805bcf57e 100644 --- a/library-asm/swap32.asm +++ b/library-asm/swap32.asm @@ -4,13 +4,13 @@ __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/divf16c.asm b/tests/functional/divf16c.asm index fa311b530..fdd24169d 100644 --- a/tests/functional/divf16c.asm +++ b/tests/functional/divf16c.asm @@ -345,13 +345,13 @@ __ENDF16DIV: ; Put the sign on the result __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/divi32c.asm b/tests/functional/divi32c.asm index ba8085fcb..4ec3c1599 100644 --- a/tests/functional/divi32c.asm +++ b/tests/functional/divi32c.asm @@ -263,13 +263,13 @@ __MODI32: ; 32bits signed division modulus __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/divu32c.asm b/tests/functional/divu32c.asm index 18063a710..7403f96be 100644 --- a/tests/functional/divu32c.asm +++ b/tests/functional/divu32c.asm @@ -263,13 +263,13 @@ __MODI32: ; 32bits signed division modulus __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/gef16.asm b/tests/functional/gef16.asm index 315f9bb0d..54d9384c2 100644 --- a/tests/functional/gef16.asm +++ b/tests/functional/gef16.asm @@ -156,13 +156,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/gei32.asm b/tests/functional/gei32.asm index 2dc95f04d..948c78e69 100644 --- a/tests/functional/gei32.asm +++ b/tests/functional/gei32.asm @@ -171,13 +171,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/geu32.asm b/tests/functional/geu32.asm index 41302f58d..fac98f9d2 100644 --- a/tests/functional/geu32.asm +++ b/tests/functional/geu32.asm @@ -144,13 +144,13 @@ __SUB32: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/gtf16.asm b/tests/functional/gtf16.asm index 280761f21..ba15764a1 100644 --- a/tests/functional/gtf16.asm +++ b/tests/functional/gtf16.asm @@ -165,13 +165,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/gti32.asm b/tests/functional/gti32.asm index 69642c59d..255406949 100644 --- a/tests/functional/gti32.asm +++ b/tests/functional/gti32.asm @@ -180,13 +180,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/gtu32.asm b/tests/functional/gtu32.asm index 644257340..a9ce2ad98 100644 --- a/tests/functional/gtu32.asm +++ b/tests/functional/gtu32.asm @@ -134,13 +134,13 @@ __CALL_BACK__: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/lef16.asm b/tests/functional/lef16.asm index aec8174a2..b5db14f45 100644 --- a/tests/functional/lef16.asm +++ b/tests/functional/lef16.asm @@ -157,13 +157,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/lei32.asm b/tests/functional/lei32.asm index 43ca35253..9ea97dc0b 100644 --- a/tests/functional/lei32.asm +++ b/tests/functional/lei32.asm @@ -170,13 +170,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/leu32.asm b/tests/functional/leu32.asm index ec2ff13a4..9eba6f735 100644 --- a/tests/functional/leu32.asm +++ b/tests/functional/leu32.asm @@ -139,13 +139,13 @@ __CALL_BACK__: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/ltf16.asm b/tests/functional/ltf16.asm index 4d2079315..dea2de2d5 100644 --- a/tests/functional/ltf16.asm +++ b/tests/functional/ltf16.asm @@ -148,13 +148,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/lti32c.asm b/tests/functional/lti32c.asm index 0e4a27827..e2e640165 100644 --- a/tests/functional/lti32c.asm +++ b/tests/functional/lti32c.asm @@ -161,13 +161,13 @@ checkParity: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/ltu32c.asm b/tests/functional/ltu32c.asm index 47fec8bcb..64355af68 100644 --- a/tests/functional/ltu32c.asm +++ b/tests/functional/ltu32c.asm @@ -139,13 +139,13 @@ __SUB32: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/modf16c.asm b/tests/functional/modf16c.asm index 29c035267..6879491b6 100644 --- a/tests/functional/modf16c.asm +++ b/tests/functional/modf16c.asm @@ -496,13 +496,13 @@ __MODF16: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/modi32c.asm b/tests/functional/modi32c.asm index e1ec47da1..590a049eb 100644 --- a/tests/functional/modi32c.asm +++ b/tests/functional/modi32c.asm @@ -263,13 +263,13 @@ __MODI32: ; 32bits signed division modulus __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/modu32c.asm b/tests/functional/modu32c.asm index b8d0f1cd0..0ddc43c2b 100644 --- a/tests/functional/modu32c.asm +++ b/tests/functional/modu32c.asm @@ -263,13 +263,13 @@ __MODI32: ; 32bits signed division modulus __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/subf16c.asm b/tests/functional/subf16c.asm index 7efa8c38a..b494f34c6 100644 --- a/tests/functional/subf16c.asm +++ b/tests/functional/subf16c.asm @@ -96,13 +96,13 @@ __SUB32: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/subi32c.asm b/tests/functional/subi32c.asm index f30b79583..14fdf300e 100644 --- a/tests/functional/subi32c.asm +++ b/tests/functional/subi32c.asm @@ -105,13 +105,13 @@ __SUB32: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/subu32c.asm b/tests/functional/subu32c.asm index 3c66baa6a..5de5e8617 100644 --- a/tests/functional/subu32c.asm +++ b/tests/functional/subu32c.asm @@ -105,13 +105,13 @@ __SUB32: __SWAP32: pop bc ; Return address ex (sp), hl - dec sp - dec sp + inc sp + inc sp ex de, hl ex (sp), hl ex de, hl - inc sp - inc sp + dec sp + dec sp push bc ret diff --git a/tests/functional/swap32.asm b/tests/functional/swap32.asm new file mode 100644 index 000000000..3e11789ce --- /dev/null +++ b/tests/functional/swap32.asm @@ -0,0 +1,245 @@ + org 32768 +__START_PROGRAM: + di + push ix + push iy + exx + push hl + exx + ld hl, 0 + add hl, sp + ld (__CALL_BACK__), hl + ei + ld hl, (_a + 2) + push hl + ld hl, (_a) + push hl + ld de, 0 + ld hl, 10 + call __SWAP32 + call __DIVU32 + ld (_a), hl + ld (_a + 2), de + ld hl, 0 + ld b, h + ld c, l +__END_PROGRAM: + di + ld hl, (__CALL_BACK__) + ld sp, hl + exx + pop hl + exx + pop iy + pop ix + ei + ret +__CALL_BACK__: + DEFW 0 +#line 1 "div32.asm" + +#line 1 "neg32.asm" + +__ABS32: + bit 7, d + ret z + +__NEG32: ; Negates DEHL (Two's complement) + ld a, l + cpl + ld l, a + + ld a, h + cpl + ld h, a + + ld a, e + cpl + ld e, a + + ld a, d + cpl + ld d, a + + inc l + ret nz + + inc h + ret nz + + inc de + ret + +#line 2 "div32.asm" + + ; --------------------------------------------------------- +__DIVU32: ; 32 bit unsigned division + ; DEHL = Dividend, Stack Top = Divisor + ; OPERANDS P = Dividend, Q = Divisor => OPERATION => P / Q + ; + ; Changes A, BC DE HL B'C' D'E' H'L' + ; --------------------------------------------------------- + exx + pop hl ; return address + pop de ; low part + ex (sp), hl ; CALLEE Convention ; H'L'D'E' => Dividend + +__DIVU32START: ; Performs D'E'H'L' / HLDE + ; Now switch to DIVIDEND = B'C'BC / DIVISOR = D'E'DE (A / B) + push de ; push Lowpart(Q) + ex de, hl ; DE = HL + ld hl, 0 + exx + ld b, h + ld c, l + pop hl + push de + ex de, hl + ld hl, 0 ; H'L'HL = 0 + exx + pop bc ; Pop HightPart(B) => B = B'C'BC + exx + + ld a, 32 ; Loop count + +__DIV32LOOP: + sll c ; B'C'BC << 1 ; Output most left bit to carry + rl b + exx + rl c + rl b + exx + + adc hl, hl + exx + adc hl, hl + exx + + sbc hl,de + exx + sbc hl,de + exx + jp nc, __DIV32NOADD ; use JP inside a loop for being faster + + add hl, de + exx + adc hl, de + exx + dec bc + +__DIV32NOADD: + dec a + jp nz, __DIV32LOOP ; use JP inside a loop for being faster + ; At this point, quotient is stored in B'C'BC and the reminder in H'L'HL + + push hl + exx + pop de + ex de, hl ; D'E'H'L' = 32 bits modulus + push bc + exx + pop de ; DE = B'C' + ld h, b + ld l, c ; DEHL = quotient D'E'H'L' = Modulus + + ret ; DEHL = quotient, D'E'H'L' = Modulus + + + +__MODU32: ; 32 bit modulus for 32bit unsigned division + ; DEHL = Dividend, Stack Top = Divisor (DE, HL) + + exx + pop hl ; return address + pop de ; low part + ex (sp), hl ; CALLEE Convention ; H'L'D'E' => Dividend + + call __DIVU32START ; At return, modulus is at D'E'H'L' + +__MODU32START: + + exx + push de + push hl + + exx + pop hl + pop de + + ret + + +__DIVI32: ; 32 bit signed division + ; DEHL = Dividend, Stack Top = Divisor + ; A = Dividend, B = Divisor => A / B + exx + pop hl ; return address + pop de ; low part + ex (sp), hl ; CALLEE Convention ; H'L'D'E' => Dividend + +__DIVI32START: + exx + ld a, d ; Save sign + ex af, af' + bit 7, d ; Negative? + call nz, __NEG32 ; Negates DEHL + + exx ; Now works with H'L'D'E' + ex af, af' + xor h + ex af, af' ; Stores sign of the result for later + + bit 7, h ; Negative? + ex de, hl ; HLDE = DEHL + call nz, __NEG32 + ex de, hl + + call __DIVU32START + ex af, af' ; Recovers sign + and 128 ; positive? + ret z + + jp __NEG32 ; Negates DEHL and returns from there + + +__MODI32: ; 32bits signed division modulus + exx + pop hl ; return address + pop de ; low part + ex (sp), hl ; CALLEE Convention ; H'L'D'E' => Dividend + + call __DIVI32START + jp __MODU32START + +#line 28 "swap32.bas" +#line 1 "swap32.asm" + + ; Exchanges current DE HL with the + ; ones in the stack + +__SWAP32: + pop bc ; Return address + ex (sp), hl + inc sp + inc sp + ex de, hl + ex (sp), hl + ex de, hl + dec sp + dec sp + push bc + ret + +#line 29 "swap32.bas" + +ZXBASIC_USER_DATA: +_a: + DEFB 0FFh + DEFB 0FFh + DEFB 00h + DEFB 00h + ; Defines DATA END --> HEAP size is 0 +ZXBASIC_USER_DATA_END EQU ZXBASIC_MEM_HEAP + ; Defines USER DATA Length in bytes +ZXBASIC_USER_DATA_LEN EQU ZXBASIC_USER_DATA_END - ZXBASIC_USER_DATA + END diff --git a/tests/functional/swap32.bas b/tests/functional/swap32.bas new file mode 100644 index 000000000..7388a29c6 --- /dev/null +++ b/tests/functional/swap32.bas @@ -0,0 +1,4 @@ +DIM a as ULong = 65535 + +LET a = a / 10 + diff --git a/version.py b/version.py index 285c0d585..dfa1796c7 100755 --- a/version.py +++ b/version.py @@ -1 +1 @@ -VERSION = '1.8.7' +VERSION = '1.8.8'